00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "serverpacket.h"
00024 #include "serverdata.h"
00025
00026 #include "../common/plugin.h"
00027
00028 ServerPacket::ServerPacket( unsigned int receiver, unsigned char type, unsigned char priority,unsigned int bodysize, bool reliable )
00029 : FrameworkPacket(receiver,type,priority,bodysize,reliable),client(0)
00030 {
00031 }
00032
00033 ServerPacket::ServerPacket( char * data, unsigned int size )
00034 : FrameworkPacket(data, size),client(0)
00035 {
00036 }
00037
00038 ServerPacket::ServerPacket(
00039 const ServerData * fdata,
00040 unsigned char type,
00041 unsigned char priority,
00042 bool reliable)
00043 : FrameworkPacket(fdata->getFrameworkId(),type,priority,reliable),client(0)
00044 {
00045
00046 if(type < 4)
00047 throw new PacketError("Type is below 4, userdefined updates must be type: 4-255");
00048 }
00049
00050 ServerPacket::~ServerPacket()
00051 {
00052 }
00053
00054
00055 ServerPacket * ServerPacket::initCreateObjectPacket(const ServerData * fdata, unsigned char prio)
00056 {
00057 ServerPacket * p = new ServerPacket(fdata->getClassId(),2,prio,INITIAL_BODY_SIZE,true);
00058 p->writeUInt32(fdata->getFrameworkId());
00059 return p;
00060 }
00061
00062 ServerPacket * ServerPacket::initDestroyObjectPacket( const ServerData * fdata, unsigned char prio )
00063 {
00064 ServerPacket * p = new ServerPacket(fdata->getFrameworkId(),3,prio,INITIAL_BODY_SIZE,true);
00065 p->writeUInt32(fdata->getFrameworkId());
00066 return p;
00067 }
00068
00069
00070 void ServerPacket::writePtr( const ServerData * obj )
00071 {
00072 writeUInt32(obj ? obj->getFrameworkId() : 0);
00073 }
00074
00075 void ServerPacket::writeObject( const ServerData * obj )
00076 {
00077
00078 writePtr(obj);
00079
00080 if(obj)
00081 {
00082
00083 writePtr(obj);
00084
00085 obj->fillCreateObjectPacket(this);
00086 }
00087 }
00088
00089 ServerPacket * ServerPacket::createAckPacket( ServerPacket * packet )
00090 {
00091
00092 ServerPacket * ack = new ServerPacket(PACKET_ACK, 0, packet->getPriority(), 5, false);
00093 ack->peer = packet->peer;
00094 ack->writeUInt32(packet->getSequenceNumber());
00095 ack->writeUInt8(packet->getPriority());
00096 return ack;
00097 }
00098
00099 ServerPacket * ServerPacket::createDummyPacket( )
00100 {
00101 return createSystemPacket( DUMMY_PACKET );
00102 }
00103
00104 ServerPacket * ServerPacket::createSystemPacket( FrameworkPacket::SpecialReceivers receiver )
00105 {
00106 ServerPacket * packet = new ServerPacket(receiver, 0);
00107 packet->header->reliable = 1;
00108 return packet;
00109 }
00110
00111 ServerPacket * ServerPacket::createPluginPacket( const Plugin<ServerPacket> * plugin, const ServerPacket * _packet )
00112 {
00113 ServerPacket * packet = new ServerPacket(plugin->getUniqueId(),1,0,INITIAL_BODY_SIZE,true);
00114 packet->peer = _packet->peer;
00115 packet->client = _packet->client;
00116 return packet;
00117 }
00118
00119 ServerPacket * ServerPacket::readPacket( unsigned int psize )
00120 {
00121 before_read_check(psize);
00122 ServerPacket * pack = new ServerPacket(&data[pos], psize);
00123 pack->peer = peer;
00124 pack->client = client;
00125 pos += psize;
00126 return pack;
00127 }
00128
00129 void ServerPacket::makeSendReady( )
00130 {
00131 if(!packet_ready_to_transmit)
00132 {
00133 if(!header->reliable && !isAckPacket())
00134 {
00135
00136 header->packet_seq_number = client->getNextOutgoingPacketSeqNumber(this);
00137 }
00138 header->receiver = htonl(header->receiver);
00139 header->packet_seq_number = htonl(header->packet_seq_number);
00140 packet_ready_to_transmit = true;
00141 }
00142 }
00143
00144