refactor(socket): 重构 ClientData 结构体并优化相关逻辑

- 简化 ClientData 结构体,移除不必要的方法
- 优化 Player 结构体,调整 Conn 类型
- 更新 wscodec.go 中的 Conn 结构体
- 删除未使用的 XML 相关文件和代码
- 调整 ServerEvent 和 controller 中的相关逻辑
This commit is contained in:
2025-08-30 00:36:08 +08:00
parent 1f835c1197
commit 7b5ec208fc
31 changed files with 472 additions and 602 deletions

View File

@@ -2,7 +2,7 @@ package info
import (
element "blazing/common/data/Element"
"blazing/common/data/xml/skill"
"blazing/common/data/xmlres"
"blazing/common/utils/random"
"context"
@@ -35,7 +35,7 @@ var Category = enum.New[struct {
// 实现了战斗中技能的所有属性和行为包括PP管理、技能使用、属性获取等
// 战斗中可以修改技能实体值,比如是否暴击,是否必中等
type BattleSkillEntity struct {
skill.Move
xmlres.Move
ctx context.Context
SideEffects []int
SideEffectArgs []int
@@ -61,7 +61,7 @@ func CreateBattleSkillWithInfinity(id int, pp int) *BattleSkillEntity {
}
// 从资源仓库获取技能数据
move, ok := skill.MovesConfig.Moves[id]
move, ok := xmlres.MovesConfig.Moves[id]
if !ok {
glog.Error(context.Background(), "技能ID无效", "id", id)
}

View File

@@ -7,5 +7,5 @@ type OgreInfo struct {
type OgrePetInfo struct {
Id uint32
Shiny uint32
Lv uint32 `struc:"skip"` //等级
}

View File

@@ -2,13 +2,16 @@ package maps
import (
"blazing/common/data/socket"
"blazing/common/data/xmlres"
"blazing/common/socket/handler"
"blazing/logic/service/space"
"blazing/modules/blazing/model"
"math/rand"
"strings"
"time"
"github.com/creasty/defaults"
"github.com/gogf/gf/v2/util/gconv"
)
type InInfo struct {
@@ -38,9 +41,9 @@ func (t *InInfo) Broadcast(mapid uint32, o OutInfo) {
func (t *InInfo) SpawnMonsters(c *socket.Player, isfrist bool) {
// 获取当前地图的怪物配置
// if c == nil || mservice.NewMonsterService().GetId(c.MapId) == 0 { //用户离线
// return
// }
if c == nil || c.Info.MapID == 0 { //用户离线
return
}
if !c.IsLogin {
defer func() {
@@ -60,27 +63,54 @@ func (t *InInfo) SpawnMonsters(c *socket.Player, isfrist bool) {
t.monsters, _, _ = replaceOneNumber(t.monsters)
}
t1 := t.genMonster(c.Info.UserID)
t1 := t.genMonster(c.Info.MapID)
if t1 != nil {
t1 := tt.Pack(t1)
c.SendPack(t1)
}
c.SendPack(tt.Pack(&t1))
}
// 2. 从 string 类型 slice 随机选一个元素
func RandomStringFromSlice(s []string) string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
randomIdx := r.Intn(len(s))
return s[randomIdx]
}
// 应该根据怪物信息决定后端生成
func (t *InInfo) genMonster(mapid uint32) OgreInfo {
func (t *InInfo) genMonster(mapid uint32) *OgreInfo {
// 设置怪物信息
t1 := OgreInfo{}
for _, tc := range xmlres.Monster.Maps {
if tc.ID == gconv.Int(mapid) && tc.Monsters != nil {
for i, m := range tc.Monsters.Monsters { //这里是9个
id := strings.Split(m.ID, " ")
lv := strings.Split(m.Lv, " ")
ttt := OgrePetInfo{
Id: gconv.Uint32(RandomStringFromSlice(id)),
}
if ttt.Id != 0 {
ttt.Shiny = 0 //待确认是否刷新异色
ttt.Lv = gconv.Uint32(RandomStringFromSlice(lv))
}
t1.Data[i] = ttt
}
break
}
}
t2 := OgreInfo{}
for i := 0; i < 3; i++ {
ttt := OgrePetInfo{}
// ttt.Id = mservice.NewMonsterService().GetId(mapid) //待修改成xml获取
ttt.Shiny = uint32(i + 1) //异色概率,待实现自定义
//t1.Data[i] = mservice.NewMonsterService().GetId(c.MapId)
t1.Data[t.monsters[i]] = ttt
t2.Data[t.monsters[i]] = t1.Data[t.monsters[i]]
}
return t1
return &t2
}
// 计算整数的二进制1的个数Integer.bitCount
@@ -101,7 +131,7 @@ func generateThreeUniqueNumbers() [3]int {
index := 0
for index < 3 {
num := rand.Intn(10)
num := rand.Intn(9)
if !selected[num] {
selected[num] = true
result[index] = num
@@ -124,7 +154,7 @@ func replaceOneNumber(original [3]int) ([3]int, int, int) {
originalMap[num] = true
}
for i := 0; i < 10; i++ {
for i := 0; i < 8; i++ {
if !originalMap[i] {
candidates = append(candidates, i)
}

View File

@@ -4,24 +4,30 @@ import (
"blazing/common/data/socket"
"blazing/common/socket/errorcode"
"blazing/common/socket/handler"
"blazing/modules/blazing/model"
)
func GetPlayer(c *socket.Conn, userid uint32) *socket.Player { //TODO 这里待优化,可能存在内存泄漏问题
c.Mu.Lock()
defer c.Mu.Unlock()
//检查player初始化是否为conn初始后取map防止二次连接后存在两个player
clientdata := c.MainConn.Context().(*socket.ClientData)
if clientdata.GetPlayer() != nil {
return clientdata.GetPlayer()
}
var player *socket.Player
if player1, ok := socket.Mainplayer.Load((userid)); ok {
clientdata.SetPlayer(player1)
if clientdata.Player != nil {
return clientdata.Player
}
return player
clientdata.Player = socket.NewPlayer(
socket.WithConn(c), //注入conn
)
// gff := socket.NewClientData()
// gff.Player = clientdata.Player
// c.MainConn.SetContext(gff)
socket.Mainplayer.Store(userid, clientdata.Player)
return clientdata.Player
// return nil
}
func KickPlayer(userid uint32) { //踢出玩家
@@ -40,19 +46,3 @@ func KickPlayer(userid uint32) { //踢出玩家
//return player
// return nil
}
func SetPlayer(c *socket.Conn, user *model.PlayerInfo) *socket.Player { //TODO 这里待优化,
clientdata := c.MainConn.Context().(*socket.ClientData)
player := socket.NewPlayer(
socket.WithConn(*c), //注入conn
)
socket.Mainplayer.Store(user.UserID, player)
clientdata.SetPlayer(player) //= player
return player
// return nil
}

View File

@@ -1,7 +1,7 @@
package space
import (
xml "blazing/common/data/xml/map"
"blazing/common/data/xmlres"
"golang.org/x/sync/singleflight"
)
@@ -19,7 +19,7 @@ func GetMapHot() []MapHotInfo {
tt := make(map[uint32]uint32)
for _, v := range xml.MapConfig.Maps {
for _, v := range xmlres.MapConfig.Maps {
t1, ok := tt[uint32(v.Super)]
if ok {
@@ -41,5 +41,5 @@ func GetMapHot() []MapHotInfo {
}
return result, nil
})
return result1.([]MapHotInfo)
return result1.([]MapHotInfo)
}

View File

@@ -2,7 +2,7 @@ package space
import (
"blazing/common/data/socket"
xml "blazing/common/data/xml/map"
"blazing/common/data/xmlres"
"blazing/common/utils"
"blazing/modules/blazing/model"
"sync"
@@ -37,7 +37,7 @@ func (m *Space) Get(playerID uint32) (*socket.Player, bool) {
// Set 存储玩家实例按ID
// 写操作使用Lock独占锁保证数据一致性
func (m *Space) Set(playerID uint32, player *socket.Player)*Space {
func (m *Space) Set(playerID uint32, player *socket.Player) *Space {
m.mu.Lock()
defer m.mu.Unlock()
m.data[playerID] = player
@@ -90,7 +90,7 @@ func GetSpace(id uint32) *Space {
}
//如果不ok,说明星球未创建,那就新建星球
for _, v := range xml.MapConfig.Maps {
for _, v := range xmlres.MapConfig.Maps {
if v.ID == int(id) { //找到这个地图
t := NewSpace()
t.DefaultPos = model.Pos{X: uint32(v.X), Y: uint32(v.Y)}