1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
| //获取角色名字 var CUserCharacInfo_getCurCharacName = new NativeFunction(ptr(0x8101028), 'pointer', ['pointer'], {"abi":"sysv"}); //给角色发消息 var CUser_SendNotiPacketMessage = new NativeFunction(ptr(0x86886CE), 'int', ['pointer', 'pointer', 'int'], {"abi":"sysv"}); //获取角色上次退出游戏时间 var CUserCharacInfo_getCurCharacLastPlayTick = new NativeFunction(ptr(0x82A66AA), 'int', ['pointer'], {"abi":"sysv"}); //获取角色等级 var CUserCharacInfo_get_charac_level = new NativeFunction(ptr(0x80DA2B8), 'int', ['pointer'], {"abi":"sysv"}); //获取角色当前等级升级所需经验 var CUserCharacInfo_get_level_up_exp = new NativeFunction(ptr(0x0864E3BA), 'int', ['pointer', 'int'], {"abi":"sysv"}); //角色增加经验 var CUser_gain_exp_sp = new NativeFunction(ptr(0x866A3FE), 'int', ['pointer', 'int', 'pointer', 'pointer', 'int', 'int', 'int'], {"abi":"sysv"}); //发送道具 var CUser_AddItem = new NativeFunction(ptr(0x867B6D4), 'int', ['pointer', 'int', 'int', 'int', 'pointer', 'int'], {"abi":"sysv"}); //获取角色背包 var CUserCharacInfo_getCurCharacInvenW = new NativeFunction(ptr(0x80DA28E), 'pointer', ['pointer'], {"abi":"sysv"});
//减少金币 var CInventory_use_money = new NativeFunction(ptr(0x84FF54C), 'int', ['pointer', 'int', 'int', 'int'], {"abi":"sysv"}); //增加金币 var CInventory_gain_money = new NativeFunction(ptr(0x84FF29C), 'int', ['pointer', 'int', 'int', 'int', 'int'], {"abi":"sysv"}); //通知客户端道具更新(客户端指针, 通知方式[仅客户端=1, 世界广播=0, 小队=2, war room=3], itemSpace[装备=0, 时装=1], 道具所在的背包槽) var CUser_SendUpdateItemList = new NativeFunction(ptr(0x867C65A), 'int', ['pointer', 'int', 'int', 'int'], {"abi":"sysv"});
//获取系统时间 var CSystemTime_getCurSec = new NativeFunction(ptr(0x80CBC9E), 'int', ['pointer'], {"abi":"sysv"}); var GlobalData_s_systemTime_ = ptr(0x941F714);
//获取系统UTC时间(秒) function api_CSystemTime_getCurSec() { return GlobalData_s_systemTime_.readInt(); }
//给角色发经验 function api_CUser_gain_exp_sp(user, exp) { var a2 = Memory.alloc(4); var a3 = Memory.alloc(4); CUser_gain_exp_sp(user, exp, a2, a3, 0, 0, 0); }
//给角色发道具 function api_CUser_AddItem(user, item_id, item_cnt) { var item_space = Memory.alloc(4); var slot = CUser_AddItem(user, item_id, item_cnt, 6, item_space, 0);
if(slot >= 0) { //通知客户端有游戏道具更新 CUser_SendUpdateItemList(user, 1, item_space.readInt(), slot); }
return; }
//获取角色名字 function api_CUserCharacInfo_getCurCharacName(user) { var p = CUserCharacInfo_getCurCharacName(user); if(p.isNull()) { return ''; }
return p.readUtf8String(-1); }
//给角色发消息 function api_CUser_SendNotiPacketMessage(user, msg, msg_type) { var p = Memory.allocUtf8String(msg); CUser_SendNotiPacketMessage(user, p, msg_type);
return; }
//发送离线奖励 function send_offline_reward(user) { //当前系统时间 var cur_time = api_CSystemTime_getCurSec();
//用户上次退出游戏时间 var user_last_play_time = CUserCharacInfo_getCurCharacLastPlayTick(user);
//新创建的角色首次登陆user_last_play_time为0 if(user_last_play_time > 0) { //离线时长(分钟) var diff_time = (cur_time - user_last_play_time) / 60;
//离线10min后开始计算 if(diff_time < 10) return;
//离线奖励最多发送3天 if(diff_time > 3*24*60) diff_time = 3*24*60;
//经验奖励: 每分钟当前等级经验的0.2% var REWARD_EXP_PER_MIN = 0.002; //金币奖励: 每分钟当前等级*100 var REWARD_GOLD_PER_MIN = 100;
//计算奖励 var cur_level = CUserCharacInfo_get_charac_level(user); var reward_exp = Math.floor(CUserCharacInfo_get_level_up_exp(user, cur_level) * REWARD_EXP_PER_MIN * diff_time); var reward_gold = Math.floor(cur_level * REWARD_GOLD_PER_MIN * diff_time);
//发经验 api_CUser_gain_exp_sp(user, reward_exp); //发金币 CInventory_gain_money(CUserCharacInfo_getCurCharacInvenW(user), reward_gold, 0, 0, 0); //通知客户端有游戏道具更新 CUser_SendUpdateItemList(user, 1, 0, 0);
//发消息通知客户端奖励已发送 api_CUser_SendNotiPacketMessage(user, '离线奖励已发送(经验奖励:' + reward_exp + ', 金币奖励:' + reward_gold + ')', 6); } }
//发送每日首次登陆奖励 function send_first_login_reward(user) { //奖励道具列表(道具id, 每级奖励数量) var REWARD_LIST = [[8, 0.1], [3037, 10]];
//获取玩家登录 var cur_level = CUserCharacInfo_get_charac_level(user); for(var i=0; i<REWARD_LIST.length; i++) { //道具id var reward_item_id = REWARD_LIST[i][0]; //道具数量 var reward_item_cnt = 1 + Math.floor((cur_level * REWARD_LIST[i][1]));
//发送道具到玩家背包 api_CUser_AddItem(user, reward_item_id, reward_item_cnt); } }
//角色登入登出处理 function hook_user_inout_game_world() { //选择角色处理函数 Hook GameWorld::reach_game_world Interceptor.attach(ptr(0x86C4E50), { //函数入口, 拿到函数参数args onEnter: function (args) { //保存函数参数 this.user = args[1];
//console.log('[GameWorld::reach_game_world] this.user=' + this.user); }, //原函数执行完毕, 这里可以得到并修改返回值retval onLeave: function (retval) { //给角色发消息问候 api_CUser_SendNotiPacketMessage(this.user, 'Hello ' + api_CUserCharacInfo_getCurCharacName(this.user), 2);
//离线奖励处理 send_offline_reward(this.user); } });
//角色退出时处理函数 Hook GameWorld::leave_game_world Interceptor.attach(ptr(0x86C5288), {
onEnter: function (args) {
var user = args[1];
//console.log('[GameWorld::leave_game_world] user=' + user); }, onLeave: function (retval) { } }); }
//角色每日首次登录奖励 function hook_user_first_login() { //角色每日重置处理函数 Hook CUser::AddDailyItem Interceptor.attach(ptr(0x8656CAA), {
onEnter: function (args) { //保存函数参数 var user = args[0];
//console.log('[CUser::AddDailyItem] user=' + user);
//发送每日首次登陆奖励 send_first_login_reward(user); }, onLeave: function (retval) { } }); }
rpc.exports = { init: function (stage, parameters) { console.log('[init]');
//角色登入登出处理 hook_user_inout_game_world();
//每日首次登录处理 hook_user_first_login(); }, dispose: function () {
console.log('[dispose]'); } };
|