oldschool-toontown/toontown/coghq/StageRoom.py

105 lines
3.3 KiB
Python
Raw Permalink Normal View History

from panda3d.core import *
2019-11-02 17:27:54 -05:00
from direct.showbase import DirectObject
from direct.fsm import ClassicFSM, State
from toontown.toonbase import ToontownGlobals
from toontown.coghq import StageRoomSpecs
import random
class StageRoom(DirectObject.DirectObject):
FloorCollPrefix = 'stageFloorColl'
CashbotStageDoorFrame = 'phase_10/models/cashbotHQ/DoorFrame'
def __init__(self, path = None):
if path is not None:
if path in StageRoomSpecs.CashbotStageConnectorRooms:
loadFunc = loader.loadModelCopy
else:
loadFunc = loader.loadModel
self.setGeom(loadFunc(path))
self.localToonFSM = ClassicFSM.ClassicFSM('StageRoomLocalToonPresent', [State.State('off', self.enterLtOff, self.exitLtOff, ['notPresent']), State.State('notPresent', self.enterLtNotPresent, self.exitLtNotPresent, ['present']), State.State('present', self.enterLtPresent, self.exitLtPresent, ['notPresent'])], 'notPresent', 'notPresent')
self.localToonFSM.enterInitialState()
return
def delete(self):
del self.localToonFSM
def enter(self):
self.localToonFSM.request('notPresent')
def exit(self):
self.localToonFSM.requestFinalState()
def setRoomNum(self, num):
self.roomNum = num
def getRoomNum(self):
return self.roomNum
def setGeom(self, geom):
self.__geom = geom
ug = self.__geom.find('**/underground')
if not ug.isEmpty():
ug.setBin('ground', -10)
def getGeom(self):
return self.__geom
def _getEntrances(self):
return self.__geom.findAllMatches('**/ENTRANCE*')
def _getExits(self):
return self.__geom.findAllMatches('**/EXIT*')
def attachTo(self, other, rng):
otherExits = other._getExits()
entrances = self._getEntrances()
otherDoor = otherExits[0]
thisDoor = rng.choice(entrances)
geom = self.getGeom()
otherGeom = other.getGeom()
tempNode = otherDoor.attachNewNode('tempRotNode')
geom.reparentTo(tempNode)
geom.clearMat()
geom.setPos(Vec3(0) - thisDoor.getPos(geom))
tempNode.setH(-thisDoor.getH(otherDoor))
geom.wrtReparentTo(otherGeom.getParent())
tempNode.removeNode()
def getFloorCollName(self):
return '%s%s' % (StageRoom.FloorCollPrefix, self.roomNum)
def initFloorCollisions(self):
allColls = self.getGeom().findAllMatches('**/+CollisionNode')
floorColls = []
for coll in allColls:
bitmask = coll.node().getIntoCollideMask()
if not (bitmask & ToontownGlobals.FloorBitmask).isZero():
floorColls.append(coll)
if len(floorColls) > 0:
floorCollName = self.getFloorCollName()
others = self.getGeom().findAllMatches('**/%s' % floorCollName)
for other in others:
other.setName('%s_renamed' % floorCollName)
for floorColl in floorColls:
floorColl.setName(floorCollName)
def enterLtOff(self):
pass
def exitLtOff(self):
pass
def enterLtNotPresent(self):
pass
def exitLtNotPresent(self):
pass
def enterLtPresent(self):
pass
def exitLtPresent(self):
pass