Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network/src/network/PacketGenerator.cc @ 1047

Last change on this file since 1047 was 1008, checked in by dumenim, 16 years ago

changed some comments and catched some return values and maybe some stuff we have to unchange

File size: 4.9 KB
Line 
1/*
2*   ORXONOX - the hottest 3D action shooter ever to exist
3*
4*
5*   License notice:
6*
7*   This program is free software; you can redistribute it and/or
8*   modify it under the terms of the GNU General Public License
9*   as published by the Free Software Foundation; either version 2
10*   of the License, or (at your option) any later version.
11*
12*   This program is distributed in the hope that it will be useful,
13*   but WITHOUT ANY WARRANTY; without even the implied warranty of
14*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*   GNU General Public License for more details.
16*
17*   You should have received a copy of the GNU General Public License
18*   along with this program; if not, write to the Free Software
19*   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20*
21*   Author:
22*      Dumeni Manatschal, (C) 2007
23*   Co-authors:
24*      ...
25*
26*/
27
28/*
29* Class generates packets that can be send by enet
30* ->don't read this without the class PacketDecoder, since they belong together
31*
32* Autor: Dumeni Manatschal
33*
34*/
35
36#include <iostream>
37#include <list>
38#include <string>
39#include <cstring>
40
41#include "PacketTypes.h"
42#include "PacketManager.h"
43
44namespace network
45{
46  PacketGenerator::PacketGenerator() { }
47
48  //following functions create a packet in form of bytestream
49
50  ENetPacket* PacketGenerator::acknowledgement( int state, int reliable )
51  {
52    COUT(4) << "PacketGenerator: generating new acknowledgement, id: " << state << std::endl;
53    ack* ackreq = new ack;
54    ackreq->id = ACK;
55    ackreq->a = state;
56
57    ENetPacket *packet = enet_packet_create( ackreq , sizeof( *ackreq ), reliable );
58
59    return packet;
60  }
61
62  /*### mouseupdates */
63  ENetPacket* PacketGenerator::mousem( double x, double y, int reliable )
64  {
65    COUT(4) << "PacketGenerator: generating new mouse" << std::endl;
66    mouse* mousemove = new mouse;
67    mousemove->id = MOUSE;
68    mousemove->x = x;
69    mousemove->y = y;
70
71    ENetPacket *packet = enet_packet_create( mousemove , sizeof( *mousemove ), reliable );
72
73    return packet;
74  }
75
76  /*### keystrikes updates */
77  ENetPacket* PacketGenerator::keystrike( char press, int reliable )
78  {
79    COUT(4) << "PacketGenerator: generating new keyboard" << std::endl;
80    keyboard* key = new keyboard;
81    key->id = KEYBOARD;
82    key->press = press;
83
84    ENetPacket *packet = enet_packet_create( key , sizeof( *key ), reliable );
85
86    return packet;
87  }
88
89  /*### chat messages packet */
90  ENetPacket* PacketGenerator::chatMessage( const char* message, int reliable )
91  {
92    int* trans = new int[sizeof(int) + strlen(message) + 1];
93    *trans = CHAT;
94    //be carefull here, don't forget to allocate the space before using it ;-)
95    memcpy( &trans[1], (const void*)message, strlen( message ) + 1);
96    ENetPacket *packet = enet_packet_create( trans , sizeof( int ) + strlen( message ) + 1, reliable );
97
98    return packet;
99  }
100
101  /*### gamestate packet */
102  ENetPacket* PacketGenerator::gstate( GameStateCompressed* states, int reliable )
103  {
104    //std::cout << "packetgenerator" << std::endl;
105    //std::cout << "states->normsize " << states->normsize << std::endl;
106    //std::cout << "states->compsize " << states->compsize << std::endl;
107    int gid = GAMESTATE; //first assign the correct enet id
108    int totalLen = 4*sizeof( int ) + sizeof(bool) + states->compsize; //calculate the total size of the datastream memory
109    //std::cout << "totalLen " << totalLen << std::endl;
110    unsigned char *data = (unsigned char*)malloc( totalLen ); //allocate the memory for datastream
111    memcpy( (void*)(data), (const void*)&gid, sizeof( int ) ); //this is the enet id
112    memcpy( (void*)(data+sizeof(int)), (const void*)&(states->id), sizeof(int) ); //the GameStateCompressed id
113    memcpy( (void*)(data+2*sizeof(int)), (const void*)&(states->compsize), sizeof(int));
114    memcpy( (void*)(data+3*sizeof(int)), (const void*)&(states->normsize), sizeof(int));
115    memcpy( (void*)(data+4*sizeof(int)), (const void*)&(states->base_id), sizeof(int));
116    memcpy( (void*)(data+5*sizeof(int)), (const void*)&(states->diffed), sizeof(bool));
117    //place the GameStateCompressed data at the end of the enet datastream
118    memcpy( (void*)(data+5*sizeof( int ) + sizeof(bool)), (const void*)states->data, states->compsize );
119    //create an enet packet with the generated bytestream
120    ENetPacket *packet = enet_packet_create( data , totalLen, reliable );
121    //delete data;
122    return packet;
123  }
124
125  ENetPacket* PacketGenerator::clid( int classid, std::string classname, int reliable )
126  {
127    unsigned char* data = (unsigned char *)malloc(3*sizeof(int)+classname.length()+1);
128    std::cout << "PacketGenerator: classid: " << classid << ", name: " << classname << std::endl;
129    *(int *)data = CLASSID;
130    *((int *)data+1) = classname.length()+1;
131    *((int *)data+2) = classid;
132    memcpy( (void *)(data+3*sizeof(int)), classname.c_str(), classname.length()+1);
133    ENetPacket *packet = enet_packet_create( data , 3*sizeof(int)+classname.length()+1, reliable );
134    return packet;
135  }
136
137}
Note: See TracBrowser for help on using the repository browser.