This commit is contained in:
lenheart
2025-11-03 21:13:01 +08:00
parent 2ef9cfef42
commit 10de73a395
91 changed files with 2497 additions and 2329 deletions

View File

@@ -11,7 +11,9 @@ class Memory {
}
function allocUtf8String(Str) {
return NativePointer(Str_Ptr(Str));
local P = NativePointer(Str_Ptr(Str));
P.Size = Str.len();
return P;
}
function copy(P1, P2, Size) {
@@ -26,6 +28,8 @@ class Memory {
}
class NativePointer extends Base_C_Object {
//大小
Size = -1;
function _tyoeof()
{
@@ -35,6 +39,7 @@ class NativePointer extends Base_C_Object {
constructor(T) {
if (typeof T == "integer") {
base.constructor(Sq_New_Point(T));
Size = T;
//注册销毁伪析构
Register_Destruction(C_Object, this);
} else if (typeof T == "userdata") {

View File

@@ -9,6 +9,7 @@ class Script {
C_Object = null;
constructor(Path = "/home/neople/game/Script.pvf") {
if(getroottable().rawin("_Script_Data_"))return;
print("正在初始化PVF...");
local StartTime = time();

View File

@@ -40,6 +40,8 @@ function OnGatewaySocketConnect() {
foreach(value in OnGatewaySocketConnectFunc) {
value();
}
}
//网关包回调Map
if (!getroottable().rawin("GatewaySocketPackFuncMap")) GatewaySocketPackFuncMap <- {}

View File

@@ -242,6 +242,19 @@ class User extends Base_C_Object {
Pack.Delete();
}
//发送字节包
function SendBlob(Np) {
if(!Np || Np.Size == -1)return;
local Pack = Packet();
Pack.Put_Header(1, 131);
Pack.Put_Byte(1);
Pack.Put_Int(Np.Size);
Pack.Put_BinaryEx(Np.C_Object,Np.Size);
Pack.Finalize(true);
Send(Pack);
Pack.Delete();
}
//发送自定义DPS包
function Send_DPS_Pack(Id, Jso) {
Jso.op <- 2147483646;
@@ -781,7 +794,7 @@ function User::DropItem(ItemId, Xpos, Ypos) {
//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]])
function User::ReqDBSendMultiMail(title, text, gold, item_list) {
Timer.SetTimeOut(function(SUser,title, text, gold, item_list) {
Timer.SetTimeOut(function(SUser, title, text, gold, item_list) {
local Cid = SUser.GetCID();
// 获取分割后的道具列表
local subLists;
@@ -843,5 +856,5 @@ function User::ReqDBSendMultiMail(title, text, gold, item_list) {
Sq_CallFunc(S_Ptr("0x8556B68"), "int", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int"], title_ptr.C_Object, addition_slots.C_Object, subList.len(), gold, Cid, text_ptr.C_Object, text_len, 0, 99, 1);
}
}
}, 1,this,title, text, gold, item_list);
}, 1, this, title, text, gold, item_list);
}

View File

@@ -32,6 +32,7 @@ Gm_InputFunc_Handle.KickMySelf <- function(SUser, CmdString) {
SUser.Kick();
};
Gm_InputFunc_Handle["升级"] <- function(SUser, CmdString) {
local count = -1;
local pos = 0;
@@ -48,22 +49,18 @@ Gm_InputFunc_Handle["升级"] <- function(SUser, CmdString) {
//得到空格数量
if (count == 1) {
print(handler[1].tointeger());
SUser.SetCharacLevel(handler[1].tointeger());
}
}
Gm_InputFunc_Handle["cs"] <- function(SUser, CmdString) {
local InvenObj = SUser.GetInven();
local slot = InvenObj.GetSlotById(26058);
if (slot == -1) {
return;
}
local itemobj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, slot);
itemobj.Delete();
SUser.SendUpdateItemList(1, 0, slot);
SUser.ReqDBSendMultiMail("标题", "内容", 0, [
[3037, 100],
[3038, 100]
]);
}
Gm_InputFunc_Handle["给"] <- function(SUser, CmdString) {
@@ -89,6 +86,7 @@ Gm_InputFunc_Handle["给"] <- function(SUser, CmdString) {
if (!Ret) SUser.SendNotiPacketMessage("发送失败背包是不是满了", 8);
}
}
Gm_InputFunc_Handle["转职"] <- function(SUser, CmdString) {
local count = -1;
local pos = 0;
@@ -147,12 +145,6 @@ Gm_InputFunc_Handle["测试"] <- function(SUser, CmdString) {
SUser.ClearQuest_Gm(650);
}
Cb_History_MileageSet_Func["_DPS_上线自动完成任务_"] <- function(SUser, Data) {
SUser.ClearQuest_Gm(101);
}
Gm_InputFunc_Handle.M <- function(SUser, CmdString) {
local PartyObj = SUser.GetParty();
// Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, SUser.C_Object, 3037);
@@ -173,31 +165,59 @@ Gm_InputFunc_Handle.W <- function(SUser, CmdString) {
};
Gm_InputFunc_Handle.Q <- function(SUser, CmdString) {
local PartyObj = SUser.GetParty();
if (PartyObj) {
local Buf = 18126;
PartyObj.ForeachMember(function(SUser, Pos) {
print(Pos + "号位玩家的" + Buf + "名字是: " + SUser.GetCharacName());
})
// print(UserBuf.GetName());
}
};
function calculate_grade(point) {
if (point< 500) return 1;
else if (point< 1000) return 2;
else if (point< 1500) return 3;
else if (point< 2000) return 4;
else if (point< 2500) return 5;
else if (point< 3000) return 6;
else if (point< 3500) return 7;
else if (point< 4000) return 8;
else if (point< 4500) return 9;
else if (point< 5000) return 10;
else if (point< 5500) return 11;
else if (point< 6000) return 12;
else if (point< 6500) return 13;
else if (point< 7000) return 14;
else if (point< 7500) return 15;
else if (point< 8000) return 16;
else if (point< 8500) return 17;
else if (point< 9000) return 18;
else if (point< 9500) return 19;
else if (point< 10000) return 20;
else if (point< 10500) return 21;
else if (point< 11000) return 22;
else if (point< 11500) return 23;
else if (point< 12000) return 24;
else if (point< 12500) return 25;
else if (point< 13000) return 26;
else if (point< 13500) return 27;
else if (point< 14000) return 28;
else if (point< 14500) return 29;
else if (point< 15000) return 30;
else return 31;
}
Gm_InputFunc_Handle.FI <- function(SUser, CmdString) {
// local PartyObj = SUser.GetParty();
// if (PartyObj) {
// local Bfobj = PartyObj.GetBattleField();
// print(Bfobj.GetHellDifficulty());
// // print(n);
// }
SUser.SendNotiForColorAIdPacketMessage([
[" → ", 0, [0xff, 0xff, 0xff]],
["无色", 1, [255, 215, 0], 3037],
[" x" + (1).tostring(), 0, [0xff, 0xff, 0xff]]
], 6);
local Cid = SUser.GetCID();
Sq_CallFunc(S_Ptr("0x8686FEE"), "void", ["pointer", "bool"], SUser.C_Object, true);
local SqlObj = MysqlPool.GetInstance().GetConnect();
local sql = format("SELECT pvp_point, pvp_grade FROM pvp_result WHERE charac_no = %d", Cid);
local result = SqlObj.Select(sql, ["int", "int"]);
// 解析查询结果
local pvp_point = result[0][0];
local pvp_grade = result[0][1];
// 计算新的PVP积分和等级
local new_point = pvp_point + 500;
local new_grade = calculate_grade(new_point);
local newsql = format("UPDATE pvp_result SET win = win + 1, pvp_point = %d, pvp_grade = %d, play_count = play_count + 1,pvp_count = pvp_count + 1, win_point = win_point + 10 WHERE charac_no = %d", new_point, new_grade, Cid);
SqlObj.Exec_Sql(newsql);
MysqlPool.GetInstance().PutConnect(SqlObj);
};
Gm_InputFunc_Handle.UINJ <- function(SUser, CmdString) {
@@ -236,6 +256,7 @@ Gm_InputFunc_Handle.T <- function(SUser, CmdString) {
SUser.SendNotiPacketMessage("GetMaxFatigue: " + SUser.GetMaxFatigue(), 8);
SUser.SendNotiPacketMessage("GetParty: " + SUser.GetParty(), 8);
SUser.SendNotiBox("测试", 1);
};
@@ -341,12 +362,22 @@ Gm_InputFunc_Handle.WEQ <- function(SUser, CmdString) {
// local C = NativePointer(B).add(101);
// local D = NativePointer(C).add(8).readInt();
//附魔不报错
Haker.LoadHook("0x081D233A", ["pointer", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
return 0;
});
Sq_CallFunc(S_Ptr("0x84EC002"), "int", ["pointer", "int"], SUser.C_Object, 0);
local D = Sq_CallFunc(S_Ptr("0x8696600"), "int", ["pointer"], SUser.C_Object);
print(D);
Haker.LoadHook("0x081D24B8", ["pointer", "pointer", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
return null;
});
};
@@ -882,20 +913,102 @@ ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) {
// });
function _Jump_DropItem_check_error_()
{
function _Jump_DropItem_check_error_() {
//如果没有创建过这个模拟内存就创建
if(!getroottable().rawin("_EmptyCharacInfo_Flag_")){
if (!getroottable().rawin("_EmptyCharacInfo_Flag_")) {
getroottable()._EmptyCharacInfo_Flag_ <- Memory.alloc(17);
Memory.reset(getroottable()._EmptyCharacInfo_Flag_,17);
Memory.reset(getroottable()._EmptyCharacInfo_Flag_, 17);
}
//如果没有创建过这个跳转Flag就创建并初始化
if(!getroottable().rawin("_EmptyHook_Flag_")){
if (!getroottable().rawin("_EmptyHook_Flag_")) {
getroottable()._EmptyHook_Flag_ <- false;
}
}
function _Dps_UpdateCreatureEnchantMysql_(card_id, charac_no, uuid) {
local sql = "select card from `taiwan_cain_2nd`.`creature_items_enchant` where ui_id = " + uuid + ";";
local column_type_list = ["int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
local UpdateSql = "update `taiwan_cain_2nd`.`creature_items_enchant` set `card` = " + card_id + " where `ui_id` = " + uuid + ";";
if (result.len() <= 0 || result[0].len() <= 0) {
UpdateSql = "INSERT INTO `taiwan_cain_2nd`.`creature_items_enchant`(`ui_id`, `charac_no`, `card`) VALUES (" + uuid + "," + charac_no + "," + card_id + ");";
}
SqlObj.Exec_Sql(UpdateSql);
MysqlPool.GetInstance().PutConnect(SqlObj);
}
function _Dps_GetCreatureEnchantMysql_(charac_no) {
local sql = "select ui_id,card from `taiwan_cain_2nd`.`creature_items_enchant` where charac_no = " + charac_no + ";";
local column_type_list = ["int", "int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
MysqlPool.GetInstance().PutConnect(SqlObj);
return result;
}
// MultiBox_Lottery_SetCount <- 0;
// MultiBox_Lottery_SetInfo <- [];
Timer.SetTimeOut(function() {
// GameManager.OpenHotFix("/dp_s/OfficialConfig");
// Haker.LoadHook("0x080FE2B6", ["pointer", "pointer"],
// function(args) {
// // print("args 0 : " + args[0]);
// return args;
// },
// function(args) {
// // print(args.pop());
// local ItemObj = Item(args.pop());
// print(ItemObj.GetIndex());
// return null;
// });
// Haker.LoadHook("0x08674968", ["pointer", "int", "int", "int"],
// function(args) {
// print("args 1 : " + args[1]);
// print("args 2 : " + args[2]);
// // args[1] = 3;
// // args[2] = 109;
// return args;
// },
// function(args) {
// print(args.pop());
// args.push(1);
// return null;
// });
// //获取坐标
// Gm_InputFunc_Handle["设置宣言"] <- function(SUser, CmdString) {
// local count = -1;
// local pos = 0;
// local handler = [];
// do {
// local start = pos;
// pos = CmdString.find(" ", pos + 1);
// if (pos != null) {
// handler.append(CmdString.slice(start + 1, pos));
// } else
// handler.append(CmdString.slice(start + 1));
// count = count + 1
// } while (pos != null)
// //得到空格数量
// if (count == 1) {
// local T = {
// op = 20096009,
// cid = SUser.GetCID(),
// uid = SUser.GetUID(),
// zdygg = handler[1]
// }
// Socket.SendGateway(T);
// }
// };
// GameManager.SetGameMaxLevel(85);
// //私有方法 发送带参数的Post请求
// local SO = Http("129.211.27.104", "9080");
// local Res = SO.Post("/dof/chat", Json.Encode({
@@ -903,121 +1016,279 @@ Timer.SetTimeOut(function() {
// text = "倾泪寒在格蓝迪发电站爆出了【雷剑-苦轮】!真是人品爆炸!!!",
// groupId = 850022626
// }), "application/json");
// _Dps_CollectIllustrationsAndTransplantThem_Main_();
// Cb_DropItem_check_error_Enter_Func.Rindro <- function(args){
// getroottable()._EmptyHook_Flag_ = true;
// args[1] = getroottable()._EmptyCharacInfo_Flag_.C_Object;
// return args;
// }
// Cb_DropItem_check_error_Leave_Func.Rindro <- function(args){
// if(getroottable()._EmptyHook_Flag_){
// getroottable()._EmptyHook_Flag_ = false;
// return 19;
// //初始建表指令
// local CreateSql = "CREATE TABLE `taiwan_cain_2nd`.`creature_items_enchant` (`ui_id` int(11) NOT NULL DEFAULT '0',`charac_no` int(11) DEFAULT NULL,`card` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`ui_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
// local SqlObj = MysqlPool.GetInstance().GetConnect();
// SqlObj.Exec_Sql(CreateSql);
// MysqlPool.GetInstance().PutConnect(SqlObj);
// print(666);
// //忽略宠物附魔错误
// Sq_WriteByteArr(S_Ptr("0x850dede"), array(2, 0x90));
// Cb_ExpertOnEnchantByBead_Leave_Func["宠物附魔"] <- function(args) {
// if (args[5] > 56) {
// local SUser = User(args[1]);
// local InvenObj = SUser.GetInven();
// local Bead_id = InvenObj.GetSlot(1, args[3]).GetIndex()
// local PvfItemObj = PvfItem.GetPvfItemById(InvenObj.GetSlot(1, args[3]).GetIndex())
// local Card_Id = Sq_CallFunc(S_Ptr("0x0849F530"), "int", ["pointer"], PvfItemObj.C_Object);
// local a7 = args[5] - 57;
// local ItemObj = InvenObj.GetSlot(3, a7)
// local Item_Id = ItemObj.GetIndex();
// NativePointer(ItemObj.C_Object).add(13).writeU32(Card_Id);
// if (a7< 140) {
// local uuid = NativePointer(ItemObj.C_Object).add(7).readInt();
// _Dps_UpdateCreatureEnchantMysql_(Card_Id, SUser.GetCID(), uuid);
// }
// local Pack = Packet();
// Pack.Put_Header(1, 275);
// Pack.Put_Byte(1);
// Pack.Finalize(true);
// SUser.Send(Pack);
// Pack.Delete();
// SUser.SendUpdateItemList(1, 7, a7);
// InvenObj.DeleteItemCount(Bead_id, 1);
// SUser.SendUpdateItemList(1, 0, args[3]);
// return 0;
// }
// }
// Cb_reach_game_world_Func["宠物附魔"] <- function(SUser) {
// local Data = _Dps_GetCreatureEnchantMysql_(SUser.GetCID());
// local DMap = {};
// foreach(data_obj in Data) {
// local uuid = data_obj[0];
// local card_id = data_obj[1];
// DMap.rawset(uuid, card_id);
// }
// local InvenObj = SUser.GetInven();
// for (local i = 0; i< 141; i++) {
// local equ;
// if (i == 140) {
// equ = InvenObj.GetSlot(0, 22); //获取当前格子的宠物
// } else {
// equ = InvenObj.GetSlot(3, i);
// }
// local equ_uuid = NativePointer(equ.C_Object).add(7).readInt();
// if (DMap.rawin(equ_uuid)) {
// NativePointer(equ.C_Object).add(13).writeU32(DMap[equ_uuid]);
// if (i == 140) SUser.SendUpdateItemList(1, 0, 22);
// else SUser.SendUpdateItemList(1, 7, i);
// }
// }
// }
// PacketDebugModel <- true;
// User.SendItemMail(1, 1, [{
// item = 3037,
// num = 10
// }], "标题", "内容");
// Haker.LoadHook("0x085F2CC6", ["pointer", "pointer", "pointer", "int", "int", "int", "pointer", "int"],
// function(args) {
// foreach(value in args) {
// print(value);
// }
// return null;
// },
// function(args) {
// return null;
// });
}, 1)
Gm_InputFunc_Handle["aaa"] <- function(SUser, cmd) {
// 获取角色背包
local InvenObj = SUser.GetInven();
// 角色仓库
local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object);
// 添加计数器
local transferCount = 0;
// 遍历背包消耗品栏及材料栏
for (local i = 57; i <= 152; ++i) {
// 获取背包物品
local ItemObj = InvenObj.GetSlot(1, i);
// 获取背包物品ID
local Item_Id = ItemObj.GetIndex();
local ItemName = PvfItem.GetNameById(Item_Id);
// 如果物品ID为0或3037跳过(在此可以添加其他需要跳过的物品ID)
if (Item_Id == 0 || Item_Id == 3037) {
continue;
}
// local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9);
// 角色仓库是否存在背包物品
local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id);
// 如果角色仓库中没有该物品,跳过
if (CargoSlot == -1) {
continue;
}
// local Flag = Sq_CallFunc(S_Ptr("0x081201DC"), "bool", ["pointer"], Equ.C_Object);
// print(Flag);
// 获取仓库物品指针
local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer();
// 获取角色仓库物品对象
local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot);
// 获取角色仓库物品ID
local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32();
// 获取角色仓库物品数量
local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object);
// 获取物品对象
local PvfItem = PvfItem.GetPvfItemById(cargoItemId);
local ptr = Memory.alloc(10240);
ptr.Output(48);
Sq_CallFunc(S_Ptr("0x084FB918"), "int", ["pointer", "pointer", "int", "int"], ptr.C_Object, InvenObj.C_Object, 1, 9);
ptr.Output(48);
// local TradeSpace = Sq_CallFunc(S_Ptr("0x08120242"), "bool", ["pointer"], SUser.C_Object, Inven.INVENTORY_TYPE_ITEM, 0);
// print(ptr.);
return;
// 获取物品可堆叠数量
local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object);
// 获取角色背包
// local InvenObj = SUser.GetInven();
// local ItemObj = InvenObj.GetSlot(1, 9);
// print("Id:" + ItemObj.GetIndex());
// print("Address:" + ItemObj.C_Object);
// 如果仓库已达堆叠上限,跳过此物品
if (cargoItemCount >= getStackableLimit) {
continue;
}
// print(NativePointer(ItemObj.C_Object).add(47).readS8());
// NativePointer(ItemObj.C_Object).add(48).writeS8(100);
// NativePointer(ItemObj.C_Object).add(49).writeS8(11);
// 获取背包物品数量
local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object);
// 获取物品是否可堆叠
local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount);
// 尝试将物品储存至角色仓库中
local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
if (tryAddStackItem >= 0) {
// 正式将物品插入角色仓库中
Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
// 删除背包中的物品
ItemObj.Delete();
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
}
// NativePointer(ItemObj.C_Object).add(50).writeS8(16);
// NativePointer(ItemObj.C_Object).add(51).writeS8(100);
// NativePointer(ItemObj.C_Object).add(52).writeS8(11);
// 处理可堆叠物品
if (checkStackableLimit == 0) {
// 获取物品总数
local totalCount = cargoItemCount + inventoryItemCount;
// NativePointer(ItemObj.C_Object).add(54).writeS8(16);
// NativePointer(ItemObj.C_Object).add(55).writeS8(100);
// NativePointer(ItemObj.C_Object).add(56).writeS8(11);
// 如果总数不超过上限,全部堆到仓库
if (totalCount <= getStackableLimit) {
// 将物品堆到仓库
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount);
// 删除背包中的物品
ItemObj.Delete();
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
} else {
// 如果总数超过上限
// 将仓库的物品数量设置为最大数量
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit);
// 将背包数量减去转移至仓库的数量
local transferAmount = getStackableLimit - cargoItemCount;
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit);
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8);
// ItemObj.Flush();
// SUser.SendUpdateItemList(1, 0, 9);
// ItemObj.Output();
// local OldData = blob(0);
// foreach (value in ItemObj.Attribute) {
// OldData.writen(value,'b');
// // OldData.seek(1,'c');
// }
// ItemObj.Attribute.seek(37);
// local Address = ItemObj.Attribute.readn('i');
// print(Address);
// local Count = Sq_CallFunc(S_Ptr("0x08514E6E"), "int", ["pointer"], ItemObj.C_Object);
// print("魔法封印装备的数量: " + Count);
// local SendInfo = SUser.GiveItem(2243114, 1);
// local NewItemObj = InvenObj.GetSlot(1, SendInfo[1]);
// if(NewItemObj){
// NewItemObj.Attribute = OldData;
// NewItemObj.Flush();
// NewItemObj.Output();
// SUser.SendUpdateItemList(1,0, SendInfo[1]);
// }
// SUser.SendItemSpace(0);
//先执行背包固化 把最新数据存到数据库
Sq_CallFunc(S_Ptr("0x0864FE52"), "int", ["pointer"], SUser.C_Object);
// Sq_CallFunc(S_Ptr("0x086501C8"), "int", ["pointer"], SUser.C_Object);
Timer.SetTimeOut(function() {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local Ret = SqlObj.Select("SELECT inventory FROM taiwan_cain_2nd.inventory WHERE charac_no = 1;", ["binary"]);
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
if (Ret.len()< 1 || Ret[0][0] == null) {
return false;
} else {
local LengthPointer = Memory.alloc(4);
LengthPointer.writeInt(18238);
local ReadPointer = Memory.alloc(18238);
local Flag = Sq_CallFunc(S_Ptr("0x086B2102"), "bool", ["pointer", "pointer", "pointer", "int"], ReadPointer.C_Object, LengthPointer.C_Object, Ret[0][0].C_Object, Ret[0][0].Size);
//读取第一格装备
local Slot = 0;
local RealP = ReadPointer.add(2 + (9 + Slot) * 61);
//打印数据
RealP.Output(61);
//装备编号
local ItemId = RealP.readInt();
print("装备编号: " + ItemId);
//强化等级
local EnhancementLevel = RealP.add(4).readS8();
print("强化等级: " + EnhancementLevel);
//红字类型
local AmplifyType = RealP.add(15).readS8();
print("红字类型: " + AmplifyType);
//红字属性值
local AmplifyValue = RealP.add(16).readS8();
print("红字属性值: " + AmplifyValue);
//锻造等级
local ForgingGrade = RealP.add(49).readS8();
print("锻造等级: " + ForgingGrade);
//附魔卡片
local CardId = RealP.add(11).readShort();
print("附魔卡片: " + CardId);
//品级
local Grade = RealP.add(5).readInt();
print("品级: " + Grade);
//耐久度
local Durability = RealP.add(9).readS8();
print("耐久度: " + Durability)
//魔法封印
local MagicSealP = "0x";
for (local i = 0; i< 14; i++) {
MagicSealP += format("%02x", RealP.add(35 + i).readS8());
}
print(MagicSealP);
local SendT = {
ItemId = ItemId,
Grade = Grade,
Durability = Durability,
EnhancementLevel = EnhancementLevel,
AmplifyType = AmplifyType,
AmplifyValue = AmplifyValue,
MagicSealP = MagicSealP,
CardId = CardId,
}
SendItemExMail(1, 1, [SendT], "GM", "GM");
}
}, 1)
}
// 通知客户端更新背包
SUser.SendUpdateItemList(1, 0, i);
function SendItemExMail(UID, CID, ItemList, title, content) {
local SUser = World.GetUserByUid(UID);
local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC";
local column_type_list = ["int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
local sl = 1;
if (result.len() > 0) {
sl = result[0][0] + 1;
}
if (transferCount == 0) {
SUser.SendNotiBox("没有可转移的物品!", 1);
}
// 通知客户端更新仓库
SUser.SendItemSpace(2);
local time = date();
local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"];
print(666);
foreach(value in ItemList) {
//时间 发送者名字 接收者id 装备ID 品级 耐久度 强化等级 红字类型 红字属性值 魔法封印属性 letterid
local sql1 = format("insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,item_id,add_info,endurance,upgrade,amplify_option,amplify_value,random_option,letter_id,extend_info) values ('%s','%s',%d,%d,%d,%d,%d,%d,%d,%s,%d,%d)", timeStr, title, CID, value.ItemId, value.Grade, value.Durability, value.EnhancementLevel, value.AmplifyType, value.AmplifyValue, value.MagicSealP, sl, value.CardId)
SqlObj.Select(sql1, []);
}
local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')";
SqlObj.Select(sql2, []);
MysqlPool.GetInstance().PutConnect(SqlObj);
if (SUser) {
local Pack = Packet();
Pack.Put_Header(0, 9);
local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object);
Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox);
local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox);
Pack.Put_Short(Not_Count);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
}
Gm_InputFunc_Handle["bbb"] <- function(SUser, cmd) {
// print(124124);
// Sq_CUser_RechargeCoupons(SUser.C_Object, 909999);
// Sq_CallFunc(S_Ptr("0x0817A1B4"), "int", ["pointer","int"], SUser.C_Object,100000);
SUser.GiveItem(2220112, 1);
}
@@ -1134,4 +1405,167 @@ Register_DPS_Pack(1, function(SUser, Pack) {
// Msg = MsgBuffer,
// };
// SUser.SendJso(evv);
// });
// });
// /*
// 文件名:收集图鉴_移植.nut
// 路径:OfficialProject/收集图鉴_移植/收集图鉴_移植.nut
// 创建日期:2025-05-05 05:22
// 文件用途:
// */
// function collect_check(id) {
// local CheckSql = "select id from `collect`.`s_item` where id = " + id + ";";
// //从池子拿连接
// local SqlObj = MysqlPool.GetInstance().GetConnect();
// local Ret = SqlObj.Select(CheckSql, ["int"]);
// //把连接还池子
// MysqlPool.GetInstance().PutConnect(SqlObj);
// if (Ret.len()< 1 || Ret[0][0] == null) {
// return false;
// } else {
// return Ret[0][0];
// }
// }
// function collect_check_has(uid, item) {
// local CheckSql = "select num from `collect`.`g_user_item` where uid = " + uid + " and item = " + item + ";";
// //从池子拿连接
// local SqlObj = MysqlPool.GetInstance().GetConnect();
// local Ret = SqlObj.Select(CheckSql, ["int"]);
// //把连接还池子
// MysqlPool.GetInstance().PutConnect(SqlObj);
// if (Ret.len()< 1 || Ret[0][0] == null) {
// return false;
// } else {
// return Ret[0][0];
// }
// }
// function collect_update(uid, item, type, num) {
// local CheckSql = "select id,num from `collect`.`g_user_item` where uid = " + uid + " and item = " + item + ";";
// //从池子拿连接
// local SqlObj = MysqlPool.GetInstance().GetConnect();
// local Ret = SqlObj.Select(CheckSql, ["int", "int"]);
// if (Ret.len()< 1 || Ret[0][0] == null) {
// local InsertSql = "INSERT INTO `collect`.`g_user_item`(`uid`,`item`,`type`,`num`) VALUES(" + uid + "," + item + "," + type + "," + num + ");";
// SqlObj.Exec_Sql(InsertSql);
// } else {
// local id = Ret[0][0];
// local newnum = Ret[0][1] + num;
// local UpdateSql = "update `collect`.`g_user_item` set num = " + newnum + " where id = " + id + ";";
// SqlObj.Exec_Sql(UpdateSql);
// }
// //把连接还池子
// MysqlPool.GetInstance().PutConnect(SqlObj);
// }
// function collect_equ(SUser, Slot) { //将装备收录进图鉴user slot
// local InvenObj = SUser.GetInven();
// local EquObj = InvenObj.GetSlot(1, Slot);
// local EquId = EquObj.GetIndex();
// local Msg = "";
// if (collect_check(equ_id)) { //是否支持收录
// local mid = SUser.GetUID();
// if (collect_check_has(mid, equ_id)) { //是否已收录
// msg = "已收录过该装备。";
// } else {
// local ItemName = PvfItem.GetNameById(EquId);
// Sq_CallFunc(S_Ptr("0x080CB7D8"), "int", ["pointer"], EquObj.C_Object);
// SUser.SendUpdateItemList(1, 0, Slot);
// collect_update(mid, equ_id, 1, 1); //更新图鉴
// msg = "装备[" + equ_name + "]已成功收录至图鉴。";
// }
// } else {
// msg = "该装备不支持图鉴收录。";
// }
// SUser.SendNotiPacketMessage(msg, 0);
// }
// if (!getroottable().rawin("collcet_monster_cache")) collcet_monster_cache <- {};
// function _Dps_CollectIllustrationsAndTransplantThem_Main_() {
// Cb_CParty_DungeonStart_Enter_Func["收集图鉴移植"] <- function(args) {
// local PartyObj = Party(args[0]);
// PartyObj.ForeachMember(function(SUser, Index) {
// local mid = SUser.GetUID();
// collcet_monster_cache[mid] <- {};
// });
// }
// Cb_CParty_OnKillMonster_Enter_Func["收集图鉴移植"] <- function(args) {
// local SUser = User(args[1]);
// local MonsterId = args[2];
// local Config = GlobalConfig.Get("收集图鉴移植_Lenheart.json");
// if (Config.rawin(MonsterId.tostring())) {
// local MonsterName = Config[MonsterId.tostring()];
// local mid = SUser.GetUID();
// if (collcet_monster_cache.rawin(mid)) {
// collcet_monster_cache[mid][MonsterId] <- 1;
// SUser.SendNotiPacketMessage("获得[" + MonsterName + "]。碎片1个。", 0);
// }
// }
// }
// Cb_CParty_SetPlayResult_Enter_Func["收集图鉴移植"] <- function(args) {
// local PartyObj = Party(args[0]);
// PartyObj.ForeachMember(function(SUser, Index) {
// local mid = SUser.GetUID();
// if (collcet_monster_cache.rawin(mid)) {
// foreach(key, value in collcet_monster_cache[mid]) {
// collect_update(mid, key, 2, value);
// }
// }
// });
// }
// // 跳过指定道具ID原逻辑1
// Cb_UseLimitCube_Check_Error_Leave_Func["收集图鉴移植"] <- function(args) {
// local ItemObj = Item(args[5]);
// local ItemId = ItemObj.GetIndex();
// if (ItemId == 690000274) {
// return 17;
// }
// }
// Cb_UseLimitCube_Process_Leave_Func["收集图鉴移植"] <- function(args) {
// local SUser = User(args[1]);
// local msg_base = args[2];
// if (msg_base) {
// local slot = NativePointer(msg_base).add(13).readShort();
// local boxslot = NativePointer(msg_base).add(19).readShort();
// local InvenObj = SUser.GetInven();
// local boxobj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, boxslot);
// local box_index = boxobj.GetIndex();
// local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, slot);
// local Item_Id = ItemObj.GetIndex();
// if (!ItemObj) return;
// if (box_index == 690000274) {
// local msg = "";
// if (collect_check(Item_Id)) {
// local mid = SUser.GetUID();
// if (collect_check_has(mid, Item_Id)) {
// msg = "已收录过该装备。";
// } else {
// local ItemName = PvfItem.GetNameById(Item_Id);
// Sq_CallFunc(S_Ptr("0x080CB7D8"), "int", ["pointer"], ItemObj.C_Object);
// collect_update(mid, Item_Id, 1, 1); //更新图鉴
// SUser.SendUpdateItemList(Inven.INVENTORY_TYPE_ITEM, 0, slot);
// msg = "装备[" + ItemName + "]已成功收录至图鉴。";
// }
// }else msg = "该装备不支持图鉴收录。";
// SUser.SendNotiPacketMessage(msg, 0);
// }
// }
// }
// }

View File

@@ -8,6 +8,7 @@ if (!("Cb_History_Log_Func" in getroottable())) Cb_History_Log_Func <- {};
function Cb_History_Log(Data) {
// print(Data[0]);
if(Data.len() < 14) return;
local UID = Data[1].tointeger();
local Time = Data[3];
local CharacName = Data[4];

View File

@@ -4,6 +4,7 @@
创建日期:2024-05-01 16:24
文件用途:服务端核心类
*/
Dps_Self_Ip <- "192.168.200.110";
function removeBackslashes(str) {
local result = "";
local index = 0;
@@ -91,6 +92,12 @@ class ServerControl {
}.bindenv(this));
//获得本服务器的IP
GatewaySocketPackFuncMap.rawset(10002, function(Jso) {
print(Jso);
Dps_Self_Ip = Jso.myip;
}.bindenv(this));
//给查询指定uid cid列表的玩家信息
GatewaySocketPackFuncMap.rawset(2023101902, function(Jso) {
@@ -359,8 +366,17 @@ class ServerControl {
local ItemId = Jso.itemid;
local num = 0;
if (SUser) {
local InvenObj = SUser.GetInven();
//获取背包对象
local InvenObj = SUser.GetInven();
if(ItemId == 0){
num = InvenObj.GetMoney();
}else{
local SlotIdx = InvenObj.GetSlotById(ItemId);
local SlotItem = InvenObj.GetSlot(1, SlotIdx);
@@ -375,7 +391,6 @@ class ServerControl {
return;
}
print(num);
for (local i = 0; i< 120; i++) {
local ItemObj = InvenObj.GetSlot(3, i);
if (ItemObj != null && ItemObj.GetIndex() == ItemId) {
@@ -387,7 +402,7 @@ class ServerControl {
num++;
}
};
print(num);
}
}
Jso.Count <- num;
@@ -741,9 +756,7 @@ class ServerControl {
//给注册玩家通关副本
GatewaySocketPackFuncMap.rawset(2023110704, function(Jso) {
local RealOp = Jso.realop;
print("注册副本了");
Cb_ClearDungeon_Enter_Func[RealOp] <- function(arg) {
print("通关副本了");
local PartyObj = Party(arg[0]);
if (PartyObj) {
local Bfobj = PartyObj.GetBattleField();
@@ -839,6 +852,7 @@ class ServerControl {
}
Socket.SendGateway(T);
}
//玩家上线
Cb_reach_game_world_Func["Rindro_player_reach_game_world"] <- function(SUser) {
local T = {
@@ -1013,7 +1027,6 @@ class ServerControl {
}
};
Cb_GetUserInfo_Leave_Func.ServerControl <- function(args) {
if (args.pop() >= 0) {
local SUser = User(args[1]);

View File

@@ -0,0 +1,328 @@
/*
文件名:Exchange.nut
路径:Dps_A/ProjectClass/Exchange/Exchange.nut
创建日期:2025-07-21 19:05
文件用途:
*/
class Exchange {
MysqlObject = null;
Commission = 0;
constructor() {
MysqlObject = Mysql(Str_Ptr("127.0.0.1"), 3306, Str_Ptr("taiwan_cain"), Str_Ptr("game"), Str_Ptr("uu5!^%jg"));
MysqlObject.Exec_Sql(format("SET NAMES %s", "latin1"));
SelectSql("CREATE TABLE `zyk`.`exchange` ( `uuid` int NOT NULL AUTO_INCREMENT, `type` int NULL, `itemid` int NULL, `itemcount` int NULL, `itemdata` varchar(512) NULL, `price` int NULL, `uid` int NULL , `cid` int NULL , `name` varchar(128) NULL, PRIMARY KEY (`uuid`));", []);
local Ct = ScriptData.GetFileData("etc/rindro/exchange/exchange.etc", function(DataTable, Data) {
DataTable.Attribute <- {};
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[commission]") {
Commission = Data.Get().tofloat() * 0.01;
}
}
}.bindenv(this));
//上架商品
ClientSocketPackFuncMap.rawset(21001001, function(SUser, Jso) {
//获取玩家背包
local InvenObj = SUser.GetInven();
if (!InvenObj) {
return;
}
//获取道具
local ItemObj = InvenObj.GetSlot(1, Jso.pos + 9 + (Jso.type * 48));
if (!ItemObj) return;
//获取道具类型
ItemObj.Attribute.seek(1);
local ItemType = ItemObj.Attribute.readn('c');
//副职业材料是10 这里给转成5
if (ItemType == 10) ItemType = 5;
//获取道具Id
local ItemId = ItemObj.GetIndex();
//获取数量
local ItemCount = ItemObj.GetAdd_Info();
//如果是装备 数量恒定为1
if (ItemType == 1) ItemCount = 1;
//获取道具数据
local ItemData = "0x00";
//获取价格
local Price = Jso.value;
//获取上架者cid
local Uid = SUser.GetUID();
local Cid = SUser.GetCID();
local Name = SUser.GetCharacName();
local InfoTable = {
ItemType = ItemType,
ItemId = ItemId,
ItemCount = ItemCount,
ItemData = ItemData,
Price = Price,
Uid = Uid,
Cid = Cid,
Name = Name
}
if (ItemType == 1) {
EquipLogic(SUser, Jso.pos + 9, InfoTable, ItemObj);
return;
}
//插入数据库
local Sql = format("INSERT INTO `zyk`.`exchange` (`type`, `itemid`, `itemcount`, `itemdata`, `price`, `uid` ,`cid`,`name`) VALUES (%d, %d, %d, \'%s\', %d, %d, %d, \'%s\');", InfoTable.ItemType, InfoTable.ItemId, InfoTable.ItemCount, InfoTable.ItemData, InfoTable.Price, InfoTable.Uid, InfoTable.Cid, InfoTable.Name);
local Ret = SelectSql(Sql, []);
//删除道具
ItemObj.Delete();
//发送刷新背包消息
SUser.SendUpdateItemList(1, 1, Jso.pos + 9 + (Jso.type * 48));
SUser.SendItemSpace(0);
}.bindenv(this));
//查询上架商品
ClientSocketPackFuncMap.rawset(21001003, function(SUser, Jso) {
local Offset = Jso.offset;
local Sql = format("SELECT * FROM `zyk`.`exchange` WHERE `type` = %d LIMIT 7 OFFSET %d;", Jso.type, Offset);
local Ret = SelectSql(Sql, ["int", "int", "int", "int", "binary", "int", "int", "int", "string"]);
local CountSql = format("SELECT COUNT(*) AS total FROM `zyk`.`exchange` WHERE `type` = %d;", Jso.type);
local CountRet = SelectSql(CountSql, ["int"]);
local TotalCount = 0;
if (CountRet.len() > 0) TotalCount = CountRet[0][0];
local Pack = {};
Pack.op <- 21001004;
Pack.info <- [];
Pack.total <- TotalCount;
foreach(info in Ret) {
local T = {
uid = info[0],
itemId = info[2],
count = info[3],
price = info[5],
name = info[8]
}
Pack.info.push(T);
}
SUser.SendJso(Pack);
}.bindenv(this));
//购买商品
ClientSocketPackFuncMap.rawset(21001005, function(SUser, Jso) {
local uuid = Jso.uuid;
local Sql = format("SELECT * FROM `zyk`.`exchange` WHERE `uuid` = %d;", uuid);
local Ret = SelectSql(Sql, ["int", "int", "int", "int", "string", "int", "int", "int", "string"]);
if (Ret.len() == 0) return;
local ItemObj = null;
local ItemType = Ret[0][1];
local ItemId = Ret[0][2];
local ItemCount = Ret[0][3];
local ItemPrice = Ret[0][5];
local ItemData = Ret[0][4];
local uid = Ret[0][6];
local cid = Ret[0][7];
local SelfCid = SUser.GetCID();
if (SelfCid == cid) return;
local UserPoint = SUser.GetCera();
if (UserPoint< ItemPrice) return;
//扣除点券
SUser.RechargeCera(-ItemPrice);
//如果是装备
if (ItemType == 1) {
local ItemDataJso = Json.Decode(ItemData);
SendItemExMail(SUser.GetUID(), SUser.GetCID(), [ItemDataJso], "交易所小助手", "您在交易所购买的商品已发货,请查收!");
} else {
//发送道具
local SendInfo = SUser.GiveItem(ItemId, 1);
SUser.SendItemSpace(0);
}
//给上架者加钱
local RealItemPrice = (ItemPrice * (1.0 - Commission.tofloat()).tofloat()).tointeger();
User.SendItemMail(uid, cid, [{
// item = 2022110573,
item = 3037,
num = RealItemPrice
}], "交易所小助手", "恭喜您在交易所成功出售商品,获得点券奖励");
//删除数据库中的记录
Sql = format("DELETE FROM `zyk`.`exchange` WHERE `uuid` = %d;", uuid);
SelectSql(Sql, []);
}.bindenv(this));
Cb_Use_Item_Sp_Func[2022110573] <- function(SUser, ItemId) {
local Cid = SUser.GetCID();
local InvenObj = SUser.GetInven();
if (InvenObj) {
local SlotIdx = InvenObj.GetSlotById(ItemId);
local ItemObj = InvenObj.GetSlot(1, SlotIdx);
local ItemCount = ItemObj.GetAdd_Info();
ItemObj.Delete();
SUser.SendItemSpace(0);
SUser.RechargeCera(ItemCount);
SUser.SendNotiPacketMessage("获得交易所点卷收益: " + ItemCount + "点卷", 8);
}
}
}
function EquipLogic(SUser, slot, InfoTable, ItemObj) {
Sq_CallFunc(S_Ptr("0x0864FE52"), "int", ["pointer"], SUser.C_Object);
Timer.SetTimeOut(function() {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local Ret = SqlObj.Select("SELECT inventory FROM taiwan_cain_2nd.inventory WHERE charac_no = " + SUser.GetCID() + ";", ["binary"]);
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
if (Ret.len()< 1 || Ret[0][0] == null) {
return false;
} else {
local LengthPointer = Memory.alloc(4);
LengthPointer.writeInt(18238);
local ReadPointer = Memory.alloc(18238);
local Flag = Sq_CallFunc(S_Ptr("0x086B2102"), "bool", ["pointer", "pointer", "pointer", "int"], ReadPointer.C_Object, LengthPointer.C_Object, Ret[0][0].C_Object, Ret[0][0].Size);
local RealP = ReadPointer.add(2 + slot * 61);
//装备编号
local ItemId = RealP.readInt();
// print("装备编号: " + ItemId);
//强化等级
local EnhancementLevel = RealP.add(4).readS8();
// print("强化等级: " + EnhancementLevel);
//红字类型
local AmplifyType = RealP.add(15).readS8();
// print("红字类型: " + AmplifyType);
//红字属性值
local AmplifyValue = RealP.add(16).readS8();
// print("红字属性值: " + AmplifyValue);
//锻造等级
local ForgingGrade = RealP.add(49).readS8();
// print("锻造等级: " + ForgingGrade);
//附魔卡片
local CardId = RealP.add(11).readShort();
// print("附魔卡片: " + CardId);
//品级
local Grade = RealP.add(5).readInt();
// print("品级: " + Grade);
//耐久度
local Durability = RealP.add(9).readS8();
// print("耐久度: " + Durability)
//魔法封印
local MagicSealP = "0x";
for (local i = 0; i< 14; i++) {
MagicSealP += format("%02x", RealP.add(35 + i).readU8());
}
// print(MagicSealP);
local SendT = {
ItemId = ItemId,
Grade = Grade,
Durability = Durability,
EnhancementLevel = EnhancementLevel,
AmplifyType = AmplifyType,
AmplifyValue = AmplifyValue,
MagicSealP = MagicSealP,
CardId = CardId,
}
local Json = Json.Encode(SendT);
InfoTable.ItemData = Json;
//插入数据库
local Sql = format("INSERT INTO `zyk`.`exchange` (`type`, `itemid`, `itemcount`, `itemdata`, `price`, `uid` ,`cid`,`name`) VALUES (%d, %d, %d, \'%s\', %d, %d, %d, \'%s\');", InfoTable.ItemType, InfoTable.ItemId, InfoTable.ItemCount, InfoTable.ItemData, InfoTable.Price, InfoTable.Uid, InfoTable.Cid, InfoTable.Name);
local Ret = SelectSql(Sql, []);
//删除道具
ItemObj.Delete();
//发送刷新背包消息
SUser.SendUpdateItemList(1, 1, slot);
SUser.SendItemSpace(0);
}
}.bindenv(this), 1)
}
function SendItemExMail(UID, CID, ItemList, title, content) {
local SUser = World.GetUserByUid(UID);
local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC";
local column_type_list = ["int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
local sl = 1;
if (result.len() > 0) {
sl = result[0][0] + 1;
}
local time = date();
local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"];
foreach(value in ItemList) {
//时间 发送者名字 接收者id 装备ID 品级 耐久度 强化等级 红字类型 红字属性值 魔法封印属性 letterid
local sql1 = format("insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,item_id,add_info,endurance,upgrade,amplify_option,amplify_value,random_option,letter_id,extend_info) values ('%s','%s',%d,%d,%d,%d,%d,%d,%d,%s,%d,%d)", timeStr, title, CID, value.ItemId, value.Grade, value.Durability, value.EnhancementLevel, value.AmplifyType, value.AmplifyValue, value.MagicSealP, sl, value.CardId)
SqlObj.Select(sql1, []);
}
local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')";
SqlObj.Select(sql2, []);
MysqlPool.GetInstance().PutConnect(SqlObj);
// if (SUser) {
// local Pack = Packet();
// Pack.Put_Header(0, 9);
// local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object);
// Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox);
// local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox);
// Pack.Put_Short(Not_Count);
// Pack.Finalize(true);
// SUser.Send(Pack);
// Pack.Delete();
// }
}
//执行数据库命令
function SelectSql(Sql, Type) {
local Ret = MysqlObject.Select(Sql, Type);
return Ret;
}
}
ProjectInitFuncMap.P_Exchange <- Exchange();

View File

@@ -0,0 +1,604 @@
/*
文件名:FatalismStone.nut
路径:Dps_A/ProjectClass/FatalismStone/FatalismStone.nut
创建日期:2025-06-22 12:54
文件用途:
*/
class FatalismStone_Stone {
//编号
Id = null;
//唯一ID
Uuid = null;
//类型
StoneType = null;
//洗练度
CultivationDegree = null;
constructor() {
}
//反序列化构造
function Deserialize(StoneId, StoneUuid) {
this.Id = StoneId;
this.Uuid = StoneUuid;
this.StoneType = ProjectInitFuncMap.P_FatalismStone.GetStoneData(this.Id)["stone type"];
}
function Blob2Hex(buf) {
local str = "";
for (local i = 0; i< buf.len(); i++) {
str += format("%02X", buf[i]);
}
return str;
}
function Serialize() {
local B = blob(0);
B.writen(Id, 'i'); //写入ID
B.writen(Uuid, 'i'); //写入Uuid
return Blob2Hex(B);
}
}
//魂石背包类
class FatalismStone_BackPack {
//背包总格子数
GridCount = 77;
//穿戴总格子数
WearCount = 6;
StoneArr = null;
constructor() {
StoneArr = [];
}
//通过数据构造背包 反序列化
function Deserialize(N_Data) {
local BackpackData = N_Data[0][0];
local WearData = N_Data[0][1];
//转换背包数据
local BackPackArr = [];
for (local i = 0; i<(GridCount * 3); i++) {
local StoneId = BackpackData.add(i * 8).readInt();
local StoneUuid = BackpackData.add(i * 8 + 4).readInt();
if (StoneId != 0 && StoneUuid != 0) {
local StoneObj = FatalismStone_Stone();
StoneObj.Deserialize(StoneId, StoneUuid)
BackPackArr.push(StoneObj);
} else {
BackPackArr.push(null);
}
}
//转化穿戴数据
local WearArr = [];
for (local i = 0; i< WearCount; i++) {
local StoneId = WearData.add(i * 8).readInt();
local StoneUuid = WearData.add(i * 8 + 4).readInt();
if (StoneId != 0 && StoneUuid != 0) {
local StoneObj = FatalismStone_Stone();
StoneObj.Deserialize(StoneId, StoneUuid)
WearArr.push(StoneObj);
} else {
WearArr.push(null);
}
}
//两段数据放入总数据
StoneArr.extend(BackPackArr);
StoneArr.extend(WearArr);
}
//序列化
function Serialize() {
//背包数据
local BackpackArr = StoneArr.slice(0, GridCount * 3);
local BackpackHex = "0x";
foreach(Pos, StoneObject in BackpackArr) {
if (StoneObject) BackpackHex += StoneObject.Serialize();
else BackpackHex += "0000000000000000";
}
//穿戴数据
local WearArr = StoneArr.slice(GridCount * 3, GridCount * 3 + WearCount);
local WearHex = "0x";
foreach(Pos, StoneObject in WearArr) {
if (StoneObject) WearHex += StoneObject.Serialize();
else WearHex += "0000000000000000";
}
//返回
return {
inventory = BackpackHex,
wear = WearHex
};
}
//获取魂石的列表 3为身上穿戴的
function GetList(Page) {
local SliceLength = GridCount;
if (Page == 3) SliceLength = WearCount;
return StoneArr.slice(Page * 77, Page * 77 + SliceLength);
}
}
class FatalismStone {
//总格子数
GridCount = 77;
//总穿戴数
WearCount = 6;
//属性数据位数
AttrCount = 2;
//魂石Lst
FatalismStoneLst = null;
//魂石配置
FatalismStoneConfig = null;
constructor() {
Script();
local PoolObj = MysqlPool.GetInstance();
PoolObj.SetBaseConfiguration("127.0.0.1", 3306, "game", "uu5!^%jg");
//连接池大小
PoolObj.PoolSize = 10;
//初始化
PoolObj.Init();
//读取pvf的魂石相关数据
InitFatalismStoneData();
//创建新架构表
SelectSql("CREATE TABLE `zyk`.`f_user_info` ( `cid` int(250) NOT NULL, `inventory` varbinary(1848) NULL, `wear` varbinary(48) NULL, PRIMARY KEY (`cid`));", []);
SelectSql("CREATE TABLE `zyk`.`f_stone_map` ( `uuid` int(250) NOT NULL AUTO_INCREMENT, `cultivation` float NULL DEFAULT NULL, PRIMARY KEY (`uuid`) USING BTREE);", []);
// UpdateNewMysqlData();
//注册客户端收包
RegisterClient();
//注册调试命令
RegisterDebugCmd();
}
//查询单个魂石的属性
function GetStoneAttr(Uuid) {
local Ret = SelectSql("select cultivation from zyk.f_stone_map where uuid = " + Uuid, ["float"]);
if (Ret.len() == 0) {
return null;
} else {
return Ret[0];
}
}
//查询多个魂石的属性
function GetStoneAttrArr(UuidArr) {
local SqlStr = "select uuid,cultivation from zyk.f_stone_map where uuid in (";
for (local i = 0; i< UuidArr.len(); i++) {
SqlStr += UuidArr[i];
if (i != UuidArr.len() - 1) {
SqlStr += ",";
}
}
SqlStr += ")";
local Ret = SelectSql(SqlStr, ["int", "float"]);
if (Ret.len() == 0) {
return null;
} else {
return Ret;
}
}
function RegisterClient() {
//查询魂石背包数据
ClientSocketPackFuncMap.rawset(21000001, function(SUser, Jso) {
local Ret = GetInvenData(SUser);
//没查到东西说明没有背包 第一次创建背包
if (Ret.len() == 0) {
local SqlStr = format("INSERT INTO zyk.f_user_info (cid, inventory, wear) VALUES (%d,REPEAT(0x00, 1848),REPEAT(0x00, 48))", SUser.GetCID());
SelectSql(SqlStr, []);
}
//有数据的读取
else {
local BackPackData = Ret[0][0];
local WearData = Ret[0][1];
local PackSize = 4 + 4 + BackPackData.Size + 4 + WearData.Size;
local Pack = Packet();
Pack.Put_Header(1, 131);
Pack.Put_Byte(1);
Pack.Put_Int(PackSize);
Pack.Put_Int(21000002);
Pack.Put_Int(BackPackData.Size);
Pack.Put_BinaryEx(BackPackData.C_Object, BackPackData.Size);
Pack.Put_Int(WearData.Size);
Pack.Put_BinaryEx(WearData.C_Object, WearData.Size);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
//查询身上穿戴的魂石属性
local BackPack = FatalismStone_BackPack();
BackPack.Deserialize(Ret);
local WearArr = BackPack.GetList(3);
local UuidArr = [];
for (local i = 0; i< WearArr.len(); i++) {
if (WearArr[i] != null) {
UuidArr.push(WearArr[i].Uuid);
}
}
if (UuidArr.len() > 0) {
local Attr = GetStoneAttrArr(UuidArr);
if (Attr) {
local PackSize = 4 + 4 + (Attr.len() * 4 * Attr[0].len());
local Pack = Packet();
Pack.Put_Header(1, 131);
Pack.Put_Byte(1);
Pack.Put_Int(PackSize);
Pack.Put_Int(21000014);
Pack.Put_Int(Attr.len());
for (local i = 0; i< Attr.len(); i++) {
for (local z = 0; z< Attr[i].len(); z++) {
Pack.Put_Int(Attr[i][z]);
}
}
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
}
}
}.bindenv(this));
//查询魂石唯一属性
ClientSocketPackFuncMap.rawset(21000011, function(SUser, Jso) {
local Uuid = Jso.uuid;
SendFatalismStoneData(SUser, Uuid);
}.bindenv(this));
//交换魂石位置
ClientSocketPackFuncMap.rawset(21000003, function(SUser, Jso) {
local OldType = Jso.oldtype;
local OldIndex = Jso.oldpos;
local NewType = Jso.newtype;
local NewIndex = Jso.newpos;
local BackPack = GetInven(SUser);
if (!BackPack) return;
//直接去交换位置
local Buffer = BackPack.StoneArr[OldType * 77 + OldIndex];
BackPack.StoneArr[OldType * 77 + OldIndex] = BackPack.StoneArr[NewType * 77 + NewIndex];
BackPack.StoneArr[NewType * 77 + NewIndex] = Buffer;
SaveInven(BackPack, SUser);
}.bindenv(this));
//魂石洗练
ClientSocketPackFuncMap.rawset(21000005, function(SUser, Jso) {
local Uuid = Jso.uuid;
local rarity = Jso.rarity;
//获取背包对象
local InvenObj = SUser.GetInven();
local Flag = InvenObj.DeleteItemCount(FatalismStoneConfig["wash_item"], FatalismStoneConfig["wash_cost"][rarity]);
//扣除不成功
if (!Flag) {
SUser.SendNotiPacketMessage("精炼魂石所需的材料不足!", 8);
return;
}
local Rand = MathClass.Rand(1, 105);
if (Rand > 100) Rand = 100;
//将新的精炼值写入数据库
local Sql = "update zyk.f_stone_map set cultivation = " + Rand + " where uuid = " + Uuid;
SelectSql(Sql, []);
SendFatalismStoneData(SUser, Uuid)
}.bindenv(this));
Cb_User_Insert_Item_Leave_Func["宿命魂石"] <- function(args) {
local SUser = User(NativePointer(args[0]).readPointer());
local InvenObj = SUser.GetInven();
local idx = args.pop();
if (idx > 0) {
local inven_item = InvenObj.GetSlot(1, idx);
local item_id = inven_item.GetIndex();
if (item_id >= 200625000 && item_id< 200626000) {
local Ret = AddFatalismStone(SUser, item_id - 200625000);
//删除原道具
Timer.SetTimeOut(function() {
inven_item.Delete();
SUser.SendUpdateItemList(1, 0, idx);
}, 1000);
//如果满了就发邮件
if (!Ret) {
local T = {};
T.rawset(item_id, 1);
SUser.SendMail(T, {
Title = "系统",
Text = "由于你的魂石包裹已满, 请留出足够的空间来接收道具."
});
}
SUser.SendItemSpace(0);
}
}
}.bindenv(this);
}
function RegisterDebugCmd() {
Gm_InputFunc_Handle["给魂石"] <- function(SUser, CmdString) {
local count = -1;
local pos = 0;
local handler = [];
do {
local start = pos;
pos = CmdString.find(" ", pos + 1);
if (pos != null) {
handler.append(CmdString.slice(start + 1, pos));
} else
handler.append(CmdString.slice(start + 1));
count = count + 1
} while (pos != null)
//得到空格数量
if (count == 1) {
AddFatalismStone(SUser, handler[1].tointeger());
}
}.bindenv(this);
}
//获取玩家背包数据
function GetInvenData(SUser) {
local Ret = SelectSql("select inventory,wear from zyk.f_user_info where cid = " + SUser.GetCID(), ["binary", "binary"]);
if (!Ret || Ret.len() == 0) return null;
else return Ret;
}
//获取玩家背包
function GetInven(SUser) {
local Ret = GetInvenData(SUser);
if (Ret) {
local BackPack = FatalismStone_BackPack();
BackPack.Deserialize(Ret);
return BackPack;
} else return null;
}
//固化背包数据到数据库
function SaveInven(Inven, SUser) {
//获取背包整体信息并储存
local Hex = Inven.Serialize();
//更新数据库
local Sql = "update zyk.f_user_info set inventory = " + Hex.inventory + ",wear = " + Hex.wear + " where cid = " + SUser.GetCID();
SelectSql(Sql, []);
}
//发送uuid的魂石数据给客户端
function SendFatalismStoneData(SUser, Uuid) {
local Attr = GetStoneAttr(Uuid);
if (!Attr) {
SUser.SendNotiPacketMessage("魂石属性异常,请联系管理员!", 8);
} else {
local Cultivation = Attr[0];
local PackSize = 4 + 4 + 4;
local Pack = Packet();
Pack.Put_Header(1, 131);
Pack.Put_Byte(1);
Pack.Put_Int(PackSize);
Pack.Put_Int(21000012);
Pack.Put_Int(Uuid);
Pack.Put_Int(Cultivation);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
}
//给指定玩家新增魂石
function AddFatalismStone(SUser, FatalismStoneID) {
local CID = SUser.GetCID();
}
function InitFatalismStoneData() {
// Script();
FatalismStoneLst = {};
ScriptData.GetFileData("fatalismstone/fatalismstone.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Id = Data.Get();
local Path = Data.Get();
FatalismStoneLst.rawset(Id, Path);
}
}.bindenv(this));
FatalismStoneConfig = ScriptData.GetFileData("fatalismstone/fatalismstone.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[wash item]") {
DataTable.wash_item <- Data.Get();
} else if (Str == "[wash cost]") {
DataTable.wash_cost <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
}
}
}.bindenv(this));
}
function GetStoneData(Index) {
if (FatalismStoneLst.rawin(Index)) {
//还是路径就读取数据
if (typeof FatalismStoneLst[Index] == "string") {
FatalismStoneLst[Index] = ScriptData.GetFileData("fatalismstone/" + FatalismStoneLst[Index], function(DataTable, Data) {
DataTable.Attribute <- {};
while (!Data.Eof()) {
local Key = Data.Get();
if (Key == "[rarity]" || Key == "[stone type]" || Key == "[move wav]" || Key == "[front effect]" || Key == "[back effect]") {
DataTable[Key.slice(1, -1)] <- Data.Get();
} else if (Key == "[icon]") {
DataTable.icon <- {
img = Data.Get(),
index = Data.Get()
}
}
}
});
}
return FatalismStoneLst[Index];
} else error("没有ID为: " + Index + " 的魂石数据!");
}
//执行数据库命令
function SelectSql(Sql, Type) {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local Ret = SqlObj.Select(Sql, Type);
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
return Ret;
}
//UpdateNewMysqlData
function UpdateNewMysqlData() {
local Ret = SelectSql("select * from zyk.fatalismstone", ["int", "binary", "binary"]);
foreach(Index, Info in Ret) {
local cid = Info[0];
local inventory = Info[1];
local wear = Info[2];
//处理背包里的魂石
local NewBlob = blob();
for (local i = 0; i< 462; i += 2) {
local item_id = inventory.add(i * 4).readInt();
local cultivation = inventory.add(i * 4 + 4).readInt();
if (item_id > 0) {
//在新表中建立这件装备的uuid
local Sql = "insert into zyk.f_stone_map (cultivation) values (" + cultivation + ")";
SelectSql(Sql, []);
//查询最后新增条目的uuid
Sql = "select LAST_INSERT_ID() as uuid";
local uuid = SelectSql(Sql, ["int"])[0][0];
NewBlob.writen(item_id, 'i');
NewBlob.writen(uuid, 'i');
} else {
NewBlob.writen(0, 'i');
NewBlob.writen(0, 'i');
}
}
local inventoryBinary = "0x" + Blob2Hex(NewBlob);
//处理身上穿戴的魂石
NewBlob.resize(0);
for (local i = 0; i< 12; i += 2) {
local item_id = wear.add(i * 4).readInt();
print(item_id);
local cultivation = wear.add(i * 4 + 4).readInt();
if (item_id > 0) {
//在新表中建立这件装备的uuid
local Sql = "insert into zyk.f_stone_map (cultivation) values (" + cultivation + ")";
SelectSql(Sql, []);
//查询最后新增条目的uuid
Sql = "select LAST_INSERT_ID() as uuid";
local uuid = SelectSql(Sql, ["int"])[0][0];
NewBlob.writen(item_id, 'i');
NewBlob.writen(uuid, 'i');
} else {
NewBlob.writen(0, 'i');
NewBlob.writen(0, 'i');
}
}
local wearBinary = "0x" + Blob2Hex(NewBlob);
local Sql = "insert into zyk.f_user_info (cid,inventory, wear) values (" + cid + "," + inventoryBinary + "," + wearBinary + ")";
SelectSql(Sql, []);
}
}
function Blob2Hex(buf) {
local str = "";
for (local i = 0; i< buf.len(); i++) {
str += format("%02X", buf[i]);
}
return str;
}
}
ProjectInitFuncMap.P_FatalismStone <- FatalismStone();

View File

@@ -9,7 +9,7 @@ function _Hook_Enter_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf != null) Ret = Buf;
if (Buf) Ret = Buf;
}
return Ret;
}
@@ -18,7 +18,7 @@ function _Hook_Leave_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf != null) Ret = Buf;
if (Buf) Ret = Buf;
}
return Ret;
}
@@ -81,7 +81,7 @@ _Hook_Register_Currency_Func_("0x866A3FE", ["pointer", "int", "int", "int", "int
//货币收益
Cb_Gain_Money_Enter_Func <- {};
Cb_Gain_Money_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x84FF29C", ["int", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func);
_Hook_Register_Currency_Func_("0x84FF29C", ["pointer", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func);
//GetItem检查错误
Cb_GetItem_Check_Error_Enter_Func <- {};
@@ -457,21 +457,29 @@ Cb_User_TOD_UserState_getLastClearTime_Enter_Func <- {};
Cb_User_TOD_UserState_getLastClearTime_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x864387E", ["pointer"], Cb_User_TOD_UserState_getLastClearTime_Enter_Func, Cb_User_TOD_UserState_getLastClearTime_Leave_Func);
//时装填充 提供者: ZZ
Cb_AradUseAvatarRecharge_Enter_Func <- {};
Cb_AradUseAvatarRecharge_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x0819FA56", ["pointer", "pointer", "pointer"], Cb_AradUseAvatarRecharge_Enter_Func, Cb_AradUseAvatarRecharge_Leave_Func);
//物品随机品级 提供者: 凌众
Cb_CItem_IsRoutingItem_Enter_Func <- {};
Cb_CItem_IsRoutingItem_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08150f18", ["pointer", "int"], Cb_CItem_IsRoutingItem_Enter_Func, Cb_CItem_IsRoutingItem_Leave_Func);
//调整箱使用
//调整箱使用 提供者: 凌众
Cb_ModItemattr_Enter_Func <- {};
Cb_ModItemattr_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x8200B08", ["pointer", "pointer", "pointer", "int"], Cb_ModItemattr_Enter_Func, Cb_ModItemattr_Leave_Func);
//个人金库整理
Cb_CCargo_sort_Enter_Func <- {};
Cb_CCargo_sort_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x850BD0C", ["pointer", "pointer"], Cb_CCargo_sort_Enter_Func, Cb_CCargo_sort_Leave_Func);
// 玩家断开链接时 提供者:南瓜
Cb_CUser_LogoutToPCRoom_Enter_Func <- {};
Cb_CUser_LogoutToPCRoom_Leave_Func <- {};
@@ -485,9 +493,101 @@ _Hook_Register_Currency_Func_("0x081BE46A", ["pointer", "pointer", "pointer", "i
// 服务器被Kill时(不含炸频道等)
Cb_Server_ClossByKill_Enter_Func <- {};
Cb_Server_ClossByKill_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x082FD90E", ["pointer", "int"], Cb_Server_ClossByKill_Enter_Func, Cb_Server_ClossByKill_Leave_Func);
_Hook_Register_Currency_Func_("0x082FE1FE", ["pointer", "int"], Cb_Server_ClossByKill_Enter_Func, Cb_Server_ClossByKill_Leave_Func);
// 收到玩家聊天信息
Cb_SendMess_Enter_Func <- {};
Cb_SendMess_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x081F3540", ["pointer", "pointer","pointer","int"], Cb_SendMess_Enter_Func, Cb_SendMess_Leave_Func);
_Hook_Register_Currency_Func_("0x081F3540", ["pointer", "pointer", "pointer", "int"], Cb_SendMess_Enter_Func, Cb_SendMess_Leave_Func);
// 副本数据 不公开
Cb_CParty_ClearMapHitCount_Enter_Func <- {};
Cb_CParty_ClearMapHitCount_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x085BF850", ["pointer", "pointer"], Cb_CParty_ClearMapHitCount_Enter_Func, Cb_CParty_ClearMapHitCount_Leave_Func);
// 附魔
Cb_ExpertOnEnchantByBead_Enter_Func <- {};
Cb_ExpertOnEnchantByBead_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x0849ED1A", ["pointer", "pointer", "int", "int", "int", "int", "int"], Cb_ExpertOnEnchantByBead_Enter_Func, Cb_ExpertOnEnchantByBead_Leave_Func);
// 数据库连接信息
Cb_MySQL_Open_Enter_Func <- {};
Cb_MySQL_Open_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x083F4024", ["pointer", "pointer", "int", "pointer", "pointer", "pointer", "int"], Cb_MySQL_Open_Enter_Func, Cb_MySQL_Open_Leave_Func);
//地下城开始
Cb_CParty_DungeonStart_Enter_Func <- {};
Cb_CParty_DungeonStart_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x085A0954", ["pointer", "pointer", "char", "int", "int"], Cb_CParty_DungeonStart_Enter_Func, Cb_CParty_DungeonStart_Leave_Func);
//击杀怪物
Cb_CParty_OnKillMonster_Enter_Func <- {};
Cb_CParty_OnKillMonster_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x085B5A4C", ["pointer", "pointer", "int", "int", "int", "int"], Cb_CParty_OnKillMonster_Enter_Func, Cb_CParty_OnKillMonster_Leave_Func);
//设置通关奖励
Cb_CParty_SetPlayResult_Enter_Func <- {};
Cb_CParty_SetPlayResult_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x085B2412", ["pointer", "pointer", "int"], Cb_CParty_SetPlayResult_Enter_Func, Cb_CParty_SetPlayResult_Leave_Func);
// 进入副本接口时
Cb_StartGame_check_error_Enter_Func <- {};
Cb_StartGame_check_error_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x081C9F6C", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_StartGame_check_error_Enter_Func, Cb_StartGame_check_error_Leave_Func);
// 强化装备时
Cb_WongWork_CItemUpgrade_Enter_Func <- {};
Cb_WongWork_CItemUpgrade_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x0854755A", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_WongWork_CItemUpgrade_Enter_Func, Cb_WongWork_CItemUpgrade_Leave_Func);
// 锻造装备时
Cb_WongWork_CItemUpgrade_Separate_Enter_Func <- {};
Cb_WongWork_CItemUpgrade_Separate_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x0811E468", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_WongWork_CItemUpgrade_Separate_Enter_Func, Cb_WongWork_CItemUpgrade_Separate_Leave_Func);
// 随机值
Cb_CMTRand_randInt_Enter_Func <- {};
Cb_CMTRand_randInt_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x080CBABE", ["pointer", "int", "int"], Cb_CMTRand_randInt_Enter_Func, Cb_CMTRand_randInt_Leave_Func);
// 发送绝望之塔APC
Cb_TowerOfDespairMgr_SendAPCInfo_Enter_Func <- {};
Cb_TowerOfDespairMgr_SendAPCInfo_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08644338", ["pointer", "pointer", "pointer", "void"], Cb_TowerOfDespairMgr_SendAPCInfo_Enter_Func, Cb_TowerOfDespairMgr_SendAPCInfo_Leave_Func);
// 发送多物品邮件请求
Cb_ReqDBSendNewSystemMultiMail_Enter_Func <- {};
Cb_ReqDBSendNewSystemMultiMail_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08556B68", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int", "int"], Cb_ReqDBSendNewSystemMultiMail_Enter_Func, Cb_ReqDBSendNewSystemMultiMail_Leave_Func);
// 深渊爆率
Cb_WongWork_CMonsterDrop_Hell_Enter_Func <- {};
Cb_WongWork_CMonsterDrop_Hell_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08535726", ["pointer", "pointer", "pointer", "pointer"], Cb_WongWork_CMonsterDrop_Hell_Enter_Func, Cb_WongWork_CMonsterDrop_Hell_Leave_Func);
//检查装备是否上锁
Cb_CheckItemLock_Enter_Func <- {};
Cb_CheckItemLock_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08646942", ["pointer", "int", "int", "bool"], Cb_CheckItemLock_Enter_Func, Cb_CheckItemLock_Leave_Func);
//reform_ui_group_no
Cb_reform_ui_group_no_Enter_Func <- {};
Cb_reform_ui_group_no_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x083507E8", ["pointer", "pointer", "bool", "int", "int"], Cb_reform_ui_group_no_Enter_Func, Cb_reform_ui_group_no_Leave_Func);
//get_skillslot_group
Cb_get_skillslot_group_Enter_Func <- {};
Cb_get_skillslot_group_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x086049FC", ["pointer", "int", "int"], Cb_get_skillslot_group_Enter_Func, Cb_get_skillslot_group_Leave_Func);
//get_skillslot_no
Cb_get_skillslot_no_Enter_Func <- {};
Cb_get_skillslot_no_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08604A86", ["pointer", "int", "int", "int", "char", "int"], Cb_get_skillslot_no_Enter_Func, Cb_get_skillslot_no_Leave_Func);
//get_skillslot_no2
Cb_get_skillslot_no2_Enter_Func <- {};
Cb_get_skillslot_no2_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08607DBA", ["pointer", "pointer", "int", "int", "bool", "int"], Cb_get_skillslot_no2_Enter_Func, Cb_get_skillslot_no2_Leave_Func);

View File

@@ -0,0 +1,231 @@
/*
文件名:NpcTransaction.nut
路径:Dps_A/ProjectClass/NpcTransaction/NpcTransaction.nut
创建日期:2025-10-23 14:37
文件用途:
*/
return;
class NpcTransaction {
//装备价值
EquValue = null;
//品级装备组
EquGroup = null;
//金币易物浮动比例
GoldFloat = 0.5;
//最低交换品级
MinRarity = 0;
//交易消耗物品
TradeItem = null;
//装备易物浮动等级
EquFloatMin = 5;
EquFloatMax = 5;
//事件概率
EventRate = null;
//用户状态表
UserState = null;
constructor() {
//注册客户端收包
RegisterClient();
EquValue = {};
UserState = {};
EquGroup = [{}, {}, {}, {}, {}, {}, {}, {}];
//读取PVF
InitPvf();
}
function RegisterClient() {
ClientSocketPackFuncMap.rawset(21005001, function(SUser, Jso) {
local lastTime = GetTransactionInfo(SUser, Jso);
if (lastTime && Sq_GetTimestampString().slice(-9).tointeger() - lastTime.time< 3600000) {
local T = {
op = 21005002,
flag = 3
}
SUser.SendJso(T);
return;
}
local InvenObj = SUser.GetInven();
local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Jso.pos);
if (Equ) {
local EquId = Equ.GetIndex();
if (EquId) {
local equ = PvfItem.GetPvfItemById(EquId);
local Rarity = equ.GetRarity();
local Level = equ.GetUsableLevel();
//判断是否解封装
local CanTrade = GetTrade(InvenObj, Jso.pos);
if ((Rarity == 2 || Rarity == 3) && CanTrade == 1) {
local T = {
op = 21005006,
}
SUser.SendJso(T);
SUser.SendNotiPacketMessage("该装备属于封装装备,并已解封,无法进行交易!", 0);
} else {
//判断是进行什么交易逻辑
local Random = MathClass.Rand(600, 1000);
//嘲讽
if (Random <= EventRate[0]) {
local T = {
op = 21005002,
flag = 0
}
SUser.SendJso(T);
local Cid = SUser.GetCID();
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
UserState[Cid].rawset(Jso.npc, {
time = Sq_GetTimestampString().slice(-9).tointeger()
});
}
//金币易物
else if (Random <= EventRate[1]) {
local thGoldFloat = MathClass.Rand(-EquValue[EquId].tofloat() * GoldFloat, EquValue[EquId].tofloat() * GoldFloat);
local Glod = EquValue[EquId].tofloat() + thGoldFloat;
local T = {
op = 21005002,
flag = 1,
glod = Glod
}
SUser.SendJso(T);
local Cid = SUser.GetCID();
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
UserState[Cid].rawset(Jso.npc, {
glod = Glod,
pos = Jso.pos,
oldid = EquId
time = Sq_GetTimestampString().slice(-9).tointeger()
});
}
//装备易物
else if (Random <= EventRate[2]) {
local setarr = [];
local findtable = EquGroup[Rarity];
foreach(index, level in findtable) {
if (level >= Level - EquFloatMin && level <= Level + EquFloatMax) {
setarr.append(index);
}
}
local SendId = setarr[MathClass.Rand(0, setarr.len() - 1)];
local T = {
op = 21005002,
flag = 2,
equ = SendId
}
SUser.SendJso(T);
local Cid = SUser.GetCID();
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
UserState[Cid].rawset(Jso.npc, {
equ = SendId,
pos = Jso.pos,
oldid = EquId
time = Sq_GetTimestampString().slice(-9).tointeger()
});
}
}
}
}
}.bindenv(this));
ClientSocketPackFuncMap.rawset(21005003, function(SUser, Jso) {
//获取交易结构体
local Info = GetTransactionInfo(SUser, Jso);
if (!Info) return;
//获取旧装备ID
local oldid = Info.oldid;
//获取旧装备格子
local pos = Info.pos;
//检测扣除
local InvenObj = SUser.GetInven();
local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Info.pos);
if (Equ.GetIndex() != oldid) {
SUser.SendNotiBox("交易时请不要移动背包中装备的位置!", 1);
return;
}
Equ.Delete();
if (Info.rawin("equ")) {
SUser.GiveItem(Info.equ, 1);
SUser.SendNotiBox("与NPC交易获得装备 [" + PvfItem.GetNameById(Info.equ) + "]", 1);
} else if (Info.rawin("glod")) {
SUser.RechargeMoney(Info.glod);
SUser.SendNotiBox("与NPC交易获得金币 " + Info.glod, 1);
}
SUser.SendItemSpace(0);
}.bindenv(this));
}
function GetTransactionInfo(SUser, Jso) {
try {
local Info = UserState[SUser.GetCID()][Jso.npc];
return Info;
} catch (exception) {}
return null;
}
function InitPvf() {
Script();
ScriptData.GetFileData("etc/rindro/npctransaction/npctransaction.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[value]") {
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/value]") {
break;
}
local Value = Data.Get();
EquValue.rawset(Fbuf, Value);
//读取装备品级
local equ = PvfItem.GetPvfItemById(Fbuf);
local Rarity = equ.GetRarity();
local Level = equ.GetUsableLevel();
EquGroup[Rarity].rawset(Fbuf, Level);
}
} else if (Fragment == "[random]") {
GoldFloat = Data.Get().tofloat() / 100.0;
} else if (Fragment == "[allow rarity]") {
MinRarity = Data.Get();
} else if (Fragment == "[exchange cost item]") {
TradeItem = {
item = Data.Get(),
count = Data.Get()
}
} else if (Fragment == "[equipment random level lower]") {
EquFloatMin = Data.Get();
} else if (Fragment == "[equipment random level upper]") {
EquFloatMax = Data.Get();
} else if (Fragment == "[event rate]") {
local o1 = Data.Get();
local o2 = Data.Get();
local o3 = Data.Get();
EventRate = [o1, o1 + o2, o1 + o2 + o3];
}
}
}.bindenv(this));
}
function GetTrade(InvenObj, pos) {
local ptr = Memory.alloc(10240);
Sq_CallFunc(S_Ptr("0x084FB918"), "int", ["pointer", "pointer", "int", "int"], ptr.C_Object, InvenObj.C_Object, 1, pos);
return ptr.readS8();
}
}
ProjectInitFuncMap.P_NpcTransaction <- NpcTransaction();

View File

@@ -0,0 +1,103 @@
/*
文件名:TH_CombatRank.nut
路径:Dps_A/ProjectClass/TH_CombatRank/TH_CombatRank.nut
创建日期:2025-07-02 23:22
文件用途:
*/
class TH_CombatRank {
MysqlObject = null;
constructor() {
MysqlObject = Mysql(Str_Ptr("127.0.0.1"), 3306, Str_Ptr("taiwan_cain"), Str_Ptr("game"), Str_Ptr("uu5!^%jg"));
MysqlObject.Exec_Sql(format("SET NAMES %s", "latin1"));
//注册客户端收包
RegisterClient();
//注册调试命令
// RegisterDebugCmd();
//建表命令
MysqlObject.Select("CREATE TABLE `zyk`.`th_combatrank` ( `cid` int NOT NULL, `equip` varbinary(512) NULL COMMENT '装备数组', `basecombat` int NULL COMMENT '基础战力', `fstonecombat` int NULL COMMENT '魂石战力', PRIMARY KEY (`cid`));", []);
}
function RegisterClient() {
}
function RegisterDebugCmd() {
}
}
ProjectInitFuncMap.P_TH_CombatRank <- TH_CombatRank();

View File

@@ -24,7 +24,10 @@ function InitPluginInfo() {
GameManager.Fix14Skill();
Sq_CreatSocketConnect("192.168.200.20", "65109");
// Sq_CreatSocketConnect("192.168.200.20", "65109");
// Sq_CreatSocketConnect("49.234.27.222", "65109");
Sq_CreatSocketConnect("127.0.0.1", "65109");
//初始化结婚
// ProjectInitFuncMap.P_Marry <- Marry();
@@ -41,6 +44,7 @@ function InitPluginInfo() {
GameManager.OpenCreateJob_CreatorMage();
GameManager.FixPracticemode();
GameManager.SetGameMaxLevel(85);
// function IndependenceDropLogic(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel,DgnDiff, HellDiff)
@@ -67,8 +71,8 @@ function PrintTag() {
}
function main() {
function main() {
InitPluginInfo();
PrintTag();
@@ -82,7 +86,7 @@ function main() {
GameManager.FixDespairGold();
GameManager.FixGlodTradeDaily(80000000);
// local PvfObject = Script();
local PvfObject = Script();
// local Data = ScriptData.GetEquipment(305014);
// printT(Data);
@@ -91,7 +95,7 @@ function main() {
_Official_Project_();
}
// if (getroottable().rawin("DP_S_VERSION") && DP_S_VERSION >= 25.329) {
// function _Rindro_OldLogic_Enter(CUser, PacketId, PacketSrc) {
@@ -210,10 +214,6 @@ function main() {
// }
}
/*
function onil() {
print(11);
@@ -238,4 +238,6 @@ Timer.SetCronTask(onil, "0/10 * * * * *");
// getroottable().CombatRankServerProject <- CombatRank();
// getroottable().ServerControlProject <- ServerControl();
// getroottable().AntonServerProject <- Anton();
// getroottable().FiendwarServerProject <- Fiendwar();
// getroottable().FiendwarServerProject <- Fiendwar();