Merge branch 'main' of github.com:72wo/blazing

This commit is contained in:
2025-11-06 12:26:29 +08:00
15 changed files with 77 additions and 66 deletions

View File

@@ -48,8 +48,10 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) {
}()
atomic.AddInt64(&s.connected, -1)
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
v, _ := c.Context().(*player.ClientData)
v.LF.Close()
if v.Player != nil {
v.SaveL.Do(func() { //使用保存锁,确保在踢人和掉线的时候只保存一次
//cool.Loger.Info(context.TODO(), "准备保存", v.Player.Info.UserID)
@@ -140,7 +142,8 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
//client := conn.RemoteAddr().String()
s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复
for _, msg := range messages {
t.OnEvent(msg.Payload)
t.LF.Producer().Write(msg.Payload)
//t.OnEvent(msg.Payload)
}
})
@@ -164,8 +167,8 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
}
s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复
conn.Context().(*player.ClientData).OnEvent(data)
//conn.Context().(*player.ClientData).OnEvent(data)
conn.Context().(*player.ClientData).LF.Producer().Write(data)
})
if conn.InboundBuffered() > 0 {

View File

@@ -126,9 +126,7 @@ func (h Controller) OnReadyToFight(data *fight.ReadyToFightInboundInfo, c *playe
// 接收战斗或者取消战斗的包
func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if !c.CanFight() {
return nil, errorcode.ErrorCodes.ErrPokemonNotEligible
}
if ok, p1 := c.AgreeBattle(data.UserID, data.Flag, data.Mode); ok {
fight.NewFight(data.Mode, info.BattleStatus.FIGHT_WITH_PLAYER, c, p1) ///开始对战,房主方以及被邀请方
}
@@ -164,15 +162,23 @@ func (h Controller) UseSkill(data *fight.UseSkillInInfo, c *player.Player) (resu
// 战斗逃跑
func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if c.FightC == nil {
return nil, 0
}
if !c.FightC.CanEscape() {
return nil, 0
}
c.FightC.Over(c, info.BattleOverReason.PlayerEscape)
return nil, 0
}
// 切换精灵
func (h Controller) ChangePet(data *fight.ChangePetInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
c.FightC.ChangePet(c, data.CatchTime)
if c.FightC != nil {
c.FightC.ChangePet(c, data.CatchTime)
}
return nil, -1
}

View File

@@ -69,24 +69,23 @@ func (h *Controller) PetRelease(
switch data.Flag {
case 0:
var temp []model.PetInfo
removeIndex := -1
for i, v := range c.Info.PetList {
for _, v := range c.Info.PetList {
if v.CatchTime == uint32(data.CatchTime) {
removeIndex = i
break // 只移除第一个匹配值,若需移除所有,可省略 break 继续循环
c.Service.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
t.Data = v
t.InBag = 0
})
} else {
temp = append(temp, v)
}
}
if removeIndex != -1 {
c.Service.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
t.Data = c.Info.PetList[removeIndex]
t.InBag = 0
})
c.Info.PetList = append(c.Info.PetList[:removeIndex], c.Info.PetList[removeIndex+1:]...)
}
c.Info.PetList = temp
// break // 只移除第一个匹配值,若需移除所有,可省略 break 继续循环
case 1:
//todo 背包
c.Service.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {

View File

@@ -39,14 +39,14 @@ func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Playe
// if data.Head.CMD != 2204 { //判断是每日任务
// isdaliy = true
// }
result = &task.AddTaskBufOutboundInfo{}
c.Service.Task(data.TaskId, func(te *model.TaskEX) bool {
te.Data = data.TaskList
return true
})
return &task.AddTaskBufOutboundInfo{}, 0
return result, 0
}
/**

View File

@@ -22,6 +22,7 @@ require (
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/antlabs/stl v0.0.2 // indirect
github.com/bits-and-blooms/bitset v1.5.0 // indirect
github.com/bruceshao/lockfree v1.1.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect

View File

@@ -8,6 +8,8 @@ github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLo
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM=
github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8=
github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bruceshao/lockfree v1.1.2 h1:V3j7bZWS+yDjazffbobpR+ZCVq98DNJcZMvO8vWFLmc=
github.com/bruceshao/lockfree v1.1.2/go.mod h1:zkhImea4VTfzWvFF1Lleo1esCZeJLGgrYN+mUuqNrMA=
github.com/brunoga/deep v1.2.5 h1:bigq4eooqbeJXfvTfZBn3AH3B1iW+rtetxVeh0GiLrg=
github.com/brunoga/deep v1.2.5/go.mod h1:GDV6dnXqn80ezsLSZ5Wlv1PdKAWAO4L5PnKYtv2dgaI=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=

View File

@@ -15,6 +15,6 @@ type FightI interface {
Capture(c PlayerI, id uint32)
GetRand() *rand.Rand
LoadPercent(c PlayerI, percent int32)
CanEscape() bool
IsFirst(c PlayerI) bool
}

View File

@@ -36,6 +36,10 @@ type FightC struct {
closefight bool
}
func (f *FightC) CanEscape() bool {
return f.Info.Status != info.BattleStatus.FIGHT_WITH_PLAYER
}
func (f *FightC) Ownerid() uint32 {
return f.ownerID
@@ -260,7 +264,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *action.S
attacker.Exec(func(t input.Effect) bool { //计算命中 miss改命中
t.Skill_Hit(input.Ctx{ //计算变威力
Input: attacker,
Input: defender,
SelectSkillAction: a,
}) //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
@@ -295,9 +299,10 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *action.S
if attacker.AttackValue.IsCritical == 1 {
//暴击破防
if a.SkillEntity.Category() == info.Category.PHYSICAL {
if a.SkillEntity.Category() == info.Category.PHYSICAL && defender.Prop[1] > 0 {
defender.Prop[1] = 0
} else if a.SkillEntity.Category() == info.Category.SPECIAL {
} else if a.SkillEntity.Category() == info.Category.SPECIAL && defender.Prop[3] > 0 {
defender.Prop[3] = 0
}
@@ -565,11 +570,13 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
t := f.First.GetEffect(input.EffectType.Status, i)
if t != nil { //状态都是叠层类的
ret.FAttack.Status[i] = int8(t.Duration())
ret.FAttack.Status[i] = int8(t.Duration()) + 1
}
t = f.Second.GetEffect(input.EffectType.Status, i)
if t != nil {
ret.SAttack.Status[i] = int8(t.Duration())
ret.SAttack.Status[i] = int8(t.Duration()) + 1
}
}

View File

@@ -311,7 +311,7 @@ func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal.
Add(decimal.NewFromInt(2))
var typeRate decimal.Decimal
fmt.Println(skill.Type().ID, deftype.CurrentPet.Type().ID)
//fmt.Println(skill.Type().ID, deftype.CurrentPet.Type().ID)
t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.CurrentPet.Type().ID)
typeRate = decimal.NewFromFloat(t)

View File

@@ -56,6 +56,7 @@ func (i *Input) GetPetInfo() *info.BattlePetEntity {
}
func (i *Input) ResetAttackValue() {
i.AttackValue.SkillID = 0
i.AttackValue.IsCritical = 0
}

View File

@@ -70,7 +70,7 @@ func (c *Input) GetProp(id int, istue bool) int {
func (c *Input) GetEffect(etype EnumEffectType, id int) Effect {
var ret []Effect
for _, v := range c.Effects {
if v.ID() == id {
if v.ID() == id &&v.Alive(){
ret = append(ret, v)
}

View File

@@ -92,7 +92,6 @@ func (f *FightC) UseSkill(c common.PlayerI, id int32) {
ret := &action.SelectSkillAction{
BaseAction: action.NewBaseAction(c.GetInfo().UserID),
}
//ret.PetInfo = f.GetInputByPlayer(c, false).CurrentPet
for _, v := range f.GetInputByPlayer(c, false).CurrentPet.Skills {

View File

@@ -5,6 +5,7 @@ import (
"blazing/common/utils/bytearray"
"blazing/cool"
"sync"
"time"
"context"
@@ -12,6 +13,7 @@ import (
"fmt"
"reflect"
"github.com/bruceshao/lockfree"
"github.com/gobwas/ws"
"github.com/gobwas/ws/wsutil"
"github.com/gogf/gf/v2/os/glog"
@@ -205,19 +207,29 @@ type ClientData struct {
Wsmsg *WsCodec
Conn gnet.Conn
SaveL sync.Once //保存锁
SaveDone chan struct{}
LF *lockfree.Lockfree[[]byte]
//SaveDone chan struct{}
}
func NewClientData(c gnet.Conn) *ClientData {
// 创建事件处理器
// 创建消费端串行处理的Lockfree
cd := ClientData{
cd := &ClientData{
Player: nil,
Conn: c,
Wsmsg: &WsCodec{},
Conn: c,
Wsmsg: &WsCodec{},
}
return &cd
cd.LF = lockfree.NewLockfree[[]byte](
1024*1024,
cd,
lockfree.NewSleepBlockStrategy(time.Millisecond),
)
// 启动Lockfree
if err := cd.LF.Start(); err != nil {
panic(err)
}
return cd
}
@@ -244,7 +256,14 @@ func XORDecrypt(encryptedData []byte, keyStr string) []byte {
return decrypted
}
func (h *ClientData) OnEvent(v []byte) {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
cool.Loger.Error(context.TODO(), "panic 错误:", err)
}
}()
header := TomeeHeader{}
tempdata := bytearray.CreateByteArray(v)

View File

@@ -88,7 +88,7 @@ func (lw *Player) AgreeBattle(userid, flag uint32, mode info.EnumBattleMode) (bo
return false, nil
}
if v.Info.UserID == userid && v.PVPinfo.Mode == mode { //成功找到,同意对战
if lw.CanFight() {
if lw.CanFight() &&v.CanFight(){
ret.Result = 1
v.SendPack(t1.Pack(ret))

View File

@@ -1,14 +1,9 @@
package main
import (
"fmt"
"reflect"
"strings"
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
_ "blazing/contrib/drivers/pgsql"
"blazing/modules/base/service"
_ "blazing/contrib/files/local"
@@ -27,11 +22,10 @@ import (
"blazing/login/internal/cmd"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
)
func main() {
service.TestSendVerificationCode()
//service.TestSendVerificationCode()
cmd.Main.Run(gctx.New())
}
@@ -47,23 +41,3 @@ func kick(id int) {
// fmt.Println(err)
// }()
}
type ssss struct {
ttt int `cmd:"111|222"`
}
func Test_kick() {
value := reflect.ValueOf(ssss{})
// 获取类型
typ := value.Type()
// 遍历结构体字段
// fmt.Printf("结构体 %s 的字段信息:\n", t.Name())
for i := 0; i < typ.NumField(); i++ {
field := typ.Field(i)
t := field.Tag.Get("cmd")
//t1 := strings.Split(t, "|")
t2 := gconv.SliceUint32(strings.Split(t, "|"))
fmt.Println(t2)
}
}