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