toontown-just-works/toontown/parties/DistributedPartyTrampolineActivityAI.py
2024-07-07 18:08:39 -05:00

142 lines
6.3 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.distributed.ClockDelta import *
from direct.fsm.FSM import FSM
from direct.task import Task
from toontown.parties.DistributedPartyActivityAI import DistributedPartyActivityAI
from toontown.toonbase import TTLocalizer
import PartyGlobals
class DistributedPartyTrampolineActivityAI(DistributedPartyActivityAI, FSM):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPartyTrampolineActivityAI")
def __init__(self, air, parent, activityTuple):
DistributedPartyActivityAI.__init__(self, air, parent, activityTuple)
FSM.__init__(self, 'DistributedPartyTrampolineActivityAI')
self.currentAv = 0
self.record = 0
self.jellybeans = []
self.collected = 0
def generate(self):
self.demand('Idle')
def awardBeans(self, numBeans, height):
avId = self.air.getAvatarIdFromSender()
if avId != self.currentAv:
self.air.writeServerEvent('suspicious',avId,'Tried to give beans while not using the trampoline!')
return
if self.state != 'Active':
self.air.writeServerEvent('suspicious',avId,'Toon tried to award beans while the game wasn\'t running!')
return
if numBeans != self.collected:
self.air.writeServerEvent('suspicious',avId,'Toon reported incorrect number of collected jellybeans!')
av = self.air.doId2do.get(avId, None)
if not av:
self.air.writeServerEvent('suspicious',avId,'Toon tried to award beans while not in district!')
return
reward = self.collected*2
message = TTLocalizer.PartyTrampolineBeanResults % self.collected
if self.collected == PartyGlobals.TrampolineNumJellyBeans:
reward += PartyGlobals.TrampolineJellyBeanBonus
message = TTLocalizer.PartyTrampolineBonusBeanResults % (self.collected, PartyGlobals.TrampolineJellyBeanBonus)
message += '\n\n' + TTLocalizer.PartyTrampolineTopHeightResults % height
# TODO: Pass a msgId(?) to the client so the client can use whatever localizer it chooses.
# Ideally, we shouldn't even be passing strings that *should* be localized.
self.sendUpdateToAvatarId(avId, 'showJellybeanReward', [reward, av.getMoney(), message])
av.addMoney(reward)
def reportHeightInformation(self, height):
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId, None)
if not av:
self.air.writeServerEvent('suspicious',avId,'Toon tried to report height without being on the district!')
return
if height > self.record:
self.record = height
self.sendUpdate('setBestHeightInfo', [av.getName(), height])
else:
self.air.writeServerEvent('suspicious',avId,'Toon incorrectly reported height!')
def enterActive(self):
self.jellybeans = range(PartyGlobals.TrampolineNumJellyBeans)
taskMgr.doMethodLater(PartyGlobals.TrampolineDuration, self.sendUpdate, 'exitTrampoline%d' % self.doId, extraArgs=['leaveTrampoline', []])
self.sendUpdate('setState', ['Active', globalClockDelta.getRealNetworkTime()])
self.collected = 0
def enterIdle(self):
self.sendUpdate('setState', ['Idle', globalClockDelta.getRealNetworkTime()])
self.currentAv = 0
self.updateToonsPlaying()
def enterRules(self):
self.sendUpdate('setState', ['Rules', globalClockDelta.getRealNetworkTime()])
def requestAnim(self, anim):
avId = self.air.getAvatarIdFromSender()
if self.state != 'Active':
self.air.writeServerEvent('suspicious',avId,'Toon tried to request an animation while not playing!')
return
if self.currentAv != avId:
self.air.writeServerEvent('suspicious',avId, 'Toon tried to request an anim for someone else!')
return
self.sendUpdate('requestAnimEcho', [anim])
def removeBeans(self, beans):
avId = self.air.getAvatarIdFromSender()
if self.state != 'Active':
self.air.writeServerEvent('suspicious',avId,'Toon tried to collect jellybeans while not playing!')
return
if self.currentAv != avId:
self.air.writeServerEvent('suspicious',avId, 'Toon tried to collect jellybeans while someone else was playing!')
return
for bean in beans:
if not bean in self.jellybeans:
self.air.writeServerEvent('suspicious',avId,'Toon tried to collect non-existent bean!')
beans.remove(bean)
else:
self.collected += 1
self.sendUpdate('removeBeansEcho', [beans])
def updateToonsPlaying(self):
if self.currentAv == 0:
self.sendUpdate('setToonsPlaying', [[]])
return
self.sendUpdate('setToonsPlaying', [[self.currentAv]])
def toonJoinRequest(self):
avId = self.air.getAvatarIdFromSender()
if self.state == 'Active':
self.sendUpdateToAvatarId(avId, 'joinRequestDenied', [1])
return
self.currentAv = avId
self.updateToonsPlaying()
self.demand('Rules')
def toonExitRequest(self):
avId = self.air.getAvatarIdFromSender()
if self.state != 'Active':
self.air.writeServerEvent('suspicious',avId,'Toon tried to leave a trampoline that was not running!')
return
if self.currentAv != avId:
self.air.writeServerEvent('suspicious',avId,'Toon tried to exit trampoline for someone else!')
return
taskMgr.remove('exitTrampoline'%self.doId)
self.sendUpdate('leaveTrampoline', [])
def toonExitDemand(self):
avId = self.air.getAvatarIdFromSender()
if avId != self.currentAv:
self.air.writeServerEvent('suspicious',avId,'Toon tried to exit trampoline they\'re not using!')
return
self.demand('Idle')
def toonReady(self):
avId = self.air.getAvatarIdFromSender()
if self.state != 'Rules':
self.air.writeServerEvent('suspicious',avId,'Toon tried to verify rules while the rules were not running!')
return
if avId != self.currentAv:
self.air.writeServerEvent('suspicious',avId,'Toon tried to verify rules for someone else!')
return
self.demand('Active')