pet_home_server/src/server/game/LimitedTimeTrigger.go
2025-01-18 17:23:22 +08:00

218 lines
6.2 KiB
Go

package game
import (
"fmt"
"math"
"server/GoUtil"
userCfg "server/conf/user"
"server/game/mod/card"
"server/game/mod/item"
"server/game/mod/limitedTimeEvent"
MsgMod "server/game/mod/msg" // Ensure this package exists and is correctly referenced
"server/msg"
"time"
)
// 限时事件触发器
func LimitedTimeEventTrigger(p *Player, AddEventId int) {
Lv := p.GetPlayerBaseMod().GetLevel()
EndTime, TimeoutEvent, AddEvent := p.PlayMod.getLimitedTimeEventMod().Trigger(Lv)
remainingTime := GoUtil.NextHourRemain()
EndTime = GoUtil.IfTrue(EndTime > 0, min(EndTime, int(remainingTime)), int(remainingTime)).(int)
if AddEventId != 0 {
AddEvent = append(AddEvent, AddEventId)
}
if EndTime > 0 {
p.CallEvent(time.Duration(EndTime)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeEventTrigger(p, 0)
p.SendClientRes()
}, "LimitedTimeEvent")
}
for _, v := range TimeoutEvent { // 事件到期处理
p.PushClientRes(&msg.LimitEventNotify{
Id: int32(v),
Type: limitedTimeEvent.EVENT_NOTIFY_TYPE_DEL,
})
switch v {
case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER:
EnergyMul := p.PlayMod.getBaseMod().GetEnergyMul()
MaxEnergyMul := p.GetPlayerBaseMod().GetMaxEnergyMul(p)
p.PlayMod.getBaseMod().ResetEnergyMul(MaxEnergyMul)
NewEnergyMul := p.PlayMod.getBaseMod().GetEnergyMul()
OrderMod := p.PlayMod.getOrderMod()
Lv := p.GetPlayerBaseMod().GetLevel()
Emit := p.PlayMod.getChessMod().GetOrderEmit()
ChessList := p.PlayMod.getChessMod().GetUnlockChessList()
OrderMod.ChangeEnergyMul(Lv, Emit, NewEnergyMul, ChessList)
p.PushClientRes(OrderMod.BackData())
p.TeLog("mutil_merge_change", map[string]interface{}{
"change_from": math.Pow(2, float64(EnergyMul)),
"change_to": math.Pow(2, float64(NewEnergyMul)),
"is_auto": true,
})
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
p.PlayMod.getOrderMod().RemoveSuperOrder()
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().ResetCardFestival()
case limitedTimeEvent.EVENT_TYPE_GOLDCARD_EX:
p.PlayMod.getFriendMod().ResetGoldCardEx()
LimitedTimeCardTrigger(p)
}
}
for _, v := range AddEvent { // 增加事件处理
switch v {
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
Emit := p.PlayMod.getChessMod().GetOrderEmit()
Lv := p.GetPlayerBaseMod().GetLevel()
EnergyMul := p.PlayMod.getBaseMod().GetEnergyMul()
p.PlayMod.getOrderMod().CreateSuperOrder(Lv, Emit, EnergyMul)
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().CreateCardFestival()
}
}
p.PushClientRes(p.PlayMod.getLimitedTimeEventMod().BackData())
p.PlayMod.save()
}
// 限时猪猪存钱罐触发器
func LimitedTimePiggyBankTrigger(p *Player) {
Remain := p.PlayMod.getPiggyBankMod().TimeOut()
if Remain > 0 {
p.CallEvent(time.Duration(Remain)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimePiggyBankTrigger(p)
p.SendClientRes()
}, "PiggyBank")
}
p.PushClientRes(p.PlayMod.getPiggyBankMod().BackData())
}
// 限时卡牌触发器
func LimitedTimeCardTrigger(p *Player) {
FriendMod := p.PlayMod.getFriendMod()
CardMod := p.PlayMod.getCardMod()
Now := GoUtil.Now()
EndTime := int64(0)
for k, v := range FriendMod.Card {
if v.EndTime > 0 && v.EndTime <= Now {
if v.Status == card.STATUS_CARD_EX_1 {
delete(FriendMod.Card, k)
FriendMgrSend(&MsgMod.Msg{
From: v.BUid,
To: v.AUid,
Type: MsgMod.HANDLE_TYPE_EX_CARD_SELECT_TIMEOUT,
})
}
if v.Status == card.STATUS_CARD_EX_2 {
delete(FriendMod.Card, k)
FriendMgrSend(&MsgMod.Msg{
From: v.AUid,
To: v.BUid,
Type: MsgMod.HANDLE_TYPE_EX_CARD_TIMEOUT,
})
CardMod.AddCard(v.CardId)
CardMod.DelExCard(v)
p.PushClientRes(CardMod.NotifyTimes())
p.PushClientRes(CardMod.NotifyCard())
}
}
EndTime = min(EndTime, v.EndTime)
}
if EndTime > 0 {
p.CallEvent(time.Duration(EndTime-Now)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeCardTrigger(p)
p.SendClientRes()
}, "LimitedTimeCard")
}
}
func LimitedTimePlayroomTrigger(p *Player, Id int) {
PlayroomMod := p.PlayMod.getPlayroomMod()
Now := GoUtil.Now()
MoodInfo := PlayroomMod.GetMoodInfo(Id)
if MoodInfo == nil {
return
}
NewTime, Num := GoUtil.PlayroomTrigger(MoodInfo.Time, MoodInfo.Num)
MoodInfo.Time = NewTime
MoodInfo.Num = Num
p.PlayMod.save()
PlayroomBackData(p)
NextSecond := NewTime - Now
if NextSecond > 0 {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimePlayroomTrigger(p, Id)
p.SendClientRes()
}, fmt.Sprintf("Playroom_%d", Id))
}
}
func LimitedTimePlayroomWorkTrigger(p *Player) {
PlayroomMod := p.PlayMod.getPlayroomMod()
EndTime := PlayroomMod.Endtime
Now := GoUtil.Now()
if EndTime > 0 && EndTime <= Now {
PlayroomMod.ResetWork()
p.PlayMod.save()
PlayroomBackData(p)
p.SendClientRes()
return
}
NextSecond := EndTime - GoUtil.Now()
if NextSecond > 0 {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimePlayroomWorkTrigger(p)
p.SendClientRes()
}, "PlayroomWork")
}
}
func LimitedTimeEnergyAdd(p *Player) {
curtime := time.Now().Unix()
PlayerBaseMod := p.GetPlayerBaseMod()
BaseMod := p.PlayMod.getBaseMod()
delta := curtime - BaseMod.GetRecoverTime()
Recover := userCfg.GetRecover(BaseMod.GetLevel())
Addsta := int(delta) / Recover
if Addsta <= 0 {
return
}
Energy := BaseMod.GetEnergy()
MaxEnergy := PlayerBaseMod.GetMaxEnergy()
if MaxEnergy > Energy {
E := MaxEnergy - Energy
Energy += Addsta
if Energy > MaxEnergy {
Energy = MaxEnergy
}
p.TeLog("asset_change", map[string]interface{}{
"item_id": item.ITEM_ENERGY_ID,
"change_type": "gain",
"change_num": min(Addsta, E),
"change_after": Energy,
})
p.CallEvent(time.Duration(Recover)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeEnergyAdd(p)
}, "AddEnergy")
}
BaseMod.SetEnergy(Energy)
BaseMod.SetRecoverTime(curtime)
p.SendErrClienRes(PlayerBaseMod.BackAsset())
}