This commit is contained in:
昔念
2026-02-11 11:06:28 +08:00
parent ab1445510a
commit 71a0ae2157
4 changed files with 52 additions and 61 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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). // 克制系数

View File

@@ -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 { // 恢复 panicerr 为 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 { // 恢复 panicerr 为 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 {