feat(space): 替换并发安全map实现以提升性能 将原来基于`utils.ConcurrentMap`的玩家存储结构替换为 `github.com/mhmtszr/concurrent-swiss-map`提供的`CsMap`, 以获得更高效的并发读写能力。 同时修改了相关API调用方式: - `Set` 改为 `Store` - `Remove` 改为 `Delete` - `IterCb` 改为 `Range`,并支持提前终止迭代 - `Items()` 不再使用 此外,调整了部分业务逻辑中对玩家列表遍历的方式, 确保在发送网络包后及时跳出循环,避免不必要的操作。 新增战斗类型处理函数`PET_King`用于处理宠物王相关的 战斗请求,并修复了`PET_MELEE`方法中的逻辑问题。 更新了go.mod和go.sum引入新的依赖库。 ```
95 lines
3.1 KiB
Go
95 lines
3.1 KiB
Go
package effect
|
||
|
||
import (
|
||
"blazing/logic/service/fight/info"
|
||
"blazing/logic/service/fight/input"
|
||
"blazing/logic/service/fight/node"
|
||
)
|
||
|
||
// -----------------------------------------------------------
|
||
// 通用效果:受物理攻击时概率附加指定状态(如麻痹、冰冻等)
|
||
// -----------------------------------------------------------
|
||
type EffectPhysicalAttackAddStatus struct {
|
||
node.EffectNode
|
||
targetStatus info.EnumPetStatus // 差异化:要附加的目标状态
|
||
}
|
||
|
||
// 工厂函数:创建"物理攻击触发状态"效果实例
|
||
func newEffectPhysicalAttackAddStatus(status info.EnumPetStatus) *EffectPhysicalAttackAddStatus {
|
||
return &EffectPhysicalAttackAddStatus{
|
||
targetStatus: status,
|
||
}
|
||
}
|
||
|
||
// 初始化:批量注册所有"物理攻击触发状态"类效果
|
||
func init() {
|
||
registerPhysicalAttackAddStatusEffects()
|
||
}
|
||
|
||
// 批量注册:绑定效果ID与对应的目标状态
|
||
func registerPhysicalAttackAddStatusEffects() {
|
||
// 效果ID与目标状态的映射(84=麻痹,92=冰冻,可按需扩展其他状态)
|
||
statusMap := map[int]info.EnumPetStatus{
|
||
84: info.PetStatus.Paralysis, // Effect84:物理攻击触发麻痹
|
||
92: info.PetStatus.Frozen, // Effect92:物理攻击触发冰冻
|
||
108: info.PetStatus.Burned, // Effect108:物理攻击触发灼烧
|
||
// 新增类似效果只需在这里加条目,例如:
|
||
// 100: info.PetStatus.Poisoned, // 物理攻击触发中毒
|
||
}
|
||
|
||
// 循环注册所有效果
|
||
for effectID, status := range statusMap {
|
||
input.InitEffect(input.EffectType.Skill, effectID, newEffectPhysicalAttackAddStatus(status))
|
||
}
|
||
}
|
||
|
||
// -----------------------------------------------------------
|
||
// 核心逻辑:受物理攻击时触发(覆盖父类方法)
|
||
// -----------------------------------------------------------
|
||
func (e *EffectPhysicalAttackAddStatus) Damage_DIV_ex(t *info.DamageZone) bool {
|
||
// 1. 命中判定失败,不触发
|
||
if !e.Hit() {
|
||
return true
|
||
}
|
||
|
||
// 2. 技能为空或非物理攻击,不触发
|
||
skill := e.Ctx().SkillEntity
|
||
if skill == nil || skill.Category() != info.Category.PHYSICAL {
|
||
return true
|
||
}
|
||
|
||
// 3. 概率判定(Args()[1]为触发概率)
|
||
success, _, _ := e.Input.Player.Roll(e.Args()[1], 100)
|
||
if !success {
|
||
return true
|
||
}
|
||
|
||
// 4. 计算持续回合(默认2~3回合,支持通过参数指定)
|
||
duration := e.getDuration()
|
||
|
||
// 5. 获取状态效果实例并设置参数
|
||
statusEffect := input.Geteffect(input.EffectType.Status, int(e.targetStatus))
|
||
if statusEffect == nil {
|
||
return true
|
||
}
|
||
statusEffect.Duration(duration)
|
||
statusEffect.SetArgs(e.Ctx().Our) // 目标为对手
|
||
|
||
// 6. 给对手添加状态
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
|
||
return true
|
||
}
|
||
|
||
// 设置参数(复用父类逻辑)
|
||
func (e *EffectPhysicalAttackAddStatus) SetArgs(t *input.Input, a ...int) {
|
||
e.EffectNode.SetArgs(t, a...)
|
||
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
|
||
}
|
||
|
||
// 计算持续回合(封装为独立方法,增强可读性)
|
||
func (e *EffectPhysicalAttackAddStatus) getDuration() int {
|
||
|
||
// 默认随机2~3回合(Int31n(2)返回0/1,+2后为2/3)
|
||
return int(e.Input.FightC.GetRand().Int31n(2)) + 2
|
||
}
|