Merge branch 'sdk' into online

This commit is contained in:
hahwu 2026-03-10 21:56:16 +08:00
commit 71dc9e1b7e
76 changed files with 3320 additions and 877 deletions

1
.gitignore vendored
View File

@ -19,3 +19,4 @@ src/server/test/logs/*
src/server/test/teLog/*
src/server/*.exe*
src/server/msg/Gameapi.pb.go
src/server/gen-go

View File

@ -0,0 +1,24 @@
package backend
func Start() {
// addr := net.JoinHostPort("localhost", "9090")
// handler := NewGameServiceHandler()
// //创建处理器
// processor := backend.NewGameAdminServiceProcessor(handler)
// transportFactory := thrift.NewTBufferedTransportFactory(8192)
// protocolFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{})
// tcpAddr, err := net.ResolveTCPAddr("tcp", addr)
// if err != nil {
// fmt.Printf("Failed to resolve address %s: %v\n", addr, err)
// return
// }
// serverTransport := thrift.NewTServerSocketFromAddrTimeout(tcpAddr, 0)
// server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory)
// fmt.Printf("Starting the server on %s...\n", addr)
// if err := server.Serve(); err != nil {
// fmt.Printf("Error starting the server: %v\n", err)
// }
}

View File

@ -0,0 +1,135 @@
package backend
// type GameServiceHandler struct{}
// func NewGameServiceHandler() *GameServiceHandler {
// return &GameServiceHandler{}
// }
// func (h *GameServiceHandler) ReqPlayerInfo(ctx context.Context, id int64) (*backend.ResAdminInfo, error) {
// player := game.G_GameLogicPtr.GetPlayer(int64(id))
// online := true
// if player == nil {
// player = new(game.Player)
// player.M_DwUin = int64(id)
// player.InitPlayerOnly()
// player.ZeroUpdate(nil)
// online = false
// }
// res := &backend.ResAdminInfo{}
// res.Name = player.GetBaseMod().NickName
// res.UID = player.M_DwUin
// res.AreaId = int32(player.GetDecorateMod().GetAreaId())
// res.Face = int32(player.GetFaceMod().SetId)
// res.Charge = player.GetChargeMod().Charge
// res.MaxCharge = player.GetChargeMod().MaxCharge
// res.Level = int32(player.GetPlayerBaseMod().GetLevel())
// res.Diamond = int32(player.GetPlayerBaseMod().GetDiamond())
// res.Star = int32(player.GetPlayerBaseMod().GetStar())
// res.Energy = int32(player.GetPlayerBaseMod().GetEnergy())
// res.UserName = player.GetPlayerBaseMod().GetName()
// res.LoginTime = player.GetBaseMod().LoginTime
// res.Cumulative = int32(player.GetBaseMod().Cumulative)
// res.RegisterTime = int32(player.GetPlayerBaseMod().GetRegisterTime())
// res.TodayCumulative = int32(player.GetBaseMod().TodayCumulative)
// res.Ban = int8(db.GetPlayerBan(player.GetBaseMod().Account))
// if online {
// res.Cumulative = int32(int64(player.GetBaseMod().Cumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
// res.TodayCumulative = int32(int64(player.GetBaseMod().TodayCumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
// }
// res.Code = player.GetBaseMod().AddCode
// res.ChessMap = player.GetChessMod().ChessMap
// resActLog := make([]*backend.Actlog, 0, len(player.GetFriendMod().ActivityLog))
// for _, log := range player.GetFriendMod().ActivityLog {
// resActLog = append(resActLog, &backend.Actlog{
// Type: int8(log.Type),
// Time: log.Time,
// Param: log.Param,
// })
// }
// res.ActLog = resActLog
// friendList := player.GetFriendMod().NewFriendList
// type friendInfo struct {
// Uid int64
// NickName string
// Avatar int
// Level int
// LogoutTime int64
// LoginTime int64
// }
// resFriendList := make([]*backend.FriendInfo, 0, len(friendList))
// for v := range friendList {
// ps := game.G_GameLogicPtr.GetSimplePlayerByUid(v)
// if ps == nil {
// continue
// }
// resFriendList = append(resFriendList, &backend.FriendInfo{
// UID: int64(v),
// NickName: ps.Name,
// Face: int32(ps.Face),
// Level: int32(ps.Level),
// LogoutTime: ps.Loginout,
// LoginTime: ps.Login,
// })
// }
// res.FriendList = resFriendList
// OrderMap := make(map[int32]*backend.OrderInfo)
// Index := 0
// for k, v := range player.GetOrderMod().OrderList {
// OrderMap[int32(Index)] = &backend.OrderInfo{
// ID: int32(k),
// Type: int32(v.Type),
// Time: v.Timestamp,
// ChessId: GoUtil.IntSliceToString(v.MergeId),
// Diff: int8(v.Diff),
// }
// Index++
// }
// res.OrderList = OrderMap
// return res, nil
// }
// func (h *GameServiceHandler) ReqReloadServerMail(ctx context.Context) (*backend.ResMessage, error) {
// game.G_GameLogicPtr.MailMgrCall(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL_RELOAD})
// game.G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL})
// log.Debug("ReqReloadServerMail success")
// return &backend.ResMessage{
// Code: 0,
// }, nil
// }
// func (h *GameServiceHandler) ReqConfigReload(ctx context.Context) (*backend.ResMessage, error) {
// gamedata.Reload()
// return &backend.ResMessage{
// Code: 0,
// }, nil
// }
// func (h *GameServiceHandler) ReqAdminGm(ctx context.Context, uid int64, command string) (*backend.ResMessage, error) {
// player := game.G_GameLogicPtr.GetPlayer(uid)
// if player == nil {
// return &backend.ResMessage{
// Code: 1,
// Msg: "player not online",
// }, nil
// }
// player.Lock()
// defer player.UnLock()
// err := game.ReqGmCommand_(player, command)
// if err != nil {
// return &backend.ResMessage{
// Code: 1,
// Msg: err.Error(),
// }, nil
// }
// return &backend.ResMessage{
// Code: 0,
// }, nil
// }
// func (h *GameServiceHandler) ReqAdminBan(ctx context.Context, uid int64, banTime int64) (*backend.ResMessage, error) {
// db.UpdatePlayerBan(uid, banTime)
// return &backend.ResMessage{
// Code: 0,
// }, nil
// }

View File

@ -95,7 +95,7 @@ func (a *Agent) Run() {
m := msg.Msg{}
err = GoUtil.GobUnmarshal(data, &m)
if err != nil {
log.Debug("decode err: %v", err)
log.Debug("decode err: %v, data: %s", err, string(data))
return
}
err = processMsg(a, &m)

View File

@ -90,6 +90,42 @@ func GetActivityList() []*gamedata.ActivityData {
}
return List
}
func GetActivityListOrigin() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
return nil
}
List := make([]*gamedata.ActivityData, 0, len(data))
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetActivityList parse id err:%v, key:%s", err, k)
continue
}
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
Level := gamedata.GetIntValue(v, "Level")
ActivityData := &gamedata.ActivityData{
Id: Id,
Type: Type,
AType: gamedata.GetIntValue(v, "AType"),
Name: Name,
Title: Title,
Level: Level,
StartTime: StartTime,
EndTime: EndTime,
}
List = append(List, ActivityData)
}
return List
}
func GetActivityRewardItems(ActId int) []*item.Item {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)

View File

@ -1,6 +1,7 @@
package avatarCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -31,6 +32,15 @@ func GetInitList() []int {
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_AVATAR)
if err != nil {

View File

@ -5,6 +5,7 @@ import (
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
@ -12,6 +13,7 @@ const (
CFG_CHAMPSHIP_RANK = "ChampshipRank"
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
CFG_CHAMPSHIP_GROUP = "ChampshipGroup"
CFG_CHAMPSHIP_CONST = "ChampshipConst"
)
func init() {
@ -19,20 +21,21 @@ func init() {
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
gamedata.InitCfg(CFG_CHAMPSHIP_GROUP)
gamedata.InitCfg(CFG_CHAMPSHIP_CONST)
}
func GetGroupId(N int) int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_GROUP)
if err != nil {
log.Debug("GetGroupId err:%v, N=%d", err, N)
return 0
return 1
}
for k, v := range data {
if N >= gamedata.GetIntValue(v, "Min") && N <= gamedata.GetIntValue(v, "Max") {
return GoUtil.Int(k)
}
}
return 0
return 11
}
func GetChessScore(ChessLv int) int {
@ -44,7 +47,7 @@ func GetChessScore(ChessLv int) int {
return gamedata.GetIntValue(data, "Score")
}
func GetReward(Reward, Score int) (int, []*item.Item) {
func GetReward(Reward, Score, activityId, orderFactor int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
log.Debug("GetReward err:%v, Reward=%d, Score=%d", err, Reward, Score)
@ -52,15 +55,27 @@ func GetReward(Reward, Score int) (int, []*item.Item) {
}
r := make([]*item.Item, 0, len(data))
NewReward := Reward
for k, v := range data {
Id := GoUtil.Int(k)
for _, v := range data {
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if rewardGroupType != activityId {
continue
}
Id := gamedata.GetIntValue(v, "Step")
if Reward >= Id {
continue
}
if Score >= gamedata.GetIntValue(v, "Total") {
Items := item.ParseItem(gamedata.GetValue(v, "Items"))
r = item.Merge(r, Items)
NewReward = max(NewReward, Id)
if Score < gamedata.GetIntValue(v, "Total") {
continue
}
Items := item.ParseItem(gamedata.GetValue(v, "Items"))
r = item.Merge(r, Items)
NewReward = max(NewReward, Id)
starReward := gamedata.GetIntValue(v, "StarReward")
if starReward > 0 {
starnum := int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
r = append(r, item.NewItem(item.ITEM_STAR_ID, starnum))
}
}
}
return NewReward, r
@ -84,14 +99,14 @@ func GetRewardTotalScore(Reward int) int {
return gamedata.GetIntValue(data, "Total")
}
func GetRankReward(Rank int) []*item.Item {
func GetRankReward(Rank, yesterdayActivityId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHAMPSHIP_RANK)
if err != nil {
log.Debug("GetRankReward err:%v, Rank=%d", err, Rank)
log.Debug("GetRankReward err:%v, Rank=%d, yesterdayActivityId=%d", err, Rank, yesterdayActivityId)
return nil
}
for _, v := range data {
if Rank >= gamedata.GetIntValue(v, "Min") && Rank <= gamedata.GetIntValue(v, "Max") {
if Rank >= gamedata.GetIntValue(v, "Min") && Rank <= gamedata.GetIntValue(v, "Max") && yesterdayActivityId == gamedata.GetIntValue(v, "RewardGroupType") {
return gamedata.GetItemList(v, "Items")
}
}
@ -113,3 +128,20 @@ func GetMaxRewardId() int {
}
return MaxId
}
func GetChampshipActivityId() []int {
data, err := gamedata.GetDataByKey(CFG_CHAMPSHIP_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetChampshipActivityId err:%v", err)
return nil
}
value := gamedata.GetStringValue(data, "Value")
var res []int
for _, v := range strings.Split(value, "|") {
id := GoUtil.Int(v)
if id > 0 {
res = append(res, id)
}
}
return res
}

View File

@ -5,6 +5,7 @@ import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
@ -12,6 +13,7 @@ const (
DAILY_TASK = "DailyTask"
DAILY_TASK_ACTIVE = "DailyTaskActive"
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
DAILY_TASK_REWARD = "DailyTaskReward"
)
func init() {
@ -19,6 +21,67 @@ func init() {
gamedata.InitCfg(DAILY_TASK)
gamedata.InitCfg(DAILY_TASK_ACTIVE)
gamedata.InitCfg(DAILY_TASK_JACKPOT)
gamedata.InitCfg(DAILY_TASK_REWARD)
}
func GetDailyTaskReward(Id, factory, activityId int) []*item.Item {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskReward err:%v", err)
return nil
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
items := gamedata.GetItemList(v, "ItemID")
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
if petCoinBase > 0 {
petCoinNum := int(float64(petCoinBase) * (float64(factory)/1000 + 1))
petCoinNum = (petCoinNum/5 + 1) * 5 // 向上取整到5的倍数
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: petCoinNum,
})
}
return items
}
}
return nil
}
func GetDailyTaskScore(Id, activityId int) int {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskScore err:%v", err)
return 0
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
return gamedata.GetIntValue(v, "ScoreReward")
}
}
return 0
}
func GetActivityIds() []int {
data, err := gamedata.GetDataByKey(DAILY_TASK_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetActivityIds err:%v", err)
return nil
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
result := make([]int, 0, len(strArr))
for _, v := range strArr {
a, _ := strconv.Atoi(v)
if a != 0 {
result = append(result, a)
}
}
return result
}
// 获取任务列表

View File

@ -36,6 +36,21 @@ func GetStarCost(AreaId, SortId int) int {
return 0
}
func GetStarCostByAreaId(AreaId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetStarCost err:%v, AreaId=%d", err, AreaId)
return 0
}
var total int
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId {
total += gamedata.GetIntValue(v, "CostCount")
}
}
return total
}
func GetAreaId(id int) int {
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
if err != nil {

View File

@ -1,6 +1,7 @@
package faceCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -35,6 +36,15 @@ func GetInitList() []int {
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {

View File

@ -41,3 +41,30 @@ func GetFriendLimitNum() int {
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyRecommendLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_recommend_limit")
if err != nil {
log.Debug("GetDailyRecommendLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetApplyListLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_apply_list_limit")
if err != nil {
log.Debug("GetApplyListLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyGetApplyLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_get_apply_limit")
if err != nil {
log.Debug("GetDailyGetApplyLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -0,0 +1,73 @@
package fur_cfg
import (
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_FUR_CONST = "FurShopConst"
CFG_FUR_SHOP = "FurShop"
)
func init() {
gamedata.InitCfg(CFG_FUR_CONST)
gamedata.InitCfg(CFG_FUR_SHOP)
}
func GetFurShopCost(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Cost")
}
func GetFurShopFreeTimes() int {
data, err := gamedata.GetDataByKey(CFG_FUR_CONST, "free_unlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFurShopTag(id int) int {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "TAG")
}
func GetFurShopName(id int) string {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetFurShopItem(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
itemId := gamedata.GetIntValue(data, "ItemID")
if itemId == 0 {
return nil
}
return []*item.Item{
{
Id: itemId,
Num: 1,
},
}
}
func GetFurShopCostNum(id int) int {
item := GetFurShopCost(id)
if len(item) == 0 {
return 0
}
return item[0].Num
}

View File

@ -46,6 +46,14 @@ func GetLoseItem(Id int) []*item.Item {
return gamedata.GetItemList(data, "ItemCost")
}
func GetStartItemNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "StartItemNum")
}
func GetPassArea(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
@ -88,10 +96,35 @@ func GetRandItem() []*item.Item {
return gamedata.GetItemList(Info, "Items")
}
func GetPassItem(Id int) []*item.Item {
func GetPassItem(Id int, orderFactor int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
items := gamedata.GetItemList(data, "Items")
starReward := gamedata.GetIntValue(data, "StarReward")
var starnum int
if starReward > 0 {
starnum = int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: starnum,
})
}
}
return items
}
func GetPassItemList(orderFactor int) map[int][]*item.Item {
data, err := gamedata.GetData(CFG_MINING_PASS)
if err != nil {
return nil
}
result := make(map[int][]*item.Item)
for k := range data {
Id := GoUtil.Int(k)
result[Id] = GetPassItem(Id, orderFactor)
}
return result
}

View File

@ -1,6 +1,7 @@
package orderCfg
import (
"math"
"server/gamedata"
"sort"
"strconv"
@ -33,8 +34,7 @@ func GetOrderK(Lv int) int {
}
Energy := gamedata.GetIntValue(data, "Energy")
K := gamedata.GetFloatValue(data, "K")
a := float64(Energy)*K/10 + 0.5
return int(a) * 10
return int(math.Round(float64(Energy)*K/10) * 10)
}
func GetOrderFactor(Scene int) int {

View File

@ -40,7 +40,7 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
return result
}
func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH)
if err != nil {
log.Debug("GetSevenLoginReward err:%v", err)
@ -48,6 +48,10 @@ func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
}
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
month := gamedata.GetIntValue(v, "Month")
if month != nowMonth {
continue
}
Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond")
RewardNum := gamedata.GetIntValue(v, "RewardNum")

View File

@ -442,3 +442,13 @@ func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) {
}
return res, nil
}
func GetDebugPlayer(uid int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? ORDER BY login_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}

View File

@ -219,6 +219,20 @@ func RedisZRevRangeWithScores(key string, start, stop int64) ([]redis.Z, error)
return val, nil
}
func RedisZGetByIndexWithScore(key string, index int64) (*redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRangeWithScores(ctx, key, index, index).Result()
if err != nil {
return nil, err
}
if len(val) == 0 {
return nil, nil
}
return &val[0], nil
}
func RedisZRankWithScores(key, member string) (int64, float64, error) {
if RdbRead == nil {
return 0, 0, nil
@ -234,6 +248,17 @@ func RedisZRankWithScores(key, member string) (int64, float64, error) {
return val, score, nil
}
func RedisZCard(key string) (int64, error) {
if RdbRead == nil {
return 0, nil
}
val, err := RdbRead.ZCard(ctx, key).Result()
if err != nil {
return 0, err
}
return val, nil
}
func RedisDel(key string) {
if RdbWrite == nil {
log.Debug("redis write client is nil")

View File

@ -212,6 +212,7 @@ func (ad *GameLogic) NewAccountInsertDataToDB() bool {
player := new(Player)
BaseMod := player.PlayMod.getBaseMod()
BaseMod.Account = ad.Db_AccountInfo.UserName
BaseMod.RegisterTime = time.Now().Unix()
player.TeLog("register", nil)
return true
@ -454,6 +455,7 @@ func (ad *GameLogic) GetResFriendPlayerByUid(Id int) *msg.ResFriendPlayerSimple
Physiology: GoUtil.MapIntToInt32(player.Physiology),
Last: last,
PetName: player.PetName,
PetFur: int32(player.PetFur),
}
}
@ -640,6 +642,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqKv", ReqKv) // 保存客户端数据
RegisterMsgProcessFunc("ReqGetEnergyByAD", ReqGetEnergyByAD) // 看广告获取能量
RegisterMsgProcessFunc("ReqBuyEnergy", ReqBuyEnergy) // 购买能量
RegisterMsgProcessFunc("ReqAdWatch", ReqAdWatch) // 观看广告
// #region 棋盘
RegisterMsgProcessFunc("ReqPlayerChessData", ReqPlayerChessDataFunc)
RegisterMsgProcessFunc("UpdatePlayerChessData", UpdatePlayerChessDataFunc) // 更新棋盘数据
@ -840,6 +843,9 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqPlayroomTaskReward", ReqPlayroomTaskReward) // 领取任务奖励
RegisterMsgProcessFunc("ReqPlayroomGameShowReward", ReqPlayroomGameShowReward) // 展示游戏结果数据
RegisterMsgProcessFunc("ReqPlayroomGuide", ReqPlayroomGuide) // 展示游戏结果数据
RegisterMsgProcessFunc("ReqPetFur", ReqPetFur) // 宠物毛皮信息
RegisterMsgProcessFunc("ReqPetFurBuy", ReqPetFurBuy) // 宠物毛皮商店购买
RegisterMsgProcessFunc("ReqFurSet", ReqFurSet) //宠物毛皮设置
// 宠物宝藏
RegisterMsgProcessFunc("ReqFriendTreasure", ReqFriendTreasure) // 请求好友宝藏数据
RegisterMsgProcessFunc("ReqFriendTreasureStart", ReqFriendTreasureStart) // 开始游戏

View File

@ -4,9 +4,12 @@ import (
"fmt"
activityCfg "server/conf/activity"
catnipCfg "server/conf/catnip"
champshipCfg "server/conf/champship"
dailyTaskCfg "server/conf/daily_task"
guesscolorCfg "server/conf/guess_color"
languageCfg "server/conf/language"
miningCfg "server/conf/mining"
orderCfg "server/conf/order"
passCfg "server/conf/pass"
raceCfg "server/conf/race"
"server/game/mod/activity"
@ -14,6 +17,7 @@ import (
"server/game/mod/mail"
GoUtil "server/game_util"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
)
// 活动模块 登录
@ -75,6 +79,16 @@ func (p *Player) ActivityLogin() {
p.SendActivityMail(ItemId, ItemNum, PassActivityId, RewardItems)
}
}
// 初始化活动道具
initItem := p.GetMiningMod().GetInitItem()
if len(initItem) > 0 {
err := p.HandleItem(initItem, "")
if err != nil {
log.Debug("ActivityLogin initItem err : %s", err)
}
}
}
// 发送活动邮件
@ -185,16 +199,24 @@ func (p *Player) MiningBackData() {
}
Status := p.GetActivityStatus(activity.ACT_TYPE_MINING)
Template := miningCfg.GetTemplate(ActivityInfo.Id)
DecorateMod := p.PlayMod.getDecorateMod()
orderFactor := orderCfg.GetOrderFactor(DecorateMod.GetAreaId())
passRewardList := miningCfg.GetPassItemList(orderFactor)
resPassRewardList := make(map[int32]*msg.ItemList)
for k, v := range passRewardList {
resPassRewardList[int32(k)] = item.ItemListToMsg(v)
}
MiningMod := p.PlayMod.getMiningMod()
p.PushClientRes(&msg.ResMining{
Id: int32(ActivityInfo.Id),
Status: int32(Status),
EndTime: int32(ActivityInfo.EndT),
Template: int32(Template),
Pass: int32(MiningMod.GetPass()),
Gem: GoUtil.IntToInt32(MiningMod.GetGem()),
Map: MiningMod.GetMap(),
Mining: int32(MiningMod.GetMining()),
Id: int32(ActivityInfo.Id),
Status: int32(Status),
EndTime: int32(ActivityInfo.EndT),
Template: int32(Template),
Pass: int32(MiningMod.GetPass()),
Gem: GoUtil.IntToInt32(MiningMod.GetGem()),
Map: MiningMod.GetMap(),
Mining: int32(MiningMod.GetMining()),
PassReward: resPassRewardList,
})
}
@ -422,3 +444,49 @@ func (p *Player) CatnipBackData() {
}
p.PushClientRes(res)
}
func (p *Player) GetChampshipActivityId() (int, int) {
var todayActivityId int
var yesterdayActivityId int
activiyCfgList := activityCfg.GetActivityListOrigin()
Now := GoUtil.Now()
YesterDay := GoUtil.ZeroTimestamp() - 1
level := p.GetBaseMod().GetLevel()
champshipActivityIds := champshipCfg.GetChampshipActivityId()
for _, v := range activiyCfgList {
if !GoUtil.InArray(v.Id, champshipActivityIds) {
continue
}
if v.Level > level {
continue
}
if v.StartTime <= Now && v.EndTime >= Now {
todayActivityId = v.Id
}
if v.StartTime <= YesterDay && v.EndTime >= YesterDay {
yesterdayActivityId = v.Id
}
}
return todayActivityId, yesterdayActivityId
}
func (p *Player) GetDailyTaskActivityId() int {
var activityId int
activiyCfgList := activityCfg.GetActivityListOrigin()
Now := GoUtil.Now()
level := p.GetBaseMod().GetLevel()
activityIds := dailyTaskCfg.GetActivityIds()
for _, v := range activiyCfgList {
if !GoUtil.InArray(v.Type, activityIds) {
continue
}
if v.Level > level {
continue
}
if v.StartTime <= Now && v.EndTime >= Now {
activityId = v.Id
break
}
}
return activityId
}

View File

@ -33,7 +33,8 @@ var AdminFuncMap = map[string]func([]interface{}) error{
func AdminProcess(Func string, args []interface{}) {
defer func() {
if r := recover(); r != nil {
GoUtil.SendFeishuFatal(0, Func, fmt.Sprintf("fatal : %s", r))
log.Error("uid : %d, func : %s, fatal : %s", 0, Func, r)
//GoUtil.SendFeishuFatal(0, Func, fmt.Sprintf("fatal : %s", r))
}
}()
if f, ok := AdminFuncMap[Func]; ok {
@ -171,7 +172,6 @@ func AdminPlayerInfo(args []interface{}) error {
res["Diamond"] = player.GetPlayerBaseMod().GetDiamond()
res["Star"] = player.GetPlayerBaseMod().GetStar()
res["Energy"] = player.GetPlayerBaseMod().GetEnergy()
res["Diamond"] = player.GetPlayerBaseMod().GetDiamond()
res["Mac"] = player.GetPlayerBaseMod().GetName()
res["Login"] = player.PlayMod.getBaseMod().LoginTime
res["Cumulative"] = player.PlayMod.getBaseMod().Cumulative

View File

@ -3,9 +3,14 @@ package game
import (
"fmt"
"math"
"math/rand"
avatarCfg "server/conf/avatar"
champshipCfg "server/conf/champship"
faceCfg "server/conf/face"
randnameCfg "server/conf/randname"
"server/db"
"server/game/mod/friend"
"server/game/mod/msg"
GoUtil "server/game_util"
proto "server/msg"
@ -55,6 +60,11 @@ type ChampshipRobot struct {
Time int64
Score float64
PerScore float64
Playroom map[int]int
DressSet map[int]int
FurSet int
ActLog *friend.ActLogInfo
PetName string
}
type GroupInfo struct {
@ -94,7 +104,7 @@ func (c *ChampshipMgr) Init() {
Remain1 := 1800 - Remain%1800
c.mDispatr.AfterFunc(time.Duration(Remain1)*time.Second, func() { // 30分钟后重新分组
c.group()
c.group(false)
})
c.mDispatr.AfterFunc(time.Duration(60)*time.Second, func() {
@ -116,6 +126,7 @@ func (c *ChampshipMgr) NotifyAll() (interface{}, error) {
}
func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) {
c.group(true)
log.Debug("ChampshipMgr ZeroUpdate")
data := c.getData()
data.mu.Lock()
@ -275,27 +286,54 @@ func (c *ChampshipMgr) GetPreRankMsg(Uid int) *proto.ResChampshipPreRank {
if Robot == nil {
continue
}
last := &proto.ActLog{}
if Robot.ActLog != nil {
last = &proto.ActLog{
Type: int32(Robot.ActLog.Type),
Time: Robot.ActLog.Time,
Param: Robot.ActLog.Param,
}
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
Type: int32(v.Type),
PlayroomSet: GoUtil.MapIntToInt32(Robot.Playroom),
DressSet: GoUtil.MapIntToInt32(Robot.DressSet),
FurSet: int32(Robot.FurSet),
PetName: Robot.PetName,
Last: last,
}
} else {
SimplePlayer := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
SimplePlayer := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if SimplePlayer == nil {
continue
}
last := &proto.ActLog{}
if SimplePlayer.ActLog != nil {
last = &proto.ActLog{
Type: int32(SimplePlayer.ActLog.Type),
Time: SimplePlayer.ActLog.Time,
Param: SimplePlayer.ActLog.Param,
}
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
Type: int32(v.Type),
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
Type: int32(v.Type),
PlayroomSet: GoUtil.MapIntToInt32(SimplePlayer.Playroom),
DressSet: GoUtil.MapIntToInt32(SimplePlayer.DressSet),
FurSet: int32(SimplePlayer.PetFur),
PetName: SimplePlayer.PetName,
Last: last,
}
}
}
@ -333,26 +371,54 @@ func (c *ChampshipMgr) GetRankMsg(Uid int) *proto.ResChampshipRank {
if Robot == nil {
continue
}
last := &proto.ActLog{}
if Robot.ActLog != nil {
last = &proto.ActLog{
Type: int32(Robot.ActLog.Type),
Time: Robot.ActLog.Time,
Param: Robot.ActLog.Param,
}
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
Type: int32(v.Type),
PlayroomSet: GoUtil.MapIntToInt32(Robot.Playroom),
DressSet: GoUtil.MapIntToInt32(Robot.DressSet),
FurSet: int32(Robot.FurSet),
PetName: Robot.PetName,
Last: last,
}
} else {
SimplePlayer := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
SimplePlayer := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
if SimplePlayer == nil {
continue
}
last := &proto.ActLog{}
if SimplePlayer.ActLog != nil {
last = &proto.ActLog{
Type: int32(SimplePlayer.ActLog.Type),
Time: SimplePlayer.ActLog.Time,
Param: SimplePlayer.ActLog.Param,
}
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
Uid: int64(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
Type: int32(v.Type),
PlayroomSet: GoUtil.MapIntToInt32(SimplePlayer.Playroom),
DressSet: GoUtil.MapIntToInt32(SimplePlayer.DressSet),
FurSet: int32(SimplePlayer.PetFur),
PetName: SimplePlayer.PetName,
Last: last,
}
}
}
@ -365,22 +431,22 @@ func (c *ChampshipMgr) GetRankMsg(Uid int) *proto.ResChampshipRank {
}
// 分组
func (c *ChampshipMgr) group() (interface{}, error) {
c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { // 30分钟后重新分组
c.group()
})
func (c *ChampshipMgr) group(iszero bool) (interface{}, error) {
Now := GoUtil.Now()
Zero := GoUtil.ZeroTimestamp()
if Now-Zero < 1800 { // 0点30分钟内不分组
if Now-Zero < 1800 && !iszero { // 0点30分钟内不分组
return nil, nil
}
c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { // 30分钟后重新分组
c.group(false)
})
ChampshipData := c.getData()
ChampshipData.mu.Lock()
defer ChampshipData.mu.Unlock()
log.Debug("ChampshipMgr group, player num:%d", len(ChampshipData.Pool))
if len(ChampshipData.Pool) == 0 { // 未分配玩家池为空
return nil, nil
}
log.Debug("ChampshipMgr group, player num:%d", len(ChampshipData.Pool))
g := make(map[int][]int, 0)
for k, v := range ChampshipData.Pool { // step 1:根据数值分配玩家
x := 0
@ -415,21 +481,25 @@ func (c *ChampshipMgr) group() (interface{}, error) {
}
ChampshipData.AutoId++
StartId := ChampshipData.AutoId
numGroups := (len(g[i]) + 9) / 10 // 向上取整,计算需要的组数
ChampshipData.AutoId += numGroups
for j := 0; j < len(g[i]); j++ {
ChampshipData.GroupInfo[g[i][j]] = ChampshipData.AutoId
groupIndex := StartId + j/10
ChampshipData.GroupInfo[g[i][j]] = groupIndex
UserData := ChampshipData.Pool[g[i][j]]
ChampshipData.Rank[ChampshipData.AutoId] = append(ChampshipData.Rank[ChampshipData.AutoId], &ChampshipRank{
ChampshipData.Rank[groupIndex] = append(ChampshipData.Rank[groupIndex], &ChampshipRank{
Uid: UserData.Uid,
Score: UserData.Score,
Time: UserData.Time,
})
if len(ChampshipData.Rank[ChampshipData.AutoId]) == 10 {
ChampshipData.AutoId++
}
log.Debug("group AutoId:%d, Uid:%d, Score:%f, Time:%d", groupIndex, UserData.Uid, UserData.Score, UserData.Time)
}
for j := StartId; j <= ChampshipData.AutoId; j++ { // 填充机器人
RobotNum := 30 - len(ChampshipData.Rank[j])
RobotList := CreateRobotList(i, RobotNum, j)
for i := 0; i < RobotNum; i++ {
FormatRobotInfo(RobotList[i], i+1)
}
for _, v := range RobotList {
ChampshipData.Robot[ChampshipData.RobotId] = v
ChampshipData.Rank[j] = append(ChampshipData.Rank[j], &ChampshipRank{
@ -833,13 +903,13 @@ func CreateRobot(M float64, GroupId int) *ChampshipRobot {
PerScore = math.Round((M/10*0.34)/(float64(GoUtil.NextZeroTimestampDuration())/1800)*100) / 100
Score = 2
}
return &ChampshipRobot{
Max: M / 10,
Type: Type,
Name: randnameCfg.GetRandName(),
Avatar: GoUtil.RandNum(1, 10),
Face: GoUtil.RandNum(1, 10),
PetName: randnameCfg.GetRandName(),
Avatar: avatarCfg.GetRandInitId(),
Face: faceCfg.GetRandInitId(),
Level: GoUtil.RandNum(1, 10),
GroupId: GroupId,
Time: GoUtil.Now(),
@ -848,6 +918,44 @@ func CreateRobot(M float64, GroupId int) *ChampshipRobot {
}
}
func FormatRobotInfo(Robot *ChampshipRobot, index int) {
num, err := db.RedisZCard(RANK_USER)
if err != nil {
num = 0
}
x := int(num) / 30
if index > int(x) {
index = int(x)
}
start := int64((index - 1) * x)
end := int64(index*x - 1)
rinfo, err := db.RedisZRevRangeWithScores(RANK_USER, start, end)
if err != nil {
log.Error("FormatRobotInfo RedisZRevRangeWithScores error: %v, start %d, end %d", err, start, end)
return
}
if len(rinfo) == 0 {
log.Error("FormatRobotInfo RedisZRevRangeWithScores no data, start %d, end %d", start, end)
return
}
id := rand.Intn(len(rinfo))
if id >= len(rinfo) {
id = len(rinfo) - 1
}
playerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(GoUtil.Int(rinfo[id].Member))
if playerSimpleData == nil {
return
}
Robot.Level = playerSimpleData.Level
Robot.Avatar = playerSimpleData.Avatar
Robot.Face = playerSimpleData.Face
Robot.Playroom = playerSimpleData.Playroom
Robot.DressSet = playerSimpleData.DressSet
Robot.FurSet = playerSimpleData.PetFur
Robot.ActLog = playerSimpleData.ActLog
Robot.PetName = playerSimpleData.PetName
}
func (c *ChampshipMgr) SetRankCache(Uid int) {
PreRank := c.unsafe_getLastMyRank(Uid)
Rank := c.unsafe_getMyRank(Uid)

View File

@ -80,7 +80,7 @@ func (p *Player) ActivityFire(ChargeId int) {
return
}
p.PlayMod.save()
p.initAcitivity()
p.initActivity()
p.BackDataActivity()
}

View File

@ -1,6 +1,7 @@
package game
import (
"math"
"server/db"
"server/game/mod/msg"
GoUtil "server/game_util"
@ -156,43 +157,153 @@ func GetRecommendPlayer(p *Player, Num int) []int {
candidateList = append(candidateList, Uid)
}
}
baseList := make([]*PlayerSimpleData, 0, len(candidateList))
levelFilterList := make([]*PlayerSimpleData, 0, len(candidateList))
for _, uid := range candidateList {
ps := G_GameLogicPtr.GetSimplePlayerByUid(uid)
if ps != nil {
baseList = append(baseList, ps)
levelFilterList = append(levelFilterList, ps)
}
}
if len(baseList) == 0 {
if len(levelFilterList) == 0 {
return nil
}
BaseMod := p.PlayMod.getBaseMod()
level := BaseMod.GetLevel()
diffLimit := 10
filtered := make([]int, 0, len(baseList))
chargeFilterList := make([]*PlayerSimpleData, 0, len(levelFilterList))
breakNum := 100
/*
等级筛选检索与玩家等级差绝对值小于等于10的用户若大于5人则进入下一步筛查否则逐步放宽等级差限制直到等级差绝对值小于等于100仍然无法筛选出5人则进入下一步筛查
*/
for breakNum > 0 {
breakNum--
filtered = filtered[:0]
for _, ps := range baseList {
chargeFilterList = chargeFilterList[:0]
for _, ps := range levelFilterList {
if ps == nil {
continue
}
diff := level - ps.Level
if diff < 0 {
diff = -diff
}
if diff <= diffLimit {
filtered = append(filtered, ps.Uid)
diff := math.Abs(float64(level - ps.Level))
if diff <= float64(diffLimit) {
chargeFilterList = append(chargeFilterList, ps)
}
}
if len(filtered) >= 5 {
if len(chargeFilterList) >= 5 {
break
}
diffLimit++
}
candidateList = filtered
recommendList := GoUtil.RandSliceNum(candidateList, Num)
/*
付费筛查判断自身是否为付费用户若是则优先推荐付费用户若不是则优先推荐非付费用户
*/
endFilterList := make([]int, 0, len(chargeFilterList))
chargeFilterFunc := func(filterlist []*PlayerSimpleData, maxCharge float64) []int {
var res []int
type sortData struct {
uid int
maxCharge float64
}
var filterList2 []sortData
var notChargeList []int
var allList []int
for _, ps := range filterlist {
if ps == nil {
continue
}
allList = append(allList, ps.Uid)
if ps.MaxCharge > 0 {
filterList2 = append(filterList2, sortData{ps.Uid, math.Abs(maxCharge - ps.MaxCharge)})
} else {
notChargeList = append(notChargeList, ps.Uid)
}
}
sort.Slice(filterList2, func(i, j int) bool {
return filterList2[i].maxCharge < filterList2[j].maxCharge
})
if len(filterList2) >= 1 {
res = append(res, filterList2[0].uid)
}
if len(filterList2) >= 2 {
res = append(res, filterList2[1].uid)
}
if len(notChargeList) >= 1 {
res = append(res, notChargeList[0])
}
if len(res) < 3 {
dlist := GoUtil.SubSlices(allList, res)
res = append(res, GoUtil.RandSliceNum(dlist, 3-len(res))...)
}
return res
}
notChargeWatchAdFilterFunc := func(filterlist []*PlayerSimpleData) []int {
var res []int
var notChargeList []int
var chargeList []int
var allList []int
for _, ps := range filterlist {
if ps == nil {
continue
}
allList = append(allList, ps.Uid)
if ps.MaxCharge > 0 {
chargeList = append(chargeList, ps.Uid)
} else {
if ps.AdWatch > 5 {
notChargeList = append(notChargeList, ps.Uid)
}
}
}
if len(notChargeList) >= 1 {
res = append(res, notChargeList[0])
}
if len(notChargeList) >= 2 {
res = append(res, notChargeList[1])
}
if len(chargeList) >= 1 {
res = append(res, chargeList[0])
}
if len(res) < 3 {
dlist := GoUtil.SubSlices(allList, res)
res = append(res, GoUtil.RandSliceNum(dlist, 3-len(res))...)
}
return res
}
notChargeNotWatchAdFilterFunc := func(filterlist []*PlayerSimpleData) []int {
var res []int
var notChargeList []int
var chargeList []int
var allList []int
for _, ps := range filterlist {
if ps == nil {
continue
}
allList = append(allList, ps.Uid)
if ps.MaxCharge > 0 {
chargeList = append(chargeList, ps.Uid)
} else {
notChargeList = append(notChargeList, ps.Uid)
}
}
if len(chargeList) >= 1 {
res = append(res, chargeList[0])
}
dlist := GoUtil.SubSlices(allList, res)
res = append(res, GoUtil.RandSliceNum(dlist, 3-len(res))...)
return res
}
if diffLimit == 10 && len(chargeFilterList) >= 5 {
MaxCharge := p.GetChargeMod().GetMaxCharge()
if MaxCharge > 0 {
endFilterList = chargeFilterFunc(chargeFilterList, MaxCharge)
} else {
if p.GetChargeMod().GetAdWatch() > 5 {
endFilterList = notChargeWatchAdFilterFunc(chargeFilterList)
} else {
endFilterList = notChargeNotWatchAdFilterFunc(chargeFilterList)
}
}
}
recommendList := GoUtil.RandSliceNum(endFilterList, Num)
for _, Uid := range recommendList {
FriendMod.AddRecommend(Uid)
}

View File

@ -39,6 +39,9 @@ type PlayerSimpleData struct {
Physiology map[int]int
Lang int
Account string
PetFur int
MaxCharge float64
AdWatch int
}
type VarGoldCard struct {

View File

@ -104,7 +104,7 @@ func ReqGmCommand_(player *Player, Command string) error {
player.PlayMod.getBaseMod().Level = num
player.PlayMod.getBaseMod().Exp = 0
player.PushClientRes(player.PlayerBaseMod.BackAsset())
player.initAcitivity()
player.initActivity()
player.PlayMod.getGuideTaskMod().Unlock(num)
player.PlayMod.getOrderMod().TriggerOrder(num, order.TRIGGER_TYPE_LV, nil, 1)
player.PushClientRes(player.PlayMod.getOrderMod().BackData())
@ -127,7 +127,7 @@ func ReqGmCommand_(player *Player, Command string) error {
ActivityMod.Var = nil
ActivityMod.InitData()
player.PlayMod.save()
player.initAcitivity()
player.initActivity()
player.BackDataActivity()
case "weekUpdate":
VarMod := player.PlayMod.getVarMod()
@ -137,6 +137,7 @@ func ReqGmCommand_(player *Player, Command string) error {
case "setSevenLoginActive":
num, _ := strconv.Atoi(arg[1])
player.PlayMod.getSevenLoginMod().Active = num
player.PushClientRes(player.PlayMod.getSevenLoginMod().BackData())
case "pay":
ChargeId, _ := strconv.Atoi(arg[1])
player.TeLog("pay", map[string]interface{}{
@ -329,6 +330,14 @@ func ReqGmCommand_(player *Player, Command string) error {
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_MINING)
MiningMod.ZeroUpdate(ActivityInfo.Id)
player.MiningBackData()
case "miningSetPass":
MiningMod := player.PlayMod.getMiningMod()
Id, _ := strconv.Atoi(arg[1])
MiningMod.Pass = Id
MiningMod.Mining = 0
MiningMod.Map = nil
MiningMod.Gem = nil
player.MiningBackData()
case "catnipReload":
CatnipMod := player.PlayMod.getCatnipMod()
CatnipMod.ZeroUpdate(-1)
@ -412,14 +421,14 @@ func ReqGmCommand_(player *Player, Command string) error {
case "resetFriend":
FriendMod := player.PlayMod.getFriendMod()
FriendMod.FriendList = make(map[int]struct{})
FriendMod.ApplyList = make(map[int]int64)
FriendMod.NewApplyList = make(map[int]*friend.ApplyInfo)
FriendMod.Card = make(map[string]*card.CardInfo)
FriendMod.SendApply = make(map[int]int64)
FriendMod.NewFriendList = make(map[int]*friend.FriendInfo)
FriendMod.Npc = []int{}
FriendMod.Npc = nil
FriendMod.Id = 0
FriendMod.Log = make([]*friend.LogInfo, 0)
FriendMod.InitData()
FriendMod.Log = nil
FriendMod.InitData(player.M_DwUin)
player.FriendListBackData()
player.FriendLogBackData()
case "addFriend":
@ -621,7 +630,32 @@ func ReqGmCommand_(player *Player, Command string) error {
title = languageCfg.GetLanguage(msg.LANG_TYPE(PlayerSimpleData.Lang), titlekey)
info = languageCfg.GetLanguage(msg.LANG_TYPE(PlayerSimpleData.Lang), infokey)
GoUtil.NotifyPlayer(GoUtil.Int(PlayerSimpleData.Account), NOTIFY_TYPE_PETROOM_GAME, fmt.Sprintf(title, PlayerSimpleData.PetName), fmt.Sprintf(info, PlayerSimpleData.PetName))
case "resetWeekReward":
SevenMod := player.PlayMod.getSevenLoginMod()
SevenMod.MonthResetTime = 0
PlayerBaseMod := player.GetPlayerBaseMod()
SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime())
case "debugLogoutMsg":
ToUid, _ := strconv.Atoi(arg[1])
uidList, err := db.GetDebugPlayer(ToUid)
if err != nil {
log.Error("GetDebugPlayer err:%s", err.Error())
return err
}
for _, uid := range uidList {
FriendMgrSend(&MsgMod.Msg{
Type: MsgMod.HANDLE_TYPE_APPLY,
SendT: GoUtil.Now(),
From: uid,
To: ToUid,
})
FriendMgrSend(&MsgMod.Msg{
Type: MsgMod.HANDLE_TYPE_HANDBOOK_COLLECTION,
SendT: GoUtil.Now(),
From: uid,
To: ToUid,
})
}
default:
return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg)
}

View File

@ -57,7 +57,11 @@ func (m *MailMgr) Init() {
}
func (m *MailMgr) AddMail(msg *msg.Msg) (interface{}, error) {
ServerMail := msg.Extra.(*ServerMail)
ServerMail, ok := msg.Extra.(*ServerMail)
if !ok {
log.Error("AddMail error: invalid mail data")
return nil, nil
}
m.list[ServerMail.Id] = ServerMail
return nil, nil
}

View File

@ -62,7 +62,12 @@ func (p *Player) handle(m *msg.Msg) error {
switch m.Type {
case msg.HANDLE_TYPE_APPLY: // 好友申请
FriendMod := p.PlayMod.getFriendMod()
ok := FriendMod.AddFriendApply(m.From)
var addType int
info, ok := m.Extra.(map[string]interface{})
if ok {
addType = GoUtil.Int(info["type"])
}
ok = FriendMod.AddFriendApply(m.From, addType, m.SendT)
// 已申请
if ok {
return nil
@ -520,7 +525,59 @@ func (p *Player) handle(m *msg.Msg) error {
case msg.HANDLE_TYPE_FRIEND_SPONSOER:
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_SPONSOR_GET, "", m.SendT)
case msg.SERVER_PLAYER_SYNC_LOGOUT_MSG:
//p.LoginBackData()
info, ok := m.Extra.(map[string]interface{})
if !ok {
return nil
}
applyUids, ok := info["apply_uids"].([]int64)
p.TeLog("login_recive_logout_msg", map[string]interface{}{
"apply_uids": applyUids,
"other_uids": info["other_uids"],
"apply_count": info["apply_count"],
"other_count": info["other_count"],
})
if ok && len(applyUids) > 0 {
var faceList []int
var name string
var facebookPic []string
for _, v := range applyUids {
ps := G_GameLogicPtr.GetSimplePlayerByUid(int(v))
if ps != nil {
faceList = append(faceList, ps.Face)
name = ps.Name
facebookPic = append(facebookPic, ps.FaceBookPic)
}
}
p.PushClientRes(&proto.ResPlayerLougouMsg{
Name: name,
Face: GoUtil.IntToInt32(faceList),
Count: GoUtil.Int32(info["apply_count"]),
FacebookPic: facebookPic,
Uids: applyUids,
})
}
otherUids, ok := info["other_uids"].([]int64)
if ok && len(otherUids) > 0 {
var faceList []int
var name string
var facebookPic []string
for _, v := range otherUids {
ps := G_GameLogicPtr.GetSimplePlayerByUid(int(v))
if ps != nil {
faceList = append(faceList, ps.Face)
name = ps.Name
facebookPic = append(facebookPic, ps.FaceBookPic)
}
}
p.PushClientRes(&proto.ResPlayerLougouMsg{
Type: 1,
Name: name,
Face: GoUtil.IntToInt32(faceList),
Count: GoUtil.Int32(info["other_count"]),
FacebookPic: facebookPic,
Uids: otherUids,
})
}
default:
log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type)
}
@ -576,7 +633,7 @@ func ClusterSendMsg(ServerId int, m *msg.Msg) {
func GetCardInfoMsg(CardInfo *card.CardInfo) *proto.ResFriendCard {
Uid := 0
if CardInfo.Type == card.TYPE_CARD_SEND {
Uid = CardInfo.BUid
Uid = CardInfo.AUid
}
if CardInfo.Type == card.TYPE_CARD_GIVE {
@ -827,7 +884,7 @@ func (player *Player) AddOrder() {
NewChessId := mergeDataCfg.GetChessIdByLvAndColor(BaseMod.GetEnergyMul()+PreheatStep+1, ChessColor)
Items, ok := order.PreheatItems[OrderMod.PreheatStep[ChessColor]]
if !ok {
Items = []*item.Item{item.NewItem(item.ITEM_STAR_ID, order.GetOrderStar([]int{NewChessId}, ChessMod.GetOrderEmit()))}
Items = []*item.Item{item.NewItem(item.ITEM_STAR_ID, order.GetOrderStar([]int{NewChessId}, ChessMod.GetStarEmitList()))}
}
OrderMod.AddPreheatOrder([]int{NewChessId}, order.DIFF_LOW, order.Preheat_type, Items)
}
@ -869,7 +926,7 @@ func (player *Player) FixOrderBug() {
OrderMod.PreheatStep[k]++
Items, ok := order.PreheatItems[OrderMod.PreheatStep[k]]
if !ok {
Items = []*item.Item{item.NewItem(item.ITEM_STAR_ID, order.GetOrderStar([]int{NewChessId}, ChessMod.GetOrderEmit()))}
Items = []*item.Item{item.NewItem(item.ITEM_STAR_ID, order.GetOrderStar([]int{NewChessId}, ChessMod.GetStarEmitList()))}
}
OrderMod.AddPreheatOrder([]int{NewChessId}, order.DIFF_LOW, order.Preheat_type, Items)
}
@ -997,7 +1054,7 @@ func (player *Player) CreateNormalOrder() {
if v.Type != order.COMFORT_TYPE {
continue
}
Star := order.GetOrderStar(v.MergeId, ChessMod.GetOrderEmit())
Star := order.GetOrderStar(v.MergeId, ChessMod.GetStarEmitList())
Star = int(float64(Star)*float64(OrderFactor)/1000) * 10
v.Items = []*item.Item{{Id: item.ITEM_STAR_ID, Num: Star}}
OrderMod.OrderList[k] = v
@ -1078,7 +1135,7 @@ func (player *Player) InitOrderItem() {
continue
}
Star := order.GetOrderStar(v.MergeId, ChessMod.GetStarEmitList())
Star = int(float64(Star)*float64(OrderFactor)/1000+0.5) * 10
Star = int(float64(Star)*float64(OrderFactor)/1000) * 10
v.Items = []*item.Item{{Id: item.ITEM_STAR_ID, Num: Star}}
OrderMod.OrderList[k] = v
}
@ -1218,13 +1275,18 @@ func (p *Player) AddHighOrder() {
ChessMap[Color] = v
}
}
RetireProduceColor := ChessMod.GetRetireProduceColor()
for Color, ChessId := range ChessMap {
EmitId := order.GetEmitByColor(ChessMod.GetOrderEmit(), Color)
_, ChessMaxLv := getChesslvRange(EmitId, BaseMod.GetEnergyMul(), OrderMod.IsCharge)
NewLev2 := mergeDataCfg.DynamicLev(ChessMaxLv, EmitId, Color)
NewLev3 := order.AdjustLev(NewLev2, BaseMod.GetEnergyMul())
ChessLv := mergeDataCfg.GetLvById(ChessId)
chessColor := mergeDataCfg.GetColorById(ChessId)
// 退役产物不生成订单
if GoUtil.InStringArray(chessColor, RetireProduceColor) {
continue
}
if NewLev3 >= ChessLv {
continue
}
@ -1263,10 +1325,16 @@ func (p *Player) AddHighOrder2() {
}
ChessMap[v]++
}
RetireProduceColor := ChessMod.GetRetireProduceColor()
for ChessId, Num := range ChessMap {
if Num < 2 {
continue
}
chessColor := mergeDataCfg.GetColorById(ChessId)
// 退役产物不生成订单
if GoUtil.InStringArray(chessColor, RetireProduceColor) {
continue
}
add := true
for _, v := range OrderMod.GetOrderList() {
if GoUtil.SliceEqual(v.MergeId, []int{ChessId, ChessId}) || GoUtil.SliceEqual(v.MergeId, []int{ChessId, ChessId, ChessId}) {
@ -1281,6 +1349,26 @@ func (p *Player) AddHighOrder2() {
}
}
func (p *Player) DeleteHighOrder() {
OrderMod := p.PlayMod.getOrderMod()
ChessMod := p.PlayMod.getChessMod()
ChessList := ChessMod.GetUnlockChessList()
for k, v := range OrderMod.GetOrderList() {
if v.Type != order.Extra_type {
continue
}
if len(v.MergeId) == 0 {
continue
}
chessId := v.MergeId[0]
chessNum := len(v.MergeId)
elementNum := GoUtil.ElemNumber(ChessList, chessId)
if elementNum < chessNum {
OrderMod.DeleteOrder(k)
}
}
}
func (p *Player) FormatPetOrderItem(Items []*item.Item) []*item.Item {
var NewItems []*item.Item
PlayroomMod := p.PlayMod.getPlayroomMod()

View File

@ -103,32 +103,32 @@ func (m *MessageMgr) MessageMgrInit() {
}
func FixBug() {
messageMgrData := getMessageData()
// 先更新 PlayerList需要加锁
messageMgrData.mu.Lock()
defer messageMgrData.mu.Unlock()
now := GoUtil.Now()
for k, v := range messageMgrData.MessageList {
if k < 100000 {
delete(messageMgrData.MessageList, k)
continue
}
isLose := CheckPlayerLose(int(k))
// 反向遍历以安全删除元素
for i := len(v.Messages) - 1; i >= 0; i-- {
if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) {
// 删除消息
v.Messages = append(v.Messages[:i], v.Messages[i+1:]...)
}
if isLose && v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_RESULT {
// 删除消息
v.Messages = append(v.Messages[:i], v.Messages[i+1:]...)
}
}
if len(v.Messages) == 0 {
delete(messageMgrData.MessageList, k)
}
}
// messageMgrData := getMessageData()
// // 先更新 PlayerList需要加锁
// messageMgrData.mu.Lock()
// defer messageMgrData.mu.Unlock()
// now := GoUtil.Now()
// for k, v := range messageMgrData.MessageList {
// if k < 100000 {
// delete(messageMgrData.MessageList, k)
// continue
// }
// isLose := CheckPlayerLose(int(k))
// // 反向遍历以安全删除元素
// for i := len(v.Messages) - 1; i >= 0; i-- {
// if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) {
// // 删除消息
// v.Messages = append(v.Messages[:i], v.Messages[i+1:]...)
// }
// if isLose && v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_RESULT {
// // 删除消息
// v.Messages = append(v.Messages[:i], v.Messages[i+1:]...)
// }
// }
// if len(v.Messages) == 0 {
// delete(messageMgrData.MessageList, k)
// }
// }
}
// 注册处理器
@ -147,7 +147,7 @@ func (m *MessageMgr) NodeRegister() {
func (m *MessageMgr) CenterRegister() {
if conf.Server.ServerType == "center" {
m.RegisterHandler(msg.HANDLE_MOD_PLAYER_LOGIN, MessageHandlerFunc(PlayerLoginHandler))
m.RegisterHandler(msg.HANDLE_MDO_PLAYER_LOGOUT, MessageHandlerFunc(PlayerLogoutHandler))
m.RegisterHandler(msg.HANDLE_MOD_PLAYER_LOGOUT, MessageHandlerFunc(PlayerLogoutHandler))
m.RegisterHandler(msg.HANDLE_MOD_PLAYER_MSG, MessageHandlerFunc(CenterPlayerMsgHandler))
m.RegisterHandler(msg.HANDLE_MOD_COMSUME_MSG, MessageHandlerFunc(ComsumerMsgHandler))
m.RegisterHandler(msg.HANDLE_MOD_VAR_SET, MessageHandlerFunc(SetVarDataHandler))
@ -208,7 +208,7 @@ func NotifyAllPlayerMsg(m *msg.Msg) {
}
func ChampshipGroupHandler(data *msg.Msg) (interface{}, error) {
G_GameLogicPtr.ChampshipMgr.group()
G_GameLogicPtr.ChampshipMgr.group(true)
return nil, nil
}
@ -293,16 +293,43 @@ func PlayerLoginHandler(data *msg.Msg) (interface{}, error) {
messages.mu.Unlock()
ReplyPlayerMsgASync(data, nil)
// 在锁外发送离线消息
var applyUids []int64
var otherUids []int64
for _, message := range messagesToSend {
message.H = msg.MSG_TYPE_OFFLINE // 标记为离线消息
if message.Type == msg.HANDLE_TYPE_APPLY {
applyUids = append(applyUids, int64(message.From))
} else {
otherUids = append(otherUids, int64(message.From))
}
}
for _, message := range messagesToSend {
if message.Type == msg.HANDLE_TYPE_APPLY && len(applyUids) >= 3 {
message.H = msg.MSG_TYPE_OFFLINE // 标记为离线消息
}
if message.Type != msg.HANDLE_TYPE_APPLY && len(otherUids) >= 3 {
message.H = msg.MSG_TYPE_OFFLINE // 标记为离线消息
}
SendMsgToNodeAsync(message, node)
}
applyUidsFive := applyUids
if len(applyUids) > 5 {
applyUidsFive = applyUids[len(applyUids)-5:]
}
otherUidsFive := otherUids
if len(otherUids) > 5 {
otherUidsFive = otherUids[len(otherUids)-5:]
}
SendMsgToNodeAsync(&msg.Msg{
From: data.From,
To: data.From,
Type: msg.SERVER_PLAYER_SYNC_LOGOUT_MSG,
HandleType: msg.HANDLE_MOD_PLAYER_MSG,
Extra: len(messagesToSend),
Extra: map[string]interface{}{
"apply_uids": applyUidsFive,
"apply_count": len(applyUids),
"other_uids": otherUidsFive,
"other_count": len(otherUids),
},
}, node) // 发送离线消息处理完成通知
log.Debug("[Middleware] Player sync logout message player id: %v, len: %d", data.From, len(messagesToSend))
return nil, nil
@ -705,9 +732,9 @@ func LoggingMiddleware() MessageMiddleware {
duration := time.Since(start)
if err != nil {
log.Error("[Middleware] Message handle type: %d; type: %d failed, duration: %v, error: %v", message.HandleType, message.Type, duration, err)
log.Error("[Middleware] Message handle error! message: %v; duration: %v; error: %v", message, duration, err)
} else {
log.Debug("[Middleware] Message handle type: %d; type: %d success, duration: %v", message.HandleType, message.Type, duration)
log.Debug("[Middleware] Message handle success! message: %v; duration: %v", message, duration)
}
return result, err

View File

@ -1,20 +1,18 @@
package activity
import (
"fmt"
activityCfg "server/conf/activity"
"server/game/mod/item"
GoUtil "server/game_util"
)
// 活动礼包
func (a *Activity) Fire(Id int) ([]*item.Item, error) {
AId := activityCfg.GetActivityGiftId(Id)
Var := a.getGiftVar(AId)
if Var.Buy {
return nil, fmt.Errorf("Id%d已购买", Id)
}
Var.Buy = true
Var.Time = GoUtil.Now()
// AId := activityCfg.GetActivityGiftId(Id)
// Var := a.getGiftVar(AId)
// if Var.Buy {
// return nil, fmt.Errorf("Id%d已购买", Id)
// }
// Var.Buy = true
// Var.Time = GoUtil.Now()
return activityCfg.GetActivityGiftItems(Id), nil
}

View File

@ -44,6 +44,7 @@ type Base struct {
IdCardNum string
AddCode string // 用于添加好友的code
DiviceId string // 设备id
RegisterTime int64 // 注册时间
}
func (b *Base) InitData(Uid int, Ip string) {

View File

@ -35,12 +35,12 @@ func (c *ChampshipMod) GetScore() int {
return c.Score
}
func (c *ChampshipMod) GetRankReward(Rank int) ([]*item.Item, error) {
func (c *ChampshipMod) GetRankReward(Rank, yesterdayActivityId int) ([]*item.Item, error) {
if c.RankReward {
return nil, fmt.Errorf("rank reward has been received")
}
c.RankReward = true
return champshipCfg.GetRankReward(Rank), nil
return champshipCfg.GetRankReward(Rank, yesterdayActivityId), nil
}
func (c *ChampshipMod) AddScore(Chess []int) {
@ -56,14 +56,14 @@ func (c *ChampshipMod) AddScore(Chess []int) {
c.Score += score
}
func (c *ChampshipMod) GetReward() []*item.Item {
Reward, Items := champshipCfg.GetReward(c.Reward, c.Score)
func (c *ChampshipMod) GetReward(activityId, orderFactor int) []*item.Item {
Reward, Items := champshipCfg.GetReward(c.Reward, c.Score, activityId, orderFactor)
c.Reward = Reward
c.Max = max(c.Max, c.Reward)
return Items
}
func (c *ChampshipMod) BackData(MyRank, MyPreRank int) *msg.ResChampship {
func (c *ChampshipMod) BackData(MyRank, MyPreRank, todayActivityId, yesterdayActivityId int) *msg.ResChampship {
rankReward := 0
if c.RankReward {
rankReward = 2
@ -75,13 +75,15 @@ func (c *ChampshipMod) BackData(MyRank, MyPreRank int) *msg.ResChampship {
status = 1
}
return &msg.ResChampship{
Score: int32(c.Score),
Reward: int32(c.Reward),
EndTime: int32(GoUtil.ZeroTimestamp() + 86400),
Period: int32(GoUtil.GetServerOpenDay()),
Rank: int32(MyRank),
RankReward: int32(rankReward),
Status: int32(status),
Score: int32(c.Score),
Reward: int32(c.Reward),
EndTime: int32(GoUtil.ZeroTimestamp() + 86400),
Period: int32(GoUtil.GetServerOpenDay()),
Rank: int32(MyRank),
RankReward: int32(rankReward),
Status: int32(status),
TodayActivityId: int32(todayActivityId),
YesterdayActivityId: int32(yesterdayActivityId),
}
}

View File

@ -39,6 +39,8 @@ type ChargeMod struct {
WishList *WishList
WeeklyDiscount map[int]int // 每周折扣购买次数
WeeklyEndTime int64
AdWatch int // 观看广告次数
}
type WishList struct {
@ -132,6 +134,7 @@ func (c *ChargeMod) ZeroUpdate(Emit []int) {
c.FreeShop = 0
SpecialGrade := 1
c.TodayCharge = 0
c.AdWatch = 0
c.SpecialShop = make(map[int]*SepcialShop)
SpecialShopCount := chargeCfg.GetSpecialShopCount()
for i := 1; i <= 2; i++ {
@ -285,6 +288,26 @@ func (c *ChargeMod) FireAdReward(ChargeId int) []*item.Item {
return Items
}
func (c *ChargeMod) AddAdTime(PetWorkDay int) {
if PetWorkDay > 0 {
Now := GoUtil.Now()
if c.AdEndTime < Now {
c.AdEndTime = Now + int64(PetWorkDay*secondsIn1Day)
} else {
c.AdEndTime += int64(PetWorkDay * secondsIn1Day)
}
c.PetWorkTime += int64(PetWorkDay * secondsIn1Day)
c.Ad = true
}
}
func (c *ChargeMod) CheckAd() bool {
if !c.Ad {
return false
}
return true
}
// 免费商店
func (c *ChargeMod) FireFreeShop() ([]*item.Item, error) {
if c.FreeShop >= 2 {
@ -310,7 +333,6 @@ func (c *ChargeMod) InitChessShop(Emit []int) {
if len(ChessList) == 1 {
ChessList = append(ChessList, ChessList[0]-1)
}
//ColorType := mergeDataCfg.GetColorType(p)
for _, c := range ChessList {
if c == 0 {
continue
@ -489,3 +511,11 @@ func (c *ChargeMod) GetWeeklyEndTime() int64 {
func (c *ChargeMod) SetWeeklyEndTime(EndTime int64) {
c.WeeklyEndTime = EndTime
}
func (c *ChargeMod) GetAdWatch() int {
return c.AdWatch
}
func (c *ChargeMod) AddAdWatch() {
c.AdWatch++
}

View File

@ -304,7 +304,14 @@ func (cb *ChessBorad) emitListToSlice(retireFilter bool) []int {
for _, v := range EM {
result = append(result, v)
}
return result
if !retireFilter {
for k, v := range cb.Honor {
if v == 1 {
result = append(result, k)
}
}
}
return GoUtil.UniqueInts(result)
}
func (cb *ChessBorad) GetStarEmitList() []int {
@ -718,3 +725,13 @@ func (cb *ChessBorad) GetRetireReward(Id string) ([]*item.Item, error) {
cb.RetireReward[Id] = true
return mergeDataCfg.GetRetireReward(), nil
}
func (cb *ChessBorad) GetRetireProduceColor() []string {
color := make([]string, 0, len(cb.Retire))
for k, v := range cb.Retire {
if v == EMIT_RETIRE_ING {
color = append(color, mergeDataCfg.GetEmitTypeByColor(k))
}
}
return color
}

View File

@ -8,7 +8,8 @@ import (
"sort"
)
func getTaskReward(Id, AreaId int) []*item.Item {
func getTaskReward(Id, AreaId, activityId int) []*item.Item {
switch Id {
case 2:
StarNum := int(50 * math.Pow(1.04, float64(AreaId)))

View File

@ -3,6 +3,7 @@ package dailyTask
import (
"fmt"
dailyTaskCfg "server/conf/daily_task"
orderCfg "server/conf/order"
"server/game/mod/item"
"server/game/mod/quest"
GoUtil "server/game_util"
@ -48,15 +49,15 @@ func (dt *DailyTaskMod) Unlock() {
dt.Lock = true
}
func (dt *DailyTaskMod) LevUpTrigger(Lv, AreaId int) bool {
func (dt *DailyTaskMod) LevUpTrigger(Lv, AreaId, dailyAcitivityId int) bool {
if len(dt.DayTask) != 0 {
return false
}
dt.ZeroUpdate(Lv, AreaId)
dt.ZeroUpdate(Lv, AreaId, dailyAcitivityId)
return true
}
func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId int) {
func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId, activityId int) {
TaskList := dailyTaskCfg.GetTaskList(Lv)
if len(TaskList) <= 0 {
return
@ -65,6 +66,7 @@ func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId int) {
LastTaskId := GoUtil.GetMapKey(dt.lastTask)
TaskList1 := GoUtil.SubSlices(TaskListId, LastTaskId)
TaskId := GoUtil.RandSliceNum(TaskList1, 3)
OrderFactor := orderCfg.GetOrderFactor(AreaId)
for i := 0; i < len(TaskId); i++ {
Id := i + 1
questStr := TaskList[TaskId[i]]
@ -72,7 +74,7 @@ func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId int) {
if err != nil {
log.Debug("parse quest err str : %s", questStr)
}
Items := getTaskReward(Id, AreaId)
Items := dailyTaskCfg.GetDailyTaskReward(Id, OrderFactor, activityId)
dt.DayTask[Id] = DailyTask{
Items: Items,
UnLock: Id == 1,
@ -165,12 +167,12 @@ func (dt *DailyTaskMod) BackData() *msg.ResDailyTask {
}
}
func (dt *DailyTaskMod) GetDailyReward(id int) ([]*item.Item, error) {
func (dt *DailyTaskMod) GetDailyReward(id, activityId int) ([]*item.Item, error) {
if v, ok := dt.DayTask[id]; ok {
if v.Status == quest.QUEST_STATUS_FINISH {
v.Status = quest.QUEST_STATUS_REWARD
dt.DayTask[id] = v
dt.Active += 5
dt.Active += dailyTaskCfg.GetDailyTaskScore(id, activityId)
return v.Items, nil
}
}

View File

@ -5,6 +5,7 @@ import (
"math"
decorateCfg "server/conf/decorate"
limitedTimeEventCfg "server/conf/limited_time_event"
orderCfg "server/conf/order"
"server/game/mod/item"
GoUtil "server/game_util"
"server/msg"
@ -119,6 +120,22 @@ func (d *Decorate) GetDecorateCostItem(AreaId, DecorateId int, DecorateOffIsExis
return Items, PetExp, PartItemList
}
func (d *Decorate) GetNextNeedStar() int {
DecorateAll := decorateCfg.GetAllSortIdByAreaId(d.AreaId)
SubAlice := GoUtil.SubSlices(DecorateAll, GoUtil.MapIntToIntSlice(d.FinishList))
orderFactor := orderCfg.GetOrderFactor(d.GetAreaId())
sort.Ints(SubAlice)
if len(SubAlice) > 0 {
NeedStar := decorateCfg.GetStarCost(d.AreaId, SubAlice[0])
return (NeedStar*orderFactor)/1000 + NeedStar
}
return 0
}
func (d *Decorate) GetAreaCost() int {
return decorateCfg.GetStarCostByAreaId(d.AreaId)
}
// 一键装饰
func (d *Decorate) DecorateAll(Star int, DecorateOffIsExist bool) ([]*item.Item, []*item.Item, int, []int, []interface{}, int) {
DecorateAll := decorateCfg.GetAllSortIdByAreaId(d.AreaId)

View File

@ -8,25 +8,29 @@ import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/msg"
"sort"
)
type FriendMod struct {
FriendList map[int]struct{} // TODO 废弃 好友列表
NewFriendList map[int]*FriendInfo // 好友列表
ApplyList map[int]int64 // 好友请求列表
SendApply map[int]int64 // 发送的申请
Apply []*ApplyInfo // 其他请求列表
Card map[string]*card.CardInfo // 收到的申请交换
Log []*LogInfo // 日志
AutoId int
Id int64 // 已同步msg ID
Npc []int // npc id
Bubble map[int]*BubbleInfo // 气泡
ActivityLog []*ActLogInfo // 活动日志
ReplyList []*ReplyInfo // 好友回复列表
DailySponsor int // 好友赞助次数
RecommendList map[int]*Recommend
DailyGetApply int // 每日获得申请次数
FriendList map[int]struct{} // 废弃 好友列表
NewFriendList map[int]*FriendInfo // 好友列表
ApplyList map[int]int64 // 废弃 好友请求列表
NewApplyList map[int]*ApplyInfo // 好友请求列表
SendApply map[int]int64 // 发送的申请
Apply []*ApplyInfo // 其他请求列表
Card map[string]*card.CardInfo // 收到的申请交换
Log []*LogInfo // 日志
AutoId int
Id int64 // 已同步msg ID
Npc []int // npc id
Bubble map[int]*BubbleInfo // 气泡
ActivityLog []*ActLogInfo // 活动日志
ReplyList []*ReplyInfo // 好友回复列表
DailySponsor int // 好友赞助次数
RecommendList map[int]*Recommend
DailyGetApply int // 每日获得申请次数
DailyRecommend int // 每日推荐次数
Version int // 数据版本,增加新字段时需要更新版本号
}
type Recommend struct {
@ -63,6 +67,7 @@ type FriendInfo struct {
AddTime int64
DelTime int64
Interact []*Interact // 拜访记录
Greeting bool // 是否打过招呼
}
type Interact struct {
@ -71,9 +76,8 @@ type Interact struct {
}
type ApplyInfo struct {
Type int // 1:申请 2:同意 3:拒绝 4:删除
Type int
Time int64
Uid int64
}
const (
@ -133,7 +137,8 @@ const (
)
const (
APPLY_TYPE_WISH = 1 // 心愿单请求
APPLY_TYPE_FRIEND_CODE = 1 // 好友码申请
APPLY_TYPE_WISH = 2 // 心愿单请求
)
const (
@ -184,7 +189,7 @@ type LogInfo struct {
}
// 初始化数据
func (f *FriendMod) InitData() {
func (f *FriendMod) InitData(M_DwUin int64) {
if f.FriendList == nil {
f.FriendList = make(map[int]struct{})
}
@ -216,12 +221,64 @@ func (f *FriendMod) InitData() {
if f.RecommendList == nil {
f.RecommendList = make(map[int]*Recommend)
}
if f.NewApplyList == nil {
f.NewApplyList = make(map[int]*ApplyInfo)
}
for k, v := range f.Card {
if v.AUid != 0 && !f.CheckFriend(v.AUid) && v.AUid != int(M_DwUin) {
delete(f.Card, k)
continue
}
if v.BUid != 0 && !f.CheckFriend(v.BUid) && v.BUid != int(M_DwUin) {
delete(f.Card, k)
continue
}
}
if len(f.ReplyList) > 0 {
validReplyList := make([]*ReplyInfo, 0, len(f.ReplyList))
for _, v := range f.ReplyList {
if f.CheckFriend(v.Uid) {
validReplyList = append(validReplyList, v)
}
}
f.ReplyList = validReplyList
}
f.version()
}
func (f *FriendMod) version() {
if f.Version == 0 {
f.Version = 1
for k := range f.ApplyList {
f.NewApplyList[k] = &ApplyInfo{
Time: f.ApplyList[k],
}
}
type sortData struct {
Uid int
Time int64
}
PlayerList := make([]sortData, 0)
for k, v := range f.NewApplyList {
PlayerList = append(PlayerList, sortData{k, v.Time})
}
sort.Slice(PlayerList, func(i, j int) bool {
return PlayerList[i].Time > PlayerList[j].Time
})
for i := 0; i < len(PlayerList); i++ {
if i >= friendCfg.GetApplyListLimit() {
delete(f.NewApplyList, PlayerList[i].Uid)
}
}
}
}
// 零点更新
func (f *FriendMod) ZeroUpdate() {
f.DailySponsor = f.GetDailySponsorLimit()
f.DailyGetApply = 0
f.DailyRecommend = 0
}
func (f *FriendMod) GetNpc() []int {
@ -265,6 +322,9 @@ func (f *FriendMod) Interact(id, t int, T int64) {
VisitTime: T,
Type: t,
})
if len(f.NewFriendList[id].Interact) > 30 {
f.NewFriendList[id].Interact = f.NewFriendList[id].Interact[len(f.NewFriendList[id].Interact)-30:]
}
}
// 获取好友交互时间
@ -295,7 +355,7 @@ func (f *FriendMod) AddFriend(id int) {
f.NewFriendList[id] = &FriendInfo{
AddTime: GoUtil.Now(),
}
delete(f.ApplyList, id)
delete(f.NewApplyList, id)
}
// 获取卡牌交换信息
@ -320,6 +380,12 @@ func (f *FriendMod) DelCardInfo(Id string) {
// 删除好友
func (f *FriendMod) DelFriend(id int) {
f.NewFriendList[id].DelTime = GoUtil.Now()
// 删除好友后清除打招呼
for _, v := range f.ReplyList {
if v.Uid == id && (v.Type == REPLY_TYPE_GREETING || v.Type == REPLY_TYPE_GREETING_Get) {
v.Status = 1
}
}
}
// 检查是否好友
@ -335,13 +401,13 @@ func (f *FriendMod) GetFriendLen() int {
// 拒绝好友申请
func (f *FriendMod) RefuseApply(id int) {
delete(f.ApplyList, id)
delete(f.NewApplyList, id)
delete(f.SendApply, id)
}
// 检查好友申请
func (f *FriendMod) CheckApply(id int) bool {
_, ok := f.ApplyList[id]
_, ok := f.NewApplyList[id]
return ok
}
func (f *FriendMod) GetFriendNum() int {
@ -384,11 +450,38 @@ func (f *FriendMod) CheckAddBefore(uid int) bool {
}
// 收到申请
func (f *FriendMod) AddFriendApply(Uid int) bool {
if f.DailyGetApply >= 30 {
func (f *FriendMod) AddFriendApply(Uid, Type int, sendTime int64) bool {
if f.DailyGetApply >= friendCfg.GetDailyGetApplyLimit() {
return true
}
f.ApplyList[Uid] = GoUtil.Now()
var code_type int
for _, v := range f.NewApplyList {
if v.Type == APPLY_TYPE_FRIEND_CODE {
code_type++
}
}
// 好友申请列表只保留十条,好友码申请不受数量限制
if code_type >= friendCfg.GetApplyListLimit() && Type != APPLY_TYPE_FRIEND_CODE {
return true
}
var minTime int64
if len(f.NewApplyList) >= friendCfg.GetApplyListLimit() {
for _, v := range f.NewApplyList {
if v.Type != APPLY_TYPE_FRIEND_CODE && (minTime == 0 || v.Time < minTime) {
minTime = v.Time
}
}
for k, v := range f.NewApplyList {
if v.Time == minTime {
delete(f.NewApplyList, k)
break
}
}
}
f.NewApplyList[Uid] = &ApplyInfo{
Type: Type,
Time: sendTime,
}
f.DailyGetApply++
return false
}
@ -416,7 +509,7 @@ func (f *FriendMod) GetSendApplyTime(Id int) int64 {
func (f *FriendMod) AgreeApply(UId int) {
f.AddFriend(UId)
delete(f.SendApply, UId)
delete(f.ApplyList, UId)
delete(f.NewApplyList, UId)
}
// 增加好友日志
@ -540,16 +633,7 @@ func (f *FriendMod) GetReward(Id int) ([]*item.Item, error) {
// 增加心愿单申请
func (f *FriendMod) AddWishApply(Uid int64) error {
for _, v := range f.Apply {
if v.Type == APPLY_TYPE_WISH && v.Uid == Uid {
return fmt.Errorf("wish apply already exist")
}
}
f.Apply = append(f.Apply, &ApplyInfo{
Type: APPLY_TYPE_WISH,
Uid: Uid,
Time: GoUtil.Now(),
})
return nil
}
@ -566,12 +650,7 @@ func (f *FriendMod) GetWishApply() []*ApplyInfo {
// 同意心愿单申请
func (f *FriendMod) ApplyWish(Uid int64) error {
for k, v := range f.Apply {
if v.Type == APPLY_TYPE_WISH && v.Uid == Uid {
f.Apply = append(f.Apply[:k], f.Apply[k+1:]...)
return nil
}
}
return fmt.Errorf("wish apply not exist")
}
@ -586,7 +665,7 @@ func (f *FriendMod) GetActLogLast() *ActLogInfo {
// 增加待回复请求
func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string, EndTime int64, Items []*item.Item) *ReplyInfo {
f.AutoId++
ReplyInfo := &ReplyInfo{
Reply := &ReplyInfo{
Id: f.AutoId,
Uid: Uid,
Type: Type,
@ -595,8 +674,11 @@ func (f *FriendMod) AddReplyInfo(Uid int, Type int, Param string, EndTime int64,
EndTime: EndTime,
Items: Items,
}
f.ReplyList = append(f.ReplyList, ReplyInfo)
return ReplyInfo
f.ReplyList = append(f.ReplyList, Reply)
if len(f.ReplyList) > 20 {
f.ReplyList = f.ReplyList[len(f.ReplyList)-20:]
}
return Reply
}
// 回复请求
@ -658,3 +740,24 @@ func (f *FriendMod) GetRecommendTime(uid int) int64 {
}
return 0
}
func (f *FriendMod) AddDailyRecommend() error {
f.DailyRecommend++
if f.DailyRecommend > friendCfg.GetDailyRecommendLimit() {
return fmt.Errorf("daily recommend limit %d reached", friendCfg.GetDailyRecommendLimit())
}
return nil
}
func (f *FriendMod) GreetingFriend(Uid int) {
if v, ok := f.NewFriendList[Uid]; ok {
v.Greeting = true
}
}
func (f *FriendMod) CheckGreeting(Uid int) bool {
if v, ok := f.NewFriendList[Uid]; ok {
return v.Greeting
}
return false
}

View File

@ -0,0 +1,84 @@
package fur
import (
"fmt"
fur_cfg "server/conf/fur"
"server/game/mod/item"
"server/msg"
)
type FurMod struct {
Set int
List map[int]*FurInfo
Free int
}
type FurInfo struct {
Id int
AddTime int64
EndTime int64
}
func (f *FurMod) InitData() {
if f.List == nil {
f.List = make(map[int]*FurInfo)
}
}
// 获取毛皮信息
func (f *FurMod) GetFurInfo(id int) *FurInfo {
info, ok := f.List[id]
if !ok {
return nil
}
return info
}
// 增加毛皮
func (f *FurMod) AddFurInfo(id int, addTime, endTime int64) {
f.List[id] = &FurInfo{
Id: id,
AddTime: addTime,
EndTime: endTime,
}
}
func (f *FurMod) GetFurBuyCost(id int) ([]*item.Item, []*item.Item) {
freeCount := fur_cfg.GetFurShopFreeTimes()
if f.Free < freeCount {
f.Free++
return nil, fur_cfg.GetFurShopItem(id)
}
return fur_cfg.GetFurShopCost(id), fur_cfg.GetFurShopItem(id)
}
// 设置毛皮
func (f *FurMod) SetFur(id int) error {
if id == 0 {
f.Set = 0
return nil
}
if _, ok := f.List[id]; !ok {
return fmt.Errorf("fur id not found")
}
f.Set = id
return nil
}
func (f *FurMod) GetFurSet() int {
return f.Set
}
// 消息返回
func (f *FurMod) BackData() *msg.ResPetFur {
freeCount := fur_cfg.GetFurShopFreeTimes()
furId := make([]int32, 0, len(f.List))
for id := range f.List {
furId = append(furId, int32(id))
}
return &msg.ResPetFur{
FurId: furId,
FurSet: int32(f.Set),
FreeCount: int32(freeCount - f.Free),
}
}

View File

@ -58,8 +58,14 @@ const (
ITEM_TYPE_PLAYROOM_DRESS_SET = 114 // playroom服饰套装
ITEM_TYPE_PLAYROOM_BOX = 115 // playroom宝箱
ITEM_TYPE_ACT_PASS = 116 // 通行证活动道具
ITEM_TYPE_PET_FUR = 117 // 宠物毛皮
ITEM_TYPE_AD_CARD = 118 // 免广告卡
)
func (i *Item) String() string {
return fmt.Sprintf("Item{Id:%d, Num:%d}", i.Id, i.Num)
}
func (i *ItemMod) InitData() {
if i.Data == nil {
i.Data = make(map[int]int)
@ -161,6 +167,22 @@ func ItemToMsg(items []*Item) []*msg.ItemInfo {
return itemList
}
func ItemListToMsg(items []*Item) *msg.ItemList {
if items == nil {
return nil
}
itemList := make([]*msg.ItemInfo, 0, len(items))
for _, v := range items {
itemList = append(itemList, &msg.ItemInfo{
Id: int32(v.Id),
Num: int32(v.Num),
})
}
return &msg.ItemList{
List: itemList,
}
}
// 道具叠加
func Merge(Item1, Item2 []*Item) []*Item {
if Item1 == nil {

View File

@ -250,8 +250,7 @@ func (l *LimitedTimeEventMod) BackData() *msg.ResLimitEvent {
func (l *LimitedTimeEventMod) ProgressBackData() *msg.ResLimitEventProgress {
r := make(map[int32]int32)
for k, v := range l.ProgressReward {
Type := limitedTimeEventCfg.GetProgressRewardType(v)
r[int32(k)] = int32(Type)
r[int32(k)] = int32(v)
}
return &msg.ResLimitEventProgress{
Progress: int32(l.Progress),
@ -275,7 +274,19 @@ func (l *LimitedTimeEventMod) GetChestReward(MergeList, EmitList []int) []*item.
}
// 获取场景冲刺奖励
func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item) {
func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item, error) {
limitInfo, ok := l.EventList[EVENT_TYPE_SENCE_DASH]
if !ok {
return 0, nil, fmt.Errorf("sence dash not active")
}
if limitInfo.Info == nil {
return 0, nil, fmt.Errorf("sence dash info error")
}
times := GoUtil.Int(limitInfo.Info["Times"])
if times <= 0 {
return 0, nil, fmt.Errorf("no dash times")
}
limitInfo.Info["Times"] = times - 1
ProbList := limitedTimeEventCfg.GetSenceJackpotProb()
Id := GoUtil.RandMap(ProbList)
Items := limitedTimeEventCfg.GetSenceJackpotReward(Id)
@ -283,7 +294,7 @@ func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item) {
// 多个奖励时,随机选择一个
Items = []*item.Item{GoUtil.RandItem(Items)}
}
return Id, Items
return Id, Items, nil
}
// 获取连击快手奖励
@ -435,6 +446,10 @@ func (l *LimitedTimeEventMod) GetCatTrickReward() ([]*item.Item, error) {
// #region 事件信息初始化
func initEventInfo(E *LTEInfo, EventType int) {
switch EventType {
case EVENT_TYPE_SENCE_DASH:
E.Info = map[string]interface{}{
"Times": 0,
}
case EVENT_TYPE_FAST_PRODUCE:
E.Info = map[string]interface{}{
"Times": 0,
@ -516,6 +531,9 @@ func getLimitEventMsg(t int, e *LTEInfo) *msg.LimitEvent {
case EVENT_TYPE_PAYBACK_DAY:
d := e.D.(*PaybackDay)
Param[msg.LimitEventParam_PAYBACK_DAY_COUNT.String()] = int32(d.Count)
case EVENT_TYPE_SENCE_DASH:
Times := GoUtil.Int(e.Info["Times"])
Param[msg.LimitEventParam_SENCE_DASH_TIMES.String()] = int32(Times)
}
return &msg.LimitEvent{
EndTime: EndTime,
@ -538,3 +556,15 @@ func (l *LimitedTimeEventMod) GetCatDaySaleEndTime() int64 {
}
return v.StartT + v.Remian
}
func (l *LimitedTimeEventMod) AddSenceDashTimes() bool {
SenceInfo, ok := l.EventList[EVENT_TYPE_SENCE_DASH]
if !ok {
return false
}
if SenceInfo.Info == nil {
return false
}
SenceInfo.Info["Times"] = GoUtil.Int(SenceInfo.Info["Times"]) + 1
return true
}

View File

@ -7,11 +7,12 @@ import (
)
type MiningMod struct {
Id int
Map map[int32]string
Gem []int
Pass int
Mining int
Id int
Map map[int32]string
Gem []int
Pass int
Mining int
InitItem bool
}
func (m *MiningMod) InitData() {
@ -34,9 +35,26 @@ func (m *MiningMod) Login(Id int) int {
m.Gem = nil
m.Pass = 1
m.Mining = 0
m.InitItem = false
return OldId
}
func (m *MiningMod) GetInitItem() []*item.Item {
if m.InitItem {
return nil
}
if m.Id == 0 {
return nil
}
initItemNum := miningCfg.GetStartItemNum(m.Id)
initItemId := miningCfg.GetActivityItemId(m.Id)
if initItemNum > 0 && initItemId > 0 {
m.InitItem = true
return []*item.Item{item.NewItem(initItemId, initItemNum)}
}
return nil
}
func (m *MiningMod) ZeroUpdate(Id int) {
m.Login(Id)
}
@ -81,12 +99,12 @@ func (m *MiningMod) Take(Map map[int32]string, Gem int) ([]*item.Item, error) {
return Items, nil
}
func (m *MiningMod) GetReward() ([]*item.Item, int, error) {
func (m *MiningMod) GetReward(orderFactor int) ([]*item.Item, int, error) {
GemList := miningCfg.GetPassGem(m.Pass)
if len(m.Gem) < len(GemList) {
return nil, 0, fmt.Errorf("gem is not full")
}
Items := miningCfg.GetPassItem(m.Pass)
Items := miningCfg.GetPassItem(m.Pass, orderFactor)
m.Pass++
Ming := m.Mining
m.Mining = 0

View File

@ -1,19 +1,22 @@
package msg
import "server/game/mod/item"
import (
"fmt"
"server/game/mod/item"
)
type Msg struct {
Type int // 消息类型
To int // 接收者
From int // 发送者
Item []*item.Item // 物品
SendT int64 // 发送时间
End int64 // 过期时间
Extra interface{} //额外信息
Id int64
UniKey string // 回调监听唯一键值
H int //处理类型
HandleType int //处理类型
Type int `json:"type"` // 消息类型
To int `json:"to"` // 接收者
From int `json:"from"` // 发送者
Item []*item.Item `json:"item"` // 物品
SendT int64 `json:"sendT"` // 发送时间
End int64 `json:"end"` // 过期时间
Extra interface{} `json:"extra"` //额外信息
Id int64 `json:"id"`
UniKey string `json:"uniKey"` // 回调监听唯一键值
H int `json:"h"` //处理类型
HandleType int `json:"handleType"` //处理类型
}
type VarData struct {
@ -41,7 +44,7 @@ const (
HANDLE_MOD_PLAYER_LOGIN = 20003 // 玩家登录消息
HANDLE_MOD_COMSUME_MSG = 20004 // 消费消息
HANDLE_MOD_CLUSTER_SYNC = 20005 // 集群同步消息
HANDLE_MDO_PLAYER_LOGOUT = 20006 // 玩家登出消息
HANDLE_MOD_PLAYER_LOGOUT = 20006 // 玩家登出消息
HANDLE_MOD_VAR_GET = 20007 // 获取变量
HANDLE_MOD_VAR_SET = 20008 // 设置变量
HANDLE_MOD_CATNIP_PARTNER = 20009 // 猫薄荷伙伴
@ -169,16 +172,17 @@ const (
func (m *Msg) Clone() *Msg {
return &Msg{
Type: m.Type,
To: m.To,
From: m.From,
Item: m.Item,
SendT: m.SendT,
End: m.End,
Extra: m.Extra,
Id: m.Id,
H: m.H,
UniKey: m.UniKey,
Type: m.Type,
To: m.To,
From: m.From,
Item: m.Item,
SendT: m.SendT,
End: m.End,
Extra: m.Extra,
Id: m.Id,
H: m.H,
UniKey: m.UniKey,
HandleType: m.HandleType,
}
}
@ -197,6 +201,206 @@ func (m *Msg) Reply(data interface{}) *Msg {
}
}
func (m *Msg) String() string {
typeStr := "default"
handleTypeStr := formatHandleType(m.HandleType)
if m.HandleType == HANDLE_MOD_REPLY_PLAYER_MSG {
typeStr = formatType(m.Type)
}
return fmt.Sprintf("Msg{Type:%s, To:%d, From:%d, SendT:%d, End:%d, Id:%d, HandleType:%s, Items:%+v, Extra:%+v}",
typeStr, m.To, m.From, m.SendT, m.End, m.Id, handleTypeStr, m.Item, m.Extra)
}
func formatHandleType(handleType int) string {
switch handleType {
case HANDLE_MOD_PLAYER_MSG:
return "HANDLE_MOD_PLAYER_MSG"
case HANDLE_MOD_CLUSTER_MSG:
return "HANDLE_MOD_CLUSTER_MSG"
case HANDLE_MOD_PLAYER_LOGIN:
return "HANDLE_MOD_PLAYER_LOGIN"
case HANDLE_MOD_COMSUME_MSG:
return "HANDLE_MOD_COMSUME_MSG"
case HANDLE_MOD_CLUSTER_SYNC:
return "HANDLE_MOD_CLUSTER_SYNC"
case HANDLE_MOD_PLAYER_LOGOUT:
return "HANDLE_MOD_PLAYER_LOGOUT"
case HANDLE_MOD_VAR_GET:
return "HANDLE_MOD_VAR_GET"
case HANDLE_MOD_VAR_SET:
return "HANDLE_MOD_VAR_SET"
case HANDLE_MOD_CATNIP_PARTNER:
return "HANDLE_MOD_CATNIP_PARTNER"
case HANDLE_MOD_USER_VAR_GET:
return "HANDLE_MOD_USER_VAR_GET"
case HANDLE_MOD_USER_VAR_SET:
return "HANDLE_MOD_USER_VAR_SET"
case HANDLE_MOD_REPLY_PLAYER_MSG:
return "HANDLE_MOD_REPLY_PLAYER_MSG"
case HANDLE_MDO_CHAMPSHIP_INRANK:
return "HANDLE_MDO_CHAMPSHIP_INRANK"
case HANDLE_MOD_CHAMPSHIP_RANK_INFO:
return "HANDLE_MOD_CHAMPSHIP_RANK_INFO"
case HANDLE_MOD_CHAMPSHIP_RANK_LIST:
return "HANDLE_MOD_CHAMPSHIP_RANK_LIST"
case HANDLE_MOD_CHAMPSHIP_PRE_RANK:
return "HANDLE_MOD_CHAMPSHIP_PRE_RANK"
case HANDLE_MOD_CHAMPSHIP_GROUP:
return "HANDLE_MOD_CHAMPSHIP_GROUP"
case HANDLE_MOD_DAILY_VAR_GET:
return "HANDLE_MOD_DAILY_VAR_GET"
case HANDLE_MOD_DAILY_VAR_SET:
return "HANDLE_MOD_DAILY_VAR_SET"
default:
return fmt.Sprintf("Unknown(%d)", handleType)
}
}
func formatType(t int) string {
switch t {
case HANDLE_TYPE_APPLY:
return "apply_friend"
case HANDLE_TYPE_DEL:
return "delete_friend"
case HANDLE_TYPE_SYNC:
return "sync_request"
case HADNLE_TYPE_AGREE:
return "agree_friend"
case HANDLE_TYPE_REFUSE:
return "refuse_apply"
case HANDLE_TYPE_REQ_CARD:
return "request_card"
case HANDLE_TYPE_AGREE_CARD:
return "agree_card"
case HANDLE_TYPE_REG_CARD_REFUSE:
return "refuse_card_request"
case HANDLE_TYPE_REG_CARD_FINISH:
return "card_request_finished"
case HANDLE_TYPE_AGREE_CARD_FAIL:
return "agree_card_fail"
case HANDLE_TYPE_EX_CARD:
return "exchange_card"
case HANDLE_TYPE_SELECT_EX_CARD:
return "select_exchange_card"
case HANDLE_TYPE_ARGREE_EX_CARD:
return "agree_exchange_card"
case HANDLE_TYPE_REFUSE_SELECT_CARD:
return "refuse_select_card"
case HANDLE_TYPE_REFUSE_EX_CARD:
return "refuse_exchange_card"
case HANDLE_TYPE_EX_CARD_SELECT_TIMEOUT:
return "exchange_card_select_timeout"
case HANDLE_TYPE_EX_CARD_TIMEOUT:
return "exchange_card_timeout"
case HANDLE_TYPE_SEND_CARD:
return "send_card"
case HANDLE_TYPE_INVITE_FRIEND:
return "invite_friend"
case HANDLE_TYPE_INVITE_ADD_FRIEND:
return "invite_add_friend"
case HANDLE_TYPE_RANK:
return "rank"
case HANDLE_TYPE_RANK_INFO:
return "rank_info"
case HANDLE_TYPE_RANK_NOTIFY:
return "rank_notify"
case HANDLE_TYPE_MAIL:
return "mail"
case HANDLE_TYPE_CHAMPSHIP_GROUP:
return "champship_group"
case HANDLE_TYPE_CHAMPSHIP_INRANK:
return "champship_inrank"
case HANDLE_TYPE_CHAMPSHIP_AI:
return "champship_ai"
case HANDLE_TYPE_CHAMPSHIP_NOTIFY:
return "champship_notify"
case HANDLE_TYPE_CHAMPSHIP_ZERO:
return "champship_zero"
case HANDLE_TYPE_CHAMPSHIP_NOTIFY2:
return "champship_notify2"
case HANDLE_TYPE_VAR_GET:
return "var_get"
case HANDLE_TYPE_VAR_SET:
return "var_set"
case SERVER_ZERO_UPDATE:
return "zero_update"
case HANDLE_TYPE_PLAYROOM_LOSE:
return "playroom_lose"
case SERVER_NOON_UPDATE:
return "noon_update"
case FRIEND_TREASURE_HANDLE:
return "friend_treasure"
case HANDLE_TYPE_MAIL_ADD:
return "mail_add"
case HANDLE_TYPE_MAIL_RELOAD:
return "mail_reload"
case HANDLE_TYPE_HANDBOOK_COLLECTION:
return "handbook_collection"
case HANDLE_TYPE_HANDBOOK_UPVOTE:
return "handbook_upvote"
case HANDLE_TYPE_SEND_CHARGE:
return "send_charge"
case HANDLE_TYPE_CHARGE_RECEIVE:
return "charge_receive"
case HANDLE_TYPE_WISHLIST_SEND:
return "wishlist_send"
case HANDLE_TYPE_WISHLIST_AGREE:
return "wishlist_agree"
case HANDLE_TYPE_PLAYROOM_UPVOTE:
return "playroom_upvote"
case HANDLE_TYPE_CHAMPSHIP_RESULT:
return "champship_result"
case HANDLE_TYPE_TREASURE_RESULT:
return "treasure_result"
case HANDLE_TYPE_FACEBOOK_UNBIND:
return "facebook_unbind"
case HANDLE_TYPE_VAR_USER_SET:
return "var_user_set"
case HANDLE_TYPE_VAR_USER_GET:
return "var_user_get"
case HANDLE_TYPE_PLAYROOM_KISS:
return "playroom_kiss"
case HANDLE_TYPE_PLAYROOM_GAME:
return "playroom_game"
case HANDLE_TYPE_CATNIP_INVITE:
return "catnip_invite"
case HANDLE_TYPE_CATNIP_AGREE:
return "catnip_agree"
case HANDLE_TYPE_CATNIP_AGREE_DEL:
return "catnip_agree_del"
case HANDLE_TYPE_CATNIP_REFUSE:
return "catnip_refuse"
case HANDLE_TYPE_CATNIP_GROWTH:
return "catnip_growth"
case HANDLE_TYPE_CATNIP_LOCK:
return "catnip_lock"
case HANDLE_TYPE_VAR_EXPIRE_SET:
return "var_expire_set"
case HANDLE_TYPE_VAR_EXPIRE_GET:
return "var_expire_get"
case HANDLE_TYPE_FRIEND_GREETING_REPLY:
return "friend_greeting_reply"
case HANDLE_TYPE_FRIEND_SPONSOER:
return "friend_sponsor"
case HANDLE_TYPE_CHAMPSHIP_LOGIN:
return "champship_login"
case HANDLE_TYPE_CHAMPSHIP_RANK_INFO:
return "champship_rank_info"
case HANDLE_TYPE_SET_CATNIP_PARTNER:
return "set_catnip_partner"
case HANDLE_TYPE_CATNIP_SEND_EMOJI:
return "catnip_send_emoji"
case HANDLE_TYPE_CHAMPSHIP_MY_RANK:
return "champship_my_rank"
case HANDLE_TYPE_LOGIN:
return "player_login"
case SERVER_PLAYER_SYNC_LOGOUT_MSG:
return "player_sync_logout"
default:
return fmt.Sprintf("Unknown(%d)", t)
}
}
func Handle(fun func(Msg) error, m Msg) error {
return fun(m)
}

View File

@ -439,6 +439,10 @@ func (o *OrderMod) CreateNormalOrder(lv int, Emit []int, EnergyMul, OrderType in
return nil
}
func (o *OrderMod) DeleteOrder(OrderId int) {
delete(o.OrderList, OrderId)
}
// 生成超级订单
func (o *OrderMod) CreateSuperOrder(lv int, Emit []int, EnergyMul int) error {
if len(Emit) == 0 {
@ -563,23 +567,23 @@ func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, Energ
}
}
b3 := false
//额外订单补充2当玩家的棋盘中出现个相同的满级产物时,立刻生成一个对应的收购订单;
for k := range MaxLvChess {
ChessNum := GoUtil.GetElemNum(ChessList, k)
if ChessNum >= 3 && Level >= 12 {
b2 := true
for _, v := range o.OrderList {
if GoUtil.SliceEqual(v.MergeId, []int{k, k, k}) {
b2 = false
break
}
}
if b2 {
b3 = true
o.addOrder([]int{k, k, k}, DIFF_LOW, Extra_type)
}
}
}
//额外订单补充2当玩家的棋盘中出现2个相同的满级产物时,立刻生成一个对应的收购订单;
// for k := range MaxLvChess {
// ChessNum := GoUtil.GetElemNum(ChessList, k)
// if ChessNum >= 2 && Level >= 12 {
// b2 := true
// for _, v := range o.OrderList {
// if GoUtil.SliceEqual(v.MergeId, []int{k, k}) {
// b2 = false
// break
// }
// }
// if b2 {
// b3 = true
// o.addOrder([]int{k, k}, DIFF_LOW, Extra_type)
// }
// }
// }
//额外订单补充1CDEG发射器首次合成时生成其对应2及棋子订单完成后生成3及再完成生成4及的
if b1 {
ChessColor := mergeDataCfg.GetEmitProduceChessType(OrderEmit)

View File

@ -390,6 +390,7 @@ func getChesslvRange(Emit int, EnergyMul int, IsCharge bool) (int, int) {
// 根据类型获取发射器id
func GetEmitByColor(Emit []int, color string) int {
sort.Ints(Emit)
for _, v := range Emit {
Produce := mergeDataCfg.GetEmitProduceChessType(v)
for _, c := range Produce {
@ -668,6 +669,9 @@ func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int {
MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
NewLev1 = min(NewLev1, MaxLev)
ChessId := mergeDataCfg.GetChessIdByLvAndColor(NewLev1, Color)
if ChessId == 0 {
continue
}
ChessIds = append(ChessIds, ChessId)
}
return GoUtil.UniqueInts(ChessIds)

View File

@ -40,11 +40,11 @@ func (s *SevenLoginMod) ZeroUpdate(Add, LastLoginTime int) {
s.WeekResetTime = WeekZeroTimestamp
s.DayR = 0
}
if Now > s.MonthResetTime+GoUtil.MONTHDAYS {
monthZeroTimestamp := GoUtil.MonthZeroTimestamp()
if monthZeroTimestamp > s.MonthResetTime {
s.MonthReward = randMonthReward()
s.Active = 0
s.MonthResetTime = s.MonthResetTime + (Now-s.MonthResetTime)/GoUtil.MONTHDAYS*GoUtil.MONTHDAYS
s.MonthResetTime = monthZeroTimestamp
}
s.DayR++
}
@ -108,11 +108,12 @@ func (s *SevenLoginMod) BackData() *msg.ResSevenLogin {
Status := GoUtil.IfTrue(!v.Status && s.Active >= Active, 1, 0).(int)
Status = GoUtil.IfTrue(v.Status, 2, Status).(int)
MonthReward = append(MonthReward, &msg.SevenLoginReward{
Item1: item.ItemToMsg(v.Item1),
Item2: item.ItemToMsg(v.Item2),
Item3: item.ItemToMsg(v.Item3),
Status: int32(Status),
Id: int32(k),
Item1: item.ItemToMsg(v.Item1),
Item2: item.ItemToMsg(v.Item2),
Item3: item.ItemToMsg(v.Item3),
Status: int32(Status),
Id: int32(k),
NeedActive: int32(Active),
})
}

View File

@ -109,7 +109,8 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot
}
func randMonthReward() map[int]Reward {
RewardList := sevenLoginCfg.GetSevenLoginMonthReward()
month := GoUtil.NowMonth()
RewardList := sevenLoginCfg.GetSevenLoginMonthReward(month)
sort.Slice(RewardList, func(i, j int) bool {
return RewardList[i].Id < RewardList[j].Id
})

View File

@ -3,12 +3,20 @@ package game
import (
"server/game/mod/base"
"server/game/mod/card"
"server/game/mod/champship"
"server/game/mod/charge"
"server/game/mod/chess"
dailyTask "server/game/mod/daily_task"
"server/game/mod/decorate"
"server/game/mod/endless"
"server/game/mod/face"
"server/game/mod/friend"
"server/game/mod/fur"
"server/game/mod/item"
limitedTimeEvent "server/game/mod/limited_time_event"
"server/game/mod/mail"
"server/game/mod/mining"
"server/game/mod/order"
"server/game/mod/playroom"
sevenLogin "server/game/mod/seven_login"
)
@ -52,3 +60,38 @@ func (p *Player) GetMailMod() *mail.MailMod {
func (p *Player) GetSevenLoginMod() *sevenLogin.SevenLoginMod {
return p.PlayMod.getSevenLoginMod()
}
func (p *Player) GetOrderMod() *order.OrderMod {
return p.PlayMod.getOrderMod()
}
func (p *Player) GetFurMod() *fur.FurMod {
return p.PlayMod.getFurMod()
}
func (p *Player) GetFriendMod() *friend.FriendMod {
return p.PlayMod.getFriendMod()
}
func (p *Player) GetChampshipMod() *champship.ChampshipMod {
return p.PlayMod.getChampshipMod()
}
func (p *Player) GetFaceMod() *face.FaceMod {
return p.PlayMod.getFaceMod()
}
func (p *Player) GetLimitedTimeEventMod() *limitedTimeEvent.LimitedTimeEventMod {
return p.PlayMod.getLimitedTimeEventMod()
}
func (p *Player) GetMiningMod() *mining.MiningMod {
return p.PlayMod.getMiningMod()
}
func (p *Player) GetDailyTaskMod() *dailyTask.DailyTaskMod {
return p.PlayMod.getDailyTaskMod()
}
func (p *Player) GetItemMod() *item.ItemMod {
return p.PlayMod.getItemMod()
}

View File

@ -206,6 +206,7 @@ func (p *Player) PlayroomVisit(Uid int) {
r.Chip = int32(p.GetPlayroomChip(Uid))
r.Kiss = int32(p.GetPlayroomKiss(Uid))
r.DressSet = GoUtil.MapIntToInt32(PlayerData.DressSet)
r.Fur = int32(PlayerData.PetFur)
p.PushClientRes(r)
}
@ -279,6 +280,10 @@ func (p *Player) ChargeBackData() {
}
}
CatDaySaleEndTime := LimitedEventMod.GetCatDaySaleEndTime()
var specialChargeWeek int32
if c.LastSpecialCharge != 0 {
specialChargeWeek = int32(GoUtil.FullWeeksSince(c.LastSpecialCharge))
}
p.PushClientRes(&proto.ResCharge{
Charge: float32(c.Charge),
Total: int32(c.Total),
@ -289,7 +294,7 @@ func (p *Player) ChargeBackData() {
Gift: GoUtil.MapIntToInt32(c.Gift),
Ad: c.Ad,
SpecialCharge: float32(c.SpecialCharge),
SpecialChargeWeek: int32(GoUtil.FullWeeksSince(c.LastSpecialCharge)),
SpecialChargeWeek: specialChargeWeek,
TodayCharge: float32(c.TodayCharge),
MonthCharge: float32(c.MonthCharge),
Wish: resWish,
@ -303,7 +308,8 @@ func (p *Player) ChargeBackData() {
func (p *Player) BackChampship() {
ChampshipMod := p.PlayMod.getChampshipMod()
rank, preRank := p.GetChampshipRank()
p.PushClientRes(ChampshipMod.BackData(rank, preRank))
todayActivityId, yesterdayActivityId := p.GetChampshipActivityId()
p.PushClientRes(ChampshipMod.BackData(rank, preRank, todayActivityId, yesterdayActivityId))
}
// 获取冠军赛排名 redis缓存
@ -328,8 +334,12 @@ func (p *Player) FriendListBackData() {
fl = append(fl, ps)
}
}
now := GoUtil.Now()
ReqFriendList := make([]int64, 0, len(FriendMod.SendApply))
for k := range FriendMod.SendApply {
for k, v := range FriendMod.SendApply {
if now-v > oneday {
continue
}
ReqFriendList = append(ReqFriendList, int64(k))
}
p.PushClientRes(&proto.ResFriendList{
@ -342,13 +352,13 @@ func (p *Player) FriendListBackData() {
func (p *Player) FriendApplyBackData() {
FriendMod := p.PlayMod.getFriendMod()
al := make([]*proto.ResFriendApplyInfo, 0, len(FriendMod.ApplyList))
for k, v := range FriendMod.ApplyList {
al := make([]*proto.ResFriendApplyInfo, 0, len(FriendMod.NewApplyList))
for k, v := range FriendMod.NewApplyList {
ps := G_GameLogicPtr.GetResSimplePlayerByUid(k)
if ps != nil {
al = append(al, &proto.ResFriendApplyInfo{
Player: ps,
Time: int32(v),
Time: int32(v.Time),
})
}
}
@ -384,6 +394,9 @@ func (p *Player) FriendLogBackData() {
Uid: int64(v.Uid),
}
}
if !FriendMod.CheckFriend(v.Uid) && v.Uid > 10000 {
continue
}
reply = append(reply, &proto.ResFriendReply{
Player: ps,
Type: int32(v.Type),
@ -404,6 +417,12 @@ func (p *Player) FriendCardBackData() {
FriendMod := p.PlayMod.getFriendMod()
msgList := make([]*proto.ResFriendCard, 0, len(FriendMod.Card))
for _, v := range FriendMod.Card {
if !FriendMod.CheckFriend(v.AUid) && v.AUid != int(p.M_DwUin) {
continue
}
if !FriendMod.CheckFriend(v.BUid) && v.BUid != int(p.M_DwUin) {
continue
}
msgList = append(msgList, GetCardInfoMsg(v))
}
p.PushClientRes(&proto.ResFriendCardMsg{

View File

@ -93,6 +93,39 @@ func (p *PlayerBaseData) LoadDataFromDB(UserName interface{}) bool {
return false
}
p.Data.Diamond = sqlStruck.Diamond
p.Data.DwUin = sqlStruck.DwUin
p.Data.Energy = sqlStruck.Energy
p.Data.Star = sqlStruck.Star
p.Data.RecoverTime = sqlStruck.RecoverTime
p.Data.Level = sqlStruck.Level
p.Data.Exp = sqlStruck.Exp
p.Data.StartOrderId = sqlStruck.StartOrderId
p.Data.MusicCode = sqlStruck.MusicCode
p.Data.Guild = sqlStruck.Guild
p.Data.PackUnlockCount = sqlStruck.PackUnlockCount
p.Data.LastPlayTime = sqlStruck.LastPlayTime
p.Data.Ban = sqlStruck.Ban
p.Data.UserName = sqlStruck.UserName
p.Data.LogoutTime = sqlStruck.LogoutTime
p.Data.Node = sqlStruck.Node
p.Data.Rolecreatetime = sqlStruck.Rolecreatetime
p.Data.LastChampGroupID = sqlStruck.LastChampGroupID
p.Data.ChampshipsGroupID = sqlStruck.ChampshipsGroupID
p.Data.NoAd = sqlStruck.NoAd
p.Data.FaceBookId = sqlStruck.FaceBookId
p.p.PlayMod.getBaseMod().RegisterTime = int64(sqlStruck.Rolecreatetime)
return true
}
func (p *PlayerBaseData) LoadDataFromDBByUid(Uid int) bool {
sqlStr := "SELECT * FROM t_player_baseinfo WHERE DwUin = ?"
sqlStruck := db.ResPlayerBaseInfo{}
if err := db.SqlDb.Get(&sqlStruck, sqlStr, Uid); err != nil {
log.Debug("PlayerBaseData get data failed, err:%v\n", err)
return false
}
p.Data.Diamond = sqlStruck.Diamond
p.Data.DwUin = sqlStruck.DwUin
p.Data.Energy = sqlStruck.Energy
@ -504,7 +537,8 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
// 日常任务解锁
DailyTaskMod := player.PlayMod.getDailyTaskMod()
DecorateMod := player.PlayMod.getDecorateMod()
if DailyTaskMod.LevUpTrigger(BaseMod.Level, DecorateMod.GetAreaId()) {
dailyAcitivityId := player.GetDailyTaskActivityId()
if DailyTaskMod.LevUpTrigger(BaseMod.Level, DecorateMod.GetAreaId(), dailyAcitivityId) {
player.PushClientRes(DailyTaskMod.BackData())
}
upLv = BaseMod.Level
@ -527,7 +561,7 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
player.TriggerOrder(BaseMod.Level, order.TRIGGER_TYPE_LV, ChessMod.GetOrderEmit(), player.PlayMod.getBaseMod().GetEnergyMul())
player.PushClientRes(OrderMod.BackData())
// 重载活动
player.initAcitivity()
player.initActivity()
player.BackDataActivity()
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_UPLV})
player.TeLog("level_up", map[string]interface{}{

View File

@ -10,6 +10,7 @@ import (
activityCfg "server/conf/activity"
cardCfg "server/conf/card"
chargeCfg "server/conf/charge"
fur_cfg "server/conf/fur"
guesscolorCfg "server/conf/guess_color"
itemCfg "server/conf/item"
limitedTimeEventCfg "server/conf/limited_time_event"
@ -217,7 +218,7 @@ func (p *Player) InitPlayer(UserName string) error {
// 玩家基础数据
ok := Base.LoadDataFromDB(UserName)
if !ok {
log.Debug("load PlayerBaseData failed:", UserName)
log.Debug("load PlayerBaseData failed:%s", UserName)
return errors.New("load PlayerBaseData failed")
}
p.PlayerBaseMod = Base
@ -229,7 +230,7 @@ func (p *Player) InitPlayer(UserName string) error {
modData := &PlayerModData{PlayerData: NewPlayerData("PlayerModData", p)}
ok = modData.LoadDataFromDB(Base.Data.DwUin)
if !ok {
log.Debug("load PlayerModData failed:", UserName)
log.Debug("load PlayerModData failed:%s", UserName)
return errors.New("load PlayerModData failed")
}
IsUpdate, err := modData.InitMod(p)
@ -247,7 +248,66 @@ func (p *Player) InitPlayer(UserName string) error {
log.Debug("AddFunc failed:", err)
}
p.McronSave.Start()
p.initAcitivity()
p.initActivity()
p.ZeroUpdate(nil)
p.NoonUpdate(nil)
p.Login()
p.OrderShip()
p.UpdateUserInfo()
// fix bug
ChargeMod := p.PlayMod.getChargeMod()
ChessMod := p.PlayMod.getChessMod()
ChargeMod.FixBug(ChessMod.GetEmitList())
p.FixOrderBug()
p.FixDecorate()
return nil
}
func (p *Player) InitPlayerByUid(Uid int) error {
p.lock.Lock()
defer p.lock.Unlock()
p.msgChan = make(chan *MsgMod.Msg, 100)
p.Msg = make([]PlayerMsg, 0)
p.args = make(map[string]interface{})
p.timerList = make(map[string]*timer.Timer)
p.MDispatr = timer.NewDispatcher(100)
p.stopSignal = make(chan bool)
Base := &PlayerBaseData{p: p}
// 玩家基础数据
ok := Base.LoadDataFromDBByUid(Uid)
if !ok {
log.Debug("load PlayerBaseData failed:%d", Uid)
return errors.New("load PlayerBaseData failed")
}
p.PlayerBaseMod = Base
p.M_DwUin = Base.Data.DwUin
// 棋盘数据
// 玩家模块数据
modData := &PlayerModData{PlayerData: NewPlayerData("PlayerModData", p)}
ok = modData.LoadDataFromDB(Base.Data.DwUin)
if !ok {
log.Debug("load PlayerModData failed:%d", Uid)
return errors.New("load PlayerModData failed")
}
IsUpdate, err := modData.InitMod(p)
if err != nil {
log.Debug("InitMod failed:", err)
return err
}
p.PlayMod.mod_list = modData.ModList
p.PlayMod.is_update = IsUpdate
// 启动定时器
p.DispatcherHandle()
p.McronSave = cron.New()
_, err = p.McronSave.AddFunc("@every 1m", p.AutoSaveData)
if err != nil {
log.Debug("AddFunc failed:", err)
}
p.McronSave.Start()
p.initActivity()
p.ZeroUpdate(nil)
p.NoonUpdate(nil)
p.Login()
@ -290,10 +350,6 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
p.PushClientRes(p.PlayMod.getCardMod().BackData())
// 每日任务
p.PlayMod.getDailyTaskMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel(), p.PlayMod.getDecorateMod().GetAreaId())
p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
// 能量商店
p.PlayMod.getBaseMod().ZeroUpdate()
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
@ -328,8 +384,13 @@ func (p *Player) ZeroUpdate(a []interface{}) {
}
p.PlayroomBackData()
p.PlayMod.getChampshipMod().ZeroUpdate()
p.initAcitivity()
p.initActivity()
p.ActivityZeroUpdate()
// 每日任务
p.PlayMod.getDailyTaskMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel(), p.PlayMod.getDecorateMod().GetAreaId(), p.GetDailyTaskActivityId())
p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_LOGIN})
p.PlayMod.save()
}
@ -473,7 +534,7 @@ func (p *Player) ClearData() {
G_GameLogicPtr.DelPlayer(p)
SendMsgToCenterAsync(&MsgMod.Msg{
From: Uid,
HandleType: MsgMod.HANDLE_MDO_PLAYER_LOGOUT,
HandleType: MsgMod.HANDLE_MOD_PLAYER_LOGOUT,
})
}
@ -523,6 +584,9 @@ func (p *Player) GetAgentByPlayer() gate.Agent {
// 处理物品
func (p *Player) HandleLoseItem(itemList []*item.Item, Label string) error {
if itemList == nil {
return nil
}
for _, v := range itemList {
if v.Num > 0 {
v.Num = -v.Num
@ -531,7 +595,7 @@ func (p *Player) HandleLoseItem(itemList []*item.Item, Label string) error {
return p.HandleItem(itemList, Label)
}
func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
if len(itemList) == 0 {
if itemList == nil {
return nil
}
is_update := false
@ -833,6 +897,21 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
PassMod := p.PlayMod.getPassMod()
PassMod.AddExp(v.Num)
p.ActPassBackData()
case item.ITEM_TYPE_PET_FUR:
FurMod := p.PlayMod.getFurMod()
Effect := itemCfg.GetItemEffect(v.Id)
FurMod.AddFurInfo(Effect, GoUtil.Now(), 0)
BackDataType[item.ITEM_TYPE_PET_FUR] = struct{}{}
p.TeLog("pro_pet_fur_get", map[string]interface{}{
"pet_fur_name": fur_cfg.GetFurShopName(v.Id),
"fur_coin_cost": fur_cfg.GetFurShopCostNum(v.Id),
"pet_fur_get_type": Label,
})
case item.ITEM_TYPE_AD_CARD: // 广告卡
ChargeMod := p.PlayMod.getChargeMod()
Effect := itemCfg.GetItemEffect(v.Id)
ChargeMod.AddAdTime(Effect)
BackDataType[item.ITEM_TYPE_AD_CARD] = struct{}{}
default:
err := ItemMod.AddItem(v.Id, v.Num)
p.TeLog("asset_change", map[string]interface{}{
@ -872,6 +951,11 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
item.ITEM_TYPE_PLAYROOM_DECORATION_SET,
item.ITEM_TYPE_PLAYROOM_DRESS_SET:
p.PlayroomBackData()
case item.ITEM_TYPE_PET_FUR:
FurMod := p.PlayMod.getFurMod()
p.PushClientRes(FurMod.BackData())
case item.ITEM_TYPE_AD_CARD:
p.ChargeBackData()
}
}
p.PetItemUseLog(itemList)
@ -1004,6 +1088,9 @@ func (p *Player) UpdateUserInfo() {
simple.Physiology = p.PlayMod.getPlayroomMod().GetPhysiologyList()
simple.Lang = int(p.PlayMod.getBaseMod().Lang)
simple.Account = p.PlayMod.getBaseMod().Account
simple.PetFur = p.PlayMod.getFurMod().GetFurSet()
simple.MaxCharge = p.PlayMod.getChargeMod().GetMaxCharge()
simple.AdWatch = p.PlayMod.getChargeMod().GetAdWatch()
//TODO 存储到redis 在新版本中将优化成gob进行压缩
value, _ := json.Marshal(simple)
IdStr := GoUtil.String(p.M_DwUin)
@ -1084,7 +1171,7 @@ func (p *Player) TeLog(Type string, Param map[string]interface{}) {
}
// 初始化活动
func (p *Player) initAcitivity() {
func (p *Player) initActivity() {
p.activity = make(map[int]*ActivityInfo)
ActivityList := activityCfg.GetActivityList()
Level := p.GetPlayerBaseMod().GetLevel()
@ -1106,6 +1193,10 @@ func (p *Player) initAcitivity() {
Title: v.Title,
}
}
p.TeLog("activity_ids", map[string]interface{}{
"info": p.activity,
})
p.ActivityLogin()
}
func (p *Player) BackDataActivity() {
@ -1260,3 +1351,11 @@ func CheckPlayerLose(Uid int) bool {
}
return false
}
func (p *Player) Lock() {
p.lock.Lock()
}
func (p *Player) UnLock() {
p.lock.Unlock()
}

View File

@ -23,6 +23,7 @@ import (
"server/game/mod/face"
"server/game/mod/friend"
friendTreasure "server/game/mod/friend_treasure.go"
"server/game/mod/fur"
guesscolor "server/game/mod/guess_color"
"server/game/mod/guide"
guideTask "server/game/mod/guide_task"
@ -120,6 +121,7 @@ type PlayerModList struct {
Catnip catnip.CatnipMod // 猫草大作战
GuideTask guideTask.GuideTaskMod // 引导任务
Pass pass.PassMod // 通行证
Fur fur.FurMod // 毛皮
}
func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool {
@ -204,7 +206,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.Base.InitData(int(p.Data.DwUin), Ip)
p.ModList.SevenLogin.InitData()
p.ModList.LimitedTimeEvent.InitData(BaseMod.GetLevel())
p.ModList.Friend.InitData()
p.ModList.Friend.InitData(p.ModList.Base.Uid)
p.ModList.Mail.InitData()
p.ModList.Charge.InitData()
p.ModList.Endless.InitData()
@ -221,6 +223,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.Compensation.InitData()
p.ModList.GuideTask.InitData()
p.ModList.Pass.InitData()
p.ModList.Fur.InitData()
return is_update, nil
}
@ -439,3 +442,7 @@ func (p *PlayerMod) getGuideTaskMod() *guideTask.GuideTaskMod {
func (p *PlayerMod) getPassMod() *pass.PassMod {
return &p.mod_list.Pass
}
func (p *PlayerMod) getFurMod() *fur.FurMod {
return &p.mod_list.Fur
}

View File

@ -4,14 +4,11 @@ import (
"errors"
"fmt"
"math"
"server/conf"
baseCfg "server/conf/base"
cardCfg "server/conf/card"
champshipCfg "server/conf/champship"
collectCfg "server/conf/collect"
decorateCfg "server/conf/decorate"
emojiCfg "server/conf/emoji"
friendCfg "server/conf/friend"
GuideTaskCfg "server/conf/guide_task"
handbookCfg "server/conf/handbook"
limitedTimeEventCfg "server/conf/limited_time_event"
@ -19,7 +16,6 @@ import (
miningCfg "server/conf/mining"
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom"
"server/db"
"server/game/internal"
"server/game/mod/activity"
"server/game/mod/card"
@ -417,6 +413,8 @@ func ReqRewardOrder(player *Player, buf []byte) error {
player.AddOrder()
player.AddHighOrder()
player.AddHighOrder2()
// 删除无法完成的回收订单 TODO 需前端配合开发
// player.DeleteHighOrder()
player.InitOrderItem()
// 存钱罐增加钻石
PiggyBankMod := player.PlayMod.getPiggyBankMod()
@ -543,7 +541,12 @@ func ReqDecorate(player *Player, buf []byte) error {
"item_list": AddItem,
})
}
// 跨越场景
if DecorateMod.GetAreaId() != AreaId { // 解锁上报
LimitEventMod := player.PlayMod.getLimitedTimeEventMod()
if LimitEventMod.AddSenceDashTimes() {
player.PushClientRes(LimitEventMod.BackData())
}
player.TeLog("plot_unlock", map[string]interface{}{
"plot_id": DecorateMod.GetAreaId(),
})
@ -640,6 +643,15 @@ func ReqDecorateAll(player *Player, buf []byte) error {
player.TeLog("scene_reward", v.(map[string]interface{}))
}
}
if DecorateMod.GetAreaId() != AreaId { // 解锁上报
LimitEventMod := player.PlayMod.getLimitedTimeEventMod()
if LimitEventMod.AddSenceDashTimes() {
player.PushClientRes(LimitEventMod.BackData())
}
player.TeLog("plot_unlock", map[string]interface{}{
"plot_id": DecorateMod.GetAreaId(),
})
}
player.PlayMod.save()
player.PushClientRes(DecorateMod.BackData())
@ -732,13 +744,13 @@ func ReqGetChessFromBuff(player *Player, buf []byte) error {
"chess_id": ChessId,
})
Update = OrderMod.CreateExtraOrder([]int{ChessId}, AddNewEmit, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul(), BaseMod.GetLevel())
if Update {
player.PushClientRes(OrderMod.BackData())
}
triggerComposeChess(player, ChessId, player.PlayMod.getBaseMod().EnergyMul, player.PlayMod.getChessMod().GetEmitList())
player.EmitRetireTrigger1()
player.InitOrderItem()
player.PlayMod.save()
if Update {
player.InitOrderItem()
player.PushClientRes(OrderMod.BackData())
}
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResGetChessFromBuff{
Code: msg.RES_CODE_SUCCESS,
@ -1338,7 +1350,7 @@ func ReqGetDailyTaskReward(player *Player, buf []byte) error {
return err
}
DailyTaskMod := player.PlayMod.getDailyTaskMod()
itemList, err := DailyTaskMod.GetDailyReward(int(req.Id))
itemList, err := DailyTaskMod.GetDailyReward(int(req.Id), player.GetDailyTaskActivityId())
if err != nil {
player.SendErrClienRes(&msg.ResGetDailyTaskReward{
Code: msg.RES_CODE_FAIL,
@ -1759,9 +1771,16 @@ func ReqLimitSenceReward(player *Player, buf []byte) error {
return fmt.Errorf("not exist")
}
Id, Items := limitedTimeEventMod.GetSceneDashReward()
Id, Items, err := limitedTimeEventMod.GetSceneDashReward()
if err != nil {
player.SendErrClienRes(&msg.ResLimitSenceReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.args["ResItemPopId"] = Id
err := player.HandleItem(Items, msg.ITEM_POP_LABEL_LimitSenceReward.String())
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_LimitSenceReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResLimitSenceReward{
Code: msg.RES_CODE_FAIL,
@ -1796,251 +1815,6 @@ func ReqGetGoldCard(player *Player, buf []byte) error {
return nil
}
// 搜索用户
func ReqSearchPlayer(player *Player, buf []byte) error {
req := &msg.ReqSearchPlayer{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid, err := strconv.Atoi(req.Uid)
list := make([]*msg.ResPlayerSimple, 0)
if err == nil {
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(Uid)
if SearchPlayer != nil && SearchPlayer.Level != 0 {
list = append(list, SearchPlayer)
}
}
data, err := db.SearchPlayer(req.Uid)
if err != nil {
player.SendErrClienRes(&msg.ResSearchPlayer{
Code: 0,
})
}
for _, v := range data {
if player.M_DwUin == v.DwUin {
continue
}
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(int(v.DwUin))
list = append(list, SearchPlayer)
}
// list 列表去重
l := make(map[int]*msg.ResPlayerSimple)
for _, v := range list {
if _, ok := l[int(v.Uid)]; !ok {
l[int(v.Uid)] = v
}
}
l2 := make([]*msg.ResPlayerSimple, 0)
for _, v := range l {
l2 = append(l2, v)
}
player.PushClientRes(&msg.ResSearchPlayer{
List: l2,
})
return nil
}
// 申请好友
func ReqApplyFriend(player *Player, buf []byte) error {
req := &msg.ReqApplyFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
if Uid == int(player.M_DwUin) {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "cannot apply yourself",
})
return fmt.Errorf("cannot apply yourself")
}
if FriendMod.CheckFriend(Uid) {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "already friend",
})
return fmt.Errorf("already friend")
}
// 好友人数到达上限2000人玩家将无法再发送好友申请
if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "friend list full",
})
return fmt.Errorf("friend list full")
}
// 对于任何玩家而言向自己在24小时内已从任意途径发送过好友申请的玩家再次发送好友申请时该次申请不会被发出
sendApplyTime := FriendMod.GetSendApplyTime(Uid)
if sendApplyTime != 0 && GoUtil.Now()-sendApplyTime < 86400 {
player.PushClientRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Uid: req.Uid,
Msg: "already applied",
})
return fmt.Errorf("already applied")
}
now := GoUtil.Now()
if req.Type == 1 {
Items, err := FriendMod.GetSponsorReward()
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
BaseMod := player.PlayMod.getBaseMod()
BaseMod.GetEnergyByAD()
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_ApplyFriendSponsor.String())
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.AddLog(int(req.Uid), friend.LOG_TYPE_FRIEND_SPONSOR, "", now)
FriendMgrSend(&MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_FRIEND_SPONSOER,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + sevendays,
})
player.PushClientRes(BaseMod.BackData())
player.TeLog("friend_invite_reward", map[string]interface{}{
"item_list": Items,
})
}
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_APPLY,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + sevendays,
}
FriendMgrSend(m)
player.PushClientRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
return nil
}
// 同意申请
func ReqAgreeFriend(player *Player, buf []byte) error {
req := &msg.ReqAgreeFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
if !FriendMod.CheckApply(Uid) {
player.SendErrClienRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_FAIL,
Msg: "apply uid not exist",
})
return fmt.Errorf("apply uid not exist")
}
// 好友人数到达上限2000人玩家将无法再同意好友申请
if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() {
player.SendErrClienRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_FAIL,
Msg: "friend list full",
})
return fmt.Errorf("friend list full")
}
// 新好友才可以打招呼
if !FriendMod.CheckAddBefore(Uid) {
FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+oneday, nil)
}
FriendMod.AddFriend(Uid)
player.PushClientRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
Player: G_GameLogicPtr.GetResSimplePlayerByUid(int(req.Uid)),
})
player.TeLog("friend_add", map[string]interface{}{
"player_id": Uid,
"add_type": "接受申请",
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now())
m := &MsqMod.Msg{
Type: MsqMod.HADNLE_TYPE_AGREE,
From: int(player.M_DwUin),
To: Uid,
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
player.FriendApplyBackData()
player.FriendLogBackData()
player.PlayMod.save()
return nil
}
// 删除好友
func ReqDelFriend(player *Player, buf []byte) error {
req := &msg.ReqDelFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_DEL,
From: int(player.M_DwUin),
To: Uid,
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
FriendMod := player.PlayMod.getFriendMod()
FriendMod.DelFriend(Uid)
player.PlayMod.save()
player.PushClientRes(&msg.ResDelFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_DELETE, "", GoUtil.Now())
player.FriendListBackData()
player.TeLog("friend_delete", map[string]interface{}{
"player_id": Uid,
})
return nil
}
// 拒绝申请
func ReqRefuseFriend(player *Player, buf []byte) error {
req := &msg.ReqRefuseFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
FriendMod.RefuseApply(Uid)
player.PlayMod.save()
player.PushClientRes(&msg.ResRefuseFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
now := GoUtil.Now()
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_REFUSE,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + 86400*7,
}
FriendMgrSend(m)
player.FriendApplyBackData()
return nil
}
// 向好友请求卡牌
func ReqCardGive(player *Player, buf []byte) error {
req := &msg.ReqCardGive{}
@ -2987,7 +2761,11 @@ func ReqShippingOrder(player *Player, buf []byte) error {
// 锦标赛
func ReqChampshipReward(player *Player, buf []byte) error {
ChampshipMod := player.PlayMod.getChampshipMod()
itemList := ChampshipMod.GetReward()
todayActivityId, _ := player.GetChampshipActivityId()
DecorateMod := player.PlayMod.getDecorateMod()
orderFactor := orderCfg.GetOrderFactor(DecorateMod.GetAreaId())
RewardId := ChampshipMod.Reward
itemList := ChampshipMod.GetReward(todayActivityId, orderFactor)
err := player.HandleItem(itemList, msg.ITEM_POP_LABEL_ChampshipReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResChampshipReward{
@ -3008,13 +2786,17 @@ func ReqChampshipReward(player *Player, buf []byte) error {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_CHAMPIONSHIP_PRIZE, "")
player.UpdateUserInfo()
}
player.TeLog("championship_reward", map[string]interface{}{
"season_id": GoUtil.ZeroTimestamp(),
"champship_step_id": ChampshipMod.Reward,
"reward_type": "step",
"item_list": itemList,
"champship_score": ChampshipMod.Score,
})
for i := RewardId + 1; i <= ChampshipMod.Reward; i++ {
items, _ := champshipCfg.GetRewardItems(i)
player.TeLog("championship_reward", map[string]interface{}{
"season_id": GoUtil.ZeroTimestamp(),
"champship_step_id": i,
"reward_type": "step",
"item_list": items,
"champship_score": ChampshipMod.Score,
})
}
return nil
}
@ -3036,140 +2818,11 @@ func ReqKv(player *Player, buf []byte) error {
return nil
}
func ReqFriendRecommend(player *Player, buf []byte) error {
FriendMod := player.PlayMod.getFriendMod()
RecommendList := make([]*msg.ResPlayerSimple, 0)
FriendNum := FriendMod.GetFriendNum()
var n int
if FriendNum < 10 {
n = 3
} else {
Active := 0
for k := range FriendMod.GetFriendList() {
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(k)
if PlayerSimpleData == nil {
continue
}
if PlayerSimpleData.Login > GoUtil.Now()-86400 {
Active++
}
}
n = max(0, 3-(Active/10))
}
PlayerList := GetRecommendPlayer(player, n)
for _, v := range PlayerList {
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(v)
RecommendList = append(RecommendList, PlayerSimpleData)
}
player.PushClientRes(&msg.ResFriendRecommend{
List: RecommendList,
})
player.PlayMod.save()
return nil
}
func ReqFriendList(player *Player, buf []byte) error {
player.FriendListBackData()
return nil
}
func ReqFriendApply(player *Player, buf []byte) error {
player.FriendApplyBackData()
return nil
}
func ReqFriendCardMsg(player *Player, buf []byte) error {
player.FriendCardBackData()
return nil
}
func ReqFriendTimeLine(player *Player, buf []byte) error {
player.FriendLogBackData()
return nil
}
func ReqFriendTLUpvote(player *Player, buf []byte) error {
req := &msg.ReqFriendTLUpvote{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
Items, FUid, err := FriendMod.Upvote(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_TLUpvote.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
now := GoUtil.Now()
// 添加时间线
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_HANDBOOK_UPVOTE,
From: int(player.M_DwUin),
To: int(FUid),
SendT: now,
End: now + sevendays,
}
FriendMod.AddActLog(friend.ACT_LOG_TYPE_VISIT_UPVOTE, "")
player.UpdateUserInfo()
FriendMgrSend(m)
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
player.TeLog("friend_upvote", map[string]interface{}{
"player_id": int(req.Id),
})
return nil
}
func ReqFriendTReward(player *Player, buf []byte) error {
req := &msg.ReqFriendTReward{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
Items, err := FriendMod.GetReward(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_FriendTReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
return nil
}
func ReqChampshipRankReward(player *Player, buf []byte) error {
_, myPreRank := player.GetChampshipRank()
ChampshipMod := player.PlayMod.getChampshipMod()
itemList, err := ChampshipMod.GetRankReward(myPreRank)
_, yesterdayActivityId := player.GetChampshipActivityId()
itemList, err := ChampshipMod.GetRankReward(myPreRank, yesterdayActivityId)
if err != nil {
player.SendErrClienRes(&msg.ResChampshipRankReward{
Code: msg.RES_CODE_FAIL,
@ -3501,6 +3154,7 @@ func ReqMiningTake(player *Player, buf []byte) error {
})
return err
}
itemList, err := MiningMod.Take(req.Map, int(req.Gem))
if err != nil {
player.SendErrClienRes(&msg.ResMiningTake{
@ -3535,7 +3189,9 @@ func ReqMiningReward(player *Player, buf []byte) error {
})
return fmt.Errorf("activity not start")
}
itemList, Mining, err := MiningMod.GetReward()
DecorateMod := player.PlayMod.getDecorateMod()
orderFactor := orderCfg.GetOrderFactor(DecorateMod.GetAreaId())
itemList, Mining, err := MiningMod.GetReward(orderFactor)
if err != nil {
player.SendErrClienRes(&msg.ResMiningReward{
Code: msg.RES_CODE_FAIL,
@ -3785,7 +3441,14 @@ func ReqPlayroomInfo(player *Player, buf []byte) error {
}
} else {
PlayroomMod.SetGameId(playroom.GAME_TYPE_FILP)
PlayroomMod.SetGameRewardFlip(int(float64(PlayerData.Star)*0.03), int(float64(PlayerData.Star)*0.05), int(float64(PlayerData.Star)*0.1))
DecorateMod := player.PlayMod.getDecorateMod()
needStar := DecorateMod.GetAreaCost()
highReward := int(float64(needStar) * 0.75)
if highReward < PlayerData.Star {
PlayroomMod.SetGameRewardFlip(max(int(float64(needStar)*0.1), 10), max(int(float64(needStar)*0.3), 50), max(int(float64(needStar)*0.75), 100))
} else {
PlayroomMod.SetGameRewardFlip(max(10, int(float64(PlayerData.Star)*0.1)), max(50, int(float64(PlayerData.Star)*0.5)), max(PlayerData.Star, 100))
}
}
player.PlayMod.save()
player.PlayroomVisit(Targer)
@ -4771,6 +4434,7 @@ func ReqSetEmoji(player *Player, buf []byte) error {
"emoji_id": int(req.Id),
"emoji_setplace": int(req.Type),
})
player.UpdateUserInfo()
player.PlayMod.save()
player.PushClientRes(&msg.ResSetEmoji{
Code: msg.RES_CODE_SUCCESS,
@ -4983,7 +4647,7 @@ func ReqActivityReward(player *Player, buf []byte) error {
"Items": Items,
})
player.PlayMod.save()
player.initAcitivity()
player.initActivity()
player.BackDataActivity()
player.PushClientRes(&msg.ResActivityReward{
Code: msg.RES_CODE_SUCCESS,
@ -5005,6 +4669,24 @@ func ReqLang(player *Player, buf []byte) error {
return nil
}
func ReqAdWatch(player *Player, buf []byte) error {
req := &msg.ReqAdWatch{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
ChargeMod := player.GetChargeMod()
ChargeMod.AddAdWatch()
player.TeLog("ad_watch", map[string]interface{}{
"type": req.Type,
})
player.PlayMod.save()
player.UpdateUserInfo()
player.PushClientRes(&msg.ResAdWatch{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
func ReqCatTrickReward(player *Player, buf []byte) error {
req := &msg.ReqCatTrickReward{}
err := proto.Unmarshal(buf, req)
@ -5047,40 +4729,6 @@ func ReqCatTrickReward(player *Player, buf []byte) error {
return nil
}
func ReqAddNpc(player *Player, buf []byte) error {
req := &msg.ReqAddNpc{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
err = FriendMod.SetNpc(int(req.NpcId))
if err != nil {
player.SendErrClienRes(&msg.ResAddNpc{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
if len(FriendMod.Npc) == 1 { // 首次添加NPC 视为邀请好友成功
InviteMod := player.PlayMod.getInviteMod()
InviteMod.AddInvite(int(req.NpcId))
}
player.PlayMod.save()
player.FriendListBackData()
player.TeLog("add_npc", map[string]interface{}{
"NpcId": int(req.NpcId),
})
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+oneday, nil)
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING_Get, "", GoUtil.Now()+oneday, 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,
NpcId: req.NpcId,
})
return nil
}
func ReqChargeReceive(player *Player, buf []byte) error {
req := &msg.ReqChargeReceive{}
err := proto.Unmarshal(buf, req)
@ -5205,6 +4853,7 @@ func ReqSendWishBeg(player *Player, buf []byte) error {
return nil
}
// TODO 心愿单功能 待开发
func ReqWishApplyList(player *Player, buf []byte) error {
req := &msg.ReqWishApplyList{}
err := proto.Unmarshal(buf, req)
@ -5215,7 +4864,7 @@ func ReqWishApplyList(player *Player, buf []byte) error {
List := FriendMod.GetWishApply()
rs := make([]*msg.ResFriendApplyInfo, 0)
for _, v := range List {
PD := G_GameLogicPtr.GetResSimplePlayerByUid(int(v.Uid))
PD := G_GameLogicPtr.GetResSimplePlayerByUid(0)
if PD == nil {
continue
}
@ -5330,51 +4979,6 @@ func ReqId2Verify(player *Player, buf []byte) error {
return nil
}
func ReqFriendByCode(player *Player, buf []byte) error {
req := &msg.ReqFriendByCode{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
if req.Code == "" {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "code is empty",
})
return fmt.Errorf("code is empty")
}
CodeNum := GoUtil.ParseUniqueStringToInt(req.Code)
if CodeNum <= 0 {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "code is invalid",
})
return fmt.Errorf("code is invalid")
}
Uid := int64(CodeNum) + int64(100000) + int64(conf.Server.AppID*100000000)
if Uid == player.M_DwUin {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "can not add yourself",
})
return fmt.Errorf("can not add yourself")
}
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(int(Uid))
if PlayerSimpleData == nil {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "player not exist",
})
return fmt.Errorf("player not exist")
}
player.PushClientRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_SUCCESS,
Player: PlayerSimpleData,
})
return nil
}
func ReqPlayroomGameShowReward(player *Player, buf []byte) error {
req := &msg.ReqPlayroomGameShowReward{}
err := proto.Unmarshal(buf, req)
@ -5777,104 +5381,6 @@ func ReqActPassReward(player *Player, buf []byte) error {
return nil
}
func ReqFriendReplyHandle(player *Player, buf []byte) error {
req := &msg.ReqFriendReplyHandle{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
ReplyInfo := FriendMod.ReplyFriend(int(req.LogId))
if ReplyInfo == nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: "reply info not exist",
})
return fmt.Errorf("reply info not exist")
}
ErrType := msg.FRIEND_REPLY_HANDLE_ERR_TYPE_NONE
now := GoUtil.Now()
if req.Type == 1 && ReplyInfo.Uid > 10000 {
switch ReplyInfo.Type {
case friend.REPLY_TYPE_GREETING:
ReplyData := friend.ReplyInfo{
Uid: int(player.M_DwUin),
Type: friend.REPLY_TYPE_GREETING_Get,
Param: req.Param,
}
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(ReplyInfo.Uid),
Type: MsqMod.HANDLE_TYPE_FRIEND_GREETING_REPLY,
SendT: now,
End: now + sevendays,
Extra: ReplyData,
})
case friend.REPLY_TYPE_CATNIP: // 猫草大作战同意邀请
GameId := GoUtil.Int(ReplyInfo.Param)
activityInfo := player.GetActivityInfo(player.GetActivityId(activity.ACT_TYPE_CATNIP))
if activityInfo == nil {
break
}
err := player.SetCatnipPartner(GameId, ReplyInfo.Uid, activityInfo.EndT)
if err == nil {
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
UserList, _ := CatnipMod.Agree(GameId, ReplyInfo.Uid)
player.TeLog("catnip_agree", map[string]interface{}{
"Id": int(GameId),
})
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(ReplyInfo.Uid),
Type: MsqMod.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(GameId),
},
SendT: now,
End: now + sevendays,
})
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(GameId),
},
SendT: now,
End: now + sevendays,
})
}
player.CatnipBackData()
} else {
ErrType = msg.FRIEND_REPLY_HANDLE_ERR_TYPE_CATNIP
}
}
}
Items := baseCfg.GetFriendReplyReward()
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_FriendReplyHandle.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.FriendLogBackData()
player.PushClientRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_SUCCESS,
LogId: req.LogId,
Type: req.Type,
ErrType: ErrType,
})
return nil
}
func ReqGetChessRetireReward(player *Player, buf []byte) error {
req := &msg.ReqGetChessRetireReward{}
err := proto.Unmarshal(buf, req)

View File

@ -0,0 +1,579 @@
package game
import (
"fmt"
"server/conf"
baseCfg "server/conf/base"
friendCfg "server/conf/friend"
"server/db"
"server/game/mod/activity"
"server/game/mod/friend"
MsqMod "server/game/mod/msg"
GoUtil "server/game_util"
"server/msg"
"strconv"
"google.golang.org/protobuf/proto"
)
func ReqFriendRecommend(player *Player, buf []byte) error {
FriendMod := player.PlayMod.getFriendMod()
RecommendList := make([]*msg.ResPlayerSimple, 0)
FriendNum := FriendMod.GetFriendNum()
err := FriendMod.AddDailyRecommend()
if err != nil {
player.SendErrClienRes(&msg.ResFriendRecommend{})
return err
}
var n int
if FriendNum < 10 {
n = 3
} else {
Active := 0
for k := range FriendMod.GetFriendList() {
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(k)
if PlayerSimpleData == nil {
continue
}
if PlayerSimpleData.Login > GoUtil.Now()-86400 {
Active++
}
}
n = max(0, 3-(Active/10))
}
PlayerList := GetRecommendPlayer(player, n)
for _, v := range PlayerList {
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(v)
RecommendList = append(RecommendList, PlayerSimpleData)
}
player.PushClientRes(&msg.ResFriendRecommend{
List: RecommendList,
})
player.PlayMod.save()
return nil
}
// 搜索用户
func ReqSearchPlayer(player *Player, buf []byte) error {
req := &msg.ReqSearchPlayer{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid, err := strconv.Atoi(req.Uid)
list := make([]*msg.ResPlayerSimple, 0)
if err == nil {
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(Uid)
if SearchPlayer != nil && SearchPlayer.Level != 0 {
list = append(list, SearchPlayer)
}
}
data, err := db.SearchPlayer(req.Uid)
if err != nil {
player.SendErrClienRes(&msg.ResSearchPlayer{
Code: 0,
})
}
for _, v := range data {
if player.M_DwUin == v.DwUin {
continue
}
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(int(v.DwUin))
list = append(list, SearchPlayer)
}
// list 列表去重
l := make(map[int]*msg.ResPlayerSimple)
for _, v := range list {
if _, ok := l[int(v.Uid)]; !ok {
l[int(v.Uid)] = v
}
}
l2 := make([]*msg.ResPlayerSimple, 0)
for _, v := range l {
l2 = append(l2, v)
}
player.PushClientRes(&msg.ResSearchPlayer{
List: l2,
})
return nil
}
// 申请好友
func ReqApplyFriend(player *Player, buf []byte) error {
req := &msg.ReqApplyFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
if Uid == int(player.M_DwUin) {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "cannot apply yourself",
})
return fmt.Errorf("cannot apply yourself")
}
if FriendMod.CheckFriend(Uid) {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "already friend",
})
return fmt.Errorf("already friend")
}
// 好友人数到达上限2000人玩家将无法再发送好友申请
if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: "friend list full",
})
return fmt.Errorf("friend list full")
}
// 对于任何玩家而言向自己在24小时内已从任意途径发送过好友申请的玩家再次发送好友申请时该次申请不会被发出
sendApplyTime := FriendMod.GetSendApplyTime(Uid)
if sendApplyTime != 0 && GoUtil.Now()-sendApplyTime < oneday {
player.PushClientRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Uid: req.Uid,
Msg: "already applied",
})
return fmt.Errorf("already applied")
}
FriendMod.AddSendApply(Uid)
now := GoUtil.Now()
if req.Type == 1 {
Items, err := FriendMod.GetSponsorReward()
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
BaseMod := player.PlayMod.getBaseMod()
BaseMod.GetEnergyByAD()
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_ApplyFriendSponsor.String())
if err != nil {
player.SendErrClienRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.AddLog(int(req.Uid), friend.LOG_TYPE_FRIEND_SPONSOR, "", now)
FriendMgrSend(&MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_FRIEND_SPONSOER,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + sevendays,
})
player.PushClientRes(BaseMod.BackData())
player.TeLog("friend_invite_reward", map[string]interface{}{
"item_list": Items,
})
}
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_APPLY,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + sevendays,
Extra: map[string]interface{}{
"type": req.Type,
},
}
FriendMgrSend(m)
player.PushClientRes(&msg.ResApplyFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
return nil
}
// 同意申请
func ReqAgreeFriend(player *Player, buf []byte) error {
req := &msg.ReqAgreeFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
if !FriendMod.CheckApply(Uid) {
player.SendErrClienRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_FAIL,
Msg: "apply uid not exist",
})
return fmt.Errorf("apply uid not exist")
}
// 好友人数到达上限2000人玩家将无法再同意好友申请
if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() {
player.SendErrClienRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_FAIL,
Msg: "friend list full",
})
return fmt.Errorf("friend list full")
}
// 新好友才可以打招呼
if !FriendMod.CheckGreeting(Uid) {
FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+oneday, nil)
}
FriendMod.AddFriend(Uid)
player.PushClientRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
Player: G_GameLogicPtr.GetResSimplePlayerByUid(int(req.Uid)),
})
player.TeLog("friend_add", map[string]interface{}{
"player_id": Uid,
"add_type": "接受申请",
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now())
m := &MsqMod.Msg{
Type: MsqMod.HADNLE_TYPE_AGREE,
From: int(player.M_DwUin),
To: Uid,
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
player.FriendApplyBackData()
player.FriendLogBackData()
player.PlayMod.save()
return nil
}
// 删除好友
func ReqDelFriend(player *Player, buf []byte) error {
req := &msg.ReqDelFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_DEL,
From: int(player.M_DwUin),
To: Uid,
SendT: GoUtil.Now(),
}
FriendMgrSend(m)
FriendMod := player.PlayMod.getFriendMod()
FriendMod.DelFriend(Uid)
player.PlayMod.save()
player.PushClientRes(&msg.ResDelFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_DELETE, "", GoUtil.Now())
player.FriendListBackData()
player.TeLog("friend_delete", map[string]interface{}{
"player_id": Uid,
})
return nil
}
// 拒绝申请
func ReqRefuseFriend(player *Player, buf []byte) error {
req := &msg.ReqRefuseFriend{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
Uid := int(req.Uid)
FriendMod := player.PlayMod.getFriendMod()
FriendMod.RefuseApply(Uid)
player.PlayMod.save()
player.PushClientRes(&msg.ResRefuseFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
now := GoUtil.Now()
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_REFUSE,
From: int(player.M_DwUin),
To: Uid,
SendT: now,
End: now + 86400*7,
}
FriendMgrSend(m)
player.FriendApplyBackData()
return nil
}
func ReqFriendList(player *Player, buf []byte) error {
player.FriendListBackData()
return nil
}
func ReqFriendApply(player *Player, buf []byte) error {
player.FriendApplyBackData()
return nil
}
func ReqFriendCardMsg(player *Player, buf []byte) error {
player.FriendCardBackData()
return nil
}
func ReqFriendTimeLine(player *Player, buf []byte) error {
player.FriendLogBackData()
return nil
}
func ReqFriendTLUpvote(player *Player, buf []byte) error {
req := &msg.ReqFriendTLUpvote{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
Items, FUid, err := FriendMod.Upvote(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_TLUpvote.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
now := GoUtil.Now()
// 添加时间线
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_HANDBOOK_UPVOTE,
From: int(player.M_DwUin),
To: int(FUid),
SendT: now,
End: now + sevendays,
}
FriendMod.AddActLog(friend.ACT_LOG_TYPE_VISIT_UPVOTE, "")
player.UpdateUserInfo()
FriendMgrSend(m)
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTLUpvote{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
player.TeLog("friend_upvote", map[string]interface{}{
"player_id": int(req.Id),
})
return nil
}
func ReqFriendTReward(player *Player, buf []byte) error {
req := &msg.ReqFriendTReward{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
Items, err := FriendMod.GetReward(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_FriendTReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTReward{
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
return nil
}
func ReqFriendReplyHandle(player *Player, buf []byte) error {
req := &msg.ReqFriendReplyHandle{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
ReplyInfo := FriendMod.ReplyFriend(int(req.LogId))
if ReplyInfo == nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: "reply info not exist",
})
return fmt.Errorf("reply info not exist")
}
ErrType := msg.FRIEND_REPLY_HANDLE_ERR_TYPE_NONE
now := GoUtil.Now()
if req.Type == 1 && ReplyInfo.Uid > 10000 {
switch ReplyInfo.Type {
case friend.REPLY_TYPE_GREETING:
ReplyData := friend.ReplyInfo{
Uid: int(player.M_DwUin),
Type: friend.REPLY_TYPE_GREETING_Get,
Param: req.Param,
}
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(ReplyInfo.Uid),
Type: MsqMod.HANDLE_TYPE_FRIEND_GREETING_REPLY,
SendT: now,
End: now + sevendays,
Extra: ReplyData,
})
FriendMod.GreetingFriend(int(ReplyInfo.Uid))
case friend.REPLY_TYPE_CATNIP: // 猫草大作战同意邀请
GameId := GoUtil.Int(ReplyInfo.Param)
activityInfo := player.GetActivityInfo(player.GetActivityId(activity.ACT_TYPE_CATNIP))
if activityInfo == nil {
break
}
err := player.SetCatnipPartner(GameId, ReplyInfo.Uid, activityInfo.EndT)
if err == nil {
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := player.GetActivityId(activity.ACT_TYPE_CATNIP)
UserList, _ := CatnipMod.Agree(GameId, ReplyInfo.Uid)
player.TeLog("catnip_agree", map[string]interface{}{
"Id": int(GameId),
})
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(ReplyInfo.Uid),
Type: MsqMod.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(GameId),
},
SendT: now,
End: now + sevendays,
})
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(GameId),
},
SendT: now,
End: now + sevendays,
})
}
player.CatnipBackData()
} else {
ErrType = msg.FRIEND_REPLY_HANDLE_ERR_TYPE_CATNIP
}
}
}
Items := baseCfg.GetFriendReplyReward()
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_FriendReplyHandle.String())
if err != nil {
player.SendErrClienRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.FriendLogBackData()
player.PushClientRes(&msg.ResFriendReplyHandle{
Code: msg.RES_CODE_SUCCESS,
LogId: req.LogId,
Type: req.Type,
ErrType: ErrType,
})
return nil
}
func ReqFriendByCode(player *Player, buf []byte) error {
req := &msg.ReqFriendByCode{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
if req.Code == "" {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "code is empty",
})
return fmt.Errorf("code is empty")
}
CodeNum := GoUtil.ParseUniqueStringToInt(req.Code)
if CodeNum <= 0 {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "code is invalid",
})
return fmt.Errorf("code is invalid")
}
Uid := int64(CodeNum) + int64(100000) + int64(conf.Server.AppID*100000000)
if Uid == player.M_DwUin {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "can not add yourself",
})
return fmt.Errorf("can not add yourself")
}
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(int(Uid))
if PlayerSimpleData == nil {
player.SendErrClienRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_FAIL,
Msg: "player not exist",
})
return fmt.Errorf("player not exist")
}
player.PushClientRes(&msg.ResFriendByCode{
Code: msg.RES_CODE_SUCCESS,
Player: PlayerSimpleData,
})
return nil
}
func ReqAddNpc(player *Player, buf []byte) error {
req := &msg.ReqAddNpc{}
err := proto.Unmarshal(buf, req)
if err != nil {
return err
}
FriendMod := player.PlayMod.getFriendMod()
err = FriendMod.SetNpc(int(req.NpcId))
if err != nil {
player.SendErrClienRes(&msg.ResAddNpc{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
if len(FriendMod.Npc) == 1 { // 首次添加NPC 视为邀请好友成功
InviteMod := player.PlayMod.getInviteMod()
InviteMod.AddInvite(int(req.NpcId))
}
player.PlayMod.save()
player.FriendListBackData()
player.TeLog("add_npc", map[string]interface{}{
"NpcId": int(req.NpcId),
})
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+oneday, nil)
FriendMod.AddReplyInfo(int(req.NpcId), friend.REPLY_TYPE_GREETING_Get, "", GoUtil.Now()+oneday, 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,
NpcId: req.NpcId,
})
return nil
}

View File

@ -0,0 +1,52 @@
package game
import (
"server/msg"
"google.golang.org/protobuf/proto"
)
func ReqPetFur(player *Player, buf []byte) error {
FurMod := player.GetFurMod()
player.PushClientRes(FurMod.BackData())
return nil
}
func ReqPetFurBuy(player *Player, buf []byte) error {
var req msg.ReqPetFurBuy
err := proto.Unmarshal(buf, &req)
if err != nil {
return err
}
FurMod := player.GetFurMod()
costList, AddItem := FurMod.GetFurBuyCost(int(req.FurId))
// 扣除物品
err = player.HandleLoseItem(costList, msg.ITEM_POP_LABEL_PetFurShop.String())
if err != nil {
return err
}
// 增加物品
err = player.HandleItem(AddItem, msg.ITEM_POP_LABEL_PetFurShop.String())
if err != nil {
return err
}
player.PlayMod.save()
return nil
}
func ReqFurSet(player *Player, buf []byte) error {
var req msg.ReqFurSet
err := proto.Unmarshal(buf, &req)
if err != nil {
return err
}
FurMod := player.GetFurMod()
err = FurMod.SetFur(int(req.FurId))
if err != nil {
return err
}
player.UpdateUserInfo()
player.PlayMod.save()
player.PushClientRes(FurMod.BackData())
return nil
}

View File

@ -142,6 +142,7 @@ func (player *Player) TriggerShippingOrderOrigin(req *msg.ReqShippingOrder) {
ProduceName := chargeCfg.GetProduceName(OrderData.ProductId)
GoUtil.SendFeishuOrder(int(player.M_DwUin), OrderData.PayChannelOrderId, OrderData.Price, ProduceName, OrderData.PayTime, GoUtil.Now(), ChargeMod.Charge)
}
BaseMod := player.PlayMod.getBaseMod()
orderDataMap := map[string]interface{}{
"AppId": conf.Server.AppID,
"ServerId": conf.Server.ServerID,
@ -153,6 +154,9 @@ func (player *Player) TriggerShippingOrderOrigin(req *msg.ReqShippingOrder) {
"Token": req.Token,
"Price": OrderData.Price,
"PayType": OrderData.PayType,
"Level": BaseMod.GetLevel(),
"Energy": BaseMod.GetEnergy(),
"Star": BaseMod.GetStar(),
}
player.TeLog("pay", orderDataMap)
player.PushClientRes(&msg.ResShippingOrder{

View File

@ -210,6 +210,29 @@ func Int(a interface{}) int {
return 0
}
func Int32(a interface{}) int32 {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return int32(v)
case int32:
return int32(v)
case int64:
return int32(v)
case float64:
return int32(v)
case string:
r, err := strconv.Atoi(v)
if err != nil {
return 0
}
return int32(r)
}
return 0
}
func String(a interface{}) string {
if a == nil {
return ""
@ -564,7 +587,9 @@ const (
)
func NotifyPlayer(uid, pushid int, title, content string) {
if uid == 0 {
return
}
url := "https://tygapi-new.tuyooglobal.com/api/push/ga/push_message/project_trigger"
method := "POST"
executeId := fmt.Sprintf("%s_%s", PROJECT_ID, Rand8DigitNumber()+Rand8DigitNumber())
@ -623,3 +648,13 @@ func NotifyPlayer(uid, pushid int, title, content string) {
}
log.Debug("notification send uid %d, type %d , res %s", uid, pushid, string(body))
}
func ElemNumber(list []int, ele int) int {
count := 0
for _, v := range list {
if v == ele {
count++
}
}
return count
}

View File

@ -64,11 +64,11 @@ func SendFeishuOrder(PlayerId int, OrderId string, Price float64, ProductName st
payload := map[string]interface{}{
"UID": PlayerId,
"OrderId": OrderId,
"Product": String(Price),
"Product": fmt.Sprintf("%.2f", Price),
"ProductName": ProductName,
"EventRecovery": time.Unix(PayTime, 0).Format("2006-01-02 15:04:05"),
"EventAge": time.Unix(VerityTime, 0).Format("2006-01-02 15:04:05"),
"TotalCharge": String(Charge),
"TotalCharge": fmt.Sprintf("%.2f", Charge),
}
payloadBytes, err := json.Marshal(payload)

View File

@ -174,3 +174,7 @@ func IsFirstDayOfMonth() bool {
now := time.Now()
return now.Day() == 1
}
func NowMonth() int {
return int(time.Now().Month())
}

View File

@ -1 +0,0 @@
11

Binary file not shown.

View File

@ -46,7 +46,10 @@ require (
gopkg.in/ini.v1 v1.67.0 // indirect
)
require golang.org/x/sys v0.29.0 // indirect
require (
github.com/apache/thrift v0.22.0 // indirect
golang.org/x/sys v0.29.0 // indirect
)
require (
filippo.io/edwards25519 v1.1.0 // indirect

View File

@ -73,6 +73,8 @@ github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmP
github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
github.com/aliyun/credentials-go v1.4.6 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk=
github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc=
github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=

33
src/server/test/README.MD Normal file
View File

@ -0,0 +1,33 @@
# 单元调试
## 好友模块
### 随机好友推荐
```golang
test function TestFriendRecommendList 2026-03-04
ok server/test 1.033s
```
### 好友离线消息聚合
```golang
3625212 | 100001
3714321 | 100002
```
### 好友申请
```golang
test function TestReqApplyFriend 2026-03-05
ok server/test 0.479s
```
## 充值模块
### 观看广告记录
```golang
test function TestWatchAd 2026-03-04
ok server/test 0.410s
```

View File

@ -0,0 +1,49 @@
package test
import (
"fmt"
champshipCfg "server/conf/champship"
"server/game"
"testing"
)
func TestChampshipReward(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
ChampshipMod := p1.GetChampshipMod()
ChampshipMod.Score = 1000
game.ReqChampshipReward(p1, nil)
}
func TestChampshipRankReward(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
ChampshipMod := p1.GetChampshipMod()
ChampshipMod.RankReward = false
_, yesterdayActivityId := p1.GetChampshipActivityId()
ChampshipMod.GetRankReward(1, yesterdayActivityId)
}
func TestGetChampshipActivityId(t *testing.T) {
res := champshipCfg.GetChampshipActivityId()
t.Logf("res:%v", res)
}
func TestReqChampshipReward(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
ChampshipMod := p1.GetChampshipMod()
ChampshipMod.Score = 1000
game.ReqChampshipReward(p1, nil)
}
func TestChampionshipCreateRobot(t *testing.T) {
RobotNum := 30
i := 5
j := 1
RobotList := game.CreateRobotList(i, RobotNum, j)
for i := 0; i < RobotNum; i++ {
game.FormatRobotInfo(RobotList[i], i+1)
}
fmt.Print("success")
}

View File

@ -1,6 +1,7 @@
package test
import (
"fmt"
"server/game"
"testing"
)
@ -11,3 +12,17 @@ func TestSpecialCharge(t *testing.T) {
ChargeMod := p1.GetChargeMod()
ChargeMod.ZeroUpdate(nil)
}
func TestWatchAd(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
ChargeMod := p1.GetChargeMod()
ChargeMod.AddAdWatch()
count := ChargeMod.GetAdWatch()
fmt.Println("观看广告次数:", count)
ChargeMod.ZeroUpdate(nil)
fmt.Println("观看广告次数重置后:", ChargeMod.GetAdWatch())
ChargeMod.AddAdWatch()
count = ChargeMod.GetAdWatch()
fmt.Println("观看广告次数:", count)
}

View File

@ -0,0 +1,23 @@
package test
import (
"fmt"
"server/game"
"server/game/mod/order"
"testing"
)
func TestGetStarEmitList(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
ChessMod := p1.GetChessMod()
EM := ChessMod.GetStarEmitList()
OrderMod := p1.GetOrderMod()
OrderMod.OrderList = map[int]order.Order{
1: {
MergeId: []int{15, 15},
},
}
p1.InitOrderItem()
fmt.Printf("%v\n", EM)
}

View File

@ -0,0 +1,39 @@
package test
import (
"fmt"
dailyTaskCfg "server/conf/daily_task"
"server/game"
"testing"
)
func TestDailyActiviyId(t *testing.T) {
player := new(game.Player)
player.InitPlayerByUid(100001)
ids := player.GetDailyTaskActivityId()
if ids == 0 {
t.Errorf("GetDailyTaskActivityId failed, ids is empty")
}
}
func TestDailyZeroUpdate(t *testing.T) {
player := new(game.Player)
player.InitPlayerByUid(100001)
DailyTaskMod := player.GetDailyTaskMod()
BaseMod := player.GetBaseMod()
DecorateMod := player.GetDecorateMod()
DailyTaskMod.ZeroUpdate(BaseMod.Level, DecorateMod.GetAreaId(), player.GetDailyTaskActivityId())
DailyTaskMod.BackData()
}
func TestDailyTaskRewardScore(t *testing.T) {
score1 := dailyTaskCfg.GetDailyTaskScore(1, 1)
if score1 == 0 {
t.Errorf("GetDailyTaskScore failed, score1 is 0")
}
score2 := dailyTaskCfg.GetDailyTaskScore(1, 0)
if score2 == 0 {
t.Errorf("GetDailyTaskScore failed, score2 is 0")
}
fmt.Printf("score1: %d, score2: %d\n", score1, score2)
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,56 @@
package test
import (
"fmt"
"server/game"
"server/msg"
"testing"
"google.golang.org/protobuf/proto"
)
func TestFriendInit(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
FriendMod := p1.GetFriendMod()
if FriendMod == nil {
t.Error("FriendMod init failed")
}
}
func TestFriendApply(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
FriendMod := p1.GetFriendMod()
FriendMod.AddFriendApply(100002, 0, 1698000000)
if !FriendMod.CheckApply(100002) {
t.Error("FriendMod AddFriendApply failed")
}
}
func TestFriendRecommendList(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
l1 := game.GetRecommendPlayer(p1, 3)
fmt.Printf("Recommend List: %v\n", l1)
}
func TestReqApplyFriend(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
req := &msg.ReqApplyFriend{
Uid: 100002,
Type: 0,
}
buf, _ := proto.Marshal(req)
game.ReqApplyFriend(p1, buf)
p1.FriendListBackData()
}
func TestFriendBackData(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayerByUid(100001)
p1.M_DwUin = 100100129
p1.FriendLogBackData()
p1.FriendCardBackData()
}

View File

@ -0,0 +1,92 @@
package test
import (
"fmt"
fur_cfg "server/conf/fur"
"server/game"
"server/msg"
"testing"
"google.golang.org/protobuf/proto"
)
func TestGetFurShopCost(t *testing.T) {
cost := fur_cfg.GetFurShopCost(1)
fmt.Printf("cost: %v", cost)
}
func TestGetFurShopFreeTimes(t *testing.T) {
freeTimes := fur_cfg.GetFurShopFreeTimes()
fmt.Printf("freeTimes: %d", freeTimes)
}
func TestGetFurShopTag(t *testing.T) {
tag := fur_cfg.GetFurShopTag(1)
fmt.Printf("tag: %d", tag)
}
func TestReqPetFur(t *testing.T) {
player := new(game.Player)
err := game.ReqPetFur(player, nil)
if err != nil {
t.Errorf("ReqPetFur error: %v", err)
}
}
func TestReqPetFurBuy(t *testing.T) {
player := new(game.Player)
player.InitPlayerByUid(100001)
m := msg.ReqPetFurBuy{
FurId: 1,
}
buf, err := proto.Marshal(&m)
if err != nil {
t.Errorf("marshal error: %v", err)
}
err = game.ReqPetFurBuy(player, buf)
if err != nil {
t.Errorf("ReqPetFurBuy error: %v", err)
}
m = msg.ReqPetFurBuy{
FurId: 2,
}
buf, err = proto.Marshal(&m)
if err != nil {
t.Errorf("marshal error: %v", err)
}
err = game.ReqPetFurBuy(player, buf)
if err != nil {
t.Errorf("ReqPetFurBuy error: %v", err)
}
}
func TestReqFurSet(t *testing.T) {
player := new(game.Player)
player.InitPlayerByUid(100001)
m := msg.ReqFurSet{
FurId: 1,
}
buf, err := proto.Marshal(&m)
if err != nil {
t.Errorf("marshal error: %v", err)
}
FurMod := player.GetFurMod()
FurMod.AddFurInfo(1, 0, 0)
err = game.ReqFurSet(player, buf)
if err != nil {
t.Errorf("ReqFurSet error: %v", err)
}
m = msg.ReqFurSet{
FurId: 0,
}
buf, err = proto.Marshal(&m)
if err != nil {
t.Errorf("marshal error: %v", err)
}
err = game.ReqFurSet(player, buf)
if err != nil {
t.Errorf("ReqFurSet error: %v", err)
}
}

View File

@ -28,3 +28,17 @@ func TestFast(t *testing.T) {
}
t.Logf("Fast produce items: %v", items)
}
func TestSenceDash(t *testing.T) {
p := new(game.Player)
p.InitPlayer("3625212")
LimitEventMod := p.GetLimitEventMod()
LimitEventMod.AddEvent(limitedTimeEvent.EVENT_TYPE_SENCE_DASH, 60)
LimitEventMod.AddSenceDashTimes() // 模拟一次场景冲刺
Id, items, err := LimitEventMod.GetSceneDashReward()
if err != nil {
t.Errorf("GetSceneDashReward error: %v", err)
return
}
t.Logf("Scene dash reward: Id=%d, items=%v", Id, items)
}

View File

@ -0,0 +1,2 @@
2026/03/05 00:00:00 [debug ] CreateDailyLogFile
2026/03/05 00:00:00 [debug ] Server ZeroFlush

View File

@ -0,0 +1,26 @@
package test
import (
miningCfg "server/conf/mining"
"server/game"
"testing"
)
func TestGetPassReward(t *testing.T) {
player := new(game.Player)
player.InitPlayerByUid(100001)
MiningMod := player.GetMiningMod()
DecorateMod := player.GetDecorateMod()
needStar := DecorateMod.GetNextNeedStar()
Items := miningCfg.GetPassItem(3, needStar)
if len(Items) == 0 {
t.Errorf("GetPassReward failed, pass: %d, needStar: %d", MiningMod.Pass, needStar)
}
player.MiningBackData()
}
func TestInitActivityItem(t *testing.T) {
player := new(game.Player)
player.GetBaseMod().Level = 15
player.Login()
}

View File

@ -40,3 +40,15 @@ func TestChestRain(t *testing.T) {
f := LimitEventMod.GetMeteorReward([]int{226}, ChessMod.GetStarEmitList())
fmt.Printf("chest rain reward:%v", f)
}
func TestInitOrderItem(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
OrderMod := p1.GetOrderMod()
OrderMod.OrderList = make(map[int]order.Order)
OrderMod.OrderList[1] = order.Order{
MergeId: []int{15, 15},
}
p1.InitOrderItem()
fmt.Printf("order item:%v", OrderMod.OrderList[1].Items)
}

View File

@ -0,0 +1,16 @@
package test
import (
"fmt"
"server/game"
"testing"
)
func TestPlayroomFlipGame(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayerByUid(100001)
DecorateMod := p1.GetDecorateMod()
needStar := DecorateMod.GetAreaCost()
highReward := int(float64(needStar) * 0.75)
fmt.Printf("needStar: %d, highReward: %d\n", needStar, highReward)
}

View File

@ -0,0 +1,23 @@
package test
import (
sevenLoginCfg "server/conf/seven_login"
"server/game"
GoUtil "server/game_util"
"testing"
)
func TestGetSevenLoginMonthReward(t *testing.T) {
month := GoUtil.NowMonth()
res := sevenLoginCfg.GetSevenLoginMonthReward(month)
t.Logf("res:%v", res)
}
func TestSevenLoginZeroUpdate(t *testing.T) {
p1 := new(game.Player)
p1.InitPlayer("3625212")
SevenLoginMod := p1.GetSevenLoginMod()
SevenLoginMod.ZeroUpdate(0, 0)
SevenLoginMod.BackData()
t.Logf("SevenLoginMod:%v", SevenLoginMod)
}