pet_home_server/src/server/game/LimitedTimeTrigger.go
2025-09-08 15:31:24 +08:00

289 lines
8.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package game
import (
"fmt"
"math"
"server/GoUtil"
playroomCfg "server/conf/playroom"
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/game/mod/playroom"
"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:
BaseMod := p.PlayMod.getBaseMod()
EnergyMul := BaseMod.GetEnergyMul()
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,
})
p.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) {
PlayroomMod := p.PlayMod.getPlayroomMod()
for k, v := range PlayroomMod.Physiology {
if v.Time > 0 {
LimitedTimePlayroomTrigger_(p, k)
}
}
}
func LimitedTimePlayroomTrigger_(p *Player, Id int) {
PlayroomMod := p.PlayMod.getPlayroomMod()
Physiology := PlayroomMod.GetPhysiology(Id)
if Physiology == nil {
return
}
NewTime, NextSecond, Num := PlayroomTrigger(Physiology.Id, Physiology.Time, Physiology.Num)
Physiology.Time = NewTime
DiffValue := Physiology.Num - Num
MType, MEffect := playroomCfg.GetMoodEffect(Physiology.Id)
CleanMood := PlayroomMod.GetMoodInfo(playroom.MOOD_TYPE_CLEAN)
PlayroomMod.AddMood(MType, -MEffect*DiffValue)
// 上厕所数值为0 且清洁度大于50时清洁度降至50
if Id == playroom.PHYSIOLOGY_TYPE_TOLIET && Num == 0 && CleanMood.Num > 50 {
CleanMood.Num = 50
}
// log.Debug("PlayroomTrigger Id:%d, Time:%d, Num:%d, NewTime:%d, NextSecond:%d, MType:%d, MEffect:%d, Num :%d", Id, Physiology.Time, Physiology.Num, NewTime, NextSecond, MType, MEffect, Num)
Physiology.Num = Num
if PlayroomMod.GetMoodInfo(MType).Num == 0 { // 心情值为0时重置生理状态
PlayroomMod.ResetPhysiology(MType)
NewTime = 0
}
p.PlayMod.save()
ResNotifyMood := PlayroomMod.NotifyMood()
p.PushClientRes(ResNotifyMood)
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 PlayroomTrigger(Id int, Time int64, Num int) (int64, int64, int) {
if Num == 0 {
return 0, 0, 0
}
Now := GoUtil.Now()
NeedDuration := playroomCfg.GetPhysiologyDuration(Id, Num)
if Time+int64(NeedDuration) > Now {
return Time, int64(NeedDuration), Num
}
n := 0
for {
if n > 100 {
return 0, 0, 0
}
Num--
NeedDuration := playroomCfg.GetPhysiologyDuration(Id, Num)
Time += int64(NeedDuration)
if Time >= Now {
return Now, int64(NeedDuration), Num
}
if Num == 0 {
return 0, 0, 0
}
n++
}
}
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())
if Recover <= 0 {
return
}
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,
"change_reason": "recover_server",
})
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())
}
func GuideTaskTrigger(p *Player) {
GuideTaskMod := p.PlayMod.getGuideTaskMod()
UnlockTime := GuideTaskMod.UnlockTime
if UnlockTime == 0 {
return
}
Now := GoUtil.Now()
NextSecond := 86400 - (Now-UnlockTime)%86400
if NextSecond > 0 {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
GuideTaskMod.Login()
p.PushClientRes(GuideTaskMod.BackData())
p.SendClientRes()
}, "PlayroomWork")
}
}