添加示例项目

This commit is contained in:
2026-04-16 16:27:53 +08:00
parent 69a2141804
commit 721fb5a992
192 changed files with 10148 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
{
"ProjectName": "战力榜",
"ProjectDescribe": "首先根据使用的登录器在配置文件中选取对应的登录器。PVF相关不提供自行研究暂不支持RS启动器",
"ProjectAuthor": "南瓜",
"ProjectVersion": 1.4,
"ProjectConfig": "战力榜配置_南瓜.json",
"ProjectFiles": [
"战力榜.nut"
],
"ProjectRunFunc": "_Dps_Rank_nangua_Main_"
}

View File

@@ -0,0 +1,326 @@
// 排行榜前三名数组 默认数据
local Ranklist = {
"1": {
"rank": 100,
"characname": "帝尊天穹",
"job": 0,
"lev": 60,
"Grow": 4,
"Guilkey": 0,
"GuildName": "诸神之荣丶",
"str": "",
"equip": [0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0]
},
"2": {
"rank": 90,
"characname": "圣皇极境",
"job": 1,
"lev": 60,
"Grow": 4,
"Guilkey": 0,
"GuildName": "诸神之荣丶",
"str": "",
"equip": [0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0]
},
"3": {
"rank": 80,
"characname": "神王之巅",
"job": 2,
"lev": 60,
"Grow": 4,
"Guilkey": 0,
"GuildName": "诸神之荣丶",
"str": "",
"equip": [0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0]
}
};
/**
* 获得rank分排名分数
* 根据配置选择不同的数据库获取战力值
* @param {string} charac_no
* @returns 返回对应的战力值
*/
function GetRankNumberBynangua(charac_no) {
local Config = GlobalConfig.Get("战力榜配置_南瓜.json");
local currentDB = Config["战力榜配置"]["当前选择"];
local dbConfig = Config["战力榜配置"]["数据库选择"][currentDB];
local SqlObj = MysqlPool.GetInstance().GetConnect();
// 构建查询语句 - 直接使用角色ID查询
local insertQuery = "SELECT " + dbConfig["字段名"] + " FROM " + dbConfig["数据库名"] + "." + dbConfig["表名"] + " WHERE " + dbConfig["条件字段"] + "=" + charac_no;
local column_type_list = ["string"];
local result = SqlObj.Select(insertQuery, column_type_list);
MysqlPool.GetInstance().PutConnect(SqlObj);
if (result.len() > 0) {
return result[0][0].tointeger();
}
return 0;
}
//获取个人信息
function GetMyEquInfo(SUser) {
local MyRanklist = {
"rank": 0,
"characname": "",
"job": 0,
"lev": 0,
"Grow": 0,
"Guilkey": 0,
"GuildName": "",
"str": "",
"equip": []
};
local Config = GlobalConfig.Get("战力榜配置_南瓜.json");
// 检查CID是否在排除列表中
if ("角色CID" in Config["战力榜配置"]["排除名单"]) {
foreach(excludedCID in Config["战力榜配置"]["排除名单"]["角色CID"]) {
if (SUser.GetCID() == excludedCID) {
return MyRanklist;
}
}
}
MyRanklist.rank = GetRankNumberBynangua(SUser.GetCID());
MyRanklist.characname = SUser.GetCharacName();
MyRanklist.job = SUser.GetCharacJob();
MyRanklist.lev = SUser.GetCharacLevel();
MyRanklist.Grow = Sq_CallFunc(S_Ptr("0x815741C"), "int", ["pointer"], SUser.C_Object);
MyRanklist.Guilkey = Sq_CallFunc(S_Ptr("0x822F46C"), "int", ["pointer"], SUser.C_Object);
MyRanklist.GuildName = SUser.GetGuildName();
if (MyRanklist.GuildName.len() == 0) {
MyRanklist.GuildName = "天地会"; //当公会不存在时,设置默认公会名字
}
local InvenObj = SUser.GetInven();
if (!InvenObj) {
return;
}
if (InvenObj) {
for (local i = 0; i <= 10; i++) {
if (i != 9) {
local clearAvatar = Sq_CallFunc(S_Ptr("0x0850D374"), "int", ["pointer", "int"], InvenObj.C_Object, i);
local ItemObj = InvenObj.GetSlot(0, i);
local item_id = clearAvatar > 0 ? clearAvatar : ItemObj.GetIndex();
MyRanklist.equip.push(item_id);
} else {
MyRanklist.equip.push(-1);
}
}
}
return MyRanklist;
}
// 玩家下线时,保存自身信息并且和排行榜进行排名
function SetRankingBynangua(SUser) {
local IP = Rank_nangua.api_CUser_get_public_ip_address(SUser);
if (IP == "10.0.0.1") {
return;
}
local MyRanklist = GetMyEquInfo(SUser);
local existingIndex = -1;
foreach(index, rankInfo in Ranklist) {
if (rankInfo.characname == MyRanklist.characname) {
existingIndex = index;
break;
}
}
if (MyRanklist.rank > 0) {
if (existingIndex != -1) {
Ranklist[existingIndex] = MyRanklist;
} else {
if (!Ranklist.rawin("4")) {
Ranklist["4"] <- {};
}
Ranklist["4"] = MyRanklist;
}
local rankArray = [];
foreach(key, value in Ranklist) {
rankArray.append(value);
}
rankArray.sort(function(a, b) {
return b.rank - a.rank;
});
// 获取前三名玩家的信息
local topThree = rankArray.slice(0, 3);
if (Ranklist.rawin("4")) {
Ranklist.rawdelete("4");
}
Ranklist = {
"1": topThree[0],
"2": topThree[1],
"3": topThree[2]
};
}
}
//清除排名的自定义留言信息
function DeleteSpecificMessage() {
local G_CGameManager = Sq_CallFunc(S_Ptr("0x080cc18e"), "pointer", []);
local Message = Sq_CallFunc(S_Ptr("0x08298EEC"), "pointer", ["pointer"], G_CGameManager);
Sq_CallFunc(S_Ptr("0x08600D0C"), "char", ["pointer", "int"], Message, 1);
Sq_CallFunc(S_Ptr("0x08600D0C"), "char", ["pointer", "int"], Message, 2);
Sq_CallFunc(S_Ptr("0x08600D0C"), "char", ["pointer", "int"], Message, 3);
}
//发送留言信息
function UpdateServerMessageByBroadcast(SUser, Ranking, msg) {
DeleteSpecificMessage()
local Pack = Packet();
Pack.Put_Header(0, 192);
Pack.Put_Byte(1);
Pack.Put_Byte(1);
Pack.Put_Byte(Ranking);
Rank_nangua.api_InterfacePacketBuf_put_string(Pack, msg);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
function SendRanklistPacket(SUser, Ranklist, bool) {
local Pack = Packet();
Pack.Put_Header(0, 182);
local rankArray = [Ranklist["1"], Ranklist["2"], Ranklist["3"]];
Pack.Put_Byte(rankArray.len());
foreach(index, value in rankArray) {
Rank_nangua.api_InterfacePacketBuf_put_string(Pack, value.characname);
Pack.Put_Byte(value.lev);
Pack.Put_Byte(value.job);
Pack.Put_Byte(value.Grow);
Rank_nangua.api_InterfacePacketBuf_put_string(Pack, value.GuildName + "");
Pack.Put_Int(value.Guilkey);
for (local i = 0; i < value.equip.len(); i++) {
Pack.Put_Int((i != 9) ? value.equip[i] : -1);
}
}
Pack.Finalize(true);
if (bool) {
World.SendAll(Pack);
} else {
SUser.Send(Pack);
}
Pack.Delete();
}
//因客户端原因,只有名称有变动或排名有变动时才会刷新外观,所以发送一次加空格的名字,然后删除空格再发送一次
function SendRankLists(SUser, bool) {
local ip = Rank_nangua.api_CUser_get_public_ip_address(SUser);
if (ip == "10.0.0.1") {
return;
}
local Config = GlobalConfig.Get("战力榜配置_南瓜.json");
foreach(key, value in Ranklist) {
value["characname"] = value["characname"] + " ";
}
SendRanklistPacket(SUser, Ranklist, bool);
foreach(key, value in Ranklist) {
value["characname"] = value["characname"].slice(0, value["characname"].find(" ")) + value["characname"].slice(value["characname"].find(" ") + 1);
}
//发送排名留言信息
UpdateServerMessageByBroadcast(SUser, 1, Config["战力榜配置"]["留言信息"]["第一名"]);
UpdateServerMessageByBroadcast(SUser, 2, Config["战力榜配置"]["留言信息"]["第二名"]);
UpdateServerMessageByBroadcast(SUser, 3, Config["战力榜配置"]["留言信息"]["第三名"]);
SendRanklistPacket(SUser, Ranklist, bool);
}
class Rank_nangua {
function api_InterfacePacketBuf_put_string(Pack, s) {
local p = Memory.allocUtf8String(s);
local len = s.len();
Pack.Put_Int(len);
Pack.Put_BinaryEx(p.C_Object, len);
}
function api_CUser_get_public_ip_address(SUser){
local s_addr = Sq_CallFunc(S_Ptr("0x084EC90A"), "int", ["pointer"], SUser.C_Object);
if(s_addr){
local inet_ntoa = Sq_CallFunc(S_Ptr("0x0807DDC0"), "pointer", ["int"], s_addr);
return NativePointer(inet_ntoa).readUtf8String();
}
return null;
}
}
// 创建数据库和表
function createRankEventTable() {
local CreateSql1 = "create database if not exists DP_S default charset utf8;";
local CreateSql2 = "CREATE TABLE IF NOT EXISTS DP_S.event (" +
"event_id varchar(30) NOT NULL, " +
"event_info mediumtext, " +
"PRIMARY KEY (event_id)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
local SqlObj = MysqlPool.GetInstance().GetConnect();
SqlObj.Exec_Sql(CreateSql1);
SqlObj.Exec_Sql(CreateSql2);
MysqlPool.GetInstance().PutConnect(SqlObj);
}
// 保存战力榜数据到数据库
function saveRanklistToDatabase() {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local ranklistJson = Json.Encode(Ranklist);
local query = "REPLACE INTO DP_S.event (event_id, event_info) VALUES ('ranklist', '" + ranklistJson + "')";
SqlObj.Select(query, []);
MysqlPool.GetInstance().PutConnect(SqlObj);
}
// 从数据库加载战力榜数据
function loadRanklistFromDatabase() {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local query = "SELECT event_info FROM DP_S.event WHERE event_id = 'ranklist'";
local result = SqlObj.Select(query, ["string"]);
if (result.len() > 0) {
local savedRanklist = Json.Decode(result[0][0]);
if (savedRanklist != null) {
Ranklist = savedRanklist;
}
}
MysqlPool.GetInstance().PutConnect(SqlObj);
}
// 服务器被Kill时(不含炸频道等)保存战力榜数据
Cb_Server_ClossByKill_Leave_Func.ServerClossByKill <- function(args) {
local result = args.pop();
if (result <= 0) {
saveRanklistToDatabase();
}
}
// 服务器异常崩溃时保存战力榜数据
Cb_Server_Close_Enter_Func.Server_Close <- function(args) {
saveRanklistToDatabase();
}
function _Dps_Rank_nangua_Main_() {
local Config = GlobalConfig.Get("战力榜配置_南瓜.json");
local PoolObj = MysqlPool.GetInstance();
local Ip = Config["数据库IP 不是外置数据库不要更改"];
local Port = Config["数据库端口 不懂不要更改"];
local DbName = Config["数据库用户名 本地用户名不懂不要更改"];
local Password = Config["数据库密码 本地密码不懂不要更改"];
PoolObj.SetBaseConfiguration(Ip, Port, DbName, Password);
PoolObj.PoolSize = 10;
PoolObj.Init();
// 创建表
createRankEventTable();
// 加载战力榜数据
loadRanklistFromDatabase();
// 玩家下线时
Cb_CUser_LogoutToPCRoom_Enter_Func.ReturnSelectCharac <- function(args) {
local SUser = User(args[0]);
SetRankingBynangua(SUser);
SendRankLists(SUser, false);
};
//玩家登录时
Cb_reach_game_world_Func.RankByNangua <- function(SUser) {
Timer.SetTimeOut(function(SUser) {
SendRankLists(SUser, true);
}, 3, SUser);
};
}

View File

@@ -0,0 +1,80 @@
{
"战力榜配置": {
"当前选择": "长虹",
"数据库选择": {
"入梦": {
"数据库名": "mengyiqu",
"表名": "m_ranks",
"字段名": "m_rank",
"条件字段": "m_cid"
},
"苍穹": {
"数据库名": "d_starsky",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
},
"万国": {
"数据库名": "d_login",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
},
"天子": {
"数据库名": "taiwan_cain",
"表名": "charac_info",
"字段名": "zhandouli",
"条件字段": "charac_no"
},
"晴空": {
"数据库名": "qk",
"表名": "fightingcapacity",
"字段名": "price",
"条件字段": "CID"
},
"黑爵": {
"数据库名": "huazhi_v5",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
},
"暴雨": {
"数据库名": "d_baoyu",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
},
"花枝": {
"数据库名": "huazhi",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
},
"神话": {
"数据库名": "asion_login",
"表名": "myzhanli",
"字段名": "zlz",
"条件字段": "zcid"
},
"长虹": {
"数据库名": "d_changhong",
"表名": "zhanli",
"字段名": "ZLZ",
"条件字段": "CID"
}
},
"留言信息": {
"第一名": "普天之下,唯我独尊!",
"第二名": "四方之内,唯我独霸!",
"第三名": "世间万物,唯我独步!"
},
"排除名单":{
"角色CID":[111111, 222222]
},
"提示":"角色CID可以查看数据库中 taiwan_cain → charac_info → charac_no代表角色ID"
},
"数据库IP 不是外置数据库不要更改": "127.0.0.1",
"数据库端口 不懂不要更改": 3306,
"数据库用户名 本地用户名不懂不要更改": "game",
"数据库密码 本地密码不懂不要更改": "uu5!^%jg"
}