1. 最终效果
这次修改的目标只有一个:
- 把旧版客户端里的队伍分配模式
0 / 1 / 2 在 Lua 服务端里补齐
补完之后:
0 = TeamOption_Mode_Default
1 = TeamOption_Mode_Each
2 = TeamOption_Mode_Pet
三种模式的最终区别可以直接记成下面这张表:
| 模式值 |
模式名 |
玩家经验 |
宠物经验 |
0 |
TeamOption_Mode_Default |
平均分配 |
平均分配 |
1 |
TeamOption_Mode_Each |
偏向特殊成员 |
偏向特殊成员 |
2 |
TeamOption_Mode_Pet |
平均分配 |
偏向特殊成员 |
驯兽模式最核心的一句结论就是:
2. 涉及文件
/home/ubuntu/Game2/services/game/packet.lua
/home/ubuntu/Game2/lualib/team.lua
/home/ubuntu/Game2/lualib/teaminfo.lua
/home/ubuntu/Game2/lualib/raidinfo.lua
/home/ubuntu/Game2/services/scene/obj/monster.lua
其中真正决定驯兽模式是否生效的核心文件是:
services/scene/obj/monster.lua
3. 协议字段最终写法
这条协议不要再写成:
self.unknow_1 = stream:readint()
self.exp_mode = stream:readulong()
最终统一成下面这种明确名字:
self.option_id = stream:readint()
self.option_param_1 = stream:readint()
self.option_param_2 = stream:readint()
对应关系如下:
option_id
option_param_1
option_param_2
当前这条包真正使用的是:
option_id == 0
option_param_1 == 0 / 1 / 2
4. 队伍对象保存模式值
在 lualib/team.lua 里,队伍设置最终写成下面这种处理即可:
***付费内容***
客户端通知包保持:
option_id = 0
option_param_1 = 当前模式值
option_param_2 = 0
5. 驯兽模式的核心补法
怪物死亡后,多人组队经验分配统一放在:
services/scene/obj/monster.lua
最终补法不是只加一个 mode == 2,而是把 0 / 1 / 2 三种模式一起整理。
5.1 默认模式 0
5.2 各自分配 1
- 特殊成员玩家拿完整基准经验
- 其他玩家只拿较低比例
- 特殊成员宠物拿高档宠物经验
- 其他成员宠物拿低档宠物经验
5.3 驯兽模式 2
- 玩家经验继续走默认共享逻辑
- 宠物经验改成和模式
1 一样的特殊分配逻辑
也就是说,模式 2 的关键不是改人物经验,而是:
6. 怪物经验分配关键代码
最终核心逻辑可以整理成下面这种结构:
function monster:dispatch_exp(owners, team_leader)
local base_exp = self:get_base_exp()
if #owners == 1 then
...
return
end
local team_distribution_mode = 0
if team_leader then
local team_info = team_leader:get_team_info()
if team_info then
team_distribution_mode = team_info:get_exp_mode()
end
end
local occupant_guid = self:get_occupant_guid()
local owner_count = #owners
local share_owner_count = ...
local base_share_exp = ...
for _, o in ipairs(owners) do
local owner_guid = o:get_guid()
local owner_base_exp = self:caculate_base_exp(...)
local add = 0
if team_distribution_mode == 1 then
if occupant_guid ~= define.INVAILD_ID and owner_guid == occupant_guid then
add = owner_base_exp
else
add = round_half_up(owner_base_exp * owner_count * 0.05)
end
elseif base_share_exp > 0 then
add = self:caculate_base_exp(..., base_share_exp)
end
local pet_add_exp = 0
local pet = o:get_pet()
if pet then
local pet_base_exp = self:caculate_base_exp(...)
if team_distribution_mode == 0 then
pet_add_exp = self:caculate_base_exp(..., base_share_exp)
else
local pet_ratio_base = (owner_count - 2) * 0.05
if occupant_guid ~= define.INVAILD_ID and owner_guid == occupant_guid then
pet_add_exp = round_half_up(pet_base_exp * (pet_ratio_base + 1.3))
else
pet_add_exp = round_half_up(pet_base_exp * (pet_ratio_base + 0.15))
end
end
end
o:add_exp(add, pet_add_exp, true)
end
end
这一段就是驯兽模式真正生效的位置。
7. 这次顺手要一起改的地方
除了 monster.lua,还有两个地方要一起统一:
7.1 teaminfo.lua
function teaminfo:set_option(option)
self.options.exp_mode = math.floor(tonumber(option.option_param_1) or 0)
end
7.2 raidinfo.lua
function raidinfo:set_option(option)
self.options.exp_mode = math.floor(tonumber(option.option_param_1) or 0)
end
不要再留旧写法:
option.exp_mode
8. 最后只记住这几条
如果你只是要博客正文,不想看过程,最后直接记住下面几点就够了:
CGTeamChangeOption 最终协议字段写成:
option_id
option_param_1
option_param_2
- 当前真正使用的是:
option_id == 0
option_param_1 == 模式值
- 模式值对应关系:
0 = 默认 / 平均分配
1 = 各自分配
2 = 驯兽模式
- 驯兽模式不是直接砍玩家经验:
- 真正决定驯兽模式是否生效的核心文件是:
services/scene/obj/monster.lua
做到这一步,旧版 Temp_Release_v0-07-0300 的驯兽模式就算真正补齐了。
剩余 7% 内容需要支付 30.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|