Merge branch 'sdk' into online

This commit is contained in:
hahwu 2025-10-30 19:36:36 +08:00
commit 8fce417c9a
27 changed files with 3348 additions and 1587 deletions

View File

@ -12,6 +12,7 @@ func init() {
type ClusterJoinData struct { type ClusterJoinData struct {
ServerId int ServerId int
Country int
RemoteAddr string RemoteAddr string
} }

View File

@ -90,3 +90,18 @@ func GetRankReward(Rank int) []*item.Item {
} }
return nil return nil
} }
func GetMaxRewardId() int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
return 0
}
MaxId := 0
for k := range data {
Id := GoUtil.Int(k)
if Id > MaxId {
MaxId = Id
}
}
return MaxId
}

View File

@ -47,6 +47,14 @@ func GetADReward(ChargeId int) ([]*item.Item, int) {
return nil, 0 return nil, 0
} }
func GetWeeklyDiscountDay() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_day")
if err != nil {
return -1
}
return gamedata.GetIntValue(data, "Value")
}
func GetMoneyCharge(ChargeId int) float64 { func GetMoneyCharge(ChargeId int) float64 {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId) data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil { if err != nil {
@ -81,6 +89,41 @@ func GetEnergyShopId(ChargeId int) int {
return 0 return 0
} }
func GetWeeklyInfo(Pos int) (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
return 0, 0
}
r := data["Value"].([]interface{})
for _, v := range r {
v1 := v.(map[string]interface{})
Id := GoUtil.Int(v1["Id"])
if Id == Pos {
return GoUtil.Int(v1["Discount"]), GoUtil.Int(v1["Limit"])
}
}
return 0, 0
}
func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
return nil
}
r := data["Value"].([]interface{})
res := make(map[int]gamedata.WeeklyDiscountInfo)
for _, v := range r {
v1 := v.(map[string]interface{})
Id := GoUtil.Int(v1["Id"])
res[Id] = gamedata.WeeklyDiscountInfo{
Id: GoUtil.Int(v1["Id"]),
Discount: GoUtil.Int(v1["Discount"]),
WeeklyLimit: GoUtil.Int(v1["Limit"]),
}
}
return res
}
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item { func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
data, err := gamedata.GetData(CFG_ENERGY_SHOP) data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil { if err != nil {
@ -291,3 +334,16 @@ func GetPetCoinShopReward(ChargeId int) []*item.Item {
} }
return nil return nil
} }
func GetWeeklyDiscountStartEnd() (int64, int64) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_time")
if err != nil {
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.ParseTime(strArr[0]), GoUtil.ParseTime(strArr[1])
}

View File

@ -0,0 +1,122 @@
package passCfg
import (
"server/game/mod/item"
"server/gamedata"
"slices"
)
const (
CFG_PASS_TEMPLATE = "PassTemplate"
CFG_PASS = "Pass"
)
func init() {
gamedata.InitCfg(CFG_PASS_TEMPLATE)
gamedata.InitCfg(CFG_PASS)
}
func GetTemplate(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetLowChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LowChargeId")
}
func GetHighChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "HighChargeId")
}
func GetNewLevel(Template int, Score int, Reward []int) []int {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
NewReward := make([]int, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
LevelScore := gamedata.GetIntValue(v, "TotalScore")
Index := gamedata.GetIntValue(v, "Level")
if Score >= LevelScore && !slices.Contains(Reward, Index) {
NewReward = append(NewReward, Index)
}
}
return NewReward
}
func GetFreeChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "FreeReward")...)
}
}
return Items
}
func GetLowChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "LowReward")...)
}
}
return Items
}
func GetHighChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "HighReward")...)
}
}
return Items
}

View File

@ -40,12 +40,33 @@ func init() {
gamedata.InitCfg(CFG_PLAYROOM_ORDERITEM) gamedata.InitCfg(CFG_PLAYROOM_ORDERITEM)
} }
func GetShopItem(Id int) (int, []*item.Item) { func GetShopItem(Id int) (int, []*item.Item, int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id) data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil { if err != nil {
return 0, nil return 0, nil, 0, 0
} }
return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost") return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Discount"), gamedata.GetIntValue(data, "Limit")
}
func GetShopWeeklyLimit() map[int]gamedata.WeeklyDiscountInfo {
r := make(map[int]gamedata.WeeklyDiscountInfo)
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
if err != nil {
return r
}
for k, v := range data {
Id := GoUtil.Int(k)
Limit := gamedata.GetIntValue(v, "Limit")
if Limit == 0 {
continue
}
r[Id] = gamedata.WeeklyDiscountInfo{
Id: Id,
Discount: gamedata.GetIntValue(v, "Discount"),
WeeklyLimit: Limit,
}
}
return r
} }
func GetShopWish(Id int) int { func GetShopWish(Id int) int {

View File

@ -7,6 +7,7 @@ import (
itemCfg "server/conf/item" itemCfg "server/conf/item"
mailCfg "server/conf/mail" mailCfg "server/conf/mail"
miningCfg "server/conf/mining" miningCfg "server/conf/mining"
passCfg "server/conf/pass"
raceCfg "server/conf/race" raceCfg "server/conf/race"
"server/game/mod/activity" "server/game/mod/activity"
"server/game/mod/item" "server/game/mod/item"
@ -26,7 +27,7 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId) ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 { if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum) ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId) SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
} }
} }
// 猜颜色 // 猜颜色
@ -38,7 +39,7 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId) ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 { if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum) ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId) SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
} }
} }
@ -51,22 +52,38 @@ func ActivityLogin(p *Player) {
ItemNum := ItemMod.GetItem(ItemId) ItemNum := ItemMod.GetItem(ItemId)
if ItemNum != 0 { if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum) ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId) SendActivityMail(p, ItemId, ItemNum, ActivityId, nil)
}
}
// 通行证
ActivityId = GetActivityId(p, activity.ACT_TYPE_PASS)
PassMod := p.PlayMod.getPassMod()
OldId = PassMod.Login(ActivityId)
if OldId != 0 {
ItemId := passCfg.GetActivityItemId(OldId)
ItemNum := PassMod.Num
RewardItems, _ := PassMod.GetRewardItems()
if ItemNum != 0 {
ItemMod.AddItem(ItemId, -ItemNum)
SendActivityMail(p, ItemId, ItemNum, ActivityId, RewardItems)
} }
} }
} }
func SendActivityMail(p *Player, ItemId, ItemNum, ActivityId int) { func SendActivityMail(p *Player, ItemId, ItemNum, ActivityId int, RewardItems []*item.Item) {
MailMod := p.PlayMod.getMailMod() MailMod := p.PlayMod.getMailMod()
ItemName, ItemNameEn := itemCfg.GetItemName(ItemId) ItemName, ItemNameEn := itemCfg.GetItemName(ItemId)
ActivityTitle, ActivityTitleEn := activityCfg.GetActivityTitle(ActivityId) ActivityTitle, ActivityTitleEn := activityCfg.GetActivityTitle(ActivityId)
mt, mc, mt_en, mc_en := mailCfg.GetRecallMail(ActivityTitle, ActivityTitleEn, ItemName, ItemNameEn) mt, mc, mt_en, mc_en := mailCfg.GetRecallMail(ActivityTitle, ActivityTitleEn, ItemName, ItemNameEn)
Items := []*item.Item{item.NewItem(ItemId, ItemNum)} Items := []*item.Item{item.NewItem(ItemId, ItemNum)}
Items = append(Items, RewardItems...)
MailMod.Send(mt, "", mc, mt_en, "", mc_en, Items, mail.MAIL_TYPE_NORMAL) MailMod.Send(mt, "", mc, mt_en, "", mc_en, Items, mail.MAIL_TYPE_NORMAL)
} }
// 活动模块 零点更新 // 活动模块 零点更新
func ActivityZeroUpdate(p *Player) { func ActivityZeroUpdate(p *Player) {
ActivityLogin(p)
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING) ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_MINING)
if ActivityInfo != nil { if ActivityInfo != nil {
MiningMod := p.PlayMod.getMiningMod() MiningMod := p.PlayMod.getMiningMod()
@ -114,16 +131,16 @@ func GetActivityInfoById(p *Player, Id int) *ActivityInfo {
func GetActivityStatus(p *Player, actType int) int { func GetActivityStatus(p *Player, actType int) int {
ActivityInfo := GetActivityInfo(p, actType) ActivityInfo := GetActivityInfo(p, actType)
if ActivityInfo == nil { if ActivityInfo == nil {
return 0 return ACT_STATUS_NOT_START
} }
Now := GoUtil.Now() Now := GoUtil.Now()
if Now < ActivityInfo.StartT { if Now < ActivityInfo.StartT {
return 0 return ACT_STATUS_NOT_START
} }
if Now > ActivityInfo.EndT { if Now > ActivityInfo.EndT {
return 2 return ACT_STATUS_END
} }
return 1 return ACT_STATUS_START
} }
func MiningBackData(p *Player) { func MiningBackData(p *Player) {
@ -218,6 +235,26 @@ func RedBackData(p *Player) {
p.PushClientRes(&msg.ResActRed{Red: result}) p.PushClientRes(&msg.ResActRed{Red: result})
} }
func ActPassBackData(p *Player) {
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
return
}
Status := GetActivityStatus(p, activity.ACT_TYPE_PASS)
Template := passCfg.GetTemplate(ActivityInfo.Id)
PassMod := p.PlayMod.getPassMod()
p.PushClientRes(&msg.ResActPass{
Id: int32(ActivityInfo.Id),
Status: int32(Status),
Template: int32(Template),
EndTime: int32(ActivityInfo.EndT),
LowPass: PassMod.LowPass > 0,
HighPass: PassMod.HighPass > 0,
Score: int32(PassMod.Num),
Reward: GoUtil.IntToInt32(PassMod.Reward),
})
}
func GetActivityItem(p *Player, ActType []int) []*item.Item { func GetActivityItem(p *Player, ActType []int) []*item.Item {
Items := make([]*item.Item, 0) Items := make([]*item.Item, 0)
for _, v := range ActType { for _, v := range ActType {
@ -240,6 +277,10 @@ func GetActivityItem(p *Player, ActType []int) []*item.Item {
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)
case activity.ACT_TYPE_PASS:
ItemId := passCfg.GetActivityItemId(ActivityInfo.Id)
Item := item.NewItem(ItemId, 1)
Items = append(Items, Item)
} }
} }
return Items return Items

View File

@ -3,6 +3,8 @@ package game
import ( import (
"server/GoUtil" "server/GoUtil"
activityCfg "server/conf/activity" activityCfg "server/conf/activity"
passCfg "server/conf/pass"
"server/game/mod/activity"
"server/game/mod/item" "server/game/mod/item"
MsgMod "server/game/mod/msg" MsgMod "server/game/mod/msg"
"server/game/mod/piggyBank" "server/game/mod/piggyBank"
@ -18,6 +20,7 @@ func Charge(p *Player, ChargeId int) {
PlayroomFire(p, ChargeId) // 游乐场 PlayroomFire(p, ChargeId) // 游乐场
ActivityFire(p, ChargeId) // 活动礼包 ActivityFire(p, ChargeId) // 活动礼包
ADPetWorkFire(p, ChargeId) // 广告宠物工作 ADPetWorkFire(p, ChargeId) // 广告宠物工作
PassFire(p, ChargeId)
OrderMod := p.PlayMod.getOrderMod() OrderMod := p.PlayMod.getOrderMod()
OrderMod.SetIsCharge() // 设置订单模块为充值状态 OrderMod.SetIsCharge() // 设置订单模块为充值状态
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PURCHASE, A: []interface{}{}}) p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PURCHASE, A: []interface{}{}})
@ -36,13 +39,12 @@ func SendCharge(p *Player, d *ChargeExtra) {
func ADPetWorkFire(p *Player, ChargeId int) { func ADPetWorkFire(p *Player, ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod() ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.FireAdReward(ChargeId) Item := ChargeMod.FireAdReward(ChargeId)
if Item == nil { if Item != nil {
return err := p.HandleItem(Item, msg.ITEM_POP_LABEL_ActivityGift.String())
} if err != nil {
err := p.HandleItem(Item, msg.ITEM_POP_LABEL_ActivityGift.String()) log.Debug("ChargeFire err : %s", err)
if err != nil { return
log.Debug("ChargeFire err : %s", err) }
return
} }
p.PlayMod.save() p.PlayMod.save()
p.PushClientRes(ChargeMod.BackData()) p.PushClientRes(ChargeMod.BackData())
@ -74,6 +76,36 @@ func ActivityFire(p *Player, ChargeId int) {
p.BackDataActivity() p.BackDataActivity()
} }
func PassFire(p *Player, ChargeId int) {
ActivityStatus := GetActivityStatus(p, activity.ACT_TYPE_PASS)
if ActivityStatus != ACT_STATUS_START {
return
}
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
return
}
LowChargeId := passCfg.GetLowChargeId(ActivityInfo.Id)
PassMod := p.PlayMod.getPassMod()
Items := []*item.Item{}
if ChargeId == LowChargeId {
Items = PassMod.GetLowChargeItems()
}
HighChargeId := passCfg.GetHighChargeId(ActivityInfo.Id)
if ChargeId == HighChargeId {
Items = PassMod.GetHighChargeItems()
}
if len(Items) == 0 {
return
}
err := p.HandleItem(Items, msg.ITEM_POP_LABEL_PassCharge.String())
if err != nil {
log.Debug("PassFire err : %s", err)
return
}
p.PlayMod.save()
}
func PlayroomFire(p *Player, ChargeId int) { func PlayroomFire(p *Player, ChargeId int) {
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
Item := PlayroomMod.Fire(ChargeId) Item := PlayroomMod.Fire(ChargeId)

View File

@ -143,7 +143,6 @@ func (gl *GameLogic) OpenTimestampTick() {
gl.NoonFlush() gl.NoonFlush()
}) })
//gl.CreateDailyLogFile() //gl.CreateDailyLogFile()
go func() { go func() {
for k := range gl.Mdispatr.ChanTimer { for k := range gl.Mdispatr.ChanTimer {
k.Cb() k.Cb()
@ -478,6 +477,43 @@ func (ad *GameLogic) GetResSimplePlayerByUid(Id int) *msg.ResPlayerSimple {
} }
} }
func (ad *GameLogic) GetResFriendPlayerByUid(Id int) *msg.ResFriendPlayerSimple {
Idstr := strconv.Itoa(Id)
Value, _ := db.RedisGetKey(Idstr)
player := &PlayerSimpleData{}
player.Uid = Id
if Value == "" {
p := new(Player)
err := p.GetSimpleData(Id, player)
if err != nil {
return nil
}
value, _ := json.Marshal(player)
db.RedisSetKey(Idstr, string(value), 0)
} else {
err := json.Unmarshal([]byte(Value), player)
if err != nil {
return nil
}
}
return &msg.ResFriendPlayerSimple{
Uid: int64(player.Uid),
Name: player.Name,
Level: int32(player.Level),
Avatar: int32(player.Avatar),
Face: int32(player.Face),
Decorate: int32(player.Decorate),
Login: int32(player.Login),
Loginout: int32(player.Loginout),
Emoji: GoUtil.MapIntToInt32(player.Emoji),
Facebook: player.FaceBook,
Playroom: GoUtil.MapIntToInt32(player.Playroom),
DressSet: GoUtil.MapIntToInt32(player.DressSet),
Friend: GoUtil.IntToInt32(player.Friend),
Physiology: GoUtil.MapIntToInt32(player.Physiology),
}
}
// 初始化服务器协程 // 初始化服务器协程
func G_getGameLogic() *GameLogic { func G_getGameLogic() *GameLogic {
if !isInitGameLogic { if !isInitGameLogic {
@ -670,6 +706,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqRemoveAd", ReqRemoveAdFunc) RegisterMsgProcessFunc("ReqRemoveAd", ReqRemoveAdFunc)
RegisterMsgProcessFunc("ReqPlayerBriefProfileData", ReqPlayerBriefProfileDataFunc) RegisterMsgProcessFunc("ReqPlayerBriefProfileData", ReqPlayerBriefProfileDataFunc)
RegisterMsgProcessFunc("ReqFriendPlayerSimple", ReqFriendPlayerSimple)
// RegisterMsgProcessFunc("ReqOfflineReconnect", ReqOfflineReconnectFunc) // RegisterMsgProcessFunc("ReqOfflineReconnect", ReqOfflineReconnectFunc)
RegisterMsgProcessFunc("ReqPlayerAsset", ReqPlayerAsset) RegisterMsgProcessFunc("ReqPlayerAsset", ReqPlayerAsset)
RegisterMsgProcessFunc("ReqId2Verify", ReqId2Verify) // 身份证验证 RegisterMsgProcessFunc("ReqId2Verify", ReqId2Verify) // 身份证验证
@ -851,6 +888,9 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqCatnipPlay", ReqCatnipPlay) // 猫草大作战游戏转盘 RegisterMsgProcessFunc("ReqCatnipPlay", ReqCatnipPlay) // 猫草大作战游戏转盘
RegisterMsgProcessFunc("ReqCatnipReward", ReqCatnipReward) // 猫草大作战领取奖励 RegisterMsgProcessFunc("ReqCatnipReward", ReqCatnipReward) // 猫草大作战领取奖励
RegisterMsgProcessFunc("ReqCatnipGrandReward", ReqCatnipGrandReward) // 猫草大作战领取大奖 RegisterMsgProcessFunc("ReqCatnipGrandReward", ReqCatnipGrandReward) // 猫草大作战领取大奖
// 活动通行证
RegisterMsgProcessFunc("ReqActPass", ReqActPass) // 请求活动通行证数据
RegisterMsgProcessFunc("ReqActPassReward", ReqActPassReward) // 领取活动通行证奖励
// #region playroom // #region playroom
RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据 RegisterMsgProcessFunc("ReqPlayroom", ReqPlayroom) // 请求playroom数据
RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息 RegisterMsgProcessFunc("ReqPlayroomInfo", ReqPlayroomInfo) // 请求playroom拜访信息

View File

@ -17,6 +17,7 @@ import (
"server/game/mod/activity" "server/game/mod/activity"
"server/game/mod/avatar" "server/game/mod/avatar"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/chess"
"server/game/mod/decorate" "server/game/mod/decorate"
"server/game/mod/emoji" "server/game/mod/emoji"
"server/game/mod/face" "server/game/mod/face"
@ -146,6 +147,24 @@ func ReqGmCommand_(player *Player, Command string) error {
"PayTime": GoUtil.Now(), "PayTime": GoUtil.Now(),
}) })
Charge(player, ChargeId) Charge(player, ChargeId)
case "AddPart":
ChessMod := player.PlayMod.getChessMod()
ChessMod.PartBag.List[1505] = chess.PartBagGrid{
Num: 10000,
PartId: 1505,
}
ChessMod.PartBag.List[1515] = chess.PartBagGrid{
Num: 10000,
PartId: 1515,
}
ChessMod.PartBag.List[1525] = chess.PartBagGrid{
Num: 10000,
PartId: 1525,
}
ChessMod.PartBag.List[1535] = chess.PartBagGrid{
Num: 10000,
PartId: 1535,
}
case "AllFace": case "AllFace":
Now := GoUtil.Now() Now := GoUtil.Now()
FaceMod := player.PlayMod.getFaceMod() FaceMod := player.PlayMod.getFaceMod()
@ -507,6 +526,13 @@ func ReqGmCommand_(player *Player, Command string) error {
case "resetCompensation": case "resetCompensation":
compensationMod := player.PlayMod.getCompensationMod() compensationMod := player.PlayMod.getCompensationMod()
compensationMod.C20250910 = false compensationMod.C20250910 = false
case "resetWeekly":
ChargeMod := player.PlayMod.getChargeMod()
ChargeMod.WeeklyDiscount = make(map[int]int)
player.PushClientRes(ChargeMod.BackData())
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.WeeklyDiscount = make(map[int]int)
PlayroomBackData(player)
case "resetCode": case "resetCode":
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid))) BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))

View File

@ -12,6 +12,7 @@ import (
"server/GoUtil" "server/GoUtil"
activityCfg "server/conf/activity" activityCfg "server/conf/activity"
cardCfg "server/conf/card" cardCfg "server/conf/card"
chargeCfg "server/conf/charge"
guesscolorCfg "server/conf/guessColor" guesscolorCfg "server/conf/guessColor"
itemCfg "server/conf/item" itemCfg "server/conf/item"
limitedTimeEventCfg "server/conf/limitedTimeEvent" limitedTimeEventCfg "server/conf/limitedTimeEvent"
@ -20,6 +21,7 @@ import (
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
"server/db" "server/db"
"server/game/mod/activity" "server/game/mod/activity"
"server/game/mod/friend"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/limitedTimeEvent" "server/game/mod/limitedTimeEvent"
MsgMod "server/game/mod/msg" MsgMod "server/game/mod/msg"
@ -379,6 +381,7 @@ func (p *Player) Login() {
LimitedTimePiggyBankTrigger(p) LimitedTimePiggyBankTrigger(p)
BaseMod := p.PlayMod.getBaseMod() BaseMod := p.PlayMod.getBaseMod()
FaceMod := p.PlayMod.getFaceMod() FaceMod := p.PlayMod.getFaceMod()
ChargeMod := p.PlayMod.getChargeMod()
AvatarMod := p.PlayMod.getAvatarMod() AvatarMod := p.PlayMod.getAvatarMod()
PlayBaseMod := p.GetPlayerBaseMod() PlayBaseMod := p.GetPlayerBaseMod()
GuideTaskMod := p.PlayMod.getGuideTaskMod() GuideTaskMod := p.PlayMod.getGuideTaskMod()
@ -389,13 +392,31 @@ func (p *Player) Login() {
ActivityLogin(p) // 活动登录 ActivityLogin(p) // 活动登录
p.Compensation() p.Compensation()
SyncMailMsg(p) // 同步邮件 SyncMailMsg(p) // 同步邮件
BaseMod.Login() Duration := BaseMod.Login()
ChargeMod.Login(Duration)
GuideTaskMod.Login() GuideTaskMod.Login()
FaceMod.Login(PlayBaseMod.GetRegisterTime()) FaceMod.Login(PlayBaseMod.GetRegisterTime())
AvatarMod.Login(PlayBaseMod.GetRegisterTime()) AvatarMod.Login(PlayBaseMod.GetRegisterTime())
HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime) HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String()) p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
LoignBack(p) // 登录补发 // 每周优惠特殊处理
WeeklyStartTime, WeeklyEndTime := chargeCfg.GetWeeklyDiscountStartEnd()
now := GoUtil.Now()
if now >= WeeklyStartTime && now <= WeeklyEndTime {
ChargeMod.WeeklyEndTime = WeeklyEndTime
}
if WeeklyStartTime > now {
go func() {
time.Sleep(time.Duration(WeeklyStartTime-now) * time.Second)
ChargeMod.WeeklyEndTime = WeeklyEndTime
p.PushClientRes(ChargeMod.BackData())
PlayroomBackData(p)
}()
}
if Duration > 604800 {
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_LOST_USER_RETURN, "")
}
} }
func (p *Player) Outline() { func (p *Player) Outline() {
@ -677,6 +698,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
"avatar_id": Effect[0], "avatar_id": Effect[0],
"income_from": Label, "income_from": Label,
}) })
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_NEW_AVATAR_FRAME, "")
p.PlayerDecoLog("avatar", Effect[0], Label) p.PlayerDecoLog("avatar", Effect[0], Label)
BackDataType[item.ITEM_TYPE_AVATAR] = struct{}{} BackDataType[item.ITEM_TYPE_AVATAR] = struct{}{}
case item.ITEM_TYPE_EMOJI: // 表情 case item.ITEM_TYPE_EMOJI: // 表情
@ -686,6 +709,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
"emoji_id": Effect[0], "emoji_id": Effect[0],
"income_from": Label, "income_from": Label,
}) })
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_NEW_EMOTION, "")
p.PlayerDecoLog("emoji", Effect[0], Label) p.PlayerDecoLog("emoji", Effect[0], Label)
BackDataType[item.ITEM_TYPE_EMOJI] = struct{}{} BackDataType[item.ITEM_TYPE_EMOJI] = struct{}{}
case item.ITEM_TYPE_FACE: // 头像 case item.ITEM_TYPE_FACE: // 头像
@ -695,6 +720,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
"face_id": Effect[0], "face_id": Effect[0],
"income_from": Label, "income_from": Label,
}) })
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_NEW_AVATAR, "")
p.PlayerDecoLog("face", Effect[0], Label) p.PlayerDecoLog("face", Effect[0], Label)
BackDataType[item.ITEM_TYPE_FACE] = struct{}{} BackDataType[item.ITEM_TYPE_FACE] = struct{}{}
case item.ITEM_TYPE_ACTIVITY_RACE: // 活动竞速 case item.ITEM_TYPE_ACTIVITY_RACE: // 活动竞速
@ -718,6 +745,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
PlayroomMod.AddCollect(Effect, Label) PlayroomMod.AddCollect(Effect, Label)
BackDataType[item.ITEM_TYPE_PLAYROOM_DECORATION] = struct{}{} BackDataType[item.ITEM_TYPE_PLAYROOM_DECORATION] = struct{}{}
Type, Name := playroomCfg.GetDecoInfo(Effect) Type, Name := playroomCfg.GetDecoInfo(Effect)
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_NEW_DECORATION, "")
p.TeLog("room_deco_get", map[string]interface{}{ p.TeLog("room_deco_get", map[string]interface{}{
"room_deco_type": Type, "room_deco_type": Type,
"room_deco_name": Name, "room_deco_name": Name,
@ -730,6 +759,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS] = struct{}{} BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS] = struct{}{}
Type := playroomCfg.GetDressPart(Effect) Type := playroomCfg.GetDressPart(Effect)
Name := playroomCfg.GetDressName(Effect) Name := playroomCfg.GetDressName(Effect)
FriendMod := p.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_NEW_COSTUME, "")
p.TeLog("pet_deco_get", map[string]interface{}{ p.TeLog("pet_deco_get", map[string]interface{}{
"pet_deco_type": Type, "pet_deco_type": Type,
"pet_deco_name": Name, "pet_deco_name": Name,
@ -768,6 +799,14 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
}) })
} }
BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS_SET] = struct{}{} BackDataType[item.ITEM_TYPE_PLAYROOM_DRESS_SET] = struct{}{}
case item.ITEM_TYPE_ACT_PASS: // 活动通行证
ActivityInfo := GetActivityInfo(p, activity.ACT_TYPE_PASS)
if ActivityInfo == nil {
continue
}
PassMod := p.PlayMod.getPassMod()
PassMod.AddExp(v.Num)
ActPassBackData(p)
default: default:
err := ItemMod.AddItem(v.Id, v.Num) err := ItemMod.AddItem(v.Id, v.Num)
p.TeLog("asset_change", map[string]interface{}{ p.TeLog("asset_change", map[string]interface{}{
@ -833,6 +872,7 @@ func (p *Player) LoginBackData() {
p.PushClientRes(p.PlayMod.mod_list.SevenLogin.BackData()) p.PushClientRes(p.PlayMod.mod_list.SevenLogin.BackData())
p.PushClientRes(p.PlayMod.mod_list.LimitedTimeEvent.ProgressBackData()) p.PushClientRes(p.PlayMod.mod_list.LimitedTimeEvent.ProgressBackData())
p.PushClientRes(p.PlayMod.mod_list.Charge.BackData()) p.PushClientRes(p.PlayMod.mod_list.Charge.BackData())
p.PushClientRes(p.PlayMod.mod_list.Charge.PetWorkBackData())
p.PushClientRes(p.PlayMod.mod_list.Endless.BackData()) p.PushClientRes(p.PlayMod.mod_list.Endless.BackData())
p.PushClientRes(p.PlayMod.mod_list.PiggyBank.BackData()) p.PushClientRes(p.PlayMod.mod_list.PiggyBank.BackData())
p.PushClientRes(p.PlayMod.mod_list.Item.BackData()) p.PushClientRes(p.PlayMod.mod_list.Item.BackData())
@ -928,6 +968,8 @@ func (p *Player) UpdateUserInfo() {
simple.Upvote = p.PlayMod.getPlayroomMod().Upvote simple.Upvote = p.PlayMod.getPlayroomMod().Upvote
simple.DressSet = p.PlayMod.getPlayroomMod().DressSet simple.DressSet = p.PlayMod.getPlayroomMod().DressSet
simple.CardInfo = CardMod.GetCardList() simple.CardInfo = CardMod.GetCardList()
simple.ActLog = p.PlayMod.getFriendMod().GetActLogLast()
simple.Physiology = p.PlayMod.getPlayroomMod().GetPhysiologyList()
value, _ := json.Marshal(simple) value, _ := json.Marshal(simple)
IdStr := strconv.Itoa(int(p.M_DwUin)) IdStr := strconv.Itoa(int(p.M_DwUin))
db.RedisSetKey(IdStr, string(value), 0) db.RedisSetKey(IdStr, string(value), 0)

View File

@ -2,6 +2,7 @@ package game
import ( import (
"server/GoUtil" "server/GoUtil"
playroomCfg "server/conf/playroom"
"server/game/mod/item" "server/game/mod/item"
proto "server/msg" proto "server/msg"
) )
@ -122,6 +123,20 @@ func PlayroomBackData(p *Player) {
Label: v.Label, Label: v.Label,
}) })
} }
weeklyDiscount := make(map[int32]*proto.WeeklyDiscountInfo)
ChargeMod := p.PlayMod.getChargeMod()
if ChargeMod.IsWeeklyDiscountDay() {
w1 := playroomCfg.GetShopWeeklyLimit()
for k, v := range w1 {
limitNum := PlayroomMod.WeeklyDiscount[k]
weeklyDiscount[int32(k)] = &proto.WeeklyDiscountInfo{
Id: int32(k),
Discount: int32(v.Discount),
Count: int32(v.WeeklyLimit - limitNum),
}
}
}
r.WeeklyDiscount = weeklyDiscount
r.PetAir = PetAir r.PetAir = PetAir
r.PetAirSet = int32(PlayroomMod.GetPetAirSet()) r.PetAirSet = int32(PlayroomMod.GetPetAirSet())
r.Chip = ChipMessage r.Chip = ChipMessage

View File

@ -196,20 +196,18 @@ func (p *PlayerBaseData) ReqRemoveAd(player *Player, buf []byte) {
func (p *PlayerBaseData) ResPlayerBaseInfo(player *Player) { func (p *PlayerBaseData) ResPlayerBaseInfo(player *Player) {
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
player.PushClientRes(&msg.ResPlayerBaseInfo{ player.PushClientRes(&msg.ResPlayerBaseInfo{
DwUin: p.Data.DwUin, DwUin: p.Data.DwUin,
Energy: int32(BaseMod.Energy), Energy: int32(BaseMod.Energy),
Star: int32(BaseMod.Star), Star: int32(BaseMod.Star),
RecoverTime: int32(BaseMod.RecoverTime), RecoverTime: int32(BaseMod.RecoverTime),
Diamond: int32(BaseMod.Diamond), Diamond: int32(BaseMod.Diamond),
Level: int32(BaseMod.Level), Level: int32(BaseMod.Level),
Exp: int32(BaseMod.Exp), Exp: int32(BaseMod.Exp),
LoginTime: int32(BaseMod.LoginTime), LoginTime: int32(BaseMod.LoginTime),
LogoutTime: int32(BaseMod.LogoutTime), LogoutTime: int32(BaseMod.LogoutTime),
FaceBookId: p.Data.FaceBookId, RegisterTime: int32(p.GetRegisterTime()),
FaceBookId: p.Data.FaceBookId,
}) })
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(&p.Data)
G_getGameLogic().PackResInfo(agent, "ResPlayerBaseInfo", data)
} }
func (p *PlayerBaseData) ReqBindFacebookAccount(player *Player, buf []byte) { func (p *PlayerBaseData) ReqBindFacebookAccount(player *Player, buf []byte) {

View File

@ -234,10 +234,14 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
get_star_num := 0
if len(items) > 0 && items[0].Id == item.ITEM_STAR_ID {
get_star_num = items[0].Num
}
player.TeLog("sell_item", map[string]interface{}{ player.TeLog("sell_item", map[string]interface{}{
"merge_item_id": ChessId, "merge_item_id": ChessId,
"product_name": mergeDataCfg.GetNameById(ChessId), "product_name": mergeDataCfg.GetNameById(ChessId),
"get_star_num": items[0].Num, "get_star_num": get_star_num,
}) })
itemList = item.Merge(itemList, items) itemList = item.Merge(itemList, items)
case msg.HANDLE_TYPE_REMOVE: //移除棋子 case msg.HANDLE_TYPE_REMOVE: //移除棋子

View File

@ -931,10 +931,6 @@ func EmitRetireTrigger2(p *Player) {
} }
} }
func LoignBack(p *Player) {
}
func Benchmark(player *Player) { func Benchmark(player *Player) {
ChampshipMod := player.PlayMod.getChampshipMod() ChampshipMod := player.PlayMod.getChampshipMod()
ChampshipMod.AddScore([]int{949, 941, 10}) ChampshipMod.AddScore([]int{949, 941, 10})

View File

@ -34,6 +34,7 @@ import (
"server/game/mod/mail" "server/game/mod/mail"
"server/game/mod/mining" "server/game/mod/mining"
"server/game/mod/order" "server/game/mod/order"
"server/game/mod/pass"
"server/game/mod/piggyBank" "server/game/mod/piggyBank"
"server/game/mod/playroom" "server/game/mod/playroom"
"server/game/mod/race" "server/game/mod/race"
@ -84,6 +85,7 @@ type PlayerModList struct {
Compensation compensation.Compensation // 补偿 Compensation compensation.Compensation // 补偿
Catnip catnip.CatnipMod // 猫草大作战 Catnip catnip.CatnipMod // 猫草大作战
GuideTask guideTask.GuideTaskMod // 引导任务 GuideTask guideTask.GuideTaskMod // 引导任务
Pass pass.PassMod // 通行证
} }
func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool { func (p *PlayerModData) LoadDataFromDB(dwUin interface{}) bool {
@ -184,6 +186,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.Catnip.InitData() p.ModList.Catnip.InitData()
p.ModList.Compensation.InitData() p.ModList.Compensation.InitData()
p.ModList.GuideTask.InitData() p.ModList.GuideTask.InitData()
p.ModList.Pass.InitData()
return is_update, nil return is_update, nil
} }
@ -385,3 +388,7 @@ func (p *PlayerMod) getCatnipMod() *catnip.CatnipMod {
func (p *PlayerMod) getGuideTaskMod() *guideTask.GuideTaskMod { func (p *PlayerMod) getGuideTaskMod() *guideTask.GuideTaskMod {
return &p.mod_list.GuideTask return &p.mod_list.GuideTask
} }
func (p *PlayerMod) getPassMod() *pass.PassMod {
return &p.mod_list.Pass
}

View File

@ -7,6 +7,7 @@ import (
"server/GoUtil" "server/GoUtil"
"server/conf" "server/conf"
cardCfg "server/conf/card" cardCfg "server/conf/card"
champshipCfg "server/conf/champship"
collectCfg "server/conf/collect" collectCfg "server/conf/collect"
decorateCfg "server/conf/decorate" decorateCfg "server/conf/decorate"
emojiCfg "server/conf/emoji" emojiCfg "server/conf/emoji"
@ -78,6 +79,28 @@ func ReqPlayerBriefProfileDataFunc(player *Player, buf []byte) error {
return nil return nil
} }
func ReqFriendPlayerSimple(player *Player, buf []byte) error {
detail := &msg.ReqFriendPlayerSimple{}
proto.Unmarshal(buf, detail)
Uid := int(detail.Uid)
PlayerSimpleData := G_GameLogicPtr.GetResFriendPlayerByUid(Uid)
if PlayerSimpleData == nil {
log.Debug("玩家不存在, Uid:%d", Uid)
return errors.New("玩家不存在")
}
FriendMod := player.PlayMod.getFriendMod()
PlayerSimpleData.AddTime = FriendMod.GetAddTime(Uid)
PlayerSimpleData.Interact = FriendMod.GetInteractTime(Uid)
LastActLog := FriendMod.GetActLogLast()
PlayerSimpleData.Last = &msg.ActLog{
Type: int32(LastActLog.Type),
Time: LastActLog.Time,
Param: LastActLog.Param,
}
player.PushClientRes(PlayerSimpleData)
return nil
}
// 移除广告 // 移除广告
func ReqRemoveAdFunc(player *Player, buf []byte) error { func ReqRemoveAdFunc(player *Player, buf []byte) error {
player.PlayerBaseMod.ReqRemoveAd(player, buf) player.PlayerBaseMod.ReqRemoveAd(player, buf)
@ -491,6 +514,19 @@ func ReqDecorate(player *Player, buf []byte) error {
"deco_step_id": fmt.Sprintf("%d_%d", AreaId, DecorateId), "deco_step_id": fmt.Sprintf("%d_%d", AreaId, DecorateId),
"material_cost": PartItem, "material_cost": PartItem,
}) })
FriendMod := player.PlayMod.getFriendMod()
if AreaId == 1 && DecorateId == 20 {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_RESTROOM, "")
}
if AreaId == 1 && DecorateId == 29 {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_RESTAURANT, "")
}
if AreaId == 1 && DecorateId == 36 {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_BATHROOM, "")
}
if AreaId == 1 && DecorateId == 44 {
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_CLOAKROOM, "")
}
player.PlayMod.save() player.PlayMod.save()
player.PushClientRes(DecorateMod.BackData()) player.PushClientRes(DecorateMod.BackData())
@ -1078,7 +1114,8 @@ func ReqCardCollectReward(player *Player, buf []byte) error {
}) })
return err return err
} }
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_CARD_ALBUM, fmt.Sprintf("%d", int(req.Color)))
if chess != 0 { if chess != 0 {
player.PlayMod.getChessMod().AddChessBuff(chess) player.PlayMod.getChessMod().AddChessBuff(chess)
player.PushClientRes(player.PlayMod.getOrderMod().BackData()) player.PushClientRes(player.PlayMod.getOrderMod().BackData())
@ -1159,6 +1196,8 @@ func ReqAllCollectReward(player *Player, buf []byte) error {
}) })
return err return err
} }
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_COMPLETE_ALL_CARDS, "all")
player.PlayMod.save() player.PlayMod.save()
player.TeLog("ReqAllCollectReward", map[string]interface{}{ player.TeLog("ReqAllCollectReward", map[string]interface{}{
"item_list": itemList, "item_list": itemList,
@ -1426,7 +1465,8 @@ func ReqBuyEnergy(player *Player, buf []byte) error {
req := &msg.ReqBuyEnergy{} req := &msg.ReqBuyEnergy{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
Item, Energy, Diamond := BaseMod.BuyEnergy(int(req.Energy)) ChargeMod := player.PlayMod.getChargeMod()
Item, Energy, Diamond := ChargeMod.BuyEnergy()
err := player.HandleItem(Item, msg.ITEM_POP_LABEL_BuyEnergy.String()) err := player.HandleItem(Item, msg.ITEM_POP_LABEL_BuyEnergy.String())
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResBuyEnergy{ player.SendErrClienRes(&msg.ResBuyEnergy{
@ -1681,7 +1721,6 @@ func ReqSearchPlayer(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResSearchPlayer{ player.PushClientRes(&msg.ResSearchPlayer{
List: l2, List: l2,
}) })
return nil return nil
} }
@ -2708,6 +2747,11 @@ func ReqChampshipReward(player *Player, buf []byte) error {
player.PushClientRes(&msg.ResChampshipReward{ player.PushClientRes(&msg.ResChampshipReward{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
}) })
MaxId := champshipCfg.GetMaxRewardId()
if MaxId == ChampshipMod.Reward {
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_CHAMPIONSHIP_PRIZE, "")
}
player.TeLog("championship_reward", map[string]interface{}{ player.TeLog("championship_reward", map[string]interface{}{
"season_id": GoUtil.ZeroTimestamp(), "season_id": GoUtil.ZeroTimestamp(),
"champship_step_id": ChampshipMod.Reward, "champship_step_id": ChampshipMod.Reward,
@ -2871,6 +2915,10 @@ func ReqChampshipRankReward(player *Player, buf []byte) error {
}) })
return err return err
} }
if MyLastRank <= 5 {
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_CHAMPIONSHIP_RANK, GoUtil.String(MyLastRank))
}
player.PlayMod.save() player.PlayMod.save()
BackChampship(player) BackChampship(player)
player.PushClientRes(&msg.ResChampshipRankReward{ player.PushClientRes(&msg.ResChampshipRankReward{
@ -3596,8 +3644,9 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error {
"is_chip": true, "is_chip": true,
"item_list": Items, "item_list": Items,
}) })
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE_1, "")
PlayroomMod.ResetGame() PlayroomMod.ResetGame()
player.PlayerDecoSetLog("emoji", int(req.EmojiId), "playroom_select_reward") player.PlayerDecoSetLog("emoji", int(req.EmojiId), "playroom_select_reward")
PlayroomBackData(player) PlayroomBackData(player)
player.PlayMod.save() player.PlayMod.save()
@ -3778,6 +3827,10 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error {
if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_PET_THIEF) && Result == playroom.FLIP_TYPE_GOLD { if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_PET_THIEF) && Result == playroom.FLIP_TYPE_GOLD {
player.GetPetThiefReward(Target) player.GetPetThiefReward(Target)
} }
if Result == playroom.FLIP_TYPE_GOLD {
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE, "")
}
err = player.HandleItem(Items1, msg.ITEM_POP_LABEL_PlayroomFlip.String()) err = player.HandleItem(Items1, msg.ITEM_POP_LABEL_PlayroomFlip.String())
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResPlayroomFlip{ player.SendErrClienRes(&msg.ResPlayroomFlip{
@ -4072,7 +4125,8 @@ func ReqPlayroomShop(player *Player, buf []byte) error {
req := &msg.ReqPlayroomShop{} req := &msg.ReqPlayroomShop{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
AddItems, LoseItem, err := PlayroomMod.ShopBuy(int(req.Id), int(req.Num)) ChargeMod := player.PlayMod.getChargeMod()
AddItems, LoseItem, err := PlayroomMod.ShopBuy(int(req.Id), int(req.Num), ChargeMod.IsWeeklyDiscountDay())
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResPlayroomShop{ player.SendErrClienRes(&msg.ResPlayroomShop{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -4115,6 +4169,7 @@ func ReqPlayroomShop(player *Player, buf []byte) error {
player.PetItemGetLog(AddItems, LoseItem, "Shop") player.PetItemGetLog(AddItems, LoseItem, "Shop")
player.PlayMod.save() player.PlayMod.save()
player.PushClientRes(PlayroomMod.NotifyMood()) player.PushClientRes(PlayroomMod.NotifyMood())
PlayroomBackData(player)
player.PushClientRes(&msg.ResPlayroomShop{ player.PushClientRes(&msg.ResPlayroomShop{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
}) })
@ -4237,6 +4292,8 @@ func ReqFriendTreasureEnd(player *Player, buf []byte) error {
) )
return err return err
} }
FriendMod := player.PlayMod.getFriendMod()
FriendMod.AddActLog(friend.ACT_LOG_TYPE_OPEN_PET_TREASURE, "")
player.TeLog("pet_treasure_open", map[string]interface{}{ player.TeLog("pet_treasure_open", map[string]interface{}{
"pet_treasure_step": FriendTreasureMod.Shift, "pet_treasure_step": FriendTreasureMod.Shift,
"pet_treasure_box": FriendTreasureMod.BoxItems, "pet_treasure_box": FriendTreasureMod.BoxItems,
@ -5142,3 +5199,31 @@ func ReqCatnipRefuse(player *Player, buf []byte) error {
}) })
return nil return nil
} }
func ReqActPass(player *Player, buf []byte) error {
ActPassBackData(player)
return nil
}
func ReqActPassReward(player *Player, buf []byte) error {
PassMod := player.PlayMod.getPassMod()
Items, NewLevel := PassMod.GetRewardItems()
err := player.HandleItem(Items, msg.ITEM_POP_LABEL_ActPassReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResActPassReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.TeLog("act_pass_reward", map[string]interface{}{
"NewLevel": NewLevel,
"Items": Items,
})
player.PlayMod.save()
player.PushClientRes(&msg.ResActPassReward{
Code: msg.RES_CODE_SUCCESS,
RewardLevel: GoUtil.IntToInt32(NewLevel),
})
return nil
}

View File

@ -2,6 +2,7 @@ package game
import ( import (
"encoding/gob" "encoding/gob"
"server/game/mod/friend"
"server/game/mod/limitedTimeEvent" "server/game/mod/limitedTimeEvent"
"server/game/mod/msg" "server/game/mod/msg"
) )
@ -28,6 +29,8 @@ type PlayerSimpleData struct {
Upvote int Upvote int
DressSet map[int]int DressSet map[int]int
CardInfo []int CardInfo []int
ActLog *friend.ActLogInfo
Physiology map[int]int
} }
type VarGoldCard struct { type VarGoldCard struct {

View File

@ -142,6 +142,7 @@ func AdminPlayerInfo(args []interface{}) error {
res["Bonus"] = player.PlayMod.getLimitedTimeEventMod().Progress res["Bonus"] = player.PlayMod.getLimitedTimeEventMod().Progress
res["Code"] = player.PlayMod.getBaseMod().AddCode res["Code"] = player.PlayMod.getBaseMod().AddCode
res["ChessMap"] = player.PlayMod.getChessMod().ChessMap res["ChessMap"] = player.PlayMod.getChessMod().ChessMap
res["ActLog"] = player.PlayMod.getFriendMod().ActivityLog
OrderMap := make(map[int]interface{}) OrderMap := make(map[int]interface{})
Index := 0 Index := 0
for k, v := range player.PlayMod.getOrderMod().OrderList { for k, v := range player.PlayMod.getOrderMod().OrderList {

View File

@ -23,6 +23,7 @@ const (
ACT_TYPE_ADD_GIFT = 5 // 加送礼包 ACT_TYPE_ADD_GIFT = 5 // 加送礼包
ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包 ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包
ACT_TYPE_CATNIP = 7 // 猫草大作战 ACT_TYPE_CATNIP = 7 // 猫草大作战
ACT_TYPE_PASS = 8 // 通行证
) )
const ( const (

View File

@ -63,13 +63,18 @@ func (b *Base) InitData(Uid int, Ip string) {
} }
func (b *Base) Login() { func (b *Base) Login() int64 {
Now := GoUtil.Now() Now := GoUtil.Now()
if !GoUtil.IsSameDay(b.LoginTime, Now) { if !GoUtil.IsSameDay(b.LoginTime, Now) {
b.LoginDay += 1 b.LoginDay += 1
} }
logoutDuration := Now - b.LogoutTime
if b.LogoutTime == 0 {
logoutDuration = 0
}
b.LoginTime = Now b.LoginTime = Now
b.LogoutTime = 0 b.LogoutTime = 0
return logoutDuration
} }
func (b *Base) GetSeed() bool { func (b *Base) GetSeed() bool {

View File

@ -32,9 +32,13 @@ type ChargeMod struct {
Gift map[int]int // 礼包 Gift map[int]int // 礼包
Ad bool // 是否购买免广告 Ad bool // 是否购买免广告
AdEndTime int64 AdEndTime int64
WishList *WishList PetWorkTime int64 // 宠物打工时间
LastWorkTime int64 // 上次打工时间
WishList *WishList
WeeklyDiscount map[int]int // 每周折扣购买次数
WeeklyEndTime int64
} }
type WishList struct { type WishList struct {
@ -92,12 +96,20 @@ func (c *ChargeMod) InitData() {
SendList: make([]int64, 0), SendList: make([]int64, 0),
} }
} }
if c.WeeklyDiscount == nil {
c.WeeklyDiscount = make(map[int]int)
}
} }
func (c *ChargeMod) GetMaxCharge() float64 { func (c *ChargeMod) GetMaxCharge() float64 {
return c.MaxCharge return c.MaxCharge
} }
func (c *ChargeMod) Login(LogoutTime int64) {
c.LastWorkTime = min(LogoutTime, c.PetWorkTime)
c.PetWorkTime -= c.LastWorkTime
}
// 零点更新 // 零点更新
func (c *ChargeMod) ZeroUpdate(Emit []int) { func (c *ChargeMod) ZeroUpdate(Emit []int) {
Now := GoUtil.Now() Now := GoUtil.Now()
@ -124,6 +136,10 @@ func (c *ChargeMod) ZeroUpdate(Emit []int) {
c.SpecialShop[i] = &SepcialShop{Grade: SpecialGrade, Count: SpecialShopCount} c.SpecialShop[i] = &SepcialShop{Grade: SpecialGrade, Count: SpecialShopCount}
} }
c.WishList.SendList = make([]int64, 0) c.WishList.SendList = make([]int64, 0)
c.WeeklyDiscount = make(map[int]int)
if c.IsWeeklyDiscountDay() && c.WeeklyEndTime < Now {
c.WeeklyEndTime = GoUtil.ZeroTimestamp() + 7*24*3600
}
c.InitChessShop(Emit) c.InitChessShop(Emit)
} }
@ -253,6 +269,7 @@ func (c *ChargeMod) FireAdReward(ChargeId int) []*item.Item {
} else { } else {
c.AdEndTime += int64(PetWorkDay * 24 * 3600) c.AdEndTime += int64(PetWorkDay * 24 * 3600)
} }
c.PetWorkTime += int64(PetWorkDay * 24 * 3600)
c.Ad = true c.Ad = true
} }
return Items return Items
@ -293,6 +310,17 @@ func (c *ChargeMod) BackData() *msg.ResCharge {
Uid: c.WishList.SendList, Uid: c.WishList.SendList,
} }
} }
WeeklyDiscount := make(map[int32]*msg.WeeklyDiscountInfo)
WeeklyDiscountInfo := chargeCfg.GetWeeklyInfoAll()
for k, v := range WeeklyDiscountInfo {
LimitNum := c.WeeklyDiscount[k]
WeeklyDiscount[int32(k)] = &msg.WeeklyDiscountInfo{
Discount: int32(v.Discount),
Count: int32(v.WeeklyLimit - LimitNum),
Id: int32(k),
}
}
return &msg.ResCharge{ return &msg.ResCharge{
Charge: float32(c.Charge), Charge: float32(c.Charge),
Total: int32(c.Total), Total: int32(c.Total),
@ -308,6 +336,9 @@ func (c *ChargeMod) BackData() *msg.ResCharge {
MonthCharge: float32(c.MonthCharge), MonthCharge: float32(c.MonthCharge),
Wish: resWish, Wish: resWish,
AdEndTime: c.AdEndTime, AdEndTime: c.AdEndTime,
WeeklyDiscount: WeeklyDiscount,
PetWorkRemainTime: c.PetWorkTime,
WeeklyEndTime: c.WeeklyEndTime,
} }
} }
@ -369,6 +400,24 @@ func (c *ChargeMod) InitChessShop(Emit []int) {
} }
} }
func (c *ChargeMod) BuyEnergy() ([]*item.Item, []*item.Item, int) {
diamond := 40
if c.IsWeeklyDiscountDay() {
LimitNum := c.WeeklyDiscount[0]
Discount, WeeklyLimit := chargeCfg.GetWeeklyInfo(0)
if LimitNum < WeeklyLimit {
diamond = int(math.Ceil(float64(diamond) * float64(Discount) / 100.0))
c.WeeklyDiscount[0] = LimitNum + 1
}
}
return []*item.Item{
item.NewItem(item.ITEM_DIAMOND_ID, -diamond),
item.NewItem(item.ITEM_ENERGY_ID, 100),
}, []*item.Item{
item.NewItem(item.ITEM_ENERGY_ID, 100),
}, diamond
}
func (c *ChargeMod) BuyChess(Chess int) ([]*item.Item, []*item.Item, int, error) { func (c *ChargeMod) BuyChess(Chess int) ([]*item.Item, []*item.Item, int, error) {
v, ok := c.ChessShop[Chess] v, ok := c.ChessShop[Chess]
if !ok { if !ok {
@ -379,8 +428,21 @@ func (c *ChargeMod) BuyChess(Chess int) ([]*item.Item, []*item.Item, int, error)
return nil, nil, 0, fmt.Errorf("BuyChess chess count less zero id:%d", Chess) return nil, nil, 0, fmt.Errorf("BuyChess chess count less zero id:%d", Chess)
} }
v.Count-- v.Count--
diamond := v.Diamond
if c.IsWeeklyDiscountDay() {
LimitNum := c.WeeklyDiscount[Chess]
Discount, WeeklyLimit := chargeCfg.GetWeeklyInfo(Chess)
if LimitNum < WeeklyLimit {
diamond = int(math.Ceil(float64(diamond) * float64(Discount) / 100))
if diamond == v.Diamond {
diamond -= 1
}
diamond = max(1, diamond)
c.WeeklyDiscount[Chess] = LimitNum + 1
}
}
return []*item.Item{ return []*item.Item{
item.NewItem(item.ITEM_DIAMOND_ID, v.Diamond), item.NewItem(item.ITEM_DIAMOND_ID, diamond),
}, []*item.Item{ }, []*item.Item{
item.NewItem(v.Id, 1), item.NewItem(v.Id, 1),
}, v.Id, nil }, v.Id, nil
@ -398,7 +460,7 @@ func (c *ChargeMod) AddWish(Id, Type int) ([]*item.Item, error) {
ItemId := 0 ItemId := 0
switch Type { switch Type {
case PLAYROOM_SHOP: case PLAYROOM_SHOP:
ItemId, _ = playroomCfg.GetShopItem(Id) ItemId, _, _, _ = playroomCfg.GetShopItem(Id)
} }
if ItemId == 0 { if ItemId == 0 {
return nil, fmt.Errorf("AddWish itemid not exist id:%d", Id) return nil, fmt.Errorf("AddWish itemid not exist id:%d", Id)
@ -448,3 +510,21 @@ func (c *ChargeMod) AddWishCount() {
} }
c.WishList.Count++ c.WishList.Count++
} }
func (c *ChargeMod) IsWeeklyDiscountDay() bool {
Day := chargeCfg.GetWeeklyDiscountDay()
if Day == -1 {
return false
}
Weekday, _ := GoUtil.GetWeekdayAndHour()
return Weekday == Day || c.WeeklyEndTime > GoUtil.Now()
}
func (c *ChargeMod) PetWorkBackData() *msg.LogoutPetWork {
res := &msg.LogoutPetWork{
WorkTime: c.LastWorkTime,
RemainTime: c.PetWorkTime,
}
c.LastWorkTime = 0
return res
}

View File

@ -10,7 +10,7 @@ import (
) )
type FriendMod struct { type FriendMod struct {
FriendList map[int]struct{} // 好友列表 FriendList map[int]struct{} // TODO 废弃 好友列表
NewFriendList map[int]*FriendInfo // 好友列表 NewFriendList map[int]*FriendInfo // 好友列表
ApplyList map[int]int64 // 好友请求列表 ApplyList map[int]int64 // 好友请求列表
SendApply map[int]int64 // 发送的申请 SendApply map[int]int64 // 发送的申请
@ -21,6 +21,13 @@ type FriendMod struct {
Id int64 // 已同步msg ID Id int64 // 已同步msg ID
Npc []int // npc id Npc []int // npc id
Bubble map[int]*BubbleInfo // 气泡 Bubble map[int]*BubbleInfo // 气泡
ActivityLog []*ActLogInfo // 活动日志
}
type ActLogInfo struct {
Type int
Time int64
Param string
} }
type BubbleInfo struct { type BubbleInfo struct {
@ -97,6 +104,43 @@ const (
APPLY_TYPE_WISH = 1 // 心愿单请求 APPLY_TYPE_WISH = 1 // 心愿单请求
) )
const (
ACT_LOG_TYPE_FIRST_LOGIN = 1 // 首次登入游戏
ACT_LOG_TYPE_COMPLETE_RESTROOM = 2 // 完成休息室
ACT_LOG_TYPE_COMPLETE_RESTAURANT = 3 // 完成餐厅
ACT_LOG_TYPE_COMPLETE_BATHROOM = 4 // 完成浴室
ACT_LOG_TYPE_COMPLETE_CLOAKROOM = 5 // 完成衣帽间
ACT_LOG_TYPE_GET_NEW_AVATAR = 6 // 获得新头像
ACT_LOG_TYPE_GET_NEW_AVATAR_FRAME = 7 // 获得新头像框
ACT_LOG_TYPE_GET_NEW_EMOTION = 8 // 获得新表情
ACT_LOG_TYPE_GET_NEW_DECORATION = 9 // 获得新装饰品
ACT_LOG_TYPE_GET_NEW_COSTUME = 10 // 获得新服装
ACT_LOG_TYPE_COMPLETE_CARD_ALBUM = 11 // 完成卡册收集
ACT_LOG_TYPE_COMPLETE_ALL_CARDS = 12 // 完成全卡牌收集
ACT_LOG_TYPE_GET_CHAMPIONSHIP_RANK = 13 // 获得锦标赛名次
ACT_LOG_TYPE_GET_CHAMPIONSHIP_PRIZE = 14 // 获得锦标赛大奖
ACT_LOG_TYPE_GET_LIMITED_ACTIVITY_PRIZE = 15 // 获得限时活动大奖
ACT_LOG_TYPE_JOIN_FRIEND_COOP_ACTIVITY = 16 // 参加好友合作类活动
ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE = 17 // 获得拜访小游戏大奖 翻牌
ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE_1 = 18 // 获得拜访小游戏大奖 除了翻牌
ACT_LOG_TYPE_OPEN_PET_TREASURE = 19 // 打开宠物宝藏
ACT_LOG_TYPE_VISIT_UPVOTE = 20 // 拜访时点赞
ACT_LOG_TYPE_COMPLETE_HANDBOOK_ACHIEVEMENT = 21 // 完成图鉴收集成就
ACT_LOG_TYPE_COMPLETE_CHAPTER_SCENES = 22 // 完成第X章所有场景
ACT_LOG_TYPE_LOST_USER_RETURN = 23 // 流失用户回归
ACT_LOG_TYPE_ACCEPT_MY_INVITE_REGISTER = 24 // 接受"我"的邀请注册
ACT_LOG_TYPE_BECOME_MY_FRIEND = 25 // 成为"我"的好友
ACT_LOG_TYPE_SEND_CARD_TO_ME = 26 // 向"我"赠送卡牌
ACT_LOG_TYPE_CARD_EXCHANGE_WITH_ME = 27 // 与"我"达成卡牌交换
ACT_LOG_TYPE_APPEAR_IN_MY_PET_TREASURE = 28 // 出现在"我"的宠物宝藏中并被选中
ACT_LOG_TYPE_VISIT_MY_CAT_PRIVATE_TREASURE = 29 // 拜访"我"并玩了猫猫私房宝
ACT_LOG_TYPE_VISIT_MY_OTHER_GAME_WIN = 30 // 拜访"我"并玩了猫猫私房宝以外的小游戏,成功装箱
ACT_LOG_TYPE_VISIT_MY_OTHER_GAME_LOSE = 31 // 拜访"我"并玩了猫猫私房宝以外的小游戏,未成功装箱
ACT_LOG_TYPE_UPVOTE_MY_COLLECTION_INFO = 32 // 为"我"的全收集信息点赞
ACT_LOG_TYPE_UPVOTE_MY_ROOM = 33 // 为"我"的房间点赞
ACT_LOG_TYPE_JOIN_COOP_ACTIVITY_WITH_ME = 34 // 与"我"一起参加好友合作类活动
)
type LogInfo struct { type LogInfo struct {
Id int Id int
Uid int Uid int
@ -111,6 +155,10 @@ func (f *FriendMod) InitData() {
if f.FriendList == nil { if f.FriendList == nil {
f.FriendList = make(map[int]struct{}) f.FriendList = make(map[int]struct{})
} }
if len(f.ActivityLog) == 0 {
f.ActivityLog = make([]*ActLogInfo, 0)
f.AddActLog(ACT_LOG_TYPE_FIRST_LOGIN, "")
}
if f.ApplyList == nil { if f.ApplyList == nil {
f.ApplyList = make(map[int]int64) f.ApplyList = make(map[int]int64)
} }
@ -181,6 +229,13 @@ func (f *FriendMod) GetInteractTime(id int) int64 {
return LastTime return LastTime
} }
func (f *FriendMod) GetAddTime(id int) int64 {
if _, ok := f.NewFriendList[id]; !ok {
return 0
}
return f.NewFriendList[id].AddTime
}
func (f *FriendMod) AddFriend(id int) { func (f *FriendMod) AddFriend(id int) {
f.NewFriendList[id] = &FriendInfo{ f.NewFriendList[id] = &FriendInfo{
AddTime: GoUtil.Now(), AddTime: GoUtil.Now(),
@ -328,6 +383,17 @@ func (f *FriendMod) ResetGoldCardEx() {
} }
} }
func (f *FriendMod) AddActLog(Type int, Param string) {
f.ActivityLog = append(f.ActivityLog, &ActLogInfo{
Type: Type,
Time: GoUtil.Now(),
Param: Param,
})
if len(f.ActivityLog) > 20 {
f.ActivityLog = f.ActivityLog[len(f.ActivityLog)-20:]
}
}
func (f *FriendMod) Upvote(Id int) ([]*item.Item, int, error) { func (f *FriendMod) Upvote(Id int) ([]*item.Item, int, error) {
info := &LogInfo{} info := &LogInfo{}
for _, v := range f.Log { for _, v := range f.Log {
@ -401,3 +467,10 @@ func (f *FriendMod) ApplyWish(Uid int64) error {
} }
return fmt.Errorf("wish apply not exist") return fmt.Errorf("wish apply not exist")
} }
func (f *FriendMod) GetActLogLast() *ActLogInfo {
if len(f.ActivityLog) == 0 {
return nil
}
return f.ActivityLog[len(f.ActivityLog)-1]
}

View File

@ -2,6 +2,7 @@ package item
import ( import (
"fmt" "fmt"
"math"
"server/msg" "server/msg"
) )
@ -56,6 +57,7 @@ const (
ITEM_TYPE_PLAYROOM_DECORATION_SET = 113 // playroom装饰套装 ITEM_TYPE_PLAYROOM_DECORATION_SET = 113 // playroom装饰套装
ITEM_TYPE_PLAYROOM_DRESS_SET = 114 // playroom服饰套装 ITEM_TYPE_PLAYROOM_DRESS_SET = 114 // playroom服饰套装
ITEM_TYPE_PLAYROOM_BOX = 115 // playroom宝箱 ITEM_TYPE_PLAYROOM_BOX = 115 // playroom宝箱
ITEM_TYPE_ACT_PASS = 116 // 通行证活动道具
) )
func (i *ItemMod) InitData() { func (i *ItemMod) InitData() {
@ -182,7 +184,6 @@ func Merge(Item1, Item2 []*Item) []*Item {
} }
return res return res
} }
func MutilItem(i []*Item, num int) []*Item { func MutilItem(i []*Item, num int) []*Item {
if i == nil { if i == nil {
return nil return nil
@ -196,3 +197,17 @@ func MutilItem(i []*Item, num int) []*Item {
} }
return res return res
} }
func MutilItemFloat(i []*Item, num float64) []*Item {
if i == nil {
return nil
}
res := make([]*Item, 0)
for _, v := range i {
res = append(res, &Item{
Id: v.Id,
Num: int(math.Round(float64(v.Num) * num)),
})
}
return res
}

View File

@ -0,0 +1,86 @@
package pass
import (
"server/GoUtil"
passCfg "server/conf/pass"
"server/game/mod/item"
)
type PassMod struct {
LowPass int64 // 低级通行证
HighPass int64 // 高级通行证
Num int // 积分
Reward []int // 免费奖励领取情况
Id int
}
func (p *PassMod) InitData() {
}
func (p *PassMod) ZeroUpdate(Id int) {
p.Login(Id)
}
func (p *PassMod) GetRewardItems() ([]*item.Item, []int) {
NewLevel := passCfg.GetNewLevel(passCfg.GetTemplate(p.Id), p.Num, p.Reward)
if len(NewLevel) == 0 {
return nil, nil
}
Items := make([]*item.Item, 0)
Items = append(Items, passCfg.GetFreeChargeItems(passCfg.GetTemplate(p.Id), p.Reward)...)
if p.LowPass != 0 {
Items = append(Items, passCfg.GetLowChargeItems(passCfg.GetTemplate(p.Id), p.Reward)...)
}
if p.HighPass != 0 {
Items = append(Items, passCfg.GetHighChargeItems(passCfg.GetTemplate(p.Id), p.Reward)...)
}
p.Reward = append(p.Reward, NewLevel...)
return Items, NewLevel
}
func (p *PassMod) Login(Id int) int {
OldId := p.Id
if Id == 0 {
p.Id = 0
return OldId
}
if p.Id == Id {
return 0
}
p.Id = Id
p.LowPass = 0
p.HighPass = 0
p.Num = 0
p.Reward = make([]int, 0)
return p.Id
}
func (p *PassMod) GetLowChargeItems() []*item.Item {
if p.LowPass != 0 {
return nil
}
Template := passCfg.GetTemplate(p.Id)
if Template == 0 {
return nil
}
Items := passCfg.GetLowChargeItems(Template, p.Reward)
p.LowPass = GoUtil.Now()
return Items
}
func (p *PassMod) GetHighChargeItems() []*item.Item {
if p.HighPass != 0 {
return nil
}
Template := passCfg.GetTemplate(p.Id)
if Template == 0 {
return nil
}
Items := passCfg.GetHighChargeItems(Template, p.Reward)
p.HighPass = GoUtil.Now()
return Items
}
func (p *PassMod) AddExp(Score int) {
p.Num += Score
}

View File

@ -2,6 +2,7 @@ package playroom
import ( import (
"fmt" "fmt"
"math"
"server/GoUtil" "server/GoUtil"
limitedTimeEventCfg "server/conf/limitedTimeEvent" limitedTimeEventCfg "server/conf/limitedTimeEvent"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
@ -60,6 +61,7 @@ type PlayroomMod struct {
FilterVisitor bool // 是否过滤访客 FilterVisitor bool // 是否过滤访客
TodayVisitedUsers []int // 今日已拜访过的用户 TodayVisitedUsers []int // 今日已拜访过的用户
ADItem map[int]*ItemInfo ADItem map[int]*ItemInfo
WeeklyDiscount map[int]int // 每周折扣
} }
type DressInfo struct { type DressInfo struct {
@ -292,6 +294,9 @@ func (p *PlayroomMod) InitData() {
if p.ADItem == nil { if p.ADItem == nil {
p.ADItem = make(map[int]*ItemInfo) p.ADItem = make(map[int]*ItemInfo)
} }
if p.WeeklyDiscount == nil {
p.WeeklyDiscount = make(map[int]int)
}
} }
func (p *PlayroomMod) ZeroUpdate() { func (p *PlayroomMod) ZeroUpdate() {
@ -302,6 +307,7 @@ func (p *PlayroomMod) ZeroUpdate() {
p.DailyTaskReward = make([]int, 0) p.DailyTaskReward = make([]int, 0)
p.TodayVisitedUsers = make([]int, 0) p.TodayVisitedUsers = make([]int, 0)
p.ADItem = make(map[int]*ItemInfo) p.ADItem = make(map[int]*ItemInfo)
p.WeeklyDiscount = make(map[int]int)
p.InitDailyTask() p.InitDailyTask()
} }
@ -900,7 +906,6 @@ func (p *PlayroomMod) GetFlipReward() ([]*item.Item, int, int, error) {
func (p *PlayroomMod) BuyItem(Id int) ([]*item.Item, []*item.Item) { func (p *PlayroomMod) BuyItem(Id int) ([]*item.Item, []*item.Item) {
return playroomCfg.GetBuyItem(Id) return playroomCfg.GetBuyItem(Id)
} }
func (p *PlayroomMod) UnLock(Lv int) bool { func (p *PlayroomMod) UnLock(Lv int) bool {
@ -928,13 +933,21 @@ func (p *PlayroomMod) UnLock(Lv int) bool {
} }
// shop // shop
func (p *PlayroomMod) ShopBuy(Id, Num int) ([]*item.Item, []*item.Item, error) { func (p *PlayroomMod) ShopBuy(Id, Num int, WeeklyDiscount bool) ([]*item.Item, []*item.Item, error) {
AddItemId, CostItem := playroomCfg.GetShopItem(Id) AddItemId, CostItem, Discount, Limit := playroomCfg.GetShopItem(Id)
if AddItemId == 0 { if AddItemId == 0 {
return nil, nil, fmt.Errorf("ShopBuy AddItemId is 0") return nil, nil, fmt.Errorf("ShopBuy AddItemId is 0")
} }
NewCostItem := item.MutilItem(CostItem, Num) NewCostItem := CostItem[0].Num * Num
return []*item.Item{item.NewItem(AddItemId, Num)}, NewCostItem, nil if WeeklyDiscount {
LimitNum := p.WeeklyDiscount[Id]
if LimitNum < Limit {
NewCostItem = int(math.Ceil(float64(NewCostItem) * float64(Discount) / 100))
}
p.WeeklyDiscount[Id] = LimitNum + Num
}
CostItem[0].Num = NewCostItem
return []*item.Item{item.NewItem(AddItemId, Num)}, CostItem, nil
} }
func (p *PlayroomMod) UnlockDress(Type, Id int) error { func (p *PlayroomMod) UnlockDress(Type, Id int) error {

View File

@ -67,3 +67,9 @@ type PetOrderItem struct {
Num int Num int
Grade []int Grade []int
} }
type WeeklyDiscountInfo struct {
Id int
Discount int
WeeklyLimit int
}

File diff suppressed because it is too large Load Diff