188 lines
7.2 KiB
Python
188 lines
7.2 KiB
Python
|
import SuitPlannerBase
|
||
|
from direct.distributed import DistributedObject
|
||
|
from otp.ai.MagicWordGlobal import *
|
||
|
from panda3d.core import *
|
||
|
from toontown.dna.DNAParser import DNASuitPoint
|
||
|
from toontown.toonbase import ToontownGlobals
|
||
|
|
||
|
|
||
|
class DistributedSuitPlanner(DistributedObject.DistributedObject, SuitPlannerBase.SuitPlannerBase):
|
||
|
|
||
|
def __init__(self, cr):
|
||
|
DistributedObject.DistributedObject.__init__(self, cr)
|
||
|
SuitPlannerBase.SuitPlannerBase.__init__(self)
|
||
|
self.suitList = []
|
||
|
self.buildingList = [0, 0, 0, 0]
|
||
|
self.pathViz = None
|
||
|
self.debugText = {}
|
||
|
|
||
|
def generate(self):
|
||
|
self.notify.info('DistributedSuitPlanner %d: generating' % self.getDoId())
|
||
|
DistributedObject.DistributedObject.generate(self)
|
||
|
base.cr.currSuitPlanner = self
|
||
|
|
||
|
def disable(self):
|
||
|
self.notify.info('DistributedSuitPlanner %d: disabling' % self.getDoId())
|
||
|
self.hidePaths()
|
||
|
DistributedObject.DistributedObject.disable(self)
|
||
|
base.cr.currSuitPlanner = None
|
||
|
|
||
|
def d_suitListQuery(self):
|
||
|
self.sendUpdate('suitListQuery')
|
||
|
|
||
|
def suitListResponse(self, suitList):
|
||
|
self.suitList = suitList
|
||
|
messenger.send('suitListResponse')
|
||
|
|
||
|
def d_buildingListQuery(self):
|
||
|
self.sendUpdate('buildingListQuery')
|
||
|
|
||
|
def buildingListResponse(self, buildingList):
|
||
|
self.buildingList = buildingList
|
||
|
messenger.send('buildingListResponse')
|
||
|
|
||
|
def hidePaths(self):
|
||
|
if self.pathViz:
|
||
|
self.pathViz.detachNode()
|
||
|
self.pathViz = None
|
||
|
|
||
|
def showPaths(self):
|
||
|
self.hidePaths()
|
||
|
vizNode = GeomNode(self.uniqueName('PathViz'))
|
||
|
lines = LineSegs()
|
||
|
self.pathViz = render.attachNewNode(vizNode)
|
||
|
points = self.frontdoorPointList + self.sidedoorPointList + self.cogHQDoorPointList + self.streetPointList
|
||
|
while len(points) > 0:
|
||
|
self.__doShowPoints(vizNode, lines, None, points)
|
||
|
cnode = CollisionNode('battleCells')
|
||
|
cnode.setCollideMask(BitMask32.allOff())
|
||
|
for zoneId, cellPos in self.battlePosDict.items():
|
||
|
cnode.addSolid(CollisionSphere(LPoint3f(cellPos), 9))
|
||
|
text = '%s' % zoneId
|
||
|
self.__makePathVizText(text, cellPos[0], cellPos[1], cellPos[2] + 9, (1, 1, 1, 1))
|
||
|
self.pathViz.attachNewNode(cnode).show()
|
||
|
|
||
|
def __doShowPoints(self, vizNode, lines, p, points):
|
||
|
if p == None:
|
||
|
pi = len(points) - 1
|
||
|
if pi < 0:
|
||
|
return
|
||
|
p = points[pi]
|
||
|
del points[pi]
|
||
|
else:
|
||
|
if p not in points:
|
||
|
return
|
||
|
pi = points.index(p)
|
||
|
del points[pi]
|
||
|
text = '%s' % p.getIndex()
|
||
|
pos = p.getPos()
|
||
|
if p.getPointType() == DNASuitPoint.FRONT_DOOR_POINT:
|
||
|
color = (1, 0, 0, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.SIDE_DOOR_POINT:
|
||
|
color = (0, 0, 1, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.COGHQ_IN_POINT:
|
||
|
color = (0, 0, 0, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.COGHQ_OUT_POINT:
|
||
|
color = (0.5, 0.5, 0.5, 1)
|
||
|
else:
|
||
|
color = (0, 1, 0, 1)
|
||
|
self.__makePathVizText(text, pos[0], pos[1], pos[2], color, i=p.getIndex())
|
||
|
cs = CollisionSphere(LPoint3f(pos), 3)
|
||
|
cs.setTangible(0)
|
||
|
triggerName = 'suitPoint-' + str(p.getIndex())
|
||
|
cn = CollisionNode(triggerName)
|
||
|
cn.addSolid(cs)
|
||
|
cn.setIntoCollideMask(ToontownGlobals.WallBitmask)
|
||
|
base.accept('enter' + triggerName, self.__showEdges, [p.getIndex()])
|
||
|
base.accept('exit' + triggerName, self.__hideEdges, [p.getIndex()])
|
||
|
self.pathViz.attachNewNode(cn)
|
||
|
adjacent = self.dnaStore.getAdjacentPoints(p)
|
||
|
numPoints = adjacent.getNumPoints()
|
||
|
for i in xrange(numPoints):
|
||
|
qi = adjacent.getPointIndex(i)
|
||
|
q = self.dnaStore.getSuitPointWithIndex(qi)
|
||
|
pp = p.getPos()
|
||
|
qp = q.getPos()
|
||
|
v = Vec3(qp - pp)
|
||
|
v.normalize()
|
||
|
c = v.cross(Vec3.up())
|
||
|
p1a = pp + v * 2 + c * 0.5
|
||
|
p1b = pp + v * 3
|
||
|
p1c = pp + v * 2 - c * 0.5
|
||
|
lines.reset()
|
||
|
lines.moveTo(pp)
|
||
|
lines.drawTo(qp)
|
||
|
lines.moveTo(p1a)
|
||
|
lines.drawTo(p1b)
|
||
|
lines.drawTo(p1c)
|
||
|
lines.create(vizNode, 0)
|
||
|
self.__doShowPoints(vizNode, lines, q, points)
|
||
|
|
||
|
def __makePathVizText(self, text, x, y, z, color, i=-1):
|
||
|
if not hasattr(self, 'debugTextNode'):
|
||
|
self.debugTextNode = TextNode('debugTextNode')
|
||
|
self.debugTextNode.setAlign(TextNode.ACenter)
|
||
|
self.debugTextNode.setFont(ToontownGlobals.getSignFont())
|
||
|
self.debugTextNode.setTextColor(*color)
|
||
|
self.debugTextNode.setText(text)
|
||
|
np = self.pathViz.attachNewNode(self.debugTextNode.generate())
|
||
|
np.setPos(x, y, z + 1)
|
||
|
np.setScale(1.0)
|
||
|
np.setBillboardPointEye(2)
|
||
|
np.node().setAttrib(TransparencyAttrib.make(TransparencyAttrib.MDual), 2)
|
||
|
if i >= 0:
|
||
|
self.debugText[i] = np
|
||
|
|
||
|
def __showEdges(self, i, collisionEntry):
|
||
|
highlightedPoints = [i]
|
||
|
if i in self.dnaStore.suitEdges:
|
||
|
edges = self.dnaStore.suitEdges[i]
|
||
|
for edge in edges:
|
||
|
endPoint = edge.getEndPoint()
|
||
|
highlightedPoints.append(endPoint.getIndex())
|
||
|
for i in highlightedPoints:
|
||
|
p = self.dnaStore.getSuitPointWithIndex(i)
|
||
|
pos = p.getPos()
|
||
|
self.debugText[i].removeNode()
|
||
|
self.__makePathVizText(str(p.getIndex()), pos[0], pos[1], pos[2], (0.95, 1, 0, 1), i=p.getIndex())
|
||
|
|
||
|
def __hideEdges(self, i, collisionEntry):
|
||
|
highlightedPoints = [i]
|
||
|
if i in self.dnaStore.suitEdges:
|
||
|
edges = self.dnaStore.suitEdges[i]
|
||
|
for edge in edges:
|
||
|
endPoint = edge.getEndPoint()
|
||
|
highlightedPoints.append(endPoint.getIndex())
|
||
|
for i in highlightedPoints:
|
||
|
p = self.dnaStore.getSuitPointWithIndex(i)
|
||
|
pos = p.getPos()
|
||
|
self.debugText[i].removeNode()
|
||
|
if p.getPointType() == DNASuitPoint.FRONT_DOOR_POINT:
|
||
|
color = (1, 0, 0, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.SIDE_DOOR_POINT:
|
||
|
color = (0, 0, 1, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.COGHQ_IN_POINT:
|
||
|
color = (0, 0, 0, 1)
|
||
|
elif p.getPointType() == DNASuitPoint.COGHQ_OUT_POINT:
|
||
|
color = (0.5, 0.5, 0.5, 1)
|
||
|
else:
|
||
|
color = (0, 1, 0, 1)
|
||
|
self.__makePathVizText(str(p.getIndex()), pos[0], pos[1], pos[2], color, i=p.getIndex())
|
||
|
|
||
|
|
||
|
@magicWord(category=CATEGORY_COMMUNITY_MANAGER)
|
||
|
def suitPaths():
|
||
|
response = "Couldn't toggle suit path visualization."
|
||
|
for do in base.cr.doId2do.values():
|
||
|
if not isinstance(do, DistributedSuitPlanner):
|
||
|
continue
|
||
|
if getattr(do, '_showPaths', False):
|
||
|
do.hidePaths()
|
||
|
do._showPaths = False
|
||
|
response = 'Suit paths are not being visualized.'
|
||
|
else:
|
||
|
do.showPaths()
|
||
|
do._showPaths = True
|
||
|
response = 'Suit paths are being visualized.'
|
||
|
return response
|