180 lines
6.3 KiB
Python
180 lines
6.3 KiB
Python
|
from toontown.toonbase.ToontownGlobals import *
|
||
|
from direct.interval.IntervalGlobal import *
|
||
|
from direct.directnotify import DirectNotifyGlobal
|
||
|
from toontown.suit import GoonPathData
|
||
|
from otp.level import PathEntity
|
||
|
|
||
|
class PathMasterEntity(PathEntity.PathEntity):
|
||
|
notify = DirectNotifyGlobal.directNotify.newCategory('PathMasterEntity')
|
||
|
|
||
|
def __init__(self, level, entId):
|
||
|
self.pathScale = 1.0
|
||
|
PathEntity.PathEntity.__init__(self, level, entId)
|
||
|
self.setPathIndex(self.pathIndex)
|
||
|
self.initPath()
|
||
|
|
||
|
def initPath(self):
|
||
|
self.pathTargetList = [None,
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
None,
|
||
|
None]
|
||
|
if not hasattr(self, 'pathTarget0'):
|
||
|
self.pathTarget0 = None
|
||
|
else:
|
||
|
self.pathTargetList[0] = self.pathTarget0
|
||
|
if not hasattr(self, 'pathTarget1'):
|
||
|
self.pathTarget1 = None
|
||
|
else:
|
||
|
self.pathTargetList[1] = self.pathTarget1
|
||
|
if not hasattr(self, 'pathTarget2'):
|
||
|
self.pathTarget2 = None
|
||
|
else:
|
||
|
self.pathTargetList[2] = self.pathTarget2
|
||
|
if not hasattr(self, 'pathTarget3'):
|
||
|
self.pathTarget3 = None
|
||
|
else:
|
||
|
self.pathTargetList[3] = self.pathTarget3
|
||
|
if not hasattr(self, 'pathTarget4'):
|
||
|
self.pathTarget4 = None
|
||
|
else:
|
||
|
self.pathTargetList[4] = self.pathTarget4
|
||
|
if not hasattr(self, 'pathTarget5'):
|
||
|
self.pathTarget5 = None
|
||
|
else:
|
||
|
self.pathTargetList[5] = self.pathTarget5
|
||
|
if not hasattr(self, 'pathTarget6'):
|
||
|
self.pathTarget6 = None
|
||
|
else:
|
||
|
self.pathTargetList[6] = self.pathTarget6
|
||
|
if not hasattr(self, 'pathTarget7'):
|
||
|
self.pathTarget7 = None
|
||
|
else:
|
||
|
self.pathTargetList[7] = self.pathTarget7
|
||
|
return
|
||
|
|
||
|
def destroy(self):
|
||
|
PathEntity.PathEntity.destroy(self)
|
||
|
|
||
|
def setPathTarget0(self, targetId):
|
||
|
self.pathTarget0 = targetId
|
||
|
self.pathTargetList[0] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget1(self, targetId):
|
||
|
self.pathTarget1 = targetId
|
||
|
self.pathTargetList[1] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget2(self, targetId):
|
||
|
self.pathTarget2 = targetId
|
||
|
self.pathTargetList[2] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget3(self, targetId):
|
||
|
self.pathTarget3 = targetId
|
||
|
self.pathTargetList[3] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget4(self, targetId):
|
||
|
self.pathTarget4 = targetId
|
||
|
self.pathTargetList[4] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget5(self, targetId):
|
||
|
self.pathTarget5 = targetId
|
||
|
self.pathTargetList[5] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget6(self, targetId):
|
||
|
self.pathTarget6 = targetId
|
||
|
self.pathTargetList[6] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def setPathTarget7(self, targetId):
|
||
|
self.pathTarget7 = targetId
|
||
|
self.pathTargetList[7] = targetId
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
|
||
|
def getReducedPath(self):
|
||
|
returnPath = []
|
||
|
for entityId in self.pathTargetList:
|
||
|
if self.level and entityId != 0:
|
||
|
thing = self.level.entities.get(entityId, None)
|
||
|
returnPath.append(thing.getPos(self))
|
||
|
|
||
|
return returnPath
|
||
|
|
||
|
def setPathIndex(self, pathIndex):
|
||
|
self.pathIndex = pathIndex
|
||
|
pathTableId = GoonPathData.taskZoneId2pathId[self.level.getTaskZoneId()]
|
||
|
if self.pathIndex in GoonPathData.Paths[pathTableId]:
|
||
|
self.path = GoonPathData.Paths[pathTableId][self.pathIndex]
|
||
|
if __dev__:
|
||
|
messenger.send(self.getChangeEvent())
|
||
|
else:
|
||
|
PathEntity.notify.warning('invalid pathIndex: %s' % pathIndex)
|
||
|
self.path = None
|
||
|
return
|
||
|
|
||
|
def makePathTrack(self, node, velocity, name, turnTime = 1, lookAroundNode = None):
|
||
|
track = Sequence(name=name)
|
||
|
self.path = self.getReducedPath()
|
||
|
if self.path is None or len(self.path) < 1:
|
||
|
track.append(WaitInterval(1.0))
|
||
|
return track
|
||
|
path = self.path + [self.path[0]]
|
||
|
for pointIndex in range(len(path) - 1):
|
||
|
startPoint = Point3(path[pointIndex]) * self.pathScale
|
||
|
endPoint = Point3(path[pointIndex + 1]) * self.pathScale
|
||
|
v = startPoint - endPoint
|
||
|
node.setPos(startPoint[0], startPoint[1], startPoint[2])
|
||
|
node.headsUp(endPoint[0], endPoint[1], endPoint[2])
|
||
|
theta = node.getH() % 360
|
||
|
track.append(LerpHprInterval(node, turnTime, Vec3(theta, 0, 0)))
|
||
|
distance = Vec3(v).length()
|
||
|
duration = distance / velocity
|
||
|
track.append(LerpPosInterval(node, duration=duration, pos=endPoint, startPos=startPoint))
|
||
|
|
||
|
return track
|
||
|
|
||
|
def makePathTrackBak(self, node, velocity, name, turnTime = 1, lookAroundNode = None):
|
||
|
track = Sequence(name=name)
|
||
|
if self.path is None:
|
||
|
track.append(WaitInterval(1.0))
|
||
|
return track
|
||
|
path = self.path + [self.path[0]]
|
||
|
for pointIndex in range(len(path) - 1):
|
||
|
startPoint = Point3(path[pointIndex]) * self.pathScale
|
||
|
endPoint = Point3(path[pointIndex + 1]) * self.pathScale
|
||
|
v = startPoint - endPoint
|
||
|
node.setPos(startPoint[0], startPoint[1], startPoint[2])
|
||
|
node.headsUp(endPoint[0], endPoint[1], endPoint[2])
|
||
|
theta = node.getH() % 360
|
||
|
track.append(LerpHprInterval(node, turnTime, Vec3(theta, 0, 0)))
|
||
|
distance = Vec3(v).length()
|
||
|
duration = distance / velocity
|
||
|
track.append(LerpPosInterval(node, duration=duration, pos=endPoint, startPos=startPoint))
|
||
|
|
||
|
return track
|
||
|
|
||
|
if __dev__:
|
||
|
|
||
|
def getChangeEvent(self):
|
||
|
return self.getUniqueName('pathChanged')
|
||
|
|
||
|
def setPathScale(self, pathScale):
|
||
|
self.pathScale = pathScale
|
||
|
self.setPathIndex(self.pathIndex)
|