Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-12-10 14:46:21 +08:00
commit 11da2fa04b
43 changed files with 2592 additions and 2049 deletions

2
.gitignore vendored
View File

@ -15,3 +15,5 @@ src/server/teLog/log.2024-11-28
src/server/logs/ga_log/*.log
src/server/goroutine.prof
src/server/heap_after.pb.gz
src/server/test/logs/*
src/server/test/teLog/*

View File

@ -9,6 +9,18 @@ import (
"strings"
)
func IntSlice(d interface{}) []int {
if d == nil {
return []int{}
}
// Type assertion with safety check
result, ok := d.([]int)
if !ok {
return []int{}
}
return result
}
func IntToInt32(d []int) []int32 {
r := make([]int32, 0, len(d))
for _, d := range d {

View File

@ -50,6 +50,44 @@ func BenchmarkGame(b *testing.B) {
printMemUsage()
}
}
func BenchmarkLog(b *testing.B) {
runtime.GOMAXPROCS(2)
t := game.G_getGameLogic()
for i := 0; i < 10000; i++ {
t.AddLog(&game.Log{
EventName: "test_log",
Param: map[string]interface{}{
"test_key": "test_value",
},
})
}
t.MLogManager.Close()
}
func BenchmarkLog2(b *testing.B) {
// 准备耗时但不需要计入基准的初始化
runtime.GOMAXPROCS(2)
// 假设有个函数 NewGameLogicForBenchmark() 创建全新、独立的对象
b.ReportAllocs()
for i := 0; i < b.N; i++ {
// 每次迭代创建独立对象,避免副作用
t := game.G_getGameLogic()
b.StartTimer()
// 被测操作:向日志管理器添加 1000 条日志
for j := 0; j < 1000; j++ {
t.AddLog(&game.Log{
EventName: "test_log",
Param: map[string]interface{}{
"test_key": "test_value",
},
})
}
b.StopTimer()
t.MLogManager.Close()
}
}
func printMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)

View File

@ -34,10 +34,26 @@ func GetGameNum(Id int) int {
return gamedata.GetIntValue(data, "PassNum")
}
func GetJackpotItem(Mul int) (int, []*item.Item, int) {
func GetGameMaxProgress(Id int) int {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
return 0
}
MaxProgress := 0
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != TemplateId {
continue
}
MaxProgress = max(MaxProgress, gamedata.GetIntValue(v, "Need"))
}
return MaxProgress
}
func GetJackpotItem(Mul int) (int, []*item.Item, int, int) {
data, err := gamedata.GetData(CATNIP_JACKPOT_CFG_NAME)
if err != nil {
return 0, nil, 0
return 0, nil, 0, 0
}
JackpotType := GetJackpotType(Mul)
r := make(map[int]int)
@ -48,13 +64,13 @@ func GetJackpotItem(Mul int) (int, []*item.Item, int) {
}
Id := GoUtil.RandMap(r)
if Id == 0 {
return 0, nil, 0
return 0, nil, 0, 0
}
itemData, err := gamedata.GetDataByIntKey(CATNIP_JACKPOT_CFG_NAME, Id)
if err != nil {
return 0, nil, 0
return 0, nil, 0, 0
}
return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth")
return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth"), gamedata.GetIntValue(itemData, "FriendItems")
}
func GetJackpotType(Mul int) int {
@ -78,19 +94,22 @@ func GetTemplateId(Id int) int {
return gamedata.GetIntValue(data, "Template")
}
func GetProgressReward(Id int, Progress int) []*item.Item {
func GetProgressReward(Id int, Rewards []int, Progress int) ([]*item.Item, []int) {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetDataByIntKey(CATNIP_GAME_CFG_NAME, Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
return nil
return nil, nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "Need") == Progress && gamedata.GetIntValue(v, "Template") == TemplateId {
return gamedata.GetItemList(v, "Items")
Items := []*item.Item{}
Ids := []int{}
for k, v := range data {
Id := GoUtil.Int(k)
if !GoUtil.InArray(Id, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId {
Items = append(Items, gamedata.GetItemList(v, "Items")...)
Ids = append(Ids, GoUtil.Int(k))
}
}
return nil
return Items, Ids
}
func GetItemCost(Id, Mul int) []*item.Item {

View File

@ -109,6 +109,15 @@ func GetDecoarteReward(Scene int, Lv int) []*item.Item {
return nil
}
func GetAreaReward(AreaId int) []*item.Item {
value, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
if err != nil {
log.Debug("IndoorProgress GetDecoarteReward not found")
return nil
}
return gamedata.GetItemList(value, "Items")
}
// 获取一键装饰的解锁等级
func GetOneKeyDecorateUnlockLv() int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "OneKey")

View File

@ -64,7 +64,7 @@ var Server struct {
func init() {
filePath := "conf/server.json"
if len(os.Args) == 2 {
if os.Args[1] != "" {
if os.Args[1] != "" && os.Args[1][0] != '-' {
filePath = os.Args[1]
}
}

View File

@ -11,11 +11,9 @@ import (
)
const (
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
CFG_MERGE_EMIT = "MergeDataEmit"
CFG_MERGE_EMIT_TYPE = "MergeDataEmitType"
CFG_MERGE_COLOR = "MergeDataColor"
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
CFG_MERGE_EMIT = "MergeDataEmit"
// 棋子类型
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
@ -27,17 +25,6 @@ func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CONST_NAME)
gamedata.InitCfg(CFG_MERGE_EMIT)
gamedata.InitCfg(CFG_MERGE_EMIT_TYPE)
gamedata.InitCfg(CFG_MERGE_COLOR)
}
func GetEmitTypeProduce(EmitType string) []string {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT_TYPE, EmitType)
if err != nil {
// log.Debug("GetEmitTypeProduce GetOne EmitType:%s not found", EmitType)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Produce"), ",")
}
func GetEmitTypeByColor(Color string) string {
@ -91,6 +78,7 @@ func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
Type: gamedata.ParseString(data["Type"]),
Emit_Product: gamedata.ParseString(data["Emit_Product"]),
CoolTime: gamedata.ParseInt(data["CoolTime"]),
Emit_Type: gamedata.ParseString(data["Emit_Type"]),
}, nil
}
@ -428,7 +416,7 @@ func DynamicLevRev(Lv int, EmitId int, Color string) int {
func DynamicLev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
@ -451,7 +439,7 @@ func DynamicLev(Lv int, EmitId int, Color string) int {
func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
@ -486,7 +474,7 @@ func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int {
func DynamicAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
DynamicLv := ""
@ -521,7 +509,7 @@ func DynamicAdjust(EmitId int, Color string, EnergyMul int) int {
func GetAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
AdjustLv := ""
@ -591,24 +579,6 @@ func getColorProb(Emit_List string, Color string) float64 {
return Prob
}
func GetColorType(Color string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_COLOR, Color)
if err != nil {
log.Debug("GetColorType GetOne Color:%s not found", Color)
return 0
}
Type := gamedata.GetStringValue(data, "Type")
switch Type {
case "main":
return CHESS_PRODUCT_MAIN_TYPE
case "secondary":
return CHESS_PRODUCT_SECONDARY_TYPE
case "sub":
return CHESS_PRODUCT_SUB_TYPE
}
return CHESS_PRODUCT_MAIN_TYPE
}
func GetMergeStar(MergeList []int) int {
Star := 0
for _, v := range MergeList {

View File

@ -1,6 +1,7 @@
package game
import (
"fmt"
"server/GoUtil"
activityCfg "server/conf/activity"
catnipCfg "server/conf/catnip"
@ -17,10 +18,10 @@ import (
)
// 活动模块 登录
func ActivityLogin(p *Player) {
func (p *Player) ActivityLogin() {
ItemMod := p.PlayMod.getItemMod()
// 挖矿
ActivityId := GetActivityId(p, activity.ACT_TYPE_MINING)
ActivityId := p.GetActivityId(activity.ACT_TYPE_MINING)
MiningMod := p.PlayMod.getMiningMod()
OldId := MiningMod.Login(ActivityId)
if OldId != 0 {
@ -28,11 +29,11 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
p.SendActivityMail(ItemId, ItemNum, ActivityId, nil)
}
}
// 猜颜色
ActivityId = GetActivityId(p, activity.ACT_TYPE_GUESS_COLOR)
ActivityId = p.GetActivityId(activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod := p.PlayMod.getGuessColorMod()
OldId = GuessColorMod.Login(ActivityId)
if OldId != 0 {
@ -40,12 +41,12 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
p.SendActivityMail(ItemId, ItemNum, ActivityId, nil)
}
}
// 赛跑
ActivityId = GetActivityId(p, activity.ACT_TYPE_RACE)
ActivityId = p.GetActivityId(activity.ACT_TYPE_RACE)
RaceMod := p.PlayMod.getRaceMod()
OldId = RaceMod.Login(ActivityId)
if OldId != 0 {
@ -53,11 +54,11 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
p.SendActivityMail(ItemId, ItemNum, ActivityId, nil)
}
}
// 猫草大作战
ActivityId = GetActivityId(p, activity.ACT_TYPE_CATNIP)
ActivityId = p.GetActivityId(activity.ACT_TYPE_CATNIP)
CatnipMod := p.PlayMod.getCatnipMod()
OldId = CatnipMod.Login(ActivityId)
if OldId != 0 {
@ -65,7 +66,7 @@ func ActivityLogin(p *Player) {
}
// 通行证
ActivityId = GetActivityId(p, activity.ACT_TYPE_PASS)
ActivityId = p.GetActivityId(activity.ACT_TYPE_PASS)
PassMod := p.PlayMod.getPassMod()
OldId = PassMod.Login(ActivityId)
if OldId != 0 {
@ -74,12 +75,13 @@ func ActivityLogin(p *Player) {
RewardItems, _ := PassMod.GetRewardItems()
if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId, RewardItems)
p.SendActivityMail(ItemId, ItemNum, ActivityId, RewardItems)
}
}
}
func SendActivityMail(p *Player, ItemId, ItemNum, ActivityId int, RewardItems []*item.Item) {
// 发送活动邮件
func (p *Player) SendActivityMail(ItemId, ItemNum, ActivityId int, RewardItems []*item.Item) {
MailMod := p.PlayMod.getMailMod()
ItemName, ItemNameEn := itemCfg.GetItemName(ItemId)
ActivityTitle, ActivityTitleEn := activityCfg.GetActivityTitle(ActivityId)
@ -90,36 +92,37 @@ func SendActivityMail(p *Player, ItemId, ItemNum, ActivityId int, RewardItems []
}
// 活动模块 零点更新
func ActivityZeroUpdate(p *Player) {
ActivityLogin(p)
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING)
func (p *Player) ActivityZeroUpdate() {
p.ActivityLogin()
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_MINING)
if ActivityInfo != nil {
MiningMod := p.PlayMod.getMiningMod()
MiningMod.ZeroUpdate(ActivityInfo.Id)
}
ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_GUESS_COLOR)
ActivityInfo = p.GetActivityInfo(activity.ACT_TYPE_GUESS_COLOR)
if ActivityInfo != nil {
GuessColorMod := p.PlayMod.getGuessColorMod()
GuessColorMod.ZeroUpdate(ActivityInfo.Id)
}
ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_RACE)
ActivityInfo = p.GetActivityInfo(activity.ACT_TYPE_RACE)
if ActivityInfo != nil {
RaceMod := p.PlayMod.getRaceMod()
RaceMod.ZeroUpdate(ActivityInfo.Id)
}
ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_PASS)
ActivityInfo = p.GetActivityInfo(activity.ACT_TYPE_PASS)
if ActivityInfo != nil {
PassMod := p.PlayMod.getPassMod()
PassMod.ZeroUpdate(ActivityInfo.Id)
}
ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_CATNIP)
ActivityInfo = p.GetActivityInfo(activity.ACT_TYPE_CATNIP)
if ActivityInfo != nil {
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMod.ZeroUpdate(ActivityInfo.Id)
}
}
func GetActivityInfo(p *Player, actType int) *ActivityInfo {
// 获取活动信息
func (p *Player) GetActivityInfo(actType int) *ActivityInfo {
for _, v := range p.activity {
if v.Type == actType {
return v
@ -128,7 +131,8 @@ func GetActivityInfo(p *Player, actType int) *ActivityInfo {
return nil
}
func GetActivityId(p *Player, actType int) int {
// 获取活动ID
func (p *Player) GetActivityId(actType int) int {
for _, v := range p.activity {
if v.Type == actType {
return v.Id
@ -137,7 +141,8 @@ func GetActivityId(p *Player, actType int) int {
return 0
}
func GetActivityInfoById(p *Player, Id int) *ActivityInfo {
// 根据活动ID获取活动信息
func (p *Player) GetActivityInfoById(Id int) *ActivityInfo {
for _, v := range p.activity {
if v.Id == Id {
return v
@ -146,8 +151,9 @@ func GetActivityInfoById(p *Player, Id int) *ActivityInfo {
return nil
}
func GetActivityStatus(p *Player, actType int) int {
ActivityInfo := GetActivityInfo(p, actType)
// 获取活动状态
func (p *Player) GetActivityStatus(actType int) int {
ActivityInfo := p.GetActivityInfo(actType)
if ActivityInfo == nil {
return ACT_STATUS_NOT_START
}
@ -161,12 +167,13 @@ func GetActivityStatus(p *Player, actType int) int {
return ACT_STATUS_START
}
func MiningBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING)
// 挖矿活动数据返回
func (p *Player) MiningBackData() {
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_MINING)
if ActivityInfo == nil {
return
}
Status := GetActivityStatus(p, activity.ACT_TYPE_MINING)
Status := p.GetActivityStatus(activity.ACT_TYPE_MINING)
Template := miningCfg.GetTemplate(ActivityInfo.Id)
MiningMod := p.PlayMod.getMiningMod()
p.PushClientRes(&msg.ResMining{
@ -181,13 +188,14 @@ func MiningBackData(p *Player) {
})
}
func GuessColorBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_GUESS_COLOR)
// 猜颜色活动数据返回
func (p *Player) GuessColorBackData() {
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_GUESS_COLOR)
if ActivityInfo == nil {
return
}
Status := GetActivityStatus(p, activity.ACT_TYPE_GUESS_COLOR)
Status := p.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod := p.PlayMod.getGuessColorMod()
MapList := make([]*msg.GuessColorInfo, 0)
for _, v := range GuessColorMod.MapList {
@ -212,12 +220,13 @@ func GuessColorBackData(p *Player) {
})
}
func RaceBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_RACE)
// 赛跑活动数据返回
func (p *Player) RaceBackData() {
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_RACE)
if ActivityInfo == nil {
return
}
Status := GetActivityStatus(p, activity.ACT_TYPE_RACE)
Status := p.GetActivityStatus(activity.ACT_TYPE_RACE)
RaceMod := p.PlayMod.getRaceMod()
Opponent := make([]*msg.Raceopponent, 0)
for _, v := range RaceMod.Opponent {
@ -242,7 +251,8 @@ func RaceBackData(p *Player) {
})
}
func RedBackData(p *Player) {
// 红点数据返回
func (p *Player) RedBackData() {
result := make(map[int32]int32)
Now := GoUtil.Now()
for _, v := range p.activity {
@ -253,12 +263,13 @@ func RedBackData(p *Player) {
p.PushClientRes(&msg.ResActRed{Red: result})
}
func ActPassBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
// 通行证活动数据返回
func (p *Player) ActPassBackData() {
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
return
}
Status := GetActivityStatus(p, activity.ACT_TYPE_PASS)
Status := p.GetActivityStatus(activity.ACT_TYPE_PASS)
Template := passCfg.GetTemplate(ActivityInfo.Id)
PassMod := p.PlayMod.getPassMod()
p.PushClientRes(&msg.ResActPass{
@ -273,11 +284,12 @@ func ActPassBackData(p *Player) {
})
}
func GetActivityItem(p *Player, ActType []int) []*item.Item {
// 获取活动道具
func (p *Player) GetActivityItem(ActType []int) []*item.Item {
Items := make([]*item.Item, 0)
for _, v := range ActType {
Status := GetActivityStatus(p, v)
ActivityInfo := GetActivityInfo(p, v)
Status := p.GetActivityStatus(v)
ActivityInfo := p.GetActivityInfo(v)
if ActivityInfo == nil {
continue
}
@ -304,24 +316,27 @@ func GetActivityItem(p *Player, ActType []int) []*item.Item {
return Items
}
// 猫草大作战活动数据返回
func (p *Player) CatnipBackData() {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
return
}
CatnipMod := p.PlayMod.getCatnipMod()
Status := GetActivityStatus(p, activity.ACT_TYPE_CATNIP)
Status := p.GetActivityStatus(activity.ACT_TYPE_CATNIP)
if CatnipMod == nil {
return
}
FriendMod := p.PlayMod.getFriendMod()
GameList := make([]*msg.CatnipGame, 0)
for _, v := range CatnipMod.Game {
GameInfo := &msg.CatnipGame{
Id: int32(v.Id),
Progress: int32(v.Progress),
Status: int32(v.Status),
Reward: GoUtil.SliceIntToInt32(v.Reward),
Emoji: int32(v.EmojiId),
Id: int32(v.Id),
Progress: int32(v.Progress),
Status: int32(v.Status),
Reward: GoUtil.SliceIntToInt32(v.Reward),
Emoji: int32(v.EmojiId),
FriendProgress: int32(v.PartnerAdd),
}
if v.Partner != 0 {
PlayerData := G_getGameLogic().GetResSimplePlayerByUid(v.Partner)
@ -329,38 +344,67 @@ func (p *Player) CatnipBackData() {
GameInfo.Partner = PlayerData
}
}
InviteList := make([]*msg.CatnipInvite, 0)
for _, iv := range v.InviteList {
InviteList = append(InviteList, &msg.CatnipInvite{
Uid: int64(iv.InviteId),
Time: int64(iv.Time),
})
}
GameInfo.InviteList = InviteList
BeInvitedList := make([]*msg.CatnipInvite, 0)
for _, iv := range v.BeInvitedList {
BeInvitedList = append(BeInvitedList, &msg.CatnipInvite{
Uid: int64(iv.InviteId),
Time: int64(iv.Time),
})
}
GameInfo.BeInviteList = BeInvitedList
GameList = append(GameList, GameInfo)
}
tmpData := make(map[int]*msg.CatnipInvite)
InviteList := make([]*msg.CatnipInvite, 0)
for Uid, Info := range CatnipMod.InviteList {
tmpData[Uid] = &msg.CatnipInvite{
Uid: int64(Uid),
Time: Info.Time,
Type: 1,
}
}
for Uid, Info := range CatnipMod.BeInvitedList {
tmpData[Uid] = &msg.CatnipInvite{
Uid: int64(Uid),
Time: Info.Time,
Type: 2,
}
}
for Uid := range FriendMod.NewFriendList {
key := fmt.Sprintf("catnip_partner_%d", Uid)
Var := G_GameLogicPtr.VarMgr.GetExpireVar(key)
if len(GoUtil.IntSlice(Var.D)) >= 4 {
tmpData[Uid] = &msg.CatnipInvite{
Uid: int64(Uid),
Type: 3,
}
continue
}
if _, ok := tmpData[Uid]; !ok {
tmpData[Uid] = &msg.CatnipInvite{
Uid: int64(Uid),
Type: 0,
}
}
}
for _, v := range tmpData {
ResPlayerSimple := G_getGameLogic().GetResSimplePlayerByUid(int(v.Uid))
if ResPlayerSimple != nil {
v.Player = ResPlayerSimple
}
InviteList = append(InviteList, v)
}
Template := catnipCfg.GetTemplateId(CatnipMod.Id)
res := &msg.ResCatnip{
Id: int32(CatnipMod.Id),
EndTime: int32(ActivityInfo.EndT),
Status: int32(Status),
Template: int32(Template),
GameList: GameList,
Multiply: int32(CatnipMod.Mul),
Id: int32(CatnipMod.Id),
EndTime: int32(ActivityInfo.EndT),
Status: int32(Status),
Template: int32(Template),
GameList: GameList,
Multiply: int32(CatnipMod.Mul),
FriendList: InviteList,
}
p.PushClientRes(res)
}
// 设置猫草大作战游戏锁
func (p *Player) SetCatnipGameLock(Uid int, GameId int) error {
ActivityInfo := GetActivityInfoById(p, activity.ACT_TYPE_CATNIP)
ActivityInfo := p.GetActivityInfoById(activity.ACT_TYPE_CATNIP)
return G_GameLogicPtr.SetDataSync(int(p.M_DwUin), VAR_OP_CATNIP_LOCK, CatnipLock{
Uid: int(p.M_DwUin),
Partner: Uid,

View File

@ -1,32 +1,40 @@
package game
import (
"encoding/json"
"fmt"
"os/exec"
"server/GoUtil"
"server/MergeConst"
"server/conf"
activityCfg "server/conf/activity"
chargeCfg "server/conf/charge"
passCfg "server/conf/pass"
"server/db"
"server/game/mod/activity"
"server/game/mod/item"
MsgMod "server/game/mod/msg"
"server/game/mod/piggyBank"
"server/game/mod/quest"
"server/msg"
proto "server/msg"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
func Charge(p *Player, ChargeId int) {
ChargeFire(p, ChargeId) // 充值
EndlessFire(p, ChargeId) // 无尽礼包
PiggyBankFire(p, ChargeId) // 猪猪银行
PlayroomFire(p, ChargeId) // 游乐场
ActivityFire(p, ChargeId) // 活动礼包
ADPetWorkFire(p, ChargeId) // 广告宠物工作
PassFire(p, ChargeId)
func (p *Player) Charge(ChargeId int) {
p.ChargeFire(ChargeId) // 充值
p.EndlessFire(ChargeId) // 无尽礼包
p.PiggyBankFire(ChargeId) // 猪猪银行
p.PlayroomFire(ChargeId) // 游乐场
p.ActivityFire(ChargeId) // 活动礼包
p.ADPetWorkFire(ChargeId) // 广告宠物工作
p.PassFire(ChargeId)
OrderMod := p.PlayMod.getOrderMod()
OrderMod.SetIsCharge() // 设置订单模块为充值状态
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PURCHASE, A: []interface{}{}})
}
func SendCharge(p *Player, d *ChargeExtra) {
func (p *Player) SendCharge(d *ChargeExtra) {
G_GameLogicPtr.FriendMgrSend(&MsgMod.Msg{
From: int(p.M_DwUin),
Type: MsgMod.HANDLE_TYPE_SEND_CHARGE,
@ -36,11 +44,11 @@ func SendCharge(p *Player, d *ChargeExtra) {
})
}
func ADPetWorkFire(p *Player, ChargeId int) {
func (p *Player) ADPetWorkFire(ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.FireAdReward(ChargeId)
if Item != nil {
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_ActivityGift.String())
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
return
@ -50,10 +58,10 @@ func ADPetWorkFire(p *Player, ChargeId int) {
p.ChargeBackData()
}
func ActivityFire(p *Player, ChargeId int) {
func (p *Player) ActivityFire(ChargeId int) {
ActivityMod := p.PlayMod.getActivityMod()
ActivityId := activityCfg.GetActivityGiftId(ChargeId)
ActivityInfo := GetActivityInfoById(p, ActivityId)
ActivityInfo := p.GetActivityInfoById(ActivityId)
if ActivityInfo == nil {
log.Debug("ActivityFire ActivityInfo nil : player id :%d, charge id:%d", p.M_DwUin, ChargeId)
return
@ -66,7 +74,7 @@ func ActivityFire(p *Player, ChargeId int) {
if Item == nil {
return
}
err = p.HandleItem(Item, msg.ITEM_POP_LABEL_ActivityGift.String())
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
return
@ -76,12 +84,12 @@ func ActivityFire(p *Player, ChargeId int) {
p.BackDataActivity()
}
func PassFire(p *Player, ChargeId int) {
ActivityStatus := GetActivityStatus(p, activity.ACT_TYPE_PASS)
func (p *Player) PassFire(ChargeId int) {
ActivityStatus := p.GetActivityStatus(activity.ACT_TYPE_PASS)
if ActivityStatus != ACT_STATUS_START {
return
}
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
return
}
@ -98,7 +106,7 @@ func PassFire(p *Player, ChargeId int) {
if len(Items) == 0 {
return
}
err := p.HandleItem(Items, msg.ITEM_POP_LABEL_PassCharge.String())
err := p.HandleItem(Items, proto.ITEM_POP_LABEL_PassCharge.String())
if err != nil {
log.Debug("PassFire err : %s", err)
return
@ -106,13 +114,13 @@ func PassFire(p *Player, ChargeId int) {
p.PlayMod.save()
}
func PlayroomFire(p *Player, ChargeId int) {
func (p *Player) PlayroomFire(ChargeId int) {
PlayroomMod := p.PlayMod.getPlayroomMod()
Item := PlayroomMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_Playroom.String())
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_Playroom.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
@ -122,17 +130,17 @@ func PlayroomFire(p *Player, ChargeId int) {
p.PlayMod.save()
}
func PiggyBankFire(p *Player, ChargeId int) {
func (p *Player) PiggyBankFire(ChargeId int) {
PiggyBankMod := p.PlayMod.getPiggyBankMod()
Item := PiggyBankMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_PiggyBank.String())
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_PiggyBank.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
LimitedTimePiggyBankTrigger(p)
p.LimitedTimePiggyBankTrigger()
p.TeLog("piggy_bank_open", map[string]interface{}{
"piggy_bank_type": piggyBank.PIGGY_BANK_TYPE_CHARGE,
"item_list": Item,
@ -143,13 +151,13 @@ func PiggyBankFire(p *Player, ChargeId int) {
}
// 处理玩家充值
func ChargeFire(p *Player, ChargeId int) {
func (p *Player) ChargeFire(ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_Charge.String())
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_Charge.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
@ -157,23 +165,112 @@ func ChargeFire(p *Player, ChargeId int) {
p.ChargeBackData()
}
func ChargeItem(p *Player, ChargeId int) []*item.Item {
func (p *Player) ChargeItem(ChargeId int) []*item.Item {
ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.Fire(ChargeId)
return Item
}
// 处理玩家充值
func EndlessFire(p *Player, ChargeId int) {
func (p *Player) EndlessFire(ChargeId int) {
EndlessMod := p.PlayMod.getEndlessMod()
Item := EndlessMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_Endless.String())
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_Endless.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
p.PlayMod.save()
p.PushClientRes(EndlessMod.BackData())
}
// 创建订单
func (p *Player) CreateOrderSn(req *proto.ReqCreateOrderSn) (string, error) {
Uid := int(p.M_DwUin)
OrderSn := GoUtil.CreateOrderSn(Uid)
Price, Currency := chargeCfg.GetChargeInfo(int(req.ChargeId))
Extra := &ChargeExtra{
Type: int(req.Type),
Uid: req.Uid,
}
ExtraData, _ := json.Marshal(Extra)
err := db.CreateOrderSn(Uid, int(req.ChargeId), OrderSn, req.PlatForm, req.Channel, Price, Currency, string(ExtraData))
if err != nil {
return "", err
}
return OrderSn, nil
}
func (p *Player) GoogleVerify(OrderSn, ProduceId, Token string) (*db.SqlChargeOrderStruct, error) {
Order, err := db.GetPlayerChargeData(OrderSn)
if err != nil {
return nil, err
}
if Order.PayStatus == MergeConst.ORDER_STATUS_SHIP {
return nil, fmt.Errorf("订单已经发货")
}
if !conf.Server.GoogleVerify {
Order.PayStatus = MergeConst.ORDER_STATUS_PAY
return Order, nil
}
if Order.PayStatus != MergeConst.ORDER_STATUS_IDLE {
return nil, fmt.Errorf("订单已经支付")
}
cmd := exec.Command(conf.Server.AppPath+"/script/verifyOrder", ProduceId, Token)
// 获取命令的输出
output, err := cmd.Output()
if err != nil {
return nil, err
}
// 将输出转换为字符串
outputStr := string(output)
// 替换单引号为双引号
outputStr = strings.Replace(outputStr, "'", "\"", -1)
type VerifyData struct {
PurchaseState int `json:"purchaseState"`
DeveloperPayload string `json:"developerPayload"`
OrderId string `json:"orderId"`
ConsumptionState int `json:"consumptionState"`
}
r := &VerifyData{}
err = json.Unmarshal([]byte(outputStr), &r)
if err != nil {
log.Debug("output %s", string(output))
return nil, err
}
_, err = db.GetPlayerPayChannelOrderId(r.OrderId)
if err == nil {
return nil, fmt.Errorf("订单已支付发货 param: %v", r)
}
// if r.DeveloperPayload != OrderSn {
// return nil, fmt.Errorf("订单号不匹配")
// }
if r.ConsumptionState != 1 {
return nil, fmt.Errorf("订单未消费")
}
Order.PayStatus = MergeConst.ORDER_STATUS_PAY
Order.PayChannelOrderId = r.OrderId
Order.PayTime = GoUtil.Now()
return Order, nil
}
func (p *Player) CancelOrder(OrderSn string) error {
Order, err := db.GetPlayerChargeData(OrderSn)
if err != nil {
return err
}
if Order.PayStatus != MergeConst.ORDER_STATUS_IDLE {
return fmt.Errorf("订单已支付")
}
Order.PayStatus = MergeConst.ORDER_STATUS_CANCEL
err = db.UpdatePlayerChargeData(Order)
if err != nil {
return err
}
return nil
}

View File

@ -1,5 +1,6 @@
package game
// 补偿脚本
import (
"server/game/mod/compensation"
"server/game/mod/mail"

View File

@ -0,0 +1,156 @@
package game
import (
"server/GoUtil"
"server/db"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
"sort"
)
func (p *Player) GetVisitorPlayer() int {
PlayroomMod := p.PlayMod.getPlayroomMod()
VisitorList := PlayroomMod.GetVisitor() // 到访用户
TodayVisitedUsers := PlayroomMod.GetTodayVisitedUsers() // 今日已互动用户
FriendMod := p.PlayMod.getFriendMod()
type sortData struct {
Uid int
Time int64
}
PlayerList := make([]sortData, 0)
PlayerList2 := make([]sortData, 0)
Now := GoUtil.Now()
/**
排除当日玩家已对其发起过交互的用户
优先选择24小时内曾经与玩家进行过宠物交互的好友
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的好友
若不存在符合条件的用户则选择24小时内曾经与玩家进行过宠物交互的陌生用户
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的用户
若不存在符合条件的用户则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
若不存在符合条件的用户则依据以上用户推荐算法选择一位随机推荐用户并且在下次触发式订单完成时不再排除已发起过交互的用户
*/
for k, v := range VisitorList {
if GoUtil.InArray(k, TodayVisitedUsers) {
continue
}
if v.Time < Now-86400 {
continue
}
if FriendMod.CheckFriend(k) {
PlayerList = append(PlayerList, sortData{k, v.Time})
} else {
PlayerList2 = append(PlayerList, sortData{k, v.Time})
}
}
if len(PlayerList) != 0 {
sort.Slice(PlayerList, func(i, j int) bool {
return PlayerList[i].Time < PlayerList[j].Time
})
return PlayerList[0].Uid
}
if len(PlayerList2) != 0 {
sort.Slice(PlayerList2, func(i, j int) bool {
return PlayerList2[i].Time < PlayerList2[j].Time
})
return PlayerList2[0].Uid
}
// 若不存在符合条件的用户则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
var recentFriendUid int
var recentLoginTime int64 = 0
for uid := range FriendMod.GetFriendList() {
if uid == int(p.M_DwUin) {
continue
}
if GoUtil.InArray(uid, TodayVisitedUsers) {
continue
}
ps := G_GameLogicPtr.GetSimplePlayerByUid(uid)
if ps == nil {
continue
}
if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过
continue
}
if ps.Loginout > recentLoginTime {
recentLoginTime = ps.Loginout
recentFriendUid = uid
}
}
if recentFriendUid != 0 {
return recentFriendUid
}
PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
PlayerList4 := make([]int, 0)
for _, v := range PlayerList3 {
if v.Uid == int(p.M_DwUin) {
continue
}
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if PlayerSimpleData.Level < 15 {
continue
}
PlayerList4 = append(PlayerList4, v.Uid)
}
L := GoUtil.RandSliceNum(PlayerList4, 1)
if len(L) == 0 {
return 0
}
return L[0]
}
func GetRecommendPlayer(p *Player, Num int) []int {
PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
PlayerList1 := make([]int, 0)
FriendMod := p.PlayMod.getFriendMod()
for _, v := range PlayerList {
if v.Uid == int(p.M_DwUin) {
continue
}
if FriendMod.CheckSendApply(v.Uid) {
continue
}
if FriendMod.CheckFriend(v.Uid) {
continue
}
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 {
continue
}
if PlayerSimpleData.Level < 4 {
continue
}
PlayerList1 = append(PlayerList1, v.Uid)
}
if len(PlayerList1) == 0 {
for _, v := range PlayerList {
if v.Uid == int(p.M_DwUin) {
continue
}
PlayerList1 = append(PlayerList1, v.Uid)
}
}
return GoUtil.RandSliceNum(PlayerList1, Num)
}
func GetUidByFaceBook(Fb string) (int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE FaceBookId = ?"
type Result struct {
Uid int `db:"dwUin"`
}
R := Result{}
err := db.SqlDb.Get(&R, sqlStr, Fb)
log.Debug("Fb :%s;Uid :%d", Fb, R.Uid)
return R.Uid, err
}
func NotifyAllFriend(p *Player, m1 *msg.Msg) {
m := m1.Clone()
FriendMod := p.PlayMod.getFriendMod()
for k := range FriendMod.GetFriendList() {
if k == int(p.M_DwUin) {
continue
}
m.To = k
FriendMgrSend(m)
}
}

View File

@ -83,6 +83,7 @@ func (f *FriendMgr) Init() {
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_REFUSE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_GROWTH, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE_DEL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_SEND_EMOJI, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_KISS, f.sendToPlayerOnline)
f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayer)

View File

@ -75,7 +75,6 @@ type GameLogic struct {
NotInitPlayer *Player
Version int32
M_SvrGlobal db.SqlSvrGlobalStruct
MHttpManager *HttpManager
SeverInfo *ServerInfo
MLogManager *LogMgr // 日志管理器
@ -655,7 +654,7 @@ func (ad *GameLogic) ReplaceExistPlayerAndAgent(a gate.Agent, player *Player) er
if ok {
Timer.Stop()
}
SyncFriendMsg(player)
player.SyncFriendMsg()
log.Debug("player %d 重连", player.M_DwUin)
return nil
}
@ -761,9 +760,9 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqCreatePetOrder", ReqCreatePetOrder) // 生成消耗品订单
//装饰
RegisterMsgProcessFunc("ReqDecorate", ReqDecorate) // 装饰
RegisterMsgProcessFunc("ReqDecorateAll", ReqDecorateAll) // 装饰全部
RegisterMsgProcessFunc("ReqDecorateReward", ReqDecorateReward) // 装饰全部
RegisterMsgProcessFunc("ReqDecorate", ReqDecorate) // 装饰
RegisterMsgProcessFunc("ReqDecorateAll", ReqDecorateAll) // 装饰全部
RegisterMsgProcessFunc("ReqAreaReward", ReqAreaReward) // 章节奖励
//Gm命令
RegisterMsgProcessFunc("ReqGmCommand", ReqGmCommand) // Gm命令
@ -949,15 +948,6 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqChargeReceive", ReqChargeReceive) // 礼包回复邮件
}
func (ad *GameLogic) CreateHttpManager() {
go func() {
ad.MHttpManager = new(HttpManager)
ad.MHttpManager.InitRounter()
}()
}
func (ad *GameLogic) CreateLogManager() {
ad.MLogManager = new(LogMgr)
ad.MLogManager.InitManager()

View File

@ -144,7 +144,7 @@ func ReqGmCommand_(player *Player, Command string) error {
"CreateTime": GoUtil.Now(),
"PayTime": GoUtil.Now(),
})
Charge(player, ChargeId)
player.Charge(ChargeId)
case "AddPart":
ChessMod := player.PlayMod.getChessMod()
ChessMod.PartBag.List[1505] = chess.PartBagGrid{
@ -183,7 +183,7 @@ func ReqGmCommand_(player *Player, Command string) error {
AddTime: Now,
}
}
BackUserInfo(player)
player.BackUserInfo()
case "resetFace":
FaceMod := player.PlayMod.getFaceMod()
FaceMod.List = nil
@ -283,25 +283,30 @@ func ReqGmCommand_(player *Player, Command string) error {
case "miningReload":
MiningMod := player.PlayMod.getMiningMod()
MiningMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_MINING)
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_MINING)
MiningMod.ZeroUpdate(ActivityInfo.Id)
MiningBackData(player)
player.MiningBackData()
case "catnipReload":
CatnipMod := player.PlayMod.getCatnipMod()
CatnipMod.ZeroUpdate(-1)
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_CATNIP)
CatnipMod.ZeroUpdate(ActivityInfo.Id)
case "guessColorReload":
GuessColorMod := player.PlayMod.getGuessColorMod()
GuessColorMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_GUESS_COLOR)
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod.ZeroUpdate(ActivityInfo.Id)
GuessColorBackData(player)
player.GuessColorBackData()
case "raceReload":
RaceMod := player.PlayMod.getRaceMod()
RaceMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_RACE)
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_RACE)
RaceMod.ZeroUpdate(ActivityInfo.Id)
RaceBackData(player)
player.RaceBackData()
case "raceAdd":
RaceMod := player.PlayMod.getRaceMod()
RaceMod.AddCoin(100)
RaceBackData(player)
player.RaceBackData()
case "playroomReset":
PlayroomMod := playroom.PlayroomMod{}
PlayroomMod.InitData()
@ -326,7 +331,7 @@ func ReqGmCommand_(player *Player, Command string) error {
Part := playroomCfg.GetDressPart(v)
PlayroomMod.UnlockDress(Part, v)
}
PlayroomBackData(player)
player.PlayroomBackData()
case "playroomAir":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.NewPetAir = make(map[int]*playroom.PetAirInfo, 0)
@ -334,7 +339,7 @@ func ReqGmCommand_(player *Player, Command string) error {
for _, v := range AirList {
PlayroomMod.UnlockPetAir(v)
}
PlayroomBackData(player)
player.PlayroomBackData()
case "resetRetire":
ChessMod := player.PlayMod.getChessMod()
ChessMod.Retire = make(map[string]int)
@ -347,11 +352,11 @@ func ReqGmCommand_(player *Player, Command string) error {
PlayroomMod := player.PlayMod.getPlayroomMod()
Num, _ := strconv.Atoi(arg[1])
PlayroomMod.RoomPoint += Num
PlayroomBackData(player)
player.PlayroomBackData()
case "resetPlayroomUnlock":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.UnlockList = make(map[int]int64)
PlayroomBackData(player)
player.PlayroomBackData()
case "addChip":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.AddChip(100100001, 1, 0)
@ -373,8 +378,8 @@ func ReqGmCommand_(player *Player, Command string) error {
FriendMod.Id = 0
FriendMod.Log = make([]*friend.LogInfo, 0)
FriendMod.InitData()
FriendListBackData(player)
FriendLogBackData(player)
player.FriendListBackData()
player.FriendLogBackData()
case "addFriend":
FriendMod := player.PlayMod.getFriendMod()
Uid, _ := strconv.Atoi(arg[1])
@ -400,7 +405,7 @@ func ReqGmCommand_(player *Player, Command string) error {
case "comfortOrder":
BaseMod := player.PlayMod.getBaseMod()
BaseMod.LogoutTime = GoUtil.Now() - 7*86400
TriggerComfortOrder(player)
player.TriggerComfortOrder()
player.PushClientRes(player.PlayMod.getOrderMod().BackData())
case "resetGuide":
GuildMod := player.PlayMod.getGuideMod()
@ -476,7 +481,7 @@ func ReqGmCommand_(player *Player, Command string) error {
case "resetNpc":
FriendMod := player.PlayMod.getFriendMod()
FriendMod.Npc = []int{}
FriendListBackData(player)
player.FriendListBackData()
case "recoverUser":
file, err := os.OpenFile(conf.Server.GameConfPath+"user.info", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
@ -543,11 +548,11 @@ func ReqGmCommand_(player *Player, Command string) error {
player.ChargeBackData()
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.WeeklyDiscount = make(map[int]int)
PlayroomBackData(player)
player.PlayroomBackData()
case "resetCode":
BaseMod := player.PlayMod.getBaseMod()
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
BackUserInfo(player)
player.BackUserInfo()
default:
return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg)
}

View File

@ -1,60 +0,0 @@
package game
import (
"fmt"
"net/http"
"server/conf"
// "server/msg"
"github.com/gorilla/mux"
)
type HttpManager struct {
Rounter *mux.Router
}
func (p *HttpManager) InitRounter() {
p.Rounter = mux.NewRouter()
p.InitFriendRouter()
p.InitPlayerProfileInfo()
http.ListenAndServe(conf.Server.HttpPort, p.Rounter)
}
func (p *HttpManager) InitFriendRouter() {
bs := p.Rounter.PathPrefix("/Friend").Subrouter()
bs.HandleFunc("/Add/{SenderId}/{ReceiveId}", p.AddFriend)
bs.HandleFunc("/Del/{SenderId}/{ReceiveId}", p.DeleteFriend)
}
func (p *HttpManager) InitPlayerProfileInfo() {
bs := p.Rounter.PathPrefix("/Profile").Subrouter()
bs.HandleFunc("/GetBrief/{Id}", p.GetPlayerProfileInfo)
}
func (p *HttpManager) GetPlayerProfileInfo(w http.ResponseWriter, r *http.Request) {
}
func (p *HttpManager) AddFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
SenderId, ok := vars["SenderId"]
if ok {
fmt.Println("AddFreind SenderId:" + SenderId)
}
ReceiveId, ok1 := vars["ReceiveId"]
if ok1 {
fmt.Println("AddFreind ReceiveId:" + ReceiveId)
}
}
func (p *HttpManager) DeleteFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, ok := vars["id"]
if !ok {
fmt.Println("id is missing in parameters")
}
fmt.Println(`id := `, id)
}

View File

@ -16,7 +16,7 @@ import (
)
// 限时事件触发器
func LimitedTimeEventTrigger(p *Player, AddEventId int) {
func (p *Player) LimitedTimeEventTrigger(AddEventId int) {
Lv := p.GetPlayerBaseMod().GetLevel()
EndTime, TimeoutEvent, AddEvent := p.PlayMod.getLimitedTimeEventMod().Trigger(Lv)
remainingTime := GoUtil.NextHourRemain()
@ -28,7 +28,7 @@ func LimitedTimeEventTrigger(p *Player, AddEventId int) {
p.CallEvent(time.Duration(EndTime)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeEventTrigger(p, 0)
p.LimitedTimeEventTrigger(0)
p.SendClientRes()
}, "LimitedTimeEvent")
}
@ -62,7 +62,7 @@ func LimitedTimeEventTrigger(p *Player, AddEventId int) {
p.PlayMod.getCardMod().ResetCardFestival()
case limitedTimeEvent.EVENT_TYPE_GOLDCARD_EX:
p.PlayMod.getFriendMod().ResetGoldCardEx()
LimitedTimeCardTrigger(p)
p.LimitedTimeCardTrigger()
}
}
@ -92,13 +92,13 @@ func LimitedTimeEventTrigger(p *Player, AddEventId int) {
}
// 限时猪猪存钱罐触发器
func LimitedTimePiggyBankTrigger(p *Player) {
func (p *Player) LimitedTimePiggyBankTrigger() {
Remain := p.PlayMod.getPiggyBankMod().TimeOut()
if Remain > 0 {
p.CallEvent(time.Duration(Remain)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimePiggyBankTrigger(p)
p.LimitedTimePiggyBankTrigger()
p.SendClientRes()
}, "PiggyBank")
}
@ -106,7 +106,7 @@ func LimitedTimePiggyBankTrigger(p *Player) {
}
// 限时卡牌触发器
func LimitedTimeCardTrigger(p *Player) {
func (p *Player) LimitedTimeCardTrigger() {
FriendMod := p.PlayMod.getFriendMod()
CardMod := p.PlayMod.getCardMod()
Now := GoUtil.Now()
@ -140,21 +140,21 @@ func LimitedTimeCardTrigger(p *Player) {
p.CallEvent(time.Duration(EndTime-Now)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeCardTrigger(p)
p.LimitedTimeCardTrigger()
p.SendClientRes()
}, "LimitedTimeCard")
}
}
func LimitedTimePlayroomTrigger(p *Player) {
func (p *Player) LimitedTimePlayroomTrigger() {
PlayroomMod := p.PlayMod.getPlayroomMod()
for k, v := range PlayroomMod.Physiology {
if v.Time > 0 {
LimitedTimePlayroomTrigger_(p, k)
p.LimitedTimePlayroomTrigger_(k)
}
}
}
func LimitedTimePlayroomTrigger_(p *Player, Id int) {
func (p *Player) LimitedTimePlayroomTrigger_(Id int) {
PlayroomMod := p.PlayMod.getPlayroomMod()
Physiology := PlayroomMod.GetPhysiology(Id)
if Physiology == nil {
@ -183,7 +183,7 @@ func LimitedTimePlayroomTrigger_(p *Player, Id int) {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimePlayroomTrigger_(p, Id)
p.LimitedTimePlayroomTrigger_(Id)
p.SendClientRes()
}, fmt.Sprintf("Playroom_%d", Id))
}
@ -223,7 +223,7 @@ func LimitedTimePlayroomWorkTrigger(p *Player) {
if EndTime > 0 && EndTime <= Now {
PlayroomMod.ResetWork()
p.PlayMod.save()
PlayroomBackData(p)
p.PlayroomBackData()
p.SendClientRes()
return
}

View File

@ -6,6 +6,7 @@ import (
kafkaMiddleware "server/middleware/kafka"
"server/pkg/github.com/name5566/leaf/log"
"sync"
"sync/atomic"
"time"
)
@ -18,7 +19,7 @@ const (
PLAYROOM_LOST = "playroom_lost"
// 增大缓冲:针对 ~1000 条/s保留足够秒数的缓冲可按需调整
LOG_LENGTH = 100000
WORKER_COUNT = 16
WORKER_COUNT = 500
)
type LogMgr struct {
@ -40,20 +41,35 @@ type Log struct {
}
func (L *LogMgr) InitManager() {
// 初始化通道与启动 worker 循环写入 kafka
// 初始化通道
L.L = make(chan *Log, LOG_LENGTH)
// 启动 worker允许基于 CPU 动态扩展)
workerCount := WORKER_COUNT
if cpuWorkers := runtime.NumCPU() * 2; cpuWorkers > workerCount {
workerCount = cpuWorkers
// 动态协程池参数
maxWorkers := WORKER_COUNT
if cpuWorkers := runtime.NumCPU() * 2; cpuWorkers > maxWorkers {
maxWorkers = cpuWorkers
}
for i := 0; i < workerCount; i++ {
minWorkers := 100
idleTimeout := 500 * time.Millisecond
var activeWorkers int32
// worker 启动函数
spawnWorker := func() {
L.wg.Add(1)
atomic.AddInt32(&activeWorkers, 1)
go func() {
defer L.wg.Done()
for v := range L.L {
// 如果 kafka 未就绪,尝试重入队列并等待一小段时间(缩短等待)
defer atomic.AddInt32(&activeWorkers, -1)
for {
// 首先阻塞等待一个任务(若 channel 关闭则退出)
v, ok := <-L.L
if !ok {
return
}
// 处理消息(与原来逻辑一致)
value, _ := json.Marshal(v)
if kafkaMiddleware.KafkaMod == nil {
// 尝试非阻塞重入,否则丢弃最旧再试一次
select {
@ -69,33 +85,115 @@ func (L *LogMgr) InitManager() {
}
}
time.Sleep(10 * time.Millisecond)
continue
}
value, _ := json.Marshal(v)
if err := kafkaMiddleware.SendMsg([]byte(v.EventName), value); err != nil {
log.Debug("kafka log send err:%s", err.Error())
// 发送失败,尝试将消息放回通道(非阻塞策略)
select {
case L.L <- v:
default:
// 通道满,丢弃最旧一条后再尝试一次入队
select {
case <-L.L:
default:
}
} else {
if err := kafkaMiddleware.SendMsg([]byte(v.EventName), value); err != nil {
log.Debug("kafka log send err:%s", err.Error())
select {
case L.L <- v:
default:
// 放不下则丢弃
select {
case <-L.L:
default:
}
select {
case L.L <- v:
default:
}
}
time.Sleep(10 * time.Millisecond)
}
}
// 快速循环处理后续可用任务,若超时则退出该 worker回收
timer := time.NewTimer(idleTimeout)
for {
select {
case v, ok := <-L.L:
if !ok {
if !timer.Stop() {
<-timer.C
}
return
}
// 处理消息
value, _ := json.Marshal(v)
if kafkaMiddleware.KafkaMod == nil {
select {
case L.L <- v:
default:
select {
case <-L.L:
default:
}
select {
case L.L <- v:
default:
}
}
time.Sleep(10 * time.Millisecond)
} else {
if err := kafkaMiddleware.SendMsg([]byte(v.EventName), value); err != nil {
log.Debug("kafka log send err:%s", err.Error())
select {
case L.L <- v:
default:
select {
case <-L.L:
default:
}
select {
case L.L <- v:
default:
}
}
time.Sleep(10 * time.Millisecond)
}
}
// 重置定时器以继续快速处理
if !timer.Stop() {
<-timer.C
}
timer.Reset(idleTimeout)
case <-timer.C:
timer.Stop()
// 空闲超时,退出该 worker
return
}
// 缩短退避,避免快速循环阻塞
time.Sleep(10 * time.Millisecond)
}
}
}()
}
// 启动初始最小 worker 数量
for i := 0; i < minWorkers; i++ {
spawnWorker()
}
// 监督器:动态根据队列长度扩展 worker但不超过 maxWorkers
go func() {
ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
L.Lock.Lock()
closing := L.closing
L.Lock.Unlock()
if closing {
return
}
backlog := len(L.L)
active := int(atomic.LoadInt32(&activeWorkers))
if backlog > active && active < maxWorkers {
toSpawn := backlog - active
remain := maxWorkers - active
if toSpawn > remain {
toSpawn = remain
}
for i := 0; i < toSpawn; i++ {
spawnWorker()
}
}
}
}()
}
func (L *LogMgr) AddLog(logs *Log) {

View File

@ -1,15 +1,11 @@
package game
import (
"encoding/json"
"fmt"
"os/exec"
"server/GoUtil"
"server/MergeConst"
mergeCluster "server/cluster"
"server/conf"
cardCfg "server/conf/card"
chargeCfg "server/conf/charge"
catnipCfg "server/conf/catnip"
decorateCfg "server/conf/decorate"
itemCfg "server/conf/item"
limitedTimeEventCfg "server/conf/limitedTimeEvent"
@ -18,7 +14,6 @@ import (
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom"
userCfg "server/conf/user"
"server/db"
"server/game/mod/activity"
"server/game/mod/card"
"server/game/mod/friend"
@ -31,11 +26,10 @@ import (
proto "server/msg"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"strings"
)
// 处理玩家异步请求
func HandleMsg(p *Player, m *msg.Msg) {
func (p *Player) HandleMsg(m *msg.Msg) {
p.lock.Lock() //加锁
backup := p.BackUp() // 备份当前的 Player 值
defer func() {
@ -46,7 +40,7 @@ func HandleMsg(p *Player, m *msg.Msg) {
p.lock.Unlock() //解锁
}()
p.args = make(map[string]interface{})
err := handle(p, m)
err := p.handle(m)
if err != nil {
log.Debug("uid : %d, err : %s", p.M_DwUin, err)
p.Recover(backup) //还原Player的数据
@ -57,10 +51,72 @@ func HandleMsg(p *Player, m *msg.Msg) {
}
// 消息处理
func handle(p *Player, m *msg.Msg) error {
func (p *Player) handle(m *msg.Msg) error {
switch m.Type {
case msg.HANDLE_TYPE_DEL, msg.HANDLE_TYPE_APPLY, msg.HADNLE_TYPE_AGREE, msg.HANDLE_TYPE_REQ_CARD, msg.HANDLE_TYPE_REFUSE:
return HandleFriendMsg(p, m)
case msg.HANDLE_TYPE_APPLY: // 好友申请
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddFriendApply(m.From)
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_APPLY, "", m.SendT)
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_APPLY,
Time: int32(GoUtil.Now()),
})
case msg.HADNLE_TYPE_AGREE: // 同意好友申请
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AgreeApply(m.From)
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_AGREE,
Time: int32(GoUtil.Now()),
})
PlayroomMod := p.PlayMod.getPlayroomMod()
BaseMod := p.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
p.PlayroomBackData()
p.TeLog("friend_add", map[string]interface{}{
"player_id": m.From,
"add_type": "接受申请",
})
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_BECOME, "", m.SendT)
case msg.HANDLE_TYPE_DEL: // 删除好友
FriendMod := p.PlayMod.getFriendMod()
FriendMod.DelFriend(m.From)
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_APPLY, "", m.SendT)
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_DEL,
Time: int32(GoUtil.Now()),
})
case msg.HANDLE_TYPE_REFUSE: // 拒绝好友申请
FriendMod := p.PlayMod.getFriendMod()
FriendMod.RefuseApply(m.From)
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_REFUSE,
Time: int32(GoUtil.Now()),
})
case msg.HANDLE_TYPE_REQ_CARD: // 卡牌申请
FriendMod := p.PlayMod.getFriendMod()
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
FriendMod.SetCardInfo(&CardInfo)
p.PushClientRes(
&proto.NotifyFriendCard{
Info: GetCardInfoMsg(&CardInfo),
},
)
case msg.HANDLE_TYPE_FACEBOOK_UNBIND: // facebook解绑
FaceMod := p.PlayMod.getFaceMod()
if FaceMod.SetId == 0 {
FaceMod.SetId = 2
}
case msg.SERVER_ZERO_UPDATE:
p.ZeroUpdate(nil)
case msg.SERVER_NOON_UPDATE:
@ -74,7 +130,7 @@ func handle(p *Player, m *msg.Msg) error {
PlayroomMod := p.PlayMod.getPlayroomMod()
BaseMod := p.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(p)
p.PlayroomBackData()
p.TeLog("friend_add", map[string]interface{}{
"player_id": m.From,
"add_type": "发起申请",
@ -114,7 +170,10 @@ func handle(p *Player, m *msg.Msg) error {
p.PushClientRes(CardMod.NotifyCard())
p.PushClientRes(CardMod.NotifyTimes())
case msg.HANDLE_TYPE_REG_CARD_FINISH, msg.HANDLE_TYPE_AGREE_CARD_FAIL: // B收到A的请求已结束
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
FriendMod := p.PlayMod.getFriendMod()
FriendMod.DelCardInfo(CardInfo.Id)
p.PushClientRes(
@ -124,7 +183,10 @@ func handle(p *Player, m *msg.Msg) error {
)
p.PlayMod.save()
case msg.HANDLE_TYPE_AGREE_CARD: // A收到B同意卡牌
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
CardMod := p.PlayMod.getCardMod()
OtherUid, err := CardMod.DelRequestCard(CardInfo.BUid)
FriendMod := p.PlayMod.getFriendMod()
@ -149,7 +211,10 @@ func handle(p *Player, m *msg.Msg) error {
)
p.PushClientRes(CardMod.NotifyTimes())
case msg.HANDLE_TYPE_REG_CARD_REFUSE: // A收到B拒绝索要卡牌
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
CardMod := p.PlayMod.getCardMod()
CardMod.DelRequestCard(CardInfo.BUid)
CardMod.AddReqTimes(CardInfo.Id, CardInfo.StartTime)
@ -158,7 +223,10 @@ func handle(p *Player, m *msg.Msg) error {
p.PushClientRes(CardMod.NotifyCard())
case msg.HANDLE_TYPE_EX_CARD: // B收到A置换卡牌
FriendMod := p.PlayMod.getFriendMod()
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
FriendMod.SetCardInfo(&CardInfo)
FriendMod.Interact(CardInfo.AUid, friend.INTERACT_TYPE_EX, m.SendT)
p.PlayMod.save()
@ -169,7 +237,10 @@ func handle(p *Player, m *msg.Msg) error {
)
case msg.HANDLE_TYPE_SELECT_EX_CARD: // A收到B选择卡牌进行置换
FriendMod := p.PlayMod.getFriendMod()
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
FriendMod.SetCardInfo(&CardInfo)
// p.AddLog(int(p.M_DwUin), friend.LOG_TYPE_CARD_SELECT_GET, fmt.Sprintf("%d", CardInfo.CardId))
p.PlayMod.save()
@ -179,7 +250,10 @@ func handle(p *Player, m *msg.Msg) error {
},
)
case msg.HANDLE_TYPE_ARGREE_EX_CARD: // B收到A同意置换卡牌
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
FriendMod := p.PlayMod.getFriendMod()
FriendMod.SetCardInfo(&CardInfo)
p.PushClientRes(
@ -190,7 +264,10 @@ func handle(p *Player, m *msg.Msg) error {
p.PlayMod.save()
case msg.HANDLE_TYPE_REFUSE_SELECT_CARD: // A收到B拒绝置换卡牌
CardMod := p.PlayMod.getCardMod()
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
CardMod.AddExTimes(&CardInfo)
p.AddCard(CardInfo.CardId)
CardMod.DelExCard(&CardInfo)
@ -199,7 +276,10 @@ func handle(p *Player, m *msg.Msg) error {
p.PlayMod.save()
case msg.HANDLE_TYPE_REFUSE_EX_CARD: // B收到A拒绝置换卡牌
CardMod := p.PlayMod.getCardMod()
CardInfo := m.Extra.(card.CardInfo)
CardInfo, ok := m.Extra.(card.CardInfo)
if !ok {
return nil
}
p.AddCard(CardInfo.ExId)
FriendMod := p.PlayMod.getFriendMod()
FriendMod.DelCardInfo(CardInfo.Id)
@ -209,9 +289,9 @@ func handle(p *Player, m *msg.Msg) error {
p.PlayMod.save()
p.PushClientRes(CardMod.NotifyCard())
case msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY: // # 锦标赛排名变动通知
BackChampship(p)
p.BackChampship()
case msg.HANDLE_TYPE_CHAMPSHIP_RESULT: // # 好友锦标赛结果
Extra := m.Extra.([]int)
Extra := GoUtil.IntSlice(m.Extra)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CHAMPSHIP, fmt.Sprintf("%d_%d", Extra[0], Extra[1]), m.SendT)
case msg.HANDLE_TYPE_TREASURE_RESULT: // # 好友宝藏结果
//p.AddLog(m.From, friend.LOG_TYPE_TREASURE, fmt.Sprintf("%d", m.Extra.(int)), m.SendT)
@ -265,9 +345,9 @@ func handle(p *Player, m *msg.Msg) error {
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, fmt.Sprintf("%d", Emoji), m.SendT)
FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT)
case msg.FRIEND_TREASURE_HANDLE: // # 好友宝藏
Items := make([]*item.Item, 0)
if m.Extra != nil {
Items = m.Extra.([]*item.Item)
Items, ok := m.Extra.([]*item.Item)
if !ok {
Items = []*item.Item{}
}
p.AddLog(m.From, friend.LOG_TYPE_TREASURE_HELP, "", m.SendT)
p.HandleItem(Items, proto.ITEM_POP_LABEL_Friendtreasure.String())
@ -285,21 +365,21 @@ func handle(p *Player, m *msg.Msg) error {
FriendMod.Interact(m.From, friend.INTERACT_TYPE_UPVOTE, m.SendT)
p.AddLog(m.From, friend.LOG_TYPE_HANDBOOK_UPVOTE, "", m.SendT)
case msg.HANDLE_TYPE_SEND_CHARGE: // 收到好友赠送的充值礼包
C := &ChargeExtra{}
if m.Extra != nil {
C = m.Extra.(*ChargeExtra)
C, ok := m.Extra.(*ChargeExtra)
if !ok {
C = &ChargeExtra{}
}
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
MailMod := p.PlayMod.getMailMod()
mt, mc, mt_en, mc_en := mailCfg.GetChargeSendMail(PlayerSimpleData.Name)
Items := ChargeItem(p, C.ChargeId)
Items := p.ChargeItem(C.ChargeId)
MailId := MailMod.Send(mt, "", mc, mt_en, "", mc_en, Items, mail.MAIL_TYPE_GIFT)
p.AddLog(m.From, friend.LOG_TYPE_CHARGE_SEND, fmt.Sprintf("%d", MailId), m.SendT)
p.PushClientRes(MailMod.NotifyMail(MailId))
case msg.HANDLE_TYPE_CHARGE_RECEIVE: // 收到好友的感谢信
Content := ""
if m.Extra != nil {
Content = m.Extra.(string)
Content, ok := m.Extra.(string)
if !ok {
Content = ""
}
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
MailMod := p.PlayMod.getMailMod()
@ -326,63 +406,77 @@ func handle(p *Player, m *msg.Msg) error {
p.NotifyPlayroomKiss()
case msg.HANDLE_TYPE_CATNIP_INVITE: // 邀请好友参与猫咪游戏
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsg := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
CatnipMsg, ok := m.Extra.(CatnipMsg)
if !ok {
return nil
}
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.BeInvited(CatnipMsg.GameId, int(m.From), m.SendT)
CatnipMod.BeInvited(int(m.From), m.SendT)
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddReplyInfo(m.From, friend.REPLY_TYPE_CATNIP, fmt.Sprintf("%d", CatnipMsg.GameId), m.End)
FriendMod.AddReplyInfo(m.From, friend.REPLY_TYPE_CATNIP, fmt.Sprintf("%d", CatnipMsg.GameId), m.End, nil)
case msg.HANDLE_TYPE_CATNIP_AGREE: // 同意好友参与猫咪游戏
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsgInfo := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsgInfo.ActivityId { // 活动ID不匹配
CatnipMsg, ok := m.Extra.(CatnipMsg)
if !ok {
return nil
}
UserList, _ := CatnipMod.Agree(CatnipMsgInfo.GameId, int(m.From))
for _, v := range UserList {
FriendMgrSend(&msg.Msg{
From: int(p.M_DwUin),
To: int(v),
Type: msg.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(CatnipMsgInfo.GameId),
},
SendT: GoUtil.Now(),
})
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.BeAgree(CatnipMsg.GameId, int(m.From))
case msg.HANDLE_TYPE_CATNIP_AGREE_DEL: // 同意好友参与猫咪游戏后删除邀请
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsg := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
CatnipMsg, ok := m.Extra.(CatnipMsg)
if !ok {
return nil
}
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.DelInvited(CatnipMsg.GameId, int(m.From))
case msg.HANDLE_TYPE_CATNIP_REFUSE: // 拒绝好友参与猫咪游戏
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsg := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
CatnipMsg, ok := m.Extra.(CatnipMsg)
if !ok {
return nil
}
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.DelInvited(CatnipMsg.GameId, int(m.From))
case msg.HANDLE_TYPE_CATNIP_GROWTH:
CatnipMod := p.PlayMod.getCatnipMod()
CatnipGrowthInfo := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipGrowthInfo.ActivityId { // 活动ID不匹配
CatnipMsg, ok := m.Extra.(CatnipMsg)
if !ok {
return nil
}
CatnipMod.Growth(CatnipGrowthInfo.GameId, CatnipGrowthInfo.Growth)
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.GrowthByUid(m.From, CatnipMsg.Growth)
if CatnipMsg.FriendItems > 0 {
Items := catnipCfg.GetItemCost(ActivityId, CatnipMsg.FriendItems)
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddReplyInfo(m.From, friend.REPLY_TYPE_CATNIP_ITEMS, "", m.End, Items)
}
p.CatnipBackData()
case msg.HANDLE_TYPE_CATNIP_SEND_EMOJI:
CatnipMod := p.PlayMod.getCatnipMod()
EmojiId := GoUtil.Int(m.Extra)
CatnipMod.SetEmoji(m.From, EmojiId)
p.CatnipBackData()
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, GoUtil.Now()+24*3600)
FriendLogBackData(p)
FriendMod.AddReplyInfo(v.Uid, v.Type, v.Param, GoUtil.Now()+24*3600, nil)
p.FriendLogBackData()
}
case msg.HANDLE_TYPE_FRIEND_SPONSOER:
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_SPONSOR_GET, "", m.SendT)
@ -393,75 +487,8 @@ func handle(p *Player, m *msg.Msg) error {
return nil
}
// 处理系统请求
func HandleServerMsg(p *Player, msg *msg.Msg) error {
return nil
}
// 处理好友请求
func HandleFriendMsg(p *Player, m *msg.Msg) error {
FriendMod := p.PlayMod.getFriendMod()
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
switch m.Type {
case msg.HANDLE_TYPE_APPLY: // 好友申请
FriendMod.AddFriendApply(m.From)
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_APPLY, "", m.SendT)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_APPLY,
Time: int32(GoUtil.Now()),
})
case msg.HADNLE_TYPE_AGREE: // 同意好友申请
FriendMod.AgreeApply(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_AGREE,
Time: int32(GoUtil.Now()),
})
PlayroomMod := p.PlayMod.getPlayroomMod()
BaseMod := p.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(p)
p.TeLog("friend_add", map[string]interface{}{
"player_id": m.From,
"add_type": "接受申请",
})
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_BECOME, "", m.SendT)
case msg.HANDLE_TYPE_DEL: // 删除好友
FriendMod.DelFriend(m.From)
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_APPLY, "", m.SendT)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_DEL,
Time: int32(GoUtil.Now()),
})
case msg.HANDLE_TYPE_REFUSE: // 拒绝好友申请
FriendMod.RefuseApply(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{
Player: PlayerSimpleData,
Type: friend.FRIEND_NOTIFY_REFUSE,
Time: int32(GoUtil.Now()),
})
case msg.HANDLE_TYPE_REQ_CARD: // 卡牌申请
CardInfo := m.Extra.(card.CardInfo)
FriendMod.SetCardInfo(&CardInfo)
p.PushClientRes(
&proto.NotifyFriendCard{
Info: GetCardInfoMsg(&CardInfo),
},
)
case msg.HANDLE_TYPE_FACEBOOK_UNBIND: // facebook解绑
FaceMod := p.PlayMod.getFaceMod()
if FaceMod.SetId == 0 {
FaceMod.SetId = 2
}
}
p.PlayMod.save()
return nil
}
// 同步好友请求
func SyncFriendMsg(p *Player) {
func (p *Player) SyncFriendMsg() {
MsgList := G_GameLogicPtr.FriendMgrCall(&msg.Msg{Type: msg.HANDLE_TYPE_SYNC, From: int(p.M_DwUin)})
FriendMod := p.PlayMod.getFriendMod()
MsgId := FriendMod.GetSyncId()
@ -473,7 +500,7 @@ func SyncFriendMsg(p *Player) {
return
}
sort.Slice(ml, func(i, j int) bool {
return ml[i].SendT < ml[j].SendT
return ml[i].Id < ml[j].Id
})
maxId := int64(0)
for _, v := range ml {
@ -485,7 +512,7 @@ func SyncFriendMsg(p *Player) {
continue
}
log.Debug("uid : %d, handle friend msg : %v", p.M_DwUin, v)
handle(p, v)
p.handle(v)
v.H = 1
}
FriendMod.SetSyncId(maxId)
@ -514,103 +541,21 @@ func SyncMailMsg(p *Player) {
p.PushClientRes(MailMod.BackData())
}
// 返回好友信息
func FriendListBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
var fl []*proto.ResPlayerSimple
for k, v := range FriendMod.GetFriendList() {
if k == int(p.M_DwUin) {
continue
}
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
ps.AddTime = v.AddTime
ps.Interact = FriendMod.GetInteractTime(k)
fl = append(fl, ps)
}
}
ReqFriendList := make([]int64, 0)
for k := range FriendMod.SendApply {
ReqFriendList = append(ReqFriendList, int64(k))
}
p.PushClientRes(&proto.ResFriendList{
FriendList: fl,
ReqApplyList: ReqFriendList,
Npc: GoUtil.IntToInt32(FriendMod.GetNpc()),
Sponsor: int32(FriendMod.GetSponsor()),
})
}
func FriendApplyBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
var al []*proto.ResFriendApplyInfo
for k, v := range FriendMod.ApplyList {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
al = append(al, &proto.ResFriendApplyInfo{
Player: ps,
Time: int32(v),
})
}
}
p.PushClientRes(&proto.ResFriendApply{
ApplyList: al,
})
}
func FriendLogBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
var log []*proto.ResFriendLog
for _, v := range FriendMod.Log {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if ps == nil {
ps = &proto.ResPlayerSimple{
Uid: int64(v.Uid),
}
}
log = append(log, &proto.ResFriendLog{
Player: ps,
Type: int32(v.Type),
Time: int32(v.Time),
Param: v.Param,
Id: int32(v.Id),
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{
Log: log,
Reply: reply,
})
}
func FriendCardBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
var msgList []*proto.ResFriendCard
for _, v := range FriendMod.Card {
m := GetCardInfoMsg(v)
msgList = append(msgList, m)
}
p.PushClientRes(&proto.ResFriendCardMsg{
MsgList: msgList,
func (p *Player) CatnipGrowthMsg(To, Id, Growth, FriendItems int) error {
ActivityId := p.GetActivityId(activity.ACT_TYPE_CATNIP)
FriendMgrSend(&msg.Msg{
From: int(p.M_DwUin),
To: To,
Type: msg.HANDLE_TYPE_CATNIP_GROWTH,
SendT: GoUtil.Now(),
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: Id,
Growth: Growth,
FriendItems: FriendItems,
},
})
return nil
}
// 发送消息给玩家
@ -618,95 +563,6 @@ func ClusterSendMsg(ServerId int, m *msg.Msg) {
mergeCluster.SendServerMsg(m, ServerId)
}
// 创建订单
func CreateOrderSn(p *Player, req *proto.ReqCreateOrderSn) (string, error) {
Uid := int(p.M_DwUin)
OrderSn := GoUtil.CreateOrderSn(Uid)
Price, Currency := chargeCfg.GetChargeInfo(int(req.ChargeId))
Extra := &ChargeExtra{
Type: int(req.Type),
Uid: req.Uid,
}
ExtraData, _ := json.Marshal(Extra)
err := db.CreateOrderSn(Uid, int(req.ChargeId), OrderSn, req.PlatForm, req.Channel, Price, Currency, string(ExtraData))
if err != nil {
return "", err
}
return OrderSn, nil
}
func GoogleVerify(p *Player, OrderSn, ProduceId, Token string) (*db.SqlChargeOrderStruct, error) {
Order, err := db.GetPlayerChargeData(OrderSn)
if err != nil {
return nil, err
}
if Order.PayStatus == MergeConst.ORDER_STATUS_SHIP {
return nil, fmt.Errorf("订单已经发货")
}
if !conf.Server.GoogleVerify {
Order.PayStatus = MergeConst.ORDER_STATUS_PAY
return Order, nil
}
if Order.PayStatus != MergeConst.ORDER_STATUS_IDLE {
return nil, fmt.Errorf("订单已经支付")
}
cmd := exec.Command(conf.Server.AppPath+"/script/verifyOrder", ProduceId, Token)
// 获取命令的输出
output, err := cmd.Output()
if err != nil {
return nil, err
}
// 将输出转换为字符串
outputStr := string(output)
// 替换单引号为双引号
outputStr = strings.Replace(outputStr, "'", "\"", -1)
type VerifyData struct {
PurchaseState int `json:"purchaseState"`
DeveloperPayload string `json:"developerPayload"`
OrderId string `json:"orderId"`
ConsumptionState int `json:"consumptionState"`
}
r := &VerifyData{}
err = json.Unmarshal([]byte(outputStr), &r)
if err != nil {
log.Debug("output %s", string(output))
return nil, err
}
_, err = db.GetPlayerPayChannelOrderId(r.OrderId)
if err == nil {
return nil, fmt.Errorf("订单已支付发货 param: %v", r)
}
// if r.DeveloperPayload != OrderSn {
// return nil, fmt.Errorf("订单号不匹配")
// }
if r.ConsumptionState != 1 {
return nil, fmt.Errorf("订单未消费")
}
Order.PayStatus = MergeConst.ORDER_STATUS_PAY
Order.PayChannelOrderId = r.OrderId
Order.PayTime = GoUtil.Now()
return Order, nil
}
func CancelOrder(p *Player, OrderSn string) error {
Order, err := db.GetPlayerChargeData(OrderSn)
if err != nil {
return err
}
if Order.PayStatus != MergeConst.ORDER_STATUS_IDLE {
return fmt.Errorf("订单已支付")
}
Order.PayStatus = MergeConst.ORDER_STATUS_CANCEL
err = db.UpdatePlayerChargeData(Order)
if err != nil {
return err
}
return nil
}
func GetCardInfoMsg(CardInfo *card.CardInfo) *proto.ResFriendCard {
Uid := 0
if CardInfo.Type == card.TYPE_CARD_SEND {
@ -746,142 +602,8 @@ func GetCardInfoMsg(CardInfo *card.CardInfo) *proto.ResFriendCard {
}
}
func BackChampship(p *Player) {
ChampshipMod := p.PlayMod.getChampshipMod()
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(p.M_DwUin))
MyPreRank := G_GameLogicPtr.ChampshipMgr.getLastMyRank(int(p.M_DwUin))
p.PushClientRes(ChampshipMod.BackData(MyRank, MyPreRank))
}
func GetVisitorPlayer(p *Player) int {
PlayroomMod := p.PlayMod.getPlayroomMod()
VisitorList := PlayroomMod.GetVisitor() // 到访用户
TodayVisitedUsers := PlayroomMod.GetTodayVisitedUsers() // 今日已互动用户
FriendMod := p.PlayMod.getFriendMod()
type sortData struct {
Uid int
Time int64
}
PlayerList := make([]sortData, 0)
PlayerList2 := make([]sortData, 0)
Now := GoUtil.Now()
/**
排除当日玩家已对其发起过交互的用户
优先选择24小时内曾经与玩家进行过宠物交互的好友
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的好友
若不存在符合条件的用户则选择24小时内曾经与玩家进行过宠物交互的陌生用户
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的用户
若不存在符合条件的用户则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
若不存在符合条件的用户则依据以上用户推荐算法选择一位随机推荐用户并且在下次触发式订单完成时不再排除已发起过交互的用户
*/
for k, v := range VisitorList {
if GoUtil.InArray(k, TodayVisitedUsers) {
continue
}
if v.Time < Now-86400 {
continue
}
if FriendMod.CheckFriend(k) {
PlayerList = append(PlayerList, sortData{k, v.Time})
} else {
PlayerList2 = append(PlayerList, sortData{k, v.Time})
}
}
if len(PlayerList) != 0 {
sort.Slice(PlayerList, func(i, j int) bool {
return PlayerList[i].Time < PlayerList[j].Time
})
return PlayerList[0].Uid
}
if len(PlayerList2) != 0 {
sort.Slice(PlayerList2, func(i, j int) bool {
return PlayerList2[i].Time < PlayerList2[j].Time
})
return PlayerList2[0].Uid
}
// 若不存在符合条件的用户则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
var recentFriendUid int
var recentLoginTime int64 = 0
for uid := range FriendMod.GetFriendList() {
if uid == int(p.M_DwUin) {
continue
}
if GoUtil.InArray(uid, TodayVisitedUsers) {
continue
}
ps := G_GameLogicPtr.GetSimplePlayerByUid(uid)
if ps == nil {
continue
}
if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过
continue
}
if ps.Loginout > recentLoginTime {
recentLoginTime = ps.Loginout
recentFriendUid = uid
}
}
if recentFriendUid != 0 {
return recentFriendUid
}
PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
PlayerList4 := make([]int, 0)
for _, v := range PlayerList3 {
if v.Uid == int(p.M_DwUin) {
continue
}
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if PlayerSimpleData.Level < 15 {
continue
}
PlayerList4 = append(PlayerList4, v.Uid)
}
L := GoUtil.RandSliceNum(PlayerList4, 1)
if len(L) == 0 {
return 0
}
return L[0]
}
func GetRecommendPlayer(p *Player, Num int) []int {
PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
PlayerList1 := make([]int, 0)
FriendMod := p.PlayMod.getFriendMod()
for _, v := range PlayerList {
if v.Uid == int(p.M_DwUin) {
continue
}
if FriendMod.CheckSendApply(v.Uid) {
continue
}
if FriendMod.CheckFriend(v.Uid) {
continue
}
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if PlayerSimpleData == nil {
continue
}
if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 {
continue
}
if PlayerSimpleData.Level < 4 {
continue
}
PlayerList1 = append(PlayerList1, v.Uid)
}
if len(PlayerList1) == 0 {
for _, v := range PlayerList {
if v.Uid == int(p.M_DwUin) {
continue
}
PlayerList1 = append(PlayerList1, v.Uid)
}
}
return GoUtil.RandSliceNum(PlayerList1, Num)
}
// 发射器退役第一步 不再生成此发射器订单
func EmitRetireTrigger1(p *Player) {
func (p *Player) EmitRetireTrigger1() {
ChessMod := p.PlayMod.getChessMod()
EmitList := ChessMod.GetEmitList()
EmitId := make(map[string]struct{}, 0)
@ -911,7 +633,7 @@ func EmitRetireTrigger1(p *Player) {
}
// 发射器退役第二步 生成清理订单
func EmitRetireTrigger2(p *Player) {
func (p *Player) EmitRetireTrigger2() {
ChessMod := p.PlayMod.getChessMod()
OrderMod := p.PlayMod.getOrderMod()
BaseMod := p.PlayMod.getBaseMod()
@ -976,36 +698,6 @@ func EmitRetireTrigger2(p *Player) {
}
}
func Benchmark(player *Player) {
ChampshipMod := player.PlayMod.getChampshipMod()
ChampshipMod.AddScore([]int{949, 941, 10})
player.HandleInChampshipRank()
player.HandleInUserRank()
}
func GetUidByFaceBook(Fb string) (int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE FaceBookId = ?"
type Result struct {
Uid int `db:"dwUin"`
}
R := Result{}
err := db.SqlDb.Get(&R, sqlStr, Fb)
log.Debug("Fb :%s;Uid :%d", Fb, R.Uid)
return R.Uid, err
}
func NotifyAllFriend(p *Player, m1 *msg.Msg) {
m := m1.Clone()
FriendMod := p.PlayMod.getFriendMod()
for k := range FriendMod.GetFriendList() {
if k == int(p.M_DwUin) {
continue
}
m.To = k
FriendMgrSend(m)
}
}
func NotifyChampshipResult(Uid, Rank int) {
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid)
if PlayerSimpleData == nil {

View File

@ -110,7 +110,7 @@ func (p *Player) Send(m *MsgMod.Msg) {
}
func (p *Player) Call(m MsgMod.Msg) {
HandleMsg(p, &m)
p.HandleMsg(m.Clone())
}
func (p *Player) SendClientRes() {
@ -239,28 +239,8 @@ func (p *Player) InitPlayer(UserName string) error {
}
p.PlayMod.mod_list = modData.ModList
p.PlayMod.is_update = IsUpdate
go func() { // 处理数据回调
var cb *timer.Timer
for {
select {
case <-p.stopSignal:
return
case cb = <-p.MDispatr.ChanTimer:
if cb != nil {
cb.Cb()
} else {
log.Debug("Timer callback or Timer is nil")
}
case msg := <-p.msgChan:
if msg != nil {
p.wg.Done()
log.Debug("player %d recive msg %v", p.M_DwUin, msg)
go HandleMsg(p, msg)
}
}
}
}()
// 启动定时器
p.DispatcherHandle()
p.McronSave = cron.New()
_, err = p.McronSave.AddFunc("@every 1m", p.AutoSaveData)
if err != nil {
@ -271,10 +251,8 @@ func (p *Player) InitPlayer(UserName string) error {
p.ZeroUpdate(nil)
p.NoonUpdate(nil)
p.Login()
// GoUtil.RegisterEvent(MergeConst.Notify_Daily_Renew, p.ZeroUpdate, p)
// GoUtil.RegisterEvent(MergeConst.Notify_Midday_Renew, p.ZeroUpdate, p)
p.OrderShip()
SyncFriendMsg(p)
p.SyncFriendMsg()
p.UpdateUserInfo()
// fix bug
ChargeMod := p.PlayMod.getChargeMod()
@ -291,7 +269,7 @@ func (p *Player) OrderShip() {
return
}
for _, OrderInfo := range OrderList {
go TriggerShippingOrderOrigin(p, &msg.ReqShippingOrder{
go p.TriggerShippingOrderOrigin(&msg.ReqShippingOrder{
OrderSn: OrderInfo.OrderId,
})
}
@ -347,10 +325,10 @@ func (p *Player) ZeroUpdate(a []interface{}) {
if ChargeMod.IsWeeklyDiscountDay() {
PlayroomMod.ResetWeeklyDiscount()
}
PlayroomBackData(p)
p.PlayroomBackData()
p.PlayMod.getChampshipMod().ZeroUpdate()
p.initAcitivity()
ActivityZeroUpdate(p)
p.ActivityZeroUpdate()
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_LOGIN})
p.PlayMod.save()
}
@ -387,9 +365,9 @@ func (p *Player) NoonUpdate(a []interface{}) {
func (p *Player) Login() {
// 添加定时器
// 限时事件触发
LimitedTimeEventTrigger(p, 0)
p.LimitedTimeEventTrigger(0)
// 猪猪银行触发
LimitedTimePiggyBankTrigger(p)
p.LimitedTimePiggyBankTrigger()
BaseMod := p.PlayMod.getBaseMod()
FaceMod := p.PlayMod.getFaceMod()
ChargeMod := p.PlayMod.getChargeMod()
@ -397,10 +375,10 @@ func (p *Player) Login() {
PlayBaseMod := p.GetPlayerBaseMod()
GuideTaskMod := p.PlayMod.getGuideTaskMod()
// playroom触发
LimitedTimePlayroomTrigger(p) // playroom数值变化
p.LimitedTimePlayroomTrigger() // playroom数值变化
LimitedTimePlayroomWorkTrigger(p) // playroom打工
LimitedTimeEnergyAdd(p) // 能量定时处理
ActivityLogin(p) // 活动登录
p.ActivityLogin() // 活动登录
p.Compensation()
SyncMailMsg(p) // 同步邮件
Duration := BaseMod.Login()
@ -423,14 +401,14 @@ func (p *Player) Login() {
PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.ResetWeeklyDiscount()
p.ChargeBackData()
PlayroomBackData(p)
p.PlayroomBackData()
}, "WeeklyDiscountStart")
}
if WeeklyEndTime > now {
p.CallEvent(time.Duration(WeeklyEndTime-now)*time.Second, func() {
ChargeMod.WeeklyEndTime = 0
p.ChargeBackData()
PlayroomBackData(p)
p.PlayroomBackData()
LimitEventMod := p.PlayMod.getLimitedTimeEventMod()
LimitEventMod.EndCatDaySale()
p.PushClientRes(LimitEventMod.BackData())
@ -700,7 +678,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
Cd: int32(EffectList[1]),
})
// 触发订单事件 生成超级订单 卡牌节
LimitedTimeEventTrigger(p, EffectList[0])
p.LimitedTimeEventTrigger(EffectList[0])
p.TeLog("time_limited_event_enable", map[string]interface{}{
"event_type": limitedTimeEventCfg.GetEventName(EffectList[0]),
"enable_type": Label,
@ -709,7 +687,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
PiggyBankMod := p.PlayMod.getPiggyBankMod()
Effect := itemCfg.GetItemEffect(v.Id)
PiggyBankMod.AddPiggyBank(Effect)
LimitedTimePiggyBankTrigger(p)
p.LimitedTimePiggyBankTrigger()
p.PushClientRes(PiggyBankMod.BackData())
p.TeLog("piggy_bank_income", map[string]interface{}{
"piggy_bank_type": Effect,
@ -749,20 +727,20 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
p.PlayerDecoLog("face", Effect[0], Label)
BackDataType[item.ITEM_TYPE_FACE] = struct{}{}
case item.ITEM_TYPE_ACTIVITY_RACE: // 活动竞速
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_RACE)
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_RACE)
if ActivityInfo == nil {
continue
}
RaceMod := p.PlayMod.getRaceMod()
RaceMod.AddCoin(v.Num)
RaceBackData(p)
p.RaceBackData()
case item.ITEM_TYPE_PLAYROOM_VISIT: // 拜访玩家
Target := GetVisitorPlayer(p)
Target := p.GetVisitorPlayer()
playroomMod := p.PlayMod.getPlayroomMod()
playroomMod.Target = Target
playroomMod.Status = playroom.STATUS_VISIT
// PlayroomVisit(p, Target)
PlayroomBackData(p)
p.PlayroomBackData()
case item.ITEM_TYPE_PLAYROOM_DECORATION: // playroom装饰
Effect := itemCfg.GetItemEffect(v.Id)
PlayroomMod := p.PlayMod.getPlayroomMod()
@ -824,13 +802,13 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
}
BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS_SET] = struct{}{}
case item.ITEM_TYPE_ACT_PASS: // 活动通行证
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
continue
}
PassMod := p.PlayMod.getPassMod()
PassMod.AddExp(v.Num)
ActPassBackData(p)
p.ActPassBackData()
default:
err := ItemMod.AddItem(v.Id, v.Num)
p.TeLog("asset_change", map[string]interface{}{
@ -860,16 +838,16 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
for k := range BackDataType {
switch k {
case item.ITEM_TYPE_AVATAR:
BackUserInfo(p)
p.BackUserInfo()
case item.ITEM_TYPE_EMOJI:
BackUserInfo(p)
p.BackUserInfo()
case item.ITEM_TYPE_FACE:
BackUserInfo(p)
p.BackUserInfo()
case item.ITEM_TYPE_PLAYROOM_DECORATION,
item.ITEM_TYPE_PLAYROOM_DRESS,
item.ITEM_TYPE_PLAYROOM_DECORATION_SET,
item.ITEM_TYPE_PLAYROOM_DRESS_SET:
PlayroomBackData(p)
p.PlayroomBackData()
}
}
p.PetItemUseLog(itemList)
@ -906,8 +884,8 @@ func (p *Player) LoginBackData() {
p.PushClientRes(p.PlayMod.mod_list.Guide.BackData())
p.BackDataActivity()
p.ChargeBackData()
BackChampship(p)
BackUserInfo(p)
p.BackChampship()
p.BackUserInfo()
}
func (p *Player) InitPlayerOnly() {
@ -1126,7 +1104,7 @@ func (p *Player) BackDataActivity() {
}
func (p *Player) GetRed(AI *ActivityInfo) int {
Status := GetActivityStatus(p, AI.Type)
Status := p.GetActivityStatus(AI.Type)
if Status != ACT_STATUS_START {
return 0
}
@ -1143,8 +1121,8 @@ func (p *Player) GetRed(AI *ActivityInfo) int {
}
func (p *Player) NotifyRed(actType int) {
ActivityInfo := GetActivityInfo(p, actType)
Status := GetActivityStatus(p, actType)
ActivityInfo := p.GetActivityInfo(actType)
Status := p.GetActivityStatus(actType)
if Status != ACT_STATUS_START {
return
}
@ -1192,3 +1170,27 @@ func (p *Player) GetIp() string {
}
return p.GetAgent().RemoteAddr().String()
}
func (p *Player) DispatcherHandle() {
go func() {
var cb *timer.Timer
for {
select {
case <-p.stopSignal:
return
case cb = <-p.MDispatr.ChanTimer:
if cb != nil {
cb.Cb()
} else {
log.Debug("Timer callback or Timer is nil")
}
case msg := <-p.msgChan:
if msg != nil {
p.wg.Done()
log.Debug("player %d recive msg %v", p.M_DwUin, msg)
go p.HandleMsg(msg.Clone())
}
}
}
}()
}

View File

@ -18,7 +18,7 @@ func (p *Player) NotifyPlayroomTask() {
p.PushClientRes(m)
}
func PlayroomBackData(p *Player) {
func (p *Player) PlayroomBackData() {
r := &proto.ResPlayroom{}
PlayroomMod := p.PlayMod.getPlayroomMod()
FriendMod := p.PlayMod.getFriendMod()
@ -27,7 +27,7 @@ func PlayroomBackData(p *Player) {
Opponent := make([]*proto.RoomOpponent, 0)
FriendList := make([]*proto.FriendRoom, 0)
if PlayroomMod.Target == 0 {
PlayroomMod.Target = GetVisitorPlayer(p)
PlayroomMod.Target = p.GetVisitorPlayer()
}
TargerRoom := &proto.FriendRoom{}
if PlayroomMod.Target != 0 {
@ -163,7 +163,7 @@ func PlayroomBackData(p *Player) {
p.PushClientRes(r)
}
func PlayroomVisit(p *Player, Uid int) {
func (p *Player) PlayroomVisit(Uid int) {
if Uid == 0 {
p.PushClientRes(&proto.ResPlayroomInfo{})
return
@ -211,7 +211,7 @@ func (p *Player) NotifyPlayroomKiss() {
p.PushClientRes(m)
}
func BackUserInfo(p *Player) {
func (p *Player) BackUserInfo() {
BaseMod := p.PlayMod.getBaseMod()
FaceMod := p.PlayMod.getFaceMod()
AvatarMod := p.PlayMod.getAvatarMod()
@ -294,3 +294,109 @@ func (p *Player) ChargeBackData() {
WeeklyEndTime: max(c.WeeklyEndTime, CatDaySaleEndTime),
})
}
func (p *Player) BackChampship() {
ChampshipMod := p.PlayMod.getChampshipMod()
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(p.M_DwUin))
MyPreRank := G_GameLogicPtr.ChampshipMgr.getLastMyRank(int(p.M_DwUin))
p.PushClientRes(ChampshipMod.BackData(MyRank, MyPreRank))
}
// 返回好友信息
func (p *Player) FriendListBackData() {
FriendMod := p.PlayMod.getFriendMod()
var fl []*proto.ResPlayerSimple
for k, v := range FriendMod.GetFriendList() {
if k == int(p.M_DwUin) {
continue
}
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
ps.AddTime = v.AddTime
ps.Interact = FriendMod.GetInteractTime(k)
fl = append(fl, ps)
}
}
ReqFriendList := make([]int64, 0)
for k := range FriendMod.SendApply {
ReqFriendList = append(ReqFriendList, int64(k))
}
p.PushClientRes(&proto.ResFriendList{
FriendList: fl,
ReqApplyList: ReqFriendList,
Npc: GoUtil.IntToInt32(FriendMod.GetNpc()),
Sponsor: int32(FriendMod.GetSponsor()),
})
}
func (p *Player) FriendApplyBackData() {
FriendMod := p.PlayMod.getFriendMod()
var al []*proto.ResFriendApplyInfo
for k, v := range FriendMod.ApplyList {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
al = append(al, &proto.ResFriendApplyInfo{
Player: ps,
Time: int32(v),
})
}
}
p.PushClientRes(&proto.ResFriendApply{
ApplyList: al,
})
}
func (p *Player) FriendLogBackData() {
FriendMod := p.PlayMod.getFriendMod()
var log []*proto.ResFriendLog
for _, v := range FriendMod.Log {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if ps == nil {
ps = &proto.ResPlayerSimple{
Uid: int64(v.Uid),
}
}
log = append(log, &proto.ResFriendLog{
Player: ps,
Type: int32(v.Type),
Time: int32(v.Time),
Param: v.Param,
Id: int32(v.Id),
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{
Log: log,
Reply: reply,
})
}
func (p *Player) FriendCardBackData() {
FriendMod := p.PlayMod.getFriendMod()
var msgList []*proto.ResFriendCard
for _, v := range FriendMod.Card {
m := GetCardInfoMsg(v)
msgList = append(msgList, m)
}
p.PushClientRes(&proto.ResFriendCardMsg{
MsgList: msgList,
})
}

View File

@ -562,7 +562,7 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
return 0, err
}
}
EmitRetireTrigger2(player)
player.EmitRetireTrigger2()
player.InitOrderItem()
player.PushClientRes(p.BackAsset())
return upLv, nil

View File

@ -129,6 +129,24 @@ func (p *PlayerChessData) UpdateChessData(player *Player, MChessData map[string]
return nil
}
func (p *PlayerChessData) UpdateChessDataTest(player *Player, MChessData map[string]int32) error {
p.Data.MChessData = MChessData
if true {
res := &msg.ResUpdatePlayerChessData{
Code: msg.RES_CODE_FAIL,
Msg: "棋子数据不一致",
}
log.Debug("棋子数据不一致, %v---%v", p.Data.MChessData, player.PlayMod.getChessMod().GetChessList())
player.SendErrClienRes(res)
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "UpdatePlayerChessDataFunc",
})
return fmt.Errorf("棋子数据不一致")
}
player.PlayMod.getChessMod().ChessMap = MChessData
return nil
}
// 检查棋子数据是否一致
func (p *PlayerChessData) checkChessEqual(player *Player) bool {
if len(p.Data.MChessData) == 0 && conf.Server.GameName == "Merge_Pet_Local" {
@ -207,7 +225,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
player.PushClientRes(HandbookMod.BackData())
triggerComposeChess(player, NewChessId, player.PlayMod.getBaseMod().EnergyMul, player.PlayMod.getChessMod().GetEmitList())
// 获取活动道具
ActItem := GetActivityItem(player, GoUtil.Int32ToInt(v.ActType))
ActItem := player.GetActivityItem(GoUtil.Int32ToInt(v.ActType))
itemList = item.Merge(itemList, ActItem)
case msg.HANDLE_TYPE_BUY: //购买棋子
loseGold, err := ChessMod.BuyChess(ChessId)
@ -287,7 +305,7 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
player.PushClientRes(LimitedTimeEventMod.BackData())
}
player.QuestTriggerList(TriggerList)
EmitRetireTrigger1(player)
player.EmitRetireTrigger1()
player.InitOrderItem()
player.PushClientRes(ChessMod.BackData())
player.PlayMod.save()

View File

@ -1,62 +0,0 @@
package game
// "fmt"
// "math"
type PlayerDataModule interface {
LoadDataFromDB(key interface{}) bool
SaveDataFromDB(key interface{}) bool
SetPlayer(p *Player)
GetPlayer() *Player
GetData() interface{}
ClearData() bool
Reconnect(bool)
AutoSaveInterval()
}
type PlayerData struct {
Name string
IsHaveDataDb bool
M_Player *Player
}
func (d *PlayerData) SetPlayer(p *Player) {
d.M_Player = p
}
func (d *PlayerData) GetPlayer() *Player {
return d.M_Player
}
func (d *PlayerData) Reconnect(b bool) {
}
func (d *PlayerData) AutoSaveInterval() {
}
func (d *PlayerData) LoadDataFromDB(UserName interface{}) bool {
return true
}
func (d *PlayerData) SaveDataFromDB(Key interface{}) bool {
return true
}
func (d *PlayerData) ClearData() bool {
return true
}
func (d *PlayerData) GetData() interface{} {
res := struct{}{}
return res
}
func NewPlayerData(name string, player *Player) *PlayerData {
return &PlayerData{
Name: name,
M_Player: player,
}
}

View File

@ -44,6 +44,32 @@ import (
"time"
)
type PlayerData struct {
Name string
IsHaveDataDb bool
M_Player *Player
}
func (d *PlayerData) SetPlayer(p *Player) {
d.M_Player = p
}
func (d *PlayerData) GetPlayer() *Player {
return d.M_Player
}
func (d *PlayerData) GetData() interface{} {
res := struct{}{}
return res
}
func NewPlayerData(name string, player *Player) *PlayerData {
return &PlayerData{
Name: name,
M_Player: player,
}
}
type PlayerModData struct {
*PlayerData
Data db.SqlModStruct

View File

@ -1,23 +0,0 @@
package game
import (
"server/GoUtil"
"server/game/mod/activity"
"server/game/mod/msg"
)
func (p *Player) CatnipGrowthMsg(To, Id, Growth int) error {
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
FriendMgrSend(&msg.Msg{
From: int(p.M_DwUin),
To: To,
Type: msg.HANDLE_TYPE_CATNIP_GROWTH,
SendT: GoUtil.Now(),
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: Id,
Growth: Growth,
},
})
return nil
}

View File

@ -290,7 +290,7 @@ func ReqRewardOrder(player *Player, buf []byte) error {
if OrderType == order.Pet_type {
Item = player.FormatPetOrderItem(Item)
}
ActItem := GetActivityItem(player, GoUtil.Int32ToInt(req.ActType))
ActItem := player.GetActivityItem(GoUtil.Int32ToInt(req.ActType))
Item = item.Merge(Item, ActItem)
if !OrderMod.CheckSuperOrder() {
if LimitedTimeEventMod.RemoveSuperOrder() {
@ -408,11 +408,11 @@ func ReqRewardOrder(player *Player, buf []byte) error {
"preset_order_step": preset_order_step,
})
player.PetItemGetLog(Item, nil, "Order")
EmitRetireTrigger2(player)
player.EmitRetireTrigger2()
Lv := player.GetPlayerBaseMod().GetLevel()
EnergyMul := player.PlayMod.getBaseMod().GetEnergyMul()
Emit := ChessMod.GetOrderEmit()
TriggerSeedSource(player)
player.TriggerSeedSource()
//NewOrder := TriggerSeedOrder(player)
// if NewOrder == nil || len(NewOrder.MergeId) == 0 {
// OrderMod.CreateOrder(Lv, Emit, EnergyMul)
@ -452,7 +452,7 @@ func ReqRewardOrder(player *Player, buf []byte) error {
player.PlayMod.save()
player.PushClientRes(PiggyBankMod.BackData())
player.PushClientRes(OrderMod.BackData())
BackChampship(player)
player.BackChampship()
player.PushClientRes(LimitedTimeEventMod.BackData())
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(LimitedTimeEventMod.ProgressBackData())
@ -578,7 +578,7 @@ func ReqDecorate(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
})
player.HandleInUserRank()
BackUserInfo(player)
player.BackUserInfo()
player.UpdateUserInfo()
return nil
}
@ -651,13 +651,39 @@ func ReqDecorateAll(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
})
player.HandleInUserRank()
BackUserInfo(player)
player.BackUserInfo()
player.UpdateUserInfo()
return nil
}
func ReqDecorateReward(player *Player, buf []byte) error {
func ReqAreaReward(player *Player, buf []byte) error {
req := &msg.ReqAreaReward{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
DecorateMod := player.PlayMod.getDecorateMod()
RewardItem, err := DecorateMod.GetDecorateReward(int(req.AreaId))
if err != nil {
player.SendErrClienRes(&msg.ResAreaReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(RewardItem, msg.ITEM_POP_LABEL_DecorateReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResAreaReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.PushClientRes(&msg.ResAreaReward{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(DecorateMod.BackData())
player.PlayMod.save()
return nil
}
@ -666,7 +692,7 @@ func ReqDecorateReward(player *Player, buf []byte) error {
func UpdatePlayerChessDataFunc(player *Player, buf []byte) error {
data := &PlayerChessData{}
err := data.UpdatePlayerChessData(player, buf)
RedBackData(player)
player.RedBackData()
player.UpdateUserInfo()
return err
}
@ -714,7 +740,7 @@ func ReqGetChessFromBuff(player *Player, buf []byte) error {
player.PushClientRes(OrderMod.BackData())
}
triggerComposeChess(player, ChessId, player.PlayMod.getBaseMod().EnergyMul, player.PlayMod.getChessMod().GetEmitList())
EmitRetireTrigger1(player)
player.EmitRetireTrigger1()
player.InitOrderItem()
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
@ -1494,7 +1520,7 @@ func ReqSetAvatar(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResSetAvatar{
Code: msg.RES_CODE_SUCCESS,
})
BackUserInfo(player)
player.BackUserInfo()
player.UpdateUserInfo()
b := false
if req.Avatar == 0 {
@ -1537,7 +1563,7 @@ func ReqSetFace(player *Player, buf []byte) error {
"is_platform": is_platform,
})
player.PlayerDecoSetLog("face", int(req.Face), "")
BackUserInfo(player)
player.BackUserInfo()
player.UpdateUserInfo()
return nil
}
@ -1894,7 +1920,7 @@ func ReqApplyFriend(player *Player, buf []byte) error {
PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointInvite(BaseMod.GetLevel())
PlayroomBackData(player)
player.PlayroomBackData()
return nil
}
@ -1922,7 +1948,7 @@ func ReqAgreeFriend(player *Player, buf []byte) error {
}
FriendMgrSend(m)
FriendMod.AddFriend(Uid)
FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600)
FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600, nil)
player.PushClientRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
@ -1933,12 +1959,12 @@ func ReqAgreeFriend(player *Player, buf []byte) error {
"add_type": "接受申请",
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now())
FriendApplyBackData(player)
FriendLogBackData(player)
player.FriendApplyBackData()
player.FriendLogBackData()
PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(player)
player.PlayroomBackData()
player.PlayMod.save()
return nil
}
@ -1966,7 +1992,7 @@ func ReqDelFriend(player *Player, buf []byte) error {
Uid: req.Uid,
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_DELETE, "", GoUtil.Now())
FriendListBackData(player)
player.FriendListBackData()
player.TeLog("friend_delete", map[string]interface{}{
"player_id": Uid,
})
@ -1995,7 +2021,7 @@ func ReqRefuseFriend(player *Player, buf []byte) error {
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
FriendApplyBackData(player)
player.FriendApplyBackData()
return nil
}
@ -2907,7 +2933,7 @@ func ReqCreateOrderSn(player *Player, buf []byte) error {
if err != nil {
return err
}
OrderSn, err := CreateOrderSn(player, req)
OrderSn, err := player.CreateOrderSn(req)
if err != nil {
return err
}
@ -2926,7 +2952,7 @@ func ReqShippingOrder(player *Player, buf []byte) error {
return err
}
go TriggerShippingOrder(player, req)
go player.TriggerShippingOrder(req)
player.PushClientRes(&msg.ResShippingOrder{
Code: msg.RES_CODE_SUCCESS,
})
@ -2946,8 +2972,8 @@ func ReqChampshipReward(player *Player, buf []byte) error {
return err
}
player.PlayMod.save()
BackChampship(player)
TriggerSeed(player)
player.BackChampship()
player.TriggerSeed()
player.PushClientRes(&msg.ResChampshipReward{
Code: msg.RES_CODE_SUCCESS,
})
@ -3017,22 +3043,22 @@ func ReqFriendRecommend(player *Player, buf []byte) error {
}
func ReqFriendList(player *Player, buf []byte) error {
FriendListBackData(player)
player.FriendListBackData()
return nil
}
func ReqFriendApply(player *Player, buf []byte) error {
FriendApplyBackData(player)
player.FriendApplyBackData()
return nil
}
func ReqFriendCardMsg(player *Player, buf []byte) error {
FriendCardBackData(player)
player.FriendCardBackData()
return nil
}
func ReqFriendTimeLine(player *Player, buf []byte) error {
FriendLogBackData(player)
player.FriendLogBackData()
return nil
}
@ -3133,7 +3159,7 @@ func ReqChampshipRankReward(player *Player, buf []byte) error {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_CHAMPIONSHIP_RANK, GoUtil.String(MyLastRank))
}
player.PlayMod.save()
BackChampship(player)
player.BackChampship()
player.PushClientRes(&msg.ResChampshipRankReward{
Code: msg.RES_CODE_SUCCESS,
})
@ -3159,7 +3185,7 @@ func ReqSetName(player *Player, buf []byte) error {
ResultCode: msg.RES_CODE_SUCCESS,
})
player.PlayMod.save()
BackUserInfo(player)
player.BackUserInfo()
player.UpdateUserInfo()
player.TeLog("nickname_set", map[string]interface{}{
"nickname_name": req.Name,
@ -3179,10 +3205,10 @@ func ReqSetPetName(player *Player, buf []byte) error {
ResultCode: msg.RES_CODE_SUCCESS,
})
player.PlayMod.save()
BackUserInfo(player)
player.BackUserInfo()
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.UnLock(BaseMod.GetLevel())
LimitedTimePlayroomTrigger(player)
player.LimitedTimePlayroomTrigger()
player.UpdateUserInfo()
player.TeLog("petname_set", map[string]interface{}{
"petname": req.Name,
@ -3191,7 +3217,7 @@ func ReqSetPetName(player *Player, buf []byte) error {
}
func ReqUserInfo(player *Player, buf []byte) error {
BackUserInfo(player)
player.BackUserInfo()
return nil
}
@ -3327,7 +3353,7 @@ func ReqAutoAddInviteFriend(player *Player, buf []byte) error {
PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(player)
player.PlayroomBackData()
player.TeLog("friend_add", map[string]interface{}{
"player_id": req.Id,
"add_type": "邀请注册",
@ -3371,7 +3397,7 @@ func ReqAutoAddInviteFriend2(player *Player, buf []byte) error {
PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(player)
player.PlayroomBackData()
player.TeLog("friend_add", map[string]interface{}{
"player_id": req.Id,
"add_type": "邀请注册",
@ -3419,7 +3445,7 @@ func ReqSelectLimitEvent(player *Player, buf []byte) error {
// 请求挖矿基础数据
func ReqMining(player *Player, buf []byte) error {
MiningBackData(player)
player.MiningBackData()
return nil
}
@ -3431,8 +3457,8 @@ func ReqMiningTake(player *Player, buf []byte) error {
return err
}
MiningMod := player.PlayMod.getMiningMod()
ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_MINING)
Status := GetActivityStatus(player, activity.ACT_TYPE_MINING)
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_MINING)
Status := player.GetActivityStatus(activity.ACT_TYPE_MINING)
if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResMiningTake{
Code: msg.RES_CODE_FAIL,
@ -3468,14 +3494,14 @@ func ReqMiningTake(player *Player, buf []byte) error {
player.TeLog("ReqMiningTake", map[string]interface{}{})
player.PlayMod.save()
player.NotifyRed(activity.ACT_TYPE_MINING)
MiningBackData(player)
player.MiningBackData()
return nil
}
// 领取关卡奖励
func ReqMiningReward(player *Player, buf []byte) error {
MiningMod := player.PlayMod.getMiningMod()
Status := GetActivityStatus(player, activity.ACT_TYPE_MINING)
Status := player.GetActivityStatus(activity.ACT_TYPE_MINING)
if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResMiningReward{
Code: msg.RES_CODE_FAIL,
@ -3507,7 +3533,7 @@ func ReqMiningReward(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
})
player.PlayMod.save()
MiningBackData(player)
player.MiningBackData()
return nil
}
@ -3525,7 +3551,7 @@ func ReqGuessColor(player *Player, buf []byte) error {
return err
}
player.PlayMod.save()
GuessColorBackData(player)
player.GuessColorBackData()
return nil
}
@ -3536,7 +3562,7 @@ func ReqGuessColorTake(player *Player, buf []byte) error {
if err != nil {
return err
}
Status := GetActivityStatus(player, activity.ACT_TYPE_GUESS_COLOR)
Status := player.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR)
if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResGuessColorTake{
Code: msg.RES_CODE_FAIL,
@ -3554,13 +3580,17 @@ func ReqGuessColorTake(player *Player, buf []byte) error {
})
return err
}
GuessColorMod.Take(req.Map.Map, req.OMap)
var M map[int32]int32
if req.Map != nil {
M = req.Map.Map
}
GuessColorMod.Take(M, req.OMap)
player.TeLog("ReqGuessColorTake", map[string]interface{}{
"map": req.Map.Map,
"o_map": req.OMap,
})
player.PlayMod.save()
GuessColorBackData(player)
player.GuessColorBackData()
player.NotifyRed(activity.ACT_TYPE_GUESS_COLOR)
return nil
}
@ -3572,7 +3602,7 @@ func ReqGuessColorReward(player *Player, buf []byte) error {
if err != nil {
return err
}
Status := GetActivityStatus(player, activity.ACT_TYPE_GUESS_COLOR)
Status := player.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR)
if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResGuessColorReward{
Code: msg.RES_CODE_FAIL,
@ -3601,13 +3631,13 @@ func ReqGuessColorReward(player *Player, buf []byte) error {
"item_list": itemList,
})
player.PlayMod.save()
GuessColorBackData(player)
player.GuessColorBackData()
return nil
}
// 请求竞赛基础数据
func ReqRace(player *Player, buf []byte) error {
RaceBackData(player)
player.RaceBackData()
return nil
}
@ -3627,7 +3657,7 @@ func ReqRaceStart(player *Player, buf []byte) error {
})
return err
}
RaceBackData(player)
player.RaceBackData()
player.PushClientRes(&msg.ResRaceStart{
Code: msg.RES_CODE_SUCCESS,
})
@ -3658,7 +3688,7 @@ func ReqRaceReward(player *Player, buf []byte) error {
})
return err
}
RaceBackData(player)
player.RaceBackData()
player.TeLog("ReqRaceReward", map[string]interface{}{
"item_list": Items,
})
@ -3670,7 +3700,7 @@ func ReqRaceReward(player *Player, buf []byte) error {
// 请求playroom基础数据
func ReqPlayroom(player *Player, buf []byte) error {
PlayroomBackData(player)
player.PlayroomBackData()
return nil
}
@ -3687,10 +3717,10 @@ func ReqPlayroomInfo(player *Player, buf []byte) error {
Targer = PlayroomMod.GetTarget()
}
if req.Uid == -1 {
Targer = GetVisitorPlayer(player)
Targer = player.GetVisitorPlayer()
}
if Targer == 0 {
PlayroomVisit(player, Targer)
player.PlayroomVisit(Targer)
return nil
}
PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer)
@ -3729,7 +3759,7 @@ func ReqPlayroomInfo(player *Player, buf []byte) error {
PlayroomMod.SetGameRewardFlip(int(float64(PlayerData.Star)*0.03), int(float64(PlayerData.Star)*0.05), int(float64(PlayerData.Star)*0.1))
}
player.PlayMod.save()
PlayroomVisit(player, Targer)
player.PlayroomVisit(Targer)
return nil
}
@ -3773,7 +3803,7 @@ func ReqPlayroomInteract(player *Player, buf []byte) error {
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_INTERACT, A: []interface{}{int(req.Id)}})
player.PlayMod.save()
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_KISS, 0)
LimitedTimePlayroomTrigger_(player, PType)
player.LimitedTimePlayroomTrigger_(PType)
player.NotifyPlayroomKiss()
player.TeLog("playroom_interact", map[string]interface{}{
"interact_id": int(req.Id),
@ -3859,7 +3889,7 @@ func ReqPlayroomGame(player *Player, buf []byte) error {
"item_list": Items,
})
PlayroomMod.ResetGame()
PlayroomBackData(player)
player.PlayroomBackData()
player.PlayerDecoSetLog("emoji", int(req.EmojiId), "playroom_game")
player.PushClientRes(&msg.ResPlayroomGame{
Code: msg.RES_CODE_SUCCESS,
@ -3921,7 +3951,7 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE_1, "")
PlayroomMod.ResetGame()
player.PlayerDecoSetLog("emoji", int(req.EmojiId), "playroom_select_reward")
PlayroomBackData(player)
player.PlayroomBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResPlayroomSelectReward{
Code: msg.RES_CODE_SUCCESS,
@ -3972,7 +4002,7 @@ func ReqPlayroomWork(player *Player, buf []byte) error {
})
player.PlayMod.save()
player.PushClientRes(PlayroomMod.NotifyWork())
// PlayroomBackData(player)
// player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomWork{
Code: msg.RES_CODE_SUCCESS,
})
@ -4011,7 +4041,7 @@ func ReqPlayroomDraw(player *Player, buf []byte) error {
return err
}
player.PlayMod.save()
// PlayroomBackData(player)
// player.PlayroomBackData()
player.PushClientRes(PlayroomMod.NotifyMood())
player.TeLog("playroom_draw", map[string]interface{}{
"draw_id": Id,
@ -4054,7 +4084,7 @@ func ReqPlayroomChip(player *Player, buf []byte) error {
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_CHIP_SET, len(PlayroomMod.ChipList))
player.PlayMod.save()
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomChip{
Code: msg.RES_CODE_SUCCESS,
})
@ -4083,7 +4113,7 @@ func ReqPlayroomFlip(player *Player, buf []byte) error {
"Id": req.Id,
})
player.PlayMod.save()
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomFlip{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
@ -4142,7 +4172,7 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error {
})
player.PlayerDecoSetLog("emoji", int(req.EmojiId), "playroom_flip_reward")
player.PlayMod.save()
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomFlipReward{
Code: msg.RES_CODE_SUCCESS,
})
@ -4261,7 +4291,7 @@ func ReqPlayroomUnlock(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
Id: int32(req.Id),
})
PlayroomBackData(player)
player.PlayroomBackData()
return nil
}
@ -4298,7 +4328,7 @@ func ReqPlayroomTask(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
Id: int32(req.Id),
})
PlayroomBackData(player)
player.PlayroomBackData()
return nil
}
@ -4477,7 +4507,7 @@ func ReqPlayroomShop(player *Player, buf []byte) error {
player.PetItemGetLog(AddItems, LoseItem, "Shop")
player.PlayMod.save()
player.PushClientRes(PlayroomMod.NotifyMood())
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomShop{
Code: msg.RES_CODE_SUCCESS,
})
@ -4695,7 +4725,7 @@ func ReqSetEmoji(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResSetEmoji{
Code: msg.RES_CODE_SUCCESS,
})
BackUserInfo(player)
player.BackUserInfo()
return nil
}
@ -4794,7 +4824,7 @@ func ReqPlayroomDressSet(player *Player, buf []byte) error {
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PETDRESS, A: []interface{}{Parts}})
player.PlayMod.save()
//player.PetDecoSetLog(Diff)
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomDressSet{
Code: msg.RES_CODE_SUCCESS,
})
@ -4817,7 +4847,7 @@ func ReqPlayroomPetAirSet(player *Player, buf []byte) error {
return error
}
player.PlayMod.save()
PlayroomBackData(player)
player.PlayroomBackData()
player.PushClientRes(&msg.ResPlayroomPetAirSet{
Code: msg.RES_CODE_SUCCESS,
})
@ -4873,7 +4903,7 @@ func ReqActivityReward(player *Player, buf []byte) error {
if err != nil {
return err
}
ActivityInfo := GetActivityInfo(player, int(req.Id))
ActivityInfo := player.GetActivityInfo(int(req.Id))
if ActivityInfo == nil {
player.SendErrClienRes(&msg.ResActivityReward{
Code: msg.RES_CODE_FAIL,
@ -4980,17 +5010,17 @@ func ReqAddNpc(player *Player, buf []byte) error {
InviteMod.AddInvite(int(req.NpcId))
}
player.PlayMod.save()
FriendListBackData(player)
player.FriendListBackData()
PlayroomMod := player.PlayMod.getPlayroomMod()
BaseMod := player.PlayMod.getBaseMod()
PlayroomMod.AddRoomPointInvite(BaseMod.GetLevel())
PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel())
PlayroomBackData(player)
player.PlayroomBackData()
player.TeLog("add_npc", map[string]interface{}{
"NpcId": int(req.NpcId),
})
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600)
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING_Get, "", GoUtil.Now()+24*3600)
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600, nil)
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING_Get, "", GoUtil.Now()+24*3600, nil)
player.AddLog(int(req.NpcId), friend.LOG_TYPE_FRIEND_BECOME_NPC, GoUtil.String(req.NpcId), GoUtil.Now())
player.PushClientRes(&msg.ResAddNpc{
Code: msg.RES_CODE_SUCCESS,
@ -5344,10 +5374,17 @@ func ReqCatnipInvite(player *Player, buf []byte) error {
if err != nil {
return err
}
ActivityId := GetActivityId(player, activity.ACT_TYPE_MINING)
ActivityInfo := GetActivityInfo(player, ActivityId)
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipInvite{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
ActivityInfo := player.GetActivityInfo(ActivityId)
CatnipMod := player.PlayMod.getCatnipMod()
err = CatnipMod.Invite(int(req.Id), int(req.Uid))
err = CatnipMod.Invite(int(req.Uid), int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipInvite{
Code: msg.RES_CODE_FAIL,
@ -5355,7 +5392,7 @@ func ReqCatnipInvite(player *Player, buf []byte) error {
})
return err
}
player.TeLog("catnip_invite", map[string]interface{}{
player.TeLog("cats_garden_invite", map[string]interface{}{
"Id": int(req.Id),
})
FriendMgrSend(&MsqMod.Msg{
@ -5369,10 +5406,11 @@ func ReqCatnipInvite(player *Player, buf []byte) error {
},
SendT: GoUtil.Now(),
})
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipInvite{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
return nil
}
@ -5384,8 +5422,15 @@ func ReqCatnipAgree(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := GetActivityId(player, activity.ACT_TYPE_MINING)
UserList, err := CatnipMod.Agree(int(req.Id), int(req.Uid))
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipAgree{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
_, err = CatnipMod.Agree(int(req.Id), int(req.Uid))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipAgree{
Code: msg.RES_CODE_FAIL,
@ -5401,7 +5446,7 @@ func ReqCatnipAgree(player *Player, buf []byte) error {
})
return err
}
player.TeLog("catnip_agree", map[string]interface{}{
player.TeLog("cats_garden_accept_invite", map[string]interface{}{
"Id": int(req.Id),
})
FriendMgrSend(&MsqMod.Msg{
@ -5414,23 +5459,11 @@ func ReqCatnipAgree(player *Player, buf []byte) error {
},
SendT: GoUtil.Now(),
})
for _, v := range UserList {
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(v),
Type: MsqMod.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(req.Id),
},
SendT: GoUtil.Now(),
})
}
player.CatnipBackData()
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipAgree{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
return nil
}
@ -5443,6 +5476,14 @@ func ReqCatnipMultiply(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipMultiply{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
err = CatnipMod.Multiply(int(req.Multiply))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipMultiply{
@ -5454,10 +5495,11 @@ func ReqCatnipMultiply(player *Player, buf []byte) error {
player.TeLog("catnip_multiply", map[string]interface{}{
"Mul": int(req.Multiply),
})
player.CatnipBackData()
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipMultiply{
Code: msg.RES_CODE_SUCCESS,
Code: msg.RES_CODE_SUCCESS,
Multiply: req.Multiply,
})
return nil
}
@ -5470,7 +5512,15 @@ func ReqCatnipPlay(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
Id, Growth, PartnerId, Items, ItemCost, err := CatnipMod.Play(int(req.Id))
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
Id, Growth, PartnerId, Items, ItemCost, FriendItems, err := CatnipMod.Play(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_FAIL,
@ -5484,6 +5534,7 @@ func ReqCatnipPlay(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_CatnipPlay.String())
if err != nil {
@ -5491,17 +5542,18 @@ func ReqCatnipPlay(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_play", map[string]interface{}{
"Id": int(req.Id),
"Growth": Growth,
"PartnerId": PartnerId,
"Items": Items,
player.TeLog("cats_garden_expend_token", map[string]interface{}{
"friends_ID": PartnerId,
"multiple": CatnipMod.GetMultiple(),
"expend_num": ItemCost[0].Num,
"get_award": Items,
})
if Growth > 0 {
player.CatnipGrowthMsg(PartnerId, int(req.Id), Growth)
player.CatnipGrowthMsg(PartnerId, int(req.Id), Growth, FriendItems*CatnipMod.Mul)
}
player.CatnipBackData()
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_SUCCESS,
@ -5518,7 +5570,15 @@ func ReqCatnipReward(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
Items, err := CatnipMod.Reward(int(req.Id), int(req.Progress))
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
Items, GameInfo, err := CatnipMod.Reward(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipReward{
Code: msg.RES_CODE_FAIL,
@ -5534,12 +5594,13 @@ func ReqCatnipReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("catnip_reward", map[string]interface{}{
"Id": int(req.Id),
"Progress": int(req.Progress),
"Items": Items,
player.TeLog("cats_garden_stage_reward", map[string]interface{}{
"Id": int(req.Id),
"friends_ID": GameInfo.Partner,
"friends_get_num": GameInfo.PartnerAdd,
"user_get_num": GameInfo.Progress - GameInfo.PartnerAdd,
})
player.CatnipBackData()
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipReward{
Code: msg.RES_CODE_SUCCESS,
@ -5555,6 +5616,14 @@ func ReqCatnipGrandReward(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
Items, err := CatnipMod.GrandReward()
if err != nil {
player.SendErrClienRes(&msg.ResCatnipGrandReward{
@ -5571,9 +5640,10 @@ func ReqCatnipGrandReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("catnip_grand_reward", map[string]interface{}{
"Items": Items,
player.TeLog("cats_garden_final_reward", map[string]interface{}{
"get_reward": Items,
})
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipGrandReward{
Code: msg.RES_CODE_SUCCESS,
@ -5588,6 +5658,14 @@ func ReqCatnipRefuse(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipRefuse{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
err = CatnipMod.Refuse(int(req.Id), int(req.Uid))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipRefuse{
@ -5605,19 +5683,21 @@ func ReqCatnipRefuse(player *Player, buf []byte) error {
Type: MsqMod.HANDLE_TYPE_CATNIP_REFUSE,
SendT: GoUtil.Now(),
Extra: CatnipMsg{
ActivityId: GetActivityId(player, activity.ACT_TYPE_MINING),
ActivityId: player.GetActivityId(activity.ACT_TYPE_CATNIP),
GameId: int(req.Id),
},
})
//player.CatnipBackData()
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipRefuse{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
return nil
}
func ReqActPass(player *Player, buf []byte) error {
ActPassBackData(player)
player.ActPassBackData()
return nil
}
@ -5684,7 +5764,7 @@ func ReqFriendReplyHandle(player *Player, buf []byte) error {
})
} else {
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := GetActivityId(player, activity.ACT_TYPE_MINING)
ActivityId := player.GetActivityId(activity.ACT_TYPE_MINING)
UserList, _ := CatnipMod.Agree(GameId, ReplyInfo.Uid)
player.TeLog("catnip_agree", map[string]interface{}{
"Id": int(GameId),
@ -5726,7 +5806,7 @@ func ReqFriendReplyHandle(player *Player, buf []byte) error {
})
return err
}
FriendLogBackData(player)
player.FriendLogBackData()
player.PushClientRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_SUCCESS,
LogId: req.LogId,
@ -5777,7 +5857,34 @@ func ReqCatnipEmoji(player *Player, buf []byte) error {
return err
}
CatnipMod := player.PlayMod.getCatnipMod()
CatnipMod.SetEmoji(int(req.Id), int(req.EmojiId))
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
if ActivityId == 0 {
player.SendErrClienRes(&msg.ResCatnipEmoji{
Code: msg.RES_CODE_FAIL,
Msg: "activity not active",
})
return fmt.Errorf("activity not active")
}
GameInfo := CatnipMod.GetGameInfo(int(req.Id))
if GameInfo.Partner == 0 {
player.SendErrClienRes(&msg.ResCatnipEmoji{
Code: msg.RES_CODE_FAIL,
Msg: "no partner",
})
return fmt.Errorf("no partner")
}
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: GameInfo.Partner,
Type: MsqMod.HANDLE_TYPE_CATNIP_SEND_EMOJI,
Extra: int(req.EmojiId),
})
player.PushClientRes(&msg.ResCatnipEmoji{
Code: msg.RES_CODE_SUCCESS,
EmojiId: req.EmojiId,
Id: req.Id,
})
player.CatnipBackData()
return nil
}

View File

@ -47,7 +47,7 @@ func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
}
tr := false
for _, v := range t {
if checkTriggerCondition(player, v.Trigger) {
if player.checkTriggerCondition(v.Trigger) {
Title := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, v.Title)
Content := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, v.Content)
TitleEn := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, v.Title)
@ -76,7 +76,7 @@ func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
return tr
}
func checkTriggerCondition(player *Player, Trigger []string) bool {
func (player *Player) checkTriggerCondition(Trigger []string) bool {
if len(Trigger) < 4 {
return false
}
@ -93,11 +93,11 @@ func checkTriggerCondition(player *Player, Trigger []string) bool {
}
}
func TriggerShippingOrderOrigin(player *Player, req *msg.ReqShippingOrder) {
func (player *Player) TriggerShippingOrderOrigin(req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn
Status := int(req.Status)
if Status == MergeConst.ORDER_STATUS_CANCEL { // 取消支付
CancelOrder(player, OrderSn)
player.CancelOrder(OrderSn)
player.PushClientRes(&msg.ResShippingOrder{
Code: msg.RES_CODE_SUCCESS,
Msg: "cancel success",
@ -132,9 +132,9 @@ func TriggerShippingOrderOrigin(player *Player, req *msg.ReqShippingOrder) {
OrderExtraData.ChargeId = OrderData.ProductId
}
if OrderExtraData.Type == 0 {
Charge(player, int(OrderData.ProductId))
player.Charge(int(OrderData.ProductId))
} else {
SendCharge(player, OrderExtraData)
player.SendCharge(OrderExtraData)
}
OrderData.PayStatus = MergeConst.ORDER_STATUS_SHIP
OrderData.ProductName = req.ProduceId
@ -159,11 +159,11 @@ func TriggerShippingOrderOrigin(player *Player, req *msg.ReqShippingOrder) {
player.SendClientRes()
}
func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
func (player *Player) TriggerShippingOrder(req *msg.ReqShippingOrder) {
OrderSn := req.OrderSn
Status := int(req.Status)
if Status == MergeConst.ORDER_STATUS_CANCEL { // 取消支付
CancelOrder(player, OrderSn)
player.CancelOrder(OrderSn)
player.PushClientRes(&msg.ResShippingOrder{
Code: msg.RES_CODE_SUCCESS,
Msg: "cancel success",
@ -178,7 +178,7 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
if n > 14 {
break
}
OrderData, err = GoogleVerify(player, OrderSn, req.ProduceId, req.Token)
OrderData, err = player.GoogleVerify(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)
@ -225,9 +225,9 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
OrderExtraData.ChargeId = OrderData.ProductId
}
if OrderExtraData.Type == 0 {
Charge(player, int(OrderData.ProductId))
player.Charge(int(OrderData.ProductId))
} else {
SendCharge(player, OrderExtraData)
player.SendCharge(OrderExtraData)
}
OrderData.PayStatus = MergeConst.ORDER_STATUS_SHIP
OrderData.ProductName = req.ProduceId
@ -249,7 +249,7 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) {
player.SendClientRes()
}
func TriggerComfortOrder(p *Player) {
func (p *Player) TriggerComfortOrder() {
BaseMod := p.PlayMod.getBaseMod()
Now := GoUtil.Now()
Lv := BaseMod.GetLevel()
@ -265,8 +265,8 @@ func TriggerComfortOrder(p *Player) {
OrderMod.CreateNormalOrder(BaseMod.GetLevel(), EmitList, EnergyMul, order.COMFORT_TYPE)
}
func TriggerSeed(player *Player) {
ChampshipMod := player.PlayMod.getChampshipMod()
func (p *Player) TriggerSeed() {
ChampshipMod := p.PlayMod.getChampshipMod()
Items, Score := champshipCfg.GetRewardItems(ChampshipMod.Reward + 1)
if Score < 50 {
return
@ -278,7 +278,7 @@ func TriggerSeed(player *Player) {
break
}
}
BaseMod := player.PlayMod.getBaseMod()
BaseMod := p.PlayMod.getBaseMod()
if !b {
BaseMod.SetSeed(false)
} else {
@ -286,8 +286,8 @@ func TriggerSeed(player *Player) {
}
}
func TriggerSeedSource(player *Player) {
BaseMod := player.PlayMod.getBaseMod()
func (p *Player) TriggerSeedSource() {
BaseMod := p.PlayMod.getBaseMod()
if !BaseMod.GetSeed() {
return
}
@ -295,7 +295,7 @@ func TriggerSeedSource(player *Player) {
Energy := BaseMod.GetEnergy()
Total += Energy
ChessMod := player.PlayMod.getChessMod()
ChessMod := p.PlayMod.getChessMod()
ChessList := ChessMod.GetUnlockChessList()
ChessBuff := ChessMod.GetChessBuf()
AllChess := append(ChessList, ChessBuff...)
@ -322,15 +322,15 @@ func TriggerSeedSource(player *Player) {
BaseMod.SetSource(Total)
}
func TriggerSeedOrder(player *Player) *order.Order {
OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod()
BaseMod := player.PlayMod.getBaseMod()
func (p *Player) TriggerSeedOrder() *order.Order {
OrderMod := p.PlayMod.getOrderMod()
ChessMod := p.PlayMod.getChessMod()
BaseMod := p.PlayMod.getBaseMod()
if !BaseMod.GetSeed() {
return nil
}
OrderMod.CreatOrderPool(BaseMod.Level, ChessMod.GetOrderEmit(), BaseMod.EnergyMul)
ChampshipMod := player.PlayMod.getChampshipMod()
ChampshipMod := p.PlayMod.getChampshipMod()
NeedScore := champshipCfg.GetRewardTotalScore(ChampshipMod.Reward + 1)
E := BaseMod.GetSource()
ChessList := ChessMod.GetUnlockChessList()

View File

@ -86,9 +86,10 @@ type GameResult struct {
}
type CatnipMsg struct {
ActivityId int
GameId int
Growth int // 增长值
ActivityId int
GameId int
Growth int // 增长值
FriendItems int // 赠送好友的道具数量
}
type CatnipLock struct {
@ -108,6 +109,6 @@ func init() {
gob.Register(&ActivityInfo{})
gob.Register(&ChargeExtra{})
gob.Register(&GameResult{})
gob.Register(&CatnipMsg{})
gob.Register(CatnipMsg{})
gob.Register(&CatnipLock{})
}

View File

@ -1,6 +1,8 @@
package game
import (
"bytes"
"encoding/gob"
"fmt"
"math"
mergeDataCfg "server/conf/mergeData"
@ -133,8 +135,8 @@ func UnitOrderSeed(player *Player) error {
BaseMod := player.PlayMod.getBaseMod()
BaseMod.Seed = true
TriggerSeedSource(player)
o := TriggerSeedOrder(player)
player.TriggerSeedSource()
o := player.TriggerSeedOrder()
fmt.Println(o)
elapsed := time.Since(start)
@ -273,16 +275,15 @@ func UnitOrder2(p *Player, Lv, EnergyMul int) float64 {
func UnitChess1(p *Player) error {
ChessMod := p.PlayMod.getChessMod()
p.PushClientRes(ChessMod.BackData())
EmitRetireTrigger1(p)
p.EmitRetireTrigger1()
DailyTaskMod := p.PlayMod.getDailyTaskMod()
p.PushClientRes(DailyTaskMod.BackData())
return nil
}
func UnitPlayroom(p *Player) error {
//PlayroomMod := p.PlayMod.getPlayroomMod()
//PlayroomMod.UnLock(15)
PlayroomBackData(p)
p.PlayroomBackData()
return nil
}
@ -371,3 +372,21 @@ func UnitOrderPetReward(p *Player) error {
}
return nil
}
func UnitCatnip(p *Player) error {
//OrderMod := p.PlayMod.getOrderMod()
//KvMod := p.PlayMod.getKvMod()
ChessMod := p.PlayMod.getChessMod()
var buf bytes.Buffer
encode := gob.NewEncoder(&buf)
encode.Encode(ChessMod)
fmt.Printf("buf len:%dk\n", buf.Len()/1024)
return nil
}
func Benchmark(player *Player) {
ChampshipMod := player.PlayMod.getChampshipMod()
ChampshipMod.AddScore([]int{949, 941, 10})
player.HandleInChampshipRank()
player.HandleInUserRank()
}

View File

@ -48,6 +48,9 @@ func (f *VarMgr) Init() {
if f.data.(*VarData).UserVar == nil {
f.data.(*VarData).UserVar = make(map[string]*VarUserData)
}
if f.data.(*VarData).VarExpire == nil {
f.data.(*VarData).VarExpire = make(map[string]*VarExpireData)
}
if f.getData().ZeroTime == GoUtil.ZeroTimestamp() {
f.ZeroUpdate(&msg.Msg{})
}
@ -86,18 +89,21 @@ func (f *VarMgr) SetCatnipPartner(m *msg.Msg) (interface{}, error) {
MyUid := GoUtil.Int(Param["uid"])
CatnipGameId := GoUtil.Int(Param["game_id"])
CatnipPartnerId := GoUtil.Int(Param["partner_uid"])
myKey := fmt.Sprintf("catnip_partner_%d_%d", MyUid, CatnipGameId)
key := fmt.Sprintf("catnip_partner_%d_%d", CatnipPartnerId, CatnipGameId)
PartnerInfo := f.GetExpireVar(key)
if PartnerInfo.D != nil {
return nil, fmt.Errorf("catnip partner already set for uid %d in game %d", CatnipPartnerId, CatnipGameId)
myKey := fmt.Sprintf("catnip_partner_%d", MyUid)
key := fmt.Sprintf("catnip_partner_%d", CatnipPartnerId)
OtherPartnerInfo := f.GetExpireVar(key)
MyPartnerInfo := f.GetExpireVar(myKey)
MyOfPartnerList := GoUtil.IntSlice(MyPartnerInfo.D)
OtherOfPartnerList := GoUtil.IntSlice(OtherPartnerInfo.D)
if len(MyOfPartnerList) > 4 || len(OtherOfPartnerList) > 4 {
return nil, fmt.Errorf("catnip partner already full for uid %d in game %d", CatnipPartnerId, CatnipGameId)
}
f.SetExpireVar(key, &VarExpireData{
D: MyUid,
D: append(OtherOfPartnerList, MyUid),
T: m.End,
})
f.SetExpireVar(myKey, &VarExpireData{
D: CatnipPartnerId,
D: append(MyOfPartnerList, CatnipPartnerId),
T: m.End,
})
return nil, nil

View File

@ -134,7 +134,7 @@ func ReqAdminShipping(args []interface{}) error {
}
Player := G_GameLogicPtr.GetPlayer(int64(OrderInfo.Uid))
if Player != nil {
go TriggerShippingOrderOrigin(Player, &msg.ReqShippingOrder{
go Player.TriggerShippingOrderOrigin(&msg.ReqShippingOrder{
OrderSn: req.OrderSn,
})
res["Msg"] = "player online,triggered sync"

View File

@ -10,8 +10,10 @@ import (
type CatnipMod struct {
Id int
Game map[int]*CatnipGame
Mul int // 倍数
IsGetGrandReward bool // 是否领取过大丰收奖励
Mul int // 倍数
IsGetGrandReward bool // 是否领取过大丰收奖励
InviteList map[int]*InviteInfo // 邀请列表key: 邀请者ID, value: 被邀请者ID
BeInvitedList map[int]*InviteInfo // 被邀请列表key: 被邀请者ID, value: 邀请者ID
}
type InviteInfo struct {
@ -20,15 +22,14 @@ type InviteInfo struct {
}
type CatnipGame struct {
Id int // 游戏ID
Partner int // 伙伴ID
Progress int // 进度
PartnerAdd int // 伙伴贡献
Reward []int // 已领取阶段奖励
Status int // 0: Not Started, 1: In Progress, 2: Completed
InviteList map[int]*InviteInfo // 邀请列表key: 邀请者ID, value: 被邀请者ID
BeInvitedList map[int]*InviteInfo // 被邀请列表key: 被邀请者ID, value: 邀请者ID
EmojiId int // 表情ID
Id int // 游戏ID
Partner int // 伙伴ID
Progress int // 进度
PartnerAdd int // 伙伴贡献
Reward []int // 已领取阶段奖励
Status int // 0: Not Started, 1: In Progress, 2: Completed
EmojiId int // 表情ID
}
const (
@ -43,6 +44,12 @@ func (c *CatnipMod) InitData() {
if c.Game == nil {
c.Game = make(map[int]*CatnipGame)
}
if c.InviteList == nil {
c.InviteList = make(map[int]*InviteInfo)
}
if c.BeInvitedList == nil {
c.BeInvitedList = make(map[int]*InviteInfo)
}
}
func (c *CatnipMod) Login(Id int) int {
@ -59,14 +66,14 @@ func (c *CatnipMod) Login(Id int) int {
c.Game = make(map[int]*CatnipGame)
c.Mul = 1 // Default multiplier
GameNum := catnipCfg.GetGameNum(c.Id) // Assuming 1 is the default game ID
c.InviteList = make(map[int]*InviteInfo)
c.BeInvitedList = make(map[int]*InviteInfo)
for i := 1; i <= GameNum; i++ {
c.Game[i] = &CatnipGame{
Id: i,
Partner: 0, // No partner initially
Progress: 0, // Initial progress
Status: GAME_STATUS_IDLE, // Not started
InviteList: make(map[int]*InviteInfo), // Initialize invite list
BeInvitedList: make(map[int]*InviteInfo), // Initialize be invited list
Id: i,
Partner: 0, // No partner initially
Progress: 0, // Initial progress
Status: GAME_STATUS_IDLE, // Not started
}
}
return c.Id
@ -76,75 +83,75 @@ func (c *CatnipMod) ZeroUpdate(Id int) {
c.Login(Id)
}
func (c *CatnipMod) Invite(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != 0 {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
func (c *CatnipMod) Invite(Uid, Id int) error {
if c.InviteList[Uid] != nil {
return fmt.Errorf("user with ID %d is already invited", Uid)
}
if GameInfo.InviteList[Uid] != nil {
return fmt.Errorf("user with ID %d is already invited to game ID %d", Uid, Id)
}
GameInfo.InviteList[Uid] = &InviteInfo{
InviteId: Uid,
c.InviteList[Uid] = &InviteInfo{
InviteId: Id,
Time: GoUtil.Now(),
}
return nil
}
func (c *CatnipMod) BeInvited(Id, Uid int, Time int64) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
func (c *CatnipMod) BeInvited(Uid int, Time int64) error {
// Check if the user is already invited
invite := GameInfo.BeInvitedList[Uid]
if invite != nil && invite.InviteId == Id {
return fmt.Errorf("user with ID %d has already been invited to game ID %d", Uid, Id)
invite := c.BeInvitedList[Uid]
if invite != nil {
return fmt.Errorf("user with ID %d has already been invited ", Uid)
}
GameInfo.BeInvitedList[Uid] = &InviteInfo{
InviteId: Id,
c.BeInvitedList[Uid] = &InviteInfo{
InviteId: Uid,
Time: Time,
}
return nil
}
func (c *CatnipMod) Agree(Id, Uid int) ([]int, error) {
GameInfo, ok := c.Game[Id]
if !ok {
return nil, fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return nil, fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
// Check if the user is in the invite list
_, exists := GameInfo.InviteList[Uid]
_, exists := c.BeInvitedList[Uid]
if !exists {
return nil, fmt.Errorf("user with ID %d is not invited to game ID %d", Uid, Id)
}
// Remove the invite after agreeing
delete(GameInfo.InviteList, Uid)
GameInfo.Partner = Uid // Set the partner for the game
GameInfo.Status = GAME_STATUS_COMPLETED // Set the game status to completed
delete(c.BeInvitedList, Uid)
for _, GameInfo := range c.Game {
if GameInfo.Partner == 0 {
GameInfo.Partner = Uid
GameInfo.Status = GAME_STATUS_IN_PROGRESS
return []int{}, nil
}
}
return []int{}, nil
}
func (c *CatnipMod) BeAgree(Id, Uid int) ([]int, error) {
info, exists := c.InviteList[Uid]
if !exists {
return nil, fmt.Errorf("user with ID %d is not invited to game ID %d", Uid, Id)
}
// Remove the invite after agreeing
GameInfo := c.Game[info.InviteId]
if GameInfo.Partner == 0 {
GameInfo.Partner = Uid
GameInfo.Status = GAME_STATUS_IN_PROGRESS
delete(c.InviteList, Uid)
return []int{}, nil
}
delete(c.InviteList, Uid)
for _, GameInfo := range c.Game {
if GameInfo.Partner == 0 {
GameInfo.Partner = Uid
GameInfo.Status = GAME_STATUS_IN_PROGRESS
return []int{}, nil
}
}
return []int{}, nil
}
func (c *CatnipMod) DelInvited(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
delete(GameInfo.InviteList, Uid)
delete(c.InviteList, Uid)
return nil
}
@ -154,44 +161,39 @@ func (c *CatnipMod) Multiply(Mul int) error {
}
func (c *CatnipMod) Refuse(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
delete(GameInfo.BeInvitedList, Uid)
delete(c.BeInvitedList, Uid)
return nil
}
func (c *CatnipMod) Play(Id int) (int, int, int, []*item.Item, []*item.Item, error) {
func (c *CatnipMod) Play(Id int) (int, int, int, []*item.Item, []*item.Item, int, error) {
GameInfo, ok := c.Game[Id]
if !ok {
return 0, 0, 0, nil, nil, fmt.Errorf("game with ID %d does not exist", Id)
return 0, 0, 0, nil, nil, 0, fmt.Errorf("game with ID %d does not exist", Id)
}
Id, Items, Growth := catnipCfg.GetJackpotItem(c.Mul)
if GameInfo.Status != GAME_STATUS_IN_PROGRESS {
return 0, 0, 0, nil, nil, 0, fmt.Errorf("game with ID %d is not in progress", Id)
}
Id, Items, Growth, FriendItems := catnipCfg.GetJackpotItem(c.Mul)
Growth = Growth * c.Mul
if Growth > 0 {
c.Growth(Id, Growth)
}
ItemCost := catnipCfg.GetItemCost(c.Id, c.Mul)
GameInfo.Progress += Growth
return Id, Growth, GameInfo.Partner, Items, ItemCost, nil
return Id, Growth, GameInfo.Partner, Items, ItemCost, FriendItems, nil
}
func (c *CatnipMod) Reward(Id, Progress int) ([]*item.Item, error) {
func (c *CatnipMod) Reward(Id int) ([]*item.Item, *CatnipGame, error) {
GameInfo, ok := c.Game[Id]
if !ok {
return nil, fmt.Errorf("game with Progress %d does not exist", Id)
return nil, nil, fmt.Errorf("game with Progress %d does not exist", Id)
}
if GameInfo.Progress < Progress {
return nil, fmt.Errorf("game with ID %d has not reached the required progress %d", Id, Progress)
Items, Ids := catnipCfg.GetProgressReward(c.Id, GameInfo.Reward, GameInfo.Progress)
GameInfo.Reward = append(GameInfo.Reward, Ids...)
if Items == nil {
return nil, nil, fmt.Errorf("no reward found for progress %d in game ID %d", GameInfo.Progress, Id)
}
if GoUtil.InArray(Progress, GameInfo.Reward) {
return nil, fmt.Errorf("reward for progress %d has already been claimed in game ID %d", Progress, Id)
}
GameInfo.Reward = append(GameInfo.Reward, Progress)
return catnipCfg.GetProgressReward(c.Id, Progress), nil
return Items, GameInfo, nil
}
func (c *CatnipMod) GrandReward() ([]*item.Item, error) {
@ -216,16 +218,37 @@ func (c *CatnipMod) Growth(Id, Growth int) {
return // Game is not in progress
}
GameInfo.Progress += Growth
if GameInfo.Progress >= catnipCfg.GetGameNum(Id) { // Assuming the game ends when progress reaches a certain threshold
if GameInfo.Progress >= catnipCfg.GetGameMaxProgress(c.Id) { // Assuming the game ends when progress reaches a certain threshold
GameInfo.Status = GAME_STATUS_COMPLETED
}
}
func (c *CatnipMod) SetEmoji(Id, EmojiId int) {
GameInfo, ok := c.Game[Id]
if !ok {
return // Game does not exist
func (c *CatnipMod) GrowthByUid(Uid, Growth int) {
for _, v := range c.Game {
if v.Partner == Uid {
v.Progress += Growth
v.PartnerAdd += Growth
if v.Progress >= catnipCfg.GetGameMaxProgress(c.Id) { // Assuming the game ends when progress reaches a certain threshold
v.Status = GAME_STATUS_COMPLETED
}
}
}
// Here we can set the emoji for the game. This is a placeholder implementation.
GameInfo.EmojiId = EmojiId
}
func (c *CatnipMod) SetEmoji(Uid, EmojiId int) {
for _, v := range c.Game {
if v.Partner == Uid {
v.EmojiId = EmojiId
return
}
}
}
func (c *CatnipMod) GetMultiple() int {
return c.Mul
}
func (c *CatnipMod) GetGameInfo(Id int) *CatnipGame {
return c.Game[Id]
}

View File

@ -185,7 +185,7 @@ func (d *Decorate) GetDecorateReward(areaId int) ([]*item.Item, error) {
return nil, fmt.Errorf("areaId already rewarded")
}
d.AreaReward = append(d.AreaReward, areaId)
return decorateCfg.GetDecoarteReward(areaId, 20), nil
return decorateCfg.GetAreaReward(areaId), nil
}
func (d *Decorate) GetAreaId() int {

View File

@ -35,6 +35,7 @@ type ReplyInfo struct {
AddTime int64
ReplyTime int64
EndTime int64
Items []*item.Item
}
type ActLogInfo struct {
@ -69,7 +70,8 @@ type ApplyInfo struct {
const (
REPLY_TYPE_GREETING = 1 // 问候
REPLY_TYPE_GREETING_Get = 2 // 收到问候
REPLY_TYPE_CATNIP = 3 // 猫薄荷
REPLY_TYPE_CATNIP = 3 // 猫薄荷加好友
REPLY_TYPE_CATNIP_ITEMS = 4 // 收到猫薄荷好友道具
)
// 24小时内与玩家进行过以下互动的用户若被选中参加本次宠物宝藏在其头像旁添加礼物盒
@ -500,9 +502,8 @@ func (f *FriendMod) GetActLogLast() *ActLogInfo {
return f.ActivityLog[len(f.ActivityLog)-1]
}
func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string, EndTime int64) {
func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string, EndTime int64, Items []*item.Item) {
f.AutoId++
f.ReplyList = append(f.ReplyList, &ReplyInfo{
Id: f.AutoId,
Uid: Uid,
@ -511,6 +512,7 @@ func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string, EndTime int64)
Status: 0,
AddTime: GoUtil.Now(),
EndTime: EndTime,
Items: Items,
})
}

View File

@ -89,9 +89,11 @@ func (g *GuessColorMod) FirstIn() []*item.Item {
}
func (g *GuessColorMod) Take(Map map[int32]int32, OMap map[int32]int32) {
g.MapList = append(g.MapList, Map)
if len(Map) > 0 {
g.MapList = append(g.MapList, Map)
g.Guess++
}
g.OMap = OMap
g.Guess++
}
func (g *GuessColorMod) GetLoseItem() []*item.Item {

View File

@ -110,7 +110,8 @@ const (
HANDLE_TYPE_CHAMPSHIP_LOGIN // 锦标赛登录
HANDLE_TYPE_CHAMPSHIP_RANK_INFO // 锦标赛排名信息
HANDLE_TYPE_SET_CATNIP_PARTNER
HANDLE_TYPE_SET_CATNIP_PARTNER // 设置猫薄荷伙伴
HANDLE_TYPE_CATNIP_SEND_EMOJI // 发送猫薄荷表情
)
const (

View File

@ -501,7 +501,7 @@ func randOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul, OrderType int) (
}
//获取订单体力范围和棋子数量
MinEnergy, MaxEnergy, ChessNum := getChessByDiff(lv, OrderDiff, OrderType)
mergeList := getChessFromPoolByEnergy(o, MinEnergy, MaxEnergy, ChessNum, Emit, EnergyMul, OrderDiff)
mergeList := getChessFromPoolByEnergy(o, MinEnergy, MaxEnergy, ChessNum, Emit, EnergyMul, OrderDiff, OrderType)
return mergeList, OrderDiff, nil
}
@ -626,7 +626,7 @@ func ShuffleColor(List []string, Last string) []string {
}
// 获取发射器系列
func getEmitSeries(o *OrderMod, Emit []int) string {
func getEmitSeries(o *OrderMod, Emit []int, OrderType int) string {
o.initColorShuffle(Emit)
PopEmitId := ""
NewSlice := make([]string, 0)
@ -652,6 +652,14 @@ func getEmitSeries(o *OrderMod, Emit []int) string {
if o.LastColor == PopEmitId {
continue
}
if OrderType == Pet_type {
EmitId := getEmitBySeries(Emit, PopEmitId)
EmitInfo, _ := mergeDataCfg.GetOne(EmitId)
if EmitInfo.Emit_Type == "auto" {
continue
}
}
PopEmitIdProductNum := mergeDataCfg.GetEmitProductNumByColor(PopEmitId)
o.initColorShuffle(Emit)
// 单链棋子 且订单中已有两个 跳过
@ -845,10 +853,10 @@ func (o *OrderMod) getChessIdPool(Emit []int, Color string, EnergyMul, Lv, MinEn
}
return Chess, ChessLv
}
func getChessFromPoolByEnergy(o *OrderMod, MinEnergy, MaxEnergy, ChessNum int, Emit []int, EnergyMul, OrderDiff int) []int {
func getChessFromPoolByEnergy(o *OrderMod, MinEnergy, MaxEnergy, ChessNum int, Emit []int, EnergyMul, OrderDiff, OrderType int) []int {
ColorArr := make([]string, 0)
for i := 0; i < ChessNum; i++ {
ColorArr = append(ColorArr, getEmitSeries(o, Emit))
ColorArr = append(ColorArr, getEmitSeries(o, Emit, OrderType))
}
if len(ColorArr) == 2 && ColorArr[0] == ColorArr[1] {
log.Default()
@ -876,7 +884,7 @@ func getChessFromPoolByEnergy(o *OrderMod, MinEnergy, MaxEnergy, ChessNum int, E
// 从棋子池中获取棋子
func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) int {
Color := getEmitSeries(o, Emit)
Color := getEmitSeries(o, Emit, 0)
EmitChessId := getEmitBySeries(Emit, Color)
//ColorRand := mergeDataCfg.GetEmitProduceType(EmitChessId)
// 从棋子池中获取棋子

View File

@ -16,6 +16,7 @@ type MergeDataRecord struct {
Type string `json:"Type"`
Emit_Product string `json:"Emit_Product"`
Color string `json:"Color"`
Emit_Type string `json:"Emit_Type"`
}
type StartOrderData struct {

View File

@ -11,7 +11,6 @@ require (
github.com/alibabacloud-go/tea-utils/v2 v2.0.7
github.com/aliyun/credentials-go v1.4.6
github.com/go-sql-driver/mysql v1.8.1
github.com/gorilla/mux v1.8.1
github.com/gorilla/websocket v1.5.3
github.com/jmoiron/sqlx v1.4.0
github.com/redis/go-redis/v9 v9.6.1
@ -61,9 +60,9 @@ require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/tuyou/galog v0.0.0
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
github.com/tuyou/galog v0.0.0
)
replace github.com/tuyou/galog => ./galog

View File

@ -124,8 +124,6 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,52 @@
package test
import (
"testing"
"google.golang.org/protobuf/proto"
"server/game"
"server/msg"
)
func TestCatnipBackData(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("aaa001")
game.G_GameLogicPtr.SetPlayer(p1)
p1.CatnipBackData()
}
func TestReqCatnipEmoji(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("aaa001")
game.G_GameLogicPtr.SetPlayer(p1)
req := &msg.ReqCatnipEmoji{
Id: 1,
EmojiId: 1,
}
data, err := proto.Marshal(req)
if err != nil {
t.Fatalf("proto.Marshal error: %v", err)
}
if err := game.ReqCatnipEmoji(p1, data); err != nil {
t.Fatalf("ReqCatnipEmoji returned error: %v", err)
}
}
func TestReqCatnipReward(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("aaa001")
game.G_GameLogicPtr.SetPlayer(p1)
req := &msg.ReqCatnipReward{
Id: 2,
}
data, err := proto.Marshal(req)
if err != nil {
t.Fatalf("proto.Marshal error: %v", err)
}
if err := game.ReqCatnipReward(p1, data); err != nil {
t.Fatalf("ReqCatnipReward returned error: %v", err)
}
}

View File

@ -0,0 +1,48 @@
{
"AppID": 1,
"LogLevel": "debug",
"LogPath": "./log",
"TCPAddr": ":3601",
"WSAddr": ":3566",
"MySqlAddr": "127.0.0.1",
"MySqlPort": "3306",
"MySqlUsr": "root",
"MySqlPwd": "IOagNEq3C84c-20CmHEin5iODVc=",
"MaxConnNum": 20000,
"DbName": "Merge_Pet_1",
"HttpPort": ":8081",
"AppPath": "./app",
"TELOGDIR" : "./teLog/",
"GameName": "Merge_Pet_Local",
"ServerType":"node",
"ServerID": 1,
"ServerOpenTime": "2018-01-01 00:00:00",
"ServerName": "Merge_Pet",
"ServerStatus" : 1,
"ServerCenter" : 1,
"GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/",
"ListenAddr":":9001",
"CenterAddr": "pethome.bywaystudios.com:9000",
"RemoteAddr":"host.docker.internal:9001",
"RedisAddr":"127.0.0.1",
"RedisPort" :"6379",
"RedisPwd" :"",
"RedisWriteAddr":"127.0.0.1:6379",
"RedisReadAddrs":"127.0.0.1:6379",
"RedisMasterName":"mymaster",
"RedisConnType":"Direct",
"GoogleVerify":false,
"Partition":3,
"KafkaHost":"kafka-server",
"CountryCode":"004",
"KafkaPort":"9092",
"Version":"1.0.0",
"IdVerify":false
}