refactor(socket): 重构 ClientData 结构体并优化相关逻辑
- 简化 ClientData 结构体,移除不必要的方法 - 优化 Player 结构体,调整 Conn 类型 - 更新 wscodec.go 中的 Conn 结构体 - 删除未使用的 XML 相关文件和代码 - 调整 ServerEvent 和 controller 中的相关逻辑
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@ type OgreInfo struct {
|
||||
type OgrePetInfo struct {
|
||||
Id uint32
|
||||
Shiny uint32
|
||||
Lv uint32 `struc:"skip"` //等级
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)}
|
||||
|
||||
Reference in New Issue
Block a user