DistributedNode.py 6.1 KB

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