PyDatagram.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # This is built as a subclass instead of an extension so we can define the
  2. # class variable FuncDict and so we can import DCSubatomicType at the top
  3. # of the file rather than every time we call the putArg function.
  4. from panda3d.core import Datagram
  5. from panda3d.direct import *
  6. # Import the type numbers
  7. #from otp.ai.AIMsgTypes import *
  8. class PyDatagram(Datagram):
  9. # This is a little helper Dict to replace the huge <if> statement
  10. # for trying to match up datagram subatomic types with add funtions
  11. # If Python had an O(1) "case" statement we would use that instead
  12. FuncDict = {
  13. STInt8: (Datagram.addInt8, int),
  14. STInt16: (Datagram.addInt16, int),
  15. STInt32: (Datagram.addInt32, int),
  16. STInt64: (Datagram.addInt64, int),
  17. STUint8: (Datagram.addUint8, int),
  18. STUint16: (Datagram.addUint16, int),
  19. STUint32: (Datagram.addUint32, int),
  20. STUint64: (Datagram.addUint64, int),
  21. STFloat64: (Datagram.addFloat64, None),
  22. STString: (Datagram.addString, None),
  23. STBlob: (Datagram.addString, None),
  24. STBlob32: (Datagram.addString32, None),
  25. }
  26. #def addChannel(self, channelId):
  27. # ...
  28. addChannel = Datagram.addUint64
  29. def addServerHeader(self, channel, sender, code):
  30. self.addInt8(1)
  31. self.addChannel(channel)
  32. self.addChannel(sender)
  33. self.addUint16(code)
  34. def addOldServerHeader(self, channel, sender, code):
  35. self.addChannel(channel)
  36. self.addChannel(sender)
  37. self.addChannel('A')
  38. self.addUint16(code)
  39. # def addServerControlHeader(self, code):
  40. # self.addInt8(1)
  41. # self.addChannel(CONTROL_MESSAGE)
  42. # self.addUint16(code)
  43. # def addOldServerControlHeader(self, code):
  44. # self.addChannel(CONTROL_MESSAGE)
  45. # self.addUint16(code)
  46. def putArg(self, arg, subatomicType, divisor=1):
  47. if (divisor == 1):
  48. funcSpecs = self.FuncDict.get(subatomicType)
  49. if funcSpecs:
  50. addFunc, argFunc = funcSpecs
  51. if argFunc:
  52. arg = argFunc(arg)
  53. addFunc(self, arg)
  54. # Ok, arrays are not handled by the FuncDict yet
  55. elif subatomicType == STInt8array:
  56. self.addUint16(len(arg))
  57. for i in arg:
  58. self.addInt8(int(i))
  59. elif subatomicType == STInt16array:
  60. self.addUint16(len(arg) << 1)
  61. for i in arg:
  62. self.addInt16(int(i))
  63. elif subatomicType == STInt32array:
  64. self.addUint16(len(arg) << 2)
  65. for i in arg:
  66. self.addInt32(int(i))
  67. elif subatomicType == STUint8array:
  68. self.addUint16(len(arg))
  69. for i in arg:
  70. self.addUint8(int(i))
  71. elif subatomicType == STUint16array:
  72. self.addUint16(len(arg) << 1)
  73. for i in arg:
  74. self.addUint16(int(i))
  75. elif subatomicType == STUint32array:
  76. self.addUint16(len(arg) << 2)
  77. for i in arg:
  78. self.addUint32(int(i))
  79. elif subatomicType == STUint32uint8array:
  80. self.addUint16(len(arg) * 5)
  81. for i in arg:
  82. self.addUint32(int(i[0]))
  83. self.addUint8(int(i[1]))
  84. else:
  85. raise Exception("Error: No such type as: " + str(subatomicType))
  86. else:
  87. funcSpecs = self.FuncDict.get(subatomicType)
  88. if funcSpecs:
  89. # argFunc is only used if divisor == 1
  90. addFunc, argFunc = funcSpecs
  91. addFunc(self, int(round(arg * divisor)))
  92. # Ok, arrays are not handled by the FuncDict yet
  93. elif subatomicType == STInt8array:
  94. self.addUint16(len(arg))
  95. for i in arg:
  96. self.addInt8(int(round(i*divisor)))
  97. elif subatomicType == STInt16array:
  98. self.addUint16(len(arg) << 1)
  99. for i in arg:
  100. self.addInt16(int(round(i*divisor)))
  101. elif subatomicType == STInt32array:
  102. self.addUint16(len(arg) << 2)
  103. for i in arg:
  104. self.addInt32(int(round(i*divisor)))
  105. elif subatomicType == STUint8array:
  106. self.addUint16(len(arg))
  107. for i in arg:
  108. self.addUint8(int(round(i*divisor)))
  109. elif subatomicType == STUint16array:
  110. self.addUint16(len(arg) << 1)
  111. for i in arg:
  112. self.addUint16(int(round(i*divisor)))
  113. elif subatomicType == STUint32array:
  114. self.addUint16(len(arg) << 2)
  115. for i in arg:
  116. self.addUint32(int(round(i*divisor)))
  117. elif subatomicType == STUint32uint8array:
  118. self.addUint16(len(arg) * 5)
  119. for i in arg:
  120. self.addUint32(int(round(i[0]*divisor)))
  121. self.addUint8(int(round(i[1]*divisor)))
  122. else:
  123. raise Exception("Error: type does not accept divisor: " + str(subatomicType))