Guest User

Untitled

a guest
Jan 19th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. static int _packet_id = 1;
  2. int next_packet_id() { return _packet_id++; }
  3.  
  4. typedef const void (*_pt2handler)(unsigned char*, int, int*);
  5.  
  6. typedef void (*pt2handler)(unsigned char*, int, int*);
  7.  
  8. template <class Derived>
  9. class FixedSizeNetPacketToServer {
  10.     public:
  11.         static int message_id;
  12.         static int size;
  13.  
  14.         void serialize(unsigned char* buff, int* buff_n, int* size) {
  15.             int _buff_n = *buff_n;
  16.             pack_message_id(Derived::message_id, buff, buff_n, true);
  17.             packet(buff, buff_n, true);
  18.             *size = *buff_n - _buff_n;
  19.         }
  20.         inline void unserialize(unsigned char* buff, int* buff_n, int* size) {
  21.             int _buff_n = *buff_n;
  22.             pack_message_id(Derived::message_id, buff, buff_n, false); //auto message unpack
  23.             packet(buff, buff_n, false);
  24.             *size = *buff_n - _buff_n;
  25.         }
  26.        
  27.         virtual inline void packet(unsigned char* buff, int* buff_n, bool pack) = 0;
  28.         //inline void packet(unsigned char* buff, int* buff_n, bool pack);
  29.  
  30.         void send() {
  31.             unsigned char* buff= NetClient::get_client_out_buffer();
  32.             int* buff_n = NetClient::get_client_out_buffer_n();
  33.             if(*buff_n > 800) { printf("Cannot send message: output buffer is full! %i bytes\n", *buff_n); return; }
  34.             int bytes_written;
  35.             serialize(buff, buff_n, &bytes_written);
  36.         }
  37.  
  38.         //will overflow if more than 64 bytes
  39.         int Size() { unsigned char buff[64];int buff_n = 0;int _s;unserialize(buff, &buff_n, &_s);return _s;}
  40.  
  41.         //virtual inline void handle() = 0;
  42.  
  43.         static void handler(unsigned char* buff, int buff_n, int* bytes_read) {
  44.             Derived x;  //allocated on stack
  45.             x.unserialize(buff, &buff_n, bytes_read);
  46.             x.handle();
  47.         }
  48.  
  49.         static void register_server_packet() {
  50.             Derived x = Derived();
  51.             Derived::message_id = next_packet_id(); //set size
  52.             Derived::size = x.Size();
  53.             register_server_message_handler(Derived::message_id, Derived::size, &Derived::handler);   //server/client handler
  54.         }
  55.  
  56. };
Add Comment
Please, Sign In to add comment