toontown-just-works/toontown/coghq/BattleBlocker.py
2024-07-07 18:08:39 -05:00

88 lines
3.1 KiB
Python

from panda3d.core import *
from direct.interval.IntervalGlobal import *
from otp.level import BasicEntities
from toontown.toonbase import ToontownGlobals
from direct.directnotify import DirectNotifyGlobal
class BattleBlocker(BasicEntities.DistributedNodePathEntity):
notify = DirectNotifyGlobal.directNotify.newCategory('BattleBlocker')
def __init__(self, cr):
BasicEntities.DistributedNodePathEntity.__init__(self, cr)
self.suitIds = []
self.battleId = None
return
def setActive(self, active):
self.active = active
def announceGenerate(self):
BasicEntities.DistributedNodePathEntity.announceGenerate(self)
self.initCollisionGeom()
def disable(self):
self.ignoreAll()
self.unloadCollisionGeom()
BasicEntities.DistributedNodePathEntity.disable(self)
def destroy(self):
BasicEntities.DistributedNodePathEntity.destroy(self)
def setSuits(self, suitIds):
self.suitIds = suitIds
def setBattle(self, battleId):
self.battleId = battleId
def setBattleFinished(self):
self.ignoreAll()
def initCollisionGeom(self):
self.cSphere = CollisionSphere(0, 0, 0, self.radius)
self.cSphereNode = CollisionNode('battleBlocker-%s-%s' % (self.level.getLevelId(), self.entId))
self.cSphereNode.addSolid(self.cSphere)
self.cSphereNodePath = self.attachNewNode(self.cSphereNode)
self.cSphereNode.setCollideMask(ToontownGlobals.WallBitmask)
self.cSphere.setTangible(0)
self.enterEvent = 'enter' + self.cSphereNode.getName()
self.accept(self.enterEvent, self.__handleToonEnter)
def unloadCollisionGeom(self):
if hasattr(self, 'cSphereNodePath'):
self.ignore(self.enterEvent)
del self.cSphere
del self.cSphereNode
self.cSphereNodePath.removeNode()
del self.cSphereNodePath
def __handleToonEnter(self, collEntry):
self.notify.debug('__handleToonEnter, %s' % self.entId)
self.startBattle()
def startBattle(self):
if not self.active:
return
callback = None
if self.battleId != None and self.battleId in base.cr.doId2do:
battle = base.cr.doId2do.get(self.battleId)
if battle:
self.notify.debug('act like we collided with battle %d' % self.battleId)
callback = battle.handleBattleBlockerCollision
elif len(self.suitIds) > 0:
for suitId in self.suitIds:
suit = base.cr.doId2do.get(suitId)
if suit:
self.notify.debug('act like we collided with Suit %d ( in state %s )' % (suitId, suit.fsm.getCurrentState().getName()))
callback = suit.handleBattleBlockerCollision
break
self.showReaction(callback)
return
def showReaction(self, callback = None):
if not base.localAvatar.wantBattles:
return
track = Sequence()
if callback:
track.append(Func(callback))
track.start()