From: <ac...@us...> - 2007-10-21 07:43:06
|
Revision: 11684 http://vegastrike.svn.sourceforge.net/vegastrike/?rev=11684&view=rev Author: ace123 Date: 2007-10-21 00:43:09 -0700 (Sun, 21 Oct 2007) Log Message: ----------- Fixed targetting issues, made unit_factory send a ClientState rather than a Transformation upon creation (maybe to fix the issues with cargo spawning) Modified Paths: -------------- trunk/vegastrike/src/cmd/unit_factory.h trunk/vegastrike/src/cmd/unit_factory_generic.cpp trunk/vegastrike/src/networking/lowlevel/netbuffer.cpp trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.cpp trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.h trunk/vegastrike/src/networking/netserver_clients.cpp trunk/vegastrike/src/networking/netserver_devices.cpp trunk/vegastrike/src/networking/netversion.h trunk/vegastrike/src/networking/zonemgr.cpp trunk/vegastrike/src/networking/zonemgr.h Modified: trunk/vegastrike/src/cmd/unit_factory.h =================================================================== --- trunk/vegastrike/src/cmd/unit_factory.h 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/cmd/unit_factory.h 2007-10-21 07:43:09 UTC (rev 11684) @@ -140,7 +140,7 @@ bool SubUnit, int faction, std::string customizedUnit, - const Transformation &curr_physical_state, + const ClientState &curr_state, Flightgroup *flightgroup, int fg_subnumber, string * netxml, ObjSerial netcreate); static void addUnitBuffer( NetBuffer & netbuf, const Unit *un, string *netxml=NULL); @@ -180,7 +180,7 @@ const string &fullname, int faction, const string &modifications, - const Transformation &curr_physical_state, + const ClientState &curr_state, const float damage, float phasedamage, float time, Modified: trunk/vegastrike/src/cmd/unit_factory_generic.cpp =================================================================== --- trunk/vegastrike/src/cmd/unit_factory_generic.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/cmd/unit_factory_generic.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -30,7 +30,7 @@ bool SubUnit, int faction, std::string customizedUnit, - const Transformation &curr_physical_state, + const ClientState &curr_state, Flightgroup *flightgroup, int fg_subnumber, string * netxml, ObjSerial netcreate) { @@ -44,13 +44,17 @@ netbuf.addString( flightgroup!=NULL?flightgroup->name:std::string("Object")); netbuf.addString( customizedUnit); netbuf.addInt32( fg_subnumber); - netbuf.addTransformation( curr_physical_state); + if (netbuf.version()<=4951) { + netbuf.addTransformation(curr_state.getTransformation()); + } else { + netbuf.addClientState(curr_state); + } } void UnitFactory::addUnitBuffer( NetBuffer & netbuf, const Unit *un, string *netxml) { addUnitBuffer( netbuf, un->getFilename(), un->name.get(), un->fullname, un->isSubUnit(), un->faction, - "" /* Not sure... maybe netxml will take care of this? */, un->curr_physical_state, + "" /* Not sure... maybe netxml will take care of this? */, ClientState(un), un->getFlightgroup(), un->getFgSubnumber(), netxml /*For ENTERCLIENT, will generate a saved game netxml*/, un->GetSerial()); } @@ -80,7 +84,11 @@ } Unit *un = createUnit( file.c_str(), sub, faction, custom, fg, fg_num, NULL, serial); - un->curr_physical_state = netbuf.getTransformation(); + if (netbuf.version()<=4951) { + un->curr_physical_state = netbuf.getTransformation(); + } else { + netbuf.getClientState().setUnitState(un); + } un->name = name; un->fullname = fullname; return un; @@ -219,7 +227,7 @@ const string &fullname, int faction, const string &modifications, - const Transformation &curr_physical_state, + const ClientState &curr_state, const float damage, float phasedamage, float time, @@ -241,12 +249,16 @@ netbuf.addFloat( radialeffect); netbuf.addFloat( radmult); netbuf.addFloat( detonation_radius); - netbuf.addTransformation( curr_physical_state); + if (netbuf.version()<=4951) { + netbuf.addTransformation(curr_state.getTransformation()); + } else { + netbuf.addClientState(curr_state); + } } void UnitFactory::addMissileBuffer( NetBuffer & netbuf, const Missile *mis) { addMissileBuffer( netbuf, mis->getFilename().c_str(), mis->name, mis->getFullname(), mis->faction, - "" /* modifications */, mis->curr_physical_state, mis->damage, mis->phasedamage, mis->time, + "" /* modifications */, ClientState(static_cast<const Unit*>(mis)), mis->damage, mis->phasedamage, mis->time, mis->radial_effect, mis->radial_multiplier, mis->detonation_radius, mis->GetSerial()); } @@ -270,7 +282,11 @@ cerr<<"NETCREATE MISSILE : "<<file<<endl; Missile *mis = createMissile( file.c_str(), faction, modifs, damage, phasedamage, time, radialeffect, radmult, detonation_radius, serial); - mis->curr_physical_state = netbuf.getTransformation(); + if (netbuf.version()<=4951) { + mis->curr_physical_state = netbuf.getTransformation(); + } else { + netbuf.getClientState().setUnitState(mis); + } mis->name = name; mis->fullname = fullname; return mis; Modified: trunk/vegastrike/src/networking/lowlevel/netbuffer.cpp =================================================================== --- trunk/vegastrike/src/networking/lowlevel/netbuffer.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/lowlevel/netbuffer.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -4,6 +4,8 @@ #include "networking/const.h" #include "posh.h" #include "gfxlib_struct.h" +#include "networking/netversion.h" + std::string getSimpleString(std::string &input){ int len=getSimpleInt(input); if (len>=0&&(unsigned int)len<=input.length()){ @@ -47,6 +49,7 @@ size = MAXBUFFER; memset( buffer, 0x20, size); this->buffer[size-1] = 0; + ver = NETWORK_VERSION; } NetBuffer::NetBuffer( int bufsize) { @@ -55,6 +58,7 @@ size = bufsize; memset( buffer, 0x20, size); this->buffer[size-1] = 0; + ver = NETWORK_VERSION; } /** If there is a platform where b in the call VsnetOSS::memcpy(a,b,c) must be char* @@ -65,11 +69,13 @@ NetBuffer::NetBuffer( const char * buf, int bufsize) { offset = 0; + ver = size=bufsize+1; this->buffer = new char[size]; memset( buffer, 0x20, size); VsnetOSS::memcpy( buffer, buf, bufsize); this->buffer[size-1] = 0; + ver = NETWORK_VERSION; } NetBuffer::~NetBuffer() { Modified: trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.cpp =================================================================== --- trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -17,7 +17,7 @@ this->angveloc.Set(0,0,0); } -ClientState::ClientState( Unit * un) +ClientState::ClientState( const Unit * un) { this->client_serial = un->GetSerial(); this->pos.position = un->curr_physical_state.position; @@ -27,7 +27,7 @@ this->angveloc=un->AngularVelocity; } -void ClientState::setUnitState( Unit * un) +void ClientState::setUnitState( Unit * un) const { un->curr_physical_state = this->pos; un->Velocity = this->veloc; Modified: trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.h =================================================================== --- trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.h 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/lowlevel/vsnet_clientstate.h 2007-10-21 07:43:09 UTC (rev 11684) @@ -45,16 +45,17 @@ ClientState( ObjSerial serial, QVector posit, Quaternion orientat, Vector velocity, Vector acc, Vector angvel); ClientState( ObjSerial serial, QVector posit, Quaternion orientat, Vector velocity, Vector acc, Vector angvel, unsigned int del); ClientState( ObjSerial serial, Transformation trans, Vector velocity, Vector acc, Vector angvel, unsigned int del); - ClientState( Unit * un); + ClientState( const Unit * un); - QVector getPosition() const { return this->pos.position;} - Quaternion getOrientation() const { return this->pos.orientation;} - Vector getVelocity() const { return this->veloc;} - Vector getAngularVelocity() const { return this->angveloc;} + const QVector & getPosition() const { return this->pos.position;} + const Quaternion & getOrientation() const { return this->pos.orientation;} + const Transformation & getTransformation() const { return this->pos; } + const Vector & getVelocity() const { return this->veloc;} + const Vector & getAngularVelocity() const { return this->angveloc;} //NO longer supported--wasn't indicative of actual aggregated accel Vector getAcceleration() const { retu //rn if you change this, change setAcceleration too, and all consturctor this->accel;} void setAcceleration( Vector acc) { } - void setUnitState(Unit *un); + void setUnitState(Unit *un) const; ObjSerial getSerial() const { return this->client_serial;} //float getDelay() const { return this->delay;} Modified: trunk/vegastrike/src/networking/netserver_clients.cpp =================================================================== --- trunk/vegastrike/src/networking/netserver_clients.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/netserver_clients.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -35,31 +35,39 @@ newUnits.push_back(un); } void NetServer::sendNewUnitQueue() { + unsigned short vers[4]={0,4951,4952,65535}; for (unsigned short zone=0;zone<zonemgr->getZoneNumber();zone++) { - NetBuffer netbuf; - bool added=false; - for (std::vector<UnitContainer>::iterator iter=newUnits.begin(); - iter!=newUnits.end(); - ++iter) { - Unit *un = (*iter).GetUnit(); - if (un) { - StarSystem *sys = un->getStarSystem(); - if (sys) { - unsigned short unzone = sys->GetZone(); - if (unzone == zone) { - added=true; - UnitFactory::addBuffer(netbuf, un, true); + for (int verind = 0; verind<4; verind+=2) { + unsigned short minver=vers[verind], maxver=vers[verind+1]; + NetBuffer netbuf; + if (maxver!=65535) netbuf.setVersion(maxver); + bool added=false; + for (std::vector<UnitContainer>::iterator iter=newUnits.begin(); + iter!=newUnits.end(); + ++iter) { + Unit *un = (*iter).GetUnit(); + if (un) { + StarSystem *sys = un->getStarSystem(); + if (sys) { + unsigned short unzone = sys->GetZone(); + if (unzone == zone) { + added=true; + UnitFactory::addBuffer(netbuf, un, true); + } } + } else { + COUT << "New Unit already killed before being sent!!!" << endl; } - } else { - COUT << "New Unit already killed before being sent!!!" << endl; } + if (added) { + UnitFactory::endBuffer(netbuf); + Packet p2; + p2.bc_create(CMD_ENTERCLIENT, 0, netbuf.getData(), netbuf.getDataLength(), + SENDRELIABLE, __FILE__, PSEUDO__LINE__(66)); + zonemgr->broadcast( zone, 0, &p2, true, minver, maxver); + invalidateSnapshot(); + } } - if (added) { - UnitFactory::endBuffer(netbuf); - VSServer->broadcast( netbuf, 0, zone, CMD_ENTERCLIENT, true); - VSServer->invalidateSnapshot(); - } } newUnits.clear(); } @@ -184,7 +192,7 @@ SENDRELIABLE, __FILE__, PSEUDO__LINE__(1311)); COUT<<"<<< SEND ENTERCLIENT("<<un->GetSerial()<<") TO OTHER CLIENT IN THE ZONE------------------------------------------"<<endl; - zonemgr->broadcast( clt, &packet2, true ); // , &NetworkToClient ); + zonemgr->broadcast( clt, &packet2, true); COUT<<"Serial : "<<un->GetSerial()<<endl; } // In all case set the zone and send the client the zone which it is in @@ -192,6 +200,7 @@ un->activeStarSystem->SetZone( zoneid); Packet pp; netbuf.Reset(); + netbuf.setVersion(clt->netversion); //netbuf.addShort( zoneid); //netbuf.addString( _Universe->current_stardate.GetFullTrekDate()); un->BackupState(); Modified: trunk/vegastrike/src/networking/netserver_devices.cpp =================================================================== --- trunk/vegastrike/src/networking/netserver_devices.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/netserver_devices.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -14,23 +14,31 @@ void NetServer::BroadcastTarget( ObjSerial serial, ObjSerial oldtarget, ObjSerial target, unsigned short zone) { - Packet p1; - NetBuffer netbuf1; - netbuf1.addSerial( target); + Packet p; + NetBuffer netbuf; + netbuf.addSerial( target); ClientPtr clt = this->getClientFromSerial(target); if (clt) { - p1.send( CMD_TARGET, serial, netbuf1.getData(), netbuf1.getDataLength(), SENDRELIABLE, + p.send( CMD_TARGET, serial, netbuf.getData(), netbuf.getDataLength(), SENDRELIABLE, NULL, clt->tcp_sock, __FILE__, PSEUDO__LINE__(24) ); } - Packet p2; - NetBuffer netbuf2; - netbuf2.addSerial( 0 ); + netbuf.Reset(); + netbuf.addSerial( 0 ); clt = this->getClientFromSerial(oldtarget); if (clt) { - p2.send( CMD_TARGET, serial, netbuf2.getData(), netbuf2.getDataLength(), SENDRELIABLE, + p.send( CMD_TARGET, serial, netbuf.getData(), netbuf.getDataLength(), SENDRELIABLE, NULL, clt->tcp_sock, __FILE__, PSEUDO__LINE__(34)); } + + clt = this->getClientFromSerial(serial); + if (clt && clt->netversion < 4951) { + // Old clients needed confirmation to target... + netbuf.Reset(); + netbuf.addSerial( target); + p.send( CMD_TARGET, serial, netbuf.getData(), netbuf.getDataLength(), SENDRELIABLE, + NULL, clt->tcp_sock, __FILE__, PSEUDO__LINE__(34)); + } /* Modified: trunk/vegastrike/src/networking/netversion.h =================================================================== --- trunk/vegastrike/src/networking/netversion.h 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/netversion.h 2007-10-21 07:43:09 UTC (rev 11684) @@ -1,7 +1,7 @@ #ifndef __NETVERSION_H__ #define __NETVERSION_H__ -// 0.5.0 Beta revision 1 -#define NETWORK_VERSION 4951 +// 0.5.0 Beta revision 2 +#define NETWORK_VERSION 4952 #endif Modified: trunk/vegastrike/src/networking/zonemgr.cpp =================================================================== --- trunk/vegastrike/src/networking/zonemgr.cpp 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/zonemgr.cpp 2007-10-21 07:43:09 UTC (rev 11684) @@ -235,7 +235,7 @@ /************************************************************************************************/ // Broadcast a packet to a client's zone clients -void ZoneMgr::broadcast( ClientPtr fromcltw, Packet * pckt, bool isTcp ) +void ZoneMgr::broadcast( ClientPtr fromcltw, Packet * pckt, bool isTcp, unsigned short minver, unsigned short maxver ) { ClientPtr fromclt( fromcltw ); Unit * un = fromclt->game_unit.GetUnit(); @@ -264,7 +264,8 @@ ClientPtr clt(*i); Unit * un2 = clt->game_unit.GetUnit(); // Broadcast to other clients - if( (isTcp || clt->ingame) && ((un2==NULL) || (un->GetSerial() != un2->GetSerial()))) + if( (isTcp || clt->ingame) && clt->netversion>=minver && clt->netversion<=maxver && + ((un2==NULL) || (un->GetSerial() != un2->GetSerial()))) { COUT << "BROADCASTING " << pckt->getCommand() << " to client #"; @@ -287,7 +288,7 @@ /************************************************************************************************/ // Broadcast a packet to a zone clients with its serial as argument -void ZoneMgr::broadcast( int zone, ObjSerial serial, Packet * pckt, bool isTcp ) +void ZoneMgr::broadcast( int zone, ObjSerial serial, Packet * pckt, bool isTcp, unsigned short minver, unsigned short maxver ) { if (zone >= zone_list.size()) { return; @@ -301,7 +302,8 @@ ClientPtr clt( *i ); // Broadcast to all clients including the one who did a request // Allow packets to non-ingame clients to get lost if requested UDP. - if( (isTcp || clt->ingame) /*&& un->GetSerial() != un2->GetSerial()*/ ) + if( (isTcp || clt->ingame) && clt->netversion>=minver && clt->netversion<=maxver + /*&& un->GetSerial() != un2->GetSerial()*/ ) { // COUT<<endl; if (isTcp) { Modified: trunk/vegastrike/src/networking/zonemgr.h =================================================================== --- trunk/vegastrike/src/networking/zonemgr.h 2007-10-19 19:44:48 UTC (rev 11683) +++ trunk/vegastrike/src/networking/zonemgr.h 2007-10-21 07:43:09 UTC (rev 11684) @@ -108,8 +108,8 @@ StarSystem * addClient( ClientPtr clt, string starsys, unsigned short & num_zone); void removeClient( ClientPtr clt ); - void broadcast( ClientPtr clt, Packet * pckt, bool isTcp ); - void broadcast( int zone, ObjSerial serial, Packet * pckt, bool isTcp ); + void broadcast( ClientPtr clt, Packet * pckt, bool isTcp, unsigned short minVer=0, unsigned short maxVer=65535 ); + void broadcast( int zone, ObjSerial serial, Packet * pckt, bool isTcp, unsigned short minVer=0, unsigned short maxVer=65535 ); void broadcastNoSelf( int zone, ObjSerial serial, Packet * pckt, bool isTcp ); void broadcastSample( int zone, ObjSerial serial, Packet * pckt, float frequency ); void broadcastText( int zone, ObjSerial serial, Packet * pckt, float frequency ); |