NetworkMessage.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. #include "NetworkMessage.h"
  2. #include <Logging.h>
  3. #include "ChatMessage.h"
  4. #include "ChatObserver.h"
  5. #include "Chunk.h"
  6. #include "ChunkMap.h"
  7. #include "Dimension.h"
  8. #include "Entity.h"
  9. #include "EntityType.h"
  10. #include "Game.h"
  11. NetworkMessage::NetworkMessage()
  12. : Framework::ReferenceCounter(),
  13. onAfterSend(0)
  14. {
  15. address = 0;
  16. addressLength = 0;
  17. broadcast = 0;
  18. message = 0;
  19. msgLength = 0;
  20. useBackground = 0;
  21. }
  22. NetworkMessage::~NetworkMessage()
  23. {
  24. delete[] message;
  25. delete[] address;
  26. }
  27. void NetworkMessage::setOnAfterSend(std::function<void()> onAfterSend)
  28. {
  29. if (this->onAfterSend)
  30. throw "Illegal State exception: onAfterSend was already set";
  31. this->onAfterSend = onAfterSend;
  32. }
  33. void NetworkMessage::addressChunck(const Chunk* zChunk)
  34. {
  35. delete[] address;
  36. addressLength = 14;
  37. address = new char[addressLength];
  38. address[0] = 1; // dimension response
  39. *(int*)(address + 1) = zChunk->getDimensionId();
  40. address[5] = 1; // chunck
  41. Framework::Punkt center = zChunk->getCenter();
  42. *(int*)(address + 6) = center.x;
  43. *(int*)(address + 10) = center.y;
  44. }
  45. void NetworkMessage::addressEntity(const Entity* zEntity)
  46. {
  47. delete[] address;
  48. addressLength = 10;
  49. address = new char[addressLength];
  50. address[0] = 1; // dimension response
  51. *(int*)(address + 1) = zEntity->getDimensionId();
  52. address[5] = 2; // entity
  53. *(int*)(address + 6) = zEntity->getId();
  54. }
  55. void NetworkMessage::addressDimension(const Dimension* zDim)
  56. {
  57. delete[] address;
  58. addressLength = 5;
  59. address = new char[5];
  60. address[0] = 1; // dimension response
  61. *(int*)(address + 1) = zDim->getDimensionId();
  62. }
  63. void NetworkMessage::addressBlock(const Block* zBlock)
  64. {
  65. delete[] address;
  66. addressLength = 18;
  67. address = new char[addressLength];
  68. address[0] = 1; // dimension response
  69. *(int*)(address + 1) = zBlock->getDimensionId();
  70. address[5] = 3; // block
  71. Framework::Vec3<int> pos = zBlock->getPos();
  72. *(int*)(address + 6) = pos.x;
  73. *(int*)(address + 10) = pos.y;
  74. *(int*)(address + 14) = pos.z;
  75. }
  76. void NetworkMessage::openDialog(
  77. Framework::Text dialogName, Framework::Text uiml)
  78. {
  79. delete[] address;
  80. addressLength = (char)(4 + dialogName.getLength());
  81. address = new char[addressLength];
  82. address[0] = 2; // gui message
  83. address[1] = 0; // open dialog
  84. *(short*)(address + 2) = (short)dialogName.getLength(); // block
  85. memcpy(address + 4, dialogName.getText(), dialogName.getLength());
  86. int msgSize = 4 + uiml.getLength();
  87. char* msg = new char[msgSize];
  88. *(int*)msg = uiml.getLength();
  89. memcpy(msg + 4, uiml.getText(), uiml.getLength());
  90. setMessage(msg, msgSize);
  91. }
  92. void NetworkMessage::updateDialog(
  93. Framework::Text dialogName, Framework::Text uiml)
  94. {
  95. delete[] address;
  96. addressLength = (char)(4 + dialogName.getLength());
  97. address = new char[addressLength];
  98. address[0] = 2; // gui message
  99. address[1] = 3; // update dialog
  100. *(short*)(address + 2) = (short)dialogName.getLength(); // dialog name
  101. memcpy(address + 4, dialogName.getText(), dialogName.getLength());
  102. int msgSize = 4 + uiml.getLength();
  103. char* msg = new char[msgSize];
  104. *(int*)msg = uiml.getLength();
  105. memcpy(msg + 4, uiml.getText(), uiml.getLength());
  106. setMessage(msg, msgSize);
  107. }
  108. void NetworkMessage::addressUIElement(
  109. Framework::Text elementId, int processorId)
  110. {
  111. delete[] address;
  112. addressLength = (char)(8 + elementId.getLength());
  113. address = new char[addressLength];
  114. address[0] = 2; // gui message
  115. address[1] = 1; // element message
  116. *(short*)(address + 2) = (short)elementId.getLength(); // element id
  117. memcpy(address + 4, elementId.getText(), elementId.getLength());
  118. *(int*)(address + 4 + elementId.getLength()) = processorId; // processor id
  119. }
  120. void NetworkMessage::setMessage(char* msg, int length)
  121. {
  122. delete[] message;
  123. message = msg;
  124. msgLength = length;
  125. }
  126. void NetworkMessage::sendChatMessage(ChatMessage* zMsg)
  127. {
  128. delete[] address;
  129. addressLength = 1;
  130. address = new char[1];
  131. address[0] = 4; // chat message
  132. Framework::InMemoryBuffer buffer;
  133. zMsg->writeTo(&buffer);
  134. char* msg = new char[buffer.getSize()];
  135. buffer.lese(msg, (int)buffer.getSize());
  136. setMessage(msg, (int)buffer.getSize());
  137. }
  138. void NetworkMessage::sendChatOptions(ChatObserver* zOptions)
  139. {
  140. delete[] address;
  141. addressLength = 1;
  142. address = new char[1];
  143. address[0] = 5; // chat options
  144. Framework::InMemoryBuffer buffer;
  145. zOptions->writeTo(&buffer);
  146. char* msg = new char[buffer.getSize()];
  147. buffer.lese(msg, (int)buffer.getSize());
  148. setMessage(msg, (int)buffer.getSize());
  149. }
  150. void NetworkMessage::sendMap(ChunkMap* zMap)
  151. {
  152. delete[] address;
  153. addressLength = 1;
  154. address = new char[1];
  155. address[0] = 6; // map data
  156. Framework::InMemoryBuffer buffer;
  157. zMap->writeTo(&buffer);
  158. char* msg = new char[buffer.getSize()];
  159. buffer.lese(msg, (int)buffer.getSize());
  160. setMessage(msg, (int)buffer.getSize());
  161. }
  162. void NetworkMessage::sendPlayerPositions(char* msg, int length)
  163. {
  164. delete[] address;
  165. addressLength = 1;
  166. address = new char[1];
  167. address[0] = 7; // map player positions
  168. setMessage(msg, length);
  169. }
  170. void NetworkMessage::setUseBackground()
  171. {
  172. useBackground = 1;
  173. }
  174. void NetworkMessage::sendToAll()
  175. {
  176. broadcast = true;
  177. }
  178. void NetworkMessage::animateBlockBone(int dimensionId,
  179. Framework::Punkt chunkCenter,
  180. int index,
  181. int boneId,
  182. double time,
  183. Framework::Vec3<float> pos,
  184. Framework::Vec3<float> rotation)
  185. {
  186. delete[] address;
  187. addressLength = 15;
  188. address = new char[addressLength];
  189. address[0] = 1; // dimension api
  190. *(int*)(address + 1) = dimensionId;
  191. address[5] = 1; // chunk api
  192. *(int*)(address + 6) = chunkCenter.x;
  193. *(int*)(address + 10) = chunkCenter.y;
  194. address[14] = 1; // animate block
  195. char* msg = new char[40];
  196. *(int*)(msg) = index;
  197. *(int*)(msg + 4) = boneId;
  198. *(double*)(msg + 8) = time;
  199. *(float*)(msg + 16) = pos.x;
  200. *(float*)(msg + 20) = pos.y;
  201. *(float*)(msg + 24) = pos.z;
  202. *(float*)(msg + 28) = rotation.x;
  203. *(float*)(msg + 32) = rotation.y;
  204. *(float*)(msg + 36) = rotation.z;
  205. setMessage(msg, 40);
  206. }
  207. void NetworkMessage::syncTime(
  208. double time, double nightLength, double transitionLength, double dayLength)
  209. {
  210. delete[] address;
  211. addressLength = 1;
  212. address = new char[1];
  213. address[0] = 8;
  214. delete[] message;
  215. msgLength = 8 * 4;
  216. message = new char[msgLength];
  217. *(double*)(message) = time;
  218. *(double*)(message + 8) = nightLength;
  219. *(double*)(message + 16) = transitionLength;
  220. *(double*)(message + 24) = dayLength;
  221. }
  222. void NetworkMessage::addEntityMessage(const Entity* zEntity)
  223. {
  224. Dimension* dim = Game::INSTANCE->zDimension(zEntity->getDimensionId());
  225. if (dim)
  226. {
  227. addressDimension(dim);
  228. Framework::InMemoryBuffer buffer;
  229. int id = zEntity->zType()->getId();
  230. buffer.schreibe("\x7", 1); // add entity
  231. buffer.schreibe((char*)&id, 4);
  232. id = zEntity->getId();
  233. buffer.schreibe((char*)&id, 4);
  234. Framework::Vec3<float> pos = zEntity->getPosition();
  235. buffer.schreibe((char*)&pos.x, 4);
  236. buffer.schreibe((char*)&pos.y, 4);
  237. buffer.schreibe((char*)&pos.z, 4);
  238. float maxSpeed = zEntity->getMaxSpeed();
  239. buffer.schreibe((char*)&maxSpeed, 4);
  240. float gravityMultiplier = zEntity->getGravityMultiplier();
  241. buffer.schreibe((char*)&gravityMultiplier, 4);
  242. float jumpSpeed = zEntity->getJumpSpeed();
  243. buffer.schreibe((char*)&jumpSpeed, 4);
  244. bool special = !zEntity->hasDefaultModel();
  245. buffer.schreibe((char*)&special, 1);
  246. if (special) zEntity->zSpecialModel()->writeTo(&buffer);
  247. msgLength = (int)buffer.getSize();
  248. message = new char[msgLength];
  249. buffer.lese(message, (int)buffer.getSize());
  250. }
  251. }
  252. void NetworkMessage::removeEntityMessage(const Entity* zEntity)
  253. {
  254. Dimension* dim = Game::INSTANCE->zDimension(zEntity->getDimensionId());
  255. if (dim)
  256. {
  257. addressDimension(dim);
  258. msgLength = 5;
  259. message = new char[5];
  260. message[0] = '\x8';
  261. *(int*)(message + 1) = zEntity->getId();
  262. }
  263. }
  264. void NetworkMessage::writeTo(Framework::StreamWriter* zWriter) const
  265. {
  266. int total = msgLength + addressLength;
  267. if (total > 0)
  268. {
  269. zWriter->schreibe((char*)&GameClient::Message::API_MESSAGE, 1);
  270. zWriter->schreibe((char*)&total, 4);
  271. zWriter->schreibe(address, addressLength);
  272. zWriter->schreibe(message, msgLength);
  273. if (onAfterSend) onAfterSend();
  274. }
  275. else
  276. {
  277. Framework::Logging::error() << "invalid message was queued";
  278. }
  279. }
  280. bool NetworkMessage::isBroadcast() const
  281. {
  282. return broadcast;
  283. }
  284. bool NetworkMessage::isEmpty() const
  285. {
  286. return msgLength + addressLength <= 0;
  287. }
  288. bool NetworkMessage::isUseBackground() const
  289. {
  290. return useBackground;
  291. }
  292. NetworkMessage* NetworkMessage::clone() const
  293. {
  294. NetworkMessage* result = new NetworkMessage();
  295. result->message = new char[(int)msgLength];
  296. memcpy(result->message, message, (int)msgLength);
  297. result->msgLength = msgLength;
  298. result->address = new char[(int)addressLength];
  299. memcpy(result->address, address, (int)addressLength);
  300. result->addressLength = addressLength;
  301. result->broadcast = broadcast;
  302. result->useBackground = useBackground;
  303. return result;
  304. }