diff --git a/logic/controller/fight_base.go b/logic/controller/fight_base.go index 7738d41d1..751146158 100644 --- a/logic/controller/fight_base.go +++ b/logic/controller/fight_base.go @@ -68,7 +68,7 @@ func (h Controller) Capture(data *fight.CatchMonsterInboundInfo, c *player.Playe // 加载进度 func (h Controller) LoadPercent(data *fight.LoadPercentInboundInfo, c *player.Player) (result *info.LoadPercentOutboundInfo, err errorcode.ErrorCode) { if c.FightC == nil { - return nil, errorcode.ErrorCodes.ErrBattleEnded + return nil, -1 } c.FightC.LoadPercent(c, int32(data.Percent)) diff --git a/logic/controller/fight_leitai.go b/logic/controller/fight_leitai.go index 81a8ed03f..dec5898ac 100644 --- a/logic/controller/fight_leitai.go +++ b/logic/controller/fight_leitai.go @@ -23,10 +23,7 @@ func (h Controller) ARENA_SET_OWENR(data *fight.ARENA_SET_OWENR, c *player.Playe c.Fightinfo.Mode = 0 //取消队列匹配 if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.Flag, 0, 1) { - c.GetSpace().Owner.UserID = c.GetInfo().UserID //添加用户ID - c.GetSpace().Owner.Nick = c.GetInfo().Nick - c.GetSpace().ARENA_Player = c //添加用户 - + c.GetSpace().Owner.Set(c) c.GetSpace().Broadcast(c, 2419, c.GetSpace().Owner) c.SendPackCmd(2419, c.GetSpace().Owner) return @@ -50,21 +47,42 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P if c.Info.UserID == c.GetSpace().Owner.UserID { return nil, errorcode.ErrorCodes.ErrNoEligiblePokemon } + + if c.GetSpace().Owner.ARENA_Player == nil { + return nil, errorcode.ErrorCodes.ErrSystemError200007 + } + + if !c.GetSpace().Owner.ARENA_Player.CanFight() { + c.GetSpace().Owner.Set(c) + c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner) + c.SendPackCmd(2419, &c.GetSpace().Owner) + return + } //原子操作,修改擂台状态 if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.Flag, 1, 2) { //成功发起擂台挑战后才修改我放状态 c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE c.Fightinfo.Status = info.BattleMode.FIGHT_ARENA - _, err = fight.NewFight(c, c.GetSpace().ARENA_Player, func(foi *info.FightOverInfo) { //我方邀请擂主挑战,我方先手 + _, err = fight.NewFight(c, c.GetSpace().Owner.ARENA_Player, func(foi *info.FightOverInfo) { //我方邀请擂主挑战,我方先手 if foi.Reason != 0 && foi.WinnerId == c.GetInfo().UserID { //异常退出 - c.GetSpace().ARENA_Player = nil + c.GetSpace().Owner.Reset() c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner) c.SendPackCmd(2419, &c.GetSpace().Owner) + } + + if foi.Reason == 0 { //异常退出 + + if foi.WinnerId == c.GetInfo().UserID { + c.Info.MaxArenaWins += 1 + } else { + c.GetSpace().Owner.ARENA_Player.GetInfo().MaxArenaWins += 1 + } + } //todo 擂主输了,那就直接让他放弃擂台 @@ -75,11 +93,7 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P //c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner) //c.SendPackCmd(2419, &c.GetSpace().Owner) } else { - //发起失败,改回1 - // c.GetSpace().Owner.HostWins = 0 //连胜重置 - // c.GetSpace().Owner.UserID = c.GetInfo().UserID //添加用户ID - // c.GetSpace().Owner.Nick = c.GetInfo().Nick - // c.GetSpace().ARENA_Player = c //添加用户 + atomic.StoreUint32(&c.GetSpace().Owner.Flag, 1) } @@ -107,9 +121,11 @@ func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player) // 都需要通过2419包广播更新擂台状态 func (h Controller) ARENA_UPFIGHT(data *fight.ARENA_UPFIGHT, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //原子操作,修改擂台状态 - + if atomic.LoadUint32(&c.GetSpace().Owner.UserID) != c.GetInfo().UserID { //说明已经有人了 + return nil, errorcode.ErrorCodes.ErrChampionCannotCancel + } if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.UserID, c.GetInfo().UserID, 0) { - c.GetSpace().ARENA_Player = nil + c.GetSpace().Owner.Reset() c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner) @@ -129,19 +145,11 @@ func (h Controller) ARENA_UPFIGHT(data *fight.ARENA_UPFIGHT, c *player.Player) ( func (h Controller) ARENA_OWENR_ACCE(data *fight.ARENA_OWENR_ACCE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { s := c.GetSpace() - if atomic.LoadUint32(&s.Owner.UserID) != c.GetInfo().UserID && c.GetInfo().UserID != atomic.LoadUint32(&s.Owner.ChallengerID) { //说明已经有人了 - return nil, -1 - } - if c.GetInfo().UserID == atomic.LoadUint32(&s.Owner.UserID) { - c.Info.MaxArenaWins += 1 - s.Owner.HostWins += 1 //连胜+1 - } else { - s.Owner.HostWins = 0 //连胜重置 - s.Owner.UserID = c.GetInfo().UserID //添加用户ID - s.Owner.Nick = c.GetInfo().Nick - s.ARENA_Player = c //添加用户 + if atomic.LoadUint32(&c.GetSpace().Owner.UserID) != c.GetInfo().UserID && c.GetInfo().UserID != atomic.LoadUint32(&c.GetSpace().Owner.ChallengerID) { //说明已经有人了 + return nil, errorcode.ErrorCodes.ErrChampionCannotCancel } + s.Owner.Set(c) atomic.StoreUint32(&s.Owner.Flag, 1) diff --git a/logic/controller/fight_pvp_king.go b/logic/controller/fight_pvp_king.go index 63be84894..b35b02dc4 100644 --- a/logic/controller/fight_pvp_king.go +++ b/logic/controller/fight_pvp_king.go @@ -50,7 +50,7 @@ func (h Controller) PET_King(data *fight.PetKingJoinInboundInfo, c *player.Playe c.Fightinfo.Mode = info.BattleMode.MULTI_MODE } err = c.JoinFight(func(p common.PlayerI) bool { - fight.NewFight(p, c, func(foi *info.FightOverInfo) { + _, err = fight.NewFight(p, c, func(foi *info.FightOverInfo) { if foi.Reason == 0 { //我放获胜 if foi.WinnerId == c.GetInfo().UserID { c.Info.MonKingWin += 1 @@ -60,7 +60,10 @@ func (h Controller) PET_King(data *fight.PetKingJoinInboundInfo, c *player.Playe } }) ///开始对战,房主方以及被邀请方 + if err > 0 { //说明有报错 + return false + } return true }) diff --git a/logic/controller/user.go b/logic/controller/user.go index 1c401eafe..c213a3a68 100644 --- a/logic/controller/user.go +++ b/logic/controller/user.go @@ -36,6 +36,7 @@ func (h Controller) UserMoreInfo(data *user.MoreUserInfoInboundInfo, c *player.P return ret, 0 } +// 射击 func (h Controller) Aimat(data *user.AimatInboundInfo, c *player.Player) (result *user.AimatOutboundInfo, err errorcode.ErrorCode) { result = &user.AimatOutboundInfo{ diff --git a/logic/service/fight/boss/NewSeIdx_36.go b/logic/service/fight/boss/NewSeIdx_36.go index 731107618..54e2a04e4 100644 --- a/logic/service/fight/boss/NewSeIdx_36.go +++ b/logic/service/fight/boss/NewSeIdx_36.go @@ -1,6 +1,7 @@ package effect import ( + "blazing/logic/service/fight/action" "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" @@ -15,8 +16,18 @@ type NewSel36 struct { round int } -func (e *NewSel36) Damage_DIV_ex(t *info.DamageZone) bool { +func (e *NewSel36) Turn_Start(fattack *action.SelectSkillAction, sattack *action.SelectSkillAction) { e.round++ + if e.round >= 5 { + e.round = 0 + e.index++ + if e.index >= len(e.Args()) { + e.index = 0 + + } + } +} +func (e *NewSel36) Damage_DIV_ex(t *info.DamageZone) bool { e.Ctx().Our.AttackValue.State = uint32(e.Args()[e.index]) @@ -32,22 +43,11 @@ func (e *NewSel36) Damage_DIV_ex(t *info.DamageZone) bool { return true } - if e.Args()[e.index] == e.Ctx().SkillEntity.Type { + if e.Args()[e.index] != e.Ctx().SkillEntity.Type { - if e.round >= 5 { - e.round = 0 - e.index++ - if e.index >= len(e.Args()) { - e.index = 0 - - } - } - - return true + t.Damage = decimal.NewFromInt(0) } - t.Damage = decimal.NewFromInt(0) - return true } func init() { diff --git a/logic/service/fight/info/battle.go b/logic/service/fight/info/battle.go index b49c8e46c..123b9a67c 100644 --- a/logic/service/fight/info/battle.go +++ b/logic/service/fight/info/battle.go @@ -94,11 +94,11 @@ type DefaultEndData struct { type EnumBattleOverReason int var BattleOverReason = enum.New[struct { - PlayerOffline EnumBattleOverReason `enum:"1"` //掉线 - PlayerOVerTime EnumBattleOverReason `enum:"2"` //超时 - PlayerCaptureSuccess EnumBattleOverReason `enum:"3"` //捕捉成功 - DefaultEnd EnumBattleOverReason `enum:"4"` //默认结束 - PlayerEscape EnumBattleOverReason `enum:"5"` //逃跑 + PlayerOffline EnumBattleOverReason `enum:"1"` //掉线 + PlayerOVerTime EnumBattleOverReason `enum:"2"` //超时 + NOTwind EnumBattleOverReason `enum:"3"` //打成平手 + DefaultEnd EnumBattleOverReason `enum:"4"` //默认结束 + PlayerEscape EnumBattleOverReason `enum:"5"` //逃跑 }]() // 战斗模式 diff --git a/logic/service/fight/loop.go b/logic/service/fight/loop.go index b23a47925..d22925a8f 100644 --- a/logic/service/fight/loop.go +++ b/logic/service/fight/loop.go @@ -254,7 +254,7 @@ func (f *FightC) handleItemAction(a *action.UseItemAction) { CatchTime: uint32(f.Opp.CurrentPet.Info.CatchTime), PetId: uint32(f.Opp.CurrentPet.ID), })) - //f.Reason = info.BattleOverReason.PlayerCatch + //f.Reason = info.BattleOverReason.PlayerCaptureSuccess //f.WinnerId = 0 //捕捉成功不算胜利 f.closefight = true diff --git a/logic/service/player/fight.go b/logic/service/player/fight.go index 097d14a84..c0804625f 100644 --- a/logic/service/player/fight.go +++ b/logic/service/player/fight.go @@ -24,7 +24,7 @@ func (p *Player) JoinFight(fn func(p common.PlayerI) bool) errorcode.ErrorCode { if v.GetInfo().UserID != p.Info.UserID { //确认是乱斗模式 - if v.Getfightinfo() == p.Getfightinfo() { + if v.Getfightinfo() == p.Getfightinfo() && p.CanFight() { // p.Fightinfo = nil //先将自身的准备信息置空 // //value.PVPinfo = nil diff --git a/logic/service/space/arena.go b/logic/service/space/arena.go index 613864b58..ecfc45b78 100644 --- a/logic/service/space/arena.go +++ b/logic/service/space/arena.go @@ -1,7 +1,13 @@ package space +import ( + "blazing/logic/service/common" + "sync/atomic" +) + type ARENA struct { - Flag uint32 // 0=清除ArenaInfo(flag为0时其他字段全为空) 1=站上擂台的信息 2=挑战中的信息 + ARENA_Player common.PlayerI `struc:"skip"` + Flag uint32 // 0=清除ArenaInfo(flag为0时其他字段全为空) 1=站上擂台的信息 2=挑战中的信息 UserID uint32 Nick string `struc:"[16]byte"` HostWins uint32 // 应该是擂台人的连胜数 @@ -16,4 +22,24 @@ func (t *ARENA) Reset() { t.HostWins = 0 t.ChallengerID = 0 + t.ARENA_Player = nil + +} + +func (t *ARENA) Set(c common.PlayerI) bool { + + if c.GetInfo().UserID == atomic.LoadUint32(&t.UserID) { + + t.HostWins += 1 //连胜+1 + + } else { + t.HostWins = 0 //连胜重置 + t.UserID = c.GetInfo().UserID //添加用户ID + t.Nick = c.GetInfo().Nick + t.ARENA_Player = c //添加用户 + } + + atomic.StoreUint32(&t.Flag, 1) + + return true } diff --git a/logic/service/space/in_out.go b/logic/service/space/in_out.go index 59adaa9ce..8a8a4372b 100644 --- a/logic/service/space/in_out.go +++ b/logic/service/space/in_out.go @@ -35,7 +35,6 @@ func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) { func (s *Space) LeaveMap(c common.PlayerI) { if atomic.CompareAndSwapUint32(&s.Owner.UserID, c.GetInfo().UserID, 0) { - s.ARENA_Player = nil s.Owner.Reset() diff --git a/logic/service/space/space.go b/logic/service/space/space.go index 17e3d9c42..953ec550e 100644 --- a/logic/service/space/space.go +++ b/logic/service/space/space.go @@ -18,9 +18,8 @@ type Space struct { Super uint32 //SuperValue *int32 //ID uint32 // 地图ID - Name string //地图名称 - Owner ARENA - ARENA_Player common.PlayerI + Name string //地图名称 + Owner ARENA } // NewSyncMap 创建一个新的玩家同步map diff --git a/logic/service/user/chat.go b/logic/service/user/chat.go index 84092d5ea..0519176bc 100644 --- a/logic/service/user/chat.go +++ b/logic/service/user/chat.go @@ -68,7 +68,7 @@ type S2CDanceAction struct { type C2SPEOPLE_TRANSFROM struct { Head common.TomeeHeader `cmd:"2111" struc:"skip"` - // Reserve 固定参数(值为 10001) + // Reserve uint32// 固定参数(值为 10001) SuitID uint32 `struc:"uint32,big"` } type S2CPEOPLE_TRANSFROM struct { diff --git a/public/config/bossbuff和特性.xml b/public/config/bossbuff和特性.xml index 2a88f644f..6d4ce36fd 100644 --- a/public/config/bossbuff和特性.xml +++ b/public/config/bossbuff和特性.xml @@ -485,7 +485,7 @@ -