Merge branch 'sdk' into online

This commit is contained in:
hahwu 2025-07-17 19:28:11 +08:00
commit 9df37a31b8
25 changed files with 2296 additions and 1215 deletions

View File

@ -32,6 +32,8 @@ const (
CONDITION_LT = "<" // 小于
CONDITION_GE = ">=" // 大于等于
CONDITION_LE = "<=" // 小于等于
LETTER = "GhCvgqSNTUMVeRfwakiYmcxWKtJQpZrDIBXnPyLsAFdzjHbulE"
)
// 加密字符串
@ -312,3 +314,214 @@ func UniqueInts(input []int) []int {
}
return result
}
/*
#codebase: GoUtil
修改函数UniqueStringFromInt
功能说明
将整数转换为包含字母和数字的唯一字符串
算法步骤
1. 将输入整数格式化为5位数字符串不足前补0
2. 分割字符串前2位中2位最后1位
3. 将各段转为整数作为字母表索引
4. 从预定义字母表中选择对应字符
5. 随机生成2个数字字符
6. 随机插入数字字符到字母串中
7. 返回最终唯一标识字符串
*/
func UniqueStringFromInt(n int) string {
n = n % 100000 // 确保n在0-99999范围内
str := fmt.Sprintf("%05d", n)
a1 := str[0:2]
a2 := str[2:4]
a3 := str[4:5]
s1, _ := strconv.Atoi(a1)
s2, _ := strconv.Atoi(a2)
s3, _ := strconv.Atoi(a3)
// 修改索引计算逻辑
var letter1, letter2 string
if s1 >= len(LETTER) {
letter1 = string(LETTER[s1%len(LETTER)]) + strconv.Itoa(s1/len(LETTER))
} else {
letter1 = string(LETTER[s1])
}
if s2 >= len(LETTER) {
idx := (s2) % len(LETTER)
letter2 = string(LETTER[idx]) + strconv.Itoa(s2/len(LETTER))
} else {
letter2 = string(LETTER[s2])
}
letter3 := string(LETTER[s3+20])
letter := fmt.Sprintf("%s%s%s", letter1, letter2, letter3)
lastLetter := 5 - len(letter)
indices := rand.Perm(8)[:2]
chars := []byte{byte('2' + indices[0]), byte('2' + indices[1])}
if lastLetter > 0 {
for i := 0; i < lastLetter; i++ {
insertPos1 := rand.Intn(len(letter) + 1)
letter = letter[:insertPos1] + string(chars[0]) + letter[insertPos1:]
}
}
pos := rand.Intn(len(LETTER))
letter += string(LETTER[pos])
return fmt.Sprintf("%s-%s", letter[:3], letter[3:])
}
// 反解析 UniqueStringFromInt 生成的字符串返回原始整数0-99999失败返回 -1
func ParseUniqueStringToInt(s string) int {
arr := strings.Split(s, "-")
// 去除字符串中大于1的数字
s1 := arr[2] + arr[3]
s1 = s1[:len(s1)-1] // 去掉最后一个字符
s2 := ""
for _, ch := range s1 {
if ch < '2' || ch > '9' {
s2 += string(ch)
}
}
index1 := 0
s3 := ""
for i := 0; i < len(s2); i++ {
index := strings.Index(LETTER, string(s2[i]))
if i < len(s2)-1 && s2[i+1] == '1' {
index += len(LETTER)
i++
}
index1++
if i == len(s2)-1 {
index -= 20 // 最后一位是字母减去20
s3 += fmt.Sprintf("%d", index)
} else {
s3 += fmt.Sprintf("%02d", index)
}
}
return Int(s3)
}
func GenerateShuffledAlphabet() string {
// 包含所有大小写字母的字符串
alphabet := "abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"
// 转换为字节切片以便打乱
bytes := []byte(alphabet)
// 使用当前时间作为随机种子
rand.Seed(time.Now().UnixNano())
// Fisher-Yates 洗牌算法
for i := len(bytes) - 1; i > 0; i-- {
j := rand.Intn(i + 1)
bytes[i], bytes[j] = bytes[j], bytes[i]
}
return string(bytes)
}
// 根据IP获取国家名称
func GetCountryByIP(ip string) (string, error) {
return "", nil
// resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/")
// if err != nil {
// return "", err
// }
// defer resp.Body.Close()
// buf := new(bytes.Buffer)
// buf.ReadFrom(resp.Body)
// return strings.TrimSpace(buf.String()), nil
}
// 根据国家名称获取ISO 3166-1国家码
func GetISOCodeByCountry(country string) (string, error) {
// 简单映射,可以扩展为更完整的映射表
countryMap := map[string]string{
"Afghanistan": "004", // 阿富汗
"Albania": "008", // 阿尔巴尼亚
"Algeria": "012", // 阿尔及利亚
"Angola": "024", // 安哥拉
"Argentina": "032", // 阿根廷
"Austria": "040", // 奥地利
"Azerbaijan": "031", // 阿塞拜疆
"Bahrain": "048", // 巴林
"Bangladesh": "050", // 孟加拉国
"Belgium": "056", // 比利时
"Bolivia": "068", // 玻利维亚
"Bosnia and Herzegovina": "070", // 波斯尼亚和黑塞哥维那
"Brazil": "076", // 巴西
"Bulgaria": "100", // 保加利亚
"Canada": "124", // 加拿大
"Chile": "152", // 智利
"China": "156", // 中国
"Colombia": "170", // 哥伦比亚
"Costa Rica": "188", // 哥斯达黎加
"Croatia": "191", // 克罗地亚
"Cuba": "192", // 古巴
"Denmark": "208", // 丹麦
"Ecuador": "218", // 厄瓜多尔
"Egypt": "818", // 埃及
"Ethiopia": "231", // 埃塞俄比亚
"Finland": "246", // 芬兰
"France": "250", // 法国
"Germany": "276", // 德国
"Ghana": "288", // 加纳
"Greece": "300", // 希腊
"Hungary": "348", // 匈牙利
"India": "356", // 印度
"Indonesia": "360", // 印度尼西亚
"Iran": "364", // 伊朗
"Iraq": "368", // 伊拉克
"Italy": "380", // 意大利
"Japan": "392", // 日本
"Jordan": "400", // 约旦
"Kenya": "404", // 肯尼亚
"Kuwait": "414", // 科威特
"Lebanon": "422", // 黎巴嫩
"Malaysia": "458", // 马来西亚
"Mexico": "484", // 墨西哥
"Morocco": "504", // 摩洛哥
"Nigeria": "566", // 尼日利亚
"Norway": "578", // 挪威
"Pakistan": "586", // 巴基斯坦
"Peru": "604", // 秘鲁
"Philippines": "608", // 菲律宾
"Poland": "616", // 波兰
"Portugal": "620", // 葡萄牙
"Qatar": "634", // 卡塔尔
"Romania": "642", // 罗马尼亚
"Russia": "643", // 俄罗斯
"Saudi Arabia": "682", // 沙特阿拉伯
"South Africa": "710", // 南非
"South Korea": "410", // 韩国
"Spain": "724", // 西班牙
"Sweden": "752", // 瑞典
"Switzerland": "756", // 瑞士
"Thailand": "764", // 泰国
"Turkey": "792", // 土耳其
"Ukraine": "804", // 乌克兰
"United Kingdom": "826", // 英国
"United States": "840", // 美国
"Vietnam": "704", // 越南
"Zimbabwe": "716", // 津巴布韦
}
if code, ok := countryMap[country]; ok {
return code, nil
}
return "", fmt.Errorf("country code not found for %s", country)
}
// 综合函数根据IP获取ISO 3166-1国家码
func GetISOCodeByIP(ip string) (string, error) {
country, err := GetCountryByIP(ip)
if err != nil {
return "", err
}
return GetISOCodeByCountry(country)
}

View File

@ -51,8 +51,8 @@ var Server struct {
KafkaHost string
KafkaPort string
Version string
IdVerify bool
CountryCode string
IdVerify bool
}
func init() {

View File

@ -29,10 +29,10 @@
"RedisPort" :"6379",
"RedisPwd" :"",
"GoogleVerify":false,
"RemoteAddr":"host.docker.internal:9001",
"Partition":3,
"KafkaHost":"kafka-server",
"CountryCode":"004",
"KafkaPort":"9092",
"Version":"1.0.0",
"IdVerify":false

View File

@ -0,0 +1,35 @@
package game
import (
"server/game/mod/compensation"
"server/game/mod/mail"
)
func (p *Player) Compensation() {
p.Compensation20250716()
}
func (p *Player) Compensation20250716() {
compensationMod := p.PlayMod.getCompensationMod()
if compensationMod.Is20250716() {
return // 已经领取过补偿
}
PlayerBaseMod := p.GetPlayerBaseMod()
items := compensationMod.Compensation20250716(PlayerBaseMod.GetName())
if len(items) == 0 {
return // 没有补偿物品
}
MailMod := p.PlayMod.getMailMod()
MailMod.SendMail(&mail.MailStruct{
Title: compensation.Compensation20250716_Mail_Config.Title,
SubTitle: "",
Content: compensation.Compensation20250716_Mail_Config.Content,
TitleEn: compensation.Compensation20250716_Mail_Config.Title,
SubTitleEn: "",
ContentEn: compensation.Compensation20250716_Mail_Config.Content,
Items: items,
Type: mail.MAIL_TYPE_NORMAL,
})
p.PlayMod.save()
}

View File

@ -150,6 +150,8 @@ func (f *FriendMgr) SetVarUserData(m *msg.Msg) (interface{}, error) {
data.Upvote++
case VAR_OP_CHIP:
data.Chip += VarOp.Data.(int)
case VAR_OP_CHIP_SET:
data.Chip = VarOp.Data.(int)
case VAR_OP_KISS:
data.Kiss = VarOp.Data.(int)
}

View File

@ -197,7 +197,7 @@ func (ad *GameLogic) NewAccountInsertDataToDB() bool {
playerInfo.PackUnlockCount = 5
playerInfo.EnergyBuyCount = 0
playerInfo.UserName = ad.Db_AccountInfo.UserName
playerInfo.LoginTime = 0
playerInfo.LoginTime = (int32)(time.Now().Unix())
playerInfo.LogoutTime = 0
playerInfo.Todayolinetime = 0
playerInfo.Rolecreatetime = (int32)(time.Now().Unix())
@ -217,6 +217,13 @@ func (ad *GameLogic) NewAccountInsertDataToDB() bool {
Uid: insertId,
EventName: "register",
})
G_GameLogicPtr.AddLog(&Log{
Uid: insertId,
EventName: "register_info",
Param: map[string]interface{}{
"username": ad.Db_AccountInfo.UserName,
},
})
return true
}
@ -736,6 +743,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqFriendTLUpvote", ReqFriendTLUpvote) // 请求时间线点赞
RegisterMsgProcessFunc("ReqAddNpc", ReqAddNpc) // 增加npc
RegisterMsgProcessFunc("ReqWishApply", ReqWishApply) // 同意好友心愿单请求
RegisterMsgProcessFunc("ReqFriendByCode", ReqFriendByCode) // 根据邀请码查询好友
RegisterMsgProcessFunc("ReqSearchPlayer", ReqSearchPlayer) // 搜索好友
RegisterMsgProcessFunc("ReqApplyFriend", ReqApplyFriend) // 申请好友
@ -800,30 +808,31 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqRaceStart", ReqRaceStart)
// #region playroom
RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据
RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息
RegisterMsgProcessFunc("ReqPlayroomDressSet", ReqPlayroomDressSet) // 设置服装
RegisterMsgProcessFunc("ReqPlayroomPetAirSet", ReqPlayroomPetAirSet) // 获取宠物空气
RegisterMsgProcessFunc("ReqPlayroomGame", ReqPlayroomGame) // 游戏结果
RegisterMsgProcessFunc("ReqPlayroomInteract", ReqPlayroomInteract) // 宠物交互
RegisterMsgProcessFunc("ReqPlayroomSetRoom", ReqPlayroomSetRoom) // playroom装饰
RegisterMsgProcessFunc("ReqPlayroomSelectReward", ReqPlayroomSelectReward) // playroom选择奖励
RegisterMsgProcessFunc("ReqPlayroomLose", ReqPlayroomLose) // 处理偷取的棋子
RegisterMsgProcessFunc("ReqPlayroomWork", ReqPlayroomWork) // 宠物工作
RegisterMsgProcessFunc("ReqPlayroomRest", ReqPlayroomRest) // 宠物休息
RegisterMsgProcessFunc("ReqPlayroomDraw", ReqPlayroomDraw) // 转盘
RegisterMsgProcessFunc("ReqPlayroomFlip", ReqPlayroomFlip) // 翻牌
RegisterMsgProcessFunc("ReqPlayroomFlipReward", ReqPlayroomFlipReward) // 翻牌奖励
RegisterMsgProcessFunc("ReqPlayroomChip", ReqPlayroomChip) // 消除碎片
RegisterMsgProcessFunc("ReqPlayroomOutline", ReqPlayroomOutline) // 打工离线
RegisterMsgProcessFunc("ReqPlayroomWrokOutline", ReqPlayroomWrokOutline) // 打工离线完成
RegisterMsgProcessFunc("ReqPlayroomShop", ReqPlayroomShop) // playroom 商店
RegisterMsgProcessFunc("ReqPlayroomBuyItem", ReqPlayroomBuyItem) // 购买playroom物品
RegisterMsgProcessFunc("ReqPlayroomUpvote", ReqPlayroomUpvote) // 点赞别人的playroom
RegisterMsgProcessFunc("ReqPlayroomUnlock", ReqPlayroomUnlock) // 解锁房间
RegisterMsgProcessFunc("ReqPlayroomTask", ReqPlayroomTask) // playroom任务
RegisterMsgProcessFunc("ReqPlayroomTaskReward", ReqPlayroomTaskReward) // 领取任务奖励
RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据
RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息
RegisterMsgProcessFunc("ReqPlayroomDressSet", ReqPlayroomDressSet) // 设置服装
RegisterMsgProcessFunc("ReqPlayroomPetAirSet", ReqPlayroomPetAirSet) // 获取宠物空气
RegisterMsgProcessFunc("ReqPlayroomGame", ReqPlayroomGame) // 游戏结果
RegisterMsgProcessFunc("ReqPlayroomInteract", ReqPlayroomInteract) // 宠物交互
RegisterMsgProcessFunc("ReqPlayroomSetRoom", ReqPlayroomSetRoom) // playroom装饰
RegisterMsgProcessFunc("ReqPlayroomSelectReward", ReqPlayroomSelectReward) // playroom选择奖励
RegisterMsgProcessFunc("ReqPlayroomLose", ReqPlayroomLose) // 处理偷取的棋子
RegisterMsgProcessFunc("ReqPlayroomWork", ReqPlayroomWork) // 宠物工作
RegisterMsgProcessFunc("ReqPlayroomRest", ReqPlayroomRest) // 宠物休息
RegisterMsgProcessFunc("ReqPlayroomDraw", ReqPlayroomDraw) // 转盘
RegisterMsgProcessFunc("ReqPlayroomFlip", ReqPlayroomFlip) // 翻牌
RegisterMsgProcessFunc("ReqPlayroomFlipReward", ReqPlayroomFlipReward) // 翻牌奖励
RegisterMsgProcessFunc("ReqPlayroomChip", ReqPlayroomChip) // 消除碎片
RegisterMsgProcessFunc("ReqPlayroomOutline", ReqPlayroomOutline) // 打工离线
RegisterMsgProcessFunc("ReqPlayroomWrokOutline", ReqPlayroomWrokOutline) // 打工离线完成
RegisterMsgProcessFunc("ReqPlayroomShop", ReqPlayroomShop) // playroom 商店
RegisterMsgProcessFunc("ReqPlayroomBuyItem", ReqPlayroomBuyItem) // 购买playroom物品
RegisterMsgProcessFunc("ReqPlayroomUpvote", ReqPlayroomUpvote) // 点赞别人的playroom
RegisterMsgProcessFunc("ReqPlayroomUnlock", ReqPlayroomUnlock) // 解锁房间
RegisterMsgProcessFunc("ReqPlayroomTask", ReqPlayroomTask) // playroom任务
RegisterMsgProcessFunc("ReqPlayroomTaskReward", ReqPlayroomTaskReward) // 领取任务奖励
RegisterMsgProcessFunc("ReqPlayroomGameShowReward", ReqPlayroomGameShowReward) // 展示游戏结果数据
RegisterMsgProcessFunc("ReqPlayroomGuide", ReqPlayroomGuide) // 展示游戏结果数据
// 宠物宝藏
RegisterMsgProcessFunc("ReqFriendTreasure", ReqFriendTreasure) // 请求好友宝藏数据
RegisterMsgProcessFunc("ReqFriendTreasureStart", ReqFriendTreasureStart) // 开始游戏

View File

@ -320,7 +320,7 @@ func ReqGmCommand_(player *Player, Command string) error {
PlayroomBackData(player)
case "addChip":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.AddChip(1, 1)
PlayroomMod.AddChip(100100001, 1, 0)
player.PushClientRes(PlayroomMod.NotifyLose())
case "save":
player.PlayMod.ClearData(player)
@ -463,7 +463,13 @@ func ReqGmCommand_(player *Player, Command string) error {
}
}
player.HandleItem(items, msg.ITEM_POP_LABEL_GM.String())
case "resetCompensation":
compensationMod := player.PlayMod.getCompensationMod()
compensationMod.C20250716 = false
case "resetCode":
BaseMod := player.PlayMod.getBaseMod()
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
BackUserInfo(player)
default:
return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg)
}

View File

@ -397,6 +397,7 @@ func (p *Player) Login() {
FaceMod.Login(PlayBaseMod.GetRegisterTime())
AvatarMod.Login(PlayBaseMod.GetRegisterTime())
HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
p.Compensation()
p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
}
@ -708,7 +709,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
})
default:
err := ItemMod.AddItem(v.Id, v.Num)
p.TeLog("item_change", map[string]interface{}{
p.TeLog("asset_change", map[string]interface{}{
"item_id": v.Id,
"change_type": change_type,
"change_num": math.Abs(float64(v.Num)),
@ -1047,3 +1048,10 @@ func (p *Player) SubCard(Id int) error {
})
return nil
}
func (p *Player) GetIp() string {
if p.GetAgent() == nil {
return ""
}
return p.GetAgent().RemoteAddr().String()
}

View File

@ -72,7 +72,8 @@ func PlayroomBackData(p *Player) {
ChipMessage := make([]*proto.ChipInfo, 0)
for _, v := range PlayroomMod.ChipList {
ChipMessage = append(ChipMessage, &proto.ChipInfo{
Uid: int64(v.Uid),
Uid: int64(v.Uid),
EmojiId: int32(v.Emoji),
})
}
data := G_GameLogicPtr.GetUserData(int(p.M_DwUin))
@ -147,3 +148,25 @@ func (p *Player) NotifyPlayroomKiss() {
}
p.PushClientRes(m)
}
func BackUserInfo(p *Player) {
BaseMod := p.PlayMod.getBaseMod()
FaceMod := p.PlayMod.getFaceMod()
AvatarMod := p.PlayMod.getAvatarMod()
DecorateMod := p.PlayMod.getDecorateMod()
p.PushClientRes(&proto.UserInfo{
Uid: p.M_DwUin,
Nickname: BaseMod.NickName,
Avatar: int32(AvatarMod.SetId),
Face: int32(FaceMod.SetId),
DecorateCnt: int32(DecorateMod.DecorateNum),
AvatarList: AvatarMod.BackData(),
FaceList: FaceMod.BackData(),
EmojiList: p.PlayMod.getEmojiMod().BackData(),
SetEmoji: p.PlayMod.getEmojiMod().GetEmojiSet(),
Login: int32(BaseMod.GetLoginTime()),
PetName: BaseMod.PetName,
IdNum: BaseMod.IdCardNum,
AddCode: BaseMod.AddCode,
})
}

View File

@ -177,7 +177,6 @@ func (p *PlayerBaseData) UpdateBaseItemInfo(update *msg.UpdateBaseItemInfo) {
p.Data.LastPlayTime = v
}
}
}
func (p *PlayerBaseData) ReqRemoveAd(player *Player, buf []byte) {
@ -417,6 +416,9 @@ func (p *PlayerBaseData) ReqSynGameData(player *Player, buf []byte) {
res.ResultCode = 0
}
p.p.TeLog("ReqSynGameData", map[string]interface{}{
"platform_type": "facebook",
})
p.SaveDataFromDB("")
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)

View File

@ -212,19 +212,21 @@ func handle(p *Player, m *msg.Msg) error {
PlayroomMod := p.PlayMod.getPlayroomMod()
Items := m.Item
GameId := playroom.GAME_TYPE_HOOK
Emoji := 0
if m.Extra != nil {
if val, ok := m.Extra.(int); ok {
GameId = val
if val, ok := m.Extra.(GameResult); ok {
GameId = val.T
Emoji = val.Emoji
}
}
if len(Items) == 0 {
return nil
}
if GameId == playroom.GAME_TYPE_HOOK {
PlayroomMod.AddChip(m.From, m.SendT)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT)
if GameId == playroom.GAME_TYPE_HOOK || GameId == playroom.GAME_TYPE_HIDE {
PlayroomMod.AddChip(m.From, m.SendT, Emoji)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT)
} else {
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT)
}
PlayroomMod.AddMood(playroom.MOOD_TYPE_FOOD, -50)
PlayroomMod.AddMood(playroom.MOOD_TYPE_CLEAN, -50)
@ -245,7 +247,13 @@ func handle(p *Player, m *msg.Msg) error {
p.PushClientRes(PlayroomMod.NotifyLose())
case msg.HANDLE_TYPE_PLAYROOM_GAME:
FriendMod := p.PlayMod.getFriendMod()
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, "", m.SendT)
Emoji := 0
if m.Extra != nil {
if val, ok := m.Extra.(GameResult); ok {
Emoji = val.Emoji
}
}
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, fmt.Sprintf("%d", Emoji), m.SendT)
FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT)
case msg.FRIEND_TREASURE_HANDLE: // # 好友宝藏
Items := make([]*item.Item, 0)
@ -586,27 +594,6 @@ func CancelOrder(p *Player, OrderSn string) error {
return nil
}
func BackUserInfo(p *Player) {
BaseMod := p.PlayMod.getBaseMod()
FaceMod := p.PlayMod.getFaceMod()
AvatarMod := p.PlayMod.getAvatarMod()
DecorateMod := p.PlayMod.getDecorateMod()
p.PushClientRes(&proto.UserInfo{
Uid: p.M_DwUin,
Nickname: BaseMod.NickName,
Avatar: int32(AvatarMod.SetId),
Face: int32(FaceMod.SetId),
DecorateCnt: int32(DecorateMod.DecorateNum),
AvatarList: AvatarMod.BackData(),
FaceList: FaceMod.BackData(),
EmojiList: p.PlayMod.getEmojiMod().BackData(),
SetEmoji: p.PlayMod.getEmojiMod().GetEmojiSet(),
Login: int32(BaseMod.GetLoginTime()),
PetName: BaseMod.PetName,
IdNum: BaseMod.IdCardNum,
})
}
func GetCardInfoMsg(CardInfo *card.CardInfo) *proto.ResFriendCard {
Uid := 0
if CardInfo.Type == card.TYPE_CARD_SEND {
@ -654,9 +641,8 @@ func BackChampship(p *Player) {
func GetVisitorPlayer(p *Player) int {
PlayroomMod := p.PlayMod.getPlayroomMod()
VisitorList := PlayroomMod.GetVisitor()
HasVisit := PlayroomMod.GetHasVisit()
TodayVisitedUsers := PlayroomMod.GetTodayVisitedUsers()
VisitorList := PlayroomMod.GetVisitor() // 到访用户
TodayVisitedUsers := PlayroomMod.GetTodayVisitedUsers() // 今日已互动用户
FriendMod := p.PlayMod.getFriendMod()
type sortData struct {
Uid int
@ -665,10 +651,16 @@ func GetVisitorPlayer(p *Player) int {
PlayerList := make([]sortData, 0)
PlayerList2 := make([]sortData, 0)
Now := GoUtil.Now()
/**
排除当日玩家已对其发起过交互的用户
优先选择24小时内曾经与玩家进行过宠物交互的好友
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的好友
若不存在符合条件的用户则选择24小时内曾经与玩家进行过宠物交互的陌生用户
若存在复数对象的情况下优先选择交互发生时间与当前时间最近的用户
若不存在符合条件的用户则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
若不存在符合条件的用户则依据以上用户推荐算法选择一位随机推荐用户并且在下次触发式订单完成时不再排除已发起过交互的用户
*/
for k, v := range VisitorList {
if _, ok := HasVisit[k]; ok {
continue
}
if GoUtil.InArray(k, TodayVisitedUsers) {
continue
}
@ -707,11 +699,12 @@ func GetVisitorPlayer(p *Player) int {
if ps == nil {
continue
}
if GoUtil.Now()-ps.Loginout <= 86400 { // 24小时内登录过
if ps.Loginout > recentLoginTime {
recentLoginTime = ps.Loginout
recentFriendUid = uid
}
if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过
continue
}
if ps.Loginout > recentLoginTime {
recentLoginTime = ps.Loginout
recentFriendUid = uid
}
}
if recentFriendUid != 0 {
@ -741,9 +734,6 @@ func GetRecommendPlayer(p *Player, Num int) []int {
PlayerList1 := make([]int, 0)
FriendMod := p.PlayMod.getFriendMod()
for _, v := range PlayerList {
if v.Score < 15 {
continue
}
if v.Uid == int(p.M_DwUin) {
continue
}
@ -1085,3 +1075,22 @@ func ExcludeCardStar(CardList []int) []int {
}
return StarList
}
func (p *Player) GetPlayroomGameReward(Type, SelectId int) []*item.Item {
PlayroomMod := p.PlayMod.getPlayroomMod()
BaseMod := p.PlayMod.getBaseMod()
Level := BaseMod.GetLevel()
Items := make([]*item.Item, 0)
if Type == playroom.GAME_RESULT_LOSE {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, 20))
}
if Type == playroom.GAME_RESULT_LOW {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, Level*2))
}
if Type == playroom.GAME_RESULT_MIDDLE {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, Level*3))
} else {
Items = PlayroomMod.SelectReward(SelectId)
}
return Items
}

View File

@ -13,6 +13,7 @@ import (
"server/game/mod/charge"
"server/game/mod/chess"
"server/game/mod/collect"
"server/game/mod/compensation"
"server/game/mod/dailyTask"
"server/game/mod/decorate"
"server/game/mod/emoji"
@ -77,6 +78,7 @@ type PlayerModList struct {
Emoji emoji.EmojiMod // 表情
Collect collect.Collect // 收集
Activity activity.Activity // 活动
Compensation compensation.Compensation // 补偿
}
func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool {
@ -148,7 +150,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
BaseMod.FackBookId = PlayerBaseMod.Data.FaceBookId
is_update = true
}
Ip := p.GetPlayer().GetIp()
p.ModList.Handbook.InitData()
p.ModList.Order.InitData()
p.ModList.Decorate.InitData()
@ -158,7 +160,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.DailyTask.InitData()
p.ModList.Face.InitData()
p.ModList.Avatar.InitData()
p.ModList.Base.InitData(int(p.Data.DwUin))
p.ModList.Base.InitData(int(p.Data.DwUin), Ip)
p.ModList.SevenLogin.InitData()
p.ModList.LimitedTimeEvent.InitData(BaseMod.GetLevel())
p.ModList.Friend.InitData()
@ -361,3 +363,6 @@ func (p *PlayerMod) getCollectMod() *collect.Collect {
func (p *PlayerMod) getActivityMod() *activity.Activity {
return &p.mod_list.Activity
}
func (p *PlayerMod) getCompensationMod() *compensation.Compensation {
return &p.mod_list.Compensation
}

View File

@ -5,6 +5,7 @@ import (
"fmt"
"math"
"server/GoUtil"
"server/conf"
cardCfg "server/conf/card"
collectCfg "server/conf/collect"
decorateCfg "server/conf/decorate"
@ -74,6 +75,7 @@ func ReqPlayerBriefProfileDataFunc(player *Player, buf []byte) error {
// 移除广告
func ReqRemoveAdFunc(player *Player, buf []byte) error {
player.PlayerBaseMod.ReqRemoveAd(player, buf)
player.TeLog("remove_ad", map[string]interface{}{})
return nil
}
@ -209,6 +211,10 @@ func RegHandbookAllReward(player *Player, buf []byte) error {
Type: req.Type,
},
})
player.TeLog("collection_all_reward", map[string]interface{}{
"type": req.Type,
"item_list": Items,
})
player.PushClientRes(player.PlayMod.getHandbookMod().BackData())
player.PlayMod.save()
return nil
@ -571,7 +577,7 @@ func ReqDecorateReward(player *Player, buf []byte) error {
func UpdatePlayerChessDataFunc(player *Player, buf []byte) error {
data := &PlayerChessData{}
err := data.UpdatePlayerChessData(player, buf)
if err != nil {
if err == nil {
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "UpdatePlayerChessDataFunc",
})
@ -611,11 +617,11 @@ func ReqGetChessFromBuff(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqGetChessFromBuff",
})
return err
}
player.TeLog("ReqGetChessFromBuff", map[string]interface{}{
"chess_id": ChessId,
})
Update = OrderMod.CreateExtraOrder([]int{ChessId}, AddNewEmit, ChessMod.GetUnlockChessList(), BaseMod.GetEnergyMul())
if Update {
player.PushClientRes(OrderMod.BackData())
@ -651,11 +657,13 @@ func ReqPutChessInBag(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqPutChessInBag",
})
return err
}
player.TeLog("ReqPutChessInBag", map[string]interface{}{
"chess_id": req.ChessId,
"bag_id": req.BagId,
"emit_id": req.EmitId,
})
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResPutChessInBag{
@ -669,7 +677,7 @@ func ReqTakeChessOutBag(player *Player, buf []byte) error {
req := &msg.ReqTakeChessOutBag{}
proto.Unmarshal(buf, req)
ChessMod := player.PlayMod.getChessMod()
err := ChessMod.TakeChessOutBag(int(req.BagId))
ChessId, err := ChessMod.TakeChessOutBag(int(req.BagId))
if err != nil {
player.SendErrClienRes(&msg.ResTakeChessOutBag{
Code: msg.RES_CODE_FAIL,
@ -684,11 +692,12 @@ func ReqTakeChessOutBag(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqTakeChessOutBag",
})
return err
}
player.TeLog("ReqTakeChessOutBag", map[string]interface{}{
"bag_id": req.BagId,
"chess_id": ChessId,
})
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResTakeChessOutBag{
@ -753,11 +762,12 @@ func ReqSeparateChess(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqSeparateChess",
})
return err
}
player.TeLog("ReqSeparateChess", map[string]interface{}{
"chess_id": req.ChessId,
"new_chess": NewChess,
})
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResSeparateChess{
@ -791,11 +801,12 @@ func ReqUpgradeChess(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqUpgradeChess",
})
return err
}
player.TeLog("ReqUpgradeChess", map[string]interface{}{
"chess_id": req.ChessId,
"new_chess": NewChess,
})
Handbook := player.PlayMod.getHandbookMod()
Handbook.SetHandbook(NewChess)
triggerComposeChess(player, NewChess, player.PlayMod.getBaseMod().EnergyMul, player.PlayMod.getChessMod().GetEmitList())
@ -806,9 +817,6 @@ func ReqUpgradeChess(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(Handbook.BackData())
player.TeLog("upgrade_use", map[string]interface{}{
"upgrade_item_id": int(req.ChessId),
})
player.UpdateUserInfo()
return nil
}
@ -849,9 +857,6 @@ func ReqChessEx(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqChessEx",
})
return err
}
// 限时事件气泡 幸运猫
@ -886,7 +891,12 @@ func ReqChessEx(player *Player, buf []byte) error {
"star": req.CostStar,
})
}
player.TeLog("ReqChessEx", map[string]interface{}{
"old_chess_id": int(req.OldChessId),
"new_chess_id": int(req.NewChessId),
"cost_dia": req.CostDia,
"cost_star": req.CostStar,
})
player.PlayMod.save()
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResChessEx{
@ -923,12 +933,13 @@ func ReqSourceChest(player *Player, buf []byte) error {
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
player.TeLog("outsync_event", map[string]interface{}{
"outsync_event": "ReqSourceChest",
})
return err
}
player.PlayMod.save()
player.TeLog("ReqSourceChest", map[string]interface{}{
"chest_id": ChestId,
"item_list": Items,
})
player.PushClientRes(ChessMod.BackData())
player.PushClientRes(&msg.ResSourceChest{
Code: msg.RES_CODE_SUCCESS,
@ -965,6 +976,10 @@ func ReqCardSeasonFirstReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqCardSeasonFirstReward", map[string]interface{}{
"season_id": CardMod.EndTime,
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCardSeasonFirstReward{
Code: msg.RES_CODE_SUCCESS,
@ -1034,6 +1049,10 @@ func ReqExStarReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqExStarReward", map[string]interface{}{
"ex_star_id": int(req.Id),
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResExStarReward{
Code: msg.RES_CODE_SUCCESS,
@ -1071,6 +1090,10 @@ func ReqAllCollectReward(player *Player, buf []byte) error {
return err
}
player.PlayMod.save()
player.TeLog("ReqAllCollectReward", map[string]interface{}{
"item_list": itemList,
"item_list2": itemList2,
})
player.PushClientRes(CardMod.BackData())
player.PushClientRes(&msg.ResAllCollectReward{
Code: msg.RES_CODE_SUCCESS,
@ -1100,6 +1123,10 @@ func ReqGuideReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqGuideReward", map[string]interface{}{
"guide_id": int(req.Id),
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(GuideMod.BackData())
player.PushClientRes(&msg.ResGuideReward{
@ -1165,6 +1192,12 @@ func ReqGetDailyWeekReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqGetDailyWeekReward", map[string]interface{}{
"task_id": int(req.Id),
"item_list": itemList,
"task_type": "week",
"task_score_reward": 0,
})
player.PlayMod.save()
player.PushClientRes(DailyTaskMod.BackData())
player.PushClientRes(&msg.ResGetDailyWeekReward{
@ -1233,6 +1266,9 @@ func ReqSetFace(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResSetFace{
Code: msg.RES_CODE_SUCCESS,
})
player.TeLog("face_set", map[string]interface{}{
"face_id": int(req.Face),
})
BackUserInfo(player)
player.UpdateUserInfo()
return nil
@ -1282,6 +1318,9 @@ func ReqGetEnergyByAD(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqGetEnergyByAD", map[string]interface{}{
"item_list": Item,
})
player.PlayMod.save()
player.PushClientRes(BaseMod.BackData())
player.PushClientRes(&msg.ResGetEnergyByAD{
@ -1347,6 +1386,11 @@ func ReqGetMonthLoginReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqGetMonthLoginReward", map[string]interface{}{
"reward_type": "month",
"reward_step": int(req.Id),
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(SevenLoginMod.BackData())
player.PushClientRes(&msg.ResGetMonthLoginReward{
@ -1387,6 +1431,12 @@ func ReqFastProduceReward(player *Player, buf []byte) error {
return err
}
player.PlayMod.save()
player.TeLog("ReqFastProduceReward", map[string]interface{}{
"energy": int(req.Energy),
"item_list": itemList,
"end_time": EndTime,
"times": Times,
})
player.PushClientRes(LimitedTimeEventMod.BackData())
player.PushClientRes(&msg.ResFastProduceReward{
Code: msg.RES_CODE_SUCCESS,
@ -1416,6 +1466,10 @@ func ReqLimitSenceReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqLimitSenceReward", map[string]interface{}{
"event_type": limitedTimeEvent.EVENT_TYPE_SENCE_DASH,
"item_list": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResLimitSenceReward{
Code: msg.RES_CODE_SUCCESS,
@ -1559,6 +1613,10 @@ func ReqAgreeFriend(player *Player, buf []byte) error {
Uid: req.Uid,
Player: G_GameLogicPtr.GetResSimplePlayerByUid(int(req.Uid)),
})
player.TeLog("friend_add", map[string]interface{}{
"player_id": Uid,
"add_type": "agree",
})
player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now())
FriendApplyBackData(player)
PlayroomMod := player.PlayMod.getPlayroomMod()
@ -1776,6 +1834,9 @@ func ReqRefuseCardGive(player *Player, buf []byte) error {
Code: msg.RES_CODE_SUCCESS,
Id: req.Id,
})
player.TeLog("ReqRefuseCardGive", map[string]interface{}{
"card_id": CardInfo.CardId,
})
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_REG_CARD_REFUSE,
From: int(player.M_DwUin),
@ -1813,6 +1874,10 @@ func ReqCardSend(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResCardSend{
Code: msg.RES_CODE_SUCCESS,
})
player.TeLog("card_send", map[string]interface{}{
"card_id": CardId,
"player_id_target": int(req.Uid),
})
player.PushClientRes(CardMod.NotifyCard())
player.PlayMod.save()
player.PushClientRes(CardMod.NotifyTimes())
@ -2181,6 +2246,11 @@ func ReqGetMailReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("mail_reward", map[string]interface{}{
"mail_id": req.Id,
"item_list": itemList,
})
player.PlayMod.save()
player.PushClientRes(MailMod.NotifyMail(int(req.Id)))
player.PushClientRes(&msg.ResGetMailReward{
@ -2923,6 +2993,7 @@ func ReqMiningTake(player *Player, buf []byte) error {
})
return err
}
player.TeLog("ReqMiningTake", map[string]interface{}{})
player.PlayMod.save()
player.NotifyRed(ACT_TYPE_MINING)
MiningBackData(player)
@ -3006,6 +3077,10 @@ func ReqGuessColorTake(player *Player, buf []byte) error {
return err
}
GuessColorMod.Take(req.Map.Map, req.OMap)
player.TeLog("ReqGuessColorTake", map[string]interface{}{
"map": req.Map.Map,
"o_map": req.OMap,
})
player.PlayMod.save()
GuessColorBackData(player)
player.NotifyRed(ACT_TYPE_GUESS_COLOR)
@ -3041,6 +3116,9 @@ func ReqGuessColorReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("guess_color_finish", map[string]interface{}{
"item_list": itemList,
})
player.PlayMod.save()
GuessColorBackData(player)
return nil
@ -3094,6 +3172,9 @@ func ReqRaceReward(player *Player, buf []byte) error {
return err
}
RaceBackData(player)
player.TeLog("ReqRaceReward", map[string]interface{}{
"item_list": Items,
})
player.PushClientRes(&msg.ResRaceReward{
Code: msg.RES_CODE_SUCCESS,
})
@ -3124,8 +3205,7 @@ func ReqPlayroomInfo(player *Player, buf []byte) error {
PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer)
PlayroomMod.SetTarget(Targer)
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_VISITROOM})
if PlayerData.Loginout > 0 && PlayerData.Loginout < GoUtil.Now()-int64(playroomCfg.GetGameOutline()) { // todo DEBUG
log.Debug("ReqPlayroomInfo PlayerData.Loginout:%v, %v", PlayerData.Loginout, playroomCfg.GetGameOutline())
if PlayerData.Loginout > 0 && PlayerData.Loginout < GoUtil.Now()-int64(playroomCfg.GetGameOutline()) {
GameType := PlayroomMod.RandGameType()
PlayroomMod.SetGameId(GameType)
Star := min(500, max(PlayerData.Star/10, 10))
@ -3199,6 +3279,10 @@ func ReqPlayroomInteract(player *Player, buf []byte) error {
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_KISS, 0)
LimitedTimePlayroomTrigger_(player, PType)
player.NotifyPlayroomKiss()
player.TeLog("playroom_interact", map[string]interface{}{
"interact_id": int(req.Id),
"interact_type": int(req.Type),
})
player.PushClientRes(&msg.ResPlayroomInteract{
Code: msg.RES_CODE_SUCCESS,
InteractNum: int32(PlayroomMod.InteractNum),
@ -3240,21 +3324,8 @@ func ReqPlayroomGame(player *Player, buf []byte) error {
})
return fmt.Errorf("no target")
}
PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Target)
Items := make([]*item.Item, 0)
if req.Type == playroom.GAME_RESULT_LOSE {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, 20))
PlayroomMod.ResetGame()
}
if req.Type == playroom.GAME_RESULT_LOW {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, PlayerData.Level*2))
PlayroomMod.ResetGame()
}
if req.Type == playroom.GAME_RESULT_MIDDLE {
Items = append(Items, item.NewItem(item.ITEM_STAR_ID, PlayerData.Level*3))
PlayroomMod.ResetGame()
}
Items := player.GetPlayroomGameReward(int(req.Type), 0)
PlayroomMod.ResetGame()
err := player.HandleItem(Items, msg.ITEM_POP_LABEL_PlayroomGame.String())
if err != nil {
player.SendErrClienRes(&msg.ResPlayroomGame{
@ -3268,6 +3339,10 @@ func ReqPlayroomGame(player *Player, buf []byte) error {
To: Target,
Type: MsqMod.HANDLE_TYPE_PLAYROOM_GAME,
SendT: GoUtil.Now(),
Extra: GameResult{
T: PlayroomMod.GetGameId(),
Emoji: int(req.EmojiId),
},
})
player.PlayMod.save()
ItemsMsg := make(map[int32]*msg.ItemInfo, 0)
@ -3277,6 +3352,12 @@ func ReqPlayroomGame(player *Player, buf []byte) error {
Num: int32(v.Num),
}
}
player.TeLog("playroom_game", map[string]interface{}{
"game_id": PlayroomMod.GetGameId(),
"emoji_id": req.EmojiId,
"game_type": req.Type,
"reward": Items,
})
player.PushClientRes(&msg.ResPlayroomGame{
Code: msg.RES_CODE_SUCCESS,
Type: req.Type,
@ -3290,7 +3371,7 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error {
req := &msg.ReqPlayroomSelectReward{}
proto.Unmarshal(buf, req)
PlayroomMod := player.PlayMod.getPlayroomMod()
Items := PlayroomMod.SelectReward(int(req.Id))
Items := player.GetPlayroomGameReward(playroom.GAME_RESULT_HIGH, int(req.Id))
err := player.HandleItem(Items, msg.ITEM_POP_LABEL_PlayroomGame.String())
if err != nil {
player.SendErrClienRes(&msg.ResPlayroomSelectReward{
@ -3299,18 +3380,36 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error {
})
return err
}
GameId := PlayroomMod.GetGameId()
Target := PlayroomMod.GetTarget()
if GameId == 0 || Target == 0 {
player.SendErrClienRes(&msg.ResPlayroomSelectReward{
Code: msg.RES_CODE_FAIL,
Msg: "no game or target",
})
return fmt.Errorf("no game or target")
}
G_GameLogicPtr.FriendMgrSend(&MsqMod.Msg{
From: int(player.M_DwUin),
To: Target,
Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE,
SendT: GoUtil.Now(),
Item: Items,
Extra: PlayroomMod.GetGameId(),
Extra: GameResult{
T: PlayroomMod.GetGameId(),
Emoji: int(req.EmojiId),
},
})
G_GameLogicPtr.SetUserData(Target, VAR_OP_CHIP, 1)
PlayroomMod.ResetGame()
player.PlayMod.save()
player.TeLog("playroom_select_reward", map[string]interface{}{
"reward_id": req.Id,
"emoji_id": req.EmojiId,
"game_id": PlayroomMod.GetGameId(),
"reward": Items,
"target_id": Target,
})
PlayroomBackData(player)
PlayroomVisit(player, PlayroomMod.GetTarget())
player.PushClientRes(&msg.ResPlayroomSelectReward{
@ -3354,7 +3453,9 @@ func ReqPlayroomWork(player *Player, buf []byte) error {
return err
}
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PETWORK})
player.TeLog("playroom_work", map[string]interface{}{
"work_item": Items,
})
player.PlayMod.save()
player.PushClientRes(PlayroomMod.NotifyWork())
// PlayroomBackData(player)
@ -3369,6 +3470,7 @@ func ReqPlayroomRest(player *Player, buf []byte) error {
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.Rest()
player.PlayMod.save()
player.TeLog("playroom_rest", map[string]interface{}{})
player.PushClientRes(PlayroomMod.NotifyWork())
return nil
}
@ -3428,7 +3530,12 @@ func ReqPlayroomChip(player *Player, buf []byte) error {
})
return err
}
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_CHIP, -ChipNum)
player.TeLog("playroom_chip", map[string]interface{}{
"chip_num": ChipNum,
"uid": req.Uid,
})
G_GameLogicPtr.SetUserData(int(player.M_DwUin), VAR_OP_CHIP_SET, len(PlayroomMod.ChipList))
player.PlayMod.save()
PlayroomBackData(player)
player.PushClientRes(&msg.ResPlayroomChip{
@ -3497,7 +3604,16 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error {
Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE,
SendT: GoUtil.Now(),
Item: Items,
Extra: PlayroomMod.GetGameId(),
Extra: GameResult{
T: playroom.GAME_TYPE_FILP,
Emoji: int(req.EmojiId),
},
})
player.TeLog("playroom_flip_reward", map[string]interface{}{
"reward": Items,
"target_id": Target,
"emoji_id": req.EmojiId,
"game_id": playroom.GAME_TYPE_FILP,
})
player.PlayMod.save()
PlayroomBackData(player)
@ -3536,8 +3652,10 @@ func ReqPlayroomBuyItem(player *Player, buf []byte) error {
})
return err
}
player.TeLog("playroom_buy_item", map[string]interface{}{
"item_id": req.Id,
})
player.PlayMod.save()
// PlayroomBackData(player)
player.PushClientRes(&msg.ResPlayroomBuyItem{
Code: msg.RES_CODE_SUCCESS,
})
@ -3631,6 +3749,10 @@ func ReqPlayroomTask(player *Player, buf []byte) error {
})
return err
}
player.TeLog("playroom_task", map[string]interface{}{
"task_id": req.Id,
"reward": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResPlayroomTask{
Code: msg.RES_CODE_SUCCESS,
@ -3661,6 +3783,11 @@ func ReqPlayroomTaskReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("playroom_task_reward", map[string]interface{}{
"task_type": req.Type,
"reward_id": Id,
"reward": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResPlayroomTaskReward{
Code: msg.RES_CODE_SUCCESS,
@ -3779,6 +3906,11 @@ func ReqPlayroomShop(player *Player, buf []byte) error {
})
return err
}
player.TeLog("playroom_shop", map[string]interface{}{
"shop_id": req.Id,
"num": req.Num,
"reward": AddItems,
})
player.PlayMod.save()
PlayroomBackData(player)
player.PushClientRes(&msg.ResPlayroomShop{
@ -3812,7 +3944,7 @@ func ReqFriendTreasureStart(player *Player, buf []byte) error {
})
return fmt.Errorf("not enough star")
}
player.TeLog("friend_treasure_start", map[string]interface{}{})
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PETTREASURE})
FriendTreasureMod.InitGame(req.List, req.List2)
player.PlayMod.save()
@ -3856,7 +3988,11 @@ func ReqFriendTreasureFilp(player *Player, buf []byte) error {
)
return err
}
player.TeLog("friend_treasure_filp", map[string]interface{}{
"pos": req.Pos,
"items": Items,
"uid": Uid,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTreasureFilp{
Code: msg.RES_CODE_SUCCESS,
@ -3898,6 +4034,10 @@ func ReqFriendTreasureEnd(player *Player, buf []byte) error {
)
return err
}
player.TeLog("friend_treasure_end", map[string]interface{}{
"items": Items,
"num": FriendItemNum,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResFriendTreasureEnd{
Code: msg.RES_CODE_SUCCESS,
@ -3935,6 +4075,10 @@ func ReqCardHandbookReward(player *Player, buf []byte) error {
})
return err
}
player.TeLog("card_handbook_reward", map[string]interface{}{
"CardId": int(req.CardId),
"Items": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResCardHandbookReward{
Code: msg.RES_CODE_SUCCESS,
@ -3956,6 +4100,10 @@ func ReqSetEmoji(player *Player, buf []byte) error {
})
return err
}
player.TeLog("set_emoji", map[string]interface{}{
"Id": int(req.Id),
"Type": int(req.Type),
})
player.PlayMod.save()
player.PushClientRes(&msg.ResSetEmoji{
Code: msg.RES_CODE_SUCCESS,
@ -4222,6 +4370,9 @@ func ReqAddNpc(player *Player, buf []byte) error {
PlayroomMod.AddRoomPointInvite()
PlayroomMod.AddRoomPointAdd()
PlayroomBackData(player)
player.TeLog("add_npc", map[string]interface{}{
"NpcId": int(req.NpcId),
})
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,
@ -4268,6 +4419,11 @@ func ReqAddWish(player *Player, buf []byte) error {
return err
}
}
player.TeLog("wish_add", map[string]interface{}{
"Id": int(req.Id),
"Type": int(req.Type),
"Items": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResAddWish{
Code: msg.RES_CODE_SUCCESS,
@ -4449,3 +4605,78 @@ func ReqId2Verify(player *Player, buf []byte) error {
})
return nil
}
func ReqFriendByCode(player *Player, buf []byte) error {
req := &msg.ReqFriendByCode{}
proto.Unmarshal(buf, req)
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(conf.Server.ServerID*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{}
proto.Unmarshal(buf, req)
Items := player.GetPlayroomGameReward(int(req.Type), int(req.SelectId))
player.PushClientRes(&msg.ResPlayroomGameShowReward{
Items: item.ItemToMsg(Items),
})
return nil
}
func ReqPlayroomGuide(player *Player, buf []byte) error {
req := &msg.ReqPlayroomGuide{}
proto.Unmarshal(buf, req)
PlayroomMod := player.PlayMod.getPlayroomMod()
err := PlayroomMod.Guide(int(req.Type))
if err != nil {
player.SendErrClienRes(&msg.ResPlayroomGuide{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("playroom_guide", map[string]interface{}{
"Physiology": req.Type,
})
player.PlayMod.save()
player.PushClientRes(PlayroomMod.NotifyMood())
player.PushClientRes(&msg.ResPlayroomGuide{
Code: msg.RES_CODE_SUCCESS,
})
return nil
}

View File

@ -28,7 +28,6 @@ const (
func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
MailMod := player.PlayMod.getMailMod()
BaseMod := player.PlayMod.getBaseMod()
TriggerMail := mailCfg.GetTriggerMail()
t := make([]*mailCfg.TriggerMail, 0)
for _, v := range TriggerMail {
@ -46,8 +45,8 @@ func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
tr := false
for _, v := range t {
if checkTriggerCondition(player, v.Trigger) {
Title := languageCfg.GetLanguage(BaseMod.Lang, v.Title)
Content := languageCfg.GetLanguage(BaseMod.Lang, v.Content)
Title := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, v.Title)
Content := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, v.Content)
TitleEn := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, v.Title)
ContentEn := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, v.Content)
MailMod.Send(Title, "", Content, TitleEn, "", ContentEn, v.Items, v.Type)

View File

@ -78,8 +78,9 @@ type ChargeExtra struct {
}
type GameResult struct {
t int // 游戏类型
r int // 1:赢 2:输 3:平
T int // 游戏类型
R int // 1:赢 2:输 3:平
Emoji int // 表情
}
func init() {
@ -88,4 +89,8 @@ func init() {
gob.Register(&msg.HandbookMsg{})
gob.Register(&limitedTimeEvent.CatTrick{})
gob.Register(&VarOpration{})
gob.Register(&VarUserData{})
gob.Register(&ActivityInfo{})
gob.Register(&ChargeExtra{})
gob.Register(&GameResult{})
}

View File

@ -25,9 +25,10 @@ const (
)
const (
VAR_OP_UPVOTE = 1
VAR_OP_CHIP = 2
VAR_OP_KISS = 3
VAR_OP_UPVOTE = 1
VAR_OP_CHIP = 2
VAR_OP_KISS = 3
VAR_OP_CHIP_SET = 4
)
func (f *VarMgr) Init() {

View File

@ -29,6 +29,11 @@ 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))
}
}()
if f, ok := AdminFuncMap[Func]; ok {
err := f(args)
if err != nil {
@ -96,11 +101,13 @@ func AdminPlayerInfo(args []interface{}) error {
req := &msg.ReqAdminInfo{}
proto.Unmarshal(buf, req)
player := G_GameLogicPtr.GetPlayer(req.Uid)
online := true
if player == nil {
player = new(Player)
player.M_DwUin = req.Uid
player.InitPlayerOnly()
player.ZeroUpdate(nil)
online = false
}
res := make(map[string]interface{})
res["Name"] = player.PlayMod.getBaseMod().NickName
@ -113,10 +120,16 @@ func AdminPlayerInfo(args []interface{}) error {
res["Energy"] = player.GetPlayerBaseMod().GetEnergy()
res["Diamond"] = player.GetPlayerBaseMod().GetDiamond()
res["Mac"] = player.GetPlayerBaseMod().GetName()
res["Login"] = player.GetPlayerBaseMod().Data.LoginTime
res["Login"] = player.PlayMod.getBaseMod().LoginTime
res["Cumulative"] = player.PlayMod.getBaseMod().Cumulative
res["RegisterTime"] = player.GetPlayerBaseMod().GetRegisterTime()
res["TodayCumulative"] = player.PlayMod.getBaseMod().TodayCumulative
if online {
res["Cumulative"] = int64(player.PlayMod.getBaseMod().Cumulative) + GoUtil.Now() - int64(player.PlayMod.getBaseMod().LoginTime)
res["TodayCumulative"] = int64(player.PlayMod.getBaseMod().TodayCumulative) + GoUtil.Now() - int64(player.PlayMod.getBaseMod().LoginTime)
}
res["Bonus"] = player.PlayMod.getLimitedTimeEventMod().Progress
res["Code"] = player.PlayMod.getBaseMod().AddCode
OrderMap := make(map[int]interface{})
Index := 0
for k, v := range player.PlayMod.getOrderMod().OrderList {

View File

@ -3,6 +3,7 @@ package base
import (
"fmt"
"server/GoUtil"
"server/conf"
baseCfg "server/conf/base"
"server/game/mod/item"
"server/msg"
@ -41,12 +42,21 @@ type Base struct {
Lang msg.LANG_TYPE // 语言
IdCardName string
IdCardNum string
AddCode string // 用于添加好友的code
}
func (b *Base) InitData(Uid int) {
// b.EnergyMul = 1
// b.IsFirstBuy = false
// b.EnergyBuy = 0
func (b *Base) InitData(Uid int, Ip string) {
if b.AddCode == "" && Ip != "" {
Code, _ := GoUtil.GetCountryByIP(Ip)
CountryCode := conf.Server.CountryCode
if CountryCode == "" {
CountryCode = "000"
}
if Code != "" && len(Code) == 3 {
CountryCode = Code
}
b.AddCode = fmt.Sprintf("MMM-%s-%s", CountryCode, GoUtil.UniqueStringFromInt(Uid))
}
if b.NickName == "" {
b.NickName = fmt.Sprintf("Player_%d", Uid)
}

View File

@ -435,21 +435,21 @@ func (cb *ChessBorad) PutChessInBag(Grid, ChessId, EmitId int) error {
return nil
}
func (cb *ChessBorad) TakeChessOutBag(Grid int) error {
func (cb *ChessBorad) TakeChessOutBag(Grid int) (int, error) {
if Grid < 0 {
cb.RemoveHonor(-Grid)
cb.AddChess(-Grid)
return nil
return 0, nil
}
GridInfo, ok := cb.ChessBag.List[Grid]
if !ok {
return errors.New("ChessBag Grid unlock")
return 0, errors.New("ChessBag Grid unlock")
}
if GridInfo.ChessId == 0 {
return errors.New("ChessBag Grid is empty")
return 0, errors.New("ChessBag Grid is empty")
}
cb.ChessBag.List[Grid] = ChessBagGrid{}
return cb.AddChess(GridInfo.ChessId)
return GridInfo.ChessId, cb.AddChess(GridInfo.ChessId)
}
func (cb *ChessBorad) GetOrderEmit() []int {

View File

@ -0,0 +1,66 @@
package compensation
import (
"server/GoUtil"
"server/game/mod/item"
)
type Compensation struct {
C20250716 bool // 2025年7月16日补偿
}
func (c *Compensation) InitData() {
}
func (c *Compensation) Is20250716() bool {
return c.C20250716
}
func (c *Compensation) Set20250716() {
c.C20250716 = true
}
func (c *Compensation) Compensation20250716(UserName string) []*item.Item {
c.Set20250716()
// 获取补偿物品
items := make([]*item.Item, 0, len(Compensation20250716_UserList))
for i := 1; i <= len(Compensation20250716_UserList); i++ {
if GoUtil.InStringArray(UserName, Compensation20250716_UserList[i]) {
return Compensation20250716_Mail_Item[i]
}
}
return items
}
var Compensation20250716_UserList = map[int][]string{
// 大R
1: {"xinshou76", "4920601d6e34e87038919438e242d52e", "93c80508360e35b7571f1a0a03f56a776370cfa0"},
// 中R
2: {"xinshou75", "9c65224bb7ed95148260db8f0fe3a0bd", "2efc5e0f7517c825cd7e4702085f885b", "b559595638f42a679284fef0374a549e", "26e701c36fbb004ee00dcccd9bd8cf0f", "51afdcc7d1b0d60044f3a33389f2c734", "ed0f5c193171226d343eae6996fa5ebf", "5c80e4c852b9a4cd1e28c6bcc04f308f", "48289bca7f497297b885203b2cc037bb", "5de84a24101ee25a3ac33168c8083abe", "a9264ed76dafbed52ed9e7afe63d4129", "051d7f087832091750d7d9cc00a5e04a", "04b4de4d67f2ed0399c6abffb956cade", "41c70beb9f22bada780feada5e62bbd1", "fc085d60508bc2e39fc51e5640d75516", "7c0fcfac6e9e8e056b983a30e4f30a09", "20d4b2aed241eda005679a1671bedeac", "857706a740154c8023ea9201d08b8864", "7f47313cd3dcd45a06ad985f2cb27cae", "057bf7221b86d61cce1f80558b929090", "95328e05928a61493c801e05e9e6270a", "491d7d28ce106938aee8b1e1a19b4ae5", "823943647d9adc4d8ddeb596614c0cfb", "d6ce7a43a045d4cd71dbc687787bd0bf", "c75a5faa056b819ad5bb41f4a3ba4a38", "e5815e97add54cb3ceca7dbd2e45bf97", "2cd42018cf56cb9d5a355aff14137b31", "820b48695d2dac1656a84d73e420178b", "2bf69272d55fb9d9d9e15894fb4694a4", "424ccad8b512d91d2f29c80939424564", "a51377da6a792ff69f6faf937e3417ce", "f5ff321d2b2c073e64042852a15dd9b1", "5d80e08adde8e9d59bc79501b16afe20", "53d8041da3964505857ddd1b3cdecf94", "0cc86c12b97d15019dfe25a3285a3e96", "235eb2c144e5b9edf6c44e8ab96082dd", "ed5bbc10a0fba93e591a35a2ec0291c5", "831ab28d8820675ad109c9b184ce9013", "445007c8ca0cc7a12d44d7abdff5cce3", "63f081723bd0e847d1434f5a04598683", "54e715c5c1f4ed795c9c17593de1b7e7", "addb314c66e16f13ddae30896b96c703", "6fc757735b67cf08a7a5ec3baf2a75a3", "2f50d795ddaab2eab1907b5f252705ac", "2137703e941d639f61aeded20f9dbb2b", "02439d94926af2d1473c75f74a00e119", "bd5f5f3e57bd3924e914cdbbc34cce5c", "ab5b80213f12aaaf6d07be2f1932ec43", "ceeb48146b3ebcad66a4cc036ed54d22", "a71625538207fa2b95bb9e8e21449c43", "a0ce6002bb25c2ae0f090a90018fc54c", "a3f5aef9e7dad7d5aa605a49430835b1", "1cf2a5325fa89bb9bb8be2c8616cb9d7", "b04b3963228f85182b6e62c3ef6d8144", "1e8dde7c182488128a5106c5e2d30b42", "71f91ead33b74f7d45be1e37c519286f", "dead5b7820a93351f2e97fe55c0ea5b4", "8732360803535d860fc16d7911c909a1", "7f957a374879d6a2fb635928ce89a525", "0d8ade527e8f3679392260d07b2912e5", "7bf0a3e6df56f0f209814f6547865f55", "d2438f28296a975d52b7d60d287e84ad", "6cafd1059a6c45a31f19f42ed092d633", "55655483cd1cce10b3461d947062f801", "08e04219504d9f37d32e2cfba2874762", "a3d83249211bc380a8ff97f8ab47583a", "c7b75f7ab09002bd245a6a182cbc18df", "d5ded02c0489e177e8f698e5204cfa3d", "e05933874f35069eb0632a433da36ca7", "684ad5e04c21c5a11ac77f2eda19847a", "bd269aa65aa8db830ecbba58bc64902d", "4ec2fd320c4c5ff36dc52fc88720b395", "863db41256074f9656ebbd46fbd85290", "411ca5c6b78844dea836aa399f42ed27", "f0cb8a1825c417e2f7b06a58cac75143", "fd9df16ee523e74d8003f46e47dcb642", "f4a9060aea89d38e2e3f01660491f5c5", "34ed9d69301c301953b2b88dcd13ee9a", "347376f2bf14f156e24fbc4a7285f81c", "dc264e609290d0f94f3e16ca37bbe0c9", "26347928b465b7ba373e9ba641b48199", "f29998d94e79b86c7c3d8937fa9e91e8", "d23081f6510236f4e4be9fb6d5304a6a", "e6718d5d9280570cc31d7a6473143e38", "8083f7ee7c1258aed3db5f40531c334c", "bcdd1c131475dcea35cab935057772eb", "eeb59425fc240ec52454e7dda9889633", "120e7116d570a2554b65f28e724ae758", "675899c81cfece5caa982844538b0191", "9a08781243dba23cbe85bf47c64aa8c4", "0bf5220563363300c6cf43ed20cb5ae7", "c071328705938dc141c8d646d345bf99", "659d71e3896f2f2c98c86c730d394f0b", "96fe50777f7562384e5d71eb010eae7c", "f621506531e0d8cf2bf343ec87042960", "38738aed39f8cea218bc055b5a400cc3", "970653b0d90e2fd43465f436c27845b5", "d7d93978b35d4af85daba89530bf668a", "5d50835ff8c5fdbecd4e92423b5754d3", "ee5648d165c5bab14896741b632b641b", "0b193cbcc1aa07dee619c5d74fdaf92e", "515701c302a9ac871e5b83af734cbdbc", "276c9182dd46575aeb66aac4cef03b7c", "464483a547102c193a44045c9e68fc54", "f421c2c4e1ef383e96df09476502bdaf", "b34e90cbbc0d6f9bf4d6ef80114c5b73", "7d204e48d8c2615c257c2520769fe6ca"},
// 未付费 18级以上
3: {"xinshou79", "8c22f4e8d8edb80d591e716cf016a01a", "ad154577c6ed0c1234c971931fe44353", "cd5fc4cfb76993f1fb62f430895805b5", "ce2107e0f2d5e7c8095928127da643e9", "d95d63f6cbafa348dca4398c61eb7edc", "3c62b0c0e554a16fc54bd9c09a6c76b7", "af31d50b8c98869e9fde4562de7e3b89", "8b3dd61d65a21da33efd3fb9b0a99b55", "0351a4df40069b71de39a9be8c46e705", "786bf20cb74a4e1b9ddfa3035c96aa34", "7b3a3e96d92b48e6fc7fb8dc54c6f177", "05442D5E8EF144F8", "huang015", "585797c5605a8ad80f677312f3c76d64", "acbe55ba2c95f1cb72f4ed4d598cb4b2", "8770ee5ad6e7180ca831f9b23ae0fb2a", "6dea915a82fed9186e6461d2ed2da2aa", "c6bcac871e44dca717c2fd6fab7480d0", "dc9904a54b46116e6534e2c91b8e5164", "dd59d0d8f0e1384e14635035cf17c668", "379a4d820d6e52a7cb781c8f2d7eef5d", "729b80c2155f49043b266744065b5941", "6b997d889562961b44d62bc3e99b8af5"},
// 未付费 7-17级
4: {"xinshou80", "764abc676187b5fb45cb2218b4076e32", "5c790273c5e51e9b8247f4614f6f4f1f", "bdcde03b4dc399118ce1e546690d8c61", "eaf25de5835afb920984eb09297103dd", "8b321645bb2df7ac618c085c849be2e6", "1f2066cb8fd35f6e8cc00c58f919f012", "f75ef1bf55789c8851338712aa1a3c25", "ac5d178c66ddaad2b04d82183dc902f7", "9baad73794e1e7f6f7284cb3fe679160", "20d207e40820d7879baa0781294ff021", "507416eb227f7f012a728f190537530b", "32beaaad0fa90c6dcafc456663d9d417", "7e4dcb931c89033cceac11a1b24b7d45", "b33892d661937e3bd1c3be62120fbf51", "7aed3a3c4703bf898bc20c360f38d09d", "172a008cab6d3606962bcb7add5b1553", "e838a9130e0bf7e0e2680eb825c0ff5a", "167d1a2c6944c65be30c2feb43bdedea", "fcf00eb8002da8ddc6cc72b9de48de55", "3edb0a525ae8a708d12ce15e8d606351", "2901b8332f6a39785194f52dbdecb420", "8efb7602f08d08351798e60791926d79", "8664fc8e96eea3cff44be59a72980635", "a40fedab76a2912bd896fcd8048a3842", "99c592a99716450e59a910d6c5192c7f", "bc3c3b7ca9e5de311ed337d6c3d617c6", "b12acbb51580947a7c1869070dea0d75", "c0ad232262fb2b912ade9aa1412e5406", "0f7e7c8a43f8f502356329ca4fe01a8d", "1eb7a5f2f9390a36b92488645baa6544", "0d56e34bac14cd02ecf98e880234485b", "cf9152a0206da604126c848e3abe3173", "d6c787411fc914c546092a6a6ee33873", "5c427a9e417dea683874bb9117a83899", "3eafdc409abd63f6fa40fcee615bb886", "ea224eb2ab657afe381535c8935b58dd", "717810be22b82f567e14f00c6eecdae7", "f38ce2b02121c800395a19e28174d3b4", "fcd7bce06319b6a590e04baca8958260", "4c5aca1ed18bd529e92792cc9e82d659", "6695418802da285c421eafc09c48256b", "fcb93bd158d212ec031b6f1ae05ab724", "b701386139828ec8f3a3db11731b0f81", "915d608525150d974f7f85bdf0f7b4e1", "0b2244d9b6c01cbb0daf685080d6d975"},
}
var Compensation20250716_Mail_Item = map[int][]*item.Item{
1: {item.NewItem(item.ITEM_DIAMOND_ID, 500), item.NewItem(item.ITEM_ENERGY_ID, 5000)}, // 大R
2: {item.NewItem(item.ITEM_DIAMOND_ID, 200), item.NewItem(item.ITEM_ENERGY_ID, 3000)}, // 中R
3: {item.NewItem(item.ITEM_DIAMOND_ID, 100), item.NewItem(item.ITEM_ENERGY_ID, 1500)}, // 未付费 18级以上
4: {item.NewItem(item.ITEM_ENERGY_ID, 500)}, // 未付费 7-17级
}
type MailConfig struct {
Title string
Content string
Items []*item.Item
}
var Compensation20250716_Mail_Config = MailConfig{
Title: "Update Issue reply",
Content: `Dear players, sorry about the update issues due to our release process and strategy changessome even lost data. We take this issue very seriously.
We truly appreciate your support, so we've prepared a special compensation just for you. Please check it
We're already working on fixing things to make future updates smoother and more stable.
Thanks again for sticking with us. Enjoy your game! `,
}

View File

@ -62,7 +62,8 @@ type MoneyCat struct {
}
type LuckyCat struct {
Earnings int
Earnings int
MaxEarings int
}
type CatTrick struct {
@ -475,8 +476,10 @@ func initEventInfo(E *LTEInfo, EventType int) {
Mul: 1.1,
}
case EVENT_TYPE_LUCKY_CAT:
MaxEarning := limitedTimeEventCfg.GetLuckyCatMaxEarning(int(E.Remian))
E.D = &LuckyCat{
Earnings: 0,
Earnings: 0,
MaxEarings: MaxEarning,
}
case EVENT_TYPE_PAYBACK_DAY:
@ -504,6 +507,10 @@ func addEventInfo(E *LTEInfo, EventType, Duration int) {
Id: len(d.List) + 1,
Type: limitedTimeEventCfg.GetCatTrickType(Duration),
})
case EVENT_TYPE_LUCKY_CAT:
MaxEarning := limitedTimeEventCfg.GetLuckyCatMaxEarning(Duration)
d := E.D.(*LuckyCat)
d.MaxEarings += MaxEarning
case EVENT_TYPE_PAYBACK_DAY:
d := E.D.(*PaybackDay)
d.count += limitedTimeEventCfg.GetPaybackDay()
@ -524,6 +531,9 @@ func getLimitEventMsg(t int, e *LTEInfo) *msg.LimitEvent {
d := e.D.(*MoneyCat)
Cd = int(d.EndTime)
Mul = d.Mul
case EVENT_TYPE_LUCKY_CAT:
d := e.D.(*LuckyCat)
Param[msg.LimitEventParam_LUCKY_CAT_EARNINGS.String()] = int32(d.MaxEarings)
case EVENT_TYPE_CAT_TRICK:
d := e.D.(*CatTrick)
Energy := d.Energy

View File

@ -45,6 +45,37 @@ func (m *MailMod) InitData() {
}
}
type MailStruct struct {
Title string
SubTitle string
Content string
TitleEn string
SubTitleEn string
ContentEn string
Items []*item.Item
Type int
}
func (m *MailMod) SendMail(mail *MailStruct) int {
if mail == nil {
return 0
}
m.AutoId++
m.List[m.AutoId] = &MailInfo{
Title: mail.Title,
SubTitle: mail.SubTitle,
Content: mail.Content,
TitleEn: mail.TitleEn,
SubTitleEn: mail.SubTitleEn,
ContentEn: mail.ContentEn,
Items: mail.Items,
Send: GoUtil.Now(),
Type: mail.Type,
Status: MAIL_STATUS_IDLE,
}
return m.AutoId
}
// 发送邮件
func (m *MailMod) Send(Title, SubTitle, Content, TitleEn, SubTitleEn, ContentEn string, Items []*item.Item, t int) int {
m.AutoId++

View File

@ -65,8 +65,9 @@ func (p *PiggyBankMod) Trigger() {
if p.EndTime < Now {
return
}
min, max := chargeCfg.GetPiggyRandDia()
p.Diamond += GoUtil.RandNum(min, max)
minDia, maxDia := chargeCfg.GetPiggyRandDia()
p.Diamond += GoUtil.RandNum(minDia, maxDia)
p.Diamond = min(p.Diamond, chargeCfg.GetPiggyMaxDia())
}
func (p *PiggyBankMod) BackData() *msg.ResPiggyBank {

View File

@ -98,8 +98,9 @@ const (
)
type ChipInfo struct {
Uid int
Time int64
Uid int
Time int64
Emoji int
}
type Mood struct {
@ -327,11 +328,11 @@ func (p *PlayroomMod) GetChip() int {
return len(p.ChipList)
}
func (p *PlayroomMod) AddChip(Uid int, Time int64) {
func (p *PlayroomMod) AddChip(Uid int, Time int64, Emoji int) {
if len(p.ChipList) >= playroomCfg.GetChipNum() {
return
}
p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time})
p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time, Emoji: Emoji})
p.RevengeUid = int64(Uid)
}
@ -898,3 +899,11 @@ func (p *PlayroomMod) BackDataTask() []*msg.DailyTask {
})
return DailyTask
}
func (p *PlayroomMod) Guide(Type int) error {
if _, ok := p.Physiology[Type]; !ok {
return fmt.Errorf("Guide Type is not ok")
}
p.Physiology[Type].Num = 0
return nil
}

File diff suppressed because it is too large Load Diff