Merge branch 'sdk' into online

This commit is contained in:
hahwu 2025-02-21 16:51:42 +08:00
commit 08241b09a9
22 changed files with 3864 additions and 3534 deletions

104
src/server/GoUtil/feishu.go Normal file
View File

@ -0,0 +1,104 @@
package GoUtil
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"server/conf"
)
const (
FEISHU_WEBHOOK = "https://open.feishu.cn/open-apis/bot/v2/hook/70e24a79-b019-434a-b4d1-4592bbf7c311"
)
// AAqFpbuPhFSEx
func SendFeishuFatal(PlayerId int, FuncName string, msg string) error {
// 创建请求体
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqFpbuPhFSEx",
"template_version_name": "1.0.0",
"template_variable": map[string]interface{}{
"appName": conf.Server.GameName,
"playerId": PlayerId,
"funcName": FuncName,
"fatal_msg": msg,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", FEISHU_WEBHOOK, bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}
func SendFeishuMsg2(msg string) error {
// 创建请求体
payload := map[string]interface{}{
"msg_type": "interactive",
"card": map[string]interface{}{
"type": "template",
"data": map[string]interface{}{
"template_id": "AAqFpLD2XfySR",
"template_version_name": "1.0.1",
"template_variable": map[string]interface{}{
"appName": conf.Server.GameName,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", FEISHU_WEBHOOK, bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}

View File

@ -214,7 +214,7 @@ func GetEmitProduceType(Id int) []string {
func GetEmitProduceChessType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id)
//log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id)
return []string{}
}
value := gamedata.ParseString(data["Product_Type"])

View File

@ -12,6 +12,7 @@ const (
CFG_PLAYROOM_MOOD = "PlayroomMood"
CFG_PLAYROOM_PHYSIOLOGY = "PlayroomPhysiology"
CFG_PLAYROOM_PHYSIOLOGY_TYPE = "PlayroomPhysiologyType"
CFG_PLAYROOM_SHOP = "PlayroomShop"
)
func init() {
@ -20,6 +21,15 @@ func init() {
gamedata.InitCfg(CFG_PLAYROOM_MOOD)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
gamedata.InitCfg(CFG_PLAYROOM_SHOP)
}
func GetShopItem(Id int) (int, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil {
return 0, nil
}
return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost")
}
func GetUnLockLv() int {
@ -197,6 +207,18 @@ func GetPhysiologyDuration(Id int, Num int) int {
return 0
}
func GetPhysiologyTypeList() []int {
r := make([]int, 0)
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
if err != nil {
return []int{}
}
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetMoodEffect(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {

View File

@ -17,6 +17,7 @@ type FriendMgr struct {
}
type FirendData struct {
Id int64
List map[int][]*msg.Msg // 本服信箱
ClusterMsg map[int][]*msg.Msg // 集群信箱
}
@ -69,19 +70,31 @@ func (f *FriendMgr) getData() *FirendData {
return f.data.(*FirendData)
}
func (f *FriendMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
Now := GoUtil.Now()
for k, v := range f.getData().List {
for j, msg := range v {
if msg.End < Now-7*24*3600 {
f.getData().List[k] = append(f.getData().List[k][:j], f.getData().List[k][j+1:]...)
}
}
}
return nil, nil
}
// 通知玩家
func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
f.getData().Id++
m.Id = f.getData().Id
err := sendToPlayer(m)
if err != nil {
log.Debug("send to player error : %s\n", err)
ToServerId := GoUtil.GetServerIdByUid(m.To)
if ToServerId != conf.Server.ServerID {
f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
} else {
f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
}
f.update = true
return nil, err
if err == nil {
m.H = 1
}
ToServerId := GoUtil.GetServerIdByUid(m.To)
if ToServerId != conf.Server.ServerID {
f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
} else {
f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
}
log.Debug("send to player success")
return nil, nil
@ -90,7 +103,9 @@ func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
// 同步信息
func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
data := f.getData().List[m.From]
f.getData().List[m.From] = make([]*msg.Msg, 0)
for _, v := range data {
v.H = 1
}
log.Debug("sync friendMgr msg to player %d success mailbox %v", m.From, data)
return data, nil
}

View File

@ -49,7 +49,8 @@ func RegisterMsgProcessFunc(key string, value1 interface{}) {
func RunNetProcessByKey(key string, param []interface{}) error {
fun, ok := RegisterNetWorkFunc[key]
if ok {
err := fun.(func([]interface{}) error)(param)
_, player, buf := ParseArgs(param)
err := fun.(func(*Player, []byte) error)(player, buf)
return err
}
return fmt.Errorf("cant find network func %s", key)
@ -810,17 +811,19 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqPlayroomChip", ReqPlayroomChip) // 消除碎片
RegisterMsgProcessFunc("ReqPlayroomOutline", ReqPlayroomOutline) // 打工离线
RegisterMsgProcessFunc("ReqPlayroomWrokOutline", ReqPlayroomWrokOutline) // 打工离线完成
RegisterMsgProcessFunc("ReqPlayroomShop", ReqPlayroomShop) // playroom 商店
RegisterMsgProcessFunc("ReqPlayroomBuyItem", ReqPlayroomBuyItem) // 购买playroom物品
// 宠物宝藏
RegisterMsgProcessFunc("ReqFriendTreasure", ReqFriendTreasure) // 请求好友宝藏数据
RegisterMsgProcessFunc("ReqFriendTreasureStart", ReqFriendTreasureStart) // 开始游戏
RegisterMsgProcessFunc("ReqFriendTreasureFilp", ReqFriendTreasureFilp) // 翻牌
RegisterMsgProcessFunc("ReqFriendTreasureEnd", ReqFriendTreasureEnd) // 结束游戏
RegisterMsgProcessFunc("ReqPlayroomBuyItem", ReqPlayroomBuyItem) // 购买playroom物品
RegisterMsgProcessFunc("ReqKafkaLog", ReqKafkaLog) // 客户端日志
RegisterMsgProcessFunc("ReqCreateOrderSn", ReqCreateOrderSn) // 创建订单号
RegisterMsgProcessFunc("ReqShippingOrder", ReqShippingOrder) // 获取订单号
}
func (ad *GameLogic) CreateHttpManager() {

View File

@ -11,6 +11,7 @@ import (
playroomCfg "server/conf/playroom"
"server/db"
"server/game/mod/card"
"server/game/mod/friend"
"server/game/mod/item"
MsgMod "server/game/mod/msg"
"server/game/mod/playroom"
@ -22,12 +23,13 @@ import (
"google.golang.org/protobuf/proto"
)
func ReqGmCommand(args []interface{}) error {
_, player, buf := ParseArgs(args)
func ReqGmCommand(player *Player, buf []byte) error {
detail := &msg.ReqGmCommand{}
proto.Unmarshal(buf, detail)
arg := strings.Split(detail.Command, " ")
log.Debug("Player %d ReqGmCommand:%v", player.M_DwUin, arg)
return ReqGmCommand_(player, detail.Command)
}
func ReqGmCommand_(player *Player, Command string) error {
arg := strings.Split(Command, " ")
switch arg[0] {
case "additem":
id, _ := strconv.Atoi(arg[1])
@ -158,14 +160,6 @@ func ReqGmCommand(args []interface{}) error {
G_GameLogicPtr.ChampshipMgrSend(&MsgMod.Msg{
Type: MsgMod.SERVER_ZERO_UPDATE,
})
case "addMail":
MailMod := player.PlayMod.getMailMod()
Id := MailMod.Send("test", "test", []*item.Item{item.NewItem(100001, 1)})
player.PushClientRes(MailMod.NotifyMail(Id))
case "addMail2":
MailMod := player.PlayMod.getMailMod()
Id := MailMod.Send("test", "test", []*item.Item{})
player.PushClientRes(MailMod.NotifyMail(Id))
case "resetEmitOrder":
OrderMod := player.PlayMod.getOrderMod()
OrderMod.EimtOrder = make(map[string]struct{})
@ -202,6 +196,7 @@ func ReqGmCommand(args []interface{}) error {
case "playroomCollect":
CollectList := playroomCfg.GetDecorateList()
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.Collect = make(map[int]int)
for _, v := range CollectList {
PlayroomMod.AddCollect(v)
}
@ -262,6 +257,9 @@ func ReqGmCommand(args []interface{}) error {
case "resetTriggerTime":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.TriggerTime = 0
case "resetTimeline":
FriendMod := player.PlayMod.getFriendMod()
FriendMod.Log = make([]*friend.LogInfo, 0)
case "recoverUser":
file, err := os.OpenFile(conf.Server.GameConfPath+"user.info", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
@ -282,7 +280,20 @@ func ReqGmCommand(args []interface{}) error {
}
BaseMod := player.PlayMod.getBaseMod()
BaseMod.Uid = Uid
case "copyUser":
p1 := new(Player)
p1.InitPlayer(arg[1])
BaseMod := p1.PlayMod.getBaseMod()
BaseMod.Uid = player.M_DwUin
BaseMod.NickName = player.PlayMod.getBaseMod().NickName
BaseMod.LoginTime = GoUtil.Now()
player.PlayMod.mod_list = p1.PlayMod.mod_list
default:
return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg)
}
log.Debug("Player %d ReqGmCommand:%v", player.M_DwUin, arg)
player.PlayMod.save()
return nil
}

View File

@ -351,23 +351,8 @@ func (p *Player) Login() {
LoignBack(p) // 登录返回数据
SyncMailMsg(p) // 同步邮件
BaseMod.Login()
p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
if p.PlayerBaseMod.Data.UserName == "388faebe29ffe56666a04ea22b902b0f" {
VarMod := p.PlayMod.getVarMod()
Mail1, _ := VarMod.GetVar(2)
if Mail1 != nil {
return
}
VarMod.SetVar(2, 1)
Items := make([]*item.Item, 0)
Items = append(Items, &item.Item{Id: item.ITEM_ENERGY_ID, Num: 500})
MailMod := p.PlayMod.getMailMod()
MailMod.Send("Game Bug Report Handling & Compensation",
`We sincerely apologize for this issue that has affected your experience.
One of our collleague will contact you soon, and we kindly ask for your cooperation with the QA process.
As a token of our appreciation, here is 500 Energy for your trouble.
Once again, we deeply regret any trouble this may have caused and thank you for your understanding and support.`, Items)
}
HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
}
func (p *Player) Outline() {
@ -380,6 +365,7 @@ func (p *Player) Outline() {
BaseMod := p.PlayMod.getBaseMod()
BaseMod.Outline(int(Cacumulative))
p.PlayMod.save()
p.UpdateUserInfo()
}
// 离线 保存数据
@ -739,6 +725,7 @@ func (p *Player) GetSimpleData(Uid int, simple *PlayerSimpleData) error {
func (p *Player) UpdateUserInfo() {
simple := &PlayerSimpleData{}
Base := p.GetPlayerBaseMod()
BaseMod := p.PlayMod.getBaseMod()
simple.Name = p.PlayMod.getBaseMod().NickName
simple.Avatar = p.PlayMod.getAvatarMod().SetId
simple.Uid = int(p.M_DwUin)
@ -746,8 +733,8 @@ func (p *Player) UpdateUserInfo() {
simple.Face = p.PlayMod.getFaceMod().SetId
simple.Level = p.GetPlayerBaseMod().GetLevel()
simple.Decorate = p.PlayMod.getDecorateMod().DecorateNum
simple.Login = int64(Base.Data.LoginTime)
simple.Loginout = int64(Base.Data.LogoutTime)
simple.Login = int64(BaseMod.LoginTime)
simple.Loginout = int64(BaseMod.LogoutTime)
simple.FaceBook = Base.Data.FaceBookId
simple.FaceBookPic = p.PlayMod.getBaseMod().FacebookUrl
simple.Playroom = p.PlayMod.getPlayroomMod().Room

View File

@ -4,6 +4,7 @@ import (
"fmt"
"math"
"server/GoUtil"
"server/conf"
mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order"
"server/game/mod/item"
@ -113,9 +114,9 @@ func (p *PlayerChessData) UpdateChessData(player *Player, MChessData map[string]
// 检查棋子数据是否一致
func (p *PlayerChessData) checkChessEqual(player *Player) bool {
// if len(p.Data.MChessData) == 0 {
// return true
// }
if len(p.Data.MChessData) == 0 && conf.Server.GameName == "Merge_Pet_Local" {
return true
}
ChessList := player.PlayMod.getChessMod().GetChessList()
if len(ChessList) != len(p.Data.MChessData) {
return false

View File

@ -59,6 +59,9 @@ func handle(p *Player, m *msg.Msg) error {
p.NoonUpdate(nil)
case msg.HANDLE_TYPE_INVITE_ADD_FRIEND: // 邀请添加好友
FriendMod := p.PlayMod.getFriendMod()
if m.From == 0 && m.From == int(p.M_DwUin) {
return nil
}
FriendMod.AddFriend(m.From)
p.TeLog("friend_add", map[string]interface{}{
"player_id": m.From,
@ -204,8 +207,8 @@ func handle(p *Player, m *msg.Msg) error {
PlayroomMod.AddVisitor(m.From, m.SendT)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d,%d", Items[0].Id, Items[0].Num))
if len(Items) > 0 && Items[0].Id == item.ITEM_STAR_ID {
ItemMod := p.PlayMod.getItemMod()
StarNum := ItemMod.GetItem(item.ITEM_STAR_ID)
BaseMod := p.PlayMod.getBaseMod()
StarNum := BaseMod.GetStar()
Items[0].Num = min(Items[0].Num, StarNum)
p.HandleLoseItem(Items, "")
} else {
@ -285,6 +288,8 @@ func HandleFriendMsg(p *Player, m *msg.Msg) error {
// 同步好友请求
func SyncFriendMsg(p *Player) {
MsgList := G_GameLogicPtr.FriendMgrCall(&msg.Msg{Type: msg.HANDLE_TYPE_SYNC, From: int(p.M_DwUin)})
FriendMod := p.PlayMod.getFriendMod()
MsgId := FriendMod.GetSyncId()
if MsgList == nil {
return
}
@ -295,9 +300,18 @@ func SyncFriendMsg(p *Player) {
sort.Slice(ml, func(i, j int) bool {
return ml[i].SendT < ml[j].SendT
})
maxId := int64(0)
for _, v := range ml {
maxId = max(maxId, v.Id)
if v.H == 1 {
continue
}
if v.Id > 0 && v.Id <= MsgId {
continue
}
handle(p, v)
}
FriendMod.SetSyncId(maxId)
p.PlayMod.save()
}
@ -318,6 +332,9 @@ func FriendListBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
var fl []*proto.ResPlayerSimple
for k := range FriendMod.FriendList {
if k == int(p.M_DwUin) {
continue
}
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
fl = append(fl, ps)

File diff suppressed because it is too large Load Diff

View File

@ -42,7 +42,7 @@ func (s *ServerMod) init() {
s.update = false
s.LoadData()
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME)*time.Second, func() {
s.SaveData()
go s.SaveData()
})
go func() {
defer func() {
@ -128,7 +128,7 @@ func (s *ServerMod) Call(m *msg.Msg) (interface{}, error) {
// mysql 保存消息
func (s *ServerMod) SaveData() {
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME+GoUtil.RandNum(5, 10))*time.Second, func() {
s.SaveData()
go s.SaveData()
})
DbData := db.SqlServerModStruct{}
DbData.Key = s.key
@ -139,16 +139,19 @@ func (s *ServerMod) SaveData() {
log.Debug("SaveData Marshal failed,Mod Key: %s err:%v", s.key, err)
}
// log.Debug("SaveData Marshal success,Mod Key: %s", s.key)
ctx := context.Background()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
txOptions := &sql.TxOptions{}
tx, err := db.SqlDb.BeginTx(ctx, txOptions)
if err != nil {
log.Debug("SaveData sql begin tx failed,Mod Key: %s err:%v", s.key, err)
return
}
err = db.SaveServerData(&DbData)
if err != nil {
tx.Rollback()
log.Debug("SaveData sql exec ,Mod Key: %s err:%v", s.key, err)
return
}
tx.Commit()
}

View File

@ -32,6 +32,7 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
}
OrderData, err = GoogleVerify(player, OrderSn, req.ProduceId, req.Token)
if err != nil {
log.Debug("GoogleVerify parmas OrderSn%s; ProduceId:%s; Token:%s", OrderSn, req.ProduceId, req.Token)
log.Debug("GoogleVerify err:%v", err)
time.Sleep(1 * time.Second)
continue

View File

@ -17,6 +17,7 @@ var AdminFuncMap = map[string]func([]interface{}) error{
"ReqServerInfo": ReqServerInfo,
"ReqReloadServerMail": ReqReloadServerMail,
"ReqReload": ReqReload,
"ReqAdminGm": ReqAdminGm,
}
func AdminProcess(Func string, args []interface{}) {
@ -69,18 +70,15 @@ func AdminPlayerInfo(args []interface{}) error {
Index++
}
res["Order"] = OrderMap
JsonBuff, err := json.Marshal(res)
if err != nil {
return err
}
AdminPlayerBack(a, JsonBuff)
AdminPlayerBack(a, res)
return nil
}
func AdminPlayerBack(a gate.Agent, buf []byte) {
func AdminPlayerBack(a gate.Agent, res map[string]interface{}) {
JsonBuff, _ := json.Marshal(res)
response := &msg.AdminRes{}
response.Func = "admin"
response.Info = buf
response.Info = JsonBuff
a.WriteMsg(response)
}
@ -89,11 +87,7 @@ func ReqServerInfo(args []interface{}) error {
res := make(map[string]interface{})
res["PlayerNum"] = G_GameLogicPtr.GetPlayerNum()
res["StartTime"] = G_GameLogicPtr.GetStartTime()
JsonBuff, err := json.Marshal(res)
if err != nil {
return err
}
AdminPlayerBack(a, JsonBuff)
AdminPlayerBack(a, res)
return nil
}
@ -108,10 +102,38 @@ func ReqReload(args []interface{}) error {
gamedata.Reload()
res := make(map[string]interface{})
res["Code"] = 0
JsonBuff, err := json.Marshal(res)
if err != nil {
return err
}
AdminPlayerBack(a, JsonBuff)
AdminPlayerBack(a, res)
return nil
}
func ReqAdminGm(args []interface{}) error {
a, buf := ParseAdminArgs(args)
req := &msg.ReqAdminGm{}
proto.Unmarshal(buf, req)
res := make(map[string]interface{})
res["Code"] = 0
res["Msg"] = "ok"
player := G_GameLogicPtr.GetPlayer(req.Uid)
if player == nil {
res["Code"] = 1
res["Msg"] = "player not found"
AdminPlayerBack(a, res)
return nil
}
player.lock.Lock()
defer player.lock.Unlock()
err := ReqGmCommand_(player, req.Command)
if err != nil {
res["Code"] = 1
res["Msg"] = err.Error()
}
if err != nil {
res["Code"] = 1
res["Msg"] = err.Error()
AdminPlayerBack(a, res)
return err
}
AdminPlayerBack(a, res)
return nil
}

View File

@ -1,6 +1,7 @@
package game
import (
"fmt"
"reflect"
"server/GoUtil"
"server/MergeConst"
@ -68,6 +69,12 @@ func HandleClientReq(args []interface{}) {
detail := &msg.ReqRegisterAccount{}
proto.Unmarshal(buf, detail)
gl := G_getGameLogic()
defer func() {
if r := recover(); r != nil {
GoUtil.SendFeishuFatal(0, m.GetFunc(), fmt.Sprintf("username: %s, fatal: %s", detail.UserName, r))
log.Debug("uid : %d, func : %s, fatal : %s", 0, m.GetFunc(), r)
}
}()
if gl.IsExsitAccount(detail.UserName) {
ResRegisterAccount := &msg.ResRegisterAccount{}
ResRegisterAccount.ResultCode = MergeConst.Protocol_Error_Account_Exist
@ -96,14 +103,16 @@ func HandleClientReq(args []interface{}) {
data, _ := proto.Marshal(ResRegisterAccount)
gl.PackResInfo(a, "ResRegisterAccount", data)
case "ReqLogin":
defer func() {
if r := recover(); r != nil {
log.Debug("uid : %d, func : %s, fatal : %s", 0, m.GetFunc(), r)
}
}()
detail := &msg.ReqLogin{}
proto.Unmarshal(buf, detail)
accountInfo := db.GetAccountInfoFromDb(detail.UserName)
defer func() {
if r := recover(); r != nil {
GoUtil.SendFeishuFatal(0, m.GetFunc(), fmt.Sprintf("username: %s, fatal: %s", detail.UserName, r))
log.Debug("uid : %d, func : %s, fatal : %s", 0, m.GetFunc(), r)
}
}()
ResLogin := &msg.ResLogin{}
if accountInfo != nil {
if accountInfo.UserPassword == detail.UserPwd {
@ -159,13 +168,15 @@ func HandleClientReq(args []interface{}) {
backup := p.(*Player).BackUp() // 备份当前的 Player 值
defer func() {
if r := recover(); r != nil {
log.Debug("uid : %d, func : %s, fatal : %s", p.(*Player).M_DwUin, m.GetFunc(), r)
log.Error("uid : %d, func : %s, fatal : %s", p.(*Player).M_DwUin, m.GetFunc(), r)
GoUtil.SendFeishuFatal(int(p.(*Player).M_DwUin), m.GetFunc(), r.(string))
p.(*Player).Recover(backup) //还原Player的数据
}
p.(*Player).lock.Unlock() //解锁
}()
p.(*Player).args = make(map[string]interface{})
p.(*Player).args["func"] = m
p.(*Player).args["agent"] = a
err := RunNetProcessByKey(m.GetFunc(), []interface{}{a, buf})
if err != nil {
log.Debug("uid : %d, func : %s, err : %s", p.(*Player).M_DwUin, m.GetFunc(), err)

View File

@ -47,7 +47,7 @@ func (b *Base) InitData(Uid int) {
func (b *Base) Login() {
b.LoginTime = GoUtil.Now()
// b.LogoutTime = 0
b.LogoutTime = 0
}
func (b *Base) GetNickName() string {

View File

@ -13,6 +13,7 @@ type FriendMod struct {
Card map[string]*card.CardInfo // 收到的申请交换
Log []*LogInfo // 日志
AutoId int
Id int64 // 已同步msg ID
}
const (
@ -61,6 +62,14 @@ func (f *FriendMod) InitData() {
}
}
func (f *FriendMod) GetSyncId() int64 {
return f.Id
}
func (f *FriendMod) SetSyncId(Id int64) {
f.Id = Id
}
func (f *FriendMod) AddFriend(id int) {
f.FriendList[id] = struct{}{}
delete(f.ApplyList, id)

View File

@ -158,3 +158,17 @@ func Merge(Item1, Item2 []*Item) []*Item {
}
return res
}
func MutilItem(i []*Item, num int) []*Item {
if i == nil {
return nil
}
res := make([]*Item, 0)
for _, v := range i {
res = append(res, &Item{
Id: v.Id,
Num: v.Num * num,
})
}
return res
}

View File

@ -10,6 +10,8 @@ type Msg struct {
SendT int64 // 发送时间
End int64 // 过期时间
Extra interface{} //额外信息
Id int64
H int //处理类型
}
var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE}

View File

@ -343,7 +343,7 @@ func getEmitSeries(o *OrderMod, Emit []int) string {
o.EmitShuffle = append(o.EmitShuffle, EmitSerie)
}
}
GoUtil.ShuffleStringArray(o.EmitShuffle)
o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle)
}
PopEmitId, NewSlice := GoUtil.PopStringArray(o.EmitShuffle)
o.EmitShuffle = NewSlice
@ -364,7 +364,7 @@ func getEmitSeries(o *OrderMod, Emit []int) string {
}
Num := 1
for {
GoUtil.ShuffleStringArray(o.EmitShuffle)
o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle)
if o.EmitShuffle[0] != PopEmitId {
break
}

View File

@ -85,10 +85,10 @@ type Info struct {
func (p *PlayroomMod) InitData() {
if p.Collect == nil {
p.Collect = make(map[int]int)
InitCollect := playroomCfg.GetInitDecorate()
for _, v := range InitCollect {
p.Collect[v] = 1
}
}
InitCollect := playroomCfg.GetInitDecorate()
for _, v := range InitCollect {
p.Collect[v] = 1
}
if p.Room == nil {
p.Room = make(map[int]int)
@ -189,9 +189,6 @@ func (p *PlayroomMod) SetTarget(Target int) {
}
func (p *PlayroomMod) SetGameId(GameId int) {
if p.GameId != 0 {
return
}
p.GameId = GameId
}
@ -468,9 +465,10 @@ func (p *PlayroomMod) FlipCard(Pos int) (int, error) {
return Prob, nil
}
func (p *PlayroomMod) GetFlipReward() ([]*item.Item, error) {
func (p *PlayroomMod) GetFlipReward() ([]*item.Item, int, error) {
check := make(map[int]int)
Items := make([]*item.Item, 0)
T := p.Target
for _, v := range p.Flip {
check[v]++
if check[v] == 3 {
@ -491,10 +489,10 @@ func (p *PlayroomMod) GetFlipReward() ([]*item.Item, error) {
p.GameId = 0
p.Flip = make(map[int]int)
p.Target = 0
return Items, nil
return Items, T, nil
}
}
return Items, fmt.Errorf("GetFlipReward check is not 3")
return Items, T, fmt.Errorf("GetFlipReward check is not 3")
}
func (p *PlayroomMod) BuyItem(Id int) ([]*item.Item, []*item.Item) {
@ -509,9 +507,10 @@ func (p *PlayroomMod) UnLock(Lv int) {
if len(p.Physiology) == 0 {
Now := GoUtil.Now()
p.Physiology = make(map[int]*Physiology)
for k := 1; k <= 5; k++ {
Max := playroomCfg.GetPhysiologyMax(k)
p.Physiology[k] = &Physiology{Id: k, Num: Max, Time: Now}
TypeList := playroomCfg.GetPhysiologyTypeList()
for _, v := range TypeList {
Max := playroomCfg.GetPhysiologyMax(v)
p.Physiology[v] = &Physiology{Id: v, Num: Max, Time: Now}
}
}
if len(p.MoodInfo) == 0 {
@ -521,3 +520,13 @@ func (p *PlayroomMod) UnLock(Lv int) {
}
}
}
// shop
func (p *PlayroomMod) ShopBuy(Id, Num int) ([]*item.Item, []*item.Item, error) {
AddItemId, CostItem := playroomCfg.GetShopItem(Id)
if AddItemId == 0 {
return nil, nil, fmt.Errorf("ShopBuy AddItemId is 0")
}
NewCostItem := item.MutilItem(CostItem, Num)
return []*item.Item{item.NewItem(AddItemId, Num)}, NewCostItem, nil
}

File diff suppressed because it is too large Load Diff

View File

@ -2,12 +2,13 @@ package network
import (
"crypto/tls"
"github.com/gorilla/websocket"
"net"
"net/http"
"server/pkg/github.com/name5566/leaf/log"
"sync"
"time"
"github.com/gorilla/websocket"
)
type WSServer struct {
@ -41,7 +42,7 @@ func (handler *WSHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
conn, err := handler.upgrader.Upgrade(w, r, nil)
if err != nil {
log.Debug("upgrade error: %v", err)
// log.Debug("upgrade error: %v", err)
return
}
conn.SetReadLimit(int64(handler.maxMsgLen))