太阳神三国杀lua吧 关注:2,644贴子:73,495
  • 12回复贴,共1
求助

想询问在特定时机下发动技能会重复sendLog的情况怎么解决

只看楼主收藏回复

楼主近日在编写武将技能的时候碰到了重复多次sendLog的问题。部分技能代码如图:
翻译表为 [lbk]"#ketx_tianzao_cleared_over"[rbk] = "本轮「天造」结束。",
现在的情况是,这个RoundEnd的部分,房间里每有一个玩家,这个广播就会在右边聊天栏输出一次,八人房就会输出8次……影响美观,想求教一下应该怎么让它只输出一次。



IP属地:江西来自Android客户端1楼2025-07-07 10:19回复
    想到了两种解决方法:
    第一种是通过座次来限制次数,也就是在RoundEnd时机下只有座次为1的角色能sendLog(或者直接改成在RoundEnd时机下只有座次为1的角色能触发这个技能),可以通过getSeat()方法获取座次,注意这里不要用getPlayerSeat(),前者只有存活的角色拥有座次(阵亡的座次为0),后者是所有角色都有
    第二种是可以加个限制信息,可以用setTag(),这样只有第一次在RoundEnd时机下触发技能的角色会sendLog,不过这个方法需要在游戏开始时初始化,在每轮开始时重置计数(需要额外写一个控制技能)


    IP属地:湖北2楼2025-07-07 13:05
    收起回复
      2025-12-29 13:58:14
      广告
      不感兴趣
      开通SVIP免广告
      做了个测试,用的是GameStart时机(非全局时机)


      可以看出问题在于can_trigger,解决方法是可以把EventPhaseEnd和RoundEnd拆成两个技能写(反正也是隐藏技),然后就可以在can_trigger上进行区分


      IP属地:湖北3楼2025-07-07 19:02
      收起回复
        elseif event == sgs . RoundEnd then
        -- ✅ 只有 seat == 1 的玩家才执行清除和广播
        if player:getSeat() ~= 1 then
        return false
        end
        -- ✅ 检查是否已经发送过日志(通过 -Clear 标记)
        if player:getMark("ketx_tianzaoend-Clear") >= 1 then
        return false
        end
        -- ✅ 设置标记(+1),防止后续触发者重复发送
        room:addPlayerMark(player, "ketx_tianzaoend-Clear", 1)
        -- ✅ 清除所有拥有【天造】技能玩家的 tag
        for _, p in sgs . qlist(room:getAllPlayers()) do
        if p:hasSkill("ketx_tianzao") then
        p:setTag("ketx_tianzao_x", sgs.QVariant(0))
        end
        end
        -- ✅ 发送日志(只会执行一次)
        local log = sgs . LogMessage()
        log . type = "#ketx_tianzao_cleared_over"
        log . from = nil
        log . arg = self:objectName()
        room:sendLog(log)
        end
        现在我是这样做的,我也不知道座次和一回合的标记谁管用了,不过现在是正常了。(中间一些错误的空格是因为不打空格百度会变成超链接)。@蔷薇十字


        IP属地:江西来自Android客户端4楼2025-07-08 10:15
        收起回复
          问一下兄弟们多个技能可以拼接吗,直接复制在一起不行,中间要加什么来过度呀


          IP属地:浙江来自Android客户端5楼2025-07-08 22:19
          收起回复