DistributedNode.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. """DistributedNode module: contains the DistributedNode class"""
  2. from panda3d.core import NodePath
  3. from . import GridParent
  4. from . import DistributedObject
  5. class DistributedNode(DistributedObject.DistributedObject, NodePath):
  6. """Distributed Node class:"""
  7. def __init__(self, cr):
  8. try:
  9. self.DistributedNode_initialized
  10. except:
  11. self.DistributedNode_initialized = 1
  12. self.gotStringParentToken = 0
  13. DistributedObject.DistributedObject.__init__(self, cr)
  14. if not self.this:
  15. NodePath.__init__(self, "DistributedNode")
  16. # initialize gridParent
  17. self.gridParent = None
  18. def disable(self):
  19. if self.activeState != DistributedObject.ESDisabled:
  20. if not self.isEmpty():
  21. self.reparentTo(hidden)
  22. DistributedObject.DistributedObject.disable(self)
  23. def delete(self):
  24. try:
  25. self.DistributedNode_deleted
  26. except:
  27. self.DistributedNode_deleted = 1
  28. if not self.isEmpty():
  29. self.removeNode()
  30. if self.gridParent:
  31. self.gridParent.delete()
  32. DistributedObject.DistributedObject.delete(self)
  33. def generate(self):
  34. DistributedObject.DistributedObject.generate(self)
  35. self.gotStringParentToken = 0
  36. def setLocation(self, parentId, zoneId, teleport=0):
  37. # Redefine DistributedObject setLocation, so that when
  38. # location is set to the ocean grid, we can update our parenting
  39. # under gridParent
  40. DistributedObject.DistributedObject.setLocation(self, parentId, zoneId)
  41. parentObj = self.cr.doId2do.get(parentId)
  42. if parentObj:
  43. # Make sure you in a zone that is in the grid before making a GridParent
  44. if (parentObj.isGridParent() and (zoneId >= parentObj.startingZone)):
  45. if not self.gridParent:
  46. self.gridParent = GridParent.GridParent(self)
  47. self.gridParent.setGridParent(parentObj, zoneId, teleport)
  48. else:
  49. if self.gridParent:
  50. self.gridParent.delete()
  51. self.gridParent = None
  52. else:
  53. if self.gridParent:
  54. self.gridParent.delete()
  55. self.gridParent = None
  56. def __cmp__(self, other):
  57. # DistributedNode inherits from NodePath, which inherits a
  58. # definition of __cmp__ from FFIExternalObject that uses the
  59. # NodePath's compareTo() method to compare different
  60. # NodePaths. But we don't want this behavior for
  61. # DistributedNodes; DistributedNodes should only be compared
  62. # pointerwise.
  63. if self is other:
  64. return 0
  65. else:
  66. return 1
  67. ### setParent ###
  68. def b_setParent(self, parentToken):
  69. if type(parentToken) == str:
  70. self.setParentStr(parentToken)
  71. else:
  72. self.setParent(parentToken)
  73. # it's important to call the local setParent first.
  74. self.d_setParent(parentToken)
  75. def d_setParent(self, parentToken):
  76. if type(parentToken) == str:
  77. self.sendUpdate("setParentStr", [parentToken])
  78. else:
  79. self.sendUpdate("setParent", [parentToken])
  80. def setParentStr(self, parentTokenStr):
  81. assert self.notify.debug('setParentStr: %s' % parentTokenStr)
  82. assert self.notify.debug('isGenerated: %s' % self.isGenerated())
  83. if len(parentTokenStr) > 0:
  84. self.do_setParent(parentTokenStr)
  85. self.gotStringParentToken = 1
  86. def setParent(self, parentToken):
  87. assert self.notify.debug('setParent: %s' % parentToken)
  88. assert self.notify.debug('isGenerated: %s' % self.isGenerated())
  89. # if we are not yet generated and we just got a parent token
  90. # as a string, ignore whatever value comes in here
  91. justGotRequiredParentAsStr = ((not self.isGenerated()) and
  92. self.gotStringParentToken)
  93. if not justGotRequiredParentAsStr:
  94. if parentToken != 0:
  95. self.do_setParent(parentToken)
  96. self.gotStringParentToken = 0
  97. def do_setParent(self, parentToken):
  98. """do_setParent(self, int parentToken)
  99. This function is defined simply to allow a derived class (like
  100. DistributedAvatar) to override the behavior of setParent if
  101. desired.
  102. """
  103. if not self.isDisabled():
  104. self.cr.parentMgr.requestReparent(self, parentToken)
  105. ###### set pos and hpr functions #######
  106. # setX provided by NodePath
  107. def d_setX(self, x):
  108. self.sendUpdate("setX", [x])
  109. # setY provided by NodePath
  110. def d_setY(self, y):
  111. self.sendUpdate("setY", [y])
  112. # setZ provided by NodePath
  113. def d_setZ(self, z):
  114. self.sendUpdate("setZ", [z])
  115. # setH provided by NodePath
  116. def d_setH(self, h):
  117. self.sendUpdate("setH", [h])
  118. # setP provided by NodePath
  119. def d_setP(self, p):
  120. self.sendUpdate("setP", [p])
  121. # setR provided by NodePath
  122. def d_setR(self, r):
  123. self.sendUpdate("setR", [r])
  124. def setXY(self, x, y):
  125. self.setX(x)
  126. self.setY(y)
  127. def d_setXY(self, x, y):
  128. self.sendUpdate("setXY", [x, y])
  129. def setXZ(self, x, z):
  130. self.setX(x)
  131. self.setZ(z)
  132. def d_setXZ(self, x, z):
  133. self.sendUpdate("setXZ", [x, z])
  134. # setPos provided by NodePath
  135. def d_setPos(self, x, y, z):
  136. self.sendUpdate("setPos", [x, y, z])
  137. # setHpr provided by NodePath
  138. def d_setHpr(self, h, p, r):
  139. self.sendUpdate("setHpr", [h, p, r])
  140. def setXYH(self, x, y, h):
  141. self.setX(x)
  142. self.setY(y)
  143. self.setH(h)
  144. def d_setXYH(self, x, y, h):
  145. self.sendUpdate("setXYH", [x, y, h])
  146. def setXYZH(self, x, y, z, h):
  147. self.setPos(x, y, z)
  148. self.setH(h)
  149. def d_setXYZH(self, x, y, z, h):
  150. self.sendUpdate("setXYZH", [x, y, z, h])
  151. # setPosHpr provided by NodePath
  152. def d_setPosHpr(self, x, y, z, h, p, r):
  153. self.sendUpdate("setPosHpr", [x, y, z, h, p, r])