Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-02-21 12:11:13 +08:00
commit b43aa1c699
14 changed files with 3607 additions and 3477 deletions

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"
@ -160,14 +161,6 @@ func ReqGmCommand_(player *Player, Command string) 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{})
@ -264,6 +257,9 @@ func ReqGmCommand_(player *Player, Command string) 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 {
@ -284,6 +280,15 @@ func ReqGmCommand_(player *Player, Command string) 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)
}

View File

@ -207,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 {
@ -288,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
}
@ -298,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()
}

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

@ -176,6 +176,7 @@ func HandleClientReq(args []interface{}) {
}()
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

@ -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

@ -465,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 {
@ -488,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) {
@ -506,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 {
@ -518,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