toontown-just-works/toontown/suit/DistributedSuitPlanner.py

188 lines
7.2 KiB
Python
Raw Normal View History

2024-07-07 18:08:39 -05:00
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