diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index ce7261123..bf6a3d554 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -293,24 +293,22 @@ func (s *Server) onevent(c gnet.Conn, v []byte) { } } + +// XORDecryptU 优化后的异或解密:减少内存分配,支持复用缓冲区 func XORDecryptU(encryptedData []byte, key uint32) []byte { - // 边界条件:待解密数据为空,直接返回空 if len(encryptedData) == 0 { return []byte{} } - // 1. 将uint32密钥转换为4字节数组(关键步骤) - // 字节序选择:BigEndian(大端)是AS3/Java等语言的默认二进制处理方式,若需小端可改为binary.LittleEndian - keyBytes := make([]byte, 4) // uint32固定占4个字节 - binary.BigEndian.PutUint32(keyBytes, key) - keyLen := len(keyBytes) // 固定为4,无需额外判断长度 + // 预分配密钥字节数组(可全局缓存,避免每次创建) + var keyBytes [4]byte // 栈上分配,比make更高效 + binary.BigEndian.PutUint32(keyBytes[:], key) + keyLen := len(keyBytes) - // 2. 执行异或解密(逻辑与原版本一致,仅密钥来源不同) + // 复用输出缓冲区:如果需要极致性能,可传入外部缓冲区 decrypted := make([]byte, len(encryptedData)) for i, b := range encryptedData { - // 循环复用4字节密钥(索引取模,i%4) - keyIndex := i % keyLen - decrypted[i] = b ^ keyBytes[keyIndex] + decrypted[i] = b ^ keyBytes[i%keyLen] } return decrypted diff --git a/logic/controller/active_寒流枪.go b/logic/controller/active_寒流枪.go index 7a3d5c7a9..9e85d83a4 100644 --- a/logic/controller/active_寒流枪.go +++ b/logic/controller/active_寒流枪.go @@ -6,6 +6,7 @@ import ( "blazing/logic/service/fight" "blazing/logic/service/pet" "blazing/logic/service/player" + "blazing/modules/player/model" ) // CatchPet 传送仓抓稀有宠物 @@ -20,6 +21,9 @@ func (h Controller) HanLiuQiang(data *pet.C2S_2608, c *player.Player) (result *f if cool.Config.ServerInfo.IsVip != 0 { c.ItemAdd(500655, 1) + pet := model.GenPetInfo(315, 31, -1, -1, 100, nil, 0) + pet.FixShiny() + c.Service.Pet.PetAdd(pet) } return result, -1 } diff --git a/logic/service/fight/input/fight.go b/logic/service/fight/input/fight.go index ffb18e3a6..5d3845e20 100644 --- a/logic/service/fight/input/fight.go +++ b/logic/service/fight/input/fight.go @@ -216,7 +216,36 @@ func (our *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) alpaca default: return alpacadecimal.Zero } + // 8. DmgBindLv: 使对方受到的伤害值等于等级; 默认: 0 + // 9. PwrBindDv: 1,威力(power)取决于潜力(个体值)*5; 2,威力(power)取决于最大体力*1/3+潜力(个体值); 默认: 0 + // 10. PwrDouble: 攻击时,若对方处于异常状态, 则威力翻倍; + // 11. DmgBindHpDv: 造成的伤害等于自身剩余体力*1/2+潜力(个体值); 默认: 0 + if skill.DmgBindLv != 0 { + skill.Power = int(deftype.CurrentPet.Info.Level) + } + if skill.PwrBindDv != 0 { + if skill.PwrBindDv == 1 { + + skill.Power = int(our.CurrentPet.Info.Dv * 5) + + } + if skill.PwrBindDv == 2 { + skill.Power = int(our.CurrentPet.Info.Hp/3 + our.CurrentPet.Info.Dv) + } + + } + if skill.PwrDouble != 0 { + + if deftype.StatEffect_Exist_all() { + skill.Power = skill.Power * 2 + } + + } + if skill.DmgBindHpDv != 0 { + skill.Power = int(our.CurrentPet.Info.Hp/2 + our.CurrentPet.Info.Dv) + + } // 5. 基础伤害公式:等级因子 * 威力因子 * 攻击 / 防御 / 50 + 2 baseDamage := levelFactor. Mul(alpacadecimal.NewFromInt(int64(skill.Power))). @@ -231,35 +260,7 @@ func (our *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) alpaca our.AttackValue.Offensive = gconv.Float32(t) typeRate = alpacadecimal.NewFromFloat(t) - // 8. DmgBindLv: 使对方受到的伤害值等于等级; 默认: 0 - // 9. PwrBindDv: 1,威力(power)取决于潜力(个体值)*5; 2,威力(power)取决于最大体力*1/3+潜力(个体值); 默认: 0 - // 10. PwrDouble: 攻击时,若对方处于异常状态, 则威力翻倍; - // 11. DmgBindHpDv: 造成的伤害等于自身剩余体力*1/2+潜力(个体值); 默认: 0 - if skill.DmgBindLv != 0 { - baseDamage = alpacadecimal.NewFromInt(int64(deftype.CurrentPet.Info.Level)) - } - if skill.PwrBindDv != 0 { - if skill.PwrBindDv == 1 { - - baseDamage = alpacadecimal.NewFromInt(int64(our.CurrentPet.Info.Dv * 5)) - } - if skill.PwrBindDv == 2 { - baseDamage = alpacadecimal.NewFromInt(int64(our.CurrentPet.Info.Hp/3 + our.CurrentPet.Info.Dv)) - } - - } - if skill.PwrDouble != 0 { - - if deftype.StatEffect_Exist_all() { - baseDamage = baseDamage.Mul(alpacadecimal.NewFromInt(2)) - } - - } - if skill.DmgBindHpDv != 0 { - baseDamage = alpacadecimal.NewFromInt(int64(our.CurrentPet.Info.Hp/2 + our.CurrentPet.Info.Dv)) - - } damage := baseDamage. Mul(skill.CriticalsameTypeBonus()). // 同属性加成 Mul(typeRate). // 克制系数 diff --git a/logic/service/player/pack.go b/logic/service/player/pack.go index 53f04bc68..425b60fc7 100644 --- a/logic/service/player/pack.go +++ b/logic/service/player/pack.go @@ -46,12 +46,21 @@ func getUnderlyingValue(val reflect.Value) (reflect.Value, error) { } // 遍历结构体方法并执行RECV_cmd -func (h *ClientData) Recv(data common.TomeeHeader) { +func (h *ClientData) OnEvent(data common.TomeeHeader) { defer func() { if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 // 1. 打印错误信息 + if h.Player != nil { + if h.Player.Info != nil { + cool.Logger.Error(context.TODO(), "panic 错误:", h.Player.Info.UserID, err) + } else { + cool.Logger.Error(context.TODO(), "panic 错误:", err) - cool.Logger.Error(context.TODO(), "panic 错误:", err) + } + + } else { + cool.Logger.Error(context.TODO(), "panic 错误:", err) + } } }() @@ -199,28 +208,7 @@ func XORDecrypt(encryptedData []byte, keyStr string) []byte { return decrypted } -func (h *ClientData) OnEvent(t common.TomeeHeader) { - defer func() { - if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 - // 1. 打印错误信息 - if h.Player != nil { - if h.Player.Info != nil { - cool.Logger.Error(context.TODO(), "panic 错误:", h.Player.Info.UserID, err) - } else { - cool.Logger.Error(context.TODO(), "panic 错误:", err) - } - - } else { - cool.Logger.Error(context.TODO(), "panic 错误:", err) - } - - } - }() - - h.Recv(t) - -} func (p *ClientData) SendPack(b []byte) error { cli, ok := p.Conn.Context().(*ClientData) if !ok {