Add friend reply, sponsor, and retire reward features

Introduces friend reply and sponsor mechanics, including new message types, data structures, and reward handling. Adds chess retire reward claim logic and related protobuf messages. Updates login to support SDK login and account name changes. Refactors order shipping logic and admin shipping command. Multiple modules updated to support new friend and order features.
This commit is contained in:
hahwu 2025-11-12 15:54:43 +08:00
commit 7a95ef8cfb
16 changed files with 3034 additions and 2168 deletions

View File

@ -1,6 +1,7 @@
package baseCfg package baseCfg
import ( import (
"server/game/mod/item"
"server/gamedata" "server/gamedata"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"strconv" "strconv"
@ -39,6 +40,15 @@ func GetEnergyByMul(T int) float64 {
} }
} }
func GetFriendReplyReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_BASE, "friend_reply")
if err != nil {
log.Debug("GetFriendReplyReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetMaxEnergyMul(Lv int, Energy int) int { func GetMaxEnergyMul(Lv int, Energy int) int {
Mul := 0 Mul := 0
for i := 1; i < 999; i++ { for i := 1; i < 999; i++ {

View File

@ -139,7 +139,7 @@ func GetChessIdByLvAndColor(Lv int, Color string) int {
func GetLvById(Id int) int { func GetLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil { if err != nil {
log.Debug("GetLvById GetOne Id:%v not found", Id) //log.Debug("GetLvById GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.ParseInt(data["Lv"]) return gamedata.ParseInt(data["Lv"])
@ -149,7 +149,7 @@ func GetLvById(Id int) int {
func GetMaxLvById(Id int) int { func GetMaxLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil { if err != nil {
log.Debug("GetMaxLvById GetOne Id:%v not found", Id) // log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.ParseInt(data["MaxLv"]) return gamedata.ParseInt(data["MaxLv"])
@ -169,7 +169,7 @@ func GetMaxLvByColor(Color string) int {
func GetEmitMinLvById(Id string) int { func GetEmitMinLvById(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id) data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil { if err != nil {
log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id) // log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.GetIntValue(data, "Emit_Min_Lv") return gamedata.GetIntValue(data, "Emit_Min_Lv")
@ -179,7 +179,7 @@ func GetEmitMinLvById(Id string) int {
func GetEmitRatio(Id string) float64 { func GetEmitRatio(Id string) float64 {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id) data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil { if err != nil {
log.Debug("GetEmitRatio GetOne Id:%v not found", Id) // log.Debug("GetEmitRatio GetOne Id:%v not found", Id)
return 0 return 0
} }
return gamedata.GetFloatValue(data, "Ratio") return gamedata.GetFloatValue(data, "Ratio")
@ -267,7 +267,7 @@ func GetEmitProduceChessType(Id int) []string {
func GetEmitId(Id int) string { func GetEmitId(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil { if err != nil {
log.Debug("GetEmitId GetOne Id:%v not found", Id) // log.Debug("GetEmitId GetOne Id:%v not found", Id)
return "" return ""
} }
return gamedata.ParseString(data["Emit_ID"]) return gamedata.ParseString(data["Emit_ID"])
@ -392,10 +392,20 @@ func GetHighSourceChestItem() []*item.Item {
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4)) r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
return r return r
} }
func GetRetireReward() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "retire_reward")
if err != nil {
log.Debug("GetRetireReward GetOne not found")
return nil
}
return gamedata.GetItemList(data, "Value")
}
func DynamicLevRev(Lv int, EmitId int, Color string) int { func DynamicLevRev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId) data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil { if err != nil {
log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId) // log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv return Lv
} }
DynamicLv := gamedata.GetStringValue(data, "Dynamic") DynamicLv := gamedata.GetStringValue(data, "Dynamic")

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"reflect" "reflect"
"server/GoUtil" "server/GoUtil"
"server/MergeConst"
"server/conf" "server/conf"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"strings" "strings"
@ -223,6 +224,12 @@ func GetPlayerBaseInfoFromDbByName(name string) *ResPlayerBaseInfo {
return &res return &res
} }
func UpdatePlayerBaseInfoName(oldName, newName string) error {
sqlStr := "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, newName, oldName)
return err
}
func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo { func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo {
sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?" sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?"
var res ResPlayerBaseInfo var res ResPlayerBaseInfo
@ -237,7 +244,7 @@ func GetAccountInfoFromDb(name string) *Db_Account {
sqlStr := "SELECT * FROM t_account WHERE user_name = ?" sqlStr := "SELECT * FROM t_account WHERE user_name = ?"
var res Db_Account var res Db_Account
if err := SqlDb.Get(&res, sqlStr, name); err != nil { if err := SqlDb.Get(&res, sqlStr, name); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "account", sqlStr, err) log.Debug("登录的账号不存在:%s", name)
return nil return nil
} }
return &res return &res
@ -248,6 +255,11 @@ func UpdateAccountInfoToDb(account *Db_Account) (err error) {
return return
} }
func UpdateAccountInfoName(account *Db_Account, newName string) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_name = ? WHERE user_name = ?", newName, account.UserName)
return
}
func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) { func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName) _, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName)
return return
@ -458,6 +470,13 @@ func GetPlayerChargeData(OrderSn string) (*SqlChargeOrderStruct, error) {
return data, err return data, err
} }
func GetPlayerChargeDataList(Uid int) ([]*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where Uid = ? and PayStatus = ?"
data := &[]*SqlChargeOrderStruct{}
err := SqlDb.Select(data, sql, Uid, MergeConst.ORDER_STATUS_PAY)
return *data, err
}
func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) { func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where PayChannelOrderId = ?" sql := "select * from t_player_charge where PayChannelOrderId = ?"
data := &SqlChargeOrderStruct{} data := &SqlChargeOrderStruct{}

View File

@ -49,6 +49,8 @@ func (f *FriendMgr) Init() {
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REFUSE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_INVITE_ADD_FRIEND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_INVITE_ADD_FRIEND, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_INVITE_FRIEND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_INVITE_FRIEND, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_GREETING_REPLY, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_SPONSOER, f.sendToPlayer)
// 卡牌消息 // 卡牌消息
f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer)

View File

@ -735,13 +735,15 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqSeparateChess", ReqSeparateChess) // 分解棋子 RegisterMsgProcessFunc("ReqSeparateChess", ReqSeparateChess) // 分解棋子
RegisterMsgProcessFunc("ReqUpgradeChess", ReqUpgradeChess) // 升级棋子 RegisterMsgProcessFunc("ReqUpgradeChess", ReqUpgradeChess) // 升级棋子
RegisterMsgProcessFunc("ReqSellChessNum", ReqSellChessNum) //购买能量 RegisterMsgProcessFunc("ReqSellChessNum", ReqSellChessNum) //购买能量
RegisterMsgProcessFunc("ReqGetChessRetireReward", ReqGetChessRetireReward) //领取棋子退役奖励
//领取图鉴奖励 //领取图鉴奖励
RegisterMsgProcessFunc("ReqGetHandbookReward", ReqGetHandbookReward) //领取图鉴奖励 RegisterMsgProcessFunc("ReqGetHandbookReward", ReqGetHandbookReward) //领取图鉴奖励
RegisterMsgProcessFunc("RegHandbookAllReward", RegHandbookAllReward) //领取图鉴收集奖励 RegisterMsgProcessFunc("RegHandbookAllReward", RegHandbookAllReward) //领取图鉴收集奖励
//领取订单奖励 //领取订单奖励
RegisterMsgProcessFunc("ReqRewardOrder", ReqRewardOrder) // 领取订单奖励 RegisterMsgProcessFunc("ReqRewardOrder", ReqRewardOrder) // 领取订单奖励
RegisterMsgProcessFunc("ReqDelOrder", ReqDelOrder) // 删除订单 RegisterMsgProcessFunc("ReqDelOrder", ReqDelOrder) // 删除订单
RegisterMsgProcessFunc("ReqCreatePetOrder", ReqCreatePetOrder) // 生成消耗品订单
//装饰 //装饰
RegisterMsgProcessFunc("ReqDecorate", ReqDecorate) // 装饰 RegisterMsgProcessFunc("ReqDecorate", ReqDecorate) // 装饰
@ -806,17 +808,18 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqCatTrickReward", ReqCatTrickReward) //小猫戏法获取奖励 RegisterMsgProcessFunc("ReqCatTrickReward", ReqCatTrickReward) //小猫戏法获取奖励
// #region 好友 // #region 好友
RegisterMsgProcessFunc("ReqFriendList", ReqFriendList) // 请求好友列表 RegisterMsgProcessFunc("ReqFriendList", ReqFriendList) // 请求好友列表
RegisterMsgProcessFunc("ReqFriendApply", ReqFriendApply) // 请求申请好友列表 RegisterMsgProcessFunc("ReqFriendApply", ReqFriendApply) // 请求申请好友列表
RegisterMsgProcessFunc("ReqFriendCardMsg", ReqFriendCardMsg) // 请求好友卡牌申请列表 RegisterMsgProcessFunc("ReqFriendCardMsg", ReqFriendCardMsg) // 请求好友卡牌申请列表
RegisterMsgProcessFunc("ReqWishApplyList", ReqWishApplyList) // 请求好友心愿单申请列表 RegisterMsgProcessFunc("ReqWishApplyList", ReqWishApplyList) // 请求好友心愿单申请列表
RegisterMsgProcessFunc("ReqFriendTimeLine", ReqFriendTimeLine) // 请求好友时间线 RegisterMsgProcessFunc("ReqFriendTimeLine", ReqFriendTimeLine) // 请求好友时间线
RegisterMsgProcessFunc("ReqFriendRecommend", ReqFriendRecommend) // 获取推荐好友 RegisterMsgProcessFunc("ReqFriendRecommend", ReqFriendRecommend) // 获取推荐好友
RegisterMsgProcessFunc("ReqFriendTLUpvote", ReqFriendTLUpvote) // 请求时间线点赞 RegisterMsgProcessFunc("ReqFriendTLUpvote", ReqFriendTLUpvote) // 请求时间线点赞
RegisterMsgProcessFunc("ReqFriendTReward", ReqFriendTReward) // 请求时间线点赞 RegisterMsgProcessFunc("ReqFriendTReward", ReqFriendTReward) // 请求时间线点赞
RegisterMsgProcessFunc("ReqAddNpc", ReqAddNpc) // 增加npc RegisterMsgProcessFunc("ReqAddNpc", ReqAddNpc) // 增加npc
RegisterMsgProcessFunc("ReqWishApply", ReqWishApply) // 同意好友心愿单请求 RegisterMsgProcessFunc("ReqWishApply", ReqWishApply) // 同意好友心愿单请求
RegisterMsgProcessFunc("ReqFriendByCode", ReqFriendByCode) // 根据邀请码查询好友 RegisterMsgProcessFunc("ReqFriendByCode", ReqFriendByCode) // 根据邀请码查询好友
RegisterMsgProcessFunc("ReqFriendReplyHandle", ReqFriendReplyHandle) // 回复好友信息
RegisterMsgProcessFunc("ReqSearchPlayer", ReqSearchPlayer) // 搜索好友 RegisterMsgProcessFunc("ReqSearchPlayer", ReqSearchPlayer) // 搜索好友
RegisterMsgProcessFunc("ReqApplyFriend", ReqApplyFriend) // 申请好友 RegisterMsgProcessFunc("ReqApplyFriend", ReqApplyFriend) // 申请好友

View File

@ -275,6 +275,7 @@ func (p *Player) InitPlayer(UserName string) error {
p.Login() p.Login()
// GoUtil.RegisterEvent(MergeConst.Notify_Daily_Renew, p.ZeroUpdate, p) // GoUtil.RegisterEvent(MergeConst.Notify_Daily_Renew, p.ZeroUpdate, p)
// GoUtil.RegisterEvent(MergeConst.Notify_Midday_Renew, p.ZeroUpdate, p) // GoUtil.RegisterEvent(MergeConst.Notify_Midday_Renew, p.ZeroUpdate, p)
p.OrderShip()
SyncFriendMsg(p) SyncFriendMsg(p)
p.UpdateUserInfo() p.UpdateUserInfo()
// fix bug // fix bug
@ -286,8 +287,16 @@ func (p *Player) InitPlayer(UserName string) error {
return nil return nil
} }
func (p *Player) Test() { func (p *Player) OrderShip() {
p.PlayMod.getBaseMod().EnergyMul = 100 OrderList, err := db.GetPlayerChargeDataList(int(p.M_DwUin))
if err != nil {
return
}
for _, OrderInfo := range OrderList {
go TriggerShippingOrderOrigin(p, &msg.ReqShippingOrder{
OrderSn: OrderInfo.OrderId,
})
}
} }
// 零点更新 // 零点更新
@ -330,7 +339,8 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.PlayMod.getFriendTreasureMod().ZeroUpdate() p.PlayMod.getFriendTreasureMod().ZeroUpdate()
// p.PushClientRes(p.PlayMod.getFriendTreasureMod().BackData()) // p.PushClientRes(p.PlayMod.getFriendTreasureMod().BackData())
// 限时事件 // 好友功能
p.PlayMod.getFriendMod().ZeroUpdate()
p.PlayMod.getLimitedTimeEventMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel()) p.PlayMod.getLimitedTimeEventMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel())
// playroom // playroom

View File

@ -375,6 +375,14 @@ func handle(p *Player, m *msg.Msg) error {
return nil return nil
} }
CatnipMod.Growth(CatnipGrowthInfo.GameId, CatnipGrowthInfo.Growth) CatnipMod.Growth(CatnipGrowthInfo.GameId, CatnipGrowthInfo.Growth)
case msg.HANDLE_TYPE_FRIEND_GREETING_REPLY:
FriendMod := p.PlayMod.getFriendMod()
if v, ok := m.Extra.(friend.ReplyInfo); ok {
FriendMod.AddReplyInfo(v.Uid, v.Type, v.Param)
FriendLogBackData(p)
}
case msg.HANDLE_TYPE_FRIEND_SPONSOER:
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_SPONSOR_GET, "", m.SendT)
default: default:
log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type) log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type)
} }
@ -517,6 +525,7 @@ func FriendListBackData(p *Player) {
FriendList: fl, FriendList: fl,
ReqApplyList: ReqFriendList, ReqApplyList: ReqFriendList,
Npc: GoUtil.IntToInt32(FriendMod.GetNpc()), Npc: GoUtil.IntToInt32(FriendMod.GetNpc()),
Sponsor: int32(FriendMod.GetSponsor()),
}) })
} }
@ -542,6 +551,11 @@ func FriendLogBackData(p *Player) {
var log []*proto.ResFriendLog var log []*proto.ResFriendLog
for _, v := range FriendMod.Log { for _, v := range FriendMod.Log {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid) ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if ps == nil {
ps = &proto.ResPlayerSimple{
Uid: int64(v.Uid),
}
}
log = append(log, &proto.ResFriendLog{ log = append(log, &proto.ResFriendLog{
Player: ps, Player: ps,
Type: int32(v.Type), Type: int32(v.Type),
@ -551,8 +565,27 @@ func FriendLogBackData(p *Player) {
Upvote: v.Upvote, Upvote: v.Upvote,
}) })
} }
var reply []*proto.ResFriendReply
for _, v := range FriendMod.ReplyList {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if ps == nil {
ps = &proto.ResPlayerSimple{
Uid: int64(v.Uid),
}
}
reply = append(reply, &proto.ResFriendReply{
Player: ps,
Type: int32(v.Type),
Param: v.Param,
Id: int32(v.Id),
Status: int32(v.Status),
AddTime: v.AddTime,
EndTime: v.EndTime,
})
}
p.PushClientRes(&proto.ResFriendTimeLine{ p.PushClientRes(&proto.ResFriendTimeLine{
Log: log, Log: log,
Reply: reply,
}) })
} }
@ -1120,6 +1153,42 @@ func (player *Player) FixOrderBug() {
} }
} }
func (player *Player) CreatePetOrder() {
BaseMod := player.PlayMod.getBaseMod()
ChessMod := player.PlayMod.getChessMod()
OrderMod := player.PlayMod.getOrderMod()
PetTrigger := true
for _, v := range OrderMod.GetOrderList() {
if v.Type == order.Pet_type {
PetTrigger = false
break
}
}
if PetTrigger && BaseMod.GetLevel() >= 17 {
OrderMod.CreateOrder(BaseMod.GetLevel(), ChessMod.GetOrderEmit(), BaseMod.GetEnergyMul(), order.Pet_type)
for k, v := range OrderMod.GetOrderList() {
if len(v.Items) != 0 {
continue
}
if v.Type != order.Pet_type {
continue
}
Items := make([]*item.Item, 0)
Star := order.GetOrderStar(v.MergeId, ChessMod.GetStarEmitList())
// Star = int(float64(Star)*float64(OrderFactor)/1000) * 10
Items = player.GetPetOrderReward(Star, Items)
if len(Items) == 1 && Items[0].Id == item.ITEM_STAR_ID {
v.Type = order.Common_type
} else {
v.Type = order.Pet_type
}
v.Items = Items
OrderMod.OrderList[k] = v
}
return
}
}
func (player *Player) CreateNormalOrder() { func (player *Player) CreateNormalOrder() {
Exp, PExp := userCfg.GetLevUpExp(player.GetPlayerBaseMod().GetLevel()) Exp, PExp := userCfg.GetLevUpExp(player.GetPlayerBaseMod().GetLevel())
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
@ -1181,43 +1250,6 @@ func (player *Player) CreateNormalOrder() {
} }
return return
} }
// if ExpCoin > PExpCoin || BaseMod.GetLevel() < 17 {
// for k, v := range OrderMod.GetOrderList() {
// if len(v.Items) != 0 {
// continue
// }
// if v.Type != order.Common_type {
// continue
// }
// Star := order.GetOrderStar(v.MergeId)
// Star = int(float64(Star)*float64(OrderFactor)/10) * 10
// v.Items = append(v.Items, &item.Item{
// Id: item.ITEM_STAR_ID,
// Num: Star,
// })
// OrderMod.OrderList[k] = v
// }
// } else {
// for k, v := range OrderMod.GetOrderList() {
// if len(v.Items) != 0 {
// continue
// }
// if v.Type != order.Common_type {
// continue
// }
// Items := make([]*item.Item, 0)
// Star := order.GetOrderStar(v.MergeId)
// Star = int(float64(Star)*float64(OrderFactor)/10) * 10
// Items = player.GetPetOrderReward(Star, Items)
// if len(Items) == 1 && Items[0].Id == item.ITEM_STAR_ID {
// v.Type = order.Common_type
// } else {
// v.Type = order.Pet_type
// }
// v.Items = Items
// OrderMod.OrderList[k] = v
// }
// }
// 触发式订单 满足条件生成零件订单 // 触发式订单 满足条件生成零件订单
PartCost := DecorateMod.GetPartCost() PartCost := DecorateMod.GetPartCost()

View File

@ -6,6 +6,7 @@ import (
"math" "math"
"server/GoUtil" "server/GoUtil"
"server/conf" "server/conf"
baseCfg "server/conf/base"
cardCfg "server/conf/card" cardCfg "server/conf/card"
champshipCfg "server/conf/champship" champshipCfg "server/conf/champship"
collectCfg "server/conf/collect" collectCfg "server/conf/collect"
@ -433,6 +434,13 @@ func ReqRewardOrder(player *Player, buf []byte) error {
return nil return nil
} }
func ReqCreatePetOrder(player *Player, buf []byte) error {
player.CreatePetOrder()
OrderMod := player.PlayMod.getOrderMod()
player.PushClientRes(OrderMod.BackData())
return nil
}
func ReqDelOrder(player *Player, buf []byte) error { func ReqDelOrder(player *Player, buf []byte) error {
req := &msg.ReqDelOrder{} req := &msg.ReqDelOrder{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
@ -1480,6 +1488,7 @@ func ReqBuyEnergy(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResBuyEnergy{ player.PushClientRes(&msg.ResBuyEnergy{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
}) })
player.PushClientRes(ChargeMod.BackData())
player.TeLog("buy_energy_diamond", map[string]interface{}{ player.TeLog("buy_energy_diamond", map[string]interface{}{
"diamond_cost": Diamond, "diamond_cost": Diamond,
"energy_num": Energy, "energy_num": Energy,
@ -1751,6 +1760,34 @@ func ReqApplyFriend(player *Player, buf []byte) error {
}) })
return fmt.Errorf("already apply") return fmt.Errorf("already apply")
} }
if req.Type == 1 {
Items, err := FriendMod.GetSponsorReward()
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_ApplyFriendSponsor.String())
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.AddLog(int(req.Uid), friend.LOG_TYPE_FRIEND_SPONSOR, "", GoUtil.Now())
FriendMgrSend(&MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_FRIEND_SPONSOER,
From: int(player.M_DwUin),
To: Uid,
SendT: GoUtil.Now(),
})
player.TeLog("friend_invite_reward", map[string]interface{}{
"item_list": Items,
})
}
m := &MsqMod.Msg{ m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_APPLY, Type: MsqMod.HANDLE_TYPE_APPLY,
From: int(player.M_DwUin), From: int(player.M_DwUin),
@ -1790,6 +1827,7 @@ func ReqAgreeFriend(player *Player, buf []byte) error {
} }
FriendMgrSend(m) FriendMgrSend(m)
FriendMod.AddFriend(Uid) FriendMod.AddFriend(Uid)
FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "")
player.PushClientRes(&msg.ResAgreeFriend{ player.PushClientRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid, Uid: req.Uid,
@ -1801,6 +1839,7 @@ func ReqAgreeFriend(player *Player, buf []byte) error {
}) })
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now()) player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now())
FriendApplyBackData(player) FriendApplyBackData(player)
FriendLogBackData(player)
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
@ -4642,6 +4681,8 @@ func ReqAddNpc(player *Player, buf []byte) error {
player.TeLog("add_npc", map[string]interface{}{ player.TeLog("add_npc", map[string]interface{}{
"NpcId": int(req.NpcId), "NpcId": int(req.NpcId),
}) })
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING, "")
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING_Get, "")
player.AddLog(int(req.NpcId), friend.LOG_TYPE_FRIEND_BECOME_NPC, GoUtil.String(req.NpcId), GoUtil.Now()) player.AddLog(int(req.NpcId), friend.LOG_TYPE_FRIEND_BECOME_NPC, GoUtil.String(req.NpcId), GoUtil.Now())
player.PushClientRes(&msg.ResAddNpc{ player.PushClientRes(&msg.ResAddNpc{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
@ -5227,3 +5268,82 @@ func ReqActPassReward(player *Player, buf []byte) error {
}) })
return nil return nil
} }
func ReqFriendReplyHandle(player *Player, buf []byte) error {
req := &msg.ReqFriendReplyHandle{}
proto.Unmarshal(buf, req)
FriendMod := player.PlayMod.getFriendMod()
ReplyInfo := FriendMod.ReplyFriend(int(req.LogId))
if ReplyInfo == nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: "reply info not exist",
})
return fmt.Errorf("reply info not exist")
}
if req.Type == 1 && ReplyInfo.Uid > 10000 {
switch ReplyInfo.Type {
case friend.REPLY_TYPE_GREETING:
ReplyData := friend.ReplyInfo{
Uid: int(player.M_DwUin),
Type: friend.REPLY_TYPE_GREETING_Get,
Param: req.Param,
}
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(ReplyInfo.Uid),
Type: MsqMod.HANDLE_TYPE_FRIEND_GREETING_REPLY,
SendT: GoUtil.Now(),
Extra: ReplyData,
})
}
}
Items := baseCfg.GetFriendReplyReward()
err := player.HandleItem(Items, msg.ITEM_POP_LABEL_FriendReplyHandle.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
FriendLogBackData(player)
player.PushClientRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_SUCCESS,
LogId: req.LogId,
})
return nil
}
func ReqGetChessRetireReward(player *Player, buf []byte) error {
req := &msg.ReqGetChessRetireReward{}
proto.Unmarshal(buf, req)
ChessMod := player.PlayMod.getChessMod()
Items, err := ChessMod.GetRetireReward(req.Id)
if err != nil {
player.SendErrClienRes(&msg.ResGetChessRetireReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_GetChessRetireReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResGetChessRetireReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("get_chess_retire_reward", map[string]interface{}{
"EmitSerise": req.Id,
"Items": Items,
})
player.PushClientRes(ChessMod.BackData())
player.PlayMod.save()
player.PushClientRes(&msg.ResGetChessRetireReward{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
return nil
}

View File

@ -76,6 +76,71 @@ func checkTriggerCondition(player *Player, Trigger []string) bool {
} }
} }
func TriggerShippingOrderOrigin(player *Player, req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn
Status := int(req.Status)
if Status == MergeConst.ORDER_STATUS_CANCEL { // 取消支付
CancelOrder(player, OrderSn)
player.PushClientRes(&msg.ResShippingOrder{
Code: msg.RES_CODE_SUCCESS,
Msg: "cancel success",
})
return
}
var err error
OrderData, err := db.GetPlayerChargeData(OrderSn)
if err != nil {
log.Debug("charge shipping GetPlayerChargeData err:%v", err)
return
}
if OrderData.PayStatus == MergeConst.ORDER_STATUS_SHIP {
log.Debug("charge shipping order already shipped OrderSn:%s", OrderSn)
return
}
// if !conf.Server.GoogleVerify {
// Order.PayStatus = MergeConst.ORDER_STATUS_PAY
// return
// }
if conf.Server.GameName == "Merge_Pet_online" {
GoUtil.SendFeishuOrder(int(player.M_DwUin), OrderData.PayChannelOrderId, OrderData.Price, req.ProduceId, OrderData.PayTime, GoUtil.Now())
}
log.Debug("[order verify success] Uid:%d;OrderSn:%s;PayOrder:%s;Token:%s", player.M_DwUin, OrderData.OrderId, OrderData.PayChannelOrderId, req.Token)
player.lock.Lock()
defer player.lock.Unlock()
OrderExtraData := &ChargeExtra{}
if OrderData.PayChannelExtra != "" {
err = json.Unmarshal([]byte(OrderData.PayChannelExtra), OrderExtraData)
if err != nil {
log.Debug("GoogleVerify err:%v", err)
return
}
OrderExtraData.ChargeId = OrderData.ProductId
}
if OrderExtraData.Type == 0 {
Charge(player, int(OrderData.ProductId))
} else {
SendCharge(player, OrderExtraData)
}
OrderData.PayStatus = MergeConst.ORDER_STATUS_SHIP
OrderData.ProductName = req.ProduceId
db.UpdatePlayerChargeData(OrderData)
player.PlayMod.save()
orderDataMap := map[string]interface{}{
"AppId": conf.Server.AppID,
"ServerId": conf.Server.ServerID,
"OrderId": OrderData.OrderId,
"PayChannelOrderId": OrderData.PayChannelOrderId,
"ProductId": OrderData.ProductId,
"CreateTime": OrderData.CreateTime,
"PayTime": OrderData.PayTime,
"Token": req.Token,
"Price": OrderData.Price,
"PayType": OrderData.PayType,
}
player.Kafka("pay", orderDataMap)
player.SendClientRes()
}
func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) { func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn OrderSn := req.OrderSn
Status := int(req.Status) Status := int(req.Status)

View File

@ -27,6 +27,7 @@ var AdminFuncMap = map[string]func([]interface{}) error{
"ReqReload": ReqReload, "ReqReload": ReqReload,
"ReqAdminGm": ReqAdminGm, "ReqAdminGm": ReqAdminGm,
"ReqAdminBan": ReqAdminBan, "ReqAdminBan": ReqAdminBan,
"ReqAdminShipping": ReqAdminShipping,
} }
func AdminProcess(Func string, args []interface{}) { func AdminProcess(Func string, args []interface{}) {
@ -45,7 +46,7 @@ func AdminProcess(Func string, args []interface{}) {
log.Debug("AdminProcess error: %v", "Func not found") log.Debug("AdminProcess error: %v", "Func not found")
} }
func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg.ResLogin) { func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg.ResLogin, accountInfoOut *db.Db_Account) {
if detail.Type == msg.LOGIN_TYPE_CODE_LOGIN { if detail.Type == msg.LOGIN_TYPE_CODE_LOGIN {
err := VerifyCode(detail.UserName, detail.Code) err := VerifyCode(detail.UserName, detail.Code)
if err != nil { if err != nil {
@ -56,6 +57,16 @@ func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg
return return
} }
} }
if detail.Type == msg.LOGIN_TYPE_SDK_LOGIN {
if accountInfo == nil {
accountInfo = db.GetAccountInfoFromDb(detail.Device)
}
if accountInfo != nil {
db.UpdateAccountInfoName(accountInfo, detail.UserName)
accountInfo.UserName = detail.UserName
db.UpdatePlayerBaseInfoName(detail.Device, detail.UserName)
}
}
if accountInfo == nil { if accountInfo == nil {
ResLogin = &msg.ResLogin{ ResLogin = &msg.ResLogin{
ResultCode: MergeConst.Protocol_Error_Account_NoExsit, ResultCode: MergeConst.Protocol_Error_Account_NoExsit,
@ -79,6 +90,7 @@ func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg
return return
} }
} }
playerbaseinfo := db.GetPlayerBaseInfoFromDbByName(detail.UserName) playerbaseinfo := db.GetPlayerBaseInfoFromDbByName(detail.UserName)
if playerbaseinfo == nil { if playerbaseinfo == nil {
ResLogin = &msg.ResLogin{ ResLogin = &msg.ResLogin{
@ -95,7 +107,7 @@ func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg
} }
return return
} }
accountInfoOut = accountInfo
ResLogin = &msg.ResLogin{ ResLogin = &msg.ResLogin{
ResultCode: 0, ResultCode: 0,
DwUin: playerbaseinfo.DwUin, DwUin: playerbaseinfo.DwUin,
@ -104,6 +116,36 @@ func VerifyUser(accountInfo *db.Db_Account, detail *msg.ReqLogin) (ResLogin *msg
} }
return return
} }
func ReqAdminShipping(args []interface{}) error {
a, buf := ParseAdminArgs(args)
req := &msg.ReqAdminShipping{}
proto.Unmarshal(buf, req)
res := make(map[string]interface{})
res["Code"] = 0
OrderInfo, err := db.GetPlayerChargeData(req.OrderSn)
if err != nil {
res["Code"] = 1
res["Msg"] = "order not found"
AdminPlayerBack(a, res)
}
if OrderInfo.PayStatus == MergeConst.ORDER_STATUS_SHIP {
res["Msg"] = "order already shipped"
AdminPlayerBack(a, res)
}
Player := G_GameLogicPtr.GetPlayer(int64(OrderInfo.Uid))
if Player != nil {
go TriggerShippingOrderOrigin(Player, &msg.ReqShippingOrder{
OrderSn: req.OrderSn,
})
res["Msg"] = "player online,triggered sync"
AdminPlayerBack(a, res)
} else {
OrderInfo.PayStatus = MergeConst.ORDER_STATUS_PAY
OrderInfo.PayChannelOrderId = req.ChannelOrderSn
db.UpdatePlayerChargeData(OrderInfo)
}
return nil
}
func AdminPlayerInfo(args []interface{}) error { func AdminPlayerInfo(args []interface{}) error {
a, buf := ParseAdminArgs(args) a, buf := ParseAdminArgs(args)

View File

@ -163,7 +163,7 @@ func HandleClientReq(args []interface{}) {
log.Error("uid : %d, func : %s, fatal : %s", 0, m.GetFunc(), r) log.Error("uid : %d, func : %s, fatal : %s", 0, m.GetFunc(), r)
} }
}() }()
ResLogin := VerifyUser(accountInfo, detail) ResLogin, accountInfo := VerifyUser(accountInfo, detail)
if ResLogin.ResultCode != 0 { if ResLogin.ResultCode != 0 {
G_GameLogicPtr.PackLoginResInfo(a, ResLogin) G_GameLogicPtr.PackLoginResInfo(a, ResLogin)
return return

View File

@ -312,15 +312,16 @@ func (c *ChargeMod) BackData() *msg.ResCharge {
} }
WeeklyDiscount := make(map[int32]*msg.WeeklyDiscountInfo) WeeklyDiscount := make(map[int32]*msg.WeeklyDiscountInfo)
WeeklyDiscountInfo := chargeCfg.GetWeeklyInfoAll() WeeklyDiscountInfo := chargeCfg.GetWeeklyInfoAll()
for k, v := range WeeklyDiscountInfo { if c.IsWeeklyDiscountDay() {
LimitNum := c.WeeklyDiscount[k] for k, v := range WeeklyDiscountInfo {
WeeklyDiscount[int32(k)] = &msg.WeeklyDiscountInfo{ LimitNum := c.WeeklyDiscount[k]
Discount: int32(v.Discount), WeeklyDiscount[int32(k)] = &msg.WeeklyDiscountInfo{
Count: int32(v.WeeklyLimit - LimitNum), Discount: int32(v.Discount),
Id: int32(k), Count: int32(v.WeeklyLimit - LimitNum),
Id: int32(k),
}
} }
} }
return &msg.ResCharge{ return &msg.ResCharge{
Charge: float32(c.Charge), Charge: float32(c.Charge),
Total: int32(c.Total), Total: int32(c.Total),

View File

@ -44,6 +44,7 @@ type ChessBorad struct {
ChessMap map[string]int32 ChessMap map[string]int32
Honor map[int]int // 荣誉室 Honor map[int]int // 荣誉室
Retire map[string]int // 退役发射器系列 Retire map[string]int // 退役发射器系列
RetireReward map[string]bool
RetireChessMap map[string][]int RetireChessMap map[string][]int
} }
@ -96,6 +97,9 @@ func (cb *ChessBorad) ver() {
cb.ChessBag.List[i] = ChessBagGrid{} cb.ChessBag.List[i] = ChessBagGrid{}
} }
} }
if cb.RetireReward == nil {
cb.RetireReward = make(map[string]bool)
}
if cb.PartBag.List == nil { if cb.PartBag.List == nil {
cb.PartBag.List = make(map[int]PartBagGrid) cb.PartBag.List = make(map[int]PartBagGrid)
} }
@ -418,11 +422,18 @@ func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
for k := range cb.Honor { for k := range cb.Honor {
Ho = append(Ho, int32(k)) Ho = append(Ho, int32(k))
} }
Rw := make([]string, 0)
for k, v := range cb.RetireReward {
if v == true {
Rw = append(Rw, k)
}
}
return &msg.ResPlayerChessInfo{ return &msg.ResPlayerChessInfo{
ChessList: GoUtil.SliceIntToInt32(cb.ChessList), ChessList: GoUtil.SliceIntToInt32(cb.ChessList),
ChessBuff: GoUtil.SliceIntToInt32(cb.ChessBuff), ChessBuff: GoUtil.SliceIntToInt32(cb.ChessBuff),
RetireEmit: Re, RetireEmit: Re,
Honor: Ho, RetireReward: Rw,
Honor: Ho,
ChessBag: &msg.ChessBag{ ChessBag: &msg.ChessBag{
ChessBagGrids: ChessBagGrids, ChessBagGrids: ChessBagGrids,
ChessBuyCnt: int32(cb.ChessBag.Buy), ChessBuyCnt: int32(cb.ChessBag.Buy),
@ -671,3 +682,14 @@ func (cb *ChessBorad) GetPartBag() map[int]int {
} }
return res return res
} }
func (cb *ChessBorad) GetRetireReward(Id string) ([]*item.Item, error) {
if cb.RetireReward[Id] == true {
return nil, errors.New("emit retire reward has been get")
}
if cb.Retire[Id] != EMIT_RETIRE_END {
return nil, errors.New("emit not finish retire")
}
cb.RetireReward[Id] = true
return mergeDataCfg.GetRetireReward(), nil
}

View File

@ -22,6 +22,19 @@ type FriendMod struct {
Npc []int // npc id Npc []int // npc id
Bubble map[int]*BubbleInfo // 气泡 Bubble map[int]*BubbleInfo // 气泡
ActivityLog []*ActLogInfo // 活动日志 ActivityLog []*ActLogInfo // 活动日志
ReplyList []*ReplyInfo // 好友回复列表
DailySponsor int // 好友赞助次数
}
type ReplyInfo struct {
Id int
Uid int
Type int
Param string
Status int
AddTime int64
ReplyTime int64
EndTime int64
} }
type ActLogInfo struct { type ActLogInfo struct {
@ -53,6 +66,11 @@ type ApplyInfo struct {
Uid int64 Uid int64
} }
const (
REPLY_TYPE_GREETING = 1 // 问候
REPLY_TYPE_GREETING_Get = 2 // 收到问候
)
// 24小时内与玩家进行过以下互动的用户若被选中参加本次宠物宝藏在其头像旁添加礼物盒 // 24小时内与玩家进行过以下互动的用户若被选中参加本次宠物宝藏在其头像旁添加礼物盒
const ( const (
INTERACT_TYPE_VISIT = 1 // 拜访过玩家的Pet Playroom并进行过小游戏或点赞的用户 INTERACT_TYPE_VISIT = 1 // 拜访过玩家的Pet Playroom并进行过小游戏或点赞的用户
@ -91,6 +109,8 @@ const (
LOG_TYPE_CARD_GIVE_ACCEPT = 28 // 接受卡牌请求 LOG_TYPE_CARD_GIVE_ACCEPT = 28 // 接受卡牌请求
LOG_TYPE_FRIEND_INVITE = 29 // 邀请注册 LOG_TYPE_FRIEND_INVITE = 29 // 邀请注册
LOG_TYPE_TREASURE_HELP = 30 // 好友宝藏帮助 LOG_TYPE_TREASURE_HELP = 30 // 好友宝藏帮助
LOG_TYPE_FRIEND_SPONSOR = 31 // 好友赞助体力
LOG_TYPE_FRIEND_SPONSOR_GET = 32 // 获得好友赞助体力
) )
const ( const (
@ -183,6 +203,10 @@ func (f *FriendMod) InitData() {
} }
} }
func (f *FriendMod) ZeroUpdate() {
f.DailySponsor = f.GetDailySponsorLimit()
}
func (f *FriendMod) GetNpc() []int { func (f *FriendMod) GetNpc() []int {
return f.Npc return f.Npc
} }
@ -474,3 +498,51 @@ func (f *FriendMod) GetActLogLast() *ActLogInfo {
} }
return f.ActivityLog[len(f.ActivityLog)-1] return f.ActivityLog[len(f.ActivityLog)-1]
} }
func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string) {
f.AutoId++
EndTime := GoUtil.Now() + 24*3600
f.ReplyList = append(f.ReplyList, &ReplyInfo{
Id: f.AutoId,
Uid: Uid,
Type: Type,
Param: Param,
Status: 0,
AddTime: GoUtil.Now(),
EndTime: EndTime,
})
}
func (f *FriendMod) ReplyFriend(LogId int) *ReplyInfo {
for _, v := range f.ReplyList {
if v.Id == LogId {
v.Status = 1
v.ReplyTime = GoUtil.Now()
return v
}
}
return nil
}
func (f *FriendMod) GetSponsor() int {
return f.DailySponsor
}
func (f *FriendMod) GetDailySponsorLimit() int {
len := len(f.FriendList)
if len < 5 {
return 3
}
if len <= 30 {
return 2
}
return 1
}
func (f *FriendMod) GetSponsorReward() ([]*item.Item, error) {
if f.DailySponsor <= 0 {
return nil, fmt.Errorf("no sponsor left")
}
f.DailySponsor--
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, 25)}, nil
}

View File

@ -104,6 +104,9 @@ const (
HANDLE_TYPE_VAR_EXPIRE_SET // 设置全服过期数据 HANDLE_TYPE_VAR_EXPIRE_SET // 设置全服过期数据
HANDLE_TYPE_VAR_EXPIRE_GET // 获取全服过期数据 HANDLE_TYPE_VAR_EXPIRE_GET // 获取全服过期数据
HANDLE_TYPE_FRIEND_GREETING_REPLY // 好友问候回复
HANDLE_TYPE_FRIEND_SPONSOER // 好友赞助体力
) )
const ( const (

File diff suppressed because it is too large Load Diff