增加玩家全服数据

This commit is contained in:
hahwu 2025-04-29 14:20:01 +08:00
parent c50e176e6c
commit 38d6f14b95
11 changed files with 179 additions and 24 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/md5"
crand "crypto/rand"
"encoding/base64"
"encoding/gob"
@ -283,3 +284,14 @@ func Compare(x int, condition string, y int) bool {
return false
}
}
func UniKey(seed string) string {
hash := md5.New()
timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
io.WriteString(hash, seed+timestamp)
return fmt.Sprintf("%x", hash.Sum(nil))
}
func GetUserKey(Uid int64) string {
return fmt.Sprintf("user_data_%d", Uid)
}

View File

@ -94,10 +94,12 @@ const G_Champion_settlement_Duration = 3600 * 23
const G_Champion_Unlock_Score = 2
const G_Champion_Max_Score = 44650
const G_Champion_People_Cnt = 50
const SUCCESS = 1
const (
ORDER_STATUS_IDLE = 0 // 订单未完成
ORDER_STATUS_PAY = 1 // 订单已支付
ORDER_STATUS_CANCEL = 2 // 订单取消
ORDER_STATUS_SHIP = 3 // 订单已发货
)
const GLOBAL_SERVER_ID = 0 // 全局服ID

View File

@ -16,7 +16,7 @@ const (
)
var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数
var CallbackChan = make(map[string]chan *msg.Msg) // 回调消息队列
var (
server *network.TCPServer // 服务器
Center *network.TCPClient // 集群中心

View File

@ -125,6 +125,32 @@ func SendServerMsg(m *msg.Msg, serverId int) error {
return fmt.Errorf("server %d not online", serverId)
}
func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) {
if v, ok := serverAgent.Load(serverId); ok {
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("CallServerMsg GobMarshal err %v", err)
return nil, err
}
v.(network.Agent).WriteMsg(data)
}
m.UniKey = GoUtil.UniKey("clusterGlobal")
newChan := make(chan *msg.Msg, 1)
registerChanel(m.UniKey, newChan)
timeout := time.After(15 * time.Second)
select {
case <-newChan:
backm := <-newChan
unregisterChanel(m.UniKey)
if backm == nil {
return nil, fmt.Errorf("server %d not response", serverId)
}
return backm, nil
case <-timeout:
return nil, fmt.Errorf("timeout waiting for server %d response", serverId)
}
}
func SendMsgAll(m *msg.Msg) {
data, err := GoUtil.GobMarshal(m)
if err != nil {
@ -139,6 +165,13 @@ func SendMsgAll(m *msg.Msg) {
func processMsg(a *Agent, m *msg.Msg) error {
var err error
// 先处理同步回调
if m.UniKey != "" {
if chanel, ok := CallbackChan[m.UniKey]; ok {
chanel <- m
}
return nil
}
if fun, ok := FuncMap[m.Type]; ok {
err = fun(a, m)
} else {
@ -151,6 +184,14 @@ func registerFunc(key int, fun func(*Agent, *msg.Msg) error) {
FuncMap[key] = fun
}
func registerChanel(key string, chanel chan *msg.Msg) {
CallbackChan[key] = chanel
}
func unregisterChanel(key string) {
delete(CallbackChan, key)
}
func sendGameMsg(m *msg.Msg) {
MsgChan <- m
}

View File

@ -15,7 +15,8 @@
"TELOGDIR" : "./teLog/",
"GameName": "pet_home_local",
"GameID": 1,
"ListenAddr": ":3001",
"CenterAddr": ":3000",
"ServerType":"node",
"ServerID": 1,

View File

@ -4,6 +4,7 @@ import (
"encoding/gob"
"fmt"
"server/GoUtil"
"server/MergeConst"
mergeCluster "server/cluster"
"server/conf"
"server/game/mod/card"
@ -73,6 +74,9 @@ func (f *FriendMgr) Init() {
f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_GET, f.GetVarUserData)
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData)
}
func (f *FriendMgr) getData() *FirendData {
@ -115,6 +119,31 @@ func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
return data, nil
}
func (f *FriendMgr) GetVarUserData(m *msg.Msg) (interface{}, error) {
Key := GoUtil.GetUserKey(int64(m.To))
data := G_GameLogicPtr.VarMgr.GetUserVar(Key)
if data == nil {
data = &VarUserData{
Upvote: 0,
}
}
return data, nil
}
func (f *FriendMgr) SetVarUserData(m *msg.Msg) (interface{}, error) {
VarOp := m.Extra.(VarOpration)
Key := GoUtil.GetUserKey(int64(m.To))
data := G_GameLogicPtr.VarMgr.GetUserVar(Key)
switch VarOp.Type {
case VAR_OP_UPVOTE:
data.Upvote++
}
return &VarOpration{
Data: data,
Code: MergeConst.SUCCESS,
}, nil
}
// 发送消息给玩家
func sendToPlayer(m *msg.Msg) error {
p := G_GameLogicPtr.GetPlayer(int64(m.To))
@ -132,19 +161,16 @@ func FriendMgrSend(m1 *msg.Msg) error {
err := mergeCluster.SendServerMsg(m, ToServer)
if err != nil { // 区服不在线
G_GameLogicPtr.FriendMgrSend(m)
//log.Debug("send to server %d error : %s\n", ToServer, err)
return err
}
return nil
}
//log.Debug("send to server %d success, %d", ToServer, conf.Server.ServerID)
G_GameLogicPtr.FriendMgrSend(m)
return nil
}
// 集群好友消息同步
func ClusterFriendSync(m *msg.Msg) error {
log.Debug("ClusterFriendSync")
if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok {
for _, msg := range v {
if msg.H == 1 {
@ -160,5 +186,14 @@ func ClusterFriendSync(m *msg.Msg) error {
}
func FriendMgrCall(m *msg.Msg) interface{} {
ToServer := GoUtil.GetServerIdByUid(m.To)
if ToServer != conf.Server.ServerID {
r, err := mergeCluster.CallServerMsg(m, ToServer)
if err != nil { // 区服不在线
log.Debug("FriendMgrCall err %v", err)
return nil
}
return r
}
return G_GameLogicPtr.FriendMgrCall(m.Clone())
}

View File

@ -3,6 +3,7 @@ package game
import (
"server/GoUtil"
"server/game/mod/item"
"server/game/mod/msg"
proto "server/msg"
)
@ -133,6 +134,16 @@ func PlayroomVisit(p *Player, Uid int) {
r.Upvote = GoUtil.InArray(Uid, PlayroomMod.UpvoteList)
r.Items = Items
r.Status = int32(PlayroomMod.GameStatus)
r.UpvoteCount = int32(PlayerData.Upvote)
data := FriendMgrCall(&msg.Msg{
From: int(p.M_DwUin),
To: Uid,
Type: msg.HANDLE_TYPE_VAR_USER_GET,
})
if data == nil {
data = &VarUserData{
Upvote: 0,
}
}
r.UpvoteCount = int32(data.(*VarUserData).Upvote)
p.PushClientRes(r)
}

View File

@ -2549,6 +2549,7 @@ func ReqFriendTLUpvote(player *Player, buf []byte) error {
})
return err
}
// 添加时间线
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_HANDBOOK_UPVOTE,
From: int(player.M_DwUin),
@ -2556,6 +2557,15 @@ func ReqFriendTLUpvote(player *Player, buf []byte) error {
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
// 添加记录
m1 := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_VAR_USER_SET,
From: int(player.M_DwUin),
To: int(FUid),
SendT: GoUtil.Now(),
Extra: VarOpration{Type: VAR_OP_UPVOTE},
}
FriendMgrSend(m1)
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_SUCCESS,
@ -3059,7 +3069,7 @@ func ReqRaceReward(player *Player, buf []byte) error {
// 请求playroom基础数据
func ReqPlayroom(player *Player, buf []byte) error {
PlayroomBackData(player)
// PlayroomBackData(player)
return nil
}

View File

@ -33,6 +33,17 @@ type VarGoldCard struct {
Five int
}
type VarOpration struct {
Type int
Key string
Data interface{}
Code int
}
type VarUserData struct {
Upvote int
}
const (
ACT_STATUS_NOT_START = 0
ACT_STATUS_START = 1
@ -67,4 +78,5 @@ func init() {
gob.Register(&limitedTimeEvent.LuckyCat{})
gob.Register(&msg.HandbookMsg{})
gob.Register(&limitedTimeEvent.CatTrick{})
gob.Register(&VarOpration{})
}

View File

@ -5,6 +5,7 @@ import (
"server/GoUtil"
"server/game/mod/card"
"server/game/mod/msg"
"sync"
"time"
)
@ -14,28 +15,36 @@ type VarMgr struct {
type VarData struct {
Var map[string]interface{}
UserVar sync.Map
ZeroTime int64
}
const (
VAR_GOLD_CARD = "gold_card"
VAR_GOLD_CARD = "gold_card"
VAR_PLAYROOM_UPVOTE = "playroom_upvote"
VAR_USER_DATA = "user_data"
)
const (
VAR_OP_UPVOTE = 1
)
func (f *VarMgr) Init() {
gob.Register(&VarGoldCard{})
f.key = VAR_MGR_KEY
f.data = &VarData{
Var: make(map[string]interface{}),
Var: map[string]interface{}{},
}
// 注册处理函数
f.init()
if f.getData().Var == nil {
f.getData().Var = make(map[string]interface{})
if f.data.(*VarData).Var == nil {
f.data.(*VarData).Var = make(map[string]interface{})
}
if f.getData().ZeroTime == GoUtil.ZeroTimestamp() {
f.ZeroUpdate(&msg.Msg{})
}
f.RegisterHandler(msg.SERVER_ZERO_UPDATE, f.ZeroUpdate)
f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
f.Send(&msg.Msg{
Type: msg.SERVER_ZERO_UPDATE,
@ -43,6 +52,10 @@ func (f *VarMgr) Init() {
})
}
func (f *VarMgr) SetGlobalData(m *msg.Msg) (interface{}, error) {
return nil, nil
}
func (f *VarMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
f.getData().ZeroTime = GoUtil.ZeroTimestamp()
// 随机生成两个金卡
@ -55,15 +68,29 @@ func (f *VarMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
}
func (f *VarMgr) SetVar(key string, value interface{}) {
f.getData().Var[key] = value
f.getData().UserVar.Store(key, value)
}
func (f *VarMgr) GetVar(key string) interface{} {
return f.getData().Var[key]
value, _ := f.getData().UserVar.Load(key)
return value
}
func (f *VarMgr) SetUserVar(key string, value *VarUserData) {
f.getData().UserVar.Store(key, value)
}
func (f *VarMgr) GetUserVar(key string) *VarUserData {
value, _ := f.getData().UserVar.Load(key)
if value == nil {
value = &VarUserData{}
f.getData().UserVar.Store(key, value)
}
return value.(*VarUserData)
}
func (f *VarMgr) DelVar(key string) {
delete(f.getData().Var, key)
f.getData().UserVar.Delete(key)
}
func (f *VarMgr) getData() *VarData {

View File

@ -3,15 +3,16 @@ package msg
import "server/game/mod/item"
type Msg struct {
Type int // 消息类型
To int // 接收者
From int // 发送者
Item []*item.Item // 物品
SendT int64 // 发送时间
End int64 // 过期时间
Extra interface{} //额外信息
Id int64
H int //处理类型
Type int // 消息类型
To int // 接收者
From int // 发送者
Item []*item.Item // 物品
SendT int64 // 发送时间
End int64 // 过期时间
Extra interface{} //额外信息
Id int64
UniKey string // 回调监听唯一键值
H int //处理类型
}
var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE}
@ -86,6 +87,9 @@ const (
HANDLE_TYPE_TREASURE_RESULT //宝藏结果
HANDLE_TYPE_FACEBOOK_UNBIND //facebook解绑
HANDLE_TYPE_VAR_USER_SET // 设置玩家数据
HANDLE_TYPE_VAR_USER_GET // 获取玩家数据
)
const (