增加玩家全服数据
This commit is contained in:
parent
c50e176e6c
commit
38d6f14b95
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 // 集群中心
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -15,7 +15,8 @@
|
||||
"TELOGDIR" : "./teLog/",
|
||||
|
||||
"GameName": "pet_home_local",
|
||||
"GameID": 1,
|
||||
"ListenAddr": ":3001",
|
||||
"CenterAddr": ":3000",
|
||||
"ServerType":"node",
|
||||
|
||||
"ServerID": 1,
|
||||
|
||||
@ -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())
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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{})
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 (
|
||||
|
||||
Loading…
Reference in New Issue
Block a user