218 lines
6.2 KiB
Go
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())
|
|
}
|