Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-07-23 11:52:58 +08:00
commit abe849d68c
24 changed files with 2079 additions and 393 deletions

View File

@ -298,6 +298,10 @@ func GetUserKey(Uid int64) string {
return fmt.Sprintf("user_data_%d", Uid) return fmt.Sprintf("user_data_%d", Uid)
} }
func GetCatnipLockKey(Uid, GameId int) string {
return fmt.Sprintf("catnip_lock_%d_%d", Uid, GameId)
}
func Rand6DigitNumber() string { func Rand6DigitNumber() string {
n := rand.Intn(1000000) n := rand.Intn(1000000)
return fmt.Sprintf("%06d", n) return fmt.Sprintf("%06d", n)

View File

@ -2,6 +2,7 @@ package GoUtil
import ( import (
"fmt" "fmt"
"server/game/mod/item"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
@ -52,6 +53,15 @@ func RandSlice(slice []int) int {
return slice[Id] return slice[Id]
} }
func RandItem(slice []*item.Item) *item.Item {
slen := len(slice)
if slen == 0 {
return nil
}
Id := GetRand().Intn(slen)
return slice[Id]
}
func RandSliceNum(s []int, num int) []int { func RandSliceNum(s []int, num int) []int {
slice := make([]int, len(s)) slice := make([]int, len(s))
copy(slice, s) copy(slice, s)

View File

@ -0,0 +1,25 @@
package catnipCfg
import "server/gamedata"
const (
CATNIP_TEMPLATE_CFG_NAME = "CatnipTemplate"
CATNIP_JACKPOT_CFG_NAME = "CatnipJackpot"
CATNIP_MULTIPLIER_CFG_NAME = "CatnipMultiplier"
CATNIP_GAME_CFG_NAME = "CatnipGame"
)
func init() {
gamedata.InitCfg(CATNIP_TEMPLATE_CFG_NAME)
gamedata.InitCfg(CATNIP_JACKPOT_CFG_NAME)
gamedata.InitCfg(CATNIP_MULTIPLIER_CFG_NAME)
gamedata.InitCfg(CATNIP_GAME_CFG_NAME)
}
func GetGameNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "PassNum")
}

View File

@ -477,6 +477,8 @@ type SqlServerMailStruct struct {
Id int `db:"mail_id"` Id int `db:"mail_id"`
Title string `db:"title"` Title string `db:"title"`
Content string `db:"content"` Content string `db:"content"`
SubTitle string `db:"subTitle"`
SubTitleEn string `db:"subTitle_en"`
TitleEn string `db:"title_en"` TitleEn string `db:"title_en"`
ContentEn string `db:"content_en"` ContentEn string `db:"content_en"`
Items string `db:"items"` Items string `db:"items"`

View File

@ -8,6 +8,7 @@ import (
mailCfg "server/conf/mail" mailCfg "server/conf/mail"
miningCfg "server/conf/mining" miningCfg "server/conf/mining"
raceCfg "server/conf/race" raceCfg "server/conf/race"
"server/game/mod/activity"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/mail" "server/game/mod/mail"
"server/msg" "server/msg"
@ -17,7 +18,7 @@ import (
func ActivityLogin(p *Player) { func ActivityLogin(p *Player) {
ItemMod := p.PlayMod.getItemMod() ItemMod := p.PlayMod.getItemMod()
// 挖矿 // 挖矿
ActivityId := GetActivityId(p, ACT_TYPE_MINING) ActivityId := GetActivityId(p, activity.ACT_TYPE_MINING)
MiningMod := p.PlayMod.getMiningMod() MiningMod := p.PlayMod.getMiningMod()
OldId := MiningMod.Login(ActivityId) OldId := MiningMod.Login(ActivityId)
if OldId != 0 { if OldId != 0 {
@ -29,7 +30,7 @@ func ActivityLogin(p *Player) {
} }
} }
// 猜颜色 // 猜颜色
ActivityId = GetActivityId(p, ACT_TYPE_GUESS_COLOR) ActivityId = GetActivityId(p, activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod := p.PlayMod.getGuessColorMod() GuessColorMod := p.PlayMod.getGuessColorMod()
OldId = GuessColorMod.Login(ActivityId) OldId = GuessColorMod.Login(ActivityId)
if OldId != 0 { if OldId != 0 {
@ -42,7 +43,7 @@ func ActivityLogin(p *Player) {
} }
// 赛跑 // 赛跑
ActivityId = GetActivityId(p, ACT_TYPE_RACE) ActivityId = GetActivityId(p, activity.ACT_TYPE_RACE)
RaceMod := p.PlayMod.getRaceMod() RaceMod := p.PlayMod.getRaceMod()
OldId = RaceMod.Login(ActivityId) OldId = RaceMod.Login(ActivityId)
if OldId != 0 { if OldId != 0 {
@ -66,17 +67,17 @@ func SendActivityMail(p *Player, ItemId, ItemNum, ActivityId int) {
// 活动模块 零点更新 // 活动模块 零点更新
func ActivityZeroUpdate(p *Player) { func ActivityZeroUpdate(p *Player) {
ActivityInfo := GetActivityInfo(p, ACT_TYPE_MINING) ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING)
if ActivityInfo != nil { if ActivityInfo != nil {
MiningMod := p.PlayMod.getMiningMod() MiningMod := p.PlayMod.getMiningMod()
MiningMod.ZeroUpdate(ActivityInfo.Id) MiningMod.ZeroUpdate(ActivityInfo.Id)
} }
ActivityInfo = GetActivityInfo(p, ACT_TYPE_GUESS_COLOR) ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_GUESS_COLOR)
if ActivityInfo != nil { if ActivityInfo != nil {
GuessColorMod := p.PlayMod.getGuessColorMod() GuessColorMod := p.PlayMod.getGuessColorMod()
GuessColorMod.ZeroUpdate(ActivityInfo.Id) GuessColorMod.ZeroUpdate(ActivityInfo.Id)
} }
ActivityInfo = GetActivityInfo(p, ACT_TYPE_RACE) ActivityInfo = GetActivityInfo(p, activity.ACT_TYPE_RACE)
if ActivityInfo != nil { if ActivityInfo != nil {
RaceMod := p.PlayMod.getRaceMod() RaceMod := p.PlayMod.getRaceMod()
RaceMod.ZeroUpdate(ActivityInfo.Id) RaceMod.ZeroUpdate(ActivityInfo.Id)
@ -126,11 +127,11 @@ func GetActivityStatus(p *Player, actType int) int {
} }
func MiningBackData(p *Player) { func MiningBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, ACT_TYPE_MINING) ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING)
if ActivityInfo == nil { if ActivityInfo == nil {
return return
} }
Status := GetActivityStatus(p, ACT_TYPE_MINING) Status := GetActivityStatus(p, activity.ACT_TYPE_MINING)
Template := miningCfg.GetTemplate(ActivityInfo.Id) Template := miningCfg.GetTemplate(ActivityInfo.Id)
MiningMod := p.PlayMod.getMiningMod() MiningMod := p.PlayMod.getMiningMod()
p.PushClientRes(&msg.ResMining{ p.PushClientRes(&msg.ResMining{
@ -146,12 +147,12 @@ func MiningBackData(p *Player) {
} }
func GuessColorBackData(p *Player) { func GuessColorBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, ACT_TYPE_GUESS_COLOR) ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_GUESS_COLOR)
if ActivityInfo == nil { if ActivityInfo == nil {
return return
} }
Status := GetActivityStatus(p, ACT_TYPE_GUESS_COLOR) Status := GetActivityStatus(p, activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod := p.PlayMod.getGuessColorMod() GuessColorMod := p.PlayMod.getGuessColorMod()
MapList := make([]*msg.GuessColorInfo, 0) MapList := make([]*msg.GuessColorInfo, 0)
for _, v := range GuessColorMod.MapList { for _, v := range GuessColorMod.MapList {
@ -177,11 +178,11 @@ func GuessColorBackData(p *Player) {
} }
func RaceBackData(p *Player) { func RaceBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, ACT_TYPE_RACE) ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_RACE)
if ActivityInfo == nil { if ActivityInfo == nil {
return return
} }
Status := GetActivityStatus(p, ACT_TYPE_RACE) Status := GetActivityStatus(p, activity.ACT_TYPE_RACE)
RaceMod := p.PlayMod.getRaceMod() RaceMod := p.PlayMod.getRaceMod()
Opponent := make([]*msg.Raceopponent, 0) Opponent := make([]*msg.Raceopponent, 0)
for _, v := range RaceMod.Opponent { for _, v := range RaceMod.Opponent {
@ -229,13 +230,13 @@ func GetActivityItem(p *Player, ActType []int) []*item.Item {
continue continue
} }
switch v { switch v {
case ACT_TYPE_MINING: case activity.ACT_TYPE_MINING:
Item := miningCfg.GetLoseItem(ActivityInfo.Id) Item := miningCfg.GetLoseItem(ActivityInfo.Id)
Items = item.Merge(Items, Item) Items = item.Merge(Items, Item)
case ACT_TYPE_GUESS_COLOR: case activity.ACT_TYPE_GUESS_COLOR:
Item := guesscolorCfg.GetLoseItem(ActivityInfo.Id) Item := guesscolorCfg.GetLoseItem(ActivityInfo.Id)
Items = item.Merge(Items, Item) Items = item.Merge(Items, Item)
case ACT_TYPE_RACE: case activity.ACT_TYPE_RACE:
ItemId := raceCfg.GetCoin(ActivityInfo.Id) ItemId := raceCfg.GetCoin(ActivityInfo.Id)
Item := item.NewItem(ItemId, 1) Item := item.NewItem(ItemId, 1)
Items = append(Items, Item) Items = append(Items, Item)
@ -243,3 +244,42 @@ func GetActivityItem(p *Player, ActType []int) []*item.Item {
} }
return Items return Items
} }
func (p *Player) CatnipBackData() {
CatnipMod := p.PlayMod.getCatnipMod()
Status := GetActivityStatus(p, activity.ACT_TYPE_CATNIP)
if CatnipMod == nil {
return
}
GameList := make([]*msg.CatnipGame, 0)
for _, v := range CatnipMod.Game {
GameInfo := &msg.CatnipGame{
Id: int32(v.Id),
Progress: int32(v.Progress),
Status: int32(v.Status),
}
if v.Partner != 0 {
PlayerData := G_getGameLogic().GetResSimplePlayerByUid(v.Partner)
if PlayerData != nil {
GameInfo.Partner = PlayerData
}
}
GameList = append(GameList, GameInfo)
}
res := &msg.ResCatnip{
Id: int32(CatnipMod.Id),
Status: int32(Status),
GameList: GameList,
}
p.PushClientRes(res)
}
func (p *Player) SetCatnipGameLock(Uid int, GameId int) error {
ActivityInfo := GetActivityInfoById(p, activity.ACT_TYPE_CATNIP)
return G_GameLogicPtr.SetDataSync(int(p.M_DwUin), VAR_OP_CATNIP_LOCK, CatnipLock{
Uid: int(p.M_DwUin),
Partner: Uid,
GameId: GameId,
End: int(ActivityInfo.EndT), // 锁
})
}

View File

@ -75,11 +75,20 @@ func (f *FriendMgr) Init() {
f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_INVITE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_REFUSE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_GROWTH, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE_DEL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_KISS, f.sendToPlayerOnline) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_KISS, f.sendToPlayerOnline)
f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayerOnline) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_GET, f.GetVarUserData) f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_GET, f.GetVarUserData)
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData) f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData)
f.RegisterHandler(msg.HANDLE_TYPE_VAR_EXPIRE_SET, f.SetExpireVarData)
} }
func (f *FriendMgr) getData() *FirendData { func (f *FriendMgr) getData() *FirendData {
@ -161,6 +170,34 @@ func (f *FriendMgr) SetVarUserData(m *msg.Msg) (interface{}, error) {
}, nil }, nil
} }
func (f *FriendMgr) SetExpireVarData(m *msg.Msg) (interface{}, error) {
VarOp := m.Extra.(VarOpration)
switch VarOp.Type {
case VAR_OP_CATNIP_LOCK:
data := VarOp.Data.(CatnipLock)
MyKey := GoUtil.GetCatnipLockKey(data.Uid, data.GameId)
OtherKey := GoUtil.GetCatnipLockKey(data.Partner, data.GameId)
ExpireData := G_GameLogicPtr.VarMgr.GetExpireVar(OtherKey)
if _, ok := ExpireData.D.(*CatnipLock); ok {
return nil, fmt.Errorf("catnip lock already exists for %d in game %d", data.Uid, data.GameId)
}
G_GameLogicPtr.VarMgr.SetExpireVar(MyKey, &VarExpireData{
T: int64(data.End + 24*3600), // 设置过期时间
D: &data,
})
G_GameLogicPtr.VarMgr.SetExpireVar(OtherKey, &VarExpireData{
T: int64(data.End + 24*3600), // 设置过期时间
D: &CatnipLock{
Uid: data.Partner,
Partner: data.Uid,
GameId: data.GameId,
End: data.End,
},
})
}
return nil, nil
}
// 发送消息给玩家 // 发送消息给玩家
func sendToPlayer(m *msg.Msg) error { func sendToPlayer(m *msg.Msg) error {
p := G_GameLogicPtr.GetPlayer(int64(m.To)) p := G_GameLogicPtr.GetPlayer(int64(m.To))

View File

@ -288,6 +288,17 @@ func (ad *GameLogic) SetUserData(Uid int, Op int, Data interface{}) {
}) })
} }
func (ad *GameLogic) SetDataSync(Uid int, Op int, Data interface{}) error {
_, err := ad.FriendMgr.Call(&MsgMod.Msg{
From: Uid,
To: Uid,
Type: MsgMod.HANDLE_TYPE_VAR_EXPIRE_SET,
SendT: GoUtil.Now(),
Extra: VarOpration{Type: Op, Data: Data},
})
return err
}
func (ad *GameLogic) GetUserData(Uid int) *VarUserData { func (ad *GameLogic) GetUserData(Uid int) *VarUserData {
result, err := ad.FriendMgr.Call(&MsgMod.Msg{ result, err := ad.FriendMgr.Call(&MsgMod.Msg{
From: Uid, From: Uid,
@ -806,7 +817,15 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqRace", ReqRace) RegisterMsgProcessFunc("ReqRace", ReqRace)
RegisterMsgProcessFunc("ReqRaceReward", ReqRaceReward) RegisterMsgProcessFunc("ReqRaceReward", ReqRaceReward)
RegisterMsgProcessFunc("ReqRaceStart", ReqRaceStart) RegisterMsgProcessFunc("ReqRaceStart", ReqRaceStart)
// 猫草大作战
RegisterMsgProcessFunc("ReqCatnip", ReqCatnip) // 请求猫草大作战数据
RegisterMsgProcessFunc("ReqCatnipInvite", ReqCatnipInvite) // 猫草大作战邀请好友
RegisterMsgProcessFunc("ReqCatnipAgree", ReqCatnipAgree) // 同意邀请
RegisterMsgProcessFunc("ReqCatnipRefuse", ReqCatnipRefuse) // 拒绝邀请
RegisterMsgProcessFunc("ReqCatnipMultiply", ReqCatnipMultiply) // 猫草大作战倍数
RegisterMsgProcessFunc("ReqCatnipPlay", ReqCatnipPlay) // 猫草大作战游戏转盘
RegisterMsgProcessFunc("ReqCatnipReward", ReqCatnipReward) // 猫草大作战领取奖励
RegisterMsgProcessFunc("ReqCatnipGrandReward", ReqCatnipGrandReward) // 猫草大作战领取大奖
// #region playroom // #region playroom
RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据 RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据
RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息 RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息
@ -901,8 +920,8 @@ func NotifyPlayer(Uid int, m *MsgMod.Msg) {
p.Send(m) p.Send(m)
} }
func setRedisLock(key, value string, Duration time.Duration) bool { func setRedisLock(key string, Duration time.Duration) bool {
return db.RedisLock(key, "", Duration) return db.RedisLock(key, "lock", Duration)
} }
func getRedisLock(key string) error { func getRedisLock(key string) error {

View File

@ -14,6 +14,7 @@ import (
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
"server/db" "server/db"
"server/game/mod/activity"
"server/game/mod/avatar" "server/game/mod/avatar"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/emoji" "server/game/mod/emoji"
@ -249,19 +250,19 @@ func ReqGmCommand_(player *Player, Command string) error {
case "miningReload": case "miningReload":
MiningMod := player.PlayMod.getMiningMod() MiningMod := player.PlayMod.getMiningMod()
MiningMod.ZeroUpdate(-1) MiningMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, ACT_TYPE_MINING) ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_MINING)
MiningMod.ZeroUpdate(ActivityInfo.Id) MiningMod.ZeroUpdate(ActivityInfo.Id)
MiningBackData(player) MiningBackData(player)
case "guessColorReload": case "guessColorReload":
GuessColorMod := player.PlayMod.getGuessColorMod() GuessColorMod := player.PlayMod.getGuessColorMod()
GuessColorMod.ZeroUpdate(-1) GuessColorMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, ACT_TYPE_GUESS_COLOR) ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod.ZeroUpdate(ActivityInfo.Id) GuessColorMod.ZeroUpdate(ActivityInfo.Id)
GuessColorBackData(player) GuessColorBackData(player)
case "raceReload": case "raceReload":
RaceMod := player.PlayMod.getRaceMod() RaceMod := player.PlayMod.getRaceMod()
RaceMod.ZeroUpdate(-1) RaceMod.ZeroUpdate(-1)
ActivityInfo := GetActivityInfo(player, ACT_TYPE_RACE) ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_RACE)
RaceMod.ZeroUpdate(ActivityInfo.Id) RaceMod.ZeroUpdate(ActivityInfo.Id)
RaceBackData(player) RaceBackData(player)
case "raceAdd": case "raceAdd":

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"math" "math"
"server/GoUtil" "server/GoUtil"
baseCfg "server/conf/base"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
userCfg "server/conf/user" userCfg "server/conf/user"
"server/game/mod/card" "server/game/mod/card"
@ -43,8 +42,6 @@ func LimitedTimeEventTrigger(p *Player, AddEventId int) {
case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER: case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER:
BaseMod := p.PlayMod.getBaseMod() BaseMod := p.PlayMod.getBaseMod()
EnergyMul := BaseMod.GetEnergyMul() EnergyMul := BaseMod.GetEnergyMul()
MaxEnergyMul := baseCfg.GetMaxEnergyMul(BaseMod.GetLevel(), BaseMod.GetEnergy())
p.PlayMod.getBaseMod().ResetEnergyMul(MaxEnergyMul)
NewEnergyMul := p.PlayMod.getBaseMod().GetEnergyMul() NewEnergyMul := p.PlayMod.getBaseMod().GetEnergyMul()
OrderMod := p.PlayMod.getOrderMod() OrderMod := p.PlayMod.getOrderMod()
Lv := p.GetPlayerBaseMod().GetLevel() Lv := p.GetPlayerBaseMod().GetLevel()

View File

@ -6,6 +6,7 @@ import (
"server/db" "server/db"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/msg" "server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
"strings" "strings"
) )
@ -60,7 +61,11 @@ func (m *MailMgr) AddMail(msg *msg.Msg) (interface{}, error) {
func (r *MailMgr) LoadMail(msg *msg.Msg) (interface{}, error) { func (r *MailMgr) LoadMail(msg *msg.Msg) (interface{}, error) {
// 从数据库加载邮件 // 从数据库加载邮件
data := make([]*db.SqlServerMailStruct, 0) data := make([]*db.SqlServerMailStruct, 0)
db.GetServerMailData(&data) err := db.GetServerMailData(&data)
if err != nil {
log.Error("LoadMail error: %v", err)
return nil, err
}
for _, v := range data { for _, v := range data {
Uids := make([]int, 0) Uids := make([]int, 0)
UidArr := strings.Split(v.To_uids, ",") UidArr := strings.Split(v.To_uids, ",")

View File

@ -994,11 +994,11 @@ func (p *Player) GetRed(AI *ActivityInfo) int {
return 0 return 0
} }
// 限时活动红点 // 限时活动红点
if AI.Type == ACT_TYPE_MINING { if AI.Type == activity.ACT_TYPE_MINING {
ItemId := miningCfg.GetActivityItemId(AI.Id) ItemId := miningCfg.GetActivityItemId(AI.Id)
return p.PlayMod.getItemMod().GetItem(ItemId) return p.PlayMod.getItemMod().GetItem(ItemId)
} }
if AI.Type == ACT_TYPE_GUESS_COLOR { if AI.Type == activity.ACT_TYPE_GUESS_COLOR {
ItemId := guesscolorCfg.GetActivityItemId(AI.Id) ItemId := guesscolorCfg.GetActivityItemId(AI.Id)
return p.PlayMod.getItemMod().GetItem(ItemId) return p.PlayMod.getItemMod().GetItem(ItemId)
} }

View File

@ -103,6 +103,7 @@ func PlayroomBackData(p *Player) {
func PlayroomVisit(p *Player, Uid int) { func PlayroomVisit(p *Player, Uid int) {
if Uid == 0 { if Uid == 0 {
p.PushClientRes(&proto.ResPlayroomInfo{})
return return
} }
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()

View File

@ -16,6 +16,7 @@ import (
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
userCfg "server/conf/user" userCfg "server/conf/user"
"server/db" "server/db"
"server/game/mod/activity"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/friend" "server/game/mod/friend"
"server/game/mod/item" "server/game/mod/item"
@ -308,6 +309,42 @@ func handle(p *Player, m *msg.Msg) error {
p.PushClientRes(ChargeMod.BackData()) p.PushClientRes(ChargeMod.BackData())
case msg.HANDLE_TYPE_PLAYROOM_KISS: // playroom亲吻 case msg.HANDLE_TYPE_PLAYROOM_KISS: // playroom亲吻
p.NotifyPlayroomKiss() p.NotifyPlayroomKiss()
case msg.HANDLE_TYPE_CATNIP_INVITE:
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsg := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.BeInvited(CatnipMsg.GameId, int(m.From), m.SendT)
case msg.HANDLE_TYPE_CATNIP_AGREE:
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsgInfo := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsgInfo.ActivityId { // 活动ID不匹配
return nil
}
UserList, _ := CatnipMod.Agree(CatnipMsgInfo.GameId, int(m.From))
for _, v := range UserList {
FriendMgrSend(&msg.Msg{
From: int(p.M_DwUin),
To: int(v),
Type: msg.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(CatnipMsgInfo.GameId),
},
SendT: GoUtil.Now(),
})
}
case msg.HANDLE_TYPE_CATNIP_AGREE_DEL:
CatnipMod := p.PlayMod.getCatnipMod()
CatnipMsg := m.Extra.(CatnipMsg)
ActivityId := GetActivityId(p, activity.ACT_TYPE_CATNIP)
if ActivityId != CatnipMsg.ActivityId { // 活动ID不匹配
return nil
}
CatnipMod.DelInvited(CatnipMsg.GameId, int(m.From))
default: default:
log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type) log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type)
} }

View File

@ -9,6 +9,7 @@ import (
"server/game/mod/avatar" "server/game/mod/avatar"
"server/game/mod/base" "server/game/mod/base"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/catnip"
"server/game/mod/champship" "server/game/mod/champship"
"server/game/mod/charge" "server/game/mod/charge"
"server/game/mod/chess" "server/game/mod/chess"
@ -79,6 +80,7 @@ type PlayerModList struct {
Collect collect.Collect // 收集 Collect collect.Collect // 收集
Activity activity.Activity // 活动 Activity activity.Activity // 活动
Compensation compensation.Compensation // 补偿 Compensation compensation.Compensation // 补偿
Catnip catnip.CatnipMod // 猫草大作战
} }
func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool { func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool {
@ -176,6 +178,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.Emoji.InitData() p.ModList.Emoji.InitData()
p.ModList.Collect.InitData() p.ModList.Collect.InitData()
p.ModList.Activity.InitData() p.ModList.Activity.InitData()
p.ModList.Catnip.InitData()
return is_update, nil return is_update, nil
} }
@ -366,3 +369,6 @@ func (p *PlayerMod) getActivityMod() *activity.Activity {
func (p *PlayerMod) getCompensationMod() *compensation.Compensation { func (p *PlayerMod) getCompensationMod() *compensation.Compensation {
return &p.mod_list.Compensation return &p.mod_list.Compensation
} }
func (p *PlayerMod) getCatnipMod() *catnip.CatnipMod {
return &p.mod_list.Catnip
}

View File

@ -15,6 +15,7 @@ import (
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
"server/db" "server/db"
"server/game/internal" "server/game/internal"
"server/game/mod/activity"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/collect" "server/game/mod/collect"
"server/game/mod/friend" "server/game/mod/friend"
@ -68,6 +69,7 @@ func ReqPlayerBriefProfileDataFunc(player *Player, buf []byte) error {
PicURL: PlayerSimpleData.FaceBookPic, PicURL: PlayerSimpleData.FaceBookPic,
ActiveTime: int32(max(PlayerSimpleData.Loginout, PlayerSimpleData.Login)), ActiveTime: int32(max(PlayerSimpleData.Loginout, PlayerSimpleData.Login)),
NickName: PlayerSimpleData.Name, NickName: PlayerSimpleData.Name,
SetEmoji: GoUtil.MapIntToInt32(PlayerSimpleData.Emoji),
}) })
return nil return nil
} }
@ -2959,8 +2961,8 @@ func ReqMiningTake(player *Player, buf []byte) error {
req := &msg.ReqMiningTake{} req := &msg.ReqMiningTake{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
MiningMod := player.PlayMod.getMiningMod() MiningMod := player.PlayMod.getMiningMod()
ActivityInfo := GetActivityInfo(player, ACT_TYPE_MINING) ActivityInfo := GetActivityInfo(player, activity.ACT_TYPE_MINING)
Status := GetActivityStatus(player, ACT_TYPE_MINING) Status := GetActivityStatus(player, activity.ACT_TYPE_MINING)
if Status != ACT_STATUS_START { if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResMiningTake{ player.SendErrClienRes(&msg.ResMiningTake{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -2995,7 +2997,7 @@ func ReqMiningTake(player *Player, buf []byte) error {
} }
player.TeLog("ReqMiningTake", map[string]interface{}{}) player.TeLog("ReqMiningTake", map[string]interface{}{})
player.PlayMod.save() player.PlayMod.save()
player.NotifyRed(ACT_TYPE_MINING) player.NotifyRed(activity.ACT_TYPE_MINING)
MiningBackData(player) MiningBackData(player)
return nil return nil
} }
@ -3003,7 +3005,7 @@ func ReqMiningTake(player *Player, buf []byte) error {
// 领取关卡奖励 // 领取关卡奖励
func ReqMiningReward(player *Player, buf []byte) error { func ReqMiningReward(player *Player, buf []byte) error {
MiningMod := player.PlayMod.getMiningMod() MiningMod := player.PlayMod.getMiningMod()
Status := GetActivityStatus(player, ACT_TYPE_MINING) Status := GetActivityStatus(player, activity.ACT_TYPE_MINING)
if Status != ACT_STATUS_START { if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResMiningReward{ player.SendErrClienRes(&msg.ResMiningReward{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -3058,7 +3060,7 @@ func ReqGuessColor(player *Player, buf []byte) error {
func ReqGuessColorTake(player *Player, buf []byte) error { func ReqGuessColorTake(player *Player, buf []byte) error {
req := &msg.ReqGuessColorTake{} req := &msg.ReqGuessColorTake{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
Status := GetActivityStatus(player, ACT_TYPE_GUESS_COLOR) Status := GetActivityStatus(player, activity.ACT_TYPE_GUESS_COLOR)
if Status != ACT_STATUS_START { if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResGuessColorTake{ player.SendErrClienRes(&msg.ResGuessColorTake{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -3083,7 +3085,7 @@ func ReqGuessColorTake(player *Player, buf []byte) error {
}) })
player.PlayMod.save() player.PlayMod.save()
GuessColorBackData(player) GuessColorBackData(player)
player.NotifyRed(ACT_TYPE_GUESS_COLOR) player.NotifyRed(activity.ACT_TYPE_GUESS_COLOR)
return nil return nil
} }
@ -3091,7 +3093,7 @@ func ReqGuessColorTake(player *Player, buf []byte) error {
func ReqGuessColorReward(player *Player, buf []byte) error { func ReqGuessColorReward(player *Player, buf []byte) error {
req := &msg.ReqGuessColorReward{} req := &msg.ReqGuessColorReward{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
Status := GetActivityStatus(player, ACT_TYPE_GUESS_COLOR) Status := GetActivityStatus(player, activity.ACT_TYPE_GUESS_COLOR)
if Status != ACT_STATUS_START { if Status != ACT_STATUS_START {
player.SendErrClienRes(&msg.ResGuessColorReward{ player.SendErrClienRes(&msg.ResGuessColorReward{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -3200,7 +3202,7 @@ func ReqPlayroomInfo(player *Player, buf []byte) error {
Targer = GetVisitorPlayer(player) Targer = GetVisitorPlayer(player)
} }
if Targer == 0 { if Targer == 0 {
return fmt.Errorf("ReqPlayroomInfo no target") PlayroomVisit(player, Targer)
} }
PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer) PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer)
PlayroomMod.SetTarget(Targer) PlayroomMod.SetTarget(Targer)
@ -4680,3 +4682,228 @@ func ReqPlayroomGuide(player *Player, buf []byte) error {
}) })
return nil return nil
} }
func ReqCatnip(player *Player, buf []byte) error {
player.CatnipBackData()
return nil
}
// TODO : 猫草大作战邀请好友
func ReqCatnipInvite(player *Player, buf []byte) error {
req := &msg.ReqCatnipInvite{}
proto.Unmarshal(buf, req)
ActivityId := GetActivityId(player, activity.ACT_TYPE_MINING)
CatnipMod := player.PlayMod.getCatnipMod()
err := CatnipMod.Invite(int(req.Id), int(req.Uid))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipInvite{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_invite", map[string]interface{}{
"Id": int(req.Id),
})
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(req.Uid),
Type: MsqMod.HANDLE_TYPE_CATNIP_INVITE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(req.Id),
},
SendT: GoUtil.Now(),
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipInvite{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
func ReqCatnipAgree(player *Player, buf []byte) error {
req := &msg.ReqCatnipAgree{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
ActivityId := GetActivityId(player, activity.ACT_TYPE_MINING)
UserList, err := CatnipMod.Agree(int(req.Id), int(req.Uid))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipAgree{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_agree", map[string]interface{}{
"Id": int(req.Id),
})
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(req.Uid),
Type: MsqMod.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(req.Id),
},
SendT: GoUtil.Now(),
})
for _, v := range UserList {
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(v),
Type: MsqMod.HANDLE_TYPE_CATNIP_AGREE,
Extra: CatnipMsg{
ActivityId: ActivityId,
GameId: int(req.Id),
},
SendT: GoUtil.Now(),
})
}
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipAgree{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
// TODO : 猫草大作战设置倍数
func ReqCatnipMultiply(player *Player, buf []byte) error {
req := &msg.ReqCatnipMultiply{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
err := CatnipMod.Multiply(int(req.Id), int(req.Multiply))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipMultiply{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_multiply", map[string]interface{}{
"Id": int(req.Id),
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipMultiply{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
// TODO : 猫草大作战开始游戏
func ReqCatnipPlay(player *Player, buf []byte) error {
req := &msg.ReqCatnipPlay{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
err := CatnipMod.Play(int(req.Id))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_play", map[string]interface{}{
"Id": int(req.Id),
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipPlay{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
// TODO : 猫草大作战领取奖励
func ReqCatnipReward(player *Player, buf []byte) error {
req := &msg.ReqCatnipReward{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
Items, err := CatnipMod.Reward(int(req.Progress))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_CatnipReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResCatnipReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_reward", map[string]interface{}{
"Items": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipReward{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
func ReqCatnipGrandReward(player *Player, buf []byte) error {
req := &msg.ReqCatnipGrandReward{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
Items, err := CatnipMod.GrandReward()
if err != nil {
player.SendErrClienRes(&msg.ResCatnipGrandReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
err = player.HandleItem(Items, msg.ITEM_POP_LABEL_CatnipGrandReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResCatnipGrandReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_grand_reward", map[string]interface{}{
"Items": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipGrandReward{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}
func ReqCatnipRefuse(player *Player, buf []byte) error {
req := &msg.ReqCatnipRefuse{}
proto.Unmarshal(buf, req)
CatnipMod := player.PlayMod.getCatnipMod()
err := CatnipMod.Refuse(int(req.Id), int(req.Uid))
if err != nil {
player.SendErrClienRes(&msg.ResCatnipRefuse{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("catnip_refuse", map[string]interface{}{
"Id": int(req.Id),
})
FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: int(req.Uid),
Type: MsqMod.HANDLE_TYPE_CATNIP_REFUSE,
SendT: GoUtil.Now(),
Extra: CatnipMsg{
ActivityId: GetActivityId(player, activity.ACT_TYPE_MINING),
GameId: int(req.Id),
},
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCatnipRefuse{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}

View File

@ -48,18 +48,17 @@ type VarUserData struct {
Kiss int Kiss int
} }
type VarExpireData struct {
D interface{}
T int64
}
const ( const (
ACT_STATUS_NOT_START = 0 ACT_STATUS_NOT_START = 0
ACT_STATUS_START = 1 ACT_STATUS_START = 1
ACT_STATUS_END = 2 ACT_STATUS_END = 2
) )
const (
ACT_TYPE_MINING = 1 // 挖矿
ACT_TYPE_GUESS_COLOR = 2 // 猜颜色
ACT_TYPE_RACE = 3 // 赛跑
)
type ActivityInfo struct { type ActivityInfo struct {
StartT int64 StartT int64
EndT int64 EndT int64
@ -83,6 +82,18 @@ type GameResult struct {
Emoji int // 表情 Emoji int // 表情
} }
type CatnipMsg struct {
ActivityId int
GameId int
}
type CatnipLock struct {
Uid int // 玩家ID
Partner int // 伙伴ID
GameId int // 游戏ID
End int
}
func init() { func init() {
gob.Register(&limitedTimeEvent.MoneyCat{}) gob.Register(&limitedTimeEvent.MoneyCat{})
gob.Register(&limitedTimeEvent.LuckyCat{}) gob.Register(&limitedTimeEvent.LuckyCat{})
@ -93,4 +104,6 @@ func init() {
gob.Register(&ActivityInfo{}) gob.Register(&ActivityInfo{})
gob.Register(&ChargeExtra{}) gob.Register(&ChargeExtra{})
gob.Register(&GameResult{}) gob.Register(&GameResult{})
gob.Register(&CatnipMsg{})
gob.Register(&CatnipLock{})
} }

View File

@ -13,9 +13,10 @@ type VarMgr struct {
} }
type VarData struct { type VarData struct {
Var map[string]interface{} Var map[string]interface{}
UserVar map[string]*VarUserData VarExpire map[string]*VarExpireData
ZeroTime int64 UserVar map[string]*VarUserData
ZeroTime int64
} }
const ( const (
@ -25,10 +26,11 @@ const (
) )
const ( const (
VAR_OP_UPVOTE = 1 VAR_OP_UPVOTE = 1
VAR_OP_CHIP = 2 VAR_OP_CHIP = 2
VAR_OP_KISS = 3 VAR_OP_KISS = 3
VAR_OP_CHIP_SET = 4 VAR_OP_CHIP_SET = 4
VAR_OP_CATNIP_LOCK = 5
) )
func (f *VarMgr) Init() { func (f *VarMgr) Init() {
@ -69,6 +71,11 @@ func (f *VarMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
Four: Card1, Four: Card1,
Five: Card2, Five: Card2,
}) })
for k, v := range f.getData().VarExpire {
if v.T < GoUtil.ZeroTimestamp() {
delete(f.getData().VarExpire, k)
}
}
return nil, nil return nil, nil
} }
@ -80,6 +87,19 @@ func (f *VarMgr) GetVar(key string) interface{} {
return f.getData().Var[key] return f.getData().Var[key]
} }
func (f *VarMgr) SetExpireVar(key string, value *VarExpireData) {
f.getData().VarExpire[key] = value
}
func (f *VarMgr) GetExpireVar(key string) *VarExpireData {
if v, ok := f.getData().VarExpire[key]; ok {
return v
}
data := &VarExpireData{}
f.getData().VarExpire[key] = data
return data
}
func (f *VarMgr) SetUserVar(key string, value *VarUserData) { func (f *VarMgr) SetUserVar(key string, value *VarUserData) {
f.getData().UserVar[key] = value f.getData().UserVar[key] = value
} }

View File

@ -181,6 +181,7 @@ func ReqServerInfo(args []interface{}) error {
func ReqReloadServerMail(args []interface{}) error { func ReqReloadServerMail(args []interface{}) error {
G_GameLogicPtr.MailMgrCall(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL_RELOAD}) G_GameLogicPtr.MailMgrCall(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL_RELOAD})
G_GameLogicPtr.NotifyAll(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL}) G_GameLogicPtr.NotifyAll(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL})
log.Debug("ReqReloadServerMail success")
return nil return nil
} }

View File

@ -22,6 +22,7 @@ const (
ACT_TYPE_DISCOUNT_GIFT = 4 // 折扣礼包 ACT_TYPE_DISCOUNT_GIFT = 4 // 折扣礼包
ACT_TYPE_ADD_GIFT = 5 // 加送礼包 ACT_TYPE_ADD_GIFT = 5 // 加送礼包
ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包 ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包
ACT_TYPE_CATNIP = 7 // 猫草大作战
) )
const ( const (

View File

@ -0,0 +1,206 @@
package catnip
import (
"fmt"
"server/GoUtil"
catnipCfg "server/conf/catnip"
"server/game/mod/item"
)
type CatnipMod struct {
Id int
Game map[int]*CatnipGame
InviteList map[int][]*InviteInfo // 邀请列表key: 邀请者ID, value: 被邀请者ID
BeInvitedList map[int][]*InviteInfo // 被邀请列表key: 被邀请者ID, value: 邀请者ID
}
type InviteInfo struct {
InviteId int // 邀请者ID
Time int64 // 邀请时间
}
type CatnipGame struct {
Id int // 游戏ID
Partner int // 伙伴ID
Progress int // 进度
PartnerAdd int // 伙伴贡献
Reward []int // 已领取阶段奖励
Mul int // 倍数
Status int // 0: Not Started, 1: In Progress, 2: Completed
}
const (
GAME_STATUS_IDLE = 0 // 游戏未开始
GAME_STATUS_IN_PROGRESS = 1 // 游戏进行中
GAME_STATUS_COMPLETED = 2 // 游戏已完成
)
func (c *CatnipMod) InitData() {
// Initialize Catnip data here
if c.Game == nil {
c.Game = make(map[int]*CatnipGame)
}
if c.InviteList == nil {
c.InviteList = make(map[int][]*InviteInfo)
}
if c.BeInvitedList == nil {
c.BeInvitedList = make(map[int][]*InviteInfo)
}
}
func (c *CatnipMod) Login(Id int) int {
OldId := c.Id
if Id == 0 {
c.Id = 0
return OldId
}
if c.Id == Id {
return 0
}
c.Id = Id
c.Game = make(map[int]*CatnipGame)
GameNum := catnipCfg.GetGameNum(c.Id) // Assuming 1 is the default game ID
for i := 1; i <= GameNum; i++ {
c.Game[i] = &CatnipGame{
Id: i,
Partner: 0, // No partner initially
Progress: 0, // Initial progress
Status: GAME_STATUS_IDLE, // Not started
}
}
return c.Id
}
func (c *CatnipMod) ZeroUpdate(Id int) {
c.Login(Id)
}
func (c *CatnipMod) Invite(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != 0 {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
for _, invite := range c.InviteList[Id] {
if invite.InviteId == Uid {
return fmt.Errorf("user with ID %d is already invited to game ID %d", Uid, Id)
}
}
c.InviteList[Id] = append(c.InviteList[Id], &InviteInfo{
InviteId: Uid,
Time: GoUtil.Now(),
})
return nil
}
func (c *CatnipMod) BeInvited(Id, Uid int, Time int64) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
// Check if the user is already invited
for _, invite := range c.BeInvitedList[Uid] {
if invite.InviteId == Id {
return fmt.Errorf("user with ID %d has already been invited to game ID %d", Uid, Id)
}
}
c.BeInvitedList[Uid] = append(c.BeInvitedList[Uid], &InviteInfo{
InviteId: Id,
Time: Time,
})
return nil
}
func (c *CatnipMod) Agree(Id, Uid int) ([]int, error) {
GameInfo, ok := c.Game[Id]
if !ok {
return nil, fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return nil, fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
// Check if the user is in the invite list
inviteList, exists := c.InviteList[Id]
if !exists {
return nil, fmt.Errorf("no invites found for game ID %d", Id)
}
userExists := false
InviteUser := []int{}
for _, invite := range inviteList {
if invite.InviteId == Uid {
userExists = true
continue
}
InviteUser = append(InviteUser, invite.InviteId)
}
if !userExists {
return nil, fmt.Errorf("user with ID %d is not invited to game ID %d", Uid, Id)
}
c.InviteList[Id] = make([]*InviteInfo, 0) // Clear the invite list after agreeing
GameInfo.Partner = Uid // Set the partner for the game
GameInfo.Status = GAME_STATUS_COMPLETED // Set the game status to in progress
return InviteUser, nil
}
func (c *CatnipMod) DelInvited(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
for k, invite := range c.BeInvitedList[Id] {
if invite.InviteId == Uid {
// Remove the invite from the list
c.BeInvitedList[Id] = append(c.InviteList[Id][:k], c.InviteList[Id][k+1:]...)
return nil
}
}
return fmt.Errorf("user with ID %d is not invited to game ID %d", Uid, Id)
}
func (c *CatnipMod) Multiply(Id, Mul int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
GameInfo.Mul = Mul
return nil
}
func (c *CatnipMod) Refuse(Id, Uid int) error {
GameInfo, ok := c.Game[Id]
if !ok {
return fmt.Errorf("game with ID %d does not exist", Id)
}
if GameInfo.Status != GAME_STATUS_IDLE {
return fmt.Errorf("game with ID %d is already in progress or completed", Id)
}
for k, invite := range c.InviteList[Id] {
if invite.InviteId == Uid {
// Remove the invite from the list
c.InviteList[Id] = append(c.InviteList[Id][:k], c.InviteList[Id][k+1:]...)
return nil
}
}
return nil
}
func (c *CatnipMod) Play(Id int) error {
return nil
}
func (c *CatnipMod) Reward(Id int) ([]*item.Item, error) {
return nil, nil
}
func (c *CatnipMod) GrandReward() ([]*item.Item, error) {
return nil, nil
}

View File

@ -32,14 +32,19 @@ func (f *FaceMod) InitData() {
if f.List == nil || !f.Init { if f.List == nil || !f.Init {
f.Init = true f.Init = true
f.List = make(map[int]*Face) f.List = make(map[int]*Face)
InitId := faceCfg.GetInitList()
for _, v := range InitId {
f.List[v] = &Face{
AddTime: now,
}
}
f.SetId = 1 f.SetId = 1
} }
InitId := faceCfg.GetInitList()
for _, v := range InitId {
if _, ok := f.List[v]; ok {
continue
}
// 初始化表情
f.List[v] = &Face{
AddTime: now,
}
}
} }
func (f *FaceMod) GetFaceNum() int { func (f *FaceMod) GetFaceNum() int {

View File

@ -295,7 +295,12 @@ func (l *LimitedTimeEventMod) GetChestReward(MergeList []int) []*item.Item {
func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item) { func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item) {
ProbList := limitedTimeEventCfg.GetSenceJackpotProb() ProbList := limitedTimeEventCfg.GetSenceJackpotProb()
Id := GoUtil.RandMap(ProbList) Id := GoUtil.RandMap(ProbList)
return Id, limitedTimeEventCfg.GetSenceJackpotReward(Id) Items := limitedTimeEventCfg.GetSenceJackpotReward(Id)
if len(Items) > 1 {
// 多个奖励时,随机选择一个
Items = []*item.Item{GoUtil.RandItem(Items)}
}
return Id, Items
} }
// 获取连击快手奖励 // 获取连击快手奖励

View File

@ -93,6 +93,17 @@ const (
HANDLE_TYPE_PLAYROOM_KISS // playroom亲吻 HANDLE_TYPE_PLAYROOM_KISS // playroom亲吻
HANDLE_TYPE_PLAYROOM_GAME // playroom游戏 HANDLE_TYPE_PLAYROOM_GAME // playroom游戏
HANDLE_TYPE_CATNIP_INVITE // 猫薄荷邀请
HANDLE_TYPE_CATNIP_AGREE // 猫薄荷同意邀请
HANDLE_TYPE_CATNIP_AGREE_DEL // 猫薄荷已同意邀请
HANDLE_TYPE_CATNIP_REFUSE // 猫薄荷拒绝邀请
HANDLE_TYPE_CATNIP_GROWTH // 猫薄荷成长
HANDLE_TYPE_CATNIP_LOCK // 猫薄荷游戏锁定
HANDLE_TYPE_VAR_EXPIRE_SET // 设置全服过期数据
HANDLE_TYPE_VAR_EXPIRE_GET // 获取全服过期数据
) )
const ( const (

File diff suppressed because it is too large Load Diff