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()) }