找回密码
 register
搜索
查看: 14|回复: 0

洱海月 队伍分配模式补齐驯兽模式教程

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:533
  • 打卡月天数:22
  • 打卡总奖励:530
  • 最近打卡:2026-06-24 01:45:59
Waylee 发表于 2026-4-11 22:20 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

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. 最后只记住这几条

如果你只是要博客正文,不想看过程,最后直接记住下面几点就够了:

  1. CGTeamChangeOption 最终协议字段写成:
    • option_id
    • option_param_1
    • option_param_2
  2. 当前真正使用的是:
    • option_id == 0
    • option_param_1 == 模式值
  3. 模式值对应关系:
    • 0 = 默认 / 平均分配
    • 1 = 各自分配
    • 2 = 驯兽模式
  4. 驯兽模式不是直接砍玩家经验:
    • 玩家经验继续平均
    • 宠物经验改成特殊成员优先
  5. 真正决定驯兽模式是否生效的核心文件是:
    • services/scene/obj/monster.lua

做到这一步,旧版 Temp_Release_v0-07-0300 的驯兽模式就算真正补齐了。

付费看帖
剩余 7% 内容需要支付 30.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

QQ|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )|天天打卡

GMT+8, 2026-6-24 05:31 , Processed in 0.068049 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表