Compare commits

...

1526 Commits

Author SHA1 Message Date
hahwu
6418c18739 1 2026-03-31 18:08:47 +08:00
hahwu
833e0908a4 优化日志 2026-03-31 15:00:48 +08:00
hahwu
124d4468c4 修复零件订单含自动发射器棋子的bug 2026-03-31 14:47:24 +08:00
hahwu
46ba8af111 rpc服务器 2026-03-31 14:33:35 +08:00
hahwu
033dd8088e 优化接口,避免造成节点意外下线 2026-03-31 11:58:12 +08:00
hahwu
656fbf78fa 优化日志 2026-03-31 11:45:09 +08:00
hahwu
a6993fa15f 新增rpc接口 2026-03-31 11:44:48 +08:00
hahwu
0f31ddd868 订单优化 2026-03-30 22:38:09 +08:00
hahwu
61e40b800e 锦标赛优化 2026-03-30 22:22:32 +08:00
hahwu
a8945997f7 时间线优化 2026-03-30 21:37:46 +08:00
hahwu
aa160e397a 破产时间线优化 2026-03-30 20:57:12 +08:00
hahwu
c07cfbcf40 破产时间线优化 2026-03-30 20:45:43 +08:00
hahwu
a7b2b39fd2 破产时间线优化 2026-03-30 20:39:43 +08:00
hahwu
4dbb8de2e9 gm命令更新 2026-03-30 20:20:06 +08:00
hahwu
d161d06602 增加破产时间线 2026-03-30 19:59:11 +08:00
hahwu
715762e80c 增加破产时间线 2026-03-30 19:54:39 +08:00
hahwu
97342e2c60 playroom bug修复 2026-03-30 19:22:15 +08:00
hahwu
d709e81adf 增加破产时间线 2026-03-30 18:57:13 +08:00
hahwu
f2da1279a7 破产增加时间线 2026-03-30 18:56:06 +08:00
hahwu
928b149d66 补充接口 2026-03-30 18:45:50 +08:00
hahwu
9d9f839a75 增加锦标赛协议返回 2026-03-30 18:16:18 +08:00
hahwu
981e1d0d57 猫猫小金库优化 2026-03-30 17:46:05 +08:00
hahwu
a89a745d8c 锦标赛进度奖励未领0点补发 2026-03-30 17:19:17 +08:00
hahwu
c9e97c91bf 锦标赛0点更新 2026-03-30 16:40:35 +08:00
hahwu
71834aaf7e 修改锦标赛结算时间 2026-03-30 16:21:50 +08:00
hahwu
22e29b7564 增加日志 2026-03-30 16:14:26 +08:00
hahwu
578213ee50 gm优化 2026-03-30 16:04:50 +08:00
hahwu
c0fe7338ef 接口注册 2026-03-30 13:09:35 +08:00
hahwu
57b2425569 超级订单优化 2026-03-30 12:17:24 +08:00
hahwu
b79cb08aca 修改超级订单数值 2026-03-30 11:46:03 +08:00
hahwu
ed7cd0d962 增加游戏版本号 2026-03-30 11:26:57 +08:00
hahwu
7a04463517 修改猫咪宝藏数值为四舍五入 2026-03-30 11:23:42 +08:00
hahwu
34099258a7 优化订单逻辑,直接生成订单的价值大于75 2026-03-30 11:07:58 +08:00
hahwu
19e4c292c7 增加棋子从背包放入荣誉室接口 2026-03-30 10:47:43 +08:00
hahwu
2cbc354cb3 优化打点日志 2026-03-27 18:54:45 +08:00
hahwu
47de734e17 退役清理订单不判断棋子是否解锁 2026-03-27 16:54:35 +08:00
hahwu
ae558370d5 猫咪戏法配置优化 2026-03-27 14:44:46 +08:00
hahwu
4c966b46c4 订单优化 2026-03-27 14:28:31 +08:00
hahwu
dab7c252b4 订单优化 2026-03-27 11:25:57 +08:00
hahwu
420d0d6d9e 订单数值调整 2026-03-27 10:44:21 +08:00
hahwu
2ba880d869 调试工具修改 2026-03-26 17:17:49 +08:00
hahwu
f62cd62952 虚拟体力打点 2026-03-26 15:10:50 +08:00
hahwu
820ae5bbfa 高级订单优化退役棋子的生成 2026-03-25 18:30:22 +08:00
hahwu
5a04b66a1c 优化备份对象的回收 2026-03-25 11:42:19 +08:00
hahwu
1b54ab5f43 高级订单增加12级解锁限制 2026-03-25 11:19:45 +08:00
hahwu
c090807cb3 订单bug修复 2026-03-24 20:03:54 +08:00
hahwu
9574295f8d 代码优化 2026-03-24 18:52:49 +08:00
hahwu
bc417b6301 高级订单符合条件并没有直接生效 2026-03-24 15:53:26 +08:00
hahwu
a4efd1bac1 playroom破产机制 2026-03-24 14:24:23 +08:00
hahwu
36d0eed502 系统参数抽离 2026-03-24 14:10:03 +08:00
hahwu
2aa7947dad 猫咪戏法取消显示时间 2026-03-24 14:09:27 +08:00
hahwu
6d46b9de85 猫猫小金库数值修改 2026-03-24 10:31:01 +08:00
hahwu
de33ba1221 猫咪戏法优化 2026-03-23 18:31:07 +08:00
hahwu
3468f8f220 猫猫小金库数值修改 2026-03-23 17:42:55 +08:00
hahwu
381a932b06 零件订单不使用自动发射器产物 2026-03-23 17:33:27 +08:00
hahwu
186eba9d55 sql语句优化 2026-03-23 17:24:24 +08:00
hahwu
bf5eafc0e0 活动优化 2026-03-23 15:06:52 +08:00
hahwu
f3ce3249cc 活动优化 2026-03-23 14:57:32 +08:00
hahwu
92417342bf 活动配置优化 2026-03-23 14:52:31 +08:00
hahwu
d190c2edf8 备份的序列化对象使用内存池 2026-03-23 11:39:36 +08:00
hahwu
e0b255a859 调整GC参数 2026-03-23 11:20:43 +08:00
hahwu
d38bb332d6 保存数据优化 2026-03-20 18:46:59 +08:00
hahwu
aa4656da0a 数据库优化 2026-03-20 18:41:30 +08:00
hahwu
bb32b5b124 优化邀请奖励打点方式 2026-03-20 18:06:17 +08:00
hahwu
ef03eb4581 增加GM指令 2026-03-20 17:02:56 +08:00
hahwu
72ccca583b 修复时间线bug 2026-03-20 16:36:15 +08:00
hahwu
3dda192a6f 优化日志打点 2026-03-20 15:46:15 +08:00
hahwu
171aab883a 增加日志打点 2026-03-20 11:48:48 +08:00
hahwu
0316e06823 1 2026-03-19 21:00:02 +08:00
hahwu
e3d7370ff6 打点优化 2026-03-19 19:56:33 +08:00
hahwu
b1c72db334 增加打点属性 2026-03-19 19:43:54 +08:00
hahwu
1b0b77978c 七日签到优化-增加等级限制 2026-03-19 19:10:54 +08:00
hahwu
d2d31d94ab 七日签到优化 2026-03-19 18:48:18 +08:00
hahwu
3c8f9a8eb6 优化宠物宝藏奖励 2026-03-19 18:32:41 +08:00
hahwu
519c8a7a68 宠物宝藏宠物币上限也需乘以翻倍系数 2026-03-19 18:14:11 +08:00
hahwu
852eb088fa 收藏品奖励优化 2026-03-19 15:25:13 +08:00
hahwu
57d2ab0f69 1 2026-03-19 15:06:12 +08:00
hahwu
fdbeb25af2 七日签到数值优化 2026-03-19 12:07:27 +08:00
hahwu
7b18ddbbdd 挖矿打点 2026-03-19 11:35:27 +08:00
hahwu
05c5c5dcaa 挖矿打点 2026-03-19 11:20:32 +08:00
hahwu
7270808f80 修改宠物币根据膨胀系数变化功能 2026-03-19 10:39:34 +08:00
hahwu
31e41bab0f playroom任务转盘奖励只抽取playroom 2026-03-19 09:54:53 +08:00
hahwu
ee9b19b98c 邀请好友,增加已成功判断 2026-03-19 09:41:40 +08:00
hahwu
658fd9e2b8 七日签到奖励优化 2026-03-18 18:47:33 +08:00
hahwu
c72819f253 优化GM命令 2026-03-18 17:03:28 +08:00
hahwu
32d66d96fd 1 2026-03-18 16:58:54 +08:00
hahwu
1b125ca222 每日任务周奖励优化 2026-03-18 16:32:12 +08:00
hahwu
1e7fac37b8 1 2026-03-18 16:26:05 +08:00
hahwu
2341d2d144 日志优化 2026-03-18 14:42:06 +08:00
hahwu
66f985f758 1 2026-03-18 14:41:18 +08:00
hahwu
95c4c4ee2e 买一赠一礼包优化 2026-03-18 12:24:19 +08:00
hahwu
7df724a8d6 买一赠一礼包优化 2026-03-18 12:18:19 +08:00
hahwu
01fc89f874 挖矿活动埋点 2026-03-18 10:59:28 +08:00
hahwu
7d5161a44d gm优化 2026-03-18 10:45:40 +08:00
hahwu
2a43279167 宠物宝藏奖励基础值需乘当前场景倍率 2026-03-18 10:34:01 +08:00
hahwu
469e52f984 增加gm 2026-03-17 18:59:53 +08:00
hahwu
76e18cac7b 活动配置优化 2026-03-17 18:57:01 +08:00
hahwu
9dec8fa266 每日任务数值优化 2026-03-17 15:25:25 +08:00
hahwu
b1b22e06d8 七日签到奖励优化 2026-03-17 14:57:20 +08:00
hahwu
630064912a 修复空指针报错 2026-03-17 10:58:51 +08:00
hahwu
1f1aa56d1b 日志优化 2026-03-17 10:29:10 +08:00
hahwu
fa8e1a93d7 活动配置优化 2026-03-17 10:13:51 +08:00
hahwu
47ffc52955 修复玩家线上playroom生理值错误 2026-03-16 19:37:20 +08:00
hahwu
cb5c5e91f7 bug修复 2026-03-16 17:21:13 +08:00
hahwu
a2997b3be5 修复优化bug 2026-03-16 16:58:17 +08:00
hahwu
4caadbf837 优化 2026-03-16 16:09:39 +08:00
hahwu
0020a4af8c 1 2026-03-13 18:40:42 +08:00
hahwu
4f9b7ed56d Revert "七日签到奖励bug修复"
This reverts commit 53c573d7e0.
2026-03-12 20:05:40 +08:00
hahwu
53c573d7e0 七日签到奖励bug修复 2026-03-12 19:58:07 +08:00
hahwu
ff3c6468cf 排行榜优化 2026-03-12 19:23:59 +08:00
hahwu
9b653d37e6 礼包充值打点 2026-03-12 17:05:32 +08:00
hahwu
6450c857ce GM 指令,映射账号 2026-03-12 16:09:45 +08:00
hahwu
410d918a75 活动回收邮件优化 2026-03-12 15:44:24 +08:00
hahwu
1639ee330f 邮件回收奖励优化 2026-03-12 14:24:42 +08:00
hahwu
a386b1e29f ZADD只保存10000个排行数据 2026-03-12 11:48:39 +08:00
hahwu
715e88a41e socket断开自动保存数据 2026-03-12 11:23:31 +08:00
hahwu
77ff241698 Revert "活动优化,活动类型判断以时间段为条件"
This reverts commit 37ef7dd434.
2026-03-12 11:20:24 +08:00
hahwu
37ef7dd434 活动优化,活动类型判断以时间段为条件 2026-03-12 10:54:58 +08:00
hahwu
631944f2be 活动初始化增加定时器 2026-03-11 22:03:17 +08:00
hahwu
fac56917a9 1+1礼包优化 2026-03-11 18:16:00 +08:00
hahwu
1a61c7fd1c 限时事件-单元测试 2026-03-11 17:47:17 +08:00
hahwu
a3622b43f0 后台增加信息显示 2026-03-11 17:08:27 +08:00
hahwu
0abecb446e message 信息修复 2026-03-11 17:08:00 +08:00
hahwu
5647721a41 压力测试 2026-03-11 16:19:25 +08:00
hahwu
a54b6a4175 锦标赛优化 2026-03-11 15:28:30 +08:00
hahwu
b26297c864 1.修复发射器在背包生成订单奖励的bug;2.修复回收订单退役发射器判断错误的bug 2026-03-11 15:12:48 +08:00
hahwu
bb820093ff 锦标赛优化分组 2026-03-11 14:09:56 +08:00
hahwu
f50c7f6e86 增加挖矿Gm 2026-03-10 21:41:55 +08:00
hahwu
beda327165 增加挖矿Gm 2026-03-10 21:40:20 +08:00
hahwu
d9eb329bea 锦标赛优化 2026-03-10 21:38:44 +08:00
hahwu
c28bf27f8f 锦标赛优化 2026-03-10 21:23:00 +08:00
hahwu
c18a8cc3ce 增加分组日志 2026-03-10 21:17:38 +08:00
hahwu
485280243a 中心服优化 2026-03-10 20:57:14 +08:00
hahwu
fefc3e6eae 【先禁用】增加订单逻辑,删除无法完成的回收订单 2026-03-10 20:11:08 +08:00
hahwu
89f9b84819 增加订单逻辑,删除无法完成的回收订单 2026-03-10 19:54:49 +08:00
hahwu
3c4824e59e 增加日志打点 2026-03-10 19:14:01 +08:00
hahwu
ea603fd617 修改活动礼包限制 2026-03-10 18:47:05 +08:00
hahwu
37bb6f8a70 bug修复 2026-03-10 15:39:35 +08:00
hahwu
8dbefbe3d9 场景冲刺逻辑修改 2026-03-10 15:32:21 +08:00
hahwu
8a79ce2b64 锦标赛,挖矿配置调整 2026-03-10 12:07:23 +08:00
hahwu
892d81907e 退役的棋子不生成回收订单 2026-03-10 11:01:33 +08:00
hahwu
50a4a9d9c2 订单价格调整 2026-03-10 10:26:31 +08:00
hahwu
55c40cf077 logout msg优化 2026-03-09 22:30:14 +08:00
hahwu
511a69454d playroom小游戏翻牌优化 2026-03-09 22:26:48 +08:00
hahwu
e69ec1d786 订单宠物币bug修复 2026-03-09 22:22:15 +08:00
hahwu
f619449137 免广告礼包优化 2026-03-09 21:44:21 +08:00
hahwu
6547a4a9db 锦标赛机器人优化 2026-03-09 19:30:18 +08:00
hahwu
fc830c47d9 挖矿初始奖励2个代币 2026-03-09 19:00:07 +08:00
hahwu
5b0bda5291 bug修复 2026-03-09 18:21:57 +08:00
hahwu
da5b8f040b 协议信息小改 2026-03-09 18:17:27 +08:00
hahwu
65bc278a06 好友优化 2026-03-09 18:11:23 +08:00
hahwu
a882a010d3 锦标赛排行榜中机器人的头像框改成初始的 2026-03-09 16:25:22 +08:00
hahwu
ce5c64f789 翻牌游戏数值修复 2026-03-09 16:10:58 +08:00
hahwu
7c95366d59 日志优化 2026-03-09 14:04:25 +08:00
hahwu
bc55208047 日志优化 2026-03-09 12:21:22 +08:00
hahwu
d9212ee249 日志优化 2026-03-09 12:18:49 +08:00
hahwu
917c084ba1 日志打印优化 2026-03-09 12:12:19 +08:00
hahwu
6dc3be91f6 优化 2026-03-09 11:50:27 +08:00
hahwu
3a82f1cda8 锦标赛返回逻辑优化 2026-03-09 11:47:05 +08:00
hahwu
aa337c2e63 日常任务奖励,使用配置进行管理 2026-03-09 11:41:22 +08:00
hahwu
5f00cf6a14 限时事件协议优化 2026-03-09 11:39:57 +08:00
hahwu
5b70a69ca1 优化 2026-03-09 11:29:18 +08:00
hahwu
7175dd3c78 锦标赛优化 2026-03-06 19:14:49 +08:00
hahwu
e1022d475e 中心服优化 2026-03-06 18:41:28 +08:00
hahwu
df883aeea7 增加打点日志 2026-03-06 17:40:13 +08:00
hahwu
ac736dc6bd 日志优化 2026-03-06 17:32:56 +08:00
hahwu
b966557d03 优化锦标赛日志 2026-03-06 17:10:51 +08:00
hahwu
b8309ca89d 每日任务优化 2026-03-06 16:54:17 +08:00
hahwu
4fcae1b8f0 挖矿奖励优化 2026-03-06 16:14:16 +08:00
hahwu
db3a30b61d 离线消息优化 2026-03-06 15:35:35 +08:00
hahwu
0e97028a25 优化 2026-03-06 15:25:42 +08:00
hahwu
20cd54b84f 锦标赛优化,0点多进行一次分组 2026-03-06 14:58:30 +08:00
hahwu
ed7e2d7625 锦标赛优化,0点多进行一次分组 2026-03-06 14:55:25 +08:00
hahwu
ed981184d3 修复从缓冲区生成的回收订单协议报错的问题 2026-03-06 10:37:51 +08:00
hahwu
aa7ee2a381 playroom翻牌游戏优化 2026-03-05 18:48:25 +08:00
hahwu
c72761d627 RPC服务器先不启用 2026-03-05 18:33:13 +08:00
hahwu
a2a8da873e GM rpc服务器 2026-03-05 17:55:36 +08:00
hahwu
385d571c3a thrift GM服务器 2026-03-05 17:51:03 +08:00
hahwu
0e01178669 Merge branch 'thrift-backend' into develop 2026-03-05 17:49:51 +08:00
hahwu
dfc6f986bc 设置表情更新缓存 2026-03-05 16:41:17 +08:00
hahwu
e892469ff9 好友功能优化 2026-03-05 15:40:28 +08:00
hahwu
4422dbc527 七日签到-月度奖励优化 2026-03-05 15:14:29 +08:00
hahwu
850cceecaa 锦标赛奖励配置优化-根据活动类型区分 2026-03-05 11:58:08 +08:00
hahwu
5e9710d2f3 猫咪毛皮 2026-03-05 11:35:32 +08:00
hahwu
2ae819376f 单次session内重复添加同一好友会有提示,重新登陆后添加相同好友却提示发送成功 2026-03-05 11:02:25 +08:00
hahwu
33dc62db36 thrift backend server 2026-03-05 09:58:56 +08:00
hahwu
a1d97a1ab6 观看广告接口 2026-03-04 16:12:28 +08:00
hahwu
fa633cf184 修改日志 2026-03-04 15:11:07 +08:00
hahwu
3afcbdf2eb 修复商店棋子错误的bug 2026-03-04 14:52:38 +08:00
hahwu
dff655484e 好友离线信息聚合 2026-03-04 14:48:36 +08:00
hahwu
49b6a6a928 好友优化 2026-03-04 11:34:53 +08:00
hahwu
8bf48093b7 增加注册日期数据 2026-03-03 15:21:06 +08:00
hahwu
a22e318c22 消息优化 2026-03-03 12:29:48 +08:00
hahwu
1e0ca0db80 gob解析优化 2026-03-02 18:52:24 +08:00
hahwu
0b2fdf49c3 gob解析优化 2026-03-02 18:44:16 +08:00
hahwu
ee8e3b9a5f gob解析优化 2026-03-02 17:28:36 +08:00
hahwu
fd4ab739bf 添加好友机制调整 2026-03-02 17:10:10 +08:00
hahwu
b0e2c5672c 添加好友机制调整 2026-03-02 16:46:57 +08:00
hahwu
64901ca8b0 添加好友机制调整 2026-03-02 16:34:14 +08:00
hahwu
5bdd93cbef 订单奖励的猫币数量异常 2026-03-02 15:09:14 +08:00
hahwu
766bcfd30b 订单奖励的猫币数量异常 2026-03-02 14:37:53 +08:00
hahwu
698aec8556 fur数据埋点 2026-03-02 14:12:28 +08:00
hahwu
df9139cec8 增加七日登录重置GM 2026-03-02 11:34:35 +08:00
hahwu
ed57b527a3 优化订单通知显示 2026-02-28 18:43:12 +08:00
hahwu
b3689ca93d 宠物皮毛功能开发 2026-02-28 18:36:29 +08:00
hahwu
cf5f30cebb resshop数据修改 2026-02-28 15:23:12 +08:00
hahwu
a33320065c 增加日志分析工具 2026-02-28 10:54:56 +08:00
hahwu
0e391bc071 notification优化 2026-02-28 10:17:15 +08:00
hahwu
b856dfb5ff 优化notification Gm 2026-02-27 00:50:46 +08:00
hahwu
f38206184c 优化notification Gm 2026-02-27 00:45:19 +08:00
hahwu
d10124fdb2 优化notification GM 2026-02-27 00:31:03 +08:00
hahwu
1b545ea1b7 增加notification debug 2026-02-27 00:01:22 +08:00
hahwu
2d6bcc09b9 notification 优化 2026-02-26 20:09:43 +08:00
hahwu
35f35d0a97 notification debug 2026-02-26 19:55:31 +08:00
hahwu
20dd3f6683 gob register 2026-02-26 19:18:50 +08:00
hahwu
532dba9873 notification优化 2026-02-26 19:02:13 +08:00
hahwu
3de1b738a3 优化序列化方法 2026-02-26 14:10:13 +08:00
hahwu
b7472d7ab3 gob register优化 2026-02-26 11:41:26 +08:00
hahwu
8a6f0b4e92 notification优化 2026-02-26 11:40:00 +08:00
hahwu
776a05e959 charge bug修复 2026-02-26 11:39:22 +08:00
hahwu
abeabab66b Merge branch 'develop' of gitea.bywaystudios.com:pet_home/pet_home_server into develop 2026-02-26 11:29:31 +08:00
hahwu
295f7f9222 取消弃用的进程管理器 2026-02-26 11:29:04 +08:00
hahwu
29a466dfb2 回收日bug修复 2026-02-26 11:28:09 +08:00
hahwu
2c8af266b7 notification功能开发 2026-02-26 10:25:15 +08:00
hahwu
41ee2e48d4 魔法数字优化 2026-02-26 10:24:58 +08:00
hahwu
11f7b4960d 优化接口报错 2026-02-26 10:04:20 +08:00
hahwu
a10b2fefa7 notification功能开发 2026-02-25 18:30:26 +08:00
hahwu
c26c3086af notification功能开发 2026-02-25 17:58:16 +08:00
hahwu
2835465e0d bug修复 2026-02-25 17:30:30 +08:00
hahwu
d1111725ef notification功能开发 2026-02-25 17:24:24 +08:00
hahwu
d310ce93f6 notification功能开发 2026-02-25 17:10:09 +08:00
hahwu
5b7812c469 玩家缓存增加语言设置 2026-02-25 12:06:31 +08:00
hahwu
623baec632 修改message 2026-02-25 12:03:22 +08:00
hahwu
468e65e8da 给信息增加过期时间 2026-02-25 11:30:18 +08:00
hahwu
f9d33219f5 信箱优化 2026-02-25 11:05:03 +08:00
hahwu
1b51313cf0 信箱优化 2026-02-24 19:04:41 +08:00
hahwu
7339e3c634 代码优化 2026-02-24 18:19:10 +08:00
hahwu
e6378568b1 数据保存加锁 2026-02-24 12:19:22 +08:00
hahwu
260e623dfc Revert "数据保存加锁"
This reverts commit f026927a10.
2026-02-24 11:40:49 +08:00
hahwu
c9742c54ee Revert "数据保存加锁"
This reverts commit 437eeac1dd.
2026-02-24 11:40:45 +08:00
hahwu
437eeac1dd 数据保存加锁 2026-02-24 11:35:06 +08:00
hahwu
f026927a10 数据保存加锁 2026-02-24 10:40:37 +08:00
hahwu
87c3448dce 修复订单bug 2026-02-24 10:05:14 +08:00
hahwu
738015e1d3 修复订单bug 2026-02-24 10:05:14 +08:00
hahwu
67cff6a431 优化序列化 2026-02-14 14:44:34 +08:00
hahwu
4a0788729a 途游notification 2026-02-13 19:04:52 +08:00
hahwu
324ec44b1f 死循环修复 2026-02-12 23:01:32 +08:00
hahwu
52a24f3376 增加日志打点 2026-02-12 14:52:54 +08:00
hahwu
4e8da1047f 后台邮件优化 2026-02-12 14:17:10 +08:00
hahwu
b9bd656130 优化 2026-02-12 11:18:09 +08:00
hahwu
62b8959806 增加GM指令,重置trigger mail记录 2026-02-12 10:38:33 +08:00
hahwu
f3a764e2dc 邮件优化 2026-02-12 10:33:19 +08:00
hahwu
97f8e3b96d 打点日志优化 2026-02-12 10:26:00 +08:00
hahwu
8b236925c2 背包优化 2026-02-12 10:25:41 +08:00
hahwu
088208a3bb GM后台优化 2026-02-11 16:19:15 +08:00
hahwu
2084223308 GM后台优化 2026-02-11 15:32:13 +08:00
hahwu
e4ba7fd004 特惠礼包bug修复 2026-02-11 14:47:41 +08:00
hahwu
c94e97dbe6 GM后台优化 2026-02-11 14:29:43 +08:00
hahwu
8142cac415 头像收藏优化 2026-02-11 14:29:31 +08:00
hahwu
13e580caaa 增加日志 2026-02-11 11:42:10 +08:00
hahwu
1c058d5546 优化 2026-02-10 18:22:51 +08:00
hahwu
b41130b6fa 无尽礼包优化 2026-02-10 18:18:46 +08:00
hahwu
8328ac6b63 无尽礼包优化 2026-02-10 17:06:26 +08:00
hahwu
60785c9909 quest playroom fix bug 2026-02-10 16:44:40 +08:00
hahwu
1674ae161f quest playroom fix bug 2026-02-10 16:28:52 +08:00
hahwu
9d4a2c9f15 playroom服装任务bug修复 2026-02-10 15:45:12 +08:00
hahwu
8967922db6 增加GM指令 2026-02-10 15:11:01 +08:00
hahwu
ceb3c93df0 playroom每日任务转盘bug修复 2026-02-10 14:49:49 +08:00
hahwu
3703b2396a 增加任务类型 2026-02-10 11:48:12 +08:00
hahwu
ccc02de315 1.好友推荐优化;2AD energy增加常量;3playroom日常任务优化 2026-02-10 11:03:46 +08:00
hahwu
05b5341a1d 回收订单优化 2026-02-09 17:55:38 +08:00
hahwu
b68d8bd4d5 回收订单优化 2026-02-09 17:48:52 +08:00
hahwu
17340f056d Revert "架构优化"
This reverts commit 806780b5b3.
2026-02-09 15:57:00 +08:00
hahwu
806780b5b3 架构优化 2026-02-09 15:51:23 +08:00
hahwu
b66bfa0209 随机数优化 2026-02-09 14:30:56 +08:00
hahwu
f42dd2dd95 推荐优化 2026-02-09 14:13:03 +08:00
hahwu
b4317cf3c4 推荐优化 2026-02-09 14:07:57 +08:00
hahwu
6172c12227 推荐优化 2026-02-09 12:19:59 +08:00
hahwu
4e832972fa 推荐优化 2026-02-09 10:41:19 +08:00
hahwu
30f32e1da0 【架构优化】提升代码质量 2026-02-06 17:39:27 +08:00
hahwu
0f2aedb150 增加翻译 2026-02-06 15:25:35 +08:00
hahwu
6560eb19ac sql语句更新 2026-02-06 10:51:33 +08:00
hahwu
69cbb39221 多语言增加西班牙语 2026-02-06 10:29:09 +08:00
hahwu
fb4367080d 【架构优化】list设置容量,避免动态扩容 2026-02-05 19:04:20 +08:00
hahwu
e6f7db6cca 【架构优化】list设置容量,避免动态扩容 2026-02-05 19:00:32 +08:00
hahwu
e2200be3ff 【架构优化】list设置容量,避免动态扩容 2026-02-05 16:39:51 +08:00
hahwu
8345076c28 【架构优化】list设置容量,避免动态扩容 2026-02-05 16:27:34 +08:00
hahwu
46a76843a9 【架构优化】list设置容量,避免动态扩容 2026-02-05 15:11:31 +08:00
hahwu
e5730c206e 【锦标赛】优化排行榜 2026-02-04 18:44:08 +08:00
hahwu
f17e2948a3 【锦标赛】优化排行榜 2026-02-04 18:35:23 +08:00
hahwu
56157dd32c 【限时事件】超级订单优化 2026-02-04 18:20:21 +08:00
hahwu
9b08cdebe6 【架构优化】1.var删除冗余数据;2.champship增加redis缓存,增加读写锁;3.message过滤过期消息,删除空信箱 2026-02-04 18:10:45 +08:00
hahwu
a80d65ccd2 【限时事件】超级订单修改回退 2026-02-04 18:01:23 +08:00
hahwu
fdcb4faef9 【限时事件】超级订单bug修复 2026-02-04 17:44:44 +08:00
hahwu
75ae03be9f 锦标赛优化 2026-02-04 16:48:48 +08:00
hahwu
c1f9d0aa20 【限时事件】宝箱雨修复 2026-02-04 16:23:59 +08:00
hahwu
5da2f68a0c 锦标赛优化 2026-02-04 15:00:04 +08:00
hahwu
00809c8484 卡牌时间线优化 2026-02-04 10:33:20 +08:00
hahwu
87aef36237 通过删除重复添加同一个好友,会重复触发好友体力,造成刷体力的情况 2026-02-03 17:40:08 +08:00
hahwu
25cfbf30a2 玩家消息bug修复 2026-02-03 17:20:00 +08:00
hahwu
6824df5a1c 玩家消息bug修复 2026-02-03 17:14:15 +08:00
hahwu
52fbce102f 猫咪闪促优化 2026-02-03 16:36:54 +08:00
hahwu
f14c0ba5d2 无尽礼包优化 2026-02-03 16:36:03 +08:00
hahwu
d9aedbdf55 锦标赛优化 2026-02-03 15:10:39 +08:00
hahwu
e26266f1d7 备份优化 2026-02-03 15:10:27 +08:00
hahwu
123f4d2e1c 架构优化 2026-02-02 18:52:58 +08:00
hahwu
bd96bfa29e 架构优化 2026-02-02 17:42:57 +08:00
hahwu
90e1115798 调试优化 2026-02-02 12:28:30 +08:00
hahwu
8d496bfbda 架构优化 2026-02-02 10:24:07 +08:00
hahwu
e59cbc9360 修改超级订单奖励逻辑 2026-01-30 10:21:09 +08:00
hahwu
f621b938bd Merge branch 'develop' of gitea.bywaystudios.com:pet_home/pet_home_server into develop 2026-01-29 20:09:38 +08:00
hahwu
1c667bc066 1 2026-01-29 20:09:32 +08:00
hahwu
7f085b6b80 消息修复 2026-01-29 20:07:12 +08:00
hahwu
34126d990a 优化 2026-01-29 20:02:40 +08:00
hahwu
650bb1136f 竞标赛消息优化 2026-01-29 17:42:48 +08:00
hahwu
0a610a79bb 优化日志 2026-01-29 10:22:08 +08:00
hahwu
cc77fff573 git记录中删除protobuf文件,修改成实时生成 2026-01-27 17:24:39 +08:00
hahwu
cbd054f050 修改项目,协议由每次打包实时生产 2026-01-27 17:17:20 +08:00
hahwu
feeef9c449 修改协议 2026-01-27 16:25:15 +08:00
hahwu
56f400a4ef 修改发货通知 2026-01-27 15:25:53 +08:00
hahwu
524a0cfa0f reqplayroom优化 2026-01-26 22:58:56 +08:00
hahwu
1730d81990 优化,去除kafka中间件 2026-01-26 18:29:06 +08:00
hahwu
8bf726f9a3 日志优化 2026-01-26 18:21:38 +08:00
hahwu
7cab2e6eb1 日志优化 2026-01-26 18:20:55 +08:00
hahwu
d60c56a767 日志优化 2026-01-26 17:35:15 +08:00
hahwu
746ad76a5b 订单日志 2026-01-26 15:56:47 +08:00
hahwu
22c20dd8b3 增加日志 2026-01-26 12:23:13 +08:00
hahwu
69e4c823c4 订单优化 2026-01-26 11:47:41 +08:00
hahwu
ecf37639a5 增加日志 2026-01-26 11:46:40 +08:00
hahwu
e9d1565115 bug漏洞修复;1.processtrigger 漏加锁;2message_mgr空指针报错 2026-01-26 10:19:05 +08:00
hahwu
167e5dd28c 增加日志 2026-01-23 20:59:23 +08:00
hahwu
b0fb5d0469 增加日志打点 2026-01-23 20:43:15 +08:00
hahwu
cee1ff220b 宝箱雨优化 2026-01-23 20:09:17 +08:00
hahwu
4c9b3abae0 宝箱雨优化 2026-01-23 19:51:55 +08:00
hahwu
6acc529698 优化订单提交 2026-01-23 11:43:44 +08:00
hahwu
e622273a73 后台接口优化 2026-01-22 18:12:08 +08:00
hahwu
bd36f98954 增加接口报错日志 2026-01-22 17:27:45 +08:00
hahwu
1ed7fa71b9 零件优化 2026-01-22 17:17:41 +08:00
hahwu
94a056c18a 日志优化 2026-01-21 17:56:16 +08:00
hahwu
892b6408d3 日志优化 2026-01-21 17:25:55 +08:00
hahwu
dd90f57f70 好友小喇叭优化 2026-01-21 16:49:57 +08:00
hahwu
5586a4aa4f 日志优化 2026-01-21 16:20:28 +08:00
hahwu
f81facf4cd 日志优化 2026-01-21 16:15:53 +08:00
hahwu
edceb1cf1e 限时事件优化,连击快手 2026-01-21 11:28:54 +08:00
hahwu
dd6fdde8ce 限时事件修改 2026-01-20 19:24:29 +08:00
hahwu
21ae017443 cluster节点增加可发数据长度 2026-01-20 18:59:21 +08:00
hahwu
2e50f58a09 cluster节点增加可发数据长度 2026-01-20 18:57:41 +08:00
hahwu
3d2cfa9380 节点记录 2026-01-20 18:39:01 +08:00
hahwu
104ab707a6 日志 2026-01-20 17:38:07 +08:00
hahwu
ab269ac8a6 decorate 修复 2026-01-20 16:51:37 +08:00
hahwu
08eeeb2a40 优化goroutine,decorate part增加校验 2026-01-20 16:36:17 +08:00
hahwu
c0858e20f0 装饰优化 2026-01-20 14:11:26 +08:00
hahwu
50c42e705d 日志优化 2026-01-20 12:14:22 +08:00
hahwu
1782094f92 日志优化 2026-01-19 12:24:47 +08:00
hahwu
f435b444d7 日志优化 2026-01-19 12:07:22 +08:00
hahwu
54bf168f80 日志优化 2026-01-16 20:59:10 +08:00
hahwu
7e4a4c2bd4 增加日志 2026-01-16 18:53:23 +08:00
hahwu
deb90ba749 装饰步骤改版优化-邮件文本 2026-01-16 12:29:42 +08:00
hahwu
1ce0f639ce 服务端重启增加踢出消息推送 2026-01-16 12:04:40 +08:00
hahwu
bf1b96fbb5 装饰步骤改版优化 日志 2026-01-16 11:34:33 +08:00
hahwu
19881f2d09 gm优化 2026-01-16 11:32:20 +08:00
hahwu
0a48a58317 装饰步骤改版优化 2026-01-16 11:01:38 +08:00
hahwu
afd9c276f3 日志优化 2026-01-16 10:33:39 +08:00
hahwu
6dfb61ada9 装饰步骤改版优化 2026-01-16 10:24:43 +08:00
hahwu
48aae65afd 日志优化 2026-01-15 18:45:52 +08:00
hahwu
f063cd199c 打点日志 2026-01-15 16:23:12 +08:00
hahwu
87e8b9a261 代码优化 2026-01-14 18:09:20 +08:00
hahwu
804ee3251d 商店的产物直购价格调整为:产物标准链虚拟体力/5 (原来除数为18) 2026-01-14 10:46:34 +08:00
hahwu
497efd6e2d 活动回收邮件优化 2026-01-14 10:09:54 +08:00
hahwu
59bbfcd710 日志优化 2026-01-14 10:09:36 +08:00
hahwu
7d6a040cec 单元测试 2026-01-13 17:42:53 +08:00
hahwu
ade21206c6 消息优化 2026-01-13 17:29:43 +08:00
hahwu
eaffa63ae8 消息优化 2026-01-13 17:13:46 +08:00
hahwu
5354e1bca0 点赞优化 2026-01-13 16:55:50 +08:00
hahwu
158b7a840a 点赞优化 2026-01-13 16:50:50 +08:00
hahwu
9f8e2460ac 配置优化 2026-01-13 15:28:39 +08:00
hahwu
48ddddb680 数据安全优化 2026-01-13 15:19:43 +08:00
hahwu
0df389240e 消息优化 2026-01-13 15:11:04 +08:00
hahwu
650db03198 数据锁优化 2026-01-13 12:09:27 +08:00
hahwu
1d0ed79b13 日志优化 2026-01-13 10:33:50 +08:00
hahwu
ce8dabf112 数据安全优化 2026-01-13 10:02:37 +08:00
hahwu
9d9c5634e2 日志优化 2026-01-13 09:58:30 +08:00
hahwu
dcb0396a73 优化日志 2026-01-12 18:38:12 +08:00
hahwu
2612647e74 锦标赛通知优化 2026-01-12 10:07:47 +08:00
hahwu
e1f086fb85 增加map读写锁 2026-01-09 18:13:31 +08:00
hahwu
248405d984 map读写优化 2026-01-09 18:13:31 +08:00
hahwu
02002e6c16 逻辑bug优化 2026-01-09 18:13:30 +08:00
hahwu
b9f6cceda1 日志优化 2026-01-07 11:51:34 +08:00
hahwu
c734417b1c catnip bug修复 2026-01-07 11:49:45 +08:00
hahwu
739a328674 棋子出售也会增加活动代币 2026-01-05 15:42:59 +08:00
hahwu
cf8b5f9c23 服务端连接优化 2026-01-04 12:08:36 +08:00
hahwu
608d7d4168 增加GM 2025-12-31 16:27:36 +08:00
hahwu
dceed4be1e 增加GM 2025-12-31 16:27:36 +08:00
hahwu
4f9d047196 消息优化 2025-12-31 15:29:04 +08:00
hahwu
9ac20a99b6 连接优化 2025-12-31 15:06:40 +08:00
hahwu
60725fca2a 连接修复 2025-12-31 14:47:50 +08:00
hahwu
88b855d949 Merge branch 'develop' of gitea.bywaystudios.com:pet_home/pet_home_server into develop 2025-12-31 14:47:23 +08:00
hahwu
98c187869b 连接修复 2025-12-31 14:47:21 +08:00
hahwu
0a53f88af7 连接优化 2025-12-31 14:02:26 +08:00
hahwu
4b471ad95d 日志优化 2025-12-31 12:01:15 +08:00
hahwu
ed7ec40d34 日志优化 2025-12-30 18:33:06 +08:00
hahwu
59a8d692b1 监控优化 2025-12-30 16:45:37 +08:00
hahwu
d326a8c4cf 连接优化 2025-12-30 16:43:07 +08:00
hahwu
2b5f0e099f 连接优化 2025-12-30 16:35:59 +08:00
hahwu
5c0ea843a0 后台优化 2025-12-30 15:55:19 +08:00
hahwu
83568e3c23 测试脚本优化 2025-12-30 15:51:36 +08:00
hahwu
42d59026fd 消息日志优化 2025-12-30 15:39:48 +08:00
hahwu
f5fef79619 消息日志优化 2025-12-30 15:03:27 +08:00
hahwu
4cf882ecd2 消息日志优化 2025-12-30 12:17:41 +08:00
hahwu
cf11a71f03 消息日志优化 2025-12-30 12:08:29 +08:00
hahwu
2ca9f004bd 消息日志优化 2025-12-30 11:48:50 +08:00
hahwu
07935149a7 增加账号重置GM 2025-12-26 16:02:57 +08:00
hahwu
f99ece7531 增加账号重置GM 2025-12-26 15:56:35 +08:00
hahwu
dd142fceaa 增加账号重置GM 2025-12-26 15:43:58 +08:00
hahwu
eb3e1e376e 增加账号重置GM 2025-12-26 15:40:38 +08:00
hahwu
b6a3b6f0be 增加账号重置GM 2025-12-26 15:25:46 +08:00
hahwu
f962718717 登录优化 2025-12-26 10:14:53 +08:00
hahwu
caff1b207a 登录优化 2025-12-25 18:21:54 +08:00
hahwu
09a48aa1ed 登录优化 2025-12-25 18:12:03 +08:00
hahwu
a7bbfc3d59 log优化 2025-12-25 17:58:41 +08:00
hahwu
a387920c1f 优化 2025-12-25 16:34:33 +08:00
hahwu
8ed0cf8889 结构优化 2025-12-25 15:27:10 +08:00
hahwu
462f60a5da gm优化 2025-12-25 15:25:20 +08:00
hahwu
2b8ce93ab1 离线优化 2025-12-25 14:48:26 +08:00
hahwu
f8084e8baf Merge branch 'develop' of gitea.bywaystudios.com:pet_home/pet_home_server into develop 2025-12-25 14:46:12 +08:00
hahwu
e3661d11b5 登录优化 2025-12-25 14:46:03 +08:00
hahwu
798004b2a3 Merge branch 'develop' of gitea.bywaystudios.com:pet_home/pet_home_server into develop 2025-12-25 12:09:32 +08:00
hahwu
d7a1eededb 后台优化 2025-12-25 12:08:53 +08:00
hahwu
857923f268 消息服务优化 2025-12-25 11:11:55 +08:00
hahwu
0f4cae323e 消息服务优化 2025-12-25 10:57:20 +08:00
hahwu
9ec87776f0 消息服务优化 2025-12-25 10:00:48 +08:00
hahwu
e21aac1c08 消息服务优化 2025-12-25 09:52:06 +08:00
hahwu
d123fc93d5 消息服务优化 2025-12-24 17:17:57 +08:00
hahwu
5768776e56 消息服务优化 2025-12-24 17:05:39 +08:00
hahwu
a9e07f103a uid优化 2025-12-24 15:13:26 +08:00
hahwu
b336e42f21 Merge branch 'cluster2' into develop 2025-12-24 15:05:16 +08:00
hahwu
ef1125b75d gm优化 2025-12-24 15:04:20 +08:00
hahwu
30eab6db4b 7 2025-12-24 14:31:29 +08:00
hahwu
e884b20e32 7 2025-12-24 14:30:37 +08:00
hahwu
7e58fd3f4b 6 2025-12-24 11:50:23 +08:00
hahwu
68c8cfe620 6 2025-12-24 11:49:29 +08:00
hahwu
b25a10f2fe 6 2025-12-24 10:28:38 +08:00
hahwu
c0f02217c1 6 2025-12-24 10:27:56 +08:00
hahwu
0036ff96c7 5 2025-12-23 16:41:52 +08:00
hahwu
2c33c24d42 5 2025-12-23 16:21:59 +08:00
hahwu
98fcc02e38 5 2025-12-23 16:16:43 +08:00
hahwu
50c6c07140 5 2025-12-23 16:16:01 +08:00
hahwu
0e86975563 4 2025-12-23 15:19:03 +08:00
hahwu
9dfa884349 4 2025-12-23 15:17:32 +08:00
hahwu
28de534bd4 3 2025-12-23 11:52:20 +08:00
hahwu
574b9f49a1 3 2025-12-23 11:45:43 +08:00
hahwu
728656d23b 2 2025-12-22 17:28:50 +08:00
hahwu
3b02cd1241 2 2025-12-22 16:45:11 +08:00
hahwu
408bd4df5b 2 2025-12-22 16:10:03 +08:00
hahwu
d16e2b3e25 1 2025-12-22 16:06:08 +08:00
hahwu
dd9e934f2d 猫草大作战 2025-12-19 18:47:07 +08:00
hahwu
c814fac8ba 猫草大作战 2025-12-19 18:46:22 +08:00
hahwu
d3fde0949a 1 2025-12-19 14:18:53 +08:00
hahwu
bc6320d11d 1 2025-12-18 19:14:38 +08:00
hahwu
1feed48e0f 1 2025-12-18 17:17:56 +08:00
hahwu
dd48b8354c 1 2025-12-18 16:33:53 +08:00
hahwu
adaf454d36 1 2025-12-18 15:59:35 +08:00
hahwu
17ac92f5a1 1 2025-12-18 14:50:30 +08:00
hahwu
54dba4b18a 1 2025-12-18 11:48:27 +08:00
hahwu
420f0a2e2c 1 2025-12-18 10:40:06 +08:00
hahwu
11d38f9483 Merge remote-tracking branch 'origin/Cluster' into develop 2025-12-18 10:25:28 +08:00
hahwu
f64d18de82 message controller 2025-12-17 20:11:28 +08:00
hahwu
eaaad55a10 棋盘数据优化 2025-12-17 19:49:08 +08:00
hahwu
65af33758b message controll优化 2025-12-17 19:45:53 +08:00
hahwu
6f4366dffc gm优化 2025-12-17 18:13:29 +08:00
hahwu
d5735710cd 加好友扣广告次数 2025-12-17 17:04:22 +08:00
hahwu
bd6c3380ba 项目重构 2025-12-17 16:47:57 +08:00
hahwu
eb7cee0292 邮件补发 2025-12-17 11:04:35 +08:00
hahwu
b29eee3a1a 【猫草大作战】补发邮件 2025-12-17 10:45:06 +08:00
hahwu
58033e959f 猫草大作战 2025-12-17 10:28:33 +08:00
hahwu
b1347f48cb 猫草大作战 2025-12-17 10:20:56 +08:00
hahwu
1520798201 catnip修改 2025-12-16 19:47:15 +08:00
hahwu
b8662c3afd 代码优化 2025-12-16 15:31:24 +08:00
hahwu
5dde9f9f9f 代码优化 2025-12-16 15:23:25 +08:00
hahwu
3466a7f0fb 协议更新 2025-12-15 18:37:38 +08:00
hahwu
89849854bb sql脚本 2025-12-15 17:08:27 +08:00
hahwu
8348e26ac4 增加NPC校验 2025-12-15 15:05:15 +08:00
hahwu
9512b7b0e0 删除旧的配置文件 2025-12-15 15:00:24 +08:00
hahwu
c1f32bc792 gm优化 2025-12-15 14:23:03 +08:00
hahwu
dc4f33b1f5 gm优化 2025-12-15 11:52:31 +08:00
hahwu
6fd2d3a039 gm优化 2025-12-15 10:16:06 +08:00
hahwu
865cc45c59 【猫草大作战】-修改回复协议 2025-12-12 17:08:51 +08:00
hahwu
03eca57bb5 【猫草大作战】-修改协议 2025-12-11 16:29:03 +08:00
hahwu
5a9b2a0fa8 【猫草大作战】-修改同意逻辑 2025-12-11 16:25:31 +08:00
hahwu
d1d63de3bf 用户详情增加宠物名字 2025-12-11 16:00:22 +08:00
hahwu
cc2fbb53d8 日志优化 2025-12-10 21:23:21 +08:00
hahwu
fde2821109 日志优化 2025-12-10 21:14:28 +08:00
hahwu
e4e1b93a9a 【猫草大作战】-修改领奖逻辑 2025-12-10 18:56:57 +08:00
hahwu
b48aeea1d8 【猫草大作战】-修改返回数据 2025-12-10 17:33:50 +08:00
hahwu
88b1b3601e 【日志】优化 2025-12-10 12:12:07 +08:00
hahwu
2b54cd128f 【猫草大作战】-转盘逻辑bug 2025-12-10 11:59:55 +08:00
hahwu
1fc341b77b 【猫草大作战】-转盘逻辑bug 2025-12-10 10:23:56 +08:00
hahwu
2aa0ccbd58 【猫草大作战】-领奖逻辑bug修复 2025-12-09 18:48:19 +08:00
hahwu
6471ccda73 新增章节奖励接口 2025-12-09 17:56:02 +08:00
hahwu
822ae4c6ef 【猫草大作战】-领奖逻辑优化 2025-12-09 17:46:46 +08:00
hahwu
7dcd683997 【订单】-宠物订单的棋子不能是自动发射器棋子 2025-12-09 17:34:47 +08:00
hahwu
d17992a6f1 【猫草大作战】-领奖逻辑优化 2025-12-09 17:28:30 +08:00
hahwu
af72af6ec4 【猫草大作战】-接口协议优化 2025-12-09 14:17:42 +08:00
hahwu
f6a43e8a21 代码结构优化 2025-12-09 12:08:44 +08:00
hahwu
4245b7e1d1 【猫草大作战】-接口优化,取消数据刷新 2025-12-09 10:52:08 +08:00
hahwu
7a4586b1ef 代码优化 2025-12-09 10:50:42 +08:00
hahwu
f611eccec9 数据优化 2025-12-09 09:59:45 +08:00
hahwu
eb71e599a2 【猫草大作战】-优化 2025-12-08 19:04:48 +08:00
hahwu
f385a7f546 【猫草大作战】-bug优化 2025-12-08 19:03:04 +08:00
hahwu
8c5f31d7a8 【猫草大作战】-bug优化 2025-12-08 18:23:28 +08:00
hahwu
efab82709f 【猫草大作战】-邀请列表优化 2025-12-08 16:41:39 +08:00
hahwu
baf4914f9b 【猫草大作战】-协议修改 2025-12-08 16:05:57 +08:00
hahwu
9080c8870a 【猫草大作战】- 设置emoji 、单元测试 2025-12-08 15:15:55 +08:00
hahwu
b6915f5073 【猫草大作战】数据埋点 2025-12-08 14:21:22 +08:00
hahwu
a232698664 猫草大作战-修改协议 2025-12-08 12:28:02 +08:00
hahwu
58c36d9180 猫草大作战优化-抽奖赠送好友道具 2025-12-08 10:49:20 +08:00
hahwu
61f065747e 猫草大作战优化 2025-12-08 10:32:38 +08:00
hahwu
bcd385210a 猫草大作战优化 2025-12-08 10:13:37 +08:00
hahwu
259814ab90 猫草大作战 2025-12-05 19:39:40 +08:00
hahwu
5ad2b64fc4 日志优化 2025-12-05 11:12:51 +08:00
hahwu
f4c9972fdf 协议解析错误直接返回 2025-12-04 18:49:46 +08:00
hahwu
f25fbb2d4e kv结构-数据安全校验 2025-12-04 18:18:11 +08:00
hahwu
3a10713337 kv结构-数据安全校验 2025-12-04 18:11:14 +08:00
hahwu
d9d025fa95 猫草大作战-发送表情 2025-12-04 18:07:42 +08:00
hahwu
f8363ff994 猫草大作战-好友同意优化 2025-12-04 17:54:41 +08:00
hahwu
745ebaced4 猫草大作战 2025-12-04 16:48:57 +08:00
hahwu
dc2e1d8ea4 日志优化 2025-12-04 15:32:18 +08:00
hahwu
1191168a19 日志优化,GC优化 2025-12-04 15:27:54 +08:00
hahwu
4421b9f613 日志优化 2025-12-03 18:10:53 +08:00
hahwu
8fabdd7137 订单通知优化 2025-12-02 12:25:45 +08:00
hahwu
91e5b48fe5 集群架构 2025-12-02 10:09:21 +08:00
hahwu
4dc6dcbee7 集群架构优化 2025-12-01 18:47:17 +08:00
hahwu
8c5b63a49a 集群架构优化 2025-12-01 18:45:22 +08:00
hahwu
ca4a593d69 集群架构优化 2025-12-01 15:19:06 +08:00
hahwu
200cbaec68 集群架构优化 2025-12-01 15:17:07 +08:00
hahwu
39cf03a4ab 邮件多语言 2025-12-01 11:28:39 +08:00
hahwu
c8f859d7e4 邮件优化 2025-11-28 16:21:00 +08:00
hahwu
b7f2ed2e50 登录优化 2025-11-28 16:21:00 +08:00
hahwu
2ba0f54cb4 邮件优化 2025-11-28 16:21:00 +08:00
hahwu
0e425f0355 ga日志优化 2025-11-28 15:23:32 +08:00
hahwu
14807a52ed 邮件优化 2025-11-28 11:57:55 +08:00
hahwu
ed99982d86 葡萄牙语邮件 2025-11-28 10:30:35 +08:00
hahwu
d85c048d8b 葡萄牙语邮件 2025-11-28 10:20:11 +08:00
hahwu
0c979e7ff1 减价不减量 新限时事件 2025-11-27 14:29:11 +08:00
hahwu
f1b0f96c07 关闭旧的发货接口 2025-11-26 19:00:13 +08:00
hahwu
0ac249ad30 猫咪闪促 2025-11-26 17:14:02 +08:00
hahwu
b1af9103bf 限时事件 2025-11-26 14:43:36 +08:00
hahwu
cd303b5658 ga日志优化 2025-11-25 14:55:03 +08:00
hahwu
3bd4a88221 优化 2025-11-25 11:09:58 +08:00
hahwu
1dfa4cda64 优化 2025-11-21 18:54:50 +08:00
hahwu
d0aec519d1 日志写入采用异步方式 2025-11-21 17:45:42 +08:00
hahwu
edae9c0a5e 途游GA打点 2025-11-21 17:25:57 +08:00
hahwu
2ee93f2408 优化 2025-11-20 11:39:54 +08:00
hahwu
300d307b87 排行榜优化 2025-11-18 14:05:04 +08:00
hahwu
187742a6ca 竞标赛排行榜优化 2025-11-14 17:38:24 +08:00
hahwu
fe0fe15890 gm优化 2025-11-13 18:02:01 +08:00
hahwu
ee2a87988b 断线重连优化 2025-11-13 10:40:59 +08:00
hahwu
7c30d076fb 优化 2025-11-12 20:01:44 +08:00
hahwu
5ab3f9847a 增加时间线 2025-11-12 15:46:52 +08:00
hahwu
57b7ac838c 充值数据优化 2025-11-12 12:11:45 +08:00
hahwu
513ec5597d 日志优化 2025-11-12 10:35:06 +08:00
hahwu
3ec6de9b1e 订单支付优化 2025-11-11 11:23:20 +08:00
hahwu
b749304e82 支付优化 2025-11-11 10:55:00 +08:00
hahwu
9b17d14437 获取体力优化 2025-11-11 10:21:42 +08:00
hahwu
8428678712 增加退役领取奖励接口 2025-11-10 15:07:19 +08:00
hahwu
2b816c3370 优化 2025-11-07 17:51:30 +08:00
hahwu
e229ab8f98 优化 2025-11-07 17:26:07 +08:00
hahwu
17689cab25 好友优化 2025-11-07 16:42:00 +08:00
hahwu
6fc48de7ae 优化 2025-11-06 17:00:35 +08:00
hahwu
20cb57a7f8 登录优化 2025-11-06 15:39:07 +08:00
hahwu
9d7bad07d1 优惠日数据刷新 2025-11-06 10:18:05 +08:00
hahwu
4eeeffa4d6 点击生成消耗品订单 2025-10-31 16:06:06 +08:00
hahwu
5df375128c 好友打招呼 2025-10-31 14:58:06 +08:00
hahwu
4c59b75e17 好友信息增加猫咪生理值 2025-10-30 19:05:27 +08:00
hahwu
5e113715c8 后台订单发货 2025-10-30 16:55:54 +08:00
hahwu
82daf12862 后台订单优化 2025-10-30 16:25:33 +08:00
hahwu
8860026ff1 离线时间优化 2025-10-30 15:30:00 +08:00
hahwu
17d71f499b 后台订单发货 2025-10-30 15:28:39 +08:00
hahwu
013b666a75 优化 2025-10-28 16:55:46 +08:00
hahwu
522f7bb036 优化 2025-10-28 16:45:32 +08:00
hahwu
a6a3b44f94 优化 2025-10-28 16:17:17 +08:00
hahwu
31c17a7766 优化 2025-10-28 15:30:19 +08:00
hahwu
28135b26ad 优化 2025-10-28 14:47:08 +08:00
hahwu
c808db5db5 优化 2025-10-28 11:11:23 +08:00
hahwu
6b64677a12 活动日志优化 2025-10-23 11:11:18 +08:00
hahwu
f4fded038b 后台优化 2025-10-23 10:36:55 +08:00
hahwu
42c88a9ffe 延长支付校验时间 2025-10-23 09:52:23 +08:00
hahwu
80fc8fa0c6 流失用户回归记录 2025-10-22 15:52:12 +08:00
hahwu
2af5bff831 优化 2025-10-22 15:48:35 +08:00
hahwu
e97c46a09f bug修复 2025-10-22 15:15:10 +08:00
hahwu
bd792c72b8 添加好友优化 2025-10-22 15:01:56 +08:00
hahwu
23c232d0d3 优化 2025-10-21 16:57:53 +08:00
hahwu
74ead0b4e6 每周优惠日结束时间 2025-10-21 16:26:13 +08:00
hahwu
7d3e299877 每周优惠日 2025-10-21 16:23:31 +08:00
hahwu
bf5cbc9d5d 充值优化 2025-10-21 15:26:50 +08:00
hahwu
4bfc5266b6 bug修复 2025-10-20 18:52:19 +08:00
hahwu
780a2150fb 活动通行证更新 2025-10-20 16:49:02 +08:00
hahwu
702d216a06 活动通行证 2025-10-20 16:36:03 +08:00
hahwu
099f76a1ce 增加协议 2025-10-20 15:26:27 +08:00
hahwu
627ee5c80b 增加协议 2025-10-20 15:23:40 +08:00
hahwu
e065a15028 协议更新 2025-10-20 15:07:16 +08:00
hahwu
502943250a 协议更新 2025-10-20 14:46:22 +08:00
hahwu
21e54e98fc 协议更新 2025-10-20 14:03:11 +08:00
hahwu
3010cffe03 宠物打工 2025-10-20 10:43:45 +08:00
hahwu
94ca75092b 宠物打工 2025-10-20 10:37:32 +08:00
hahwu
4305144472 棋子商店bug修改 2025-10-20 10:26:09 +08:00
hahwu
0d258ccf3e 增加零件GM 2025-10-17 17:24:41 +08:00
hahwu
380a005143 每周优惠 2025-10-17 15:30:43 +08:00
hahwu
120d83901a 每周优惠 2025-10-17 15:01:46 +08:00
hahwu
0da23102a7 棋子商店修复 2025-10-16 17:23:37 +08:00
hahwu
78bfb4eb2d 订单优化 2025-10-16 15:38:46 +08:00
hahwu
2d68b7e2af 邮件优化 2025-10-16 10:36:07 +08:00
hahwu
f04b58b091 消耗品订单优化 2025-10-15 18:54:24 +08:00
hahwu
e038ca4ad4 消耗品订单优化 2025-10-15 18:35:34 +08:00
hahwu
551afa682a 棋子商店 2025-10-15 17:47:16 +08:00
hahwu
2149ee404b 消耗品订单优化 2025-10-14 10:46:23 +08:00
hahwu
b49d7dbec3 后台接口优化 2025-10-11 16:36:07 +08:00
hahwu
dfb54e70f7 后台接口优化 2025-10-11 14:23:10 +08:00
hahwu
0dc7af2515 动态难度修改 2025-10-11 11:06:13 +08:00
hahwu
808e3ebf1b 产物商店价格调整 2025-10-11 10:22:35 +08:00
hahwu
78221562cf 增加打点 2025-10-10 16:08:14 +08:00
hahwu
3992d23f46 订单打点修复 2025-10-10 11:29:18 +08:00
hahwu
04c33850c0 订单优化 2025-09-30 10:23:30 +08:00
hahwu
8ee4ed3e93 免广告礼包 2025-09-29 17:34:04 +08:00
hahwu
74a8ba6d1b 免广告礼包 2025-09-29 17:20:09 +08:00
hahwu
ff78509bc0 免广告礼包 2025-09-29 16:23:29 +08:00
hahwu
b2ea831498 日志优化 2025-09-29 16:23:04 +08:00
hahwu
144d30df98 订单优化 2025-09-29 09:47:37 +08:00
hahwu
6c62608929 订单优化 2025-09-28 12:25:47 +08:00
hahwu
bce5d809df 订单优化 2025-09-28 10:19:18 +08:00
hahwu
9510ea96bc 订单优化 2025-09-28 10:05:15 +08:00
hahwu
ae342334e8 订单优化 2025-09-28 09:59:09 +08:00
hahwu
61e69019b1 订单修复 2025-09-26 18:24:50 +08:00
hahwu
c883fb185e 支付校验通知 2025-09-26 17:53:29 +08:00
hahwu
ba33d77e1e 订单优化 2025-09-26 17:47:34 +08:00
hahwu
d3823bd9ca 飞书优化 2025-09-26 17:17:59 +08:00
hahwu
bf485f132c 订单bug修复 2025-09-26 15:50:06 +08:00
hahwu
e8d0c38d59 预热订单bug修复 2025-09-26 12:30:27 +08:00
hahwu
30314bc979 优化 2025-09-26 10:25:36 +08:00
hahwu
e7e59cf739 订单优化 2025-09-25 11:36:31 +08:00
hahwu
f07499aa6c 订单优化 2025-09-24 19:08:23 +08:00
hahwu
4566a4fa4b 订单优化 2025-09-24 14:46:55 +08:00
hahwu
1886d56013 宠物宝藏bug修复 2025-09-23 18:13:53 +08:00
hahwu
1b259919f7 订单优化 2025-09-23 17:56:18 +08:00
hahwu
66a40023e6 订单优化 2025-09-23 17:31:32 +08:00
hahwu
1da1ddf48a 自动订单优化 2025-09-23 14:57:51 +08:00
hahwu
ddc051eebc 订单修改 2025-09-23 12:09:02 +08:00
hahwu
3b9eba9a48 当装饰品订单完成之后,将自动发射器产物重新纳入自动订单 2025-09-23 10:50:08 +08:00
hahwu
153493bd40 订单bug修复 2025-09-22 16:35:09 +08:00
hahwu
0c4104de41 订单bug修复 2025-09-22 15:54:12 +08:00
hahwu
6c78877c6a 订单bug修复 2025-09-22 14:12:48 +08:00
hahwu
dddf7d3953 订单价格修改 2025-09-22 10:56:35 +08:00
hahwu
e11c24cc34 订单优化 2025-09-19 18:21:34 +08:00
hahwu
f14a49e072 棋子商店bug修复 2025-09-19 17:32:16 +08:00
hahwu
849a75709c 订单bug修复 2025-09-19 16:23:18 +08:00
hahwu
237a4c8d61 bug修复 2025-09-19 15:11:35 +08:00
hahwu
95a4c869ff 日志打点 2025-09-19 12:09:39 +08:00
hahwu
c1137f6a72 打点优化 2025-09-19 10:53:58 +08:00
hahwu
687437dcb4 订单优化 2025-09-19 09:46:37 +08:00
hahwu
30a9d6c6eb 订单优化 2025-09-18 19:19:32 +08:00
hahwu
f064cda204 订单优化 2025-09-18 19:09:14 +08:00
hahwu
d4a7447ae9 订单优化 2025-09-18 19:00:21 +08:00
hahwu
fef69f6edb 订单bug修复 2025-09-18 18:23:01 +08:00
hahwu
e5cd774cc8 订单优化 2025-09-18 17:06:33 +08:00
hahwu
c87b55d74b bug修复 2025-09-18 16:26:49 +08:00
hahwu
103b70d5e8 playroom修复 2025-09-18 16:23:44 +08:00
hahwu
af7afadf29 订单优化 2025-09-18 16:10:04 +08:00
hahwu
7c43add304 订单优化 2025-09-18 16:07:10 +08:00
hahwu
e65861c49f 订单优化 2025-09-18 15:29:08 +08:00
hahwu
21cbfd6d82 playroom装饰修复 2025-09-17 16:37:20 +08:00
hahwu
b189bd633c 时间线 2025-09-17 15:02:00 +08:00
hahwu
0108996dd4 气泡 2025-09-17 14:27:38 +08:00
hahwu
3aa1c3543e 订单优化 2025-09-17 11:53:18 +08:00
hahwu
119b26b3d9 气泡 2025-09-17 11:02:14 +08:00
hahwu
d80567c7b7 气泡 2025-09-17 10:58:16 +08:00
hahwu
ae5a2e5732 日志打点 2025-09-17 10:50:43 +08:00
hahwu
5b2813d875 订单优化 2025-09-16 18:55:42 +08:00
hahwu
1d0a1f17b4 订单优化 2025-09-16 18:51:37 +08:00
hahwu
9fddde1ec3 订单优化 2025-09-16 18:46:17 +08:00
hahwu
17bd48f9fd 时间线气泡 2025-09-16 17:09:33 +08:00
hahwu
e0f5d67ee6 订单逻辑优化 2025-09-16 17:07:06 +08:00
hahwu
169078a545 增加时间线:参与好友寻宝 2025-09-16 14:17:24 +08:00
hahwu
9ca619c75c 订单异常报警 2025-09-16 12:13:04 +08:00
hahwu
c869bfbec2 订单异常报警 2025-09-16 11:34:03 +08:00
hahwu
e43b18b34a 订单优化 2025-09-15 10:19:08 +08:00
hahwu
72ad6c5893 优化 2025-09-12 14:21:44 +08:00
hahwu
8be09db21c 优化 2025-09-12 11:04:11 +08:00
hahwu
35b6f72d30 补偿邮件 2025-09-11 23:03:33 +08:00
hahwu
35d3fb5e81 生成自动发射器满级订单时,不在生成对应产物的订单 2025-09-11 22:19:41 +08:00
hahwu
05dd4e3ab7 棋子商店优化 2025-09-11 20:39:27 +08:00
hahwu
a3665587e4 棋子商店优化 2025-09-11 20:37:16 +08:00
hahwu
c3da735fe3 优化 2025-09-11 18:08:53 +08:00
hahwu
eebc7bcdce gm优化 2025-09-11 17:58:57 +08:00
hahwu
4512648ae7 无尽礼包优化 2025-09-11 17:54:23 +08:00
hahwu
d80d7adce5 发射器退隐优化 2025-09-11 16:02:48 +08:00
hahwu
94ea5b5751 装饰bug修复 2025-09-11 15:01:44 +08:00
hahwu
5ecdfd81bd 订单优化 2025-09-11 14:13:24 +08:00
hahwu
1344325fcc 订单优化 2025-09-11 11:38:42 +08:00
hahwu
938d586ebf 优化 2025-09-11 11:04:03 +08:00
hahwu
daff3f15a1 订单优化 2025-09-11 10:59:39 +08:00
hahwu
55b80c9135 订单优化 2025-09-11 10:42:18 +08:00
hahwu
9317aea2e3 订单修复 2025-09-10 19:08:29 +08:00
hahwu
558e443427 增加道具类型114 2025-09-10 18:37:56 +08:00
hahwu
acfcd08d38 订单优化 2025-09-10 16:57:45 +08:00
hahwu
b6d5cbd5e2 新手任务bug修复 2025-09-10 14:21:52 +08:00
hahwu
f91ae551a0 一键建造修改 2025-09-10 12:13:28 +08:00
hahwu
871d2c564a 订单难度调整 2025-09-10 11:30:58 +08:00
hahwu
e6b1bbd127 20250910补偿 2025-09-10 11:19:23 +08:00
hahwu
f28a9e7454 20250910补偿 2025-09-10 11:11:38 +08:00
hahwu
786c5d941d 订单bug修复 2025-09-10 10:36:29 +08:00
hahwu
829a26dce0 测试 2025-09-10 10:20:14 +08:00
hahwu
41fe5c1c2c 拜访优化 2025-09-09 18:09:40 +08:00
hahwu
40becaa198 装饰修复 2025-09-09 18:00:51 +08:00
hahwu
416a1067da 修复 2025-09-09 16:55:04 +08:00
hahwu
30e11d1b50 优化 2025-09-09 15:23:57 +08:00
hahwu
302420b724 优化 2025-09-09 15:20:21 +08:00
hahwu
35499f2177 优化 2025-09-09 11:44:33 +08:00
hahwu
cca8a27f9a 订单优化 2025-09-09 11:23:33 +08:00
hahwu
dda545ad0d 优化 2025-09-08 17:16:53 +08:00
hahwu
cf4b4370e0 调试 2025-09-08 16:30:51 +08:00
hahwu
273d32d658 优化 2025-09-08 15:53:41 +08:00
hahwu
51246def30 新手任务优化 2025-09-08 15:31:24 +08:00
hahwu
53a5f0693f 优化 2025-09-08 15:08:58 +08:00
hahwu
66ca58f075 初始装饰零件写死 2025-09-08 14:38:01 +08:00
hahwu
3d9e697c04 增加GM 2025-09-08 12:14:10 +08:00
hahwu
475be1e5ae 增加GM 2025-09-08 11:52:19 +08:00
hahwu
e53a023276 增加满级产物订单 2025-09-08 11:46:49 +08:00
hahwu
56fbd7ad3f 发射器条件修改 2025-09-08 11:40:50 +08:00
hahwu
91e9ebaea0 取消免费体力 2025-09-05 18:06:59 +08:00
hahwu
6f26efa8a5 优化 2025-09-05 10:04:47 +08:00
hahwu
d4104881c0 订单优化 2025-09-04 15:18:37 +08:00
hahwu
08a6960c9d 订单优化 2025-09-04 15:04:19 +08:00
hahwu
0d649cc9b5 订单优化 2025-09-04 14:35:58 +08:00
hahwu
ecc3aec6af 新订单类型 2025-09-04 12:25:26 +08:00
hahwu
1602e3ded8 订单修复 2025-09-04 12:23:27 +08:00
hahwu
6ee551123f 修复 2025-09-03 18:20:36 +08:00
hahwu
2b601c6d52 零件消耗优化 2025-09-03 17:51:36 +08:00
hahwu
2d3c42bcb5 bug修复 2025-09-03 16:22:16 +08:00
hahwu
40f6fe40cd 优化 2025-09-03 16:07:48 +08:00
hahwu
445cee80f6 棋子商店修改 2025-09-03 14:49:53 +08:00
hahwu
cb4235baf7 订单bug修复 2025-09-03 09:54:05 +08:00
hahwu
14fd275cd9 装饰零件 2025-09-02 16:51:47 +08:00
hahwu
72edb784fd 订单优化 2025-09-02 15:41:54 +08:00
hahwu
d64fe56c22 优化 2025-09-02 12:10:31 +08:00
hahwu
9fec847b36 订单逻辑修改 2025-09-01 16:11:19 +08:00
hahwu
3759505847 修复 2025-09-01 15:30:23 +08:00
hahwu
2bd18208d4 优化 2025-08-29 16:35:21 +08:00
hahwu
de8777777b 优化 2025-08-29 16:04:08 +08:00
hahwu
f54d558db5 优化 2025-08-29 15:59:57 +08:00
hahwu
31ed67dbed 任务优化 2025-08-29 15:32:41 +08:00
hahwu
c3feafc38c 钻石消耗任务 2025-08-29 15:05:45 +08:00
hahwu
d5470cd69e 优化 2025-08-29 12:03:45 +08:00
hahwu
58be1191c5 playroom拜访解锁等级 2025-08-29 10:24:54 +08:00
hahwu
4c9ebf13bb 棋子商店 2025-08-28 15:56:15 +08:00
hahwu
9e64882298 优化 2025-08-28 11:43:56 +08:00
hahwu
4d4611fb04 发射器退役 2025-08-28 11:39:17 +08:00
hahwu
c1c30dc936 固定订单优化 2025-08-28 11:09:51 +08:00
hahwu
c869a2a3d5 装饰优化 2025-08-27 14:26:33 +08:00
hahwu
754f52febf 订单bug修复 2025-08-27 14:21:00 +08:00
hahwu
3d19b8ba7f 订单优化 2025-08-27 12:08:00 +08:00
hahwu
c7f6ab790b 新手任务中的登录任务特殊处理 2025-08-27 11:32:11 +08:00
hahwu
0721c28dfc 订单优化 2025-08-27 11:22:16 +08:00
hahwu
9bd9ca7fd8 修复 2025-08-26 17:56:27 +08:00
hahwu
bc23153c40 bug修复 2025-08-26 17:26:26 +08:00
hahwu
25a9032e6d 装饰优化 2025-08-26 17:21:39 +08:00
hahwu
e00a2292ae 固定订单,新手任务 2025-08-26 11:59:12 +08:00
hahwu
2446ba6a23 固定订单 2025-08-26 11:36:36 +08:00
hahwu
bedc0fdbdc 新手任务 2025-08-26 10:27:15 +08:00
hahwu
787041b6ec 新手任务 2025-08-26 09:58:06 +08:00
hahwu
9dde6ce4a7 每日任务 2025-08-25 17:49:10 +08:00
hahwu
4bd9ecdec2 新手任务 2025-08-25 16:13:43 +08:00
hahwu
50036af6a1 新手任务 2025-08-25 16:10:39 +08:00
hahwu
810067c37a 新手任务 2025-08-25 11:42:09 +08:00
hahwu
d8e361ccc2 零件协议 2025-08-22 16:47:13 +08:00
hahwu
9d44143c90 bug优化 2025-08-21 14:59:24 +08:00
hahwu
daccee5ba4 订单bug优化 2025-08-20 18:21:01 +08:00
hahwu
dfe2931ab2 优化 2025-08-20 16:27:20 +08:00
hahwu
03d584c12c 猫咪怪盗优化 2025-08-20 15:55:18 +08:00
hahwu
d84266817f Gm优化 2025-08-20 15:27:01 +08:00
hahwu
4f24b30ba8 宠物怪盗优化 2025-08-19 15:43:37 +08:00
hahwu
c65ba4d019 回收日bug修复 2025-08-18 17:11:15 +08:00
hahwu
0b6b730ae5 日志优化 2025-08-18 16:33:53 +08:00
hahwu
0e526cadfd playroom优化 2025-08-15 17:58:04 +08:00
hahwu
3cfef77824 playroom优化 2025-08-15 17:42:24 +08:00
hahwu
58729f6500 playroom优化 2025-08-15 17:21:13 +08:00
hahwu
5d61834398 优化 2025-08-15 15:51:40 +08:00
hahwu
0f535a2aea playroom优化 2025-08-15 11:31:08 +08:00
hahwu
e79d7b6729 playroom优化 2025-08-15 11:24:00 +08:00
hahwu
bf34ec773a 优化 2025-08-15 10:11:56 +08:00
hahwu
6679f1638b 日志优化 2025-08-11 15:55:07 +08:00
hahwu
f8d4ee070c 日志优化 2025-08-11 15:52:43 +08:00
hahwu
8c002f7092 开包bug修复 2025-08-04 10:45:53 +08:00
hahwu
8e0947b054 优化 2025-07-30 20:32:12 +08:00
hahwu
3853663616 封号功能 2025-07-30 15:40:45 +08:00
hahwu
0b3961adc4 封号功能 2025-07-30 15:33:55 +08:00
hahwu
9faaaf86e2 封号功能 2025-07-30 15:14:59 +08:00
hahwu
618fc63604 封号优化 2025-07-30 15:02:37 +08:00
hahwu
c9b6c86139 封号功能 2025-07-30 12:03:51 +08:00
hahwu
35a6ae35ee 禁用GM 2025-07-30 11:48:47 +08:00
hahwu
18d6797e56 时间线气泡优化 2025-07-30 11:42:04 +08:00
hahwu
de6aa4db37 优化 2025-07-30 11:16:20 +08:00
hahwu
4b5788d8a3 修复 2025-07-30 11:12:23 +08:00
hahwu
47d4112999 优化时间线奖励 2025-07-30 11:01:23 +08:00
hahwu
659e9dc135 优化初始资源 2025-07-30 10:40:45 +08:00
hahwu
cd687ee1e2 猫咪戏法修改 2025-07-29 18:46:23 +08:00
hahwu
6118aba235 猫咪戏法修改 2025-07-29 16:32:56 +08:00
hahwu
fd246374da 卡牌优化 2025-07-29 15:55:03 +08:00
hahwu
fcca991555 卡牌优化 2025-07-29 15:30:12 +08:00
hahwu
dce5b214ba gm优化 2025-07-29 10:24:04 +08:00
hahwu
5f214e2cb1 playroom优化 2025-07-28 12:24:40 +08:00
hahwu
265038b8cb playroom优化 2025-07-28 10:38:24 +08:00
hahwu
34ab97fb30 禁用GM指令 2025-07-28 09:59:35 +08:00
hahwu
0a4ad94306 增加playroom广告观看次数限制 2025-07-25 18:22:34 +08:00
hahwu
6ca18ac8f4 增加黑名单 2025-07-25 15:43:11 +08:00
hahwu
d836d785b4 猫草大作战 2025-07-24 12:08:49 +08:00
hahwu
de62790ff4 playroombug修复 2025-07-23 17:37:27 +08:00
hahwu
9cf0b15ec3 修复playroom转盘bug 2025-07-23 16:53:37 +08:00
hahwu
7c23a004c0 修复playroom普通奖励 2025-07-23 16:44:39 +08:00
hahwu
bab980b508 playroom装扮任务优化 2025-07-23 16:16:28 +08:00
hahwu
87c715cb84 修复playroom转盘bug 2025-07-23 15:46:18 +08:00
hahwu
04a9ca69c9 修改转盘奖励 2025-07-22 15:40:29 +08:00
hahwu
489a1ed7bc 限时事件修复 2025-07-22 15:31:19 +08:00
hahwu
22ce441bcc 信息修复 2025-07-22 10:09:42 +08:00
hahwu
54e283ed06 邮件修复 2025-07-18 18:50:15 +08:00
hahwu
3fbf00c41c debug 2025-07-18 18:46:36 +08:00
hahwu
af28ca49a5 debug 2025-07-18 18:43:13 +08:00
hahwu
c490034238 后台优化 2025-07-18 18:21:24 +08:00
hahwu
4ef8aa86dc 猫草大作战 2025-07-18 18:07:36 +08:00
hahwu
45f3e27de2 头像优化 2025-07-18 11:18:11 +08:00
hahwu
5155c77997 小猪存钱修复 2025-07-17 16:43:35 +08:00
hahwu
c513cb0255 修复触发邮件 2025-07-17 16:36:48 +08:00
hahwu
cbeac8fd2a Revert "增加定时同步"
This reverts commit 0bab2987ed.
2025-07-17 16:04:45 +08:00
hahwu
0bab2987ed 增加定时同步 2025-07-17 16:03:05 +08:00
hahwu
e4dd46c0f7 playroom优化 2025-07-17 15:36:56 +08:00
hahwu
6852df7484 后台优化 2025-07-17 14:58:06 +08:00
hahwu
e9ed6f0228 后台优化 2025-07-17 14:55:21 +08:00
hahwu
667f81f99d 后台优化 2025-07-17 14:52:45 +08:00
hahwu
da8eefca45 后台优化 2025-07-17 14:30:02 +08:00
hahwu
e05fa5fbcf 后台优化 2025-07-17 14:19:09 +08:00
hahwu
d39d1d206c playroom优化 2025-07-17 10:05:59 +08:00
hahwu
0e327d9373 playroom优化 2025-07-17 09:40:48 +08:00
hahwu
a3e70e6bf1 补偿优化 2025-07-16 19:29:53 +08:00
hahwu
42e908a36a playroom优化 2025-07-16 18:57:29 +08:00
hahwu
170a30be23 优化 2025-07-16 18:55:40 +08:00
hahwu
7a2f4de850 playroom优化 2025-07-16 18:37:12 +08:00
hahwu
f125c77a0d 优化 2025-07-16 17:25:52 +08:00
hahwu
22efb95048 优化 2025-07-16 17:23:00 +08:00
hahwu
a3d1d25bd1 Gm修复 2025-07-16 17:21:42 +08:00
hahwu
e402917a85 优化 2025-07-16 17:13:32 +08:00
hahwu
8a1461d4af 邮件补偿20250717 2025-07-16 16:40:42 +08:00
hahwu
cd05ef1935 邮件补偿20250717 2025-07-16 16:19:49 +08:00
hahwu
e4abe4ead6 playroom优化 2025-07-16 11:55:28 +08:00
hahwu
59ec90f4ba playroom表情 2025-07-15 18:39:53 +08:00
hahwu
c58c35c9ed 优化日志 2025-07-15 16:42:57 +08:00
hahwu
b142411fc5 好友邀请码 2025-07-14 17:01:29 +08:00
hahwu
0765eaf13c playroom优化 2025-07-14 16:19:36 +08:00
hahwu
6f7280e8b5 好友邀请码 2025-07-14 16:13:22 +08:00
hahwu
1d22f2052e 优化 2025-07-11 17:58:44 +08:00
hahwu
12a8e16d0a 幸运猫优化 2025-07-11 17:06:16 +08:00
hahwu
83309a3c83 幸运猫优化 2025-07-11 16:50:07 +08:00
hahwu
642703bc6a 不能申请自己为好友 2025-07-10 18:30:49 +08:00
hahwu
da2ae614f3 限时事件优化 2025-07-10 11:31:15 +08:00
hahwu
e8b91b8dd9 优化 2025-07-09 17:56:12 +08:00
hahwu
a77015015e playroom优化 2025-07-08 18:21:40 +08:00
hahwu
054cbdf1e8 playroom过滤今天已拜访过的好友 2025-07-08 17:57:32 +08:00
hahwu
1714e9d27e playroom优化 2025-07-08 17:33:19 +08:00
hahwu
d77a9f7e43 playroom推荐优化 2025-07-08 17:09:31 +08:00
hahwu
2677c1c7bc 类型优化 2025-07-07 14:55:49 +08:00
hahwu
5df6d959d8 playroom优化 2025-07-07 14:40:23 +08:00
hahwu
853e7775f9 装饰套装 2025-07-07 11:07:30 +08:00
hahwu
82ec411046 订单优化 2025-07-07 10:58:29 +08:00
hahwu
ca0581553c 限时事件优化 2025-07-04 19:15:31 +08:00
hahwu
eaa8a32b00 playroom优化 2025-07-04 10:36:12 +08:00
hahwu
97c2c06c9a 好友搜索优化 2025-07-04 09:46:04 +08:00
hahwu
4972439ad6 时间优化 2025-07-03 18:32:09 +08:00
hahwu
a6493487c4 日志记录 2025-07-03 17:18:19 +08:00
hahwu
e8bce4c167 卡牌优化 2025-07-03 17:04:08 +08:00
hahwu
01c8479ad8 装饰优化 2025-07-03 14:34:49 +08:00
hahwu
c5f974a39d 时间线优化 2025-07-02 15:24:29 +08:00
hahwu
989f68174a 时间线优化 2025-07-02 11:40:52 +08:00
hahwu
9d3f3bf6d7 特惠礼包优化 2025-07-02 10:54:30 +08:00
hahwu
b59093dfbb 优化 2025-07-01 16:50:40 +08:00
hahwu
c2f8b7d9e4 增加调试GM 2025-07-01 16:47:23 +08:00
hahwu
673026b2ba 增加调试GM 2025-07-01 16:45:23 +08:00
hahwu
b6d7913727 优化 2025-07-01 16:42:10 +08:00
hahwu
1cc633b5ac 邀请好友界面,Lily已经是玩家好友了,视为获得了已邀请了一位好友(后续添加其他NPC好友不计数) 2025-07-01 14:47:15 +08:00
hahwu
0c56cbd224 宠物宝藏优化 2025-07-01 12:17:29 +08:00
hahwu
02b7884357 订单优化 2025-07-01 11:27:25 +08:00
hahwu
d79476b0d2 排行榜优化 2025-07-01 10:21:42 +08:00
hahwu
505f9a0dd6 优化排行榜 2025-06-30 18:50:41 +08:00
hahwu
12764c1070 特惠礼包修复 2025-06-30 17:08:02 +08:00
hahwu
53b065dd38 卡牌交换优化 2025-06-30 15:49:51 +08:00
hahwu
9f69ebb15d 好友搜索优化 2025-06-30 15:27:42 +08:00
hahwu
c19a82f119 校验修复 2025-06-30 12:08:18 +08:00
hahwu
8916d8489d 卡牌优化 2025-06-30 11:06:51 +08:00
hahwu
bb826fdf47 日志优化,增加30条上限 2025-06-27 19:23:08 +08:00
hahwu
4fee81001b 时间线刷新 2025-06-27 18:12:24 +08:00
hahwu
2af6165372 时间线刷新 2025-06-27 17:56:41 +08:00
hahwu
ee22dd9770 时间线优化 2025-06-27 17:52:50 +08:00
hahwu
a51e37490b 验证码登录优化 2025-06-27 17:19:53 +08:00
hahwu
0fb9c56de9 playroom优化 2025-06-27 17:10:37 +08:00
hahwu
2fe1c75c4e 每日任务优化 2025-06-27 15:39:12 +08:00
hahwu
7b086e99d2 退役订单优化 2025-06-27 12:10:44 +08:00
hahwu
cc3c693dc8 playroom优化 2025-06-24 18:39:33 +08:00
hahwu
acf3a58515 优化 2025-06-24 17:20:46 +08:00
hahwu
e0ea39d02c 订单修复 2025-06-24 15:36:57 +08:00
hahwu
23a60155c0 验证码优化 2025-06-24 11:25:43 +08:00
hahwu
f3d088fa4d 验证码测试 2025-06-24 09:40:44 +08:00
hahwu
1870c4979d 验证码测试 2025-06-23 11:19:11 +08:00
hahwu
b6f28d7266 充值记录优化 2025-06-23 10:12:19 +08:00
hahwu
a574dabfe9 日常任务在首日特殊任务结束之后才开启计数 2025-06-23 09:58:41 +08:00
hahwu
3f6ea08963 宠物宝藏优化 2025-06-23 09:48:19 +08:00
hahwu
c1bc68bc43 优化 2025-06-19 17:38:39 +08:00
hahwu
a1a5d735d4 登录优化 2025-06-19 12:29:29 +08:00
hahwu
52e1427b08 修改宠物怪盗优化 2025-06-19 10:47:38 +08:00
hahwu
c6b40c145c 验证码登录 2025-06-18 15:25:50 +08:00
hahwu
64531f94f4 增加身份证校验 2025-06-18 14:12:25 +08:00
hahwu
9ffd430ae3 增加场景奖励 2025-06-17 16:36:41 +08:00
hahwu
f6838d7bb9 卡牌优化 2025-06-17 11:35:11 +08:00
hahwu
6f36ee8920 bug修复 2025-06-17 11:08:05 +08:00
hahwu
031d22d195 kafka修复 2025-06-17 11:00:53 +08:00
hahwu
72b4d08d93 增加了使用设别号登录 2025-06-17 10:24:10 +08:00
hahwu
97350e8bde 补充登录和身份证校验逻辑 2025-06-16 10:37:41 +08:00
hahwu
9326a2a75c playroom优化 2025-06-13 17:42:15 +08:00
hahwu
230b53e990 playroom优化 2025-06-11 17:23:27 +08:00
hahwu
90bf326cf1 订单优化 2025-06-11 16:56:18 +08:00
hahwu
3fb89c3947 playroom优化 2025-06-11 16:28:56 +08:00
hahwu
4212d46663 kafka优化 2025-06-11 15:59:01 +08:00
hahwu
1976d60e35 优化 2025-06-11 15:58:44 +08:00
hahwu
6722304746 bug修复 2025-06-11 15:25:47 +08:00
hahwu
7bd781f032 bug修复 2025-06-11 14:54:20 +08:00
hahwu
43a27e9eba 日志优化 2025-06-11 14:29:14 +08:00
hahwu
db9fb4ad85 增加GM命令 2025-06-11 11:29:43 +08:00
hahwu
61b4fe2c4e bug修复 2025-06-10 09:58:09 +08:00
hahwu
5ebb0daa01 订单优化 2025-06-06 19:24:49 +08:00
hahwu
6b1da9b2fb 订单优化 2025-06-06 18:43:37 +08:00
hahwu
2754c5b787 限时事件优化 2025-06-06 18:02:20 +08:00
hahwu
41531e52fb 限时事件优化 2025-06-06 15:55:22 +08:00
hahwu
bc1e788bd9 限时事件优化 2025-06-06 11:24:38 +08:00
hahwu
1145fd63ba playroom优化 2025-06-05 17:43:42 +08:00
hahwu
5bc2d37de3 playroom优化 2025-06-05 17:34:02 +08:00
hahwu
7f034659e3 playroom优化 2025-06-05 17:26:46 +08:00
hahwu
61d865d6c5 优化 2025-06-05 17:17:13 +08:00
hahwu
dd5e04ed9f 拜访点数 2025-06-05 11:07:49 +08:00
hahwu
ca7becb3d4 拜访点数 2025-06-05 11:06:59 +08:00
hahwu
f2517b95bd playroom优化 2025-06-05 10:34:05 +08:00
hahwu
d881f0e679 playroom优化 2025-06-05 10:19:31 +08:00
hahwu
bda7e96e30 bug修复 2025-06-04 19:00:12 +08:00
hahwu
3ac2336e76 登录天数bug修复 2025-06-04 18:57:25 +08:00
hahwu
5b2f8552e8 增加登录天数 2025-06-03 14:58:15 +08:00
hahwu
0be7aa3422 装饰bug修复 2025-06-03 11:50:07 +08:00
hahwu
0896004185 装饰增加宠物经验 2025-06-03 11:23:53 +08:00
hahwu
af29896e76 装饰增加宠物经验 2025-06-03 10:21:53 +08:00
hahwu
4e50670358 订单优化 2025-05-30 19:10:38 +08:00
hahwu
7b9bf73b1a 邮件优化 2025-05-30 18:58:13 +08:00
hahwu
bde44a8a6d 宠物订单优化 2025-05-30 18:41:54 +08:00
hahwu
e7971ae3f6 宠物订单优化 2025-05-30 18:41:32 +08:00
hahwu
dd9b66b368 充值优化 2025-05-30 18:26:15 +08:00
hahwu
b95f655b66 宠物订单优化 2025-05-30 18:15:51 +08:00
hahwu
2ff05589c5 增加服务端版本 2025-05-30 15:19:40 +08:00
hahwu
6c95148a63 宠物订单 2025-05-30 15:03:29 +08:00
hahwu
43da244384 playroom修复 2025-05-30 14:37:30 +08:00
hahwu
6437df189b 宠物币礼包 2025-05-30 11:31:10 +08:00
hahwu
f7089c55a7 取消触发式订单 2025-05-30 10:40:27 +08:00
hahwu
17343a432e 增加额外的经验条 2025-05-29 18:15:26 +08:00
hahwu
42e9b73764 增加额外的经验条 2025-05-29 18:09:02 +08:00
hahwu
5341353003 playroom优化 2025-05-29 17:52:00 +08:00
hahwu
9c9c19c9a6 订单撤销功能的逻辑调整(这块逻辑注释掉) 2025-05-29 16:10:54 +08:00
hahwu
2ef0c6fabe playroom优化 2025-05-28 18:15:15 +08:00
hahwu
461312dc87 宠物互动的数值衰减,要从玩家签完领养证明之后才开始 2025-05-28 18:11:49 +08:00
hahwu
87983240aa playroom优化 2025-05-28 17:53:07 +08:00
hahwu
78b36ce4d4 playroom优化 2025-05-28 15:52:05 +08:00
hahwu
1cb7532d8b playroom优化 2025-05-28 15:39:12 +08:00
hahwu
ea66010137 登录协议修复 2025-05-28 11:53:25 +08:00
hahwu
38bf34520a 优化playroom点赞 2025-05-27 18:51:45 +08:00
hahwu
7a03d82fcd 增加房间解锁流水 2025-05-27 18:29:35 +08:00
hahwu
812402526a 拜访机制调整 2025-05-27 17:44:46 +08:00
hahwu
322b0e1926 NPC好友优化 2025-05-27 11:34:20 +08:00
hahwu
075ba32e99 修改密码 2025-05-27 10:44:21 +08:00
hahwu
0786f52259 登录返回优化 2025-05-26 18:55:34 +08:00
hahwu
d04f482da1 登录返回优化 2025-05-26 18:51:28 +08:00
hahwu
6df9903bc9 优化登录返回 2025-05-26 18:30:33 +08:00
hahwu
8ea3efb33a 优化订单接口 2025-05-22 10:14:00 +08:00
hahwu
4255f95a12 playroom优化 2025-05-21 16:07:23 +08:00
hahwu
b4dfeb2a09 playroom优化 2025-05-16 16:26:10 +08:00
hahwu
a7fef8e6f1 小猫戏法优化 2025-05-16 14:18:21 +08:00
hahwu
735adeeac3 小猫戏法优化 2025-05-16 12:10:23 +08:00
hahwu
09879e9a4a 小猫戏法优化 2025-05-16 11:08:44 +08:00
hahwu
d066b8b979 高级订单优化 2025-05-15 11:48:03 +08:00
hahwu
220d2bfc10 邮件优化 2025-05-14 16:35:53 +08:00
hahwu
f0416cbb1f 招财猫优化 2025-05-14 16:35:42 +08:00
hahwu
0fab14a138 增加playroom引导奖励 2025-05-12 17:27:37 +08:00
hahwu
c5d7f55543 playroom优化 2025-05-09 17:23:33 +08:00
hahwu
a910950e45 playroom优化 2025-05-09 16:46:50 +08:00
hahwu
37275d64fb 修复升级棋子图鉴刷新 2025-05-09 15:34:19 +08:00
hahwu
a5866339b4 增加GM 2025-05-08 14:18:10 +08:00
hahwu
64d166fa7e 优化 2025-05-07 11:25:55 +08:00
hahwu
4b37daa27a playroom点赞加道具 2025-04-29 18:29:32 +08:00
hahwu
ed1364c21e 去好友家小猫玩游戏,成功之后如果选产物,都额外加5猫币奖励 2025-04-29 18:05:23 +08:00
hahwu
0935f089e4 增加玩家全服数据 2025-04-29 14:55:12 +08:00
hahwu
b20f111cbb 增加玩家全服数据 2025-04-29 14:38:50 +08:00
hahwu
38d6f14b95 增加玩家全服数据 2025-04-29 14:20:01 +08:00
hahwu
c50e176e6c playroom优化 2025-04-29 10:14:18 +08:00
hahwu
924cd98b5c playroom优化 2025-04-28 18:29:39 +08:00
hahwu
a341917c7e 调试优化 2025-04-28 18:29:28 +08:00
hahwu
3a86736040 增加playroominfo 点赞次数 2025-04-28 17:32:52 +08:00
hahwu
5ac7ba79aa 猫咪戏法优化 2025-04-28 10:38:33 +08:00
hahwu
985f5ad0c9 猜颜色活动优化 2025-04-27 15:54:28 +08:00
hahwu
8522a99dd6 playroom优化 2025-04-25 16:37:55 +08:00
hahwu
3dedb5f21f 优化facebook解绑 2025-04-25 16:22:32 +08:00
hahwu
eadb885126 playroom优化 2025-04-25 14:27:27 +08:00
hahwu
e4cb8bfd5e 增加GM 2025-04-25 14:11:53 +08:00
hahwu
43bbdc6f6c 招财猫优化 2025-04-24 18:53:03 +08:00
hahwu
d022641ff2 playroom每日任务 2025-04-24 16:16:24 +08:00
hahwu
787bec91cc playroom每日任务 2025-04-24 16:08:38 +08:00
hahwu
7e6ebb205b playroom每日任务 2025-04-24 15:03:43 +08:00
hahwu
23df24e0dd playroom每日任务 2025-04-24 14:42:52 +08:00
hahwu
35c8ca8f82 playroom每日任务 2025-04-24 10:06:35 +08:00
hahwu
75a6048ca4 playroom每日任务 2025-04-23 18:37:49 +08:00
hahwu
69c8fabc68 playroom每日任务 2025-04-23 15:45:39 +08:00
hahwu
7e59299731 playroom每日任务 2025-04-23 15:07:39 +08:00
hahwu
44ca22a924 招财猫优化 2025-04-23 11:47:26 +08:00
hahwu
7a1a12d530 招财猫优化 2025-04-23 10:46:31 +08:00
hahwu
76b60c892a 任务修复 2025-04-22 17:29:41 +08:00
hahwu
e37366c71a 任务修复 2025-04-22 16:56:04 +08:00
hahwu
d3f859ab8e 任务修复 2025-04-22 16:51:47 +08:00
hahwu
eac8c6b4d2 playroom每日任务 2025-04-22 11:33:07 +08:00
hahwu
a3dc973d91 引导订单修复 2025-04-22 10:16:24 +08:00
hahwu
6b8c141e51 playroom每日任务 2025-04-21 16:33:47 +08:00
hahwu
6b93915fb5 时间线优化 2025-04-21 16:23:43 +08:00
hahwu
7d61511c32 playroom每日任务 2025-04-21 15:56:10 +08:00
hahwu
7e6039f16a 时间线优化 2025-04-21 15:47:36 +08:00
hahwu
839aea3cfa 时间线优化 2025-04-21 15:35:34 +08:00
hahwu
f95a049c90 GM命令 2025-04-21 15:19:26 +08:00
hahwu
f659a1880f 时间线优化 2025-04-21 12:26:49 +08:00
hahwu
ed0890f9d2 时间线优化 2025-04-21 12:13:15 +08:00
hahwu
6139208d0e playroom房间点数 2025-04-21 10:58:38 +08:00
hahwu
cd3edb76fb 猫咪小学徒 2025-04-21 10:08:12 +08:00
hahwu
6e4a804079 回收日优化 2025-04-18 17:22:23 +08:00
hahwu
07781cfa63 playroom优化 2025-04-18 16:52:56 +08:00
hahwu
fefac439c8 猫咪戏法优化 2025-04-18 11:23:36 +08:00
hahwu
8ff8c7f34a 猫咪戏法优化 2025-04-18 11:15:56 +08:00
hahwu
cd38d8cb43 优化 2025-04-18 09:41:27 +08:00
hahwu
0801743ee0 playroom优化 2025-04-17 19:11:32 +08:00
hahwu
20e6023c5e playroom优化 2025-04-17 19:09:30 +08:00
hahwu
331ec61294 系统优化 2025-04-17 10:51:29 +08:00
hahwu
cf7401791e 邮件优化 2025-04-17 10:45:01 +08:00
hahwu
9227881d57 限时事件优化 2025-04-17 10:43:53 +08:00
hahwu
2b771fa30c 邮件优化 2025-04-17 10:30:05 +08:00
hahwu
51b612aed8 配置优化 2025-04-17 10:04:27 +08:00
hahwu
e7fa1bf25d 优化 2025-04-16 19:11:11 +08:00
hahwu
53e305e9d3 日志优化 2025-04-16 19:08:36 +08:00
hahwu
564c650a28 猫咪戏法修复bug 2025-04-16 18:59:23 +08:00
hahwu
4b74c69df4 捉迷藏修复 2025-04-16 17:14:17 +08:00
hahwu
61f50a8e61 增加GM 2025-04-11 18:27:07 +08:00
hahwu
befdbd75a4 增加GM 2025-04-11 18:20:51 +08:00
hahwu
10b45a9992 优化 2025-04-11 11:53:11 +08:00
hahwu
3bcd2d0b70 优化 2025-04-11 10:02:34 +08:00
hahwu
bfd29f02c4 优化 2025-04-11 10:00:29 +08:00
hahwu
01e7a90efd 引导订单优化 2025-04-10 19:08:29 +08:00
hahwu
e3628c77b7 好友优化 2025-04-10 18:22:51 +08:00
hahwu
6dca79233c 好友优化 2025-04-10 17:55:45 +08:00
hahwu
9d08ae6d33 优化 2025-04-10 16:49:57 +08:00
hahwu
19ebb2d6b6 好友优化 2025-04-10 16:21:19 +08:00
hahwu
46b93a0a5d 优化 2025-04-10 16:09:07 +08:00
hahwu
4a7a02238b playroom点赞 2025-04-10 11:58:36 +08:00
hahwu
ed67514159 日志优化 2025-04-10 11:56:26 +08:00
hahwu
674af65789 playroom点赞 2025-04-10 11:54:40 +08:00
hahwu
454e428697 头像框优化 2025-04-10 11:52:43 +08:00
hahwu
8ffd149d12 多语言邮件 2025-04-10 11:38:53 +08:00
hahwu
6c33c83033 npc好友优化 2025-04-10 10:04:46 +08:00
hahwu
8a521a5d43 三段竞赛优化 2025-04-10 09:49:55 +08:00
hahwu
c100fe828c 飞书通知优化 2025-04-07 16:24:40 +08:00
hahwu
6d7168caa4 超值加购礼包 2025-04-03 16:07:38 +08:00
hahwu
993b1b20b7 赛跑活动 2025-04-02 17:20:45 +08:00
hahwu
56d3b6d53a 赛跑活动 2025-04-02 16:22:23 +08:00
hahwu
4ddde1b2e9 赛跑优化 2025-04-02 14:43:19 +08:00
hahwu
c430dd8cae 邮件优化 2025-04-02 14:41:25 +08:00
hahwu
e8264aa348 赛跑优化 2025-04-02 12:31:02 +08:00
hahwu
4b009814f9 邮件优化 2025-04-02 12:11:43 +08:00
hahwu
e5e75f9436 心愿单活动 2025-04-02 09:56:58 +08:00
hahwu
dd7840ffbd 赛车活动优化 2025-04-01 19:02:12 +08:00
hahwu
e93bd6b8aa 订单优化 2025-04-01 18:48:39 +08:00
hahwu
3adf049c92 赛车活动优化 2025-04-01 18:37:56 +08:00
hahwu
ece4e28731 订单优化 2025-04-01 18:37:16 +08:00
hahwu
21e1c63d0d 优化 2025-04-01 17:53:48 +08:00
hahwu
a311e6ca03 限时事件 回收日 2025-04-01 17:50:47 +08:00
hahwu
bd5176db26 心愿单 2025-04-01 17:19:40 +08:00
hahwu
f5995941af 接口优化 2025-04-01 16:24:30 +08:00
hahwu
80d0aa0996 心愿单 2025-04-01 16:21:43 +08:00
hahwu
0084b32f0f 赠送礼物 2025-04-01 15:11:56 +08:00
hahwu
5f1889c753 订单优化 2025-04-01 12:24:30 +08:00
hahwu
e37c130cc0 赠送礼物 2025-04-01 12:13:13 +08:00
hahwu
29fa052ae9 赠送礼物 2025-04-01 11:18:22 +08:00
hahwu
df19eaaf9f 限时事件+NPC好友 2025-04-01 10:17:07 +08:00
hahwu
ee5781df40 日志监控 2025-04-01 10:15:20 +08:00
hahwu
5ec5b42430 小猫戏法 2025-03-31 17:46:56 +08:00
hahwu
69dc7d638a 赛跑活动 2025-03-31 15:53:25 +08:00
hahwu
71eafdecb0 赛跑活动 2025-03-31 15:47:16 +08:00
hahwu
534d00a975 夏令时优化 2025-03-31 10:10:03 +08:00
hahwu
c7a5363a75 优化 2025-03-28 15:38:19 +08:00
hahwu
e32a09bcd3 优化 2025-03-28 14:57:08 +08:00
hahwu
0f5bb01aec 好友优化 2025-03-28 14:37:06 +08:00
hahwu
0c1ec3ce50 订单优化 2025-03-28 14:34:21 +08:00
hahwu
4e0023ec85 优化 2025-03-28 12:30:27 +08:00
hahwu
cb66894d3f 优化 2025-03-28 12:28:54 +08:00
hahwu
328ebf9399 优化 2025-03-28 12:10:26 +08:00
hahwu
278ee8c44a 消息优化 2025-03-28 11:01:00 +08:00
hahwu
815d896283 好友消息优化 2025-03-28 10:58:57 +08:00
hahwu
c86a66252d 好友消息 2025-03-28 10:53:19 +08:00
hahwu
4518a455a8 日志优化 2025-03-28 09:43:37 +08:00
hahwu
9e3d8e5f39 好友搜索优化 2025-03-27 19:09:37 +08:00
hahwu
4de86e2d61 图鉴优化 2025-03-27 16:56:12 +08:00
hahwu
b496fe07c2 幸运猫优化 2025-03-27 10:47:55 +08:00
hahwu
c94fbff299 优化 2025-03-27 10:44:18 +08:00
hahwu
46e75a50ca 日志 2025-03-27 10:23:44 +08:00
hahwu
5a91d9cbf0 debug 2025-03-27 10:20:56 +08:00
hahwu
32dbdf452c 补发邮件 2025-03-26 18:46:47 +08:00
hahwu
c019b57fde 活动补发邮件 2025-03-26 18:21:45 +08:00
hahwu
7797127879 好运猫优化 2025-03-26 17:52:25 +08:00
hahwu
5e4012965d 猜颜色优化 2025-03-26 16:59:48 +08:00
hahwu
3d697cadfc 卡牌优化 2025-03-26 16:45:50 +08:00
hahwu
6402dedefa 卡牌优化 2025-03-26 16:43:27 +08:00
hahwu
0b64edf79a 幸运猫优化 2025-03-26 16:32:34 +08:00
hahwu
d6bdbf08f9 优化 2025-03-26 16:31:54 +08:00
hahwu
31f935f1b9 猜颜色优化 2025-03-26 14:52:07 +08:00
hahwu
4763b05981 优化 2025-03-26 11:32:34 +08:00
hahwu
bd767da106 优化 2025-03-26 09:51:35 +08:00
hahwu
a803e6c284 playroom优化 2025-03-26 09:48:02 +08:00
hahwu
5e6e29cca9 playroom优化 2025-03-25 19:01:57 +08:00
hahwu
5d70b05a67 playroom优化 2025-03-25 17:37:17 +08:00
hahwu
c2a3f3c0ed playroom优化 2025-03-25 17:35:16 +08:00
hahwu
ca398c7df8 邮件触发 2025-03-25 17:32:46 +08:00
hahwu
9d76a84624 设置语言 2025-03-25 17:20:18 +08:00
hahwu
496940caa3 邮件触发 2025-03-25 17:15:37 +08:00
hahwu
f527918672 gm 2025-03-25 15:38:11 +08:00
hahwu
92070b9c75 猜颜色 2025-03-25 14:55:24 +08:00
hahwu
b650706f2f 猜颜色优化 2025-03-25 14:51:50 +08:00
hahwu
de271d25ef 猜颜色 2025-03-25 11:39:18 +08:00
hahwu
a9e52dc1e6 用户点赞 2025-03-25 10:51:34 +08:00
hahwu
cb62a1f662 活动bug修复 2025-03-24 17:41:54 +08:00
hahwu
0c335a1a47 猜颜色优化 2025-03-24 16:17:02 +08:00
hahwu
7ae38d5cf9 活动礼包 2025-03-24 15:22:45 +08:00
hahwu
774a44d561 活动优化 2025-03-24 15:20:44 +08:00
hahwu
4d376505fd 活动优化 2025-03-24 15:09:39 +08:00
hahwu
e1810b7188 招财猫优化 2025-03-24 15:09:23 +08:00
hahwu
348cf17068 买一赠一礼包 2025-03-24 14:53:40 +08:00
hahwu
defff755a3 招财猫优化 2025-03-24 12:20:39 +08:00
hahwu
33e4ff1c55 活动优化 2025-03-21 16:21:56 +08:00
hahwu
bd9cce0536 日志优化 2025-03-20 17:53:45 +08:00
hahwu
6846d45765 系统优化 2025-03-20 15:47:57 +08:00
hahwu
283cba2255 挖矿优化 2025-03-20 15:32:37 +08:00
hahwu
ff7954f500 挖矿优化 2025-03-20 15:06:26 +08:00
hahwu
d4f32d23a6 修复seed订单异常 2025-03-20 09:47:03 +08:00
hahwu
fd96ad4eeb 限时事件优化 2025-03-19 18:37:07 +08:00
hahwu
54611a0a96 系统优化 2025-03-19 18:33:52 +08:00
hahwu
daf7152619 系统优化 2025-03-19 18:20:16 +08:00
hahwu
903559ca2a 系统优化 2025-03-19 18:00:30 +08:00
hahwu
4190880b15 系统优化 2025-03-19 17:52:31 +08:00
hahwu
13eb99f410 系统优化 2025-03-19 17:42:49 +08:00
hahwu
c3798e7a29 系统优化 2025-03-19 17:28:46 +08:00
hahwu
fcb838fa9a 系统优化 2025-03-19 17:24:52 +08:00
hahwu
29e3061fc7 宠物宝藏优化 2025-03-19 17:20:37 +08:00
hahwu
cd9afa8c7e 宠物宝藏 2025-03-19 16:42:14 +08:00
hahwu
6f1ab4c1e0 系统优化 2025-03-19 16:20:31 +08:00
hahwu
76fd55d1d5 1 2025-03-19 15:52:14 +08:00
hahwu
8325ce66f2 系统优化 2025-03-19 15:44:50 +08:00
hahwu
32e37f5bd4 订单优化 2025-03-19 14:16:58 +08:00
hahwu
a59a667a46 系统优化 2025-03-19 12:27:12 +08:00
hahwu
3ef9e724c4 宠物宝藏 2025-03-19 12:11:24 +08:00
hahwu
bfb9649462 宠物宝藏 2025-03-19 12:04:48 +08:00
hahwu
e7e8f3aad8 宠物宝藏优化 2025-03-19 10:50:59 +08:00
hahwu
7dcdfbb06a 捉迷藏小游戏 2025-03-18 14:37:24 +08:00
hahwu
df9cf9d44d 幸运猫 2025-03-18 12:22:27 +08:00
hahwu
a91952b796 playroom优化 2025-03-18 11:44:51 +08:00
hahwu
5d00d87e18 优化 2025-03-18 11:31:35 +08:00
hahwu
6e0d3a2709 优化图鉴收集功能 2025-03-18 11:14:32 +08:00
hahwu
5d160f71ef 招财猫 2025-03-18 10:56:48 +08:00
hahwu
d693b6d314 收藏室优化 2025-03-17 20:10:36 +08:00
hahwu
9e7be7ce01 增加GM 2025-03-17 19:46:03 +08:00
hahwu
67b7f09a6a 高级订单修复 2025-03-17 17:47:47 +08:00
hahwu
c485317d8f 全球排行榜优化 2025-03-17 15:52:10 +08:00
hahwu
c73add3bba 增加头像,表情奖励 2025-03-17 15:37:56 +08:00
hahwu
4499df0b43 修复每日任务奖励bug 2025-03-17 15:00:45 +08:00
hahwu
6cdb186f6d 发射器退役bug 2025-03-17 12:19:04 +08:00
hahwu
83305772e4 playroom优化 2025-03-17 11:02:45 +08:00
hahwu
03f153c45b 升级器解锁图鉴 2025-03-17 09:50:14 +08:00
hahwu
054be4f843 棋盘优化 2025-03-14 18:17:41 +08:00
hahwu
c51e7d2ac6 棋盘背包优化 2025-03-14 17:48:29 +08:00
hahwu
0ae51244ec 订单调整 2025-03-14 11:51:18 +08:00
hahwu
c38f192aa9 订单调整 2025-03-14 11:30:15 +08:00
hahwu
f96355a239 动态订单调整 2025-03-14 11:01:04 +08:00
hahwu
5b1b870358 动态订单调整 2025-03-14 10:59:38 +08:00
hahwu
7fc47d72ee 单元测试 2025-03-14 09:48:25 +08:00
hahwu
5496f1df45 Seed订单机制 2025-03-13 12:25:04 +08:00
hahwu
ad529697e9 收藏室更新 2025-03-12 17:18:13 +08:00
hahwu
30d86ce06b 增加收藏室GM 2025-03-12 17:01:05 +08:00
hahwu
7d0a5b1c89 收藏室增加日志 2025-03-12 16:46:23 +08:00
hahwu
56f9db57ef 每日任务更新 2025-03-12 16:37:26 +08:00
hahwu
4f5adaab9b 日志优化 2025-03-12 12:14:42 +08:00
hahwu
20622df1da 升级器 2025-03-11 18:16:05 +08:00
hahwu
49229e74d3 系统优化 2025-03-11 16:27:17 +08:00
hahwu
4679941755 新增每日任务 2025-03-11 16:15:29 +08:00
hahwu
498e8c24f5 套餐优惠礼包 2025-03-11 15:47:16 +08:00
hahwu
2e04fe3164 收藏室优化 2025-03-11 12:04:08 +08:00
hahwu
002aabaeba 功能优化 2025-03-11 10:59:13 +08:00
hahwu
fd0939df7f 高级订单优化 2025-03-10 17:42:05 +08:00
hahwu
9f968554cb 收藏室优化 2025-03-10 17:40:04 +08:00
hahwu
040481cdde 高级产物订单 2025-03-10 15:58:09 +08:00
hahwu
76ab00b1c6 开放高级产物订单 2025-03-10 15:40:57 +08:00
hahwu
43b1b8e955 收藏室 2025-03-10 15:21:17 +08:00
hahwu
5435ffbed5 收藏室 2025-03-10 14:21:24 +08:00
hahwu
665f818f22 收藏室 2025-03-10 14:15:20 +08:00
hahwu
2ae7bb8d5a 增加GM 2025-03-10 11:22:55 +08:00
hahwu
fe15155400 系统优化 2025-03-07 15:43:44 +08:00
hahwu
780f501941 表情优化 2025-03-06 17:25:35 +08:00
hahwu
d8c9347fea 表情优化 2025-03-06 17:13:22 +08:00
hahwu
61a083658a 功能优化 2025-03-06 16:48:49 +08:00
hahwu
668703d3f4 图鉴附属点赞功能 2025-03-06 11:13:42 +08:00
hahwu
65eb41e01a 升级器 2025-03-06 10:15:10 +08:00
hahwu
163cdf68ff 表情优化 2025-03-06 09:37:38 +08:00
hahwu
dc7634e385 表情优化 2025-03-05 17:40:49 +08:00
hahwu
ab01c7248d 日志优化 2025-03-05 10:10:52 +08:00
hahwu
1f1381bd8b 系统优化 2025-02-28 11:18:41 +08:00
hahwu
bca1e62368 优化 2025-02-27 18:57:24 +08:00
hahwu
a7305f66dc 系统优化 2025-02-27 17:35:52 +08:00
hahwu
3bdf9850b9 连击快手优化 2025-02-27 16:09:39 +08:00
hahwu
b8525b762e 连击快手优化 2025-02-27 12:17:43 +08:00
hahwu
05d9872bd7 连击快手优化 2025-02-27 11:39:04 +08:00
hahwu
5b995c9694 连击快手优化 2025-02-27 11:10:08 +08:00
hahwu
70ab147a3d 宠物宝藏优化 2025-02-26 17:06:31 +08:00
hahwu
822477f49a 后台功能优化 2025-02-25 14:15:34 +08:00
hahwu
ede1b50b2c 后台功能优化 2025-02-25 12:28:49 +08:00
hahwu
732d732027 后台功能优化 2025-02-25 12:23:33 +08:00
hahwu
f65abd6ff6 后台功能优化 2025-02-25 10:52:51 +08:00
hahwu
0aead0b14d 数数打点修复 2025-02-24 16:15:28 +08:00
hahwu
1b3a08da0b 数数打点修复 2025-02-24 16:09:34 +08:00
hahwu
d69d466651 表情功能开发 2025-02-24 15:49:15 +08:00
hahwu
a2e79d0962 表情功能开发 2025-02-24 15:07:18 +08:00
hahwu
caa096e79c 日志优化 2025-02-24 11:58:53 +08:00
hahwu
fc3619a16d 修改断线重连 2025-02-21 18:06:32 +08:00
hahwu
4304401960 playroom优化 2025-02-21 14:53:23 +08:00
hahwu
e5a3d04ea2 bug修复 2025-02-21 14:34:26 +08:00
hahwu
0340e3dd83 支付校验优化 2025-02-21 10:11:39 +08:00
hahwu
aaa4f5e805 优化sql语句 2025-02-21 10:10:43 +08:00
hahwu
357d1b468f 框架结构优化 2025-02-20 12:19:26 +08:00
hahwu
f8ce894ab6 playroom优化 2025-02-18 12:25:16 +08:00
hahwu
61b5b091b9 修复订单bug 2025-02-17 19:09:21 +08:00
hahwu
7b0d9be8c1 playroom商店 2025-02-17 15:31:07 +08:00
hahwu
9f1187962e 公共模块优化 2025-02-17 15:25:23 +08:00
hahwu
cd5203b8f6 playroom bug 2025-02-17 12:05:52 +08:00
hahwu
eb312084f1 playroom bug 2025-02-17 11:45:54 +08:00
hahwu
6426cf266d playroom bug 2025-02-17 11:37:29 +08:00
hahwu
774a7bd2b7 playroom bug 2025-02-17 11:31:44 +08:00
hahwu
d7a39e9635 好友消息优化 2025-02-17 11:16:45 +08:00
hahwu
10a058967d 优化日志 2025-02-17 10:20:53 +08:00
hahwu
a9763d5aab 1 2025-02-17 10:14:52 +08:00
hahwu
e21196906a 增加账号拷贝GM 2025-02-14 17:50:21 +08:00
hahwu
e27b59283e 后台GM命令 2025-02-14 14:38:15 +08:00
hahwu
4b0a9e50c3 后台GM命令 2025-02-14 14:30:42 +08:00
hahwu
140a7dc72b 后台GM命令 2025-02-14 14:27:53 +08:00
hahwu
4b6920be1d 后台GM命令 2025-02-14 11:32:25 +08:00
hahwu
f62e7b3dc9 数数打点 2025-02-14 11:10:13 +08:00
hahwu
9b8e26892f 日志优化 2025-02-14 10:28:18 +08:00
hahwu
2d51971ff1 好友bug优化 2025-02-13 17:12:21 +08:00
hahwu
bf38f7d5c6 修复能量倍数bug 2025-02-13 14:59:00 +08:00
hahwu
4dfe224ac1 卡牌优化 2025-02-13 14:49:54 +08:00
hahwu
908eea82f7 日志优化 2025-02-13 14:15:08 +08:00
hahwu
2c68486e08 逻辑错误发送到飞书 2025-02-12 14:56:48 +08:00
hahwu
862d885d21 逻辑错误发送到飞书 2025-02-12 12:21:54 +08:00
hahwu
a1056a5556 逻辑错误发送到飞书 2025-02-12 11:41:49 +08:00
hahwu
e7ccaf65d2 playroom bug修复 2025-02-12 10:11:20 +08:00
hahwu
0c12dd7bc7 优化离线时间 2025-02-11 18:12:13 +08:00
hahwu
8d6834ac1f 优化离线时间 2025-02-11 18:09:10 +08:00
hahwu
c04d31d778 优化离线时间 2025-02-11 17:37:28 +08:00
hahwu
fbcef69695 禁用高级产物订单 2025-02-11 15:46:08 +08:00
hahwu
db64339ea6 增加配置重载 2025-02-11 15:27:53 +08:00
hahwu
d9cf7c8237 增加配置重载 2025-02-11 15:12:13 +08:00
hahwu
7c63dff032 修复高级产物bug 2025-02-11 11:16:06 +08:00
hahwu
6e1c9d42d3 订单优化 2025-02-11 10:55:47 +08:00
hahwu
b60261c1c1 功能优化 2025-02-11 10:35:20 +08:00
hahwu
d464813ed7 playroom优化 2025-02-11 10:34:21 +08:00
hahwu
0a4b895e14 数数打点 2025-02-10 15:54:07 +08:00
hahwu
8a3c76231d 游戏功能优化 2025-02-10 15:15:32 +08:00
hahwu
4dc0d503b3 邮件功能优化 2025-02-10 11:32:50 +08:00
hahwu
2511e26486 邮件功能优化 2025-02-10 11:25:30 +08:00
hahwu
14628ba7e6 邮件功能优化 2025-02-10 11:09:07 +08:00
hahwu
1c9d024b1e 邮件功能优化 2025-02-10 10:56:08 +08:00
hahwu
a1e0c487fe playroom修复bug 2025-02-10 10:09:44 +08:00
hahwu
25bbf06444 playroom优化 2025-02-08 17:09:14 +08:00
hahwu
09ef04565b 配置更新 2025-02-08 15:52:20 +08:00
hahwu
18e40fa78e 邮件功能优化 2025-02-08 15:52:01 +08:00
hahwu
c464275763 高级产物处理机制 2025-02-08 10:45:18 +08:00
hahwu
fe6cffa6e4 playroom bug修复 2025-02-08 10:30:47 +08:00
hahwu
e52432ec1a bug修复 2025-02-08 10:10:17 +08:00
hahwu
3a3d79624a 修改GM 2025-02-07 15:09:29 +08:00
hahwu
ff818441f7 playroom优化 2025-02-07 14:58:10 +08:00
hahwu
6893138df0 修改GM 2025-02-07 14:34:20 +08:00
hahwu
7c64006080 翻倍掉档配置 2025-02-07 11:59:50 +08:00
hahwu
15e1f476ed 收集所有卡牌,补发图鉴奖励 2025-02-07 11:05:11 +08:00
hahwu
328b101d05 playroom优化 2025-02-07 10:30:11 +08:00
hahwu
ca0efb53dd playroom优化 2025-02-06 19:18:44 +08:00
hahwu
0db815ba45 日志 2025-02-06 19:04:58 +08:00
hahwu
4b5b936a18 playroom优化 2025-02-06 19:04:15 +08:00
hahwu
47c3ccda89 数数埋点 2025-02-06 19:03:59 +08:00
hahwu
935e890db2 数数埋点 2025-02-06 17:38:31 +08:00
hahwu
26be4af8a7 playroom优化 2025-02-06 17:26:17 +08:00
hahwu
51ffa2449b playroom优化 2025-02-06 16:54:18 +08:00
hahwu
8ee28c28e2 邮件补偿 2025-02-06 11:44:04 +08:00
hahwu
3c31586879 playroom优化 2025-02-06 11:43:55 +08:00
hahwu
331a46e5ce 数数埋点 2025-02-05 16:36:52 +08:00
hahwu
7e96008168 优化日志 2025-02-05 11:06:20 +08:00
hahwu
91ab7b1861 锦标赛优化 2025-01-24 19:30:21 +08:00
hahwu
e405207ea8 订单优化 2025-01-24 18:28:35 +08:00
hahwu
f23133e394 一键高级号 2025-01-24 17:40:42 +08:00
hahwu
ce2eaa49fd 日志 2025-01-24 15:22:52 +08:00
hahwu
dbf06fa9e5 锦标赛日志 2025-01-24 14:05:34 +08:00
hahwu
a0417ad241 优化订单逻辑 2025-01-24 12:29:05 +08:00
hahwu
966e996ae0 优化数据收取 2025-01-24 12:07:05 +08:00
hahwu
0e3997eb0b 优化数据收取 2025-01-24 12:00:12 +08:00
hahwu
2c3b420743 修复棋子出售bug 2025-01-24 11:30:21 +08:00
hahwu
19ac59a26f 小猪存钱罐优化 2025-01-24 11:07:45 +08:00
hahwu
4feea55788 支付校验 2025-01-24 10:50:45 +08:00
hahwu
8e386659e2 vendor 2025-01-24 10:24:07 +08:00
hahwu
c8cdd1f2cf 日志优化 2025-01-24 10:18:57 +08:00
hahwu
629855c2b7 死循环优化 2025-01-23 17:33:32 +08:00
hahwu
7a5bb87b9e Revert "系统优化"
This reverts commit f7a9ab3be1.
2025-01-23 17:13:54 +08:00
hahwu
f7a9ab3be1 系统优化 2025-01-23 17:05:48 +08:00
hahwu
33ce4eba43 debug日志 2025-01-23 16:38:01 +08:00
hahwu
512a7e977f debug日志 2025-01-23 16:21:45 +08:00
hahwu
bc61b4520e 修复宝箱雨奖励 2025-01-23 15:34:04 +08:00
hahwu
f675b35cf6 能量倍数bug修复 2025-01-23 15:13:12 +08:00
hahwu
ecca89df16 日常任务优化 2025-01-23 15:05:46 +08:00
hahwu
64e006c603 同一个卡包内不能开出重复卡牌 2025-01-23 11:55:51 +08:00
hahwu
9bf4933ec6 棋子商店优化 2025-01-23 11:41:57 +08:00
hahwu
55200f6bbe debug日志 2025-01-23 10:22:30 +08:00
hahwu
5331ceea99 锦标赛bug修复 2025-01-23 10:17:37 +08:00
hahwu
f0c6b07c66 好友优化 2025-01-22 18:54:10 +08:00
hahwu
15508345ca 好友优化 2025-01-22 18:47:48 +08:00
hahwu
a3b4937469 好友优化 2025-01-22 18:21:17 +08:00
hahwu
3860669bfe 好友优化 2025-01-22 17:51:20 +08:00
hahwu
8c3ca0e3a5 卡牌赛季初奖励 2025-01-22 17:41:08 +08:00
hahwu
ca4ddc283f 第一个限时事件bonus写死为“猫咪旋风” 2025-01-22 17:06:08 +08:00
hahwu
316da899e7 宝箱雨bug修复 2025-01-22 15:51:35 +08:00
hahwu
b6dd03ce6a 安慰订单链 2025-01-22 15:03:31 +08:00
hahwu
30af5939ba 超级订单修复 2025-01-22 11:39:46 +08:00
hahwu
ce145f8215 facebook修复 2025-01-22 11:25:07 +08:00
hahwu
9e97c0c32b 能量倍数修复 2025-01-22 11:06:43 +08:00
hahwu
8c5a8d78cf 更新协议 2025-01-22 11:03:51 +08:00
hahwu
b2b9a8c2f9 facebook优化 2025-01-22 11:01:17 +08:00
hahwu
77e686f97d 修改GM命令 2025-01-22 10:40:16 +08:00
hahwu
dff9671f74 日志修复 2025-01-22 09:49:57 +08:00
hahwu
71cac1cb38 日志 2025-01-21 19:31:16 +08:00
hahwu
06dd7b4aa6 facebook优化 2025-01-21 19:31:15 +08:00
hahwu
5808380440 facebook优化 2025-01-21 19:31:15 +08:00
hahwu
a562733d9f facebook优化 2025-01-21 19:07:10 +08:00
hahwu
3d13c78896 Gm 2025-01-21 19:05:45 +08:00
hahwu
c230556d9b facebook优化 2025-01-21 18:59:53 +08:00
hahwu
4b1af9f589 锦标赛系数调整 2025-01-21 18:57:55 +08:00
hahwu
f2aca21e9a facebook优化 2025-01-21 18:43:28 +08:00
hahwu
146db7a84f facebook优化 2025-01-21 18:26:33 +08:00
hahwu
f687b4f19a facebook处理 2025-01-21 17:54:24 +08:00
hahwu
155a9a06c3 debug日志 2025-01-21 17:32:15 +08:00
hahwu
27588b2b74 bug修复 2025-01-21 17:03:03 +08:00
hahwu
f6243d164c 修改倍数highRoller到期下调倍数 2025-01-21 16:47:17 +08:00
hahwu
5f647da1ac 修改倍数highRoller到期下调倍数 2025-01-21 16:45:13 +08:00
hahwu
06f177031b 订单支付优化 2025-01-21 16:14:59 +08:00
hahwu
fad68b78dc 订单优化 2025-01-21 16:08:19 +08:00
hahwu
02c916c11b facebook优化 2025-01-21 15:30:57 +08:00
hahwu
eea0ed6cdb 优化 2025-01-21 15:10:32 +08:00
hahwu
2caa12d4af 支付优化 2025-01-21 15:06:50 +08:00
hahwu
8ddaa2c95d 宝箱雨优化 2025-01-21 14:36:32 +08:00
hahwu
1c6c515e03 支付优化 2025-01-21 12:26:24 +08:00
hahwu
6f91c8892f 小猪存钱优化 2025-01-21 11:29:22 +08:00
hahwu
b8de7d7da7 宝箱雨优化 2025-01-21 09:56:05 +08:00
hahwu
64c3285b5d playroom优化 2025-01-20 18:47:23 +08:00
hahwu
3571c8947c 支付优化 2025-01-20 17:45:23 +08:00
hahwu
1324f775d0 支付优化 2025-01-20 17:42:35 +08:00
hahwu
5617ed1e82 优化GM 2025-01-20 16:53:22 +08:00
hahwu
ff5c8bc777 只保存15天以内的日志文件 2025-01-20 14:58:05 +08:00
hahwu
326fc96371 修改后台接口 2025-01-20 11:59:11 +08:00
hahwu
2a3a7ffa81 修改棋子商店钻石公式 2025-01-20 11:13:01 +08:00
hahwu
795cd6ee96 playroom增加0点更新 2025-01-20 11:01:12 +08:00
hahwu
b1f9e44746 先禁用高级产物处理 2025-01-20 10:06:57 +08:00
hahwu
b42609e0a0 playroom优化 2025-01-20 10:05:31 +08:00
hahwu
4b4bbdc080 订单逻辑修改 2025-01-18 19:13:59 +08:00
hahwu
1bebf0ddc2 修改记录 2025-01-18 19:12:04 +08:00
hahwu
f9490379cc 修改日志 2025-01-18 19:10:55 +08:00
hahwu
90734285f2 修复订单调整bug 2025-01-18 17:23:22 +08:00
hahwu
01ca01eecf 修复订单调整bug 2025-01-18 17:13:14 +08:00
hahwu
e88166b64d 修复订单调整bug 2025-01-18 16:59:29 +08:00
hahwu
62cd9b8ef4 打包文件 2025-01-18 16:11:33 +08:00
hahwu
5e6b3b4f87 修复订单调整bug 2025-01-18 16:01:33 +08:00
hahwu
1e091de9b3 高级产物处理机制 2025-01-17 17:41:59 +08:00
hahwu
156b9da2d3 基准测试 2025-01-17 16:50:38 +08:00
hahwu
c04d345970 支付日志 2025-01-17 11:30:03 +08:00
hahwu
a61eb69a0f 修改订单逻辑 2025-01-17 10:45:37 +08:00
hahwu
d26720a9c2 修改订单逻辑 2025-01-17 09:55:59 +08:00
hahwu
d4c01061aa 更新日志 2025-01-16 15:49:50 +08:00
hahwu
ea134948f6 优化日志 2025-01-16 15:14:37 +08:00
hahwu
e3870ec10a 修改订单逻辑 2025-01-16 14:40:55 +08:00
hahwu
555d46e623 修改订单逻辑 2025-01-16 12:34:16 +08:00
hahwu
f778132175 增加日志 2025-01-17 00:01:09 +08:00
hahwu
4dbc0f3b54 修改订单逻辑 2025-01-15 18:51:14 +08:00
hahwu
80b6bddd65 修改bonus bug 2025-01-15 18:31:14 +08:00
hahwu
bcd7743073 修改bonus bug 2025-01-15 18:17:46 +08:00
hahwu
553fdef352 修改订单逻辑 2025-01-15 16:55:10 +08:00
hahwu
74948cd917 订单发货修复 2025-01-15 16:24:35 +08:00
hahwu
c6c884b232 修改订单逻辑 2025-01-15 16:07:27 +08:00
hahwu
e8fd0d9953 修改订单逻辑 2025-01-15 14:29:09 +08:00
hahwu
83bfb64d49 修改订单逻辑 2025-01-15 10:23:07 +08:00
hahwu
e0e6731d4f 修改订单逻辑 2025-01-15 09:51:15 +08:00
hahwu
741a389ebd 修改订单逻辑 2025-01-14 19:03:14 +08:00
hahwu
169378ff01 修改bug 2025-01-14 18:46:15 +08:00
hahwu
d96b05a2aa 修改订单逻辑 2025-01-14 18:39:34 +08:00
hahwu
affc20bf9f 修改订单逻辑 2025-01-14 17:59:42 +08:00
hahwu
e3fe8db5f4 增加分离器 2025-01-14 10:56:08 +08:00
hahwu
282fd732f1 增加分离器 2025-01-14 10:53:08 +08:00
hahwu
0d3b0733d2 当棋盘中有订单棋子时不对其进行调整 2025-01-14 10:38:09 +08:00
hahwu
599e4b40d1 日志 2025-01-13 17:47:02 +08:00
hahwu
eb6a8777a0 预热订单优化 2025-01-13 16:57:17 +08:00
hahwu
11845fd598 修改订单发货接口 2025-01-13 16:47:32 +08:00
hahwu
4a8a953247 预热订单优化 2025-01-13 16:29:44 +08:00
hahwu
c480c4d66a 增加请求玩家资产接口 2025-01-13 16:20:57 +08:00
hahwu
30c1b4414b 竞标赛优化 2025-01-13 15:54:55 +08:00
hahwu
886e026d17 增加定时增加能量流水 2025-01-13 15:26:14 +08:00
hahwu
6c60f90518 优化日志 2025-01-13 15:14:21 +08:00
hahwu
2b6b25bf80 增加注册日志 2025-01-13 14:52:31 +08:00
hahwu
3d70bfac4c 预热订单优化 2025-01-13 14:12:57 +08:00
hahwu
18e22b4f1e 预热订单优化 2025-01-13 12:14:49 +08:00
hahwu
356358f011 优化kafka日志 2025-01-13 11:11:51 +08:00
hahwu
e93bcc02b1 优化kafka日志 2025-01-13 10:58:04 +08:00
hahwu
fd96d805af 增加playroom道具购买接口 2025-01-13 10:41:53 +08:00
hahwu
a69ea709a3 修改支付发货接口 2025-01-11 12:02:17 +08:00
hahwu
163336bc0f 增加后台接口 2025-01-10 18:09:48 +08:00
hahwu
4aac987725 优化kafka日志 2025-01-10 17:18:26 +08:00
hahwu
11a93fa7e3 创建订单号 2025-01-10 15:16:26 +08:00
hahwu
e4690f1235 创建订单号 2025-01-10 15:07:52 +08:00
hahwu
328477628d 创建订单号 2025-01-10 14:58:34 +08:00
hahwu
a520e17de1 增加开启资源宝箱接口 2025-01-10 11:05:47 +08:00
hahwu
35b0bf57a7 看广告获取体力 2025-01-09 17:22:46 +08:00
hahwu
bf3ba5c6d8 增加玩家nickname记录 2025-01-08 15:53:11 +08:00
hahwu
a6b5e94b24 kafka增加断线重连功能 2025-01-08 15:23:05 +08:00
hahwu
0b60ff67ce 修复冠军赛0点更新bug 2025-01-08 14:56:08 +08:00
hahwu
80e1a2b9ca 修改GM 2025-01-08 11:19:46 +08:00
hahwu
a235b772b4 修复好友搜索bug 2025-01-08 11:10:54 +08:00
hahwu
c9b64db2bf 修复玩家基础信息 2025-01-08 11:03:21 +08:00
hahwu
61ad4fdab2 宝箱雨改版 2025-01-06 18:10:11 +08:00
hahwu
ef325d3b49 修复锦标赛bug 2025-01-06 17:56:47 +08:00
hahwu
6039251df3 修复锦标赛bug 2025-01-06 16:30:57 +08:00
hahwu
51f790cd62 宝箱雨改版 2025-01-06 16:22:55 +08:00
hahwu
662f61b437 宝箱雨改版 2025-01-06 15:44:11 +08:00
hahwu
ace4a53641 增加订单日志 2025-01-03 17:24:47 +08:00
hahwu
b2b9d8c818 禁用接口 2025-01-03 16:24:05 +08:00
hahwu
d79ff003ca 修改日志队列的长度 2025-01-03 15:17:36 +08:00
hahwu
9e46a815cf kafka重连 2025-01-03 15:12:07 +08:00
hahwu
4b6e5839ba 取消明文密码 2025-01-02 16:32:08 +08:00
hahwu
e6a87a6c04 配置重载优化 2025-01-02 16:08:26 +08:00
hahwu
db575f5bc0 修改DB配置 2025-01-02 10:16:15 +08:00
hahwu
e51aecbba8 增加功能解锁配置管理 2025-01-02 10:01:16 +08:00
hahwu
3d55a709f0 订单bug修改 2024-12-31 19:06:33 +08:00
hahwu
9a748cd008 增加周更新GM 2024-12-31 17:29:53 +08:00
hahwu
8312df445d 后台开发 2024-12-31 17:28:02 +08:00
hahwu
db07de59f9 日常任务周进度清理 2024-12-31 17:27:37 +08:00
hahwu
c310b60eca 代码优化 2024-12-31 14:38:22 +08:00
hahwu
e27526c635 修改变量名错误 2024-12-27 11:20:14 +08:00
hahwu
b0c687d0ad 增加猫咪旋风类型 2024-12-27 10:59:34 +08:00
hahwu
504a92cb43 优化卡牌图鉴初始化 2024-12-27 09:50:43 +08:00
hahwu
65790cbb02 卡牌图鉴 2024-12-26 19:05:59 +08:00
hahwu
281b8d0565 修复订单bug 2024-12-26 18:42:25 +08:00
hahwu
64f799102f 卡牌图鉴 2024-12-26 15:16:35 +08:00
hahwu
f35c05cc12 宠物宝藏修改 2024-12-26 14:20:13 +08:00
hahwu
aeccd787f0 bouns修复 2024-12-26 12:08:58 +08:00
hahwu
2260462017 卡牌图鉴 2024-12-26 11:59:01 +08:00
hahwu
01f1009473 卡牌图鉴 2024-12-26 11:49:15 +08:00
hahwu
7146014b0f 玩家数据bug优化 2024-12-26 11:49:01 +08:00
hahwu
e3752d3f08 优化playroom翻牌逻辑 2024-12-26 11:13:40 +08:00
hahwu
1b729145fe 玩家数据bug优化 2024-12-26 10:47:05 +08:00
hahwu
5a5b3a287a 增加客户端日志接口 2024-12-26 10:46:04 +08:00
hahwu
84de8d99f1 玩家数据bug优化 2024-12-26 10:12:08 +08:00
hahwu
2dc1515d48 限时事件优化 2024-12-26 10:11:48 +08:00
hahwu
c5f7ff602d 限时事件bounes优化 2024-12-25 17:34:52 +08:00
hahwu
7e03391514 限时事件,playroom优化 2024-12-25 17:07:08 +08:00
hahwu
7dff488a44 bug修复 2024-12-25 15:23:53 +08:00
hahwu
0d7eea6356 优化系统bug 2024-12-25 11:11:06 +08:00
hahwu
d5325f59e5 优化系统bug 2024-12-24 18:53:37 +08:00
hahwu
3d63153d66 修复bug 2024-12-24 12:04:59 +08:00
hahwu
a2139b3ad4 修复bug 2024-12-23 17:12:15 +08:00
hahwu
fcf3be65be 宠物宝藏 2024-12-23 11:35:13 +08:00
hahwu
2ac0f00d00 playroom 优化 2024-12-19 12:15:02 +08:00
hahwu
5fdbc830b9 playroom 优化 2024-12-19 12:11:51 +08:00
hahwu
b96b200c47 playroom 优化 2024-12-19 12:09:35 +08:00
hahwu
4b4f101369 优化日志写入 2024-12-18 15:25:39 +08:00
hahwu
2a4b54f6c6 playroom修改 2024-12-18 14:47:32 +08:00
hahwu
df99febd5f kafka 2024-12-18 09:50:37 +08:00
hahwu
6104d52803 修复playroom bug 2024-12-17 16:26:54 +08:00
hahwu
fc67916525 playroom bug修复 2024-12-17 15:03:09 +08:00
hahwu
4ea86a221e playroom接口 2024-12-17 09:52:54 +08:00
hahwu
fe97b5c31f 玩家回归奖励 2024-12-16 17:43:40 +08:00
hahwu
e63ca32171 优化 2024-12-16 15:04:03 +08:00
hahwu
b5eb216860 bug修复 2024-12-13 16:16:50 +08:00
hahwu
7e794dc2dc bug修复 2024-12-12 19:03:45 +08:00
hahwu
7c51add1a1 修复playroom, 商店bug 2024-12-12 18:29:57 +08:00
hahwu
3e809a4e7d 修复棋子商店bug, 发射器退役优化 2024-12-12 15:44:47 +08:00
hahwu
417024ce88 修复12点更新bug 2024-12-12 14:24:54 +08:00
hahwu
a88818c0d8 修复发射器退役bug, 锦标赛bug,优化0点更新逻辑 2024-12-12 14:22:15 +08:00
hahwu
a020d44b5c 修改playroom bug 2024-12-12 10:36:12 +08:00
hahwu
f4268d781a playroom, 发射器退役 2024-12-11 17:33:20 +08:00
hahwu
e5a7ae7182 更新playroom 2024-12-10 17:56:01 +08:00
hahwu
edfb3acea7 三段竞赛 2024-12-04 16:36:49 +08:00
hahwu
d3d7e44f2e 修复数据存储和订单逻辑 2024-12-04 15:03:08 +08:00
hahwu
5134ceb766 猜颜色活动 2024-12-04 10:23:56 +08:00
hahwu
0e65949997 更新挖矿功能 2024-12-03 15:30:16 +08:00
hahwu
a58675074a 更新项目 2024-12-02 16:42:56 +08:00
hahwu
859433eee7 代码整理 2024-11-29 17:10:47 +08:00
hahwu
83f33f24ec 项目更新 2024-11-29 15:05:48 +08:00
hahwu
f3d2f96181 项目更新 2024-11-29 10:51:04 +08:00
hahwu
3df1b09ac6 优化订单生成 2024-11-28 10:26:29 +08:00
hahwu
fbf8a5c257 更新代码 2024-11-27 19:17:32 +08:00
hahwu
0ab62a2a65 更新代码 2024-11-27 14:25:52 +08:00
hahwu
7655b2c96f 锦标赛优化 2024-11-26 17:17:14 +08:00
hahwu
1e345f4ca1 增加一键装饰 2024-11-25 18:22:29 +08:00
hahwu
6c05584404 万能卡 2024-11-25 17:29:59 +08:00
hahwu
10c0d7bea9 卡牌交换 2024-11-25 16:35:38 +08:00
hahwu
891d9f40c1 项目更新 2024-11-25 15:01:25 +08:00
hahwu
a516884a65 更新文件 2024-11-22 15:43:28 +08:00
2164 changed files with 41405 additions and 1006072 deletions

13
.gitignore vendored
View File

@ -10,3 +10,16 @@ src/server/log/
src/server/*.exe
src/server/gamedata/config/*.json
src/server/unit_test.go
src/server/teLog/*
src/server/teLog/log.2024-11-28
src/server/logs/ga_log/*.log
src/server/goroutine.prof
src/server/heap_after.pb.gz
src/server/test/logs/*
src/server/test/teLog/*
src/server/*.exe*
src/server/msg/Gameapi.pb.go
src/server/gen-go
src/server/GeoLite2-Country
src/server/test/GeoLite2-Country
src/server/msg/Gameapi_grpc.pb.go

View File

@ -1,179 +0,0 @@
package GoUtil
import (
"bytes"
"encoding/gob"
"math/rand"
"reflect"
"strconv"
"time"
)
// 实例化一个通过字符串映射函数切片的map
var eventByName = make(map[string][]*EventObj)
type EventObj struct {
Callback func([]interface{})
Obj interface{}
}
func (o *EventObj) isEqual(tar *EventObj) bool {
if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
return true
}
return false
}
// 注册事件,提供事件名和回调函数
func RegisterEvent(name string, callback func([]interface{}), Obj interface{}) {
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 通过名字查找事件列表
list := eventByName[name]
// 在列表切片中添加函数
list = append(list, eo)
// 将修改的事件列表切片保存回去
eventByName[name] = list
}
// 调用事件
func CallEvent(name string, param []interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
// 遍历这个事件的所有回调
for _, eo := range list {
// 传入参数调用回调
eo.Callback(param)
}
}
func RemoveEvent(name string, callback func([]interface{}), Obj interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
j := 0
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 遍历这个事件的所有回调
for _, v := range list {
if !v.isEqual(eo) {
list[j] = v
j++
}
}
eventByName[name] = list[:j]
// fmt.Println("len eventByName[name]:", len(eventByName[name]))
//fmt.Println("len eventByName[name]:", len(eventByName))
// fmt.Println("len list:", len(list))
}
func DeleteEleByValue(list []int, ele int) []int {
j := 0
for _, v := range list {
if v != ele {
list[j] = v
j++
}
}
ret := list[:j]
return ret
}
func BoolToInt32(b bool) int32 {
if b {
return 1
}
return 0
}
func IfTrue(a bool, b, c interface{}) interface{} {
if a {
return b
}
return c
}
func Int64(a interface{}) int64 {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return int64(v)
case int32:
return int64(v)
case int64:
return v
case float64:
return int64(v)
}
return 0
}
func Int(a interface{}) int {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return v
case int32:
return int(v)
case int64:
return int(v)
case float64:
return int(v)
case string:
r, err := strconv.Atoi(v)
if err != nil {
return 0
}
return r
}
return 0
}
func GobMarshal(data interface{}) ([]byte, error) {
var buf bytes.Buffer
encode := gob.NewEncoder(&buf)
err := encode.Encode(data)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func GobUnmarshal(data []byte, obj interface{}) error {
decode := gob.NewDecoder(bytes.NewReader(data))
err := decode.Decode(obj)
if err != nil {
return err
}
return nil
}
func GetServerIdByUid(uid int) int {
return int(uid / 100000)
}
func CreateOrderSn(uid int) string {
Now := time.Now()
return "order_" + strconv.Itoa(uid) + "_" + Now.Format("20060102150405") + RandString(6)
}
// 生成指定长度的随机字符串
func RandString(n int) string {
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
r := rand.New(rand.NewSource(time.Now().UnixNano()))
b := make([]byte, n)
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}

View File

@ -1,8 +0,0 @@
package GoUtil
func RandNum(start int, end int) int {
if start > end {
return 0
}
return start + GetRand().Intn(end-start+1)
}

View File

@ -1,172 +0,0 @@
package GoUtil
import (
"sort"
"strconv"
)
func IntToInt32(d []int) []int32 {
r := make([]int32, 0, len(d))
for _, d := range d {
r = append(r, int32(d))
}
return r
}
func RandPopSlice(slice []int) ([]int, int) {
slen := len(slice)
if slen == 0 {
return slice, -1
}
Id := GetRand().Intn(slen)
return append(slice[0:Id], slice[Id+1:]...), slice[Id]
}
func RandSlice(slice []int) int {
slen := len(slice)
if slen == 0 {
return 0
}
Id := GetRand().Intn(slen)
return slice[Id]
}
func RandSliceNum(slice []int, num int) []int {
r := make([]int, 0, num)
if num <= 0 || len(slice) < num {
return slice
}
for i := 0; i < num; i++ {
Id := GetRand().Intn(len(slice))
r = append(r, slice[Id])
slice = append(slice[0:Id], slice[Id+1:]...)
}
return r
}
func RandSliceNumNonAdjacent(slice []int, num int) []int {
if len(slice) < 2*num {
return nil
}
sort.Ints(slice)
result := make([]int, 0, num)
for len(result) < num {
Id := GetRand().Intn(len(slice))
result = append(result, slice[Id])
slice = SubAdjacentElemSlice(slice, Id)
}
return result
}
func SubAdjacentElemSlice(s []int, Id int) []int {
r := make([]int, 0, len(s))
for k, v := range s {
if k < Id-1 || k > Id+1 {
r = append(r, v)
}
}
return r
}
func RandStringSlice(slice []string) string {
slen := len(slice)
if slen == 0 {
return ""
}
Id := GetRand().Intn(slen)
return slice[Id]
}
func SliceStringToInt(s []string) []int {
if len(s) == 0 {
return []int{}
}
r := make([]int, 0, len(s))
for _, v := range s {
v1, _ := strconv.Atoi(v)
r = append(r, v1)
}
return r
}
func SliceIntToInt32(s []int) []int32 {
r := make([]int32, 0, len(s))
for _, v := range s {
r = append(r, int32(v))
}
return r
}
func PopElemSlice(s []int, Id int) ([]int, bool) {
for k, v := range s {
if v == Id {
return append(s[0:k], s[k+1:]...), true
}
}
return s, false
}
func ElemInSlice(s []int, Id int) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
func GetElemNum(s []int, Id int) int {
n := 0
for _, v := range s {
if v == Id {
n++
}
}
return n
}
func InArray(Id int, s []int) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
func InStringArray(Id string, s []string) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
// toInterfaceSlice converts a slice of strings to a slice of empty interfaces
func ToInterfaceSlice(slice []string) []interface{} {
result := make([]interface{}, len(slice))
for i, v := range slice {
result[i] = v
}
return result
}
// a - b
func SubSlices(a, b []int) []int {
result := make([]int, 0, len(a))
for _, num := range a {
if !InArray(num, b) {
result = append(result, num)
}
}
return result
}
func PopSlice(s []int) (int, []int) {
if len(s) == 0 {
return -1, s
}
return s[0], s[1:]
}

View File

@ -3,13 +3,19 @@ package MergeConst
type ProtocolType int32
const (
Protocol_Error_Account_Exist int32 = 100
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
Protocol_Error_Account_OR_PWD_Short int32 = 102
Protocol_Error_Account_Fail int32 = 103
Protocol_Error_Account_NoExsit int32 = 104
Protocol_Res_Buy_Cnt_Limit int32 = 110
Protocol_Res_Buy_CD int32 = 111
Protocol_Error_Account_Exist int32 = 100
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
Protocol_Error_Account_OR_PWD_Short int32 = 102
Protocol_Error_Account_Fail int32 = 103
Protocol_Error_Account_NoExsit int32 = 104
Protocol_Error_Account_Code_Error int32 = 105
Protocol_Error_Account_Device_Error int32 = 106
Protocol_Error_Id_Not_Verify int32 = 107
Protocol_Error_Id_Verify_Error int32 = 108
Protocol_Error_Account_Ban int32 = 109
Protocol_Res_Buy_Cnt_Limit int32 = 110
Protocol_Res_Buy_CD int32 = 111
Protocol_Email_Find_Fail int32 = 120
Protocol_Active_No_Exsit int32 = 130
Protocol_Active_7Day_Rewarded int32 = 131
@ -94,10 +100,12 @@ const G_Champion_settlement_Duration = 3600 * 23
const G_Champion_Unlock_Score = 2
const G_Champion_Max_Score = 44650
const G_Champion_People_Cnt = 50
const SUCCESS = 1
const (
ORDER_STATUS_IDLE = 0 // 订单未完成
ORDER_STATUS_PAY = 1 // 订单已支付
ORDER_STATUS_CANCLE = 2 // 订单取消
ORDER_STATUS_CANCEL = 2 // 订单取消
ORDER_STATUS_SHIP = 3 // 订单已发货
)
const GLOBAL_SERVER_ID = 0 // 全局服ID

View File

@ -0,0 +1,8 @@
package MergeConst
const (
Go_gc_percent = 200
Go_gc_memory_limit = 1024 << 20
Go_game_version = "1.0.3" // 游戏版本号,格式为 "主版本号.次版本号.修订号",每次发布新版本时需要更新
Go_log_delete_days = 3 // 日志删除天数,超过这个天数的日志文件将被删除
)

BIN
src/server/Order.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

16
src/server/README.MD Normal file
View File

@ -0,0 +1,16 @@
## 命名规范
- **清晰优先**:名称应准确表达含义,避免歧义。
- **导出规则**:导出标识符首字母大写,未导出首字母小写。
- **包名**:小写单词,简短且描述职责(如 `store`、`auth`)。
- **文件名**:小写(可下划线分隔),测试文件以 `_test.go` 结尾。
- **函数/变量/类型**:驼峰命名;导出使用 PascalCase例如 `UserService`、`CreateUser`)。
- **接口**:以行为命名,常用 `-er` 结尾(如 `Reader`、`Store`),避免 `I` 前缀。
- **缩写**:统一大小写(例如导出使用 `ID`、`URL`;未导出使用 `id`、`url`)。
- **错误**:包级错误使用 `Err` 前缀(如 `ErrNotFound`)。
- **Context 与并发**:统一使用 `ctx` 作 `context.Context`,通道命名要有语义(如 `done`, `jobs`)。
- **构造函数/选项**:使用 `NewType` 与 `WithXxx` 约定,避免多个布尔参数。

View File

@ -0,0 +1,77 @@
package backend
import (
"context"
"net"
"server/conf"
"server/game"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
"google.golang.org/grpc"
)
type backendServer struct {
msg.UnimplementedBackendServer
}
func (s *backendServer) ReloadActivity(ctx context.Context, req *msg.ReqActivityCfgReload) (*msg.ResActivityCfgReload, error) {
defer func() {
if r := recover(); r != nil {
log.Error("ReloadActivity panic: %v", r)
}
}()
log.Debug("Received ReloadActivity request: %v", req)
game.AcitivityCfgReload()
return nil, nil
}
func (s *backendServer) OrderShipping(ctx context.Context, req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) {
defer func() {
if r := recover(); r != nil {
log.Error("OrderShipping panic: %v", r)
}
}()
log.Debug("Received OrderShipping request: %v", req)
res, err := game.AdminShipping(req)
if err != nil {
log.Error("OrderShipping error: %v", err)
return nil, err
}
return res, nil
}
func (s *backendServer) UserDetail(ctx context.Context, req *msg.UserDetailParam) (*msg.ResUserDetail, error) {
defer func() {
if r := recover(); r != nil {
log.Error("UserDetail panic: %v", r)
}
}()
log.Debug("Received UserDetail request: %v", req)
res, err := game.AdminPlayerDetailInfo(req)
if err != nil {
log.Error("UserDetail error: %v", err)
return nil, err
}
return res, nil
}
func Start() {
if conf.Server.RPCAddr == "" {
log.Debug("RPC server address not configured, skipping gRPC server startup")
return
}
lis, err := net.Listen("tcp", conf.Server.RPCAddr)
if err != nil {
log.Error("failed to listen: %v", err)
return
}
s := grpc.NewServer()
msg.RegisterBackendServer(s, &backendServer{})
log.Debug("gRPC server listening on %s", conf.Server.RPCAddr)
if err := s.Serve(lis); err != nil {
log.Error("server exited with error: %v", err)
}
}

View File

@ -0,0 +1,113 @@
package main
import (
"fmt"
"runtime"
"server/game"
"server/game/mod/msg"
"testing"
)
// func TestBenchInit(t *testing.T) {
// f := "wmz00%d"
// for i := 0; i < 10000; i++ {
// UserName := fmt.Sprintf(f, i)
// game.G_GameLogicPtr.Db_AccountInfo.UserName = UserName
// game.G_GameLogicPtr.Db_AccountInfo.UserPassword = "123456"
// if game.G_GameLogicPtr.NewAccountInsertDataToDB() {
// fmt.Printf("UserName:%s\n init success", UserName)
// }
// }
// }
/*
*
cluster 消息处理基准测试
36716 34961 ns/op 1690 B/op 38 allocs/op
*/
func BenchmarkClusterMsg(b *testing.B) {
game.ClusterMgrInit()
runtime.GOMAXPROCS(8)
game.G_getGameLogic()
for i := 0; i < b.N; i++ {
m := &msg.Msg{
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
Extra: 0,
}
game.MessageHandle(m)
}
}
func printMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
// 输出内存使用情况
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
fmt.Printf("\tNumGC = %v\n", m.NumGC)
var playerCount int
game.G_GameLogicPtr.M_Players.Range(func(key, value interface{}) bool {
playerCount++
return true
})
fmt.Printf("\tPlayerNum = %v\n", playerCount)
}
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
func BenchmarkChampionshipGroup(b *testing.B) {
for i := 0; i < b.N; i++ {
game.G_GameLogicPtr.CreateChampshipMgr()
game.G_GameLogicPtr.ChampshipMgr.Debug()
}
}
func BenchmarkPlayerInit(b *testing.B) {
for i := 0; i < b.N; i++ {
p := new(game.Player)
p.InitPlayer("3625212")
p.LoginBackData()
}
}
func BenchmarkPlayerBackup(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
for i := 0; i < b.N; i++ {
p.BackUp()
}
}
func BenchmarkPlayerRecover(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
backup := p.BackUp()
for i := 0; i < b.N; i++ {
p.Recover(backup)
}
}
func BenchmarkPlayerHandleMsg(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
list := make([]*msg.Msg, 0, 1000)
for i := 0; i < 1000; i++ {
m := &msg.Msg{
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
Type: msg.HANDLE_TYPE_APPLY,
From: 100001,
To: i + 100002,
Extra: 0,
}
list = append(list, m)
}
for i := 0; i < b.N; i++ {
for _, m := range list {
p.HandleMsg(m)
}
}
}

View File

@ -3,9 +3,9 @@ package mergeCluster
import (
"fmt"
"math"
"server/GoUtil"
"server/conf"
"server/game/mod/msg"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/network"
"sync"
@ -16,7 +16,9 @@ const (
)
var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数
var funcMapMu sync.RWMutex // FuncMap 的读写锁
var CallbackChan = make(map[string]chan *msg.Msg) // 回调消息队列
var callbackChanMu sync.RWMutex // CallbackChan 的读写锁
var (
server *network.TCPServer // 服务器
Center *network.TCPClient // 集群中心
@ -30,14 +32,14 @@ func Init() {
server = new(network.TCPServer)
server.Addr = conf.Server.ListenAddr
server.MaxConnNum = int(math.MaxInt32)
server.PendingWriteNum = conf.PendingWriteNum
server.PendingWriteNum = 1 << 14
server.LenMsgLen = 4
server.MaxMsgLen = 4096
server.MaxMsgLen = 1 << 16
server.NewAgent = newServerAgent
server.Start()
}
if conf.Server.CenterAddr != "" {
if conf.Server.CenterAddr != "" && conf.Server.ServerType != "center" {
connectRemote(conf.Server.CenterAddr, ClusterCenterId, "center")
}
@ -47,6 +49,11 @@ func Init() {
registerFunc(msg.CLUSTER_EXIT, ClusterExit)
}
// GetCallbackChanMu 返回 CallbackChan 的读写锁,供外部包安全访问 CallbackChan
func GetCallbackChanMu() *sync.RWMutex {
return &callbackChanMu
}
func Destroy() {
if server != nil {
log.Release("closing cluster server")
@ -88,7 +95,7 @@ func (a *Agent) Run() {
m := msg.Msg{}
err = GoUtil.GobUnmarshal(data, &m)
if err != nil {
log.Debug("decode err: %v", err)
log.Debug("decode err: %v, data: %s", err, string(data))
return
}
err = processMsg(a, &m)

View File

@ -2,9 +2,9 @@ package mergeCluster
import (
"fmt"
"server/GoUtil"
"server/conf"
"server/game/mod/msg"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/network"
"time"
@ -48,19 +48,14 @@ func HandShakeRecv(a *Agent, m *msg.Msg) error {
RemoteAddr: m.Extra.(string),
},
})
} else {
syncMsg := &msg.Msg{
Type: msg.CLUSTER_FRIEND_SYNC,
To: ServerId,
HandleType: msg.HANDLE_MOD_CLUSTER_SYNC,
}
sendGameMsg(syncMsg)
}
syncMsg := &msg.Msg{
Type: msg.CLUSTER_FRIEND_SYNC,
To: ServerId,
}
sendGameMsg(syncMsg)
fmt.Print("现有区服连接:")
serverAgent.Range(func(key, value interface{}) bool {
fmt.Print(key)
fmt.Print(",")
return true
})
fmt.Println()
return nil
}
@ -79,7 +74,7 @@ func ClusterJoin(a *Agent, m *msg.Msg) error {
return nil
}
log.Debug("ClusterJoin ServerId %v", clusterJoin.ServerId)
connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
//connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
return nil
}
@ -96,23 +91,30 @@ func connectRemote(RemoteAddr string, ConnType int, ConnLabel string) error {
client := new(network.TCPClient)
client.Addr = RemoteAddr
client.ConnNum = 1
client.PendingWriteNum = conf.PendingWriteNum
client.PendingWriteNum = 1 << 14
client.LenMsgLen = 4
client.MaxMsgLen = 4096
client.MaxMsgLen = 1 << 16
client.NewAgent = newAgent
client.ConnType = ConnType
client.ConnLabel = ConnLabel
client.ConnectInterval = time.Duration(time.Minute * 5)
client.ConnectInterval = time.Duration(time.Minute * 1)
if ConnType == ClusterCenterId { // 中心服断开重连
client.AutoReconnect = true
}
client.Start()
Center = client
clients = append(clients, client)
log.Debug("connet remote to addr:%s", RemoteAddr)
return nil
}
func SendServerMsg(m *msg.Msg, serverId int) error {
if m.UniKey == "" {
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
}
if m.SendT == 0 {
m.SendT = GoUtil.Now()
}
if v, ok := serverAgent.Load(serverId); ok {
data, err := GoUtil.GobMarshal(m)
if err != nil {
@ -120,10 +122,47 @@ func SendServerMsg(m *msg.Msg, serverId int) error {
return err
}
v.(network.Agent).WriteMsg(data)
return nil
}
return fmt.Errorf("server %d not online", serverId)
}
func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) {
if m.UniKey == "" {
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
}
if m.SendT == 0 {
m.SendT = GoUtil.Now()
}
v, ok := serverAgent.Load(serverId)
// 之后再发送消息
if !ok {
return nil, fmt.Errorf("server %d not online", serverId)
}
// 先注册回调通道,避免发送出去后对方快速返回导致丢失
newChan := make(chan *msg.Msg, 1)
registerChanel(m.UniKey, newChan)
defer unregisterChanel(m.UniKey)
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("CallServerMsg GobMarshal err %v", err)
return nil, err
}
v.(network.Agent).WriteMsg(data)
// 等待返回(直接接收一次)
timeout := time.After(5 * time.Second)
select {
case backm := <-newChan:
if backm == nil {
return nil, fmt.Errorf("server %d not response", serverId)
}
// log.Debug("CallServerMsg reply %v", backm)
return backm, nil
case <-timeout:
return nil, fmt.Errorf("timeout waiting for server %d response", serverId)
}
}
func SendMsgAll(m *msg.Msg) {
data, err := GoUtil.GobMarshal(m)
if err != nil {
@ -138,7 +177,12 @@ func SendMsgAll(m *msg.Msg) {
func processMsg(a *Agent, m *msg.Msg) error {
var err error
if fun, ok := FuncMap[m.Type]; ok {
funcMapMu.RLock()
fun, ok := FuncMap[m.Type]
funcMapMu.RUnlock()
if ok {
err = fun(a, m)
} else {
MsgChan <- m //交由game Module消息处理
@ -147,7 +191,21 @@ func processMsg(a *Agent, m *msg.Msg) error {
}
func registerFunc(key int, fun func(*Agent, *msg.Msg) error) {
funcMapMu.Lock()
FuncMap[key] = fun
funcMapMu.Unlock()
}
func registerChanel(key string, chanel chan *msg.Msg) {
callbackChanMu.Lock()
CallbackChan[key] = chanel
callbackChanMu.Unlock()
}
func unregisterChanel(key string) {
callbackChanMu.Lock()
delete(CallbackChan, key)
callbackChanMu.Unlock()
}
func sendGameMsg(m *msg.Msg) {

View File

@ -1,17 +1,8 @@
package mergeCluster
import (
"encoding/gob"
"server/game/mod/msg"
)
func init() {
gob.Register(&msg.Msg{})
gob.Register(&ClusterJoinData{})
}
type ClusterJoinData struct {
ServerId int
Country int
RemoteAddr string
}

View File

@ -1,41 +0,0 @@
package startOrderCfg
import (
"server/gamedata"
"strconv"
)
type StartOrderCfg struct {
}
var CFG_NAME = "StartOrder"
func init() {
gamedata.InitCfg(CFG_NAME)
}
// 根据step 获取初始订单
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
ret := make([]*gamedata.StartOrderData, 0)
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
return ret
}
for k, v := range data {
record := v.(map[string]interface{})
stepVal := gamedata.ParseInt(record["step"])
var MergeList []int
for _, vv := range record["merge_id_list"].([]interface{}) {
MergeList = append(MergeList, gamedata.ParseInt(vv))
}
if int(stepVal) == id {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
Step: int(stepVal),
MergeList: MergeList,
})
}
}
return ret
}

View File

@ -1,46 +0,0 @@
package activityCfg
import (
"server/GoUtil"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_ACTIVITY = "Activity"
)
func init() {
gamedata.InitCfg(CFG_ACTIVITY)
}
func GetActivityList() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
}
Now := GoUtil.Now()
var List []*gamedata.ActivityData
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
if Now >= StartTime && Now <= EndTime {
Id, _ := strconv.Atoi(k)
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
ActivityData := &gamedata.ActivityData{
Id: Id,
Type: Type,
Name: Name,
Title: Title,
}
List = append(List, ActivityData)
}
}
return List
}

View File

@ -0,0 +1,144 @@
package activityCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_ACTIVITY = "Activity"
CFG_ACTIVITY_GIFT = "ActivityGift"
)
func init() {
gamedata.InitCfg(CFG_ACTIVITY)
gamedata.InitCfg(CFG_ACTIVITY_GIFT)
}
func GetActivityGiftId(chargeId int) int {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityGiftId err:%v", err)
return 0
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
if ChargeId == chargeId {
return gamedata.GetIntValue(v, "AId")
}
}
return 0
}
func GetActivityGiftItems(chargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityGiftItems err:%v", err)
return nil
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
if ChargeId == chargeId {
Items := gamedata.GetItemList(v, "Items")
return Items
}
}
return nil
}
func GetActivityList() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
return nil
}
List := make([]*gamedata.ActivityData, 0, len(data))
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
Level := gamedata.GetIntValue(v, "Level")
ActivityData := &gamedata.ActivityData{
Id: GoUtil.Int(k),
Type: Type,
AType: gamedata.GetIntValue(v, "AType"),
Name: Name,
Title: Title,
Level: Level,
StartTime: StartTime,
EndTime: EndTime,
}
List = append(List, ActivityData)
}
return List
}
func GetActivityListOrigin() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
return nil
}
List := make([]*gamedata.ActivityData, 0, len(data))
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetActivityList parse id err:%v, key:%s", err, k)
continue
}
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
Level := gamedata.GetIntValue(v, "Level")
ActivityData := &gamedata.ActivityData{
Id: Id,
Type: Type,
AType: gamedata.GetIntValue(v, "AType"),
Name: Name,
Title: Title,
Level: Level,
StartTime: StartTime,
EndTime: EndTime,
}
List = append(List, ActivityData)
}
return List
}
func GetActivityRewardItems(ActId int) []*item.Item {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityRewardItems err:%v", err)
return nil
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
AId := gamedata.GetIntValue(v, "AId")
if ChargeId == 0 && AId == ActId {
Items := gamedata.GetItemList(v, "Items")
return Items
}
}
return nil
}
func GetActivityRecycleMail(ActId int) (string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId)
if err != nil {
log.Debug("GetActivityRecycleMail err:%v", err)
return "", "", ""
}
return gamedata.GetStringValue(data, "Title"), gamedata.GetStringValue(data, "Mail_Title"), gamedata.GetStringValue(data, "Mail_Content")
}

View File

@ -1,6 +1,7 @@
package avatarCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -20,7 +21,7 @@ func GetInitList() []int {
log.Debug("GetInitList err: %v", err)
return nil
}
r := make([]int, 0)
r := make([]int, 0, len(data))
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
@ -31,6 +32,15 @@ func GetInitList() []int {
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_AVATAR)
if err != nil {
@ -40,3 +50,17 @@ func CheckExist(Id int) bool {
_, ok := data[strconv.Itoa(Id)]
return ok
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_AVATAR)
if err != nil {
log.Debug("GetAllId err: %v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, _ := strconv.Atoi(k)
r = append(r, Id)
}
return r
}

View File

@ -1,39 +0,0 @@
package baseCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_BASE = "Base"
)
const (
ENERGY_SHOP_MUL = "energy_shop_mul"
)
func init() {
gamedata.InitCfg(CFG_BASE)
}
func GetEnergyByMul(T int) float64 {
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
if err != nil {
log.Debug("GetEnergyByMul err:%v", err)
return 0
}
d := data["Value"].(map[string]interface{})
if len(d) == 0 {
return 0
}
T = min(T, len(d))
T1 := strconv.Itoa(T)
if v, ok := d[T1]; ok {
return v.(float64)
} else {
return 0
}
}

View File

@ -0,0 +1,97 @@
package baseCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_BASE = "Base"
)
const (
ENERGY_SHOP_MUL = "energy_shop_mul"
ENERGY_CFG = "BaseEnergy"
MAX_ENERGY_LEVEL = 999 // 最大能量等级上限
)
func init() {
gamedata.InitCfg(CFG_BASE)
gamedata.InitCfg(ENERGY_CFG)
}
func GetEnergyByMul(T int) float64 {
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
if err != nil {
log.Debug("GetEnergyByMul err:%v", err)
return 0
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetEnergyByMul: Value field not found")
return 0
}
d, ok := valueData.(map[string]interface{})
if !ok || len(d) == 0 {
log.Debug("GetEnergyByMul: Value is not a valid map")
return 0
}
T = min(T, len(d))
T1 := strconv.Itoa(T)
if v, ok := d[T1]; ok {
if floatVal, ok := v.(float64); ok {
return floatVal
}
log.Debug("GetEnergyByMul: value is not float64, key=%s", T1)
}
return 0
}
func GetFriendReplyReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_BASE, "friend_reply")
if err != nil {
log.Debug("GetFriendReplyReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetEnergyByADNum() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_BASE, "ad_energy_gift")
if err != nil {
log.Debug("GetEnergyByADNum err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetMaxEnergyMul(Lv int, Energy int) int {
Mul := 0
for i := 1; i <= MAX_ENERGY_LEVEL; i++ {
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, i)
if err != nil {
break
}
UnlockLv := gamedata.GetIntValue(data, "UnlockLv")
needEnergy := gamedata.GetIntValue(data, "NeedEnergy")
if Lv < UnlockLv || Energy < needEnergy {
break
}
Mul = i - 1
}
return Mul
}
func GetLimitEnergyMul(Lv int) int {
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, Lv+1)
if err != nil {
log.Debug("GetLimitEnergyMul err:%v, Lv=%d", err, Lv)
return 0
}
return gamedata.GetIntValue(data, "Limit")
}

View File

@ -1,8 +1,8 @@
package cardCfg
import (
"server/GoUtil"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -28,51 +28,73 @@ func init() {
func GetAllCollectReward() []*item.Item {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "all_collect_reward")
if err != nil {
log.Debug("GetAllCollectReward data not found")
log.Debug("GetAllCollectReward err:%v", err)
return nil
}
return item.ParseItem(data["Value"])
if value, ok := data["Value"]; ok {
return item.ParseItem(value)
}
return nil
}
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("GetStarById data not found")
log.Debug("GetStarById err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Star")
}
func GetRoundById(Id int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("GetRoundById err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Round")
}
// 获取开启卡包获得的卡牌数量
func GetPackRewardCnt(Star int) int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetPackRewardCnt data not found")
log.Debug("GetPackRewardCnt err:%v, Star=%d", err, Star)
return 0
}
return gamedata.GetIntValue(data, "RewardCnt")
}
// 获取开启开包得x星卡
// 获取开启开包得x星卡
func GetPackMustHave(Star int) int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetPackMustHave data not found")
log.Debug("GetPackMustHave err:%v, Star=%d", err, Star)
return 0
}
return gamedata.GetIntValue(data, "MustHave")
}
// 根据星级获取卡牌列表
func GetCardListByStar(Star, IsGold int) []int {
var CardList []int
func GetCardListByStar(Round, Star, IsGold int) []int {
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetCardListByStar data not found")
log.Debug("GetCardListByStar err:%v", err)
return nil
}
CardList := make([]int, 0, len(data)/10)
for k, v := range data {
Extra := gamedata.GetIntValue(v, "Round")
if Round < Extra {
continue
}
vStar := gamedata.GetIntValue(v, "Star")
isGold := gamedata.GetIntValue(v, "IsGold")
if vStar == Star && IsGold == isGold {
id, _ := strconv.Atoi(k)
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetCardListByStar parse id err:%v, key=%s", err, k)
continue
}
CardList = append(CardList, id)
}
}
@ -80,16 +102,20 @@ func GetCardListByStar(Star, IsGold int) []int {
}
// 获取随机卡牌
func GetRandListByStar(Star int) []int {
var randList []int
func GetRandListByStar(Star int) map[int]int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetRandListByStar data not found")
log.Debug("GetRandListByStar err:%v, Star=%d", err, Star)
return nil
}
r1 := gamedata.GetStringValue(data, "RandRate")
r2 := strings.Split(r1, ",")
randList = GoUtil.SliceStringToInt(r2)
return randList
randList := GoUtil.SliceStringToInt(r2)
r := make(map[int]int, len(randList))
for k, v := range randList {
r[k+1] = v
}
return r
}
// 获取卡牌收集奖励
@ -106,33 +132,33 @@ func GetCollectReward(Color int) ([]*item.Item, int) {
}
// 获取兑换奖励
func GetExchangeCfg(Id int) (int, []*item.Item, []int) {
func GetExchangeCfg(Id int) (int, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CARD_EXCHANGE_CFG, Id)
if err != nil {
log.Debug("GetExchangeCfg data not found")
return 0, nil, nil
log.Debug("GetExchangeCfg err:%v, Id=%d", err, Id)
return 0, nil
}
itemNum := gamedata.GetIntValue(data, "Item")
itemList := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, itemNum)}
CostStar := gamedata.GetIntValue(data, "CostStar")
CardPackStr := gamedata.GetStringValue(data, "CardPack")
s1 := CardPackStr[1 : len(CardPackStr)-1]
CardPack := GoUtil.SliceStringToInt(strings.Split(s1, ","))
return CostStar, itemList, CardPack
itemList := gamedata.GetItemList(data, "Item")
return CostStar, itemList
}
// 根据系列获取卡牌列表
func GetCardListByColor(Id int) []int {
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetCardListByColor data not found")
return []int{}
log.Debug("GetCardListByColor err:%v, Id=%d", err, Id)
return nil
}
var r []int
r := make([]int, 0, len(data)/5)
for k, v := range data {
color := gamedata.GetIntValue(v, "PictureAlbum")
if color == Id {
k1, _ := strconv.Atoi(k)
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetCardListByColor parse id err:%v, key=%s", err, k)
continue
}
r = append(r, k1)
}
}
@ -140,24 +166,42 @@ func GetCardListByColor(Id int) []int {
}
// 获取所有卡牌id
func GetAllCardId() []int {
func GetAllCardId(Round int) []int {
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetCardListByColor data not found")
return []int{}
log.Debug("GetAllCardId err:%v, Round=%d", err, Round)
return nil
}
var r []int
for k := range data {
k1, _ := strconv.Atoi(k)
r := make([]int, 0, len(data))
for k, v := range data {
Extra := gamedata.GetIntValue(v, "Round")
if Round < Extra {
continue
}
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetAllCardId parse id err:%v, key=%s", err, k)
continue
}
r = append(r, k1)
}
return r
}
func CheckCardIsGold(Id int) bool {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("CheckCardIsGold err:%v, Id=%d", err, Id)
return false
}
return gamedata.GetIntValue(data, "IsGold") == 1
}
func GetCardDuration() int64 {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "duration")
if err != nil {
log.Debug("GetCardDuration data not found")
log.Debug("GetCardDuration err:%v", err)
return 0
}
return int64(gamedata.GetIntValue(data, "Value"))
}
@ -165,7 +209,8 @@ func GetCardDuration() int64 {
func GetExTimes() int {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "exchange_times")
if err != nil {
log.Debug("GetExTimes data not found")
log.Debug("GetExTimes err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
@ -173,7 +218,29 @@ func GetExTimes() int {
func GetReqTimes() int {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "request_times")
if err != nil {
log.Debug("GetReqTimes data not found")
log.Debug("GetReqTimes err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetItemIdByCardId(CardId int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, CardId)
if err != nil {
log.Debug("GetItemIdByCardId err:%v, CardId=%d", err, CardId)
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetSeasonFirstReward() []*item.Item {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "season_first")
if err != nil {
log.Debug("GetSeasonFirstReward err:%v", err)
return nil
}
if value, ok := data["Value"]; ok {
return item.ParseItem(value)
}
return nil
}

View File

@ -0,0 +1,155 @@
package catnipCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CATNIP_TEMPLATE_CFG_NAME = "CatnipTemplate"
CATNIP_JACKPOT_CFG_NAME = "CatnipJackpot"
CATNIP_MULTIPLIER_CFG_NAME = "CatnipMultiplier"
CATNIP_GAME_CFG_NAME = "CatnipGame"
)
const (
CATNIP_REWARD_TYPE_LOW = 1
CATNIP_REWARD_TYPE_MID = 2
CATNIP_REWARD_TYPE_HIGH = 3
)
func init() {
gamedata.InitCfg(CATNIP_TEMPLATE_CFG_NAME)
gamedata.InitCfg(CATNIP_JACKPOT_CFG_NAME)
gamedata.InitCfg(CATNIP_MULTIPLIER_CFG_NAME)
gamedata.InitCfg(CATNIP_GAME_CFG_NAME)
}
func GetGameNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetGameNum err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "PassNum")
}
func GetGameMaxProgress(Id int) int {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetGameMaxProgress err:%v, Id=%d", err, Id)
return 0
}
MaxProgress := 0
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != TemplateId {
continue
}
MaxProgress = max(MaxProgress, gamedata.GetIntValue(v, "Need"))
}
return MaxProgress
}
func GetJackpotItem(Mul int) (int, []*item.Item, int, int) {
data, err := gamedata.GetData(CATNIP_JACKPOT_CFG_NAME)
if err != nil {
log.Debug("GetJackpotItem err:%v, Mul=%d", err, Mul)
return 0, nil, 0, 0
}
JackpotType := GetJackpotType(Mul)
r := make(map[int]int, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == JackpotType {
r[GoUtil.Int(k)] = 1
}
}
Id := GoUtil.RandMap(r)
if Id == 0 {
return 0, nil, 0, 0
}
itemData, err := gamedata.GetDataByIntKey(CATNIP_JACKPOT_CFG_NAME, Id)
if err != nil {
log.Debug("GetJackpotItem get itemData err:%v, Id=%d", err, Id)
return 0, nil, 0, 0
}
return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth"), gamedata.GetIntValue(itemData, "FriendItems")
}
func GetJackpotType(Mul int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_MULTIPLIER_CFG_NAME, Mul)
if err != nil {
log.Debug("GetJackpotType err:%v, Mul=%d", err, Mul)
return 0
}
R := map[int]int{
CATNIP_REWARD_TYPE_LOW: gamedata.GetIntValue(data, "Low"),
CATNIP_REWARD_TYPE_MID: gamedata.GetIntValue(data, "Mid"),
CATNIP_REWARD_TYPE_HIGH: gamedata.GetIntValue(data, "High"),
}
return GoUtil.RandMap(R)
}
func GetTemplateId(Id int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetTemplateId err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetProgressReward(Id int, Rewards []int, Progress int) ([]*item.Item, []int) {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetProgressReward err:%v, Id=%d", err, Id)
return nil, nil
}
Items := make([]*item.Item, 0, len(data))
Ids := make([]int, 0, len(data))
for k, v := range data {
rewardId := GoUtil.Int(k)
if !GoUtil.InArray(rewardId, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId {
Items = append(Items, gamedata.GetItemList(v, "Items")...)
Ids = append(Ids, rewardId)
}
}
return Items, Ids
}
func GetProgressNum(Id int) int {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetProgressNum err:%v, Id=%d", err, Id)
return 0
}
Num := 0
for _, v := range data {
if gamedata.GetIntValue(v, "Template") == TemplateId {
Num++
}
}
return Num
}
func GetItemCost(Id, Mul int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetItemCost err:%v, Id=%d", err, Id)
return nil
}
return item.MutilItem(gamedata.GetItemList(data, "ItemCost"), Mul)
}
func GetGrandReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetGrandReward err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Reward")
}

View File

@ -1,47 +0,0 @@
package champshipCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
CFG_CHAMPSHIP_RANK = "ChampshipRank"
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
)
func init() {
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
}
func GetChessScore(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Score")
}
func GetReward(Reward, Score int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
return Reward, nil
}
r := make([]*item.Item, 0)
for k, v := range data {
Id := GoUtil.Int(k)
if Reward >= Id {
continue
}
Reward = max(Reward, Id)
if Score >= gamedata.GetIntValue(v, "Score") {
Items := item.ParseItem(gamedata.GetStringValue(v, "Items"))
r = item.Merge(r, Items)
}
}
return Reward, r
}

View File

@ -0,0 +1,147 @@
package champshipCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
CFG_CHAMPSHIP_RANK = "ChampshipRank"
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
CFG_CHAMPSHIP_GROUP = "ChampshipGroup"
CFG_CHAMPSHIP_CONST = "ChampshipConst"
)
func init() {
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
gamedata.InitCfg(CFG_CHAMPSHIP_GROUP)
gamedata.InitCfg(CFG_CHAMPSHIP_CONST)
}
func GetGroupId(N int) int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_GROUP)
if err != nil {
log.Debug("GetGroupId err:%v, N=%d", err, N)
return 1
}
for k, v := range data {
if N >= gamedata.GetIntValue(v, "Min") && N <= gamedata.GetIntValue(v, "Max") {
return GoUtil.Int(k)
}
}
return 11
}
func GetChessScore(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
if err != nil {
log.Debug("GetChessScore err:%v, ChessLv=%d", err, ChessLv)
return 0
}
return gamedata.GetIntValue(data, "Score")
}
func GetReward(Reward, Score, activityId, orderFactor int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
log.Debug("GetReward err:%v, Reward=%d, Score=%d", err, Reward, Score)
return Reward, nil
}
r := make([]*item.Item, 0, len(data))
NewReward := Reward
for _, v := range data {
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if rewardGroupType != activityId {
continue
}
Id := gamedata.GetIntValue(v, "Step")
if Reward >= Id {
continue
}
if Score < gamedata.GetIntValue(v, "Total") {
continue
}
Items := item.ParseItem(gamedata.GetValue(v, "Items"))
r = item.Merge(r, Items)
NewReward = max(NewReward, Id)
starReward := gamedata.GetIntValue(v, "StarReward")
if starReward > 0 {
starnum := int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
r = append(r, item.NewItem(item.ITEM_STAR_ID, starnum))
}
}
}
return NewReward, r
}
func GetRewardItems(Reward int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
if err != nil {
log.Debug("GetRewardItems err:%v, Reward=%d", err, Reward)
return nil, 0
}
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Score")
}
func GetRewardTotalScore(Reward int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
if err != nil {
log.Debug("GetRewardTotalScore err:%v, Reward=%d", err, Reward)
return 0
}
return gamedata.GetIntValue(data, "Total")
}
func GetRankReward(Rank, yesterdayActivityId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHAMPSHIP_RANK)
if err != nil {
log.Debug("GetRankReward err:%v, Rank=%d, yesterdayActivityId=%d", err, Rank, yesterdayActivityId)
return nil
}
for _, v := range data {
if Rank >= gamedata.GetIntValue(v, "Min") && Rank <= gamedata.GetIntValue(v, "Max") && yesterdayActivityId == gamedata.GetIntValue(v, "RewardGroupType") {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetMaxRewardId() int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
log.Debug("GetMaxRewardId err:%v", err)
return 0
}
MaxId := 0
for k := range data {
Id := GoUtil.Int(k)
if Id > MaxId {
MaxId = Id
}
}
return MaxId
}
func GetChampshipActivityId() []int {
data, err := gamedata.GetDataByKey(CFG_CHAMPSHIP_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetChampshipActivityId err:%v", err)
return nil
}
value := gamedata.GetStringValue(data, "Value")
var res []int
for _, v := range strings.Split(value, "|") {
id := GoUtil.Int(v)
if id > 0 {
res = append(res, id)
}
}
return res
}

View File

@ -1,253 +0,0 @@
package chargeCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
"sort"
"strings"
)
const (
CFG_CHARGE = "Charge"
CFG_DIAMOND_SHOP = "DiamondShop"
CFG_ENERGY_SHOP = "EnergyShop"
CFG_SEPCIAL_SHOP = "SpecialShop"
CFG_FREE_SHOP = "FreeShop"
CFG_CHARGE_CONST = "ChargeConst"
CFG_CHARGE_GIFT = "ChargeGift"
)
func init() {
gamedata.InitCfg(CFG_CHARGE)
gamedata.InitCfg(CFG_DIAMOND_SHOP)
gamedata.InitCfg(CFG_ENERGY_SHOP)
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
gamedata.InitCfg(CFG_FREE_SHOP)
gamedata.InitCfg(CFG_CHARGE_CONST)
gamedata.InitCfg(CFG_CHARGE_GIFT)
}
func GetMoneyCharge(ChargeId int) float64 {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
return 0
}
return gamedata.GetFloatValue(data, "Money")
}
func GetDiamondShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
}
}
return nil
}
func GetEnergyShopId(ChargeId int) int {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
Energy := gamedata.GetIntValue(v, "Energy")
if !First {
Energy += gamedata.GetIntValue(v, "FirstCharge")
}
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
}
}
return nil
}
func GetSpecialShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetSpecialShopType(ChargeId int) int {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Type")
}
}
return 0
}
func GetFreeShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
if err != nil {
return nil
}
Item := gamedata.GetValue(data, "Items")
return item.ParseItem(Item)
}
func GetSpecialShopGrade(Money float64, Type int) int {
type grade struct {
id int
money float64
}
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return 0
}
l := make([]grade, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Type") != Type {
continue
}
l = append(l, grade{
id: gamedata.GetIntValue(v, "Grade"),
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
})
}
sort.Slice(l, func(i, j int) bool {
return l[i].money < l[j].money
})
for _, v := range l {
if Money < v.money {
return v.id
}
}
return 0
}
func GetUnlockShopLv() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetSpecialShopCount() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAdChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyDuration() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyMaxDia() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyRandDia() (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
if err != nil {
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, ",")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
}
func GetPiggyBankChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetGiftReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetGiftLimit(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Count")
}
}
return 0
}
func GetGiftId(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetChargeInfo(ChargeId int) (float64, string) {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
return 0, ""
}
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
}

View File

@ -0,0 +1,418 @@
package chargeCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"strings"
)
const (
CFG_CHARGE = "Charge"
CFG_DIAMOND_SHOP = "DiamondShop" // 钻石商店
CFG_ENERGY_SHOP = "EnergyShop" // 体力商店
CFG_SEPCIAL_SHOP = "SpecialShop" // 特惠商店
CFG_FREE_SHOP = "FreeShop" // 免费商店
CFG_CHARGE_CONST = "ChargeConst" // 充值常量配置
CFG_CHARGE_GIFT = "ChargeGift" // 充值礼包
CFG_CHARGE_WISH = "ChargeWish" // 许愿配置
CFG_CHARGE_PETCOIN = "ChargePetCoin" // 宠物币充值配置
CFG_CHARGE_AD = "ChargeAD" // 广告充值配置
)
func init() {
gamedata.InitCfg(CFG_CHARGE)
gamedata.InitCfg(CFG_DIAMOND_SHOP)
gamedata.InitCfg(CFG_ENERGY_SHOP)
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
gamedata.InitCfg(CFG_FREE_SHOP)
gamedata.InitCfg(CFG_CHARGE_CONST)
gamedata.InitCfg(CFG_CHARGE_GIFT)
gamedata.InitCfg(CFG_CHARGE_WISH)
gamedata.InitCfg(CFG_CHARGE_PETCOIN)
gamedata.InitCfg(CFG_CHARGE_AD)
}
func GetADReward(ChargeId int) ([]*item.Item, int) {
data, err := gamedata.GetData(CFG_CHARGE_AD)
if err != nil {
log.Debug("GetADReward err:%v, ChargeId=%d", err, ChargeId)
return nil, 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items")), gamedata.GetIntValue(v, "PetWork")
}
}
return nil, 0
}
func GetWeeklyDiscountDay() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_day")
if err != nil {
log.Debug("GetWeeklyDiscountDay err:%v", err)
return -1
}
return gamedata.GetIntValue(data, "Value")
}
func GetMoneyCharge(ChargeId int) float64 {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetMoneyCharge err:%v, ChargeId=%d", err, ChargeId)
return 0
}
return gamedata.GetFloatValue(data, "Money")
}
func GetDiamondShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
if err != nil {
log.Debug("GetDiamondShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
}
}
return nil
}
func GetEnergyShopId(ChargeId int) int {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
log.Debug("GetEnergyShopId err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetWeeklyInfo(Pos int) (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
log.Debug("GetWeeklyInfo err:%v, Pos=%d", err, Pos)
return 0, 0
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetWeeklyInfo: Value field not found")
return 0, 0
}
r, ok := valueData.([]interface{})
if !ok {
log.Debug("GetWeeklyInfo: Value is not []interface{}")
return 0, 0
}
for _, v := range r {
v1, ok := v.(map[string]interface{})
if !ok {
continue
}
Id := GoUtil.Int(v1["Id"])
if Id == Pos {
return GoUtil.Int(v1["Discount"]), GoUtil.Int(v1["Limit"])
}
}
return 0, 0
}
func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
log.Debug("GetWeeklyInfoAll err:%v", err)
return nil
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetWeeklyInfoAll: Value field not found")
return nil
}
r, ok := valueData.([]interface{})
if !ok {
log.Debug("GetWeeklyInfoAll: Value is not []interface{}")
return nil
}
res := make(map[int]gamedata.WeeklyDiscountInfo, len(r))
for _, v := range r {
v1, ok := v.(map[string]interface{})
if !ok {
continue
}
Id := GoUtil.Int(v1["Id"])
res[Id] = gamedata.WeeklyDiscountInfo{
Id: GoUtil.Int(v1["Id"]),
Discount: GoUtil.Int(v1["Discount"]),
WeeklyLimit: GoUtil.Int(v1["Limit"]),
}
}
return res
}
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
log.Debug("GetEnergyShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
Energy := gamedata.GetIntValue(v, "Energy")
if !First {
Energy += gamedata.GetIntValue(v, "FirstCharge")
}
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
}
}
return nil
}
func GetSpecialShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetSpecialShopType(ChargeId int) int {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopType err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Type")
}
}
return 0
}
func GetFreeShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
if err != nil {
log.Debug("GetFreeShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
Item := gamedata.GetValue(data, "Items")
return item.ParseItem(Item)
}
func GetSpecialShopGrade(Money float64, Type int) int {
type grade struct {
id int
money float64
}
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopGrade err:%v, Money=%.2f, Type=%d", err, Money, Type)
return 0
}
l := make([]grade, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Type") != Type {
continue
}
l = append(l, grade{
id: gamedata.GetIntValue(v, "Grade"),
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
})
}
sort.Slice(l, func(i, j int) bool {
return l[i].money > l[j].money
})
if len(l) == 0 {
return 0
}
maxMoney := 0.0
for _, v := range l {
if Money >= v.money {
maxMoney = max(maxMoney, v.money)
}
}
for _, v := range l {
if v.money == maxMoney {
return v.id
}
}
return l[0].id
}
func GetUnlockShopLv() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
if err != nil {
log.Debug("GetUnlockShopLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetSpecialShopCount() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
if err != nil {
log.Debug("GetSpecialShopCount err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAdChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
if err != nil {
log.Debug("GetAdChargeId err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyDuration() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
if err != nil {
log.Debug("GetPiggyDuration err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyMaxDia() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
if err != nil {
log.Debug("GetPiggyMaxDia err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyRandDia() (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
if err != nil {
log.Debug("GetPiggyRandDia err:%v", err)
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, ",")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
}
func GetPiggyBankChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
if err != nil {
log.Debug("GetPiggyBankChargeId err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetGiftReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetGiftLimit(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftLimit err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Count")
}
}
return 0
}
func GetGiftId(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftId err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetChargeInfo(ChargeId int) (float64, string) {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetChargeInfo err:%v, ChargeId=%d", err, ChargeId)
return 0, ""
}
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
}
func GetProduceName(ChargeId int) string {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetProduceName err:%v, ChargeId=%d", err, ChargeId)
return ""
}
return gamedata.GetStringValue(data, "Remark")
}
func GetWishCount(ItemId int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE_WISH, ItemId)
if err != nil {
log.Debug("GetWishCount err:%v, ItemId=%d", err, ItemId)
return 0
}
return gamedata.GetIntValue(data, "Wish")
}
func GetPetCoinShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_PETCOIN)
if err != nil {
log.Debug("GetPetCoinShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetWeeklyDiscountStartEnd() (int64, int64) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_time")
if err != nil {
log.Debug("GetWeeklyDiscountStartEnd err:%v", err)
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.ParseTime(strArr[0]), GoUtil.ParseTime(strArr[1])
}

View File

@ -0,0 +1,67 @@
package collectCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_COLLECT = "Collect"
CFG_COLLECT_JACKPOT = "CollectJackpot"
)
func init() {
gamedata.InitCfg(CFG_COLLECT)
gamedata.InitCfg(CFG_COLLECT_JACKPOT)
}
func GetJackpotId() []int {
data, err := gamedata.GetData(CFG_COLLECT_JACKPOT)
if err != nil {
log.Debug("GetJackpotId err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k := range data {
ret = append(ret, GoUtil.Int(k))
}
return ret
}
func GetJackpotItems(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT_JACKPOT, Id)
if err != nil {
log.Debug("GetJackpotItems err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetRewardNeed(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
if err != nil {
log.Debug("GetRewardNeed err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetRewardType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
if err != nil {
log.Debug("GetRewardType err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetRewardLen() int {
data, err := gamedata.GetData(CFG_COLLECT)
if err != nil {
log.Debug("GetRewardLen err:%v", err)
return 0
}
return len(data)
}

View File

@ -7,18 +7,19 @@ import (
var (
// log conf
LogFlag = log.LstdFlags
LogFlag = log.LstdFlags | log.Lmicroseconds
// gate conf
PendingWriteNum = 2000
MaxMsgLen uint32 = 16384 // 16KB
PendingWriteNum = 2000 // 客户端链接的写入消息队列长度
MaxMsgLen uint32 = 65536 // 16KB
HTTPTimeout = 10 * time.Second
LenMsgLen = 2
LittleEndian = false
// skeleton conf
GoLen = 10000
TimerDispatcherLen = 10000
AsynCallLen = 10000
ChanRPCLen = 10000
// 增加 goroutine 相关配置,避免 "Too many goroutines" 错误
GoLen = 50000 // 从 10000 增加到 50000控制并发 goroutine 数量
TimerDispatcherLen = 50000 // 从 10000 增加到 50000定时器队列长度
AsynCallLen = 50000 // 从 10000 增加到 50000异步调用队列长度
ChanRPCLen = 50000 // 从 10000 增加到 50000RPC 通道长度
)

View File

@ -1,89 +0,0 @@
package dailyTaskCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
DAILY_TASK_CONST = "DailyTaskConst"
DAILY_TASK = "DailyTask"
DAILY_TASK_ACTIVE = "DailyTaskActive"
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
)
func init() {
gamedata.InitCfg(DAILY_TASK_CONST)
gamedata.InitCfg(DAILY_TASK)
gamedata.InitCfg(DAILY_TASK_ACTIVE)
gamedata.InitCfg(DAILY_TASK_JACKPOT)
}
// 获取任务列表
func GetTaskList(Lv int) map[int]string {
r := make(map[int]string)
data, err := gamedata.GetData(DAILY_TASK)
if err != nil {
log.Debug("GetTaskList get data nil")
return r
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
if Lv >= lv {
k1, _ := strconv.Atoi(k)
r[k1] = gamedata.GetStringValue(v, "Task")
}
}
return r
}
func GetTaskActiveId() []int {
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
if err != nil {
log.Debug("GetTaskActiveId get data nil")
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
Id, _ := strconv.Atoi(k)
r = append(r, Id)
}
return r
}
func GetTaskActiveById(Id int) int {
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetTaskActiveById get data nil")
return 0
}
return gamedata.GetIntValue(data, "Num")
}
type Jackpot struct {
Items []*item.Item
Is_card int
}
func GetTaskWeekJackpot() map[int]Jackpot {
r := make(map[int]Jackpot)
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
if err != nil {
log.Debug("GetTaskWeekJackpot get data nil")
return r
}
for k, v := range data {
Id, _ := strconv.Atoi(k)
isCard := gamedata.GetIntValue(v, "CardPack")
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
r[Id] = Jackpot{
Items: Item,
Is_card: isCard,
}
}
return r
}

View File

@ -0,0 +1,161 @@
package dailyTaskCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
DAILY_TASK_CONST = "DailyTaskConst"
DAILY_TASK = "DailyTask"
DAILY_TASK_ACTIVE = "DailyTaskActive"
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
DAILY_TASK_REWARD = "DailyTaskReward"
)
func init() {
gamedata.InitCfg(DAILY_TASK_CONST)
gamedata.InitCfg(DAILY_TASK)
gamedata.InitCfg(DAILY_TASK_ACTIVE)
gamedata.InitCfg(DAILY_TASK_JACKPOT)
gamedata.InitCfg(DAILY_TASK_REWARD)
}
func GetDailyTaskReward(Id, activityId int) []*item.Item {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskReward err:%v", err)
return nil
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
items := gamedata.GetItemList(v, "ItemID")
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
if petCoinBase > 0 {
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: petCoinBase,
})
}
return items
}
}
return nil
}
func GetDailyTaskScore(Id, activityId int) int {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskScore err:%v", err)
return 0
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
return gamedata.GetIntValue(v, "ScoreReward")
}
}
return 0
}
func GetActivityIds() []int {
data, err := gamedata.GetDataByKey(DAILY_TASK_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetActivityIds err:%v", err)
return nil
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
result := make([]int, 0, len(strArr))
for _, v := range strArr {
a, _ := strconv.Atoi(v)
if a != 0 {
result = append(result, a)
}
}
return result
}
// 获取任务列表
func GetTaskList(Lv int) map[int]string {
data, err := gamedata.GetData(DAILY_TASK)
if err != nil {
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]string, len(data))
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
if Lv >= lv {
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
continue
}
r[k1] = gamedata.GetStringValue(v, "Task")
}
}
return r
}
func GetTaskActiveId() []int {
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
if err != nil {
log.Debug("GetTaskActiveId err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskActiveId parse id err:%v, key=%s", err, k)
continue
}
r = append(r, Id)
}
return r
}
func GetTaskActiveById(Id int) int {
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetTaskActiveById err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Num")
}
type Jackpot struct {
Items []*item.Item
Is_card int
}
func GetTaskWeekJackpot() map[int]Jackpot {
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
if err != nil {
log.Debug("GetTaskWeekJackpot err:%v", err)
return nil
}
r := make(map[int]Jackpot, len(data))
for k, v := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskWeekJackpot parse id err:%v, key=%s", err, k)
continue
}
isCard := gamedata.GetIntValue(v, "CardPack")
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
r[Id] = Jackpot{
Items: Item,
Is_card: isCard,
}
}
return r
}

View File

@ -1,95 +0,0 @@
package decorateCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
DECORATE_COST = "DecorateCost"
INDOOR_PROGRESS = "IndoorProgress"
)
func init() {
gamedata.InitCfg("DecorateCost")
gamedata.InitCfg("IndoorProgress")
}
func GetStarCost(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetStarCost not found")
return 0
}
for _, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
return gamedata.ParseInt(v1["CostCount"])
}
}
return 0
}
func GetAreaId(id int) int {
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
if err != nil {
log.Debug("DecorateCost GetAreaId id:%v not found", id)
return 0
}
return gamedata.ParseInt(value["AreaId"])
}
func GetNextAreaId(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetStarCost not found")
return 0
}
for k, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
UnionKey, _ := strconv.Atoi(k)
nextId := UnionKey + 1
AreaId = GetAreaId(nextId)
return AreaId
}
}
return 0
}
func GetAllSortIdByAreaId(AreaId int) []int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetAllSortIdByAreaId not found")
return nil
}
var SortIdList []int
for _, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId {
Sort := gamedata.ParseInt(v1["SortId"])
if Sort == 0 {
continue
}
SortIdList = append(SortIdList, Sort)
}
}
return SortIdList
}
func GetProgressReward(Scene, Lv int) []*item.Item {
value, err := gamedata.GetData("IndoorProgress")
if err != nil {
log.Debug("IndoorProgress GetProgressReward not found")
return nil
}
for _, v := range value {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["Scene"]) == Scene && gamedata.ParseInt(v1["Lv"]) == Lv {
return item.ParseItem(v1["Item"])
}
}
return nil
}

View File

@ -0,0 +1,255 @@
package decorateCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
DECORATE_COST = "DecorateCost"
INDOOR_PROGRESS = "IndoorProgress"
DECORATE_CONST = "DecorateConst"
DECORATE_AREA = "DecorateArea" // 装饰区域
)
func init() {
gamedata.InitCfg(DECORATE_COST)
gamedata.InitCfg(INDOOR_PROGRESS)
gamedata.InitCfg(DECORATE_CONST)
gamedata.InitCfg(DECORATE_AREA)
}
func GetStarCost(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetStarCost err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
return gamedata.GetIntValue(v, "CostCount")
}
}
return 0
}
func GetStarCostByAreaId(AreaId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetStarCost err:%v, AreaId=%d", err, AreaId)
return 0
}
var total int
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId {
total += gamedata.GetIntValue(v, "CostCount")
}
}
return total
}
func GetAreaId(id int) int {
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
if err != nil {
log.Debug("GetAreaId err:%v, id=%d", err, id)
return 0
}
return gamedata.GetIntValue(value, "AreaId")
}
func GetNextAreaId(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetNextAreaId err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
UnionKey, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetNextAreaId parse key err:%v, key=%s", err, k)
return 0
}
nextId := UnionKey + 1
AreaId = GetAreaId(nextId)
return AreaId
}
}
return 0
}
func GetAllSortIdByAreaId(AreaId int) []int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetAllSortIdByAreaId err:%v, AreaId=%d", err, AreaId)
return nil
}
SortIdList := make([]int, 0, len(data)/5)
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId {
Sort := gamedata.GetIntValue(v, "SortId")
if Sort == 0 {
continue
}
SortIdList = append(SortIdList, Sort)
}
}
return SortIdList
}
func GetProgressReward(Scene, Lv int) []*item.Item {
value, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetProgressReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
return nil
}
for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "AreaReward")
}
}
return nil
}
func GetDecoarteReward(Scene int, Lv int) []*item.Item {
value, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetDecoarteReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
return nil
}
for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "Item")
}
}
return nil
}
func GetAreaReward(AreaId int) []*item.Item {
value, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
if err != nil {
log.Debug("GetAreaReward err:%v, AreaId=%d", err, AreaId)
return nil
}
return gamedata.GetItemList(value, "Items")
}
// 获取一键装饰的解锁等级
func GetOneKeyDecorateUnlockLv() int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "OneKey")
if err != nil {
log.Debug("GetOneKeyDecorateUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
// 获取每次装饰增加的体力值
func GetDecorateAddEnergy() int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AddEnergy")
if err != nil {
log.Debug("GetDecorateAddEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAreaPerPExp(AreaId int) int {
data, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
if err != nil {
log.Debug("GetAreaPerPExp err:%v, AreaId=%d", err, AreaId)
return 0
}
return gamedata.GetIntValue(data, "PerPExp")
}
func GetDecoratePExp(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetDecoratePExp err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
return gamedata.GetIntValue(v, "PetExp")
}
}
return 0
}
func GetAllPartId() []int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AllPartId")
if err != nil {
log.Debug("GetAllPartId err:%v", err)
return nil
}
str := gamedata.GetStringValue(data, "Value")
r1 := strings.Split(str, "|")
PartIdList := make([]int, 0, len(r1))
for _, v := range r1 {
id, err := strconv.Atoi(v)
if err != nil {
log.Debug("GetAllPartId parse id err:%v, v=%s", err, v)
continue
}
PartIdList = append(PartIdList, id)
}
return PartIdList
}
func GetIdBySenceAndLv(Sence, Lv int) int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetIdBySenceAndLv err:%v, Sence=%d, Lv=%d", err, Sence, Lv)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv {
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetIdBySenceAndLv parse id err:%v, key=%s", err, k)
return 0
}
return id
}
}
return 0
}
func GetPartNumByAreaId(AreaId int) map[int]int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetPartNumByAreaId err:%v, AreaId=%d", err, AreaId)
return nil
}
res := make(map[int]int, len(data))
for k, v := range data {
Sence := gamedata.GetIntValue(v, "Scene")
if Sence != AreaId {
continue
}
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetPartNumByAreaId parse id err:%v, key=%s", err, k)
continue
}
PartNum := gamedata.GetIntValue(v, "Part")
if PartNum == 0 {
continue
}
res[id] = PartNum
}
return res
}
func GetAreaIdByIndoorId(IndoorId int) int {
data, err := gamedata.GetDataByIntKey(INDOOR_PROGRESS, IndoorId)
if err != nil {
log.Debug("GetAreaIdByIndoorId err:%v, IndoorId=%d", err, IndoorId)
return 0
}
return gamedata.GetIntValue(data, "Scene")
}

View File

@ -0,0 +1,53 @@
package emojiCfg
import (
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_EMOJI = "Emoji"
)
func init() {
gamedata.InitCfg(CFG_EMOJI)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_EMOJI)
if err != nil {
log.Debug("GetInitList err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k, v := range data {
Init := gamedata.GetIntValue(v, "Init")
if Init == 1 {
ret = append(ret, GoUtil.Int(k))
}
}
return ret
}
func GetAllList() []int {
data, err := gamedata.GetData(CFG_EMOJI)
if err != nil {
log.Debug("GetAllList err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k := range data {
ret = append(ret, GoUtil.Int(k))
}
return ret
}
func GetEmojiName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_EMOJI, Id)
if err != nil {
log.Debug("GetEmojiName err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Name")
}

View File

@ -3,6 +3,7 @@ package endlessCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
@ -15,14 +16,15 @@ func init() {
gamedata.InitCfg(CFG_ENDLESS_JACKPOT)
}
func GetDiamond(Money float64) float64 {
func GetEnergy(Money float64) float64 {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("GetEnergy err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
if Money == gamedata.GetFloatValue(v, "Money") {
return gamedata.GetFloatValue(v, "Diamond")
return gamedata.GetFloatValue(v, "Energy")
}
}
return 0
@ -31,6 +33,7 @@ func GetDiamond(Money float64) float64 {
func NextMoney(Money float64) float64 {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("NextMoney err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
@ -44,6 +47,7 @@ func NextMoney(Money float64) float64 {
func GetChargeId(Money float64) int {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("GetChargeId err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
@ -54,27 +58,29 @@ func GetChargeId(Money float64) int {
return 0
}
func GetPerDiamond(Id int) float64 {
func GetPerEnergy(Id int) float64 {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetPerEnergy err:%v, Id=%d", err, Id)
return 0
}
for _, v := range data {
if Id == gamedata.GetIntValue(v, "ItemId") {
return gamedata.GetFloatValue(v, "Diamond")
return gamedata.GetFloatValue(v, "Energy")
}
}
return 0
}
func GetItemId(Diamond float64, Type int) []int {
func GetItemId(Energy float64, Type, Lv int) []int {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetItemId err:%v, Energy=%.2f, Type=%d, Lv=%d", err, Energy, Type, Lv)
return nil
}
var ItemId []int
ItemId := make([]int, 0, len(data))
for _, v := range data {
if Diamond >= gamedata.GetFloatValue(v, "Diamond") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
if Lv >= gamedata.GetIntValue(v, "Lv") && Energy >= gamedata.GetFloatValue(v, "Energy") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
ItemId = append(ItemId, gamedata.GetIntValue(v, "ItemId"))
}
}
@ -84,6 +90,7 @@ func GetItemId(Diamond float64, Type int) []int {
func GetType(ItemId int) int {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetType err:%v, ItemId=%d", err, ItemId)
return 0
}
for _, v := range data {
@ -94,14 +101,15 @@ func GetType(ItemId int) int {
return 0
}
func GeDiamondByItemId(ItemId int) float64 {
func GetEnergyByItemId(ItemId int) float64 {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetEnergyByItemId err:%v, ItemId=%d", err, ItemId)
return 0
}
for _, v := range data {
if ItemId == gamedata.GetIntValue(v, "ItemId") {
return gamedata.GetFloatValue(v, "Diamond")
return gamedata.GetFloatValue(v, "Energy")
}
}
return 0

View File

@ -1,42 +0,0 @@
package faceCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_FACE = "Face"
)
func init() {
gamedata.InitCfg(CFG_FACE)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetInitList err: %v", err)
return nil
}
r := make([]int, 0)
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
k, _ := strconv.Atoi(k)
r = append(r, k)
}
}
return r
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("CheckExist err: %v", err)
return false
}
_, ok := data[strconv.Itoa(Id)]
return ok
}

View File

@ -0,0 +1,74 @@
package faceCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_FACE = "Face"
)
func init() {
gamedata.InitCfg(CFG_FACE)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetInitList err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetInitList parse id err:%v, key=%s", err, k)
continue
}
r = append(r, id)
}
}
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("CheckExist err:%v, Id=%d", err, Id)
return false
}
_, ok := data[strconv.Itoa(Id)]
return ok
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetAllId err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetAllId parse id err:%v, key=%s", err, k)
continue
}
r = append(r, Id)
}
return r
}

View File

@ -0,0 +1,70 @@
package friendCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_NPC_FRIENDS = "NPCFriends"
CFG_CONST = "FriendConst"
)
func init() {
gamedata.InitCfg(CFG_NPC_FRIENDS)
gamedata.InitCfg(CFG_CONST)
}
func IsNpcFriend(Id int) bool {
_, err := gamedata.GetDataByIntKey(CFG_NPC_FRIENDS, Id)
if err != nil {
log.Debug("IsNpcFriend err:%v, Id=%d", err, Id)
return false
}
return true
}
func GetFriendSponsorNum() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_energy_bonus")
if err != nil {
log.Debug("GetFriendSponsorNum err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFriendLimitNum() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_limit")
if err != nil {
log.Debug("GetFriendLimitNum err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyRecommendLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_recommend_limit")
if err != nil {
log.Debug("GetDailyRecommendLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetApplyListLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_apply_list_limit")
if err != nil {
log.Debug("GetApplyListLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyGetApplyLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_get_apply_limit")
if err != nil {
log.Debug("GetDailyGetApplyLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -0,0 +1,87 @@
package friendTreasureCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
)
const (
CFG_FRIEND_TREASURE_PROB = "FriendTreasureProb"
CFG_FRIEND_TREASURE_CHEST = "FriendTreasureChest"
CFG_FRIEND_TREASURE_CONST = "FriendTreasureConst"
)
func init() {
gamedata.InitCfg(CFG_FRIEND_TREASURE_PROB)
gamedata.InitCfg(CFG_FRIEND_TREASURE_CHEST)
gamedata.InitCfg(CFG_FRIEND_TREASURE_CONST)
}
func GetBigReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_FRIEND_TREASURE_CONST, "big_reward")
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetFriendTreasureProb(Num int) map[int]int {
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_PROB)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
Prob := gamedata.GetIntValue(v, "Prob")
ProbMap[Id] = Prob
}
AddProb := 0
n := 0
for k, v := range ProbMap {
if k > Num {
AddProb += v
n++
ProbMap[k] = 0
}
}
PerProb := AddProb / n
for k, v := range ProbMap {
if k <= Num && k != 1 {
ProbMap[k] = v + PerProb
}
}
return ProbMap
}
func GetProbAdd(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_PROB, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Add")
}
func GetChestProb() map[int]int {
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_CHEST)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
Prob := gamedata.GetIntValue(v, "Prob")
ProbMap[Id] = Prob
}
return ProbMap
}
func GetChestItems(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_CHEST, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
}

View File

@ -0,0 +1,73 @@
package fur_cfg
import (
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_FUR_CONST = "FurShopConst"
CFG_FUR_SHOP = "FurShop"
)
func init() {
gamedata.InitCfg(CFG_FUR_CONST)
gamedata.InitCfg(CFG_FUR_SHOP)
}
func GetFurShopCost(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Cost")
}
func GetFurShopFreeTimes() int {
data, err := gamedata.GetDataByKey(CFG_FUR_CONST, "free_unlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFurShopTag(id int) int {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "TAG")
}
func GetFurShopName(id int) string {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetFurShopItem(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
itemId := gamedata.GetIntValue(data, "ItemID")
if itemId == 0 {
return nil
}
return []*item.Item{
{
Id: itemId,
Num: 1,
},
}
}
func GetFurShopCostNum(id int) int {
item := GetFurShopCost(id)
if len(item) == 0 {
return 0
}
return item[0].Num
}

View File

@ -0,0 +1,118 @@
package guesscolorCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_GUESS_COLOR_TEMPLATE = "GuessColorTemplate"
CFG_GUESS_COLOR_REWARD = "GuessColorReward"
)
func init() {
gamedata.InitCfg(CFG_GUESS_COLOR_TEMPLATE)
gamedata.InitCfg(CFG_GUESS_COLOR_REWARD)
}
func GetFirstPass(Id int) map[int]int {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetFirstPass err:%v, Id=%d", err, Id)
return nil
}
str := gamedata.GetStringValue(data, "FirstPass")
arr := strings.Split(str, "|")
ret := make(map[int]int, len(arr))
for k, v := range arr {
ret[k+1] = GoUtil.Int(v)
}
return ret
}
func GetLoseItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetLoseItem err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "ItemCost")
}
func GetFirstItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetFirstItem err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "FirstItem")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetActivityItemId err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetRewardItem(Id int, Type int) []*item.Item {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetRewardItem err:%v, Id=%d, Type=%d", err, Id, Type)
return nil
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
if Type == 1 {
return gamedata.GetItemList(v, "Items1")
}
return gamedata.GetItemList(v, "Items2")
}
}
return nil
}
func GetPassNum(Id int) int {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetPassNum err:%v, Id=%d", err, Id)
return 0
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
return gamedata.GetIntValue(v, "Num")
}
}
return 0
}
func GetWinTime(Id int) int {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetWinTime err:%v, Id=%d", err, Id)
return 0
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
Type := gamedata.GetIntValue(v, "Type")
if Type == 1 {
return gamedata.GetIntValue(v, "Win")
}
str := gamedata.GetStringValue(v, "Win")
arr := strings.Split(str, "|")
return GoUtil.RandNum(GoUtil.Int(arr[0]), GoUtil.Int(arr[1]))
}
}
return 0
}

View File

@ -1,4 +1,4 @@
package guildCfg
package guidecfg
import (
"server/game/mod/item"
@ -7,17 +7,17 @@ import (
)
const (
GUILD_REWARD = "GuildReward"
GUIDE_REWARD = "GuideReward"
)
func init() {
gamedata.InitCfg(GUILD_REWARD)
gamedata.InitCfg(GUIDE_REWARD)
}
func GetGuildReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUILD_REWARD, Id)
func GetGuideReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUIDE_REWARD, Id)
if err != nil {
log.Debug("GuildCfg GetGuildReward Id:%v not found", Id)
log.Debug("GetGuideReward err:%v, Id=%d", err, Id)
return nil, 0
}
return item.ParseItem(gamedata.GetValue(data, "Items")), gamedata.GetIntValue(data, "Num")

View File

@ -0,0 +1,119 @@
package GuideTaskCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
GUIDE_TASK_CONST = "GuideTaskConst"
GUIDE_TASK_TASK = "GuideTaskTask"
GUIDE_TASK_ACTIVE = "GuideTaskActive"
)
func init() {
gamedata.InitCfg(GUIDE_TASK_CONST)
gamedata.InitCfg(GUIDE_TASK_TASK)
gamedata.InitCfg(GUIDE_TASK_ACTIVE)
}
func GetTaskRewardById(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskRewardById err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetTaskById(Id int) string {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskById err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Task")
}
func GetTaskActive(Id int) int {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskActive err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Active")
}
func GetUnlock(Id int) int {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetUnlock err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Unlock")
}
func GetActiveReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetActiveReward err:%v, Id=%d", err, Id)
return nil, 0
}
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Active")
}
func GetActiveReward2(reward []int, Active int) []*item.Item {
data, err := gamedata.GetData(GUIDE_TASK_ACTIVE)
if err != nil {
log.Debug("GetActiveReward2 err:%v, Active=%d", err, Active)
return nil
}
for k, v := range data {
active := gamedata.GetIntValue(v, "Active")
if active < Active {
continue
}
if GoUtil.InArray(GoUtil.Int(k), reward) {
continue
}
return gamedata.GetItemList(v, "Items")
}
return nil
}
func GetUnlockLv() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "UnlockLv")
if err != nil {
log.Debug("GetUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDays() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "Days")
if err != nil {
log.Debug("GetDays err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetTaskList(Lv int) map[int]string {
data, err := gamedata.GetData(GUIDE_TASK_TASK)
if err != nil {
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]string, len(data))
for k, v := range data {
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
continue
}
r[k1] = gamedata.GetStringValue(v, "Task")
}
return r
}

View File

@ -0,0 +1,35 @@
package handbookCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_HANDBOOK = "Handbook"
CFG_HANDBOOK_CONST = "HandbookConst"
)
func init() {
gamedata.InitCfg(CFG_HANDBOOK)
gamedata.InitCfg(CFG_HANDBOOK_CONST)
}
func GetHandbookReward(Type string) []*item.Item {
data, err := gamedata.GetDataByKey(CFG_HANDBOOK, Type)
if err != nil {
log.Debug("GetHandbookReward err:%v, Type=%s", err, Type)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetHandbookCollectReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_HANDBOOK_CONST, "collect_item")
if err != nil {
log.Debug("GetHandbookCollectReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}

View File

@ -0,0 +1,24 @@
package inviteCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_INVITE = "Invite"
)
func init() {
gamedata.InitCfg(CFG_INVITE)
}
func GetInviteReward(index int) (int, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CFG_INVITE, index)
if err != nil {
log.Debug("GetInviteReward err:%v, index=%d", err, index)
return 0, nil
}
return gamedata.GetIntValue(data, "Need"), gamedata.GetItemList(data, "Items")
}

View File

@ -1,48 +0,0 @@
package itemCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
var CFG_NAME = "Item"
func init() {
gamedata.InitCfg(CFG_NAME)
}
func GetItemType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemType Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["IType"])
}
func GetItemEffect(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Effect"])
}
func GetItemEffectList(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
return []int{}
}
var res []int
str := gamedata.GetStringValue(data, "Effect")
a := strings.Split(str, ",")
for _, v := range a {
b, _ := strconv.Atoi(v)
res = append(res, b)
}
return res
}

View File

@ -0,0 +1,64 @@
package itemCfg
import (
languageCfg "server/conf/language"
"server/gamedata"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
var CFG_NAME = "Item"
func init() {
gamedata.InitCfg(CFG_NAME)
}
func GetItemType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemType err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "IType")
}
func GetItemEffect(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemEffect err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Effect")
}
func GetItemEffectList(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemEffectList err:%v, Id=%d", err, Id)
return nil
}
str := gamedata.GetStringValue(data, "Effect")
a := strings.Split(str, ",")
res := make([]int, 0, len(a))
for _, v := range a {
b, err := strconv.Atoi(v)
if err != nil {
log.Debug("GetItemEffectList parse err:%v, v=%s", err, v)
continue
}
res = append(res, b)
}
return res
}
func GetItemName(Id int) (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemName err:%v, Id=%d", err, Id)
return "", ""
}
name := gamedata.GetStringValue(data, "Name")
return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, name), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, name)
}

View File

@ -9,9 +9,12 @@ import (
)
var Server struct {
AppID int
AppPath string
LogLevel string
LogPath string
WSAddr string
RPCAddr string
CertFile string
KeyFile string
TCPAddr string
@ -28,6 +31,12 @@ var Server struct {
RedisAddr string
RedisPort string
RedisPwd string
RedisDb int
RedisWriteAddr string // 主写地址host:port 或 单独 host, 仍兼容旧 RedisAddr/RedisPort
RedisReadAddrs string // 只读地址逗号分隔host:port,...
RedisMasterName string // 哨兵模式下的 master 名称
RedisConnType string // "Direct" 或 "Sentinel"
GameName string
ServerType string
@ -39,13 +48,28 @@ var Server struct {
ListenAddr string
CenterAddr string
CenterNode int
RemoteAddr string
RemoteAddr string
GameConfPath string
TELOGDIR string
GoogleVerify bool
Partition int
KafkaHost string
KafkaPort string
Version string
CountryCode string
IdVerify bool
}
func init() {
// data, err := ioutil.ReadFile("conf/server.json")
file, err := os.Open("conf/server.json")
filePath := "conf/server.json"
if len(os.Args) == 2 {
if os.Args[1] != "" && os.Args[1][0] != '-' {
filePath = os.Args[1]
}
}
file, err := os.Open(filePath)
if err != nil {
panic(err)
}

View File

@ -0,0 +1,64 @@
package languageCfg
import (
"server/gamedata"
"server/msg"
)
const (
CFG_LANGUAGE = "LanguageData"
CFG_ALLLANGUAGE = "AllLanguage"
CFG_ALLLANGUAGE_CLIENT = "AllLanguageClient"
)
func init() {
gamedata.InitCfg(CFG_LANGUAGE)
gamedata.InitCfg(CFG_ALLLANGUAGE)
gamedata.InitCfg(CFG_ALLLANGUAGE_CLIENT)
}
func GetLanguage(lang msg.LANG_TYPE, key string) string {
res := _GetClientLanguage(lang, key)
if res != key {
return res
}
return _GetBackendLanguage(lang, key)
}
func _GetClientLanguage(lang msg.LANG_TYPE, key string) string {
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE_CLIENT, key)
if err != nil {
return key
}
switch lang {
case msg.LANG_TYPE_LANG_EN:
return gamedata.GetStringValue(data, "en_US")
case msg.LANG_TYPE_LANG_PTBR:
return gamedata.GetStringValue(data, "pt_BR")
case msg.LANG_TYPE_LANG_CN:
return gamedata.GetStringValue(data, "zh_CN")
case msg.LANG_TYPE_LANG_ES_LATAM:
return gamedata.GetStringValue(data, "es_LATAM")
default:
return key
}
}
func _GetBackendLanguage(lang msg.LANG_TYPE, key string) string {
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE, key)
if err != nil {
return key
}
switch lang {
case msg.LANG_TYPE_LANG_EN:
return gamedata.GetStringValue(data, "en_US")
case msg.LANG_TYPE_LANG_PTBR:
return gamedata.GetStringValue(data, "pt_BR")
case msg.LANG_TYPE_LANG_CN:
return gamedata.GetStringValue(data, "zh_CN")
case msg.LANG_TYPE_LANG_ES_LATAM:
return gamedata.GetStringValue(data, "es_LATAM")
default:
return key
}
}

View File

@ -1,219 +0,0 @@
package limitedTimeEventCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
)
func init() {
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
}
// 获取限时事件触发列表
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT)
if err != nil {
log.Debug("GetLimitedTimeEventCfg err:%v", err)
return nil
}
var res []*gamedata.LimitedTimeEventData
Day, Hour := GoUtil.GetWeekdayAndHour()
for k, v := range data {
weekDay := gamedata.GetIntValue(v, "WeekDay")
startTime := gamedata.GetIntValue(v, "StartTime")
endTime := gamedata.GetIntValue(v, "EndTime")
if weekDay == Day && Hour >= startTime && Hour < endTime {
Id, _ := strconv.Atoi(k)
res = append(res, &gamedata.LimitedTimeEventData{
Id: Id,
EventId: gamedata.GetIntValue(v, "EventId"),
Duration: int64(gamedata.GetIntValue(v, "Duration")),
})
}
}
return res
}
// 获取流星雨加成
func GetMeteorAdd(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
if err != nil {
log.Debug("GetMeteorAdd err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Add")
}
// 获取宝箱雨奖励
func GetChestReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
if err != nil {
log.Debug("GetChestReward err:%v", err)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取超级订单奖励
func GetSuperOrderReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
if err != nil {
log.Debug("GetSuperOrderReward err:%v", err)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取场景冲刺奖励
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
if err != nil {
log.Debug("GetSceneDashReward err:%v", err)
return 0, nil
}
for k, v := range data {
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
}
}
return 0, nil
}
func GetSenceJackpotProb() map[int]int {
r := make(map[int]int)
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
func GetSenceJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取连击快手奖励
func GetFastProduceReward(Times, Energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetSceneDashReward err:%v", err)
return nil
}
for _, v := range data {
if Times == gamedata.GetIntValue(v, "Times") && Energy <= gamedata.GetIntValue(v, "Max") && Energy >= gamedata.GetIntValue(v, "Min") {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetProgressMax() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_max")
if err != nil {
log.Debug("GetProgressMax err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "value")
}
func GetProgressRewardRand(Lv int) map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressRewardRand err:%v", err)
return nil
}
r := make(map[int]int)
for k, v := range data {
if Lv >= gamedata.GetIntValue(v, "Min") && Lv <= gamedata.GetIntValue(v, "Max") {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
}
return r
}
func GetProgressSelectNum(Lv int) int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_lv_num")
if err != nil {
log.Debug("GetProgressSelectNum err:%v", err)
return 0
}
Str := gamedata.GetStringValue(data, "value")
Strarr := strings.Split(Str, ";")
for _, v := range Strarr {
a := strings.Split(v, ",")
if len(a) != 3 {
continue
}
Min, _ := strconv.Atoi(a[0])
Max, _ := strconv.Atoi(a[1])
if Lv >= Min && Lv <= Max {
Num, _ := strconv.Atoi(a[2])
return Num
}
}
return 0
}
func GetProgressReward(RewardId int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressReward err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
if Id == RewardId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}

View File

@ -0,0 +1,456 @@
package limitedTimeEventCfg
import (
"math"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"strings"
)
const (
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT = "LimitedTimeEventChestJackpot"
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
CFG_LIMITED_TIME_EVENT_BONUS = "LimitedTimeEventBonus"
CFG_LIMITED_TIME_EVENT_MONEY = "LimitedTimeEventMoney"
CFG_LIMITED_TIME_EVENT_LUCKY = "LimitedTimeEventLucky"
CFG_LIMTTED_TIME_EVENT_DECORATE_OFF = "LimitedTimeEventDecorateOff"
)
func init() {
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_BONUS)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_MONEY)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_LUCKY)
gamedata.InitCfg(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
}
// 获取限时事件触发列表
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
return nil
}
func GetEventName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT, Id)
if err != nil {
log.Debug("GetEventName err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Name")
}
// 获取流星雨加成
func GetMeteorAdd(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
if err != nil {
log.Debug("GetMeteorAdd err:%v, ChessLv=%d", err, ChessLv)
return 0
}
return gamedata.GetIntValue(data, "Add")
}
// 获取宝箱雨奖励
func GetChestReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
if err != nil {
log.Debug("GetChestReward err:%v, Star=%d", err, Star)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取超级订单奖励
func GetSuperOrderReward(energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
if err != nil {
log.Debug("GetSuperOrderReward err:%v, energy=%d", err, energy)
return nil
}
star := energy
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if star >= Min && star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取场景冲刺奖励
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
if err != nil {
log.Debug("GetSceneDashReward err:%v, Sence=%d, Progress=%d", err, Sence, Progress)
return 0, nil
}
for k, v := range data {
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
}
}
return 0, nil
}
// 获取场景冲刺奖池
func GetSenceJackpotProb() map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
if err != nil {
log.Debug("GetSenceJackpotProb err:%v", err)
return nil
}
r := make(map[int]int, len(data))
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
// 获取场景冲刺奖励
func GetSenceJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取连击快手奖励
func GetFastProduceReward(Energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetFastProduceReward err:%v, Energy=%d", err, Energy)
return nil
}
if len(data) == 0 {
return nil
}
// Convert map to slice for sorting
type sortData struct {
Id string
Energy float64
}
sortedList := make([]sortData, 0, len(data))
energy := float64(Energy) / 10.0
for k, v := range data {
dataEnergy := gamedata.GetFloatValue(v, "EnergyValue")
sortedList = append(sortedList, sortData{k, math.Abs(energy - dataEnergy)})
}
// Sort by Energy in ascending order
sort.Slice(sortedList, func(i, j int) bool {
return sortedList[i].Energy < sortedList[j].Energy
})
return gamedata.GetItemList(data[sortedList[0].Id], "Items")
}
// 获取连击快手最大次数
func GetFastProduceMaxTimes() int {
Max := 0
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetFastProduceMaxTimes err:%v", err)
return 0
}
for _, v := range data {
Max = max(gamedata.GetIntValue(v, "Times"), Max)
}
return Max
}
// 获取进度最大值
func GetProgressMax(Lv, Num int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetProgressMax err:%v, Lv=%d, Num=%d", err, Lv, Num)
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
OrderNumStr := gamedata.GetStringValue(v, "OrderNum")
OrderNum := GoUtil.SplitInt(OrderNumStr, ",")
if Num >= len(OrderNum) {
return OrderNum[len(OrderNum)-1]
} else {
return OrderNum[Num]
}
}
}
return 0
}
func GetBonusLv(Lv int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetBonusLv err:%v, Lv=%d", err, Lv)
return 0
}
for k, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
return GoUtil.Int(k)
}
}
return 0
}
// 获取进度奖励随机
func GetProgressRewardRand(Lv int) map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressRewardRand err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]int, len(data))
for k, v := range data {
if Lv >= gamedata.GetIntValue(v, "BonusLv") {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
}
return r
}
func GetJackpotIdByType(Type int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetJackpotIdByType err:%v, Type=%d", err, Type)
return 0
}
for k, v := range data {
Id := GoUtil.Int(k)
if Type == gamedata.GetIntValue(v, "Type") {
return Id
}
}
return 0
}
// 获取进度选择数量
func GetProgressSelectNum(Lv int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetProgressSelectNum err:%v, Lv=%d", err, Lv)
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
return gamedata.GetIntValue(v, "Option")
}
}
return 0
}
// 获取进度奖励
func GetProgressReward(RewardId int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressReward err:%v, RewardId=%d", err, RewardId)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
if Id == RewardId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取进度奖励类型
func GetProgressRewardType(RewardId int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_JACKPOT, RewardId)
if err != nil {
log.Debug("GetProgressRewardType err:%v, RewardId=%d", err, RewardId)
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetUnlockLv() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "unlock_lv")
if err != nil {
log.Debug("GetUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetCatSaleCD() int64 {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Event_Cooldown_7days")
if err != nil {
log.Debug("GetCatSaleCD err:%v", err)
return 0
}
return int64(gamedata.GetIntValue(data, "Value"))
}
func GetFirstEvent() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "First_Event")
if err != nil {
log.Debug("GetFirstEvent err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFastCD() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Fast_Cd")
if err != nil {
log.Debug("GetFastCD err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPaybackDay() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "payback_day")
if err != nil {
log.Debug("GetPaybackDay err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetHighRollerNeedEnergy() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "High_Roller_Need_Energy")
if err != nil {
log.Debug("GetHighRollerNeedEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetThiefProb() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Thief_Prob")
if err != nil {
log.Debug("GetThiefProb err:%v", err)
return 0
}
value := gamedata.GetStringValue(data, "Value")
a1 := strings.Split(value, "|")
prob := make(map[int]int, len(a1))
for _, v := range a1 {
a2 := strings.Split(v, ":")
prob[GoUtil.Int(a2[0])] = GoUtil.Int(a2[1])
}
return GoUtil.RandMap(prob)
}
// 招财猫
func GetMoneyCat(Id int) (float64, int) {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_MONEY, Id)
if err != nil {
log.Debug("GetMoneyCat err:%v, Id=%d", err, Id)
return 0.0, 0
}
return gamedata.GetFloatValue(data, "Mul"), gamedata.GetIntValue(data, "Cd")
}
func GetMoneyCatMax() int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_MONEY)
if err != nil {
log.Debug("GetMoneyCatMax err:%v", err)
return 0
}
return len(data)
}
func GetLuckyCatMaxEarning(Remain int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_LUCKY)
if err != nil {
log.Debug("GetLuckyCatMaxEarning err:%v, Remain=%d", err, Remain)
return 0
}
type d struct {
t int
e int
}
l := make([]d, 0, len(data))
for k, v := range data {
t := GoUtil.Int(k)
e := gamedata.GetIntValue(v, "Earn")
l = append(l, d{t, e})
}
sort.Slice(l, func(i, j int) bool {
return l[i].t < l[j].t
})
for _, v := range l {
if Remain <= v.t {
return v.e
}
}
return 0
}
func GetCatTrickEnergy() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_ConsumeEnergy")
if err != nil {
log.Debug("GetCatTrickEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetCatTrickDiamond() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_RewardDiamond")
if err != nil {
log.Debug("GetCatTrickDiamond err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDecorateOffDiscount(AreaId, StepId int) int {
data, err := gamedata.GetData(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
if err != nil {
log.Debug("GetDecorateOffDiscount err:%v, AreaId=%d, StepId=%d", err, AreaId, StepId)
return 100
}
for _, v := range data {
StartAreaId := gamedata.GetIntValue(v, "StartArea")
EndAreaId := gamedata.GetIntValue(v, "EndArea")
StartStepId := gamedata.GetIntValue(v, "StartStep")
EndStepId := gamedata.GetIntValue(v, "EndStep")
if AreaId >= StartAreaId && AreaId <= EndAreaId && StepId >= StartStepId && StepId <= EndStepId {
return gamedata.GetIntValue(v, "Off")
}
}
return 100
}

View File

@ -0,0 +1,112 @@
package mailCfg
import (
"fmt"
languageCfg "server/conf/language"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/msg"
"strings"
)
const (
CFG_LOGIN_BACK = "LoginBack"
CFG_MAIL = "Mail"
MAIL_RECALL_ID = 12
MAIL_CHARGE_SEND_ID = 13
MAIL_CHARGE_RECEIVE_ID = 14
)
type TriggerMail struct {
Id int
Title string
SubTitle string
Content string
EnglistTitle string
SubTitleEn string
EnglistContent string
Items []*item.Item
Type int
Trigger []string
}
func init() {
gamedata.InitCfg(CFG_LOGIN_BACK)
gamedata.InitCfg(CFG_MAIL)
}
func GetLoginBack(Id string) (int, int) {
data, err := gamedata.GetDataByKey(CFG_LOGIN_BACK, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "Num1"), gamedata.GetIntValue(data, "Num2")
}
func GetTriggerMail() []*TriggerMail {
data, err := gamedata.GetData(CFG_MAIL)
if err != nil {
return nil
}
ret := make([]*TriggerMail, 0)
for k, v := range data {
T := gamedata.GetStringValue(v, "Trigger")
if T == "" {
continue
}
T1 := strings.Split(T, "|")
if len(T1) < 4 {
continue
}
data := &TriggerMail{
Id: GoUtil.Int(k),
Title: gamedata.GetStringValue(v, "Title"),
Content: gamedata.GetStringValue(v, "Content"),
EnglistTitle: gamedata.GetStringValue(v, "EnglistTitle"),
EnglistContent: gamedata.GetStringValue(v, "EnglistContent"),
Items: gamedata.GetItemList(v, "Items"),
Type: gamedata.GetIntValue(v, "Type"),
Trigger: strings.Split(T, "|"),
}
ret = append(ret, data)
}
return ret
}
func GetRecallMail(Title, ItemName, TitleEn, ItemNameEn string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, 12)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return fmt.Sprintf(mt, Title), fmt.Sprintf(mc, Title, ItemName), fmt.Sprintf(mt_en, TitleEn), fmt.Sprintf(mc_en, Title, ItemNameEn)
}
func GetChargeSendMail(PlayerName string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_SEND_ID)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return mt, fmt.Sprintf(mc, PlayerName), mt_en, fmt.Sprintf(mc_en, PlayerName)
}
func GetChargeReceiveMail(PlayerName string, Content string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_RECEIVE_ID)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return fmt.Sprintf(mt, PlayerName), fmt.Sprintf(mc, Content), fmt.Sprintf(mt_en, PlayerName), fmt.Sprintf(mc_en, Content)
}

View File

@ -1,188 +0,0 @@
package mergeDataCfg
import (
"errors"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
// 棋子类型
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
CHESS_PRODUCT_SUB_TYPE = 2 // 次产物
CHESS_PRODUCT_SUB_EMIT_TYPE = 3 // 次发射器产物
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CONST_NAME)
}
// 获取单个数据
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return &gamedata.MergeDataRecord{}, errors.New("not found")
}
return &gamedata.MergeDataRecord{
Id: gamedata.ParseInt(data["Id"]),
Lv: gamedata.ParseInt(data["Lv"]),
MaxLv: gamedata.ParseInt(data["MaxLv"]),
SellType: gamedata.ParseString(data["SellType"]),
SellNum: gamedata.ParseInt(data["SellNum"]),
SellDiamond: gamedata.ParseInt(data["SellDiamond"]),
Color: gamedata.ParseString(data["Color"]),
Star: gamedata.ParseInt(data["Star"]),
Type: gamedata.ParseString(data["Type"]),
Emit_Product: gamedata.ParseString(data["Emit_Product"]),
CoolTime: gamedata.ParseInt(data["CoolTime"]),
}, nil
}
// 根据id获取棋子获得的星星
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Star"])
}
// 根据等级和颜色获取棋子id
func GetChessIdByLvAndColor(Lv int, Color string) int {
if Lv == 0 || Color == "" {
return 0
}
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
color := gamedata.GetStringValue(v, "Color")
if Lv == lv && color == Color {
Id, _ := strconv.Atoi(k)
return Id
}
}
return 0
}
// 根据Id获取棋子等级
func GetLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Lv"])
}
// 根据Id获取棋子最大等级
func GetMaxLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["MaxLv"])
}
// 根据Id获取棋子类型
func GetTypeById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Type"])
}
// 根据Id获取棋子类型
func GetColorById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetColorById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Color"])
}
// 根据Id获取发射器产出类型
func GetEmitProduceType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return []string{}
}
return strings.Split(gamedata.ParseString(data["Emit_Product"]), ",")
}
// 根据Id获取发射器Id
func GetEmitId(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Emit_ID"])
}
// 获取常量
func GetConst(Key string) string {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return ""
}
return gamedata.ParseString(data["Value"])
}
// 获取常量
func GetConstInt(Key string) int {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return 0
}
return gamedata.ParseInt(data["Value"])
}
func GetExtraEmitId() map[string]struct{} {
Value := GetConst("EmitId_Extra_Order")
arr := strings.Split(Value, ",")
var r = make(map[string]struct{})
for _, v := range arr {
r[v] = struct{}{}
}
return r
}
func GetProductType(Chess int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Chess)
if err != nil {
log.Debug("GetProductType GetOne Id:%v not found", Chess)
return 0
}
return gamedata.ParseInt(data["PType"])
}
func GetChessBagMaxGrid() int {
return GetConstInt("chess_bag_max")
}
func GetChessBagBugNum() int {
return GetConstInt("chess_bag_buy")
}
func GetChessBagInitNum() int {
return GetConstInt("chess_bag_init")
}

View File

@ -0,0 +1,619 @@
package mergeDataCfg
import (
"errors"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
CFG_MERGE_EMIT = "MergeDataEmit"
// 棋子类型
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
CHESS_PRODUCT_SECONDARY_TYPE = 2 // 次产物
CHESS_PRODUCT_SUB_TYPE = 3 // 子发射器产物
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CONST_NAME)
gamedata.InitCfg(CFG_MERGE_EMIT)
}
func GetEmitTypeByColor(Color string) string {
data, err := gamedata.GetData(CFG_MERGE_EMIT)
if err != nil {
return ""
}
for k, v := range data {
ColorList := strings.Split(gamedata.GetStringValue(v, "Order_Type"), ",")
if GoUtil.InStringArray(Color, ColorList) {
return k
}
}
return ""
}
func GetEmitProduce(EmitType string) []string {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
if err != nil {
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Product_Type"), ",")
}
func GetEmitOrderProduce(EmitType string) []string {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
if err != nil {
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Order_Type"), ",")
}
// 获取单个数据
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return &gamedata.MergeDataRecord{}, errors.New("not found")
}
return &gamedata.MergeDataRecord{
Id: gamedata.GetIntValue(data, "Id"),
Lv: gamedata.GetIntValue(data, "Lv"),
MaxLv: gamedata.GetIntValue(data, "MaxLv"),
SellType: gamedata.GetStringValue(data, "SellType"),
SellNum: gamedata.GetIntValue(data, "SellNum"),
SellDiamond: gamedata.GetIntValue(data, "SellDiamond"),
Color: gamedata.GetStringValue(data, "Color"),
Star: gamedata.GetIntValue(data, "Star"),
Type: gamedata.GetStringValue(data, "Type"),
Emit_Product: gamedata.GetStringValue(data, "Emit_Product"),
CoolTime: gamedata.GetIntValue(data, "CoolTime"),
Emit_Type: gamedata.GetStringValue(data, "Emit_Type"),
}, nil
}
// 根据id获取棋子获得的星星
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Star")
}
func GetNameById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Title")
}
// 根据等级和颜色获取棋子id
func GetChessIdByLvAndColor(Lv int, Color string) int {
if Lv == 0 || Color == "" {
return 0
}
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
color := gamedata.GetStringValue(v, "Color")
if Lv == lv && color == Color {
Id, _ := strconv.Atoi(k)
return Id
}
}
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
// 根据Id获取棋子等级
func GetLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
//log.Debug("GetLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Lv")
}
// 根据Id获取棋子最大等级
func GetMaxLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
// log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "MaxLv")
}
// 根据Id获取棋子最大等级
func GetMaxLvByColor(Color string) int {
ChessId := GetChessIdByLvAndColor(1, Color)
data, err := gamedata.GetDataByIntKey(CFG_NAME, ChessId)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "MaxLv")
}
// 根据Id获取发射器最小等级
func GetEmitMinLvById(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
// log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Emit_Min_Lv")
}
// 根据Id获取发射器修正系数
func GetEmitRatio(Id string) float64 {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
// log.Debug("GetEmitRatio GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetFloatValue(data, "Ratio")
}
func GetEmitRetire(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
log.Debug("GetEmitRetire GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Retire")
}
func GetEmitProductNumByColor(Id string) int {
data, err := gamedata.GetData(CFG_MERGE_EMIT)
if err != nil {
log.Debug("GetEmitProductNumByColor GetOne Id:%v not found", Id)
return 0
}
for _, v := range data {
ColorList := strings.Split(gamedata.GetStringValue(v, "Product_Type"), ",")
if GoUtil.InStringArray(Id, ColorList) {
return len(strings.Split(gamedata.GetStringValue(v, "Product_Type"), ","))
}
}
return 0
}
// 根据Id获取棋子类型
func GetTypeById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Type")
}
// 根据Id获取棋子类型
func GetColorById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetColorById GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Color")
}
// 根据Id获取棋子类型
func GetSellNumById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetSellNumById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "SellNum")
}
// 根据Id获取发射器产出类型
func GetEmitProduceType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetEmitProduceType GetOne Id:%v not found", Id)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Emit_Product"), ",")
}
// 根据Id获取发射器产出类型
func GetEmitProduceChessType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
//log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id)
return []string{}
}
value := gamedata.GetStringValue(data, "Product_Type")
if value == "" {
return []string{}
}
return strings.Split(value, ",")
}
// 根据Id获取发射器Id
func GetEmitId(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
// log.Debug("GetEmitId GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Emit_ID")
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
return []int{}
}
key := make([]int, 0, len(data))
for k := range data {
key = append(key, GoUtil.Int(k))
}
return key
}
func GetEmitType(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetEmitType GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Emit_Type")
}
func GetEmitN(EmitSeries string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitSeries)
if err != nil {
log.Debug("GetEmitN GetOne EmitSeries:%v not found", EmitSeries)
return 0
}
return gamedata.GetIntValue(data, "N")
}
// 获取常量
func GetConst(Key string) string {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return ""
}
return gamedata.GetStringValue(data, "Value")
}
// 获取常量
func GetConstInt(Key string) int {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetExtraEmitId() map[string]struct{} {
Value := GetConst("EmitId_Extra_Order")
arr := strings.Split(Value, ",")
var r = make(map[string]struct{})
for _, v := range arr {
r[v] = struct{}{}
}
return r
}
func GetChessBagMaxGrid() int {
return GetConstInt("chess_bag_max")
}
func GetChessBagBugNum() int {
return GetConstInt("chess_bag_buy")
}
func GetChessBagInitNum() int {
return GetConstInt("chess_bag_init")
}
func GetSourceChestItem() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "source_chest_reward")
if err != nil {
log.Debug("GetSourceChestItem GetOne not found")
return nil
}
Str := gamedata.GetStringValue(data, "Value")
A1 := strings.Split(Str, "|")
var r []*item.Item
if len(A1) < 2 {
return r
}
A2 := strings.Split(A1[0], "/")
A3 := GoUtil.StringToInt(A2)
A4 := GoUtil.RandSlice(A3)
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
B2 := strings.Split(A1[1], "/")
B3 := GoUtil.StringToInt(B2)
B4 := GoUtil.RandSlice(B3)
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
return r
}
func GetHighSourceChestItem() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "high_source_chest_reward")
if err != nil {
log.Debug("GetHighSourceChestItem GetOne not found")
return nil
}
Str := gamedata.GetStringValue(data, "Value")
A1 := strings.Split(Str, "|")
var r []*item.Item
if len(A1) < 2 {
return r
}
A2 := strings.Split(A1[0], "/")
A3 := GoUtil.StringToInt(A2)
A4 := GoUtil.RandSlice(A3)
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
B2 := strings.Split(A1[1], "/")
B3 := GoUtil.StringToInt(B2)
B4 := GoUtil.RandSlice(B3)
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
return r
}
func GetRetireReward() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "retire_reward")
if err != nil {
log.Debug("GetRetireReward GetOne not found")
return nil
}
return gamedata.GetItemList(data, "Value")
}
func DynamicLevRev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
// log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return Lv + NewLv
}
}
return Lv
}
func DynamicLev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return Lv - NewLv
}
}
return Lv
}
func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
BaseLv := Lv
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color1 == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
BaseLv = Lv + NewLv
}
}
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color2 == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return BaseLv - NewLv
}
}
return Lv
}
func DynamicAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
DynamicLv := ""
switch EnergyMul {
case 0:
DynamicLv = gamedata.GetStringValue(data, "Dynamic")
case 1, 2:
DynamicLv = gamedata.GetStringValue(data, "Dynamic1")
case 3, 4:
DynamicLv = gamedata.GetStringValue(data, "Dynamic2")
default:
DynamicLv = gamedata.GetStringValue(data, "Dynamic3")
}
if DynamicLv == "" {
return 0
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return NewLv
}
}
return 0
}
func GetAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
AdjustLv := ""
switch EnergyMul {
case 0:
AdjustLv = gamedata.GetStringValue(data, "Dynamic")
case 1, 2:
AdjustLv = gamedata.GetStringValue(data, "Dynamic1")
case 3, 4:
AdjustLv = gamedata.GetStringValue(data, "Dynamic2")
default:
AdjustLv = gamedata.GetStringValue(data, "Dynamic3")
}
if AdjustLv == "" {
return 0
}
Arr := strings.Split(AdjustLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return NewLv
}
}
return 0
}
func GetSellDiamondMul(EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("GetSellDiamondMul GetOne EmitId:%v not found", EmitId)
return 0
}
ProductEmit := gamedata.GetStringValue(data, "Emit_Product")
if ProductEmit == "" {
return 1
}
Arr := strings.Split(ProductEmit, ",")
if Color == Arr[0] {
return 1
}
if !GoUtil.InStringArray(Color, Arr) {
return 1
}
Emit_List := gamedata.GetStringValue(data, "Emit_List")
MainProb := getColorProb(Emit_List, Arr[0])
SubProb := getColorProb(Emit_List, Color)
return int(MainProb / SubProb)
}
func getColorProb(Emit_List string, Color string) float64 {
Arr := strings.Split(Emit_List, ",")
Prob := 0.0
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
A1 := GoUtil.Int(Arr2[0])
A2, _ := strconv.ParseFloat(Arr2[1], 64)
A1Color := GetColorById(A1)
if A1Color != Color {
continue
}
Prob += A2 * float64(A1%10)
}
return Prob
}
func GetMergeStar(MergeList []int) int {
Star := 0
for _, v := range MergeList {
Star += GetStarById(v)
}
return Star
}
func GetAllChessBySeries(Series string) []int {
data, err := gamedata.GetData(CFG_NAME)
ProductList := GetEmitProduce(Series)
if err != nil {
return []int{}
}
var r []int
for k, v := range data {
Type := gamedata.GetStringValue(v, "Type")
if Type == "Emitter" {
EmitId := gamedata.GetStringValue(v, "Emit_ID")
if EmitId == Series {
r = append(r, GoUtil.Int(k))
}
}
if Type == "Product" {
Color := gamedata.GetStringValue(v, "Color")
if GoUtil.InStringArray(Color, ProductList) {
r = append(r, GoUtil.Int(k))
}
}
}
return r
}

View File

@ -0,0 +1,130 @@
package miningCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"strconv"
"strings"
)
const (
CFG_MINING_TEMPLATE = "MiningTemplate"
CFG_MINING_JACKPOT = "MiningJackpot"
CFG_MINING_GEM = "MiningGem"
CFG_MINING_PASS = "MiningPass"
)
func init() {
gamedata.InitCfg(CFG_MINING_TEMPLATE)
gamedata.InitCfg(CFG_MINING_JACKPOT)
gamedata.InitCfg(CFG_MINING_GEM)
gamedata.InitCfg(CFG_MINING_PASS)
}
func GetTemplate(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetLoseItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "ItemCost")
}
func GetStartItemNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "StartItemNum")
}
func GetPassArea(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return 0
}
Area := gamedata.GetStringValue(data, "Area")
strArr := strings.Split(Area, "*")
a, _ := strconv.Atoi(strArr[0])
b, _ := strconv.Atoi(strArr[1])
return a * b
}
func GetPassGem(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return nil
}
Gem := gamedata.GetStringValue(data, "Gem")
strArr := strings.Split(Gem, "|")
result := make([]int, 0, len(strArr))
for _, v := range strArr {
a, _ := strconv.Atoi(v)
result = append(result, a)
}
return result
}
func GetRandItem() []*item.Item {
data, err := gamedata.GetData(CFG_MINING_JACKPOT)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
ProbMap[Id] = gamedata.GetIntValue(v, "Prob")
}
RandId := GoUtil.RandMap(ProbMap)
Info, _ := gamedata.GetDataByIntKey(CFG_MINING_JACKPOT, RandId)
return gamedata.GetItemList(Info, "Items")
}
func GetPassItem(Id int, orderFactor int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return nil
}
items := gamedata.GetItemList(data, "Items")
starReward := gamedata.GetIntValue(data, "StarReward")
var starnum int
if starReward > 0 {
starnum = int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: starnum,
})
}
}
return items
}
func GetPassItemList(orderFactor int) map[int][]*item.Item {
data, err := gamedata.GetData(CFG_MINING_PASS)
if err != nil {
return nil
}
result := make(map[int][]*item.Item)
for k := range data {
Id := GoUtil.Int(k)
result[Id] = GetPassItem(Id, orderFactor)
}
return result
}

View File

@ -0,0 +1,43 @@
package notification_cfg
import "server/gamedata"
const (
CFG_NOTIFICATION = "Notification"
)
func init() {
gamedata.InitCfg(CFG_NOTIFICATION)
}
func GetFriendApplyNotificationCooldown() int {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Cooldown")
}
func GetPetroomGameNotificationCooldown() (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "Cooldown"), gamedata.GetIntValue(data, "DailyLimit")
}
func GetPetroomGameNotificationMsg() (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
if err != nil {
return "", ""
}
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
}
func GetFriendApplyNotificationMsg() (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
if err != nil {
return "", ""
}
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
}

View File

@ -1,38 +0,0 @@
package orderCfg
import (
"server/gamedata"
)
const (
CFG_ORDER_DATA = "OrderData"
CFG_ORDER_CHESS_DATA = "OrderChessData"
)
func init() {
gamedata.InitCfg(CFG_ORDER_DATA)
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
}
func GetLvMin(EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LvMin")
}
func GetLvMax(EnergyMul, N int) int {
if v, ok := gamedata.G_AllConfigsJsonData["OrderChessData"]; ok {
data := v.GetData()
for _, v := range data {
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
Min := gamedata.GetIntValue(v, "MinN")
Max := gamedata.GetIntValue(v, "MaxN")
if dEnergy == EnergyMul && N >= Min && N <= Max {
return gamedata.GetIntValue(v, "MaxLv")
}
}
}
return 0
}

View File

@ -0,0 +1,190 @@
package orderCfg
import (
"math"
"server/gamedata"
"sort"
"strconv"
)
const (
CFG_ORDER_DATA = "OrderData"
CFG_ORDER_CHESS_DATA = "OrderChessData"
CFG_ORDER_NUM_DATA = "OrderNumData"
CFG_START_ORDER = "StartOrder"
CFG_CONST = "OrderConst"
CFG_ORDER_SCENE = "OrderScene"
CFG_ORDER_K = "OrderK"
)
func init() {
gamedata.InitCfg(CFG_ORDER_DATA)
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
gamedata.InitCfg(CFG_ORDER_NUM_DATA)
gamedata.InitCfg(CFG_START_ORDER)
gamedata.InitCfg(CFG_CONST)
gamedata.InitCfg(CFG_ORDER_SCENE)
gamedata.InitCfg(CFG_ORDER_K)
}
func GetOrderK(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_K, Lv)
if err != nil {
return 0
}
Energy := gamedata.GetIntValue(data, "Energy")
K := gamedata.GetFloatValue(data, "K")
return int(math.Round(float64(Energy)*K/10) * 10)
}
func GetOrderFactor(Scene int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_SCENE, Scene)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Factor")
}
func GetEmitExtraOrder() string {
data, err := gamedata.GetDataByKey(CFG_CONST, "EmitId_Extra_Order")
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Value")
}
func GetLvMin(EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LvMin")
}
func GetLvMax(EnergyMul, N int) int {
data, err := gamedata.GetData(CFG_ORDER_CHESS_DATA)
if err != nil {
return 0
}
for _, v := range data {
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
Min := gamedata.GetIntValue(v, "MinN")
Max := gamedata.GetIntValue(v, "MaxN")
if dEnergy == EnergyMul {
if N >= Min && N <= Max {
return gamedata.GetIntValue(v, "MaxLv")
}
}
}
return 0
}
func GetOrderNum(Level int) int {
data, err := gamedata.GetData(CFG_ORDER_NUM_DATA)
if err != nil {
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Level >= Min && Level <= Max {
return gamedata.GetIntValue(v, "Num")
}
}
return 0
}
func GetStartOrderInfo(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
if err != nil {
return -1, -1
}
return gamedata.GetIntValue(data, "group"), gamedata.GetIntValue(data, "step")
}
func GetStartOrderList() []*gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return []*gamedata.StartOrderData{}
}
ret := make([]*gamedata.StartOrderData, 0, len(data))
for k, v := range data {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
Appear: gamedata.GetStringValue(v, "appear"),
Preview: gamedata.GetStringValue(v, "preview"),
Items: gamedata.GetItemList(v, "reward"),
Group: gamedata.GetIntValue(v, "group"),
Step: gamedata.GetIntValue(v, "step"),
})
}
sort.Slice(ret, func(i, j int) bool {
return ret[i].Id < ret[j].Id
})
return ret
}
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return []*gamedata.StartOrderData{}
}
ret := make([]*gamedata.StartOrderData, len(data))
for k, v := range data {
stepVal := gamedata.GetIntValue(v, "step")
if int(stepVal) == id {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
Step: int(stepVal),
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
})
}
}
sort.Slice(ret, func(i, j int) bool {
return ret[i].Id < ret[j].Id
})
return ret
}
func GetStartOrderById(id int) *gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return nil
}
v, ok := data[strconv.Itoa(id)]
if !ok {
return nil
}
stepVal := gamedata.GetIntValue(v, "step")
return &gamedata.StartOrderData{
Id: id,
Step: int(stepVal),
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
}
}
func GetMaxStep() int {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return 0
}
max := 0
for _, v := range data {
stepVal := gamedata.GetIntValue(v, "step")
if int(stepVal) > max {
max = int(stepVal)
}
}
return max
}
func GetOrderType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "type")
}

View File

@ -0,0 +1,122 @@
package passCfg
import (
"server/game/mod/item"
"server/gamedata"
"slices"
)
const (
CFG_PASS_TEMPLATE = "PassTemplate"
CFG_PASS = "Pass"
)
func init() {
gamedata.InitCfg(CFG_PASS_TEMPLATE)
gamedata.InitCfg(CFG_PASS)
}
func GetTemplate(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetLowChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LowChargeId")
}
func GetHighChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "HighChargeId")
}
func GetNewLevel(Template int, Score int, Reward []int) []int {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
NewReward := make([]int, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
LevelScore := gamedata.GetIntValue(v, "TotalScore")
Index := gamedata.GetIntValue(v, "Level")
if Score >= LevelScore && !slices.Contains(Reward, Index) {
NewReward = append(NewReward, Index)
}
}
return NewReward
}
func GetFreeChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "FreeReward")...)
}
}
return Items
}
func GetLowChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "LowReward")...)
}
}
return Items
}
func GetHighChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "HighReward")...)
}
}
return Items
}

View File

@ -0,0 +1,722 @@
package playroomCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_PLAYROOM_CONST = "PlayroomConst"
CFG_PLAYROOM_DECORATE = "PlayroomDecorate"
CFG_PLAYROOM_MOOD = "PlayroomMood"
CFG_PLAYROOM_PHYSIOLOGY = "PlayroomPhysiology"
CFG_PLAYROOM_PHYSIOLOGY_TYPE = "PlayroomPhysiologyType"
CFG_PLAYROOM_SHOP = "PlayroomShop"
CFG_PLAYROOM_DRESS = "PlayroomDress"
CFG_PLAYROOM_AIR = "PlayroomAir"
CFG_PLAYROOM_LOCK = "PlayroomLock"
CFG_PLAYROOM_DAILYTASK = "PlayroomDailyTask"
CFG_PLAYROOM_DAILYTASKREWARD = "PlayroomDailyTaskReward"
CFG_PLAYROOM_TASKJACKPOT = "PlayroomTaskJackpot"
CFG_PLAYROOM_ORDERITEM = "PlayroomOrderItem" // 订单物品
)
func init() {
gamedata.InitCfg(CFG_PLAYROOM_CONST)
gamedata.InitCfg(CFG_PLAYROOM_DECORATE)
gamedata.InitCfg(CFG_PLAYROOM_MOOD)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
gamedata.InitCfg(CFG_PLAYROOM_SHOP)
gamedata.InitCfg(CFG_PLAYROOM_DRESS)
gamedata.InitCfg(CFG_PLAYROOM_AIR)
gamedata.InitCfg(CFG_PLAYROOM_LOCK)
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASK)
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASKREWARD)
gamedata.InitCfg(CFG_PLAYROOM_TASKJACKPOT)
gamedata.InitCfg(CFG_PLAYROOM_ORDERITEM)
}
func GetShopItem(Id int) (int, []*item.Item, int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil {
return 0, nil, 0, 0
}
return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Discount"), gamedata.GetIntValue(data, "Limit")
}
func GetShopWeeklyLimit() map[int]gamedata.WeeklyDiscountInfo {
r := make(map[int]gamedata.WeeklyDiscountInfo)
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
if err != nil {
return r
}
for k, v := range data {
Id := GoUtil.Int(k)
Limit := gamedata.GetIntValue(v, "Limit")
if Limit == 0 {
continue
}
r[Id] = gamedata.WeeklyDiscountInfo{
Id: Id,
Discount: gamedata.GetIntValue(v, "Discount"),
WeeklyLimit: Limit,
}
}
return r
}
func GetShopWish(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Wish")
}
func GetUnLockLv() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Lv")
if err != nil {
return 999
}
return gamedata.GetIntValue(data, "Value")
}
func GetGameOutline() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "GameOutline")
if err != nil {
return 999
}
return gamedata.GetIntValue(data, "Value")
}
func GetChipNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "ChipNum")
if err != nil {
return 12
}
return gamedata.GetIntValue(data, "Value")
}
func GetOrderStar() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Star")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetRewardStar() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RewardStar")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetTriggerCd() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "CD")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetFoodItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Food")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetCleanItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Clean")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetToyItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Toy")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetDailyItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Daily")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetPremiumItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PremiumItem")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetInteractNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractNum")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInteractUnlock() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractUnlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetVisitorItem() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "VisitorItem")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetWorkItem() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkItem")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetWorkChargeId() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkChargeId")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetJackpotNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Jackpot")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInteract(Id, Type int) (int, []*item.Item, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0, nil, 0
}
if Type == 1 {
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Effect")
}
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost2"), gamedata.GetIntValue(data, "Effect")
}
func GetInteractPhysiology(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "PType"), gamedata.GetIntValue(data, "PEffect")
}
func GetInteractPExp(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "PExp")
}
func GetInitDecorate() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetDecorateList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetBuyItem(Id int) ([]*item.Item, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return nil, nil
}
return gamedata.GetItemList(data, "Cost2"), gamedata.GetItemList(data, "Buy")
}
func GetPhysiologyMax(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Max")
}
func GetPhysiologyDuration(Id int, Num int) int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY)
if err != nil {
return 0
}
for _, v := range data {
Type := gamedata.GetIntValue(v, "Type")
if Type != Id {
continue
}
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Num >= Min && Num <= Max {
return gamedata.GetIntValue(v, "Per") * 60
}
}
return 0
}
func GetPhysiologyTypeList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetMoodEffect(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "MType"), gamedata.GetIntValue(data, "MEffect")
}
func IsStokeCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "StokeCatId")
if err != nil {
return false
}
return gamedata.GetIntValue(data, "Value") == Id
}
func IsTakeCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "TakeCatId")
if err != nil {
return false
}
Ids := gamedata.GetIntSliceValue(data, "Value")
return GoUtil.InArray(Id, Ids)
}
func GetRoomPointInvite() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointInvite")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetRoomPointAdd() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointAdd")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func IsPlayCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PlayCatId")
if err != nil {
return false
}
Ids := gamedata.GetIntSliceValue(data, "Value")
return GoUtil.InArray(Id, Ids)
}
func GetInitAirList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetAirList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetInitDressList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetDressList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetDressPart(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "IPart")
}
func GetDressName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetUnlockNeed(Type int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetUnlockName(Type int) string {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetDailyTask(Type int) map[int]string {
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
if err != nil {
return nil
}
r := make(map[int]string)
r1 := make([]int, 0, len(data))
r2 := make(map[int]string)
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == Type {
k1 := GoUtil.Int(k)
r[k1] = gamedata.GetStringValue(v, "Task")
r1 = append(r1, k1)
}
}
daily_group_num := 0
switch Type {
case 1:
daily_group_num = GetPlayroomTaskDailyNum1()
case 2:
daily_group_num = GetPlayroomTaskDailyNum2()
}
r3 := GoUtil.RandSliceNum(r1, daily_group_num)
for _, v := range r3 {
r2[v] = r[v]
}
return r2
}
func GetDailyTaskType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASK, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetDailyTaskReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASKREWARD, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取场景冲刺奖池
func GetTaskJackpotProb() map[int]int {
r := make(map[int]int)
data, err := gamedata.GetData(CFG_PLAYROOM_TASKJACKPOT)
if err != nil {
log.Debug("GetTaskJackpotProb err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
// 获取场景冲刺奖励
func GetTaskJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_TASKJACKPOT, Id)
if err != nil {
log.Debug("GetTaskJackpotReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetPhysiologyList(MoodType int) []int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "MType") == MoodType {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetInteractIdBath() []int {
return []int{11, 12, 13}
}
func GetOrderItemByGrade(Grade int) map[int][]int {
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
if err != nil {
log.Debug("GetOrderItemByGrade err:%v", err)
return nil
}
r := make(map[int][]int)
for k, v := range data {
GradeStr := gamedata.GetStringValue(v, "Grade")
GradeList := make([]int, 0)
for _, v1 := range strings.Split(GradeStr, ",") {
v2 := GoUtil.Int(v1)
if v2 > 0 {
GradeList = append(GradeList, v2)
}
}
if !GoUtil.InArray(Grade, GradeList) {
continue
}
Id := GoUtil.Int(k)
Type := gamedata.GetIntValue(v, "Type")
if Type == 0 {
continue
}
if _, ok := r[Type]; !ok {
r[Type] = make([]int, 0)
}
if Id == 0 {
log.Debug("GetOrderItemByGrade Id is 0, Type:%v", Type)
continue
}
r[Type] = append(r[Type], Id)
}
return r
}
func GetOrderItemList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
if err != nil {
log.Debug("GetOrderItemList err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id := GoUtil.Int(k)
if Id == 0 {
log.Debug("GetOrderItemList Id is 0")
continue
}
r = append(r, Id)
}
return r
}
func GetPetOrderItemExpByList(ItemList []*item.Item) int {
r := 0
for _, v := range ItemList {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_ORDERITEM, v.Id)
if err != nil {
// log.Debug("GetPetOrderItemExpByList err:%v", err)
continue
}
Star := gamedata.GetIntValue(data, "Star")
r += Star * v.Num
}
return r
}
func GetShopItemAdNum(Id int) int {
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
if err != nil {
log.Debug("GetShopItemAdNum err:%v", err)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ItemId") == Id {
return gamedata.GetIntValue(v, "Dailystorage")
}
}
return 0
}
func GetDecoInfo(Id int) (int, string) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DECORATE, Id)
if err != nil {
log.Debug("GetDecoInfo err:%v", err)
return 0, ""
}
Type := gamedata.GetIntValue(data, "TypeEnum")
Name := gamedata.GetStringValue(data, "Chinese")
return Type, Name
}
func GetDailyTaskListById(Id int) []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
if err != nil {
log.Debug("GetDailyTaskListById err:%v", err)
return nil
}
Type := GetDailyTaskType(Id)
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == Type {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetItemAddPhysiology(Item map[int]int) int {
r := 0
data, err := gamedata.GetData(CFG_PLAYROOM_MOOD)
if err != nil {
log.Debug("GetItemAddPhysiology err")
return 0
}
for _, v := range data {
costItem := gamedata.GetItemList(v, "Cost2")
if len(costItem) < 1 {
continue
}
if costItem[0].Id == 0 {
continue
}
if val, ok := Item[costItem[0].Id]; ok {
r += gamedata.GetIntValue(v, "PEffect") * val
}
}
return r
}
func GetPlayroomTaskDailyNum1() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum1")
if err != nil {
log.Debug("GetPlayroomTaskDailyNum1 err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPlayroomTaskDailyNum2() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum2")
if err != nil {
log.Debug("GetPlayroomTaskDailyNum2 err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -0,0 +1,78 @@
package raceCfg
import (
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_RACE_TEMPLATE = "RaceTemplate"
CFG_RACE_PASS = "RacePass"
)
func init() {
gamedata.InitCfg(CFG_RACE_TEMPLATE)
gamedata.InitCfg(CFG_RACE_PASS)
}
func GetRaceNum(Pass int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Num")
}
func GetRaceNeed(Pass int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetMaxPass(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "PassNum")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetCD(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Cd")
}
func GetCoin(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetExtraReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "ExtraReward")
}
func GetReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Reward")
}

View File

@ -0,0 +1,52 @@
package randnameCfg
import (
GoUtil "server/game_util"
"server/gamedata"
"strconv"
)
const (
CFG_RAND_NAME = "RandName"
)
func init() {
gamedata.InitCfg(CFG_RAND_NAME)
}
func GetRandName() string {
data, _ := gamedata.GetData(CFG_RAND_NAME)
Id := GoUtil.RandNum(1, len(data))
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, Id)
if err != nil {
return "Lily"
}
return gamedata.GetStringValue(v, "EnName")
}
func GetRandNames(n int) []string {
rs := make([]string, 0)
data, err := gamedata.GetData(CFG_RAND_NAME)
if err != nil {
for i := 0; i < n; i++ {
id := strconv.Itoa(i + 1)
rs[i] = "Lily" + id
}
}
all := make([]int, len(data))
index := 0
for k := range data {
ik := GoUtil.Int(k)
all[index] = ik
index++
}
ids := GoUtil.RandSliceNumNonAdjacent(all, n)
for _, v := range ids {
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, v)
if err != nil {
rs = append(rs, "Lucy")
}
rs = append(rs, gamedata.GetStringValue(v, "EnName"))
}
return rs
}

View File

@ -1,32 +1,49 @@
{
"AppID": 0,
"LogLevel": "debug",
"LogPath": "",
"TCPAddr": ":3565",
"WSAddr": ":3566",
"LogPath": "./log",
"TCPAddr": ":3602",
"WSAddr": ":3567",
"RPCAddr": ":50051",
"MySqlAddr": "127.0.0.1",
"MySqlPort": "3306",
"MySqlUsr": "root",
"MySqlPwd": "root",
"MySqlPwd": "IOagNEq3C84c-20CmHEin5iODVc=",
"MaxConnNum": 20000,
"DbName": "Merge_Pet",
"DbName": "merge_pet_1",
"HttpPort": ":8081",
"RemoteAddr":"host.docker.internal:9001",
"AppPath": "./app",
"TELOGDIR" : "./teLog/",
"GameName": "pet_home_local",
"GameName": "Merge_Pet",
"GameID": 1,
"ServerType":"node",
"ServerID": 1,
"ServerOpenTime": "2018-01-01 00:00:00",
"ServerName": "Merge_Pet",
"ServerStatus" : 1,
"ServerCenter" : 1,
"ServerCenter" : 0,
"GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/",
"ListenAddr":":9002",
"CenterAddr": "127.0.0.1:7000",
"RemoteAddr":"127.0.0.1:9002",
"RedisAddr":"127.0.0.1",
"RedisPort" :"6379",
"RedisPwd" :"",
"ListenAddr": ":9001",
"CenterAddr": ":3560"
"RedisWriteAddr":"127.0.0.1:6379",
"RedisReadAddrs":"127.0.0.1:6379",
"RedisMasterName":"mymaster",
"RedisConnType":"Direct",
"GoogleVerify":false,
"Partition":3,
"KafkaHost":"kafka-server",
"CountryCode":"004",
"KafkaPort":"9092",
"Version":"1.0.0",
"IdVerify":false
}

View File

@ -29,18 +29,18 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Diamond: Diamond,
Energy: Energy,
RewardNum: RewardNum,
})
}
return result
}
func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH)
if err != nil {
log.Debug("GetSevenLoginReward err:%v", err)
@ -48,19 +48,23 @@ func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
}
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
month := gamedata.GetIntValue(v, "Month")
if month != nowMonth {
continue
}
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Diamond: Diamond,
Energy: Energy,
RewardNum: RewardNum,
})
}
return result
}
func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
func GetSevenLoginJackpot(isMonth, level int) []*gamedata.SevenLoginJackpotData {
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_JACKPOT)
if err != nil {
log.Debug("GetSevenLoginJackpot err:%v", err)
@ -69,20 +73,24 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
var result []*gamedata.SevenLoginJackpotData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
Energy := gamedata.GetFloatValue(v, "Energy")
Type := gamedata.GetIntValue(v, "Type")
Month := gamedata.GetIntValue(v, "Month")
if IsMonth != Month && IsMonth != 0 {
Level := gamedata.GetIntValue(v, "Level")
if isMonth != Month && isMonth != 0 {
continue
}
if level < Level && level != 0 {
continue
}
ItemMap := gamedata.GetValue(v, "Item")
Items := item.ParseItem(ItemMap)
result = append(result, &gamedata.SevenLoginJackpotData{
Id: Id,
Diamond: Diamond,
Items: Items,
Type: Type,
Month: Month,
Id: Id,
Energy: Energy,
Items: Items,
Type: Type,
Month: Month,
})
}
return result

View File

@ -18,7 +18,7 @@ func GetStartChessList() []int {
var ChessList []int
for _, v := range data {
v1 := v.(map[string]interface{})
ChessList = append(ChessList, gamedata.ParseInt(v1["MergeId"]))
ChessList = append(ChessList, gamedata.GetIntValue(v1, "MergeId"))
}
return ChessList
}

View File

@ -1,85 +0,0 @@
package userCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
var CFG_NAME = "UserData"
func init() {
gamedata.InitCfg(CFG_NAME)
}
// 获取用户能量倍数
func GetEnergyMulByLv(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "EnergyMul")
}
// 获取七天登录加成
func GetSevenloginAdd(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "SevenLogin")
}
// 获取订单系数
func GetOrderNByLv(lv int) (int, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
return 0, err
}
return gamedata.GetIntValue(data, "OrderN"), nil
}
// 获取升级经验
func GetLevUpExp(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Exp")
}
// 获取能量回复时间
func GetRecover(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Recover")
}
// 获取解锁背包数量
func GetUnlockPack(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "UnlockPack")
}
// 获取升级奖励
func GetLevUpReward(lv int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
return nil
}
itemMap := gamedata.GetValue(data, "Item")
itemList := item.ParseItem(itemMap)
return itemList
}

View File

@ -0,0 +1,168 @@
package userCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_NAME = "UserData"
CFG_NANE_CONST = "UserDataConst"
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CFG_NANE_CONST)
}
// 获取用户能量倍数
func GetEnergyMulByLv(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "EnergyMul")
}
func GetEnergyMax(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMax lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "MaxEnergy")
}
// 获取七天登录加成
func GetSevenloginAdd(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "SevenLogin")
}
// 获取订单系数
func GetOrderNByLv(lv int) (int, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
return 0, err
}
return gamedata.GetIntValue(data, "OrderN"), nil
}
// 获取升级经验
func GetLevUpExp(lv int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
return 0, 0
}
return gamedata.GetIntValue(data, "Exp"), gamedata.GetIntValue(data, "PExp")
}
func GetNewLevUpExp(lv int, Exp int, PetExt int) (int, int) {
ExpLv := lv
PetLv := lv
for {
data1, err := gamedata.GetDataByIntKey(CFG_NAME, ExpLv)
if err != nil {
break
}
ExpNeed := gamedata.GetIntValue(data1, "Exp")
if Exp >= ExpNeed {
Exp -= ExpNeed
ExpLv++
} else {
break
}
}
for {
data2, err := gamedata.GetDataByIntKey(CFG_NAME, PetLv)
if err != nil {
break
}
PetNeed := gamedata.GetIntValue(data2, "PExp")
if PetExt >= PetNeed {
PetExt -= PetNeed
PetLv++
} else {
break
}
}
return ExpLv, PetLv
}
// 获取能量回复时间
func GetRecover(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Recover")
}
// 获取解锁背包数量
func GetUnlockPack(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "UnlockPack")
}
// 获取升级奖励
func GetLevUpReward(lv int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
return nil
}
itemMap := gamedata.GetValue(data, "Item")
itemList := item.ParseItem(itemMap)
return itemList
}
func GetUnlock(Lv int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetUnlock lv:%v not found", Lv)
return ""
}
s1 := gamedata.GetStringValue(data, "Unlock_1")
s2 := gamedata.GetStringValue(data, "Unlock_2")
return s1 + "," + s2
}
func GetInitEnergy() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Energy")
if err != nil {
log.Debug("UserDataCfg GetInitEnergy not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInitDiamond() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Diamond")
if err != nil {
log.Debug("UserDataCfg GetInitDiamond not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInitStar() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Star")
if err != nil {
log.Debug("UserDataCfg GetInitStar not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -56,18 +56,17 @@ type Parser struct {
//
// Examples
//
// // Standard parser without descriptors
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
// sched, err := specParser.Parse("0 0 15 */3 *")
// // Standard parser without descriptors
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
// sched, err := specParser.Parse("0 0 15 */3 *")
//
// // Same as above, just excludes time fields
// subsParser := NewParser(Dom | Month | Dow)
// sched, err := specParser.Parse("15 */3 *")
//
// // Same as above, just makes Dow optional
// subsParser := NewParser(Dom | Month | DowOptional)
// sched, err := specParser.Parse("15 */3")
// // Same as above, just excludes time fields
// subsParser := NewParser(Dom | Month | Dow)
// sched, err := specParser.Parse("15 */3 *")
//
// // Same as above, just makes Dow optional
// subsParser := NewParser(Dom | Month | DowOptional)
// sched, err := specParser.Parse("15 */3")
func NewParser(options ParseOption) Parser {
optionals := 0
if options&DowOptional > 0 {
@ -193,7 +192,7 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
if min < max && len(fields) == min {
switch {
case options&DowOptional > 0:
fields = append(fields, defaults[5]) // TODO: improve access to default
fields = append(fields, defaults[5])
case options&SecondOptional > 0:
fields = append([]string{defaults[0]}, fields...)
default:
@ -247,7 +246,9 @@ func getField(field string, r bounds) (uint64, error) {
}
// getRange returns the bits indicated by the given expression:
// number | number "-" number [ "/" number ]
//
// number | number "-" number [ "/" number ]
//
// or error parsing range.
func getRange(expr string, r bounds) (uint64, error) {
var (

View File

@ -1,38 +1,129 @@
package db
import (
//"database/sql"
"database/sql"
"fmt"
"reflect"
"server/GoUtil"
"server/MergeConst"
"server/conf"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"strings"
"sync"
"time"
// "server/game"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type user struct {
Id int `db:"user_id"`
Sex int `db:"sex"`
UserName string `db:"username"`
Email string `db:"email"`
var SqlDb *sqlx.DB
var sqlDbMu sync.RWMutex
// GetDB 线程安全地获取数据库连接
func GetDB() *sqlx.DB {
sqlDbMu.RLock()
defer sqlDbMu.RUnlock()
return SqlDb
}
var SqlDb *sqlx.DB
// GetDBOrPanic 获取数据库连接,如果为 nil 则记录错误
func GetDBOrPanic() *sqlx.DB {
db := GetDB()
if db == nil {
log.Error("Database connection is nil, please check database initialization")
}
return db
}
// EnsureDB 确保数据库连接可用,如果不可用则返回错误
func EnsureDB() (*sqlx.DB, error) {
db := GetDB()
if db == nil {
return nil, fmt.Errorf("database connection is nil")
}
if err := db.Ping(); err != nil {
return nil, fmt.Errorf("database ping failed: %w", err)
}
return db, nil
}
// 封装创建连接
func connectMySQL() (*sqlx.DB, error) {
MysqlPwd, _ := GoUtil.Decrypt(conf.Server.MySqlPwd)
// 减少超时时间,避免长时间阻塞
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s?timeout=10s&readTimeout=15s&writeTimeout=15s&parseTime=true", conf.Server.MySqlUsr, MysqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
db, err := sqlx.Connect("mysql", connect)
if err != nil {
return nil, err
}
// 增加最大连接数,减少连接等待时间
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(20)
db.SetConnMaxLifetime(30 * time.Minute) // 减少连接生命周期
db.SetConnMaxIdleTime(5 * time.Minute) // 减少空闲时间
return db, nil
}
func InitDB() {
//"用户名:密码@[连接方式](主机名:端口号)/数据库名"
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, conf.Server.MySqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
SqlDb = sqlx.MustConnect("mysql", connect) // 设置连接数据库的参数
SqlDb.SetMaxOpenConns(20) // 设置最大打开的连接数
db, err := connectMySQL()
if err != nil {
log.Debug("connect mysql failed: %v", err)
return
}
sqlDbMu.Lock()
SqlDb = db
sqlDbMu.Unlock()
log.Debug("connect mysql success")
// 定时检测与重连
go func() {
ticker := time.NewTicker(5 * time.Second) // 改为5秒检测一次降低频率
defer ticker.Stop()
for range ticker.C {
sqlDbMu.RLock()
cur := SqlDb
sqlDbMu.RUnlock()
if cur == nil {
log.Debug("mysql connection is nil, start reconnect")
ReconnectDB()
continue
}
// Ping 操作不持有锁,避免阻塞其他操作
if err := cur.Ping(); err != nil {
log.Debug("mysql ping failed: %v, start reconnect", err)
ReconnectDB()
}
}
}()
}
// 自动重连
func ReconnectDB() {
sqlDbMu.Lock()
defer sqlDbMu.Unlock()
newDb, err := connectMySQL()
if err != nil {
log.Debug("mysql reconnect failed: %v", err)
return
}
if SqlDb != nil {
_ = SqlDb.Close()
}
SqlDb = newDb
log.Debug("mysql reconnect success")
}
func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
tx, err := SqlDb.Begin()
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
tx, err := sqlDb.Begin()
if err != nil {
log.Debug("Transaction failed, err:%v\n", err)
return err
@ -60,61 +151,6 @@ func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
return
}
// 更新数据
func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, len1)
Values := make([]interface{}, len1)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
index := 0
var keyValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
if field.Tag.Get("db") == UpdateAttr {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 {
Values[index] = ufield.Int()
}
index++
}
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, ",")
strLen := len(origin)
origin = origin[:strLen-1]
origin = origin + " WHERE " + Exclude + " = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
return
}
return
}
// "UPDATE user SET age = ?, degree = ? WHERE id = ?"
func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
@ -145,7 +181,7 @@ func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int {
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
keyValue = ufield.Int()
}
}
@ -187,6 +223,9 @@ func FormatAllMemInsertDb(u interface{}, tableName string) (insertID int64, err
if k == reflect.Int32 {
Values[i] = ufield.Int()
}
if k == reflect.Int64 {
Values[i] = ufield.Int()
}
}
for i := range Fields {
Fields[i] = "`" + Fields[i] + "`"
@ -219,6 +258,28 @@ func GetPlayerBaseInfoFromDbByName(name string) *ResPlayerBaseInfo {
return &res
}
func GetPlayerBan(name string) int64 {
sqlStr := "SELECT ban FROM t_player_baseinfo WHERE user_name = ?"
var ban int64
if err := SqlDb.Get(&ban, sqlStr, name); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return 0
}
return ban
}
func UpdatePlayerBan(uid int64, ban int64) error {
sqlStr := "UPDATE t_player_baseinfo SET ban = ? WHERE dwUin = ?"
_, err := SqlDb.Exec(sqlStr, ban, uid)
return err
}
func UpdatePlayerBaseInfoName(oldName, newName string) error {
sqlStr := "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, newName, oldName)
return err
}
func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo {
sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?"
var res ResPlayerBaseInfo
@ -233,73 +294,92 @@ func GetAccountInfoFromDb(name string) *Db_Account {
sqlStr := "SELECT * FROM t_account WHERE user_name = ?"
var res Db_Account
if err := SqlDb.Get(&res, sqlStr, name); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "account", sqlStr, err)
log.Debug("登录的账号不存在:%s", name)
return nil
}
return &res
}
func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, len)
Values := make([]interface{}, len)
pp := reflect.ValueOf(u)
origin := "SELECT * FROM " + tableName + " WHERE "
index := 0
var keyValue interface{}
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values[index] = ufield.Int()
}
index++
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, " AND ")
sqlStr := origin
if err := SqlDb.Get(u, sqlStr, Values...); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
func ResetAccountData(oldName, newName string) error {
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, newName, oldName)
if err != nil {
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, newName, oldName)
return err
}
func MappingAccountData(oldName, newName string) error {
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, "", oldName)
if err != nil {
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, "", oldName)
if err != nil {
return err
}
sqlStr = "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, oldName, newName)
if err != nil {
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, oldName, newName)
return err
}
func UpdateAccountInfoToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName)
return
}
func UpdateAccountInfoName(account *Db_Account, newName string) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_name = ? WHERE user_name = ?", newName, account.UserName)
return
}
func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName)
return
}
func GetServerData(d interface{}, Key string) (err error) {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "select * from t_server_mod where `key` = ?"
err = SqlDb.Get(d, sql, Key)
err = sqlDb.Get(d, sql, Key)
return
}
func SaveServerData(data *SqlServerModStruct) error {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
func SaveServerDataWithTx(tx *sql.Tx, data *SqlServerModStruct) error {
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
_, err := tx.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
func InsertServerData(data *SqlServerModStruct) error {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "insert into t_server_mod (`mData` , `updateTime` ,`key`) Values (?,?,?)"
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
@ -327,113 +407,22 @@ func GetPlayerClientData(d interface{}, Key string) (err error) {
return
}
func InsertData(u interface{}, tableName string) (insertID int64, err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, 0)
Fields1 := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "INSERT INTO " + tableName + "("
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") == "id" {
continue
}
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String && ufield.String() == "" {
continue
}
if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 {
continue
}
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, field.Tag.Get("db"))
Fields1 = append(Fields1, "?")
}
for i := range Fields {
Fields[i] = "`" + Fields[i] + "`"
}
origin += strings.Join(Fields, ",")
origin += ") VALUES("
origin += strings.Join(Fields1, ",")
origin += ")"
sqlStr := origin
result, err := SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err)
return
}
insertID, err = result.LastInsertId()
if err != nil {
log.Debug("InsertData exec failed, err:%v\n", err)
return
}
return
}
func UpdateData(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
var ExcludeValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" {
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?")
}
if field.Tag.Get("db") == Exclude {
if k == reflect.String {
ExcludeValue = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
ExcludeValue = append(Values, ufield.Int())
}
}
}
Values = append(Values, ExcludeValue)
origin += strings.Join(Fields, ",")
origin = origin + " WHERE `" + Exclude + "` = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("update failed, sql %s err:%v\n", sqlStr, err)
return
}
return
}
func GetServerMailData(data *[]*SqlServerMailStruct) error {
sql := "select * from system_mail_info"
err := SqlDb.Select(data, sql)
return err
}
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency string) error {
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`) Values (?,?,?,?,?,?,?,?)"
func GetActivityData(data *[]*SqlActivityCfgStruct) error {
sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg_buf`, `extra` from t_activity_mod"
err := SqlDb.Select(data, sql)
return err
}
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency, Extra string) error {
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`, `PayChannelExtra`) Values (?,?,?,?,?,?,?,?,?)"
Now := GoUtil.Now()
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel)
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel, Extra)
return err
}
@ -444,8 +433,49 @@ func GetPlayerChargeData(OrderSn string) (*SqlChargeOrderStruct, error) {
return data, err
}
func GetPlayerChargeDataList(Uid int) ([]*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where Uid = ? and PayStatus = ?"
data := &[]*SqlChargeOrderStruct{}
err := SqlDb.Select(data, sql, Uid, MergeConst.ORDER_STATUS_PAY)
return *data, err
}
func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where PayChannelOrderId = ?"
data := &SqlChargeOrderStruct{}
err := SqlDb.Get(data, sql, OrderSn)
return data, err
}
func UpdatePlayerChargeData(data *SqlChargeOrderStruct) error {
sql := "update t_player_charge set PayTime = ?, PayStatus = ?, PayChannelOrderId = ? where OrderId = ?"
_, err := SqlDb.Exec(sql, data.PayTime, data.PayStatus, data.PayChannelOrderId, data.OrderId)
return err
}
func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) {
sql := "select * from t_player_baseinfo where nick_name like ? limit 10"
data := &[]*ResPlayerBaseInfo{}
err := SqlDb.Select(data, sql, "%"+key+"%")
return *data, err
}
func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}
func GetDebugPlayer(uid int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? ORDER BY login_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}

View File

@ -4,6 +4,7 @@ import (
"context"
"server/conf"
"server/pkg/github.com/name5566/leaf/log"
"strings"
"time"
"github.com/redis/go-redis/v9"
@ -11,34 +12,118 @@ import (
var ctx = context.Background()
var Rdb *redis.Client
var RdbWrite *redis.Client
var RdbRead *redis.Client
func InitRedis() {
rdb := redis.NewClient(&redis.Options{
Addr: conf.Server.RedisAddr + ":" + conf.Server.RedisPort,
Password: conf.Server.RedisPwd, // no password set
DB: 0,
})
_, err := rdb.Ping(ctx).Result()
if err != nil {
log.Debug("连接redis出错错误信息%v", err)
return
// helper: 创建单个客户端addr 可以为 host:port 或 host
func connectClient(addr string) (*redis.Client, error) {
if addr == "" {
return nil, nil
}
log.Debug("成功连接redis")
Rdb = rdb
// 如果没有端口且配置了旧的 RedisPort则尝试补端口
if !strings.Contains(addr, ":") && conf.Server.RedisPort != "" {
addr = addr + ":" + conf.Server.RedisPort
}
rdb := redis.NewClient(&redis.Options{
Addr: addr,
Password: conf.Server.RedisPwd,
DB: conf.Server.RedisDb,
})
if _, err := rdb.Ping(ctx).Result(); err != nil {
return nil, err
}
return rdb, nil
}
// InitRedis: 初始化读写分离客户端(向后兼容旧配置)
func InitRedis() {
// 决定写地址:优先使用 RedisWriteAddr其次使用旧的 RedisAddr:RedisPort
writeAddr := conf.Server.RedisWriteAddr
if writeAddr == "" {
if conf.Server.RedisAddr != "" {
writeAddr = conf.Server.RedisAddr
if conf.Server.RedisPort != "" && !strings.Contains(writeAddr, ":") {
writeAddr = writeAddr + ":" + conf.Server.RedisPort
}
}
}
// 决定读地址:优先使用 RedisReadAddrs逗号分隔若为空则回退到写地址
readAddrs := conf.Server.RedisReadAddrs
if strings.TrimSpace(readAddrs) == "" {
readAddrs = writeAddr
}
// 取第一个可用的只读地址(简单实现)
var readClient *redis.Client
for _, a := range strings.Split(readAddrs, ",") {
a = strings.TrimSpace(a)
if a == "" {
continue
}
c, err := connectClient(a)
if err == nil {
readClient = c
break
}
log.Debug("connect read addr %s failed: %v", a, err)
}
// 如果所有只读都不可用,尝试连接写地址作为回退
writeClient, err := connectClient(writeAddr)
if err != nil {
log.Debug("连接redis写节点出错错误信息%v", err)
// 若读已连上则也作为写回退,否则返回
if readClient != nil {
RdbWrite = readClient
RdbRead = readClient
log.Debug("只有只读节点可用,读写共用该节点")
return
}
return
}
// 如果读未连接成功,读回退到写
if readClient == nil {
readClient = writeClient
}
RdbWrite = writeClient
RdbRead = readClient
log.Debug("成功初始化 redis读写分离写: %v, 读: %v", writeAddr, readAddrs)
}
// 写操作使用 RdbWrite
func RedisSetKey(key string, value string, expiration time.Duration) {
err := Rdb.Set(ctx, key, value, expiration).Err()
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Set(ctx, key, value, expiration).Err()
if err != nil {
log.Debug("redis set failed, err:%v\n", err)
}
}
// 获取锁
// 新增:写入字节数据,避免 string 转换拷贝
func RedisSetKeyBytes(key string, value []byte, expiration time.Duration) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Set(ctx, key, value, expiration).Err()
if err != nil {
log.Debug("redis set failed, err:%v\n", err)
}
}
// 获取锁(写)
func RedisLock(key string, value string, expiration time.Duration) bool {
ok, err := Rdb.SetNX(ctx, key, value, expiration).Result()
if RdbWrite == nil {
log.Debug("redis write client is nil")
return false
}
ok, err := RdbWrite.SetNX(ctx, key, value, expiration).Result()
if err != nil {
log.Debug("redis lock failed, err:%v\n", err)
return false
@ -46,8 +131,12 @@ func RedisLock(key string, value string, expiration time.Duration) bool {
return ok
}
// 释放锁
// 释放锁(写)
func RedisUnlock(key string, value string) bool {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return false
}
script := `
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
@ -55,7 +144,7 @@ func RedisUnlock(key string, value string) bool {
return 0
end
`
result, err := Rdb.Eval(ctx, script, []string{key}, value).Result()
result, err := RdbWrite.Eval(ctx, script, []string{key}, value).Result()
if err != nil {
log.Debug("redis unlock failed, err:%v\n", err)
return false
@ -63,25 +152,134 @@ func RedisUnlock(key string, value string) bool {
return result.(int64) == 1
}
// 读操作使用 RdbRead
func RedisGetKey(key string) (string, error) {
val, err := Rdb.Get(ctx, key).Result()
if RdbRead == nil {
return "", nil
}
val, err := RdbRead.Get(ctx, key).Result()
if err != nil {
log.Debug("redis get failed, err:%v\n", err)
return "", err
}
return val, nil
}
func RedisGetKeyBytes(key string) ([]byte, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.Get(ctx, key).Bytes()
if err != nil {
return nil, err
}
return val, nil
}
func RedisDelKey(key string) {
err := Rdb.Del(ctx, key).Err()
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Del(ctx, key).Err()
if err != nil {
log.Debug("redis del failed, err:%v\n", err)
}
}
func RedisZAdd(key string, member string, score float64) {
err := Rdb.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
if err != nil {
log.Debug("redis zadd failed, err:%v\n", err)
return
}
const maxRankSize int64 = 10000
count, err := RdbWrite.ZCard(ctx, key).Result()
if err != nil {
log.Debug("redis zcard failed, err:%v\n", err)
return
}
if count > maxRankSize {
removeCount := count - maxRankSize
err = RdbWrite.ZRemRangeByRank(ctx, key, 0, removeCount-1).Err()
if err != nil {
log.Debug("redis zremrangebyrank failed, err:%v\n", err)
}
}
}
func RedisZRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRangeWithScores(ctx, key, start, stop).Result()
if err != nil {
return nil, err
}
return val, nil
}
func RedisZRevRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRevRangeWithScores(ctx, key, start, stop).Result()
if err != nil {
return nil, err
}
return val, nil
}
func RedisZGetByIndexWithScore(key string, index int64) (*redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRangeWithScores(ctx, key, index, index).Result()
if err != nil {
return nil, err
}
if len(val) == 0 {
return nil, nil
}
return &val[0], nil
}
func RedisZRankWithScores(key, member string) (int64, float64, error) {
if RdbRead == nil {
return 0, 0, nil
}
val, err := RdbRead.ZRank(ctx, key, member).Result()
if err != nil {
return 0, 0, err
}
score, err := RdbRead.ZScore(ctx, key, member).Result()
if err != nil {
return 0, 0, err
}
return val, score, nil
}
func RedisZCard(key string) (int64, error) {
if RdbRead == nil {
return 0, nil
}
val, err := RdbRead.ZCard(ctx, key).Result()
if err != nil {
return 0, err
}
return val, nil
}
func RedisDel(key string) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Del(ctx, key).Err()
if err != nil {
log.Debug("redis del failed, err:%v\n", err)
}
}

View File

@ -20,10 +20,12 @@ type Db_Account struct {
Channel string `db:"channel"`
DeviceId string `db:"device_id"`
AutoId int `db:"auto_id"`
IdName string `db:"id_name"`
IdNum string `db:"id_num"`
}
type ResPlayerBaseInfo struct {
DwUin int32 `db:"dwUin"`
DwUin int64 `db:"dwUin"`
Energy int32 `db:"energy"`
Star int32 `db:"star"`
RecoverTime int32 `db:"recover_time"`
@ -35,11 +37,12 @@ type ResPlayerBaseInfo struct {
Guild int32 `db:"guild"`
PackUnlockCount int32 `db:"pack_unlock_count"`
LastPlayTime int32 `db:"last_play_time"`
EnergyBuyCount int32 `db:"EnergyBuyCount"`
Ban int64 `db:"ban"`
UserName string `db:"user_name"`
NickName string `db:"nick_name"`
LoginTime int32 `db:"login_time"`
LogoutTime int32 `db:"logout_time"`
Todayolinetime int32 `db:"todayolinetime"`
Node int32 `db:"node"`
Rolecreatetime int32 `db:"rolecreatetime"`
EmitOrderCnt int32 `db:"EmitOrderCnt"`
DailyRenewTime int32 `db:"DailyRenewTime"`
@ -458,7 +461,7 @@ type SqlAddFriendStruct struct {
}
type SqlModStruct struct {
DwUin int32 `db:"dwUin"`
DwUin int64 `db:"dwUin"`
ModData []byte `db:"mData"`
UpdataTime int32 `db:"updateTime"`
}
@ -471,15 +474,40 @@ type SqlServerModStruct struct {
}
type SqlServerMailStruct struct {
Id int `db:"mail_id"`
Title string `db:"title"`
Content string `db:"content"`
Items string `db:"items"`
Start_time int64 `db:"start_time"`
Register_time int64 `db:"register_time"`
End_time int64 `db:"end_time"`
Mail_type int `db:"mail_type"`
To_uids string `db:"to_uids"`
Id int `db:"mail_id"`
Title string `db:"title"`
Content string `db:"content"`
SubTitle string `db:"subTitle"`
SubTitleEn string `db:"subTitle_en"`
TitleEn string `db:"title_en"`
ContentEn string `db:"content_en"`
TitlePtBr string `db:"title_ptbr"`
SubTitlePtBr string `db:"subTitle_ptbr"`
ContentPtBr string `db:"content_ptbr"`
TitleEsLatam string `db:"title_es_latam"`
SubTitleEsLatam string `db:"subTitle_es_latam"`
ContentEsLatam string `db:"content_es_latam"`
Items string `db:"items"`
Start_time int64 `db:"start_time"`
Register_time int64 `db:"register_time"`
End_time int64 `db:"end_time"`
Mail_type int `db:"mail_type"`
Send_type int `db:"send_type"`
To_uids string `db:"to_uids"`
CreateTime int64 `db:"create_time"`
}
type SqlActivityCfgStruct struct {
Id int `db:"id"`
Type int `db:"type"`
Title string `db:"title"`
MailTitle string `db:"mail_title"`
MailContent string `db:"mail_content"`
Level int `db:"level_limit"`
Start_time int64 `db:"start_time"`
End_time int64 `db:"end_time"`
Cfg []byte `db:"cfg_buf"`
Extra string `db:"extra"`
}
type SqlChargeOrderStruct struct {

41
src/server/ga/log.go Normal file
View File

@ -0,0 +1,41 @@
package ga
import (
galog "github.com/tuyou/galog"
)
const (
PROJECT_ID = "20659"
CLIENT_ID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20659.googleplay.Meowment"
)
var glogger *galog.GALogger
func init() {
glog, err := galog.NewGALogger("logs", PROJECT_ID, CLIENT_ID, galog.LogTypeTrack)
if err != nil {
panic(err)
}
glogger = glog
}
func GAlogEvent(event string, userID string, deviceID string, properties map[string]interface{}) {
newProperties := make(map[string]interface{})
for k, v := range properties {
// // JSON encode the value
// jsonBytes, err := json.Marshal(v)
// if err != nil {
// newProperties["proj_"+k] = fmt.Sprintf("%v", v) // 无法解析直接转为字符串
// continue
// }
// newProperties["proj_"+k] = string(jsonBytes)
newProperties["proj_"+k] = v
}
properties = newProperties
glogger.
GetEntry(event).
SetDeviceID(deviceID).
SetUserID(userID).
SetProperties(properties).
Flush()
}

7
src/server/galog/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.DS_Store
.vscode/
.idea/
*.log
logs/
ga_log/
asset_log/

292
src/server/galog/README.md Normal file
View File

@ -0,0 +1,292 @@
# galog
galog是一个无三方依赖、支持单CPU最高5wQPS写入的ga-sdk组件可直接用于GA事实日志和资产日志打点。
> 说明:默认是异步写入模式,异步队列长度=100较大QPS时可自行调整详见参数
> - enableAsync
> - defaultAsyncMsgLen
## Usage
```golang
// ga日志初始化
projectID := "20433"
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeTrack)
if err != nil {
panic(err)
}
// ga日志打点调用
props := map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": tt.UnixNano(),
}
glogger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(props).
Flush()
```
```golang
// asset日志初始化
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
if err != nil {
panic(err)
}
// asset日志打点调用
asset := galog.AssetProperties{}
asset.
SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
glogger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
```
## suger usage
```golang
package chat_log
import (
"log"
"strconv"
"tygit.tuyoo.com/gocomponents/galog"
)
var (
slogger *galog.Logger
galogger *galog.GALogger
lerr error
)
// MustInitLoggerOnce 服务启动后初始化一次
func MustInitLoggerOnce() {
slogger, lerr = galog.NewServerLogger(&galog.ServerLogOptions{
LogDir: "run/logs",
EnableAsync: true,
AsyncQueueSize: 1000,
})
if lerr != nil {
log.Printf("MustInitLoggerOnce err: %s\n", lerr.Error())
panic("MustInitLoggerOnce err")
}
}
// MustInitGALoggerOnce 服务启动后初始化一次
func MustInitGALoggerOnce() {
galogger, lerr = galog.NewServerGALogger(&galog.ServerGALogOptions{
LogDir: "run/bi",
EnableAsync: true,
AsyncQueueSize: 1000,
ProjectID: ProjectId,
ClientID: ClientId,
LogType: galog.LogTypeTrack,
})
if lerr != nil {
log.Printf("MustInitGALoggerOnce err: %s\n", lerr.Error())
panic("MustInitGALoggerOnce err")
}
}
func LogToGANew(eventName, deviceId string, userId int64, prop map[string]interface{}, version string) {
lib := map[string]string{
"lib_type": "golang",
"lib_version": version,
}
galogger.
GetEntry(eventName).
SetDeviceID(deviceId).
SetUserID(strconv.FormatInt(userId, 10)).
SetLib(lib).
SetProperties(prop).
Flush()
}
```
## 日志目录结构
```
{logDir}/ga_log/{日志类型}_{hostname}_{年月日}_{小时}.log
{logDir}/asset_log/{日志类型}_{hostname}_{年月日}_{小时}.log
```
## Benchmark
- 测试机Mac-M1 8c 16G
- 同步写入模式
```
goos: darwin
goarch: arm64
pkg: tygit.tuyoo.com/gocomponents/galog
BenchmarkGaLog-8 87565 12831 ns/op 7590 B/op 90 allocs/op
BenchmarkAssetLog-8 234127 5832 ns/op 3028 B/op 44 allocs/op
PASS
ok tygit.tuyoo.com/gocomponents/galog 3.190s
# 100w行日志文件写入性能未见明显衰减
BenchmarkGaLog-8 89175 12481 ns/op 7590 B/op 90 allocs/op
BenchmarkAssetLog-8 195075 5933 ns/op 3028 B/op 44 allocs/op
```
- 异步写入模式(默认)
```
goos: darwin
goarch: arm64
pkg: tygit.tuyoo.com/gocomponents/galog
BenchmarkGaLog-8 95530 11331 ns/op 7599 B/op 90 allocs/op
BenchmarkAssetLog-8 337963 3512 ns/op 3032 B/op 44 allocs/op
PASS
ok tygit.tuyoo.com/gocomponents/galog 3.040s
# 120w行日志文件写入性能未见明显衰减
BenchmarkGaLog-8 116559 10450 ns/op 7598 B/op 90 allocs/op
BenchmarkAssetLog-8 335670 3512 ns/op 3032 B/op 44 allocs/op
```
## Load Testing
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o galog examples/hey.go
- 测试机sa101-ecs-bj4-pt57-test-wxy
- linux服务器配置2c4G
- 测试时间2024-02-26 17:45 ~ 18:45
```
./galog -n 1000000 -c 2 -q 100
```
| 压测说明 | CPU平台使用率 | 内存使用率 | IO平均使用率 | 进程打开的文件句柄数 |
|----- | ----- | ----- | ----- | ----- |
| 无任务 | 1% | 52% | 0.08% | 0 |
| 并发=2qps=200 | 1% | 52% | 0.08% | 7 |
| 并发=5qps=5000 | 4% | 52% | 1% | 7 |
| 并发=5qps=50000(队列1000有阻塞) realqps=5000 | 40% | 52% | 30% | 7 |
| 并发=5qps=50000(队列10000有阻塞) realqps=6500 | 6% | 52% | 1% | 7 |
| 并发=20qps=50000(队列10000有阻塞) realqps=18000 | 10% | 52% | 3% | 7 |
| 并发=50qps=50000(队列10000) realqps=50000 | 35% | 52% | 10% | 7 |
| 并发=100qps=100000(队列10000) realqps=90000 | 75% | 52% | 16% | 7 |
- 压测结果:写入队列=10000单核支持最高写入QPS约5wCPU=75%。
- 监控结果如下:
![img2.png](img/WX20240226-183250@2x.png)
![img2.png](img/WX20240226-184752@2x.png)
## ga日志格式范式
```json
{
"project_id": "20437",
"type": "track",
"event": "sdk_sword_holder_succ",
"event_time": 1708568434744,
"device_id": "",
"user_id": "908825698",
"client_id": "Android_5.1_tyGuest,weixinPay,tyAccount.alipay.0-hall20437.tuyoo.sdkonline",
"properties": {
"sdk_track_id": "3:6060:636978360:1708568434",
"sdk_sub_channel": "fish3d",
"country": "中国",
"proj_game_id": "",
"sdk_error_code": "",
"sdk_error_msg": "",
"city": "宁德市",
"sdk_sword_track_id": "807370ff-ceac-4ee3-b68f-50642ca4953c",
"sub_platform_id": "2",
"sdk_sword_holder_id": "320",
"sdk_sword_version": "v1.1.7",
"uuid": "56fdf0f9-9daa-4bf6-be69-88e15f05c36c",
"province": "福建省",
"sdk_login_channel_type": "",
"app_id": "20437",
"sdk_s_login_channel_type": "",
"sdk_main_channel": "official",
"game_id": "20437",
"sdk_s_route": "/api/sworder-server/rule/v1/getUserRisk",
"sdk_sword_holder_result": "999999",
"proj_cloud_id": "3",
"proj_app_id": "10010",
"ip_address": "59.58.58.18",
"sdk_sword_holder_type": "login",
"sdk_sword_holder_name": "非信任设备禁止登录",
"proj_client_id": "Android_5.505_tyGuest,tyAccount,yidunlogin.weixinPay,alipay,yinlian,jingdong,weixinShare.0-hall28.official.fish3d",
"sdk_sword_holder_process": "{\"330\":[\"[330-0]未命中\"]}",
"sdk_yidun_device_id": "UuCJztYTtxRETUVUAEaFoCQaw8H2qkWE",
"platform_id": "1",
"sub_channel_id": "sdkonline",
"proj_package_name": "",
"channel_id": "tuyoo"
},
"lib": {
"lib_version": "v1.0.0",
"lib_type": "go"
},
}
```
## asset日志格式范例
```json
{
"project_id": "28",
"type": "asset",
"event": "asset_increase",
"event_time": 1706631881042,
"device_id": "",
"user_id": "928426614",
"client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
"properties": {
"proj_ga_eventId": "STARTUP_QUEST_REWARD_COIN",
"proj_asset_value": "2",
"proj_asset_final": "2",
"proj_chip_type": "6",
"proj_asset_id": "13101",
"proj_asset_name": "\u9501\u5b9a",
"proj_asset_type": "free",
"proj_asset_time_limit": "0",
"proj_asset_start_time": "0",
"proj_asset_source": "",
"proj_tuyoo_order_id": "",
"game_id": "28",
"app_id": "10063",
"proj_project_id": "28",
"proj_client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
"uuid": "77b907688c624076a84ca7b4b29668a5"
},
"lib": {
"lib_version": "v1.0.0",
"lib_type": "go"
}
}
```
## Changelog
| 版本 | 修订说明 | 提交人 | 发布时间 |
|----- | ----- | ----- | ----- |
| v1.0.0 | galog 0依赖、支持异步写入、小时切割日志、ga和asset日志类型 | 田文 | 2024.02.22 |
| v1.1.0 | add suger | 田文 | 2025.06.30 |

View File

@ -0,0 +1,78 @@
package galog
import (
"sync"
)
var (
defaultBufPool = newBufPool()
)
const (
_size = 1024
_defaultLineEnding = "\n"
)
type BufPool struct {
p *sync.Pool
}
func newBufPool() BufPool {
return BufPool{p: &sync.Pool{
New: func() interface{} {
return &Buffer{bs: make([]byte, 0, _size)}
},
}}
}
// Get retrieves a Buffer from the pool, creating one if necessary.
func (p BufPool) Get() *Buffer {
buf := p.p.Get().(*Buffer)
buf.Reset()
buf.pool = p
return buf
}
func (p BufPool) put(buf *Buffer) {
p.p.Put(buf)
}
// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so
// the only way to construct one is via a Pool.
type Buffer struct {
bs []byte
pool BufPool
}
// AppendByte writes a single byte to the Buffer.
func (b *Buffer) AppendByte(v byte) {
b.bs = append(b.bs, v)
}
// AppendString writes a string to the Buffer.
func (b *Buffer) AppendString(s string) {
b.bs = append(b.bs, s...)
}
// Bytes returns a mutable reference to the underlying byte slice.
func (b *Buffer) Bytes() []byte {
return b.bs
}
// String returns a string copy of the underlying byte slice.
func (b *Buffer) String() string {
return string(b.bs)
}
// Reset resets the underlying byte slice. Subsequent writes re-use the slice's
// backing array.
func (b *Buffer) Reset() {
b.bs = b.bs[:0]
}
// Free returns the Buffer to its Pool.
//
// Callers must not retain references to the Buffer after calling Free.
func (b *Buffer) Free() {
b.pool.put(b)
}

139
src/server/galog/entry.go Normal file
View File

@ -0,0 +1,139 @@
package galog
var (
defaultLib = map[string]string{"lib_type": "go", "lib_version": "v1.0.0"}
)
type EntryBean struct {
// ProjectID 独立项目ID
ProjectID string `json:"project_id"`
// LogType 日志类型 默认是track
LogType LogType `json:"type"`
// Event 事件ID
Event string `json:"event"`
// EventTime 毫秒级时间
EventTime int64 `json:"event_time"`
// DeviceID 设备ID
DeviceID string `json:"device_id"`
// UserID 用户ID
UserID string `json:"user_id"`
// ClientID clientID
ClientID string `json:"client_id"`
// Properties 重要额外字段
Properties map[string]interface{} `json:"properties"`
// Lib 代码库
Lib map[string]string `json:"lib"`
}
type Entry struct {
logger *GALogger
bean *EntryBean
}
func (e *Entry) SetUserID(uid string) *Entry {
if uid == "" {
uid = "0"
}
e.bean.UserID = uid
return e
}
func (e *Entry) SetDeviceID(did string) *Entry {
e.bean.DeviceID = did
return e
}
func (e *Entry) SetLib(lib map[string]string) *Entry {
e.bean.Lib = lib
return e
}
func (e *Entry) SetClientID(cid string) *Entry {
e.bean.ClientID = cid
return e
}
func (e *Entry) SetProperties(props map[string]interface{}) *Entry {
e.bean.Properties = props
return e
}
// Flush 日志写入
func (e *Entry) Flush() {
defer e.logger.putEntry(e)
e.logger.biz(e.bean)
}
type AssetProperties map[string]interface{}
// SetAssetID 资产id
func (ap AssetProperties) SetAssetID(assetID string) AssetProperties {
ap["proj_asset_id"] = assetID
return ap
}
// SetAssetName 资产名称
func (ap AssetProperties) SetAssetName(assetName string) AssetProperties {
ap["proj_asset_name"] = assetName
return ap
}
// SetAssetType 资产付费类型
func (ap AssetProperties) SetAssetType(assetType string) AssetProperties {
ap["proj_asset_type"] = assetType
return ap
}
// SetAssetValue 资产变化数量
func (ap AssetProperties) SetAssetValue(assetValue string) AssetProperties {
ap["proj_asset_value"] = assetValue
return ap
}
// SetAssetFinal 资产变化后的剩余数量
func (ap AssetProperties) SetAssetFinal(assetFinal string) AssetProperties {
ap["proj_asset_final"] = assetFinal
return ap
}
// SetAssetTimeLimit 持续性资产持续时间
func (ap AssetProperties) SetAssetTimeLimit(assetTimeLimit string) AssetProperties {
ap["proj_asset_time_limit"] = assetTimeLimit
return ap
}
// SetAssetStartTime 持续性资产生效时间
func (ap AssetProperties) SetAssetStartTime(assetStartTime string) AssetProperties {
ap["proj_asset_start_time"] = assetStartTime
return ap
}
// SetAssetSource 变化的原因
func (ap AssetProperties) SetAssetSource(assetSource string) AssetProperties {
ap["proj_asset_source"] = assetSource
return ap
}
// SetAssetAssociated 变化关联资产
func (ap AssetProperties) SetAssetAssociated(assetAssociated string) AssetProperties {
ap["proj_asset_associated"] = assetAssociated
return ap
}
// SetTuyooOrderID SDK订单号
func (ap AssetProperties) SetTuyooOrderID(tuyooOrderID string) AssetProperties {
ap["proj_tuyoo_order_id"] = tuyooOrderID
return ap
}
// SetOrderID 游戏服订单号
func (ap AssetProperties) SetOrderID(assetOrderID string) AssetProperties {
ap["proj_order_id"] = assetOrderID
return ap
}
// SetKV 设置自定义字段必须通知到数据组,否则打点失败
func (ap AssetProperties) SetKV(k, v string) AssetProperties {
ap[k] = v
return ap
}

View File

@ -0,0 +1,83 @@
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"runtime"
"tygit.tuyoo.com/gocomponents/galog/examples/worker"
)
var (
output = flag.String("o", "", "")
c = flag.Int("c", 50, "")
n = flag.Int("n", 200, "")
q = flag.Float64("q", 0, "")
cpus = flag.Int("cpus", runtime.GOMAXPROCS(-1), "")
)
var usage = `Usage: hey [options...] <url>
Options:
-n Number of requests to run. Default is 200.
-c Number of workers to run concurrently. Total number of requests cannot
be smaller than the concurrency level. Default is 50.
-q Rate limit, in queries per second (QPS) per worker. Default is no rate limit.
-o Output type. If none provided, a summary is printed.
"csv" is the only supported alternative. Dumps the response
metrics in comma-separated values format.
-cpus Number of used cpu cores.
(default for current machine is %d cores)
`
func MainHey() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, usage, runtime.NumCPU())
}
flag.Parse()
runtime.GOMAXPROCS(*cpus)
num := *n
conc := *c
q := *q
if num <= 0 || conc <= 0 {
usageAndExit("-n and -c cannot be smaller than 1.")
}
if num < conc {
usageAndExit("-n cannot be less than -c.")
}
w := &worker.Work{
N: num,
C: conc,
QPS: q,
Output: *output,
}
w.Init()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
w.Stop()
}()
w.Run()
}
func usageAndExit(msg string) {
if msg != "" {
fmt.Fprint(os.Stderr, msg)
fmt.Fprintf(os.Stderr, "\n\n")
}
flag.Usage()
fmt.Fprintf(os.Stderr, "\n")
os.Exit(1)
}

View File

@ -0,0 +1,107 @@
package main
import (
"log"
"time"
"tygit.tuyoo.com/gocomponents/galog"
)
func main() {
log.Println("log ga asset server every 5 seconds.")
go logGA()
go logAsset()
logServer()
}
func logGA() {
projectID := "20433"
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
logger, err := galog.NewServerGALogger(&galog.ServerGALogOptions{
ProjectID: projectID,
ClientID: clientID,
LogDir: "ga_log",
LogType: galog.LogTypeTrack,
EnableAsync: true,
AsyncQueueSize: 1000,
})
if err != nil {
log.Fatal(err)
}
t := time.NewTicker(5 * time.Second)
for tt := range t.C {
log.Println("logGA")
logger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": tt.UnixNano(),
}).
Flush()
}
}
func logAsset() {
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
logger, err := galog.NewGALogger(".", projectID, clientID, galog.LogTypeAsset)
if err != nil {
log.Fatal(err)
}
t := time.NewTicker(5 * time.Second)
asset := galog.AssetProperties{}
asset.SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
for tt := range t.C {
log.Println("logAssert")
_ = tt
logger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
}
}
func logServer() {
slogger, _ := galog.NewServerLogger(&galog.ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
AsyncQueueSize: 1000,
})
t := time.NewTicker(5 * time.Second)
for tt := range t.C {
log.Println("logServer")
_ = tt
msgMap := map[string]interface{}{
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
"Host": "host",
"AppId": "10010",
"UserId": "12345",
"Level": "Notice",
"Entry": "Login",
"Func": "HandleLogin",
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
}
slogger.BizErr(msgMap)
}
}

View File

@ -0,0 +1,43 @@
package worker
import (
"fmt"
"text/template"
)
func newTemplate(output string) *template.Template {
outputTmpl := output
switch outputTmpl {
case "":
outputTmpl = defaultTmpl
case "csv":
outputTmpl = csvTmpl
}
return template.Must(template.New("tmpl").Funcs(tmplFuncMap).Parse(outputTmpl))
}
var tmplFuncMap = template.FuncMap{
"formatNumber": formatNumber,
"formatNumberInt": formatNumberInt,
}
func formatNumber(duration float64) string {
return fmt.Sprintf("%4.4f", duration)
}
func formatNumberInt(duration int) string {
return fmt.Sprintf("%d", duration)
}
var (
defaultTmpl = `
Summary:
Total: {{ formatNumber .Total.Seconds }} secs
Requests/sec: {{ formatNumber .Rps }}
TotalNumRes: {{ .NumRes }}
AvgTotal: {{ .AvgTotal }}
`
csvTmpl = `{{ $connLats := .ConnLats }}{{ $dnsLats := .DnsLats }}{{ $dnsLats := .DnsLats }}{{ $reqLats := .ReqLats }}{{ $delayLats := .DelayLats }}{{ $resLats := .ResLats }}{{ $statusCodeLats := .StatusCodes }}{{ $offsets := .Offsets}}response-time,DNS+dialup,DNS,Request-write,Response-delay,Response-read,status-code,offset{{ range $i, $v := .Lats }}
{{ formatNumber $v }},{{ formatNumber (index $connLats $i) }},{{ formatNumber (index $dnsLats $i) }},{{ formatNumber (index $reqLats $i) }},{{ formatNumber (index $delayLats $i) }},{{ formatNumber (index $resLats $i) }},{{ formatNumberInt (index $statusCodeLats $i) }},{{ formatNumber (index $offsets $i) }}{{ end }}`
)

View File

@ -0,0 +1,94 @@
package worker
import (
"bytes"
"fmt"
"io"
"log"
"time"
)
type report struct {
avgTotal float64
rps float64
results chan *result
done chan bool
total time.Duration
numRes int64
output string
w io.Writer
}
func newReport(w io.Writer, results chan *result, output string, n int) *report {
return &report{
output: output,
results: results,
done: make(chan bool, 1),
w: w,
}
}
func runReporter(r *report) {
// Loop will continue until channel is closed
for res := range r.results {
r.numRes++
r.avgTotal += res.duration.Seconds()
}
// Signal reporter is done.
r.done <- true
}
func (r *report) finalize(total time.Duration) {
r.total = total
r.rps = float64(r.numRes) / r.total.Seconds()
r.print()
}
func (r *report) print() {
buf := &bytes.Buffer{}
if err := newTemplate(r.output).Execute(buf, r.snapshot()); err != nil {
log.Println("error:", err.Error())
return
}
r.printf(buf.String())
r.printf("\n")
}
func (r *report) printf(s string, v ...interface{}) {
fmt.Fprintf(r.w, s, v...)
}
func (r *report) snapshot() Report {
snapshot := Report{
AvgTotal: r.avgTotal,
Rps: r.rps,
Total: r.total,
NumRes: r.numRes,
}
return snapshot
}
type Report struct {
AvgTotal float64
Rps float64
Total time.Duration
NumRes int64
}
type LatencyDistribution struct {
Percentage int
Latency float64
}
type Bucket struct {
Mark float64
Count int
Frequency float64
}

View File

@ -0,0 +1,176 @@
package worker
import (
"fmt"
"io"
"os"
"strconv"
"sync"
"time"
"tygit.tuyoo.com/gocomponents/galog"
)
var startTime = time.Now()
// now returns time.Duration using stdlib time
func now() time.Duration { return time.Since(startTime) }
// Max size of the buffer of result channel.
const maxResult = 1000000
type result struct {
offset time.Duration
duration time.Duration
}
type Work struct {
// N is the total number of requests to make.
N int
// C is the concurrency level, the number of concurrent workers to run.
C int
// Qps is the rate limit in queries per second.
QPS float64
// Output represents the output type. If "csv" is provided, the
// output will be dumped as a csv stream.
Output string
// Writer is where results will be written. If nil, results are written to stdout.
Writer io.Writer
initOnce sync.Once
results chan *result
stopCh chan struct{}
start time.Duration
report *report
}
func (b *Work) writer() io.Writer {
if b.Writer == nil {
return os.Stdout
}
return b.Writer
}
// Init initializes internal data-structures
func (b *Work) Init() {
b.initOnce.Do(func() {
b.results = make(chan *result, min(b.C*1000, maxResult))
b.stopCh = make(chan struct{}, b.C)
b.initLogger()
})
}
// Run makes all the requests, prints the summary. It blocks until
// all work is done.
func (b *Work) Run() {
b.Init()
b.start = now()
b.report = newReport(b.writer(), b.results, b.Output, b.N)
// Run the reporter first, it polls the result channel until it is closed.
go func() {
runReporter(b.report)
}()
b.runWorkers()
b.Finish()
}
func (b *Work) Stop() {
// Send stop signal so that workers can stop gracefully.
for i := 0; i < b.C; i++ {
b.stopCh <- struct{}{}
}
}
func (b *Work) Finish() {
close(b.results)
total := now() - b.start
// Wait until the reporter is done.
<-b.report.done
b.report.finalize(total)
}
var logger *galog.GALogger
func (b *Work) initLogger() {
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
logger, _ = galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
}
func (b *Work) doSth() {
s := now()
// doSth here.
asset := galog.AssetProperties{}
asset.SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", strconv.Itoa(int(time.Now().UnixNano())))
logger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
t := now()
finish := t - s
b.results <- &result{
offset: s,
duration: finish,
}
}
func (b *Work) runWorker(n int) {
var throttle <-chan time.Time
if b.QPS > 0 {
t := time.NewTicker(time.Duration(1e6/(b.QPS)) * time.Microsecond)
throttle = t.C
}
for i := 0; i < n; i++ {
// Check if application is stopped. Do not send into a closed channel.
select {
case <-b.stopCh:
return
default:
if b.QPS > 0 {
<-throttle
}
b.doSth()
}
}
}
func (b *Work) runWorkers() {
var wg sync.WaitGroup
wg.Add(b.C)
fmt.Printf("==RUN worker==> N:%d C:%d QPS:%v b.N / b.C:%v", b.N, b.C, b.QPS, b.N/b.C)
// Ignore the case where b.N % b.C != 0.
for i := 0; i < b.C; i++ {
go func() {
b.runWorker(b.N / b.C)
wg.Done()
}()
}
wg.Wait()
}
func min(a, b int) int {
if a < b {
return a
}
return b
}

264
src/server/galog/file.go Normal file
View File

@ -0,0 +1,264 @@
package galog
import (
"encoding/json"
"errors"
"fmt"
"os"
"path"
"path/filepath"
"strconv"
"strings"
"sync"
"time"
)
type fileLogWriter struct {
sync.RWMutex
Rotate bool `json:"rotate"`
Hourly bool `json:"hourly"`
// The opened file
Filename string `json:"filename"`
fileWriter *os.File
// Rotate hourly
MaxHours int64 `json:"maxhours"` // 默认不删除日志
hourlyOpenDate int
hourlyOpenTime time.Time
// Permissions for log file
Perm string `json:"perm"`
// Permissions for directory if it is specified in FileName
DirPerm string `json:"dirperm"`
RotatePerm string `json:"rotateperm"`
fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix
}
func newFileWriter() LogProvider {
w := &fileLogWriter{
Rotate: true, // 开启日志轮转
Hourly: true, // 开启日志小时轮转
RotatePerm: "0440",
Perm: "0660",
DirPerm: "0770",
}
return w
}
// Init file logger with json config.
// jsonConfig like:
//
// {"filename":"logs/glog.log"}
func (w *fileLogWriter) Init(config string) error {
err := json.Unmarshal([]byte(config), w)
if err != nil {
return err
}
if w.Filename == "" {
return errors.New("jsonconfig must have filename")
}
w.suffix = filepath.Ext(w.Filename)
w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix)
if w.suffix == "" {
w.suffix = ".log"
}
err = w.startLogger()
return err
}
func (w *fileLogWriter) startLogger() error {
file, err := w.createLogFile()
if err != nil {
return err
}
if w.fileWriter != nil {
w.fileWriter.Close()
}
w.fileWriter = file
return w.initFd()
}
func (w *fileLogWriter) needRotateHourly(hour int) bool {
return w.Hourly && hour != w.hourlyOpenDate
}
func (w *fileLogWriter) createLogFile() (*os.File, error) {
perm, err := strconv.ParseInt(w.Perm, 8, 64)
if err != nil {
return nil, err
}
dirperm, err := strconv.ParseInt(w.DirPerm, 8, 64)
if err != nil {
return nil, err
}
filepath := path.Dir(w.Filename)
os.MkdirAll(filepath, os.FileMode(dirperm))
fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm))
if err == nil {
os.Chmod(w.Filename, os.FileMode(perm))
}
return fd, err
}
func (w *fileLogWriter) initFd() error {
w.hourlyOpenTime = time.Now()
w.hourlyOpenDate = w.hourlyOpenTime.Hour()
if w.Hourly {
go w.hourlyRotate(w.hourlyOpenTime)
}
return nil
}
func (w *fileLogWriter) hourlyRotate(openTime time.Time) {
y, m, d := openTime.Add(1 * time.Hour).Date()
h := openTime.Add(1 * time.Hour).Hour()
nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location())
tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100))
<-tm.C
w.Lock()
if w.needRotateHourly(time.Now().Hour()) {
if err := w.doRotate(); err != nil {
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
}
}
w.Unlock()
}
func (w *fileLogWriter) doRotate() error {
fName := ""
format := ""
var openTime time.Time
rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64)
if err != nil {
return err
}
_, err = os.Lstat(w.Filename)
if err != nil {
goto RESTART_LOGGER
}
if w.Hourly {
format = "20060102_15"
openTime = w.hourlyOpenTime
}
fName = w.fileNameOnly + fmt.Sprintf("_%s%s", openTime.Format(format), w.suffix)
_, err = os.Lstat(fName)
// return error if the last file checked still existed
if err == nil {
//return fmt.Errorf("rotate: cannot find free log number to rename %s", w.Filename)
}
w.fileWriter.Close()
// Rename the file to its new found name
// even if occurs error,we MUST guarantee to restart new logger
err = os.Rename(w.Filename, fName)
if err != nil {
goto RESTART_LOGGER
}
err = os.Chmod(fName, os.FileMode(rotatePerm))
RESTART_LOGGER:
startLoggerErr := w.startLogger()
if w.MaxHours > 0 {
go w.deleteOldLog()
}
if startLoggerErr != nil {
return fmt.Errorf("rotate startLogger: %s", startLoggerErr)
}
if err != nil {
return fmt.Errorf("rotate: %s", err)
}
return nil
}
func (w *fileLogWriter) deleteOldLog() {
dir := filepath.Dir(w.Filename)
absolutePath, err := filepath.EvalSymlinks(w.Filename)
if err == nil {
dir = filepath.Dir(absolutePath)
}
filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) {
defer func() {
if r := recover(); r != nil {
fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r)
}
}()
if info == nil {
return
}
if w.Hourly {
if !info.IsDir() && info.ModTime().Add(1*time.Hour*time.Duration(w.MaxHours)).Before(time.Now()) {
if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) &&
strings.HasSuffix(filepath.Base(path), w.suffix) {
os.Remove(path)
}
}
}
return
})
}
// EncodeMsg encode log msg
func (*fileLogWriter) EncodeMsg(lm *LogMsg) []byte {
buf := defaultBufPool.Get()
buf.AppendString(lm.Msg)
buf.AppendString(_defaultLineEnding)
msg := buf.Bytes()
buf.Free()
return msg
}
// WriteMsg write msg to log and rotate
func (w *fileLogWriter) WriteMsg(lm *LogMsg) error {
h := lm.When.Hour()
if w.Rotate {
w.RLock()
if w.needRotateHourly(h) {
w.RUnlock()
w.Lock()
if w.needRotateHourly(h) {
if err := w.doRotate(); err != nil {
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
}
}
w.Unlock()
} else {
w.RUnlock()
}
}
msg := w.EncodeMsg(lm)
_, err := w.fileWriter.Write(msg)
return err
}
// Destroy close the file description, close file writer.
func (w *fileLogWriter) Destroy() {
w.fileWriter.Close()
}
// Flush flushes file logger.
func (w *fileLogWriter) Flush() {
w.fileWriter.Sync()
}
func init() {
Register(AdapterFile, newFileWriter)
}

99
src/server/galog/galog.go Normal file
View File

@ -0,0 +1,99 @@
package galog
import (
"fmt"
"os"
"strings"
"sync"
"time"
)
type GALogger struct {
logger *Logger
projectID string
clientID string
logType LogType
entryPool sync.Pool
}
type LogType string
const (
// LogTypeTrack 事实日志
LogTypeTrack LogType = "track"
// LogTypeAsset 资产日志
LogTypeAsset LogType = "asset"
)
const (
// enableAsync 启用异步写入模式
enableAsync = true
// defaultAsyncMsgLen 异步写入模式的队列长度QPS较大时可调整此值
defaultAsyncMsgLen int64 = 100
)
// NewGALogger
//
// logDir: 日志根目录 logs | /home/tywork
// projectID: projectID
// clientID: clientID
// logType: galog.LogTypeTrack | galog.LogTypeAsset
func NewGALogger(logDir, projectID, clientID string, logType LogType) (*GALogger, error) {
l := newLogger()
hostname, _ := os.Hostname()
filepath := fmt.Sprintf("ga_log/ga_%s.log", hostname)
if logType == LogTypeAsset {
filepath = fmt.Sprintf("asset_log/%s_%s.log", logType, hostname)
}
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(logDir, "/"), filepath)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if enableAsync {
l.Async()
}
gaLogger := &GALogger{
logger: l,
projectID: projectID,
clientID: clientID,
logType: logType,
}
return gaLogger, nil
}
// GetEntry
func (gl *GALogger) GetEntry(event string) *Entry {
e, ok := gl.entryPool.Get().(*Entry)
if ok {
e.logger = gl
e.bean.ProjectID = gl.projectID
e.bean.LogType = gl.logType
e.bean.ClientID = gl.clientID
e.bean.Event = event
e.bean.EventTime = time.Now().UnixMilli()
e.bean.Lib = defaultLib
return e
}
return &Entry{
logger: gl,
bean: &EntryBean{
ProjectID: gl.projectID,
LogType: gl.logType,
ClientID: gl.clientID,
Event: event,
EventTime: time.Now().UnixMilli(),
Lib: defaultLib,
},
}
}
func (gl *GALogger) biz(v interface{}) {
gl.logger.BizErr(v)
}
func (gl *GALogger) putEntry(entry *Entry) {
entry.bean = &EntryBean{}
gl.entryPool.Put(entry)
}

View File

@ -0,0 +1,85 @@
package galog
import (
"testing"
"time"
)
var (
gaLogger *GALogger
assetLogger *GALogger
)
// go test -bench . -benchmem
func init() {
gaLogger, _ = NewGALogger("logs", "20433", "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest", LogTypeTrack)
assetLogger, _ = NewGALogger("logs", "28", "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz", LogTypeAsset)
}
func BenchmarkGaLog(b *testing.B) {
for i := 0; i < b.N; i++ {
props := map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": time.Now().UnixNano(),
"ip_address1": "127.0.0.1",
"proj_app_id1": "10010",
"uuid1": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts1": time.Now().UnixNano(),
"ip_address2": "127.0.0.1",
"proj_app_id2": "10010",
"uuid2": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts2": time.Now().UnixNano(),
"ip_address3": "127.0.0.1",
"proj_app_id3": "10010",
"uuid3": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts4": time.Now().UnixNano(),
"proj_app_id25": "10010",
"uuid21": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts21": time.Now().UnixNano(),
"ip_address31": "127.0.0.1",
"proj_app_id31": "10010",
"uuid31": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts11": time.Now().UnixNano(),
"uuid3111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts4111": time.Now().UnixNano(),
"proj_app_id21115": "10010",
"uuid111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts111": time.Now().UnixNano(),
"ip_a11ddress31": "127.0.0.1",
"proj1_app_id31": "10010",
"uuid131": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts1111": time.Now().UnixNano(),
}
gaLogger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(props).
Flush()
}
}
func BenchmarkAssetLog(b *testing.B) {
for i := 0; i < b.N; i++ {
asset := make(AssetProperties)
asset.
SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
assetLogger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
}
}

3
src/server/galog/go.mod Normal file
View File

@ -0,0 +1,3 @@
module tygit.tuyoo.com/gocomponents/galog
go 1.20

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

261
src/server/galog/log.go Normal file
View File

@ -0,0 +1,261 @@
package galog
import (
"encoding/json"
"fmt"
"os"
"sync"
"time"
"unsafe"
)
const (
AdapterFile = "file"
)
type LogMsg struct {
Msg string
When time.Time
}
// Logger defines the behavior of a log provider.
type LogProvider interface {
Init(config string) error
WriteMsg(lm *LogMsg) error
Destroy()
Flush()
}
type newLogProviderFunc func() LogProvider
var (
adapters = make(map[string]newLogProviderFunc)
)
// Register register a new log provider.
func Register(name string, log newLogProviderFunc) {
if log == nil {
panic("logs: Register provide is nil")
}
if _, dup := adapters[name]; dup {
panic("logs: Register called twice for provider " + name)
}
adapters[name] = log
}
type Logger struct {
lock sync.Mutex
asynchronous bool
wg sync.WaitGroup
msgChanLen int64
msgChan chan *LogMsg
closeChan chan struct{}
flushChan chan struct{}
outputs []*nameLogger
}
type nameLogger struct {
LogProvider
name string
}
var logMsgPool *sync.Pool
// newLogger return a new Logger.
func newLogger(channelLens ...int64) *Logger {
gl := new(Logger)
gl.msgChanLen = append(channelLens, 0)[0]
if gl.msgChanLen <= 0 {
gl.msgChanLen = defaultAsyncMsgLen
}
gl.flushChan = make(chan struct{}, 1)
gl.closeChan = make(chan struct{}, 1)
return gl
}
// Async sets the log to asynchronous and start the goroutine
func (gl *Logger) Async(msgLen ...int64) *Logger {
gl.lock.Lock()
defer gl.lock.Unlock()
if gl.asynchronous {
return gl
}
gl.asynchronous = true
if len(msgLen) > 0 && msgLen[0] > 0 {
gl.msgChanLen = msgLen[0]
}
gl.msgChan = make(chan *LogMsg, gl.msgChanLen)
logMsgPool = &sync.Pool{
New: func() interface{} {
return &LogMsg{}
},
}
gl.wg.Add(1)
go gl.startLogger()
return gl
}
// SetLogger provides a given logger adapter into Logger with config string.
// config must in in JSON format like {"interval":360}}
func (gl *Logger) setLogger(adapterName string, configs ...string) error {
config := append(configs, "{}")[0]
logAdapter, ok := adapters[adapterName]
if !ok {
return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName)
}
lg := logAdapter()
err := lg.Init(config)
if err != nil {
return err
}
gl.outputs = append(gl.outputs, &nameLogger{name: adapterName, LogProvider: lg})
return nil
}
func (gl *Logger) writeToLoggers(lm *LogMsg) {
for _, l := range gl.outputs {
err := l.WriteMsg(lm)
if err != nil {
fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err)
}
}
}
// Write implements io.Writer.
func (gl *Logger) Write(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, nil
}
// writeMsg will always add a '\n' character
if p[len(p)-1] == '\n' {
p = p[0 : len(p)-1]
}
lm := &LogMsg{
Msg: string(p),
When: time.Now(),
}
// set levelLoggerImpl to ensure all log message will be write out
err = gl.writeMsg(lm)
if err == nil {
return len(p), nil
}
return 0, err
}
func (gl *Logger) writeMsg(lm *LogMsg) error {
if gl.asynchronous {
logM := logMsgPool.Get().(*LogMsg)
logM.Msg = lm.Msg
logM.When = lm.When
if gl.outputs != nil {
gl.msgChan <- lm
} else {
logMsgPool.Put(lm)
}
} else {
gl.writeToLoggers(lm)
}
return nil
}
func (gl *Logger) startLogger() {
gameOver := false
for {
select {
case bm, ok := <-gl.msgChan:
if ok {
gl.writeToLoggers(bm)
logMsgPool.Put(bm)
}
case <-gl.closeChan:
gl.flush()
for _, l := range gl.outputs {
l.Destroy()
}
gl.outputs = nil
gameOver = true
gl.wg.Done()
case <-gl.flushChan:
gl.flush()
gl.wg.Done()
}
if gameOver {
break
}
}
}
// Info Log INFO level message.
func (gl *Logger) Info(format string) {
lm := &LogMsg{
Msg: format,
When: time.Now(),
}
gl.writeMsg(lm)
}
// BizErr Log a json-interface
func (gl *Logger) BizErr(v interface{}) error {
buf, err := json.Marshal(v)
if err != nil {
return err
}
str := *(*string)(unsafe.Pointer(&buf))
gl.Info(str)
return nil
}
// Flush flush all chan data.
func (gl *Logger) Flush() {
if gl.asynchronous {
gl.flushChan <- struct{}{}
gl.wg.Wait()
gl.wg.Add(1)
return
}
gl.flush()
}
// Close close logger, flush all chan data and destroy all adapters in Logger.
func (gl *Logger) Close() {
if gl.asynchronous {
gl.closeChan <- struct{}{}
gl.wg.Wait()
close(gl.msgChan)
} else {
gl.flush()
for _, l := range gl.outputs {
l.Destroy()
}
gl.outputs = nil
}
close(gl.flushChan)
close(gl.closeChan)
}
func (gl *Logger) flush() {
if gl.asynchronous {
for {
if len(gl.msgChan) > 0 {
bm, ok := <-gl.msgChan
if !ok {
continue
}
gl.writeToLoggers(bm)
logMsgPool.Put(bm)
continue
}
break
}
}
for _, l := range gl.outputs {
l.Flush()
}
}

122
src/server/galog/suger.go Normal file
View File

@ -0,0 +1,122 @@
package galog
import (
"errors"
"fmt"
"os"
"strings"
)
type ServerLogOptions struct {
// LogDir 日志目录默认logs
LogDir string
// EnableAsync 是否开启异步写日志,默认开启
EnableAsync bool
// AsyncQueueSize 异步队列大小默认1000
AsyncQueueSize int64
}
// NewServerLogger 业务日志实例support JSON
//
// opts.LogDir 日志目录推荐logs
// opts.EnableAsync 是否开启异步写日志,默认开启
// opts.AsyncQueueSize 异步队列大小默认1000
// useage: logger.BizErr(map[string]interface{}{"type": "test"})
func NewServerLogger(opts *ServerLogOptions) (*Logger, error) {
if opts == nil {
opts = &ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
AsyncQueueSize: 1000,
}
}
if opts.LogDir == "" {
opts.LogDir = "logs"
}
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
opts.AsyncQueueSize = 1000
}
l := newLogger()
hostname, _ := os.Hostname()
filename := fmt.Sprintf("server_%s.log", hostname)
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
l.Async(opts.AsyncQueueSize)
}
return l, nil
}
type ServerGALogOptions struct {
// LogDir 日志目录默认galogs
LogDir string
// EnableAsync 是否开启异步写日志,默认开启
EnableAsync bool
// AsyncQueueSize 异步队列大小默认1000
AsyncQueueSize int64
// GA侧分配ProjectID
ProjectID string
// GA侧分配ClientID
ClientID string
LogType LogType
}
// NewServerGALogger GA日志实例support JSON
//
// opts.ProjectID 项目IDGA侧分配必填
// opts.ClientID 客户端IDGA侧分配必填
// opts.LogType 日志类型默认LogTypeTrack
// opts.LogDir 日志目录默认galogs
// opts.EnableAsync 是否开启异步写日志,默认开启
// opts.AsyncQueueSize 异步队列大小默认1000
func NewServerGALogger(opts *ServerGALogOptions) (*GALogger, error) {
if opts == nil {
return nil, errors.New("opts must not be empty")
}
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
opts.AsyncQueueSize = 1000
}
if opts.LogDir == "" {
opts.LogDir = "galogs"
}
if opts.LogType == "" {
opts.LogType = LogTypeTrack
}
if opts.ProjectID == "" || opts.ClientID == "" {
return nil, errors.New("projectID or clientID must not be empty")
}
l := newLogger()
hostname, _ := os.Hostname()
filename := fmt.Sprintf("ga_%s.log", hostname)
if opts.LogType == LogTypeAsset {
filename = fmt.Sprintf("asset_%s.log", hostname)
}
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
l.Async(opts.AsyncQueueSize)
}
gaLogger := &GALogger{
logger: l,
projectID: opts.ProjectID,
clientID: opts.ClientID,
logType: opts.LogType,
}
return gaLogger, nil
}

View File

@ -0,0 +1,34 @@
package galog
import (
"testing"
"time"
)
var slogger *Logger
// go test -bench . -benchmem
func init() {
slogger, _ = NewServerLogger(&ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
})
}
// BenchmarkServerLog-8 436682 3103 ns/op 1838 B/op 24 allocs/op
func BenchmarkServerLog(b *testing.B) {
for i := 0; i < b.N; i++ {
msgMap := map[string]interface{}{
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
"Host": "host",
"AppId": "10010",
"UserId": "12345",
"Level": "Notice",
"Entry": "Login",
"Func": "HandleLogin",
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
}
slogger.BizErr(msgMap)
}
}

View File

@ -1,785 +0,0 @@
package game
import (
"fmt"
"math"
"math/rand"
"server/GoUtil"
"server/MergeConst"
"server/db"
"server/msg"
"sort"
"strconv"
"strings"
"time"
"github.com/robfig/cron/v3"
"google.golang.org/protobuf/proto"
)
type ChampshipsManager struct {
MStatus int32
MChampshipMap map[int32]*db.SqlChampshipsStruct
MChampshipPlayerMap map[int32][]*msg.ChampshipsPlayerInfo
IsSettle int32
IsLoadDB bool
MUpdateNotifyList []int32
McronSave *cron.Cron
McronSaveID cron.EntryID
RobotCronID cron.EntryID
RobotCronID10s cron.EntryID
MPlayerBaseInfoMap map[int32]*db.ResPlayerBaseInfo
}
func (p *ChampshipsManager) SaveDataFromDB(Key interface{}) bool {
return true
}
func (p *ChampshipsManager) AIGrow1() {
}
func (p *ChampshipsManager) DeleteOutLineChampship(CurChampshipsId int32) {
sqlStr := "DELETE FROM t_championships_data WHERE CurChampshipsId = ?"
for k, v := range p.MChampshipPlayerMap {
if v[0].CurChampshipsId == CurChampshipsId {
delete(p.MChampshipPlayerMap, k)
}
}
result, err := db.SqlDb.Exec(sqlStr, CurChampshipsId)
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
return
}
affectedRows, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected failed, err:%v\n", err)
return
} else {
fmt.Printf("delete t_championships_data affectedRows:%d\n", affectedRows)
}
}
func (p *ChampshipsManager) DeleteUneffectPlayer(deleteIds []int32) {
sqlStr := "DELETE FROM t_player_baseinfo WHERE dwUin = ?"
for i := 0; i < len(deleteIds); i++ {
_, err := db.SqlDb.Exec(sqlStr, deleteIds[i])
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
}
}
}
func (p *ChampshipsManager) GetFriendListId(id int32) []int32 {
sqlStr := "SELECT * FROM t_player_Friend_Data WHERE dwUin = ?"
sqlStruck := db.SqlFriendStruct{}
ret := []int32{}
if err := db.SqlDb.Get(&sqlStruck, sqlStr, id); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
} else {
if sqlStruck.FriendList != "" {
arr := strings.Split(sqlStruck.FriendList, "_")
for i := 0; i < len(arr); i++ {
id, _ := strconv.ParseInt(arr[i], 10, 32)
ret = append(ret, int32(id))
}
}
}
return ret
}
func (p *ChampshipsManager) NotifyOpenNewChampShip(args []interface{}) {
go func() {
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
}()
}
func (p *ChampshipsManager) OpenNewChampShip(args []interface{}) {
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
p.MUpdateNotifyList = []int32{}
sqlStr := "SELECT * FROM t_player_baseinfo"
sqlStrucks := []db.ResPlayerBaseInfo{}
if err := db.SqlDb.Select(&sqlStrucks, sqlStr); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
return
} else {
}
deleteIds := []int32{}
sqlStrucksList := []db.ResPlayerBaseInfo{}
for i := 0; i < len(sqlStrucks); i++ {
if sqlStrucks[i].UserName == "" {
deleteIds = append(deleteIds, sqlStrucks[i].DwUin)
} else {
sqlStrucksList = append(sqlStrucksList, sqlStrucks[i])
}
}
sqlStrucks = sqlStrucksList
p.DeleteUneffectPlayer(deleteIds)
sort.Slice(sqlStrucks, func(i, j int) bool {
if sqlStrucks[i].Level != sqlStrucks[j].Level {
return sqlStrucks[i].Level < sqlStrucks[j].Level
} else {
return sqlStrucks[i].Exp < sqlStrucks[j].Exp
}
})
var playerCnt int = 15
groups := int(math.Ceil((float64)(len(sqlStrucks)) / float64(playerCnt)))
StartRobotUin := 200000
p.MStatus = 1
rand.Seed(time.Now().Unix())
for i := 0; i < groups; i++ {
if i < groups-1 {
temp := db.SqlChampshipsStruct{}
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
strr := []string{}
for j := 0; j < int(playerCnt); j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = dwUin
playerinfo.IsGet = 0
playerinfo.IsPlayer = 1
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = 0
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
for j := int(playerCnt); j < 30; j++ {
StartRobotUin = StartRobotUin + 1
dwUin := StartRobotUin
enum := rand.Intn(4) + 1
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = int32(dwUin)
playerinfo.IsGet = 0
playerinfo.IsPlayer = 0
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = int32(enum)
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
temp.GroupRankData = strings.Join(strr, ";")
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
for j := 0; j < int(playerCnt); j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
player, ok := G_GameLogicPtr.M_Players[dwUin]
if ok {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
} else {
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
if player != nil {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
} else {
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
}
}
}
} else {
remain := len(sqlStrucks) - (groups-1)*int(playerCnt)
cnt := 0
strr := []string{}
temp := db.SqlChampshipsStruct{}
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
for j := 0; j < remain; j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
strr = append(strr, res)
cnt = cnt + 1
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = dwUin
playerinfo.IsGet = 0
playerinfo.IsPlayer = 1
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = 0
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
for j := cnt; j < 30; j++ {
StartRobotUin = StartRobotUin + 1
dwUin := StartRobotUin
enum := rand.Intn(4) + 1
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = int32(dwUin)
playerinfo.IsGet = 0
playerinfo.IsPlayer = 0
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = int32(enum)
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
temp.GroupRankData = strings.Join(strr, ";")
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
for j := 0; j < remain; j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
player, ok := G_GameLogicPtr.M_Players[dwUin]
if ok {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
} else {
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
if player != nil {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
} else {
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
}
}
}
}
}
p.IsLoadDB = true
p.AIScoreGrowth1h()
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
func (p *ChampshipsManager) OpenChampShipTimes(args []interface{}) {
p.MStatus = 2
notify := &msg.NotifyChampshipTimesOpen{}
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesOpen", data)
}
func (p *ChampshipsManager) CloseChampShipTimes(args []interface{}) {
p.MStatus = 1
notify := &msg.NotifyChampshipTimesClose{}
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesClose", data)
}
func (p *ChampshipsManager) Notify_Clock_Tick_Sec(args []interface{}) {
timeStamp := args[0].(int64)
t := time.Unix(timeStamp, 0).Local()
zero := timeStamp - (int64)(t.Hour()*3600+t.Minute()*60+t.Second())
OpenTime := zero + MergeConst.G_Champion_Start_Offset
OpenTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time
CloseTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
DeleteLastTimesTime := zero + MergeConst.G_Champion_settlement_Duration
if G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime < int32(OpenTime) { //今日没有开启
if timeStamp >= OpenTime { //开启
GoUtil.CallEvent(MergeConst.Notify_Champion_Renew, []interface{}{int32(OpenTime)})
} else {
//开启时间未到
if p.MStatus == 1 {
GoUtil.CallEvent(MergeConst.Notify_EndChampShip, []interface{}{int32(OpenTime)})
}
}
} else {
if p.MStatus == 0 {
p.MStatus = 1
}
if !p.IsLoadDB {
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
}
p.IsLoadDB = true
}
}
if p.MStatus == 1 {
if timeStamp >= OpenTimesTime && timeStamp <= CloseTimesTime {
GoUtil.CallEvent(MergeConst.Notify_OpenChampShipTimes, []interface{}{int32(OpenTime)})
}
}
if p.MStatus == 2 {
if timeStamp > CloseTimesTime {
GoUtil.CallEvent(MergeConst.Notify_CloseChampShipTimes, []interface{}{int32(OpenTime)})
}
}
if p.IsSettle == 0 {
if timeStamp <= DeleteLastTimesTime {
p.IsSettle = 1
} else {
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
}
if p.IsSettle == 1 {
if timeStamp > DeleteLastTimesTime {
notify := &msg.NotifyChampshipSettleClose{}
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleClose", data)
p.IsSettle = 0
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
}
}
func (p *ChampshipsManager) EndChampShip(args []interface{}) {
p.MStatus = 0
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
notify := &msg.NotifyChampshipSettleOpen{}
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleOpen", data)
notify1 := &msg.NotifyChampshipClose{}
notify1.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data1, _ := proto.Marshal(notify1)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipClose", data1)
p.NotifyRenewChampshipData()
}
func (p *ChampshipsManager) NotifyRenewChampshipData() {
for i := 0; i < len(p.MUpdateNotifyList); i++ {
groupid := p.MUpdateNotifyList[i]
playerlist, ok := p.MChampshipPlayerMap[groupid]
if ok {
for j := 0; j < len(playerlist); j++ {
if playerlist[j].IsPlayer == 1 {
dwUin := playerlist[j].DwUin
player, ok1 := G_GameLogicPtr.M_Players[dwUin]
if ok1 {
agent := player.GetAgentByPlayer()
notify := &msg.NotifyUpdateChampshipRank{}
notify.ChampshipsGroupID = groupid
notify.GroupRankDataList = playerlist
data, _ := proto.Marshal(notify)
G_getGameLogic().PackResInfo(agent, "NotifyUpdateChampshipRank", data)
} else {
}
}
}
}
}
p.MUpdateNotifyList = p.MUpdateNotifyList[0:0]
}
func (p *ChampshipsManager) ReqChampshipData(player *Player, buf []byte) {
req := &msg.ReqChampshipData{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipData{}
_, ok := p.MChampshipPlayerMap[req.ChampshipsGroupID]
if ok {
res.GroupRankDataList = p.MChampshipPlayerMap[req.ChampshipsGroupID]
}
res.ChampshipsGroupID = req.ChampshipsGroupID
res.Status = p.MStatus
res.IsSettle = p.IsSettle
res.EndTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime + MergeConst.G_Champion_Duration
res.EndSettleTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime - MergeConst.G_Champion_Start_Offset + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipData", data)
}
func (p *ChampshipsManager) InitManager() {
GoUtil.RegisterEvent(MergeConst.Notify_Champion_Renew, p.OpenNewChampShip, p)
GoUtil.RegisterEvent(MergeConst.Notify_OpenChampShipTimes, p.OpenChampShipTimes, p)
GoUtil.RegisterEvent(MergeConst.Notify_CloseChampShipTimes, p.CloseChampShipTimes, p)
GoUtil.RegisterEvent(MergeConst.Notify_EndChampShip, p.EndChampShip, p)
GoUtil.RegisterEvent(MergeConst.Notify_Clock_Tick_Sec, p.Notify_Clock_Tick_Sec, p)
p.MChampshipMap = make(map[int32]*db.SqlChampshipsStruct)
p.MChampshipPlayerMap = make(map[int32][]*msg.ChampshipsPlayerInfo)
p.MStatus = 0
p.IsSettle = 0
p.IsLoadDB = false
p.MUpdateNotifyList = []int32{}
p.McronSave = cron.New()
p.McronSaveID, _ = p.McronSave.AddFunc("@every 70s", func() {
p.NotifyRenewChampshipData()
})
p.RobotCronID, _ = p.McronSave.AddFunc("@every 1h", func() {
p.AIScoreGrowth1h()
})
p.RobotCronID10s, _ = p.McronSave.AddFunc("@every 15m", func() {
if p.MStatus == 2 {
p.RobotIntervalAddScore15m()
}
})
p.McronSave.Start()
}
func (p *ChampshipsManager) RobotIntervalAddScore() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
ishaveRobot = true
addScore := 3
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 1
} else {
if ran <= 50 {
addScore = addScore + 2
}
}
v[i].Score = v[i].Score + int32(addScore)
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) GetMinGroupId() int32 {
var Min int32 = 0
for k := range p.MChampshipPlayerMap {
if Min == 0 {
Min = k
continue
}
if k < Min {
Min = k
}
}
return Min
}
func (p *ChampshipsManager) AIScoreGrowth1h() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
// MinGroupId := p.GetMinGroupId()
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
groupId := 0 //k - MinGroupId + 1
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
ishaveRobot = true
addScore := 0
if v[i].AIEnum == 1 {
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
}
if v[i].AIEnum == 2 {
addScore = 16
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 6
} else {
if ran <= 50 {
addScore = addScore + 10
}
}
}
if v[i].AIEnum == 3 {
addScore = 16
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 10
} else {
if ran <= 75 {
addScore = addScore + 6
}
}
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
}
if v[i].AIEnum == 4 {
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
score := rand.Intn(23)
addScore = addScore + score
}
v[i].Score = v[i].Score + int32(addScore)
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) RobotIntervalAddScore15m() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
addScore := 0
if v[i].AIEnum == 1 {
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 10
} else {
if ran <= 75 {
addScore = addScore + 6
}
}
ran = rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 5
} else {
if ran <= 50 {
addScore = addScore + 10
}
}
if addScore > 0 {
ishaveRobot = true
v[i].Score = v[i].Score + int32(addScore)
}
}
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) SaveDbDataByGroupId(GroupId int32) {
_, ok := p.MChampshipPlayerMap[GroupId]
if ok {
List := p.MChampshipPlayerMap[GroupId]
strr := []string{}
for i := 0; i < len(List); i++ {
Item := List[i]
unit := strconv.Itoa(int(Item.DwUin)) + "_" + strconv.Itoa(int(Item.IsPlayer)) + "_" + strconv.Itoa(int(Item.Score)) + "_" + strconv.Itoa(int(Item.IsGet)) + "_" + strconv.Itoa(int(Item.Times)) + "_" + strconv.Itoa(int(Item.CurChampshipsId)) + "_" + strconv.Itoa(int(Item.AIEnum))
strr = append(strr, unit)
}
data := strings.Join(strr, ";")
sqlStruct := &db.SqlChampionshipsStruct{}
sqlStruct.ChampshipsGroupID = GroupId
sqlStruct.GroupRankData = data
sqlStruct.CurChampshipsId = List[0].CurChampshipsId
db.FormatAllMemUpdateDb(sqlStruct, "t_championships_data", "ChampshipsGroupID")
}
}
func (p *ChampshipsManager) LoadDbDataByGroupId(ChampshipsId int32) {
sqlStr := "SELECT * FROM t_championships_data WHERE CurChampshipsId = ?"
sqlStruck := []db.SqlChampionshipsStruct{}
if err := db.SqlDb.Select(&sqlStruck, sqlStr, ChampshipsId); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
} else {
for m := 0; m < len(sqlStruck); m++ {
units := strings.Split(sqlStruck[m].GroupRankData, ";")
list := []*msg.ChampshipsPlayerInfo{}
for i := 0; i < len(units); i++ {
item := units[i]
strr := strings.Split(item, "_")
temp := &msg.ChampshipsPlayerInfo{}
dwuin, _ := strconv.Atoi(strr[0])
temp.DwUin = int32(dwuin)
IsPlayer, _ := strconv.Atoi(strr[1])
temp.IsPlayer = int32(IsPlayer)
Score, _ := strconv.Atoi(strr[2])
temp.Score = int32(Score)
IsGet, _ := strconv.Atoi(strr[3])
temp.IsGet = int32(IsGet)
Times, _ := strconv.Atoi(strr[4])
temp.Times = int32(Times)
CS, _ := strconv.Atoi(strr[5])
temp.CurChampshipsId = int32(CS)
AI, _ := strconv.Atoi(strr[6])
temp.AIEnum = int32(AI)
list = append(list, temp)
}
p.MChampshipPlayerMap[sqlStruck[m].ChampshipsGroupID] = list
}
}
}
func (p *ChampshipsManager) ReqChampshipAddScore(player *Player, buf []byte) {
req := &msg.ReqChampshipAddScore{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipAddScore{}
if p.MStatus == 0 {
res.ResultCode = MergeConst.Protocol_Champship_End
} else {
_, ok := p.MChampshipPlayerMap[req.GroupId]
if ok {
List := p.MChampshipPlayerMap[req.GroupId]
isHave := false
for i := 0; i < len(List); i++ {
if List[i].DwUin == player.M_DwUin {
List[i].Score = List[i].Score + req.AddScore
res.ResultCode = 0
isHave = true
break
}
}
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
if !isHave {
res.ResultCode = MergeConst.Protocol_Champship_No_Join
} else {
res.GroupRankDataList = List
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == req.GroupId {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, req.GroupId)
}
p.SaveDbDataByGroupId(req.GroupId)
}
} else {
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
}
}
res.GroupId = req.GroupId
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipAddScore", data)
}
func (p *ChampshipsManager) ReqChampshipAddTime(player *Player, buf []byte) {
req := &msg.ReqChampshipAddTime{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipAddTime{}
if p.MStatus == 0 {
res.ResultCode = MergeConst.Protocol_Champship_End
} else {
_, ok := p.MChampshipPlayerMap[req.GroupId]
if ok {
List := p.MChampshipPlayerMap[req.GroupId]
isHave := false
for i := 0; i < len(List); i++ {
if List[i].DwUin == player.M_DwUin {
List[i].Times = List[i].Times + req.AddTimes
res.ResultCode = 0
isHave = true
break
}
}
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
if !isHave {
res.ResultCode = MergeConst.Protocol_Champship_No_Join
} else {
res.GroupRankDataList = List
p.SaveDbDataByGroupId(req.GroupId)
}
} else {
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
}
}
res.GroupId = req.GroupId
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipAddTime", data)
}

View File

@ -1,48 +0,0 @@
package game
import "server/pkg/github.com/name5566/leaf/log"
func Charge(p *Player, ChargeId int) {
ChargeFire(p, ChargeId) // 充值
EndlessFire(p, ChargeId) // 无尽礼包
PiggyBankFire(p, ChargeId) // 猪猪银行
}
func PiggyBankFire(p *Player, ChargeId int) {
PiggyBankMod := p.PlayMod.getPiggyBankMod()
Item := PiggyBankMod.Fire(ChargeId)
err := p.HandleItem(Item, "PiggyBank")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
LimitedTimePiggyBankTrigger(p)
p.PlayMod.save()
p.PushClientRes(PiggyBankMod.BackData())
}
// 处理玩家充值
func ChargeFire(p *Player, ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.Fire(ChargeId)
err := p.HandleItem(Item, "Charge")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
p.PlayMod.save()
p.PushClientRes(ChargeMod.BackData())
}
// 处理玩家充值
func EndlessFire(p *Player, ChargeId int) {
EndlessMod := p.PlayMod.getEndlessMod()
Item := EndlessMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, "Endless")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
p.PlayMod.save()
p.PushClientRes(EndlessMod.BackData())
}

View File

@ -1,115 +0,0 @@
package game
import (
"fmt"
"server/GoUtil"
mergeCluster "server/cluster"
"server/conf"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
)
type FriendMgr struct {
*ServerMod
}
type FirendData struct {
List map[int][]*msg.Msg
ClusterMsg map[int][]*msg.Msg
}
func (f *FriendMgr) Init() {
f.key = FRIEND_MGR_KEY
f.data = &FirendData{
List: make(map[int][]*msg.Msg),
ClusterMsg: make(map[int][]*msg.Msg),
}
// 注册处理函数
f.init()
f.RegisterHandler(msg.HANDLE_TYPE_APPLY, f.sendToPlayer)
f.RegisterHandler(msg.HADNLE_TYPE_AGREE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_DEL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_SYNC, f.sync)
// 卡牌消息
f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_REFUSE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_FINISH, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD_FAIL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_SELECT_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_ARGREE_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_SELECT_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_EX_CARD, f.sendToPlayer)
}
func (f *FriendMgr) getData() *FirendData {
return f.data.(*FirendData)
}
// 通知玩家
func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
err := sendToPlayer(m)
if err != nil {
log.Debug("send to player error : %s\n", err)
ToServerId := GoUtil.GetServerIdByUid(m.To)
if ToServerId != conf.Server.ServerID {
f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
} else {
f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
}
f.update = true
return nil, err
}
log.Debug("send to player success")
return nil, nil
}
// 同步信息
func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
data := f.getData().List[m.From]
f.getData().List[m.From] = make([]*msg.Msg, 0)
return data, nil
}
// 发送消息给玩家
func sendToPlayer(m *msg.Msg) error {
p := G_GameLogicPtr.GetPlayerByUid(m.To)
if p == nil || p.stop {
return fmt.Errorf("player %d not online", m.To)
}
p.SendMsg(m)
return nil
}
func FriendMgrSend(m *msg.Msg) error {
ToServer := GoUtil.GetServerIdByUid(m.To)
if ToServer != conf.Server.ServerID {
err := mergeCluster.SendServerMsg(m, ToServer)
if err != nil { // 区服不在线
G_GameLogicPtr.FriendMgrSend(m)
return err
}
return nil
}
G_GameLogicPtr.FriendMgrSend(m)
return nil
}
// 集群好友消息同步
func ClusterFriendSync(m *msg.Msg) error {
log.Debug("ClusterFriendSync")
if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok {
for _, msg := range v {
mergeCluster.SendServerMsg(msg, m.To)
}
}
return nil
}
func FriendMgrCall(m *msg.Msg) interface{} {
return G_GameLogicPtr.FriendMgrCall(m)
}

File diff suppressed because it is too large Load Diff

View File

@ -1,66 +0,0 @@
package game
import (
"server/game/mod/card"
"server/game/mod/item"
"server/msg"
"strconv"
"strings"
"google.golang.org/protobuf/proto"
)
func ReqGmCommand(args []interface{}) error {
_, player, buf := ParseArgs(args)
detail := &msg.ReqGmCommand{}
proto.Unmarshal(buf, detail)
arg := strings.Split(detail.Command, " ")
switch arg[0] {
case "additem":
id, _ := strconv.Atoi(arg[1])
num, _ := strconv.Atoi(arg[2])
player.HandleItem([]*item.Item{item.NewItem(id, num)}, "GM")
case "subitem":
id, _ := strconv.Atoi(arg[1])
num, _ := strconv.Atoi(arg[2])
player.HandleItem([]*item.Item{item.NewItem(id, -num)}, "GM")
case "reset_order":
player.PlayMod.mod_list.Order.Step = 0
player.PlayMod.mod_list.Order.InitData()
player.PushClientRes(player.PlayMod.mod_list.Order.BackData())
case "add_card_star":
num, _ := strconv.Atoi(arg[1])
player.PlayMod.mod_list.Card.ExchangeStar += num
player.PushClientRes(player.PlayMod.mod_list.Card.BackData())
case "addexp":
num, _ := strconv.Atoi(arg[1])
player.GetPlayerBaseMod().AddExp(num)
player.PushClientRes(&player.GetPlayerBaseMod().Data)
case "setlv":
num, _ := strconv.Atoi(arg[1])
player.GetPlayerBaseMod().Data.Level = int32(num)
player.GetPlayerBaseMod().Data.Exp = 0
player.PushClientRes(&player.GetPlayerBaseMod().Data)
case "zeroUpdate":
player.PlayMod.getVarMod().DailyResetTime = 0
player.ZeroUpdate([]interface{}{})
case "setSevenLoginActive":
num, _ := strconv.Atoi(arg[1])
player.PlayMod.getSevenLoginMod().Active = num
case "pay":
ChargeId, _ := strconv.Atoi(arg[1])
Charge(player, ChargeId)
case "resetCardReq":
CardMod := player.PlayMod.getCardMod()
CardMod.ReqFriend = make(map[int]*card.CardInfo)
CardMod.ExCard = make(map[int]*card.CardInfo)
CardMod.ExTimes = 10
CardMod.ReqTimes = 10
FriendMod := player.PlayMod.getFriendMod()
FriendMod.ApplyCard = make(map[int]*card.CardInfo)
FriendMod.ExchangeCard = make(map[int]*card.CardInfo)
FriendMod.SelectCard = make(map[int]*card.CardInfo)
}
return nil
}

View File

@ -1,79 +0,0 @@
package game
import (
"fmt"
"net/http"
"server/conf"
"server/msg"
// "server/msg"
"encoding/json"
"strconv"
"github.com/gorilla/mux"
)
type HttpManager struct {
Rounter *mux.Router
}
func (p *HttpManager) InitRounter() {
p.Rounter = mux.NewRouter()
p.InitFriendRouter()
p.InitPlayerProfileInfo()
http.ListenAndServe(conf.Server.HttpPort, p.Rounter)
}
func (p *HttpManager) InitFriendRouter() {
bs := p.Rounter.PathPrefix("/Friend").Subrouter()
bs.HandleFunc("/Add/{SenderId}/{ReceiveId}", p.AddFriend)
bs.HandleFunc("/Del/{SenderId}/{ReceiveId}", p.DeleteFriend)
}
func (p *HttpManager) InitPlayerProfileInfo() {
bs := p.Rounter.PathPrefix("/Profile").Subrouter()
bs.HandleFunc("/GetBrief/{Id}", p.GetPlayerProfileInfo)
}
func (p *HttpManager) GetPlayerProfileInfo(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
Id, ok := vars["Id"]
if ok {
Uin, _ := strconv.Atoi(Id)
data := G_GameLogicPtr.MPlayerProfileManager.HttpReqPlayerBriefProfileData(int32(Uin))
test := []*msg.ResPlayerBriefProfileData{data, data}
bytes, _ := json.Marshal(test)
v := []*msg.ResPlayerBriefProfileData{}
json.Unmarshal(bytes, &v)
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
w.Write(bytes)
}
}
func (p *HttpManager) AddFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
SenderId, ok := vars["SenderId"]
if ok {
fmt.Println("AddFreind SenderId:" + SenderId)
}
ReceiveId, ok1 := vars["ReceiveId"]
if ok1 {
fmt.Println("AddFreind ReceiveId:" + ReceiveId)
}
}
func (p *HttpManager) DeleteFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, ok := vars["id"]
if !ok {
fmt.Println("id is missing in parameters")
}
fmt.Println(`id := `, id)
}

View File

@ -1,242 +0,0 @@
package game
import (
"fmt"
"github.com/robfig/cron/v3"
"server/GoUtil"
"server/MergeConst"
"server/db"
"server/gamedata"
"strconv"
"strings"
"time"
"server/pkg/github.com/name5566/leaf/timer"
)
type LimitEventPeriod struct {
StartCronID cron.EntryID
EndTimer *timer.Timer
StartTime int32
EndTime int32
Duration int32
CronStr string
AddTimes int32
}
func NewLimitEventData(dataName string, dbName string, player *Player) *PlayerLimitData {
act := &PlayerLimitData{
PlayerData: NewPlayerData(dataName, player),
MDbName: dbName,
}
return act
}
func CreateLimiteEventData(ID int32, dataName string, player *Player) PlayerDataModule {
var data PlayerDataModule
if ID == 1 {
data = &PlayerChestRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Chest_Rain", player)}
}
if ID == 2 {
data = &PlayerSuperEmiterData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Emiter", player)}
}
if ID == 3 {
data = &PlayerStarRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Star_Rain", player)}
}
if ID == 4 {
data = &PlayerHighRollerData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_High_Roller", player)}
}
if ID == 5 {
data = &PlayerSuperOrderData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Order", player)}
}
if ID == 6 {
data = &PlayerSceneSprintData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Scene_Sprint", player)}
}
if ID == 7 {
data = &PlayerCardFestivalData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Festival", player)}
}
if ID == 8 {
data = &PlayerDoubleHitData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Double_Hit", player)}
}
if ID == 9 {
data = &PlayerCardSwapData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Swap", player)}
}
if ID == 10 {
data = &PlayerPetRobberData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Pet_Robber", player)}
}
return data
}
type LimiteEventManager struct {
MStatus int32
CronList map[int][]string
IsSettle int32
IsLoadDB bool
MUpdateNotifyList []int32
McronSave *cron.Cron
McronSaveID cron.EntryID
RobotCronID cron.EntryID
RobotCronID10s cron.EntryID
m_MapCronEntryIDs map[int][]*LimitEventPeriod
Mdispatr *timer.Dispatcher
IsHighRoll bool
}
func (p *LimiteEventManager) GetLimitDataNameById(id int32) string {
LimitDataMap := make(map[int32]string)
LimitDataMap[1] = "PlayerChestRainData"
LimitDataMap[2] = "PlayerSuperEmiterData"
LimitDataMap[3] = "PlayerStarRainData"
LimitDataMap[4] = "PlayerHighRollerData"
LimitDataMap[5] = "PlayerSuperOrderData"
LimitDataMap[6] = "PlayerSceneSprintData"
LimitDataMap[7] = "PlayerCardFestivalData"
LimitDataMap[8] = "PlayerDoubleHitData"
LimitDataMap[9] = "PlayerCardSwapData"
LimitDataMap[10] = "PlayerPetRobberData"
return LimitDataMap[id]
}
func (p *LimiteEventManager) SaveDataFromDB(Key interface{}) bool {
return true
}
func (p *LimiteEventManager) GetSunDayZero() int64 {
timeStamp := time.Now().Unix()
t := time.Unix(timeStamp, 0).Local()
delta := int(t.Weekday()*3600*24) + t.Hour()*3600 + t.Minute()*60 + t.Second()
return int64(timeStamp) - int64(delta)
}
func (p *LimiteEventManager) GetLimitDataStatus(id int) *LimitEventPeriod {
timeStamp := time.Now().Unix()
keys := p.m_MapCronEntryIDs[id]
for i := 0; i < len(keys); i++ {
if timeStamp >= int64(keys[i].StartTime) && timeStamp < int64(keys[i].EndTime) {
return keys[i]
}
}
return nil
}
func (p *LimiteEventManager) GetIsHighRollerPersion() bool {
return p.IsHighRoll
}
// 1.宝箱雨
func (p *LimiteEventManager) InitManager() {
// 0 11 20 12 *
p.IsHighRoll = false
p.m_MapCronEntryIDs = map[int][]*LimitEventPeriod{}
c := cron.New()
LimiteCfg := gamedata.GetConfigByName("LimiteEvent")
WeekZero := p.GetSunDayZero()
timeStamp := time.Now().Unix()
p.Mdispatr = timer.NewDispatcher(10)
for i := 0; i < LimiteCfg.NumRecord(); i++ {
record := LimiteCfg.Record(i).(*gamedata.LimiteEvent)
startStrr := record.StartTime
starts := strings.Split(startStrr, "|")
DurStrr := record.Duration
Durs := strings.Split(DurStrr, "|")
AddTimesStrr := record.AddTimes
ats := strings.Split(AddTimesStrr, "|")
p.m_MapCronEntryIDs[record.Id] = []*LimitEventPeriod{}
for n := 0; n < len(starts); n++ {
LEP := &LimitEventPeriod{}
start := starts[n]
dur, _ := strconv.Atoi(Durs[n])
addt, _ := strconv.Atoi(ats[n])
LEP.StartCronID, _ = c.AddFunc(start, func() {
fmt.Println("Next: UTC", c.Entry(LEP.StartCronID).Next.Unix())
fmt.Println("CronStr:" + LEP.CronStr)
cur := int32(time.Now().Unix())
LEP.StartTime = int32(cur)
LEP.EndTime = int32(cur) + int32(dur)
if record.Id == 9 {
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < LEP.StartTime {
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = LEP.StartTime
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
GoUtil.CallEvent(MergeConst.OpenNewLimitEvent, []interface{}{record.Id, cur, cur + int32(dur), record.Type})
if record.Id == 4 {
p.IsHighRoll = true
}
go func() {
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(dur)*time.Second, func() {
if record.Id == 4 {
p.IsHighRoll = false
}
})
LEP.EndTimer = LeafTimer
(<-p.Mdispatr.ChanTimer).Cb()
}()
})
LEP.Duration = int32(dur)
LEP.CronStr = start
LEP.AddTimes = int32(addt)
p.m_MapCronEntryIDs[record.Id] = append(p.m_MapCronEntryIDs[record.Id], LEP)
}
}
c.Start()
for k, v := range p.m_MapCronEntryIDs {
// record := LimiteCfg.Index(k).(*gamedata.LimiteEvent)
key := k
for i := 0; i < len(v); i++ {
Schedule := c.Entry(v[i].StartCronID).Schedule
Next := Schedule.Next(time.Unix(WeekZero, 0))
// fmt.Println("Next.Unix():" + strconv.Itoa(int(Next.Unix())))
value := v[i]
if timeStamp >= Next.Unix() && timeStamp < Next.Unix()+int64(value.Duration) {
fmt.Println("CronStr:" + value.CronStr)
if key == 4 {
p.IsHighRoll = true
}
if key == 9 {
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < int32(Next.Unix()) {
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = int32(Next.Unix())
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
go func() {
delta := Next.Unix() + int64(value.Duration) - timeStamp
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(delta)*time.Second, func() {
if key == 4 {
p.IsHighRoll = false
}
})
value.EndTimer = LeafTimer
value.StartTime = int32(Next.Unix())
value.EndTime = int32(Next.Unix()) + int32(value.Duration)
(<-p.Mdispatr.ChanTimer).Cb()
}()
} else {
}
}
}
}

View File

@ -1,72 +0,0 @@
package game
import (
"server/GoUtil"
"server/game/mod/limitedTimeEvent"
"server/msg"
"time"
)
// 限时事件触发器
func LimitedTimeEventTrigger(p *Player, AddEventId int) {
EndTime, TimeoutEvent, AddEvent := p.PlayMod.getLimitedTimeEventMod().Trigger()
remainingTime := GoUtil.NextHourRemain()
EndTime = GoUtil.IfTrue(EndTime > 0, min(EndTime, int(remainingTime)), int(remainingTime)).(int)
if AddEventId != 0 {
AddEvent = append(AddEvent, AddEventId)
}
if EndTime > 0 {
p.CallEvent(time.Duration(EndTime)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeEventTrigger(p, 0)
p.SendClientRes()
}, "LimitedTimeEvent")
}
for _, v := range TimeoutEvent { // 事件到期处理
p.PushClientRes(&msg.LimitEventNotify{
Id: int32(v),
Type: limitedTimeEvent.EVENT_NOTIFY_TYPE_DEL,
})
switch v {
case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER:
MaxEnergyMul := p.GetPlayerBaseMod().GetMaxEnergyMul()
p.PlayMod.getBaseMod().ResetEnergyMul(MaxEnergyMul)
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
p.PlayMod.getOrderMod().RemoveSuperOrder()
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().ResetCardFestival()
}
}
for _, v := range AddEvent { // 增加事件处理
switch v {
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
Emit := p.PlayMod.getChessMod().GetEmitList()
Lv := p.GetPlayerBaseMod().GetLevel()
p.PlayMod.getOrderMod().CreateSuperOrder(Lv, Emit)
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().CreateCardFestival()
}
}
p.PushClientRes(p.PlayMod.getLimitedTimeEventMod().BackData())
p.PlayMod.save()
}
// 限时猪猪存钱罐触发器
func LimitedTimePiggyBankTrigger(p *Player) {
Remain := p.PlayMod.getPiggyBankMod().TimeOut()
if Remain > 0 {
p.CallEvent(time.Duration(Remain)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
p.PlayMod.getPiggyBankMod().TimeOut()
p.SendClientRes()
}, "PiggyBank")
}
p.PushClientRes(p.PlayMod.getPiggyBankMod().BackData())
}

View File

@ -1,77 +0,0 @@
package game
import (
"server/db"
"server/game/mod/item"
"server/pkg/github.com/name5566/leaf/log"
"sync"
"github.com/robfig/cron/v3"
)
const (
Login_log = 1
LoginOut_log = 2
Event_log = 3
)
type LogMgr struct {
L []*Log
McronSave *cron.Cron
Lock sync.Mutex
}
type Log struct {
Uid int32
Type int32
Event string
Items []*item.Item
TimeStamp int64
}
func (L *LogMgr) InitManager() {
L.McronSave = cron.New()
L.L = make([]*Log, 0, 10)
L.McronSave.AddFunc("@every 10s", func() {
L.Lock.Lock()
defer L.Lock.Unlock()
for _, v := range L.L {
switch v.Type {
case Login_log:
v.InsertLoginLog()
case LoginOut_log:
v.InsertLoginLog()
case Event_log:
v.InsertEventLog()
default:
log.Debug("unknown log type %d", v.Type)
continue
}
}
L.L = L.L[:0]
})
L.McronSave.Start()
}
func (L *LogMgr) AddLog(logs *Log) {
return
L.Lock.Lock()
defer L.Lock.Unlock()
L.L = append(L.L, logs)
}
func (Log *Log) InsertEventLog() {
sqlStr := "INSERT INTO t_log_event (dwUin, type, event, timestamp) VALUES (?, ?, ?, ?)"
_, err := db.SqlDb.Exec(sqlStr, Log.Uid, Log.Type, Log.Event, Log.TimeStamp)
if err != nil {
log.Debug("log insert event log error %s", err.Error())
}
}
func (Log *Log) InsertLoginLog() {
sqlStr := "INSERT INTO t_log_login (dwUin, type, event, timestamp) VALUES (?, ?, ?, ?)"
_, err := db.SqlDb.Exec(sqlStr, Log.Uid, Log.Type, Log.Event, Log.TimeStamp)
if err != nil {
log.Debug("log insert event log error %s", err.Error())
}
}

View File

@ -1,72 +0,0 @@
package game
import (
"encoding/json"
"server/GoUtil"
"server/db"
"server/game/mod/item"
"server/game/mod/msg"
"strings"
)
type MailMgr struct {
*ServerMod
list map[int]*ServerMail
}
type MailData struct {
List map[int][]*msg.Msg
}
type ServerMail struct {
Id int
Title string
Content string
Items []*item.Item
Start_time int64
Register_time int64
End_time int64
Mail_type int
To_uids []int
}
func (m *MailMgr) Init() {
m.key = MAIL_MGR_KEY
m.data = &MailData{
List: make(map[int][]*msg.Msg),
}
m.list = make(map[int]*ServerMail)
// 注册处理函数
m.init()
m.LoadMail()
}
func (r *MailMgr) LoadMail() {
// 从数据库加载邮件
data := make([]*db.SqlServerMailStruct, 0)
db.GetServerMailData(&data)
for _, v := range data {
Uids := make([]int, 0)
UidArr := strings.Split(v.To_uids, ",")
for _, v := range UidArr {
Uids = append(Uids, GoUtil.Int(v))
}
var items []interface{}
json.Unmarshal([]byte(v.Items), &items)
r.list[v.Id] = &ServerMail{
Id: v.Id,
Title: v.Title,
Content: v.Content,
Items: item.ParseItem(items),
Start_time: v.Start_time,
Register_time: v.Register_time,
End_time: v.End_time,
Mail_type: v.Mail_type,
To_uids: Uids,
}
}
}
func (r *MailMgr) Sync() {
G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL, Extra: r.list[1]})
}

View File

@ -1,9 +0,0 @@
package game
type PlayerSimpleData struct {
Uid int
Name string
Avatar int
Level int
Face int
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More