Mercurial > sumwars
changeset 3:b330c4597cbf branch_net
=austauch der regionen daten erfolgreich
author | wuha |
---|---|
date | Sat, 20 Sep 2008 15:43:41 +0000 |
parents | c600266fa944 |
children | 66b3e9199244 |
files | src/core/Makefile src/core/Makefile.objs src/core/command.cpp src/core/command.h src/core/creature.cpp src/core/creature.h src/core/document.cpp src/core/network.h src/core/networkstruct.cpp src/core/networkstruct.h src/core/objectfactory.cpp src/core/objectfactory.h src/core/player.cpp src/core/player.h src/core/region.cpp src/core/region.h src/core/world.cpp src/core/world.h src/core/worldobject.cpp src/core/worldobject.h src/gl_gui/main.cpp src/gl_gui/window_main_gl.cpp |
diffstat | 22 files changed, 970 insertions(+), 269 deletions(-) [+] |
line wrap: on
line diff
--- a/src/core/Makefile Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/Makefile Sat Sep 20 15:43:41 2008 +0000 @@ -15,7 +15,7 @@ LDFLAGS = $(shell pkg-config --libs $(LIBS)) LOADLIBES = LDLIBS = $(LDFLAGS) -lm -lrt -CFLAGS = -O3 +CFLAGS = -g CXXFLAGS = $(shell pkg-config --cflags $(LIBS)) $(CFLAGS) OBJS = $(shell cat ./Makefile.objs ) DIRS = $(shell find . -mindepth 1 -maxdepth 1 -type d -not -iname .svn )
--- a/src/core/Makefile.objs Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/Makefile.objs Sat Sep 20 15:43:41 2008 +0000 @@ -34,6 +34,7 @@ ../core/document.o ../core/network.o ../core/action.o +../core/command.o ../tinyxml/tinyxml.o ../tinyxml/tinyxmlparser.o
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/command.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -0,0 +1,24 @@ +#include "command.h" + +void Command::toString(CharConv* cv) +{ + cv->toBuffer((short) m_type); + cv->toBuffer( m_goal_coordinate_x); + cv->toBuffer(m_goal_coordinate_y); + cv->toBuffer(m_goal_object_id); + cv->toBuffer(m_range); +} + +void Command::fromString(CharConv* cv) +{ + short tmp; + cv->fromBuffer(tmp); + m_type = (Action::ActionType) tmp; + cv->fromBuffer( m_goal_coordinate_x); + cv->fromBuffer(m_goal_coordinate_y); + cv->fromBuffer(m_goal_object_id); + cv->fromBuffer(m_range); + m_damage_mult =1; +} + +
--- a/src/core/command.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/command.h Sat Sep 20 15:43:41 2008 +0000 @@ -66,6 +66,22 @@ m_goal_object_id= goal_object_id; } + + /** + * \fn void toString(CharConv* cv) + * \brief Konvertiert das Objekt in einen String und schreibt ihn in der Puffer + * \param buf Ausgabepuffer + * \return Zeiger hinter den beschriebenen Datenbereich + */ + virtual void toString(CharConv* cv); + + /** + * \fn void fromString(char* buf) + * \brief Erzeugt das Objekt aus einem String + * \param buf Objekt als String + * \return Zeiger hinter den gelesenen Datenbereich + */ + virtual void fromString(CharConv* cv); /** * \fn Command()
--- a/src/core/creature.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/creature.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -2149,7 +2149,7 @@ else { // direkte Verbindung als Richtung verwenden - DEBUG("using direct way"); + DEBUG5("using direct way"); dir[0] = goalx-x; dir[1] = goaly-y; } @@ -3750,10 +3750,18 @@ { DEBUG5("Creature::tostring"); WorldObject::toString(cv); - cv->toBuffer((char) getTypeInfo()->m_category); + cv->toBuffer((short) getTypeInfo()->m_category); cv->toBuffer((char) getTypeInfo()->m_fraction); + m_action.toString(cv); - cv->toBuffer((float) (m_dyn_attr.m_health / m_base_attr_mod.m_max_health)); + m_command.toString(cv); + m_next_command.toString(cv); + + cv->toBuffer(m_dyn_attr.m_health); + cv->toBuffer(m_base_attr_mod.m_max_health); + + DEBUG5("write offset: %i",cv->getBitStream()->GetNumberOfBitsUsed()); + // Statusveraenderungen char c=0; for (int i=0;i<NR_STATUS_MODS;i++) @@ -3764,33 +3772,64 @@ } } cv->toBuffer(c); - + for (int i=0;i<NR_STATUS_MODS;i++) + { + if (m_dyn_attr.m_status_mod_time[i]>0) + { + cv->toBuffer(m_dyn_attr.m_status_mod_time[i]); + } + } + // Effekte - c=0; for (int i=0;i<NR_EFFECTS;i++) { - if (m_dyn_attr.m_effect_time[i]>0) + cv->toBuffer(m_dyn_attr.m_effect_time[i]); + } + + cv->toBuffer(getBaseAttrMod()->m_special_flags); + +} + +void Creature::fromString(CharConv* cv) +{ + WorldObject::fromString(cv); + char ctmp; + short stmp; + cv->fromBuffer<short>(stmp); + getTypeInfo()->m_category = (TypeInfo::Category) stmp; + + cv->fromBuffer<char>(ctmp); + getTypeInfo()->m_fraction = (TypeInfo::Fraction) ctmp; + + m_action.fromString(cv); + m_command.fromString(cv); + m_next_command.fromString(cv); + + cv->fromBuffer(m_dyn_attr.m_health); + cv->fromBuffer(m_base_attr_mod.m_max_health); + DEBUG5("read offset: %i",cv->getBitStream()->GetReadOffset()); + + + // Statusveraenderungen + cv->fromBuffer<char>(ctmp); + char c=0; + for (int i=0;i<NR_STATUS_MODS;i++) + { + if (c & (1 <<i )) { - c |= (1 <<i ); + cv->fromBuffer<float>(m_dyn_attr.m_status_mod_time[i]); } } - cv->toBuffer(c); - /* - #define hex(a) ((a)>=10) ? (a)-10+'a' : (a)+'0' - unsigned char* cp; - for (int i=-12;buf+i<(char*) bp;i++) - { - cp = (unsigned char*) buf+i; - //if (i%10==8) - // printf("\n %p\n",cp); - - printf("%c%c ",hex(*cp/16),hex(*cp%16)); - - } - printf("\n\n"); -*/ - - + + + + for (int i=0;i<NR_EFFECTS;i++) + { + cv->fromBuffer<float>(m_dyn_attr.m_effect_time[i]); + } + + cv->fromBuffer(getBaseAttrMod()->m_special_flags); + } bool Creature::checkAbility(Action::ActionType at)
--- a/src/core/creature.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/creature.h Sat Sep 20 15:43:41 2008 +0000 @@ -284,13 +284,21 @@ */ void calcWalkDir(float goalx,float goaly,ServerWObject* goal); - /** + /** * \fn void toString(CharConv* cv) * \brief Konvertiert das Objekt in einen String und schreibt ihn in der Puffer * \param buf Ausgabepuffer * \return Zeiger hinter den beschriebenen Datenbereich */ virtual void toString(CharConv* cv); + + /** + * \fn void fromString(char* buf) + * \brief Erzeugt das Objekt aus einem String + * \param buf Objekt als String + * \return Zeiger hinter den gelesenen Datenbereich + */ + virtual void fromString(CharConv* cv); /** * \fn bool checkAbility(Action::ActionType at)
--- a/src/core/document.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/document.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -132,7 +132,7 @@ void Document::loadSavegame() { // Savegame einlesen - DEBUG5("lese savegame"); + DEBUG("lese savegame"); char head[8]; int i; char* bp = head; @@ -170,7 +170,9 @@ file.get(data[i]); } - m_world->handleSavegame(data); + CharConv cv2((unsigned char*) data,len); + + m_world->handleSavegame(&cv2); // aktuelle Aktion setzen @@ -932,8 +934,12 @@ void Document::update(float time) { + // Welt eine Zeitscheibe weiter laufen lassen + m_world->update(time); + DEBUG5("modified is %i",m_modified); DEBUG5("State is %i",m_state); + NetStatus status; switch (m_state) { case INACTIVE: @@ -944,10 +950,17 @@ break; case LOAD_SAVEGAME: + status = m_world->getNetwork()->getSlotStatus(); if (m_server || m_world->getNetwork()->getSlotStatus() == NET_CONNECTED) { loadSavegame(); } + if (status == NET_REJECTED || status == NET_SLOTS_FULL || status == NET_TIMEOUT) + { + // Verbindung abgelehnt + m_state = SHUTDOWN; + } + case RUNNING: updateContent(time); @@ -1037,8 +1050,7 @@ } - // Welt eine Zeitscheibe weiter laufen lassen - m_world->update(time); + /* ServerHeader headerp;
--- a/src/core/network.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/network.h Sat Sep 20 15:43:41 2008 +0000 @@ -28,6 +28,16 @@ }; /** + * \enum SpecialSlot + * \brief besondere Slotnummern + */ +enum SpecialSlot +{ + LOCAL_SLOT = -1, + NOSLOT = -2, +}; + +/** * \class Network * \brief Basisklasse fuer Netzwerkinterface */ @@ -49,7 +59,6 @@ */ virtual NetStatus init( int auth_port=REQ_PORT ) { - DEBUG("test"); return NET_OK; };
--- a/src/core/networkstruct.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/networkstruct.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -1,52 +1,24 @@ #include "networkstruct.h" #include "charconv.h" -void ServerHeader::toString(CharConv* cv) + + + +void PackageHeader::toString(CharConv* cv) { - cv->toBuffer<unsigned char>((unsigned char) m_content); - cv->toBuffer(m_objects); - cv->toBuffer(m_projectiles); - cv->toBuffer(m_items); - cv->toBuffer(m_drop_items); - cv->toBuffer(m_chatmessage); - cv->toBuffer(m_trade); - cv->toBuffer(m_detailed_item); - + cv->toBuffer(m_number); } -void ServerHeader::fromString(CharConv* cv) + +void PackageHeader::fromString(CharConv* cv) { unsigned char tmp; cv->fromBuffer(tmp); m_content = (PackageType) tmp; - cv->fromBuffer<short>(m_objects); - cv->fromBuffer<short>(m_projectiles); - cv->fromBuffer<short>(m_items); - cv->fromBuffer<short>(m_drop_items); - cv->fromBuffer<bool>(m_chatmessage); - cv->fromBuffer<bool>(m_trade); - cv->fromBuffer<short>(m_detailed_item); - -} - - -void ClientHeader::toString(CharConv* cv) -{ - cv->toBuffer<unsigned char>((unsigned char) m_content); - cv->toBuffer(m_chatmessage); - -} - - -void ClientHeader::fromString(CharConv* cv) -{ - unsigned char tmp; - cv->fromBuffer(tmp); - m_content = (PackageType) tmp; - cv->fromBuffer<bool>(m_chatmessage); + cv->fromBuffer(m_number); }
--- a/src/core/networkstruct.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/networkstruct.h Sat Sep 20 15:43:41 2008 +0000 @@ -65,27 +65,92 @@ PTYPE_S2C_DATA , /** - * \brief Normale daten vom Client zum Server + * \brief Kommando vom Client zum Server */ - PTYPE_C2S_DATA, + PTYPE_C2S_COMMAND, - /** - * \brief Detailierte Daten zu einem Item vom Server zum Client - */ - PTYPE_S2C_ITEM , + /** + * \brief Anfrage nach Daten die beim Client fehlen / inkorrekt sind + */ + PTYPE_C2S_DATA_REQUEST, + + /** + * \brief Daten zu einer Region (feste Objekte und Untergrund) + */ + PTYPE_S2C_REGION , - /** - * \brief Detailierte Daten zum Schaden einer Faehigkeit vom Server zum Client - */ - PTYPE_S2C_DAMAGE , - - /** - * \brief Daten zu einer Region (feste Objekte und Untergrund) - */ - PTYPE_S2C_REGION , + /** + * \brief Daten ueber Spieler + */ + PTYPE_S2C_PLAYER, + + /** + * \brief Informationen zur Initialisierung + */ + PTYPE_S2C_INITIALISATION, }; + +/** + * \struct ClientDataRequest + * \brief Beschreibt Anfrage des Client nach Daten vom Server + */ +struct ClientDataRequest +{ + /** + * \enum Data + * \brief Zaehlt verschiedene Datenanfragen auf + */ + enum Data + { + REGION_STATIC=1, + REGION_NONSTATIC=2, + REGION_ALL=3, + ITEM = 0x10, + PLAYERS = 0x20, + OBJECT = 0x30, + PROJECTILE = 0x40, + }; + /** + * \var Data m_data + * \brief Art der geforderten Daten + */ + Data m_data; + /** + /* \var int m_id + * \brief ID des geforderten Objektes + */ + int m_id; + + /** + * \fn void toString(char* buf) + * \brief Konvertiert das Objekt in einen String und schreibt ihn in der Puffer + * \param buf Ausgabepuffer + * \return Zeiger hinter den beschriebenen Datenbereich + */ + virtual void toString(CharConv* cv) + { + cv->toBuffer((char) m_data); + cv->toBuffer(m_id); + } + + + /** + * \fn void fromString(char* buf) + * \brief Erzeugt das Objekt aus einem String + * \param buf Objekt als String + * \return Zeiger hinter den gelesenen Datenbereich + */ + virtual void fromString(CharConv* cv) + { + char tmp; + cv->fromBuffer(tmp); + m_data = (Data) tmp; + cv->fromBuffer(m_id); + } +}; + /** * \enum Button @@ -225,7 +290,11 @@ -struct ServerHeader +/** + * \struct PackageHeader + * \brief Struktur fuer den Header jedes gesendeten Paketes + */ +struct PackageHeader { /** * \var PackageType m_content @@ -234,78 +303,10 @@ PackageType m_content; /** - * \var short m_objects - * \brief Anzahl der enthaltenen Objekte - */ - short m_objects; - - /** - * \var short m_projectiles - * \brief Anzahl der Geschosse - */ - short m_projectiles; - - /** - * \var short m_items - * \brief Anzahl der enthaltenen Gegenstaende - */ - short m_items; - - /** - * \var short m_drop_items - * \brief Anzahl am Boden liegender Gegenstaende - */ - short m_drop_items; - - /** - * \var bool m_chatmessage - * \brief true, wenn die Nachricht eine Chatnachricht ist - */ - bool m_chatmessage; - - /** - * \var bool m_trade - * \brief true, wenn Handelsinformationen enthalten sind + * \var short m_number + * \brief Zaehler fuer die Art der gleichartigen Objekte */ - bool m_trade; - - /** - * \var short m_detailed_item - * \brief ID des mit detaillierten Informationen uebertragenen Items (wenn kein Item detailliert gesendet wird gleich 0 ) - */ - short m_detailed_item; - - /** - * \fn void toString(CharConv* cv) - * \brief Konvertiert das Objekt in einen String und schreibt ihn in der Puffer - * \param buf Ausgabepuffer - * \return Zeiger hinter den beschriebenen Datenbereich - */ - virtual void toString(CharConv* cv); - - - /** - * \fn void fromString(CharConv* cv) - * \brief Erzeugt das Objekt aus einem String - * \param buf Objekt als String - * \return Zeiger hinter den gelesenen Datenbereich - */ - virtual void fromString(CharConv* cv); -}; - -struct ClientHeader -{ - /** - * \var PackageType m_content - * \brief Art der Nachricht - */ - PackageType m_content; - - /** - * \var bool m_chatmessage - * \brief true, wenn die Nachricht eine Chatnachricht ist - */ - bool m_chatmessage; + short m_number; /** * \fn void toString(CharConv* cv)
--- a/src/core/objectfactory.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/objectfactory.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -217,13 +217,17 @@ registerMonster("gob_dog",mdata); } -ServerWObject* ObjectFactory::createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype) +ServerWObject* ObjectFactory::createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype, int id) { // Zeiger auf erzeugtes Objekt ServerWObject* ret=0; // ID des Objektes - int id = m_world->getValidId(); + if (id ==0) + { + id = m_world->getValidId(); + } + if (type ==WorldObject::TypeInfo::TYPE_PLAYER) { if (subtype == "warrior")
--- a/src/core/objectfactory.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/objectfactory.h Sat Sep 20 15:43:41 2008 +0000 @@ -23,10 +23,13 @@ public: /** - * \fn static ServerWObject* createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype) + * \fn static ServerWObject* createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype, int id=0) * \brief Erzeugt ein Objekt des angefordertens Typs/Subtyps + * \param type Typ des Objektes + * \param subtype Subtyp des Objektes + * \param id ID des Objektes. Wenn id==0 wird eine neue ID generiert */ - static ServerWObject* createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype); + static ServerWObject* createObject(WorldObject::TypeInfo::ObjectType type, WorldObject::TypeInfo::ObjectSubtype subtype, int id=0); /** * \var static World* m_world
--- a/src/core/player.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/player.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -1534,8 +1534,22 @@ { DEBUG5("Player::tostring"); Creature::toString(cv); - + cv->toBuffer((char*) m_name.c_str(),32); + + cv->toBuffer(getBaseAttr()->m_level); + cv->toBuffer(getBaseAttr()->m_step_length); + cv->toBuffer(getBaseAttrMod()->m_attack_speed); + cv->toBuffer(getBaseAttrMod()->m_walk_speed); + cv->toBuffer(m_timer1); + cv->toBuffer(m_timer1_max); + cv->toBuffer(m_timer2); + cv->toBuffer(m_timer2_max); + for (int i=0; i<6; i++) + { + cv->toBuffer(getBaseAttrMod()->m_abilities[i]); + } + /* #define hex(a) ((a)>=10) ? (a)-10+'a' : (a)+'0' @@ -1554,6 +1568,31 @@ } + +void Player::fromString(CharConv* cv) +{ + Creature::fromString(cv); + + char tmp[32]; + cv->fromBuffer(tmp,32); + m_name = tmp; + + cv->fromBuffer(getBaseAttr()->m_level); + cv->fromBuffer(getBaseAttr()->m_step_length); + cv->fromBuffer(getBaseAttrMod()->m_attack_speed); + cv->fromBuffer(getBaseAttrMod()->m_walk_speed); + cv->fromBuffer(m_timer1); + cv->fromBuffer(m_timer1_max); + cv->fromBuffer(m_timer2); + cv->fromBuffer(m_timer2_max); + for (int i=0; i<6; i++) + { + cv->fromBuffer(getBaseAttrMod()->m_abilities[i]); + } + +} + + void Player::toStringComplete(CharConv* cv) { this->toString(cv);
--- a/src/core/player.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/player.h Sat Sep 20 15:43:41 2008 +0000 @@ -218,6 +218,14 @@ virtual void toString(CharConv* cv); /** + * \fn void fromString(char* buf) + * \brief Erzeugt das Objekt aus einem String + * \param buf Objekt als String + * \return Zeiger hinter den gelesenen Datenbereich + */ + virtual void fromString(CharConv* cv); + + /** * \fn void toString(v oi buf) * \brief Konvertiert das Objekt in einen String und schreibt ihn in der Puffer * \param buf Ausgabepuffer
--- a/src/core/region.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/region.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -2,7 +2,7 @@ #include "world.h" -Region::Region(short dimx, short dimy) +Region::Region(short dimx, short dimy, short id) { DEBUG5("creating region"); m_data_grid = new Matrix2d<Gridunit>(dimx,dimy); @@ -24,7 +24,7 @@ // Liste der Gegenstaende m_drop_items = new map<int,DropItem*>; - + m_id = id; } Region::~Region() @@ -539,12 +539,14 @@ bool result = true; if (object->getTypeInfo()->m_type == WorldObject::TypeInfo::TYPE_PLAYER) { - DEBUG("player entered Region"); + DEBUG5("player entered Region"); result &= (m_players->insert(make_pair(object->getId(),object))).second; // Daten der Region zum Server senden - object->setState(WorldObject::STATE_REGION_ENTERED); + //object->setState(WorldObject::STATE_REGION_ENTERED); } + + object->getGridLocation()->m_region = m_id; // Einfügen in den Binärbaum if (object->getState() != WorldObject::STATE_STATIC) @@ -598,6 +600,7 @@ m_projectiles->insert(make_pair(object->getId(),object)); object->getGeometry()->m_coordinate_x = x; object->getGeometry()->m_coordinate_y = y; + object->setRegion( m_id); return true; } @@ -759,24 +762,12 @@ DEBUG5("update projektile abgeschlossen"); } -void Region::getRegionDataString(CharConv* cv) +void Region::getRegionData(CharConv* cv) { // Dimension des Feldes angeben cv->toBuffer((short) m_dimx); cv->toBuffer((short) m_dimy); - // Anzahl der Objekte eintragen - DEBUG("static objects: %i",m_static_objects->size()); - cv->toBuffer<short>((short) m_static_objects->size()); - - // statische Objekte in den Puffer eintragen - map<int,ServerWObject*>::iterator it; - for (it = m_static_objects->begin();it!=m_static_objects->end();++it) - { - (it->second)->toString(cv); - DEBUG("static object: %s",(it->second)->getNameId().c_str()); - } - // Tiles eintragen int i,j; for (i =0;i<m_dimx*2;i++) @@ -787,6 +778,158 @@ } } + // Anzahl der statischen Objekte eintragen + DEBUG("static objects: %i",m_static_objects->size()); + cv->toBuffer<short>((short) m_static_objects->size()); + + // statische Objekte in den Puffer eintragen + map<int,ServerWObject*>::iterator it; + for (it = m_static_objects->begin();it!=m_static_objects->end();++it) + { + (it->second)->toString(cv); + DEBUG5("static object: %s",(it->second)->getNameId().c_str()); + } + + + // Anzahl der nicht statischen Objekte eintragen + DEBUG("nonstatic objects: %i",m_objects->size()); + cv->toBuffer<short>((short) m_objects->size()); + + // nicht statische Objekte in den Puffer eintragen + map<int,ServerWObject*>::iterator jt; + for (jt = m_objects->begin();jt!=m_objects->end();++jt) + { + DEBUG5("write offset: %i",cv->getBitStream()->GetNumberOfBitsUsed()); + (jt->second)->toString(cv); + + DEBUG5("object: %s",(jt->second)->getNameId().c_str()); + } + + + +} + +void Region::setRegionData(CharConv* cv,map<int,ServerWObject*>* players) +{ + // Groesse der Region wird schon vorher eingelesen + // Tiles eintragen + int i,j; + for (i =0;i<m_dimx*2;i++) + { + for (j=0;j<m_dimy*2;j++) + { + cv->fromBuffer(*(m_tiles->ind(i,j))); + } + } + + + // alle bisherigen statischen Objekte entfernen + map<int,ServerWObject*>::iterator it; + for (it = m_static_objects->begin();it!=m_static_objects->end();it++) + { + it->second->destroy(); + deleteSWObject(it->second); + delete it->second; + } + m_static_objects->clear(); + + char type; + char subt[11]; + subt[10] ='\0'; + int id; + + // statische Objekte einlesen + short nr_stat; + cv->fromBuffer<short>(nr_stat); + DEBUG("static objects: %i",nr_stat); + + ServerWObject* obj; + float x,y; + for (int i=0; i<nr_stat;i++) + { + cv->fromBuffer(type); + cv->fromBuffer(subt,10); + cv->fromBuffer(id); + + obj = ObjectFactory::createObject((WorldObject::TypeInfo::ObjectType) type, std::string(subt),id); + + obj->fromString(cv); + + x = obj->getGeometry()->m_shape.m_coordinate_x; + y = obj->getGeometry()->m_shape.m_coordinate_y; + + insertSWObject(obj,x,y); + + } + + // alle bisherigen nichtstatischen Objekte entfernen + // die SpielerObjekte bleiben erhalten, alle anderen werden geloescht + map<int,ServerWObject*>::iterator jt; + for (jt = m_objects->begin();jt!=m_objects->end();jt++) + { + if (jt->second->getTypeInfo()->m_type != WorldObject::TypeInfo::TYPE_PLAYER) + { + jt->second->destroy(); + deleteSWObject(jt->second); + delete jt->second; + } + } + m_objects->clear(); + m_players->clear(); + + // neue Objekte einlesen + short nr_nonstat; + cv->fromBuffer<short>(nr_nonstat); + DEBUG("nonstatic objects: %i",nr_nonstat); + + for (int i=0; i<nr_nonstat;i++) + { + DEBUG5("read offset: %i",cv->getBitStream()->GetReadOffset()); + + cv->fromBuffer(type); + cv->fromBuffer(subt,10); + cv->fromBuffer(id); + + DEBUG("object %s id %i",subt,id); + + // alle Objekte ausser den Spielern werden neu angelegt + // die Spieler existieren schon + if (type != WorldObject::TypeInfo::TYPE_PLAYER) + { + obj = ObjectFactory::createObject((WorldObject::TypeInfo::ObjectType) type, std::string(subt),id); + } + else + { + if (players->count(id) ==0) + { + ERRORMSG("player (%s) with id %i does not exist",subt,id); + } + obj = (*players)[id]; + } + + obj->fromString(cv); + + x = obj->getGeometry()->m_shape.m_coordinate_x; + y = obj->getGeometry()->m_shape.m_coordinate_y; + + + insertSWObject(obj,x,y); + + } + + /* + DEBUG("objects"); + map<int,ServerWObject*>::iterator mt; + for (mt = m_static_objects->begin();mt!=m_static_objects->end();mt++) + { + DEBUG("%s id %i at %f %f",mt->second->getTypeInfo()->m_subtype.c_str(),mt->second->getId(), mt->second->getGeometry()->m_shape.m_coordinate_x,mt->second->getGeometry()->m_shape.m_coordinate_y); + } + + for (mt = m_objects->begin();mt!=m_objects->end();mt++) + { + DEBUG("%s id %i at %f %f",mt->second->getTypeInfo()->m_subtype.c_str(),mt->second->getId(), mt->second->getGeometry()->m_shape.m_coordinate_x,mt->second->getGeometry()->m_shape.m_coordinate_y); + } + */ } void Region::setTile(Tile tile,short x, short y)
--- a/src/core/region.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/region.h Sat Sep 20 15:43:41 2008 +0000 @@ -49,12 +49,12 @@ { public: /** - * \fn Region(short dimx, short dimy) + * \fn Region(short dimx, short dimy, short id) * \brief Konstruktor * \param dimx Ausdehnung in x-Richtung * \param dimy Ausdehnung in y-Richtung */ - Region(short dimx, short dimy); + Region(short dimx, short dimy, short id); /** @@ -255,21 +255,18 @@ void getItemsOnScreen(float center_x,float center_y, list<DropItem*>* result); /** - * \fn void getRegionDataString(CharConv* cv) - * \brief Schreibt alle statischen Objekte sowie Tiles in einen String. Der Puffer wird in der Funktion angelegt + * \fn void getRegionData(CharConv* cv) + * \brief Schreibt alle Objekte, Projektile, Items und Tiles in einen String * \param buf Eingabepuffer * \return Zeiger hinter den beschriebenen Bereich */ - void getRegionDataString(CharConv* cv); + void getRegionData(CharConv* cv); /** - * \fn int getRegionDataStringLength() - * \brief Gibt die zu erwartende Laenge des Strings aus + * \fn void setRegionData(CharConv* cv) + * \brief Liest die Objekte, Projektile, Items und Tiles aus einem String ein */ - int getRegionDataStringLength() - { - return m_static_objects->size()*30+10+m_dimx*m_dimy*4; - } + void setRegionData(CharConv* cv, map<int,ServerWObject*>* players); /** * \fn setTile(Tile tile,short x, short y) @@ -365,6 +362,12 @@ */ map<int,DropItem*>* m_drop_items; + /** + /* \var short m_id + * \brief Nummer der Region + */ + short m_id; + }; #include "gridunit.h"
--- a/src/core/world.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/world.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -34,6 +34,7 @@ // diverse Initialisierungen m_player_slots = new map<int,ServerWObject*>; + m_players = new map<int,ServerWObject*>;; // Baum fuer die Handelsvorgaenge anlegen m_trades = new map<int, Trade* >; @@ -102,7 +103,7 @@ } else if(type==2) { - Region* reg = new Region(25,25); + Region* reg = new Region(25,25,region); short rid = insertRegion(reg,region); @@ -271,7 +272,7 @@ list<int>::iterator i; Packet* data; int lend; - ClientHeader header; + PackageHeader header; DEBUG5("update logins"); for (i=m_logins.begin();i!=m_logins.end();) { @@ -284,9 +285,10 @@ header.fromString(&cv); if (header.m_content == PTYPE_C2S_SAVEGAME) { - DEBUG("got savegame from slot %i",(*i)); + DEBUG5("got savegame from slot %i",(*i)); + handleSavegame(&cv,*i); + i = m_logins.erase(i); - i = m_logins.erase(i); } else { @@ -323,6 +325,7 @@ delete[] m_parties; delete m_player_slots; + delete m_players; } @@ -794,29 +797,15 @@ object->getGeometry()->m_shape.m_coordinate_y=y; Region* r = m_regions[region]; - if (r==0) - { - // Region existiert nicht - - - // Serverseite: Region erzeugen - if (m_server) - { - createRegion(region); - r = m_regions[region]; - - // wenn das Objekt nicht lokal ist - if (object != m_local_player) - { - // Daten zu dem Spieler senden, der die Informationen benoetigt - } - } - } if (r!=0) { result &= r->insertSWObject(object,x,y); } + else + { + return false; + } return result; } @@ -824,7 +813,21 @@ bool World::insertPlayer(ServerWObject* player, int slot) { - m_player_slots->insert(make_pair(slot,player)); + if (slot != NOSLOT) + { + m_player_slots->insert(make_pair(slot,player)); + } + m_players->insert(make_pair(player->getId(),player)); + + /* + DEBUG("all players: "); + map<int,ServerWObject*>::iterator it; + + for (it = m_players->begin(); it != m_players->end(); ++it) + { + DEBUG("%s with id %i",it->second->getTypeInfo()->m_subtype.c_str(), it->second->getId()); + } + */ } @@ -879,45 +882,99 @@ } - +bool World::insertPlayerIntoRegion(ServerWObject* player, short region) +{ + Region* reg = m_regions[region]; + + // Testen ob alle Daten vorhanden sind + int data_missing =0; + if (reg ==0) + { + data_missing =1; + } + -void World::handleSavegame(char* data, int slot) + + // Serverseite: Region erzeugen + if (player->getState() != WorldObject::STATE_ENTER_REGION) + { + if (m_server) + { + if (data_missing !=0) + { + createRegion(region); + reg = m_regions[region]; + } + + if (player == m_local_player) + { + // Spieler in die Region einfuegen + player->setState(WorldObject::STATE_ENTER_REGION); + DEBUG("player can enter region"); + } + else + { + // Auf Datenanfrage seitens des Client warten + player->setState(WorldObject::STATE_REGION_DATA_WAITING); + DEBUG("waiting for a client data request"); + } + + + } + else + { + // Clientseite + if (player == m_local_player) + { + // Server nach den fehlenden Informationen fragen + player->setState(WorldObject::STATE_REGION_DATA_REQUEST); + + } + else + { + // anderer Spieler wurde in unbekannte Region eingefuegt, ignorieren + player->setState(WorldObject::STATE_INACTIVE); + } + + } + } + + if (player->getState() == WorldObject::STATE_ENTER_REGION) + { + DEBUG("player %i entered region %i",player->getId(), region); + // Daten sind vollständig + float x,y; + x = player->getGeometry()->m_shape.m_coordinate_x; + y = player->getGeometry()->m_shape.m_coordinate_y; + reg->getFreePlace(&(player->getGeometry()->m_shape),player->getGeometry()->m_layer , x, y); + insertSWObject(player, x,y,region); + player->setState(WorldObject::STATE_ACTIVE); + + } +} + +void World::handleSavegame(CharConv *cv, int slot) { + DEBUG("got savegame from slot %i",slot); // Spieler aus dem Savegame erzeugen - CharConv cv((unsigned char*) data,18); char binsave; - cv.fromBuffer<char>(binsave); + cv->fromBuffer<char>(binsave); short version; - cv.fromBuffer<short>(version); + cv->fromBuffer<short>(version); int len; - cv.fromBuffer<int>(len); + cv->fromBuffer<int>(len); WorldObject::TypeInfo::ObjectSubtype ot; char tmp[11]; tmp[10] = '\0'; - cv.fromBuffer(tmp,10); + cv->fromBuffer(tmp,10); ot = tmp; ServerWObject* pl =0; - + DEBUG("type %s",tmp); pl=ObjectFactory::createObject(WorldObject::TypeInfo::TYPE_PLAYER, ot); - // Spieler zur Welt hinzufuegen - if (pl!=0) - { - insertPlayer(pl,slot); - insertSWObject(pl,6,11,0); - - - } - - // Wenn man sich auf Serverseite befindet - if (m_server) - { - // Event hinzufuegen, dass dieser Spieler die Welt betreten hat - } - // Spieler ist lokal - if (slot == -1) + if (slot == LOCAL_SLOT) { m_local_player = pl; @@ -925,15 +982,97 @@ { // Savegame dem Server senden // Savegame an den Server senden - ClientHeader header; + PackageHeader header; header.m_content = PTYPE_C2S_SAVEGAME; // Savegame von Client zu Server - header.m_chatmessage = false; // keine Chatnachricht + header.m_number =1; CharConv save; header.toString(&save); - save.toBuffer(data,len); + + save.toBuffer((char*) cv->getBitStream()->GetData(),len); m_network->pushSlotMessage(save.getBitStream()); } } + + // Spieler zur Welt hinzufuegen + if (pl!=0) + { + DEBUG("insert player"); + insertPlayer(pl,slot); + // Daten aus dem Savegame laden + + pl->setState(WorldObject::STATE_ACTIVE); + + // Debugging: Region, Koordinaten setzen + pl->getGridLocation()->m_region =0; + pl->getGeometry()->m_shape.m_coordinate_x = 6; + pl->getGeometry()->m_shape.m_coordinate_y = 11; + + insertPlayerIntoRegion(pl,pl->getGridLocation()->m_region); + + if (m_server) + { + map<int,ServerWObject*>::iterator it; + + if (slot != LOCAL_SLOT) + { + // Daten zur Initialisierung + PackageHeader header3; + header3.m_content =PTYPE_S2C_INITIALISATION; + header3.m_number =1; + + CharConv msg2; + header3.toString(&msg2); + + // die eigene ID auf Serverseite + msg2.toBuffer(pl->getId()); + + m_network->pushSlotMessage(msg2.getBitStream(),slot); + + // Dem Spieler Informationen ueber alle anderen Spieler in der Welt senden + PackageHeader header; + header.m_content = PTYPE_S2C_PLAYER; // Spielerdaten vom Server zum Client + header.m_number = m_player_slots->size()-1; // alle Spieler bis auf den eigenen + + CharConv msg; + header.toString(&msg); + + // Informationen ueber die Spieler + for (it = m_player_slots->begin(); it != m_player_slots->end(); ++it) + { + // Nur senden, wenn es nicht der eigene Spieler ist + if (it->first != slot) + { + it->second->toString(&msg); + } + } + + // Nachricht an den Client senden + if (header.m_number>0) + { + m_network->pushSlotMessage(msg.getBitStream(),slot); + } + } + + // Nachricht von dem neuen Spieler an alle anderen Spieler senden + // ausser dem Spieler selbst und dem Server + PackageHeader header2; + header2.m_content = PTYPE_S2C_PLAYER; // Spielerdaten vom Server zum Client + header2.m_number = 1; // der neue Spieler + + CharConv msg2; + header2.toString(&msg2); + pl->toString(&msg2); + + for (it = m_player_slots->begin(); it != m_player_slots->end(); ++it) + { + if (it->first != slot && it->first != LOCAL_SLOT) + { + m_network->pushSlotMessage(msg2.getBitStream(),it->first); + } + } + } + } + } @@ -950,9 +1089,9 @@ CharConv cv; // Header anlegen - ClientHeader header; - header.m_content = PTYPE_C2S_DATA; // Daten von Client zu Server - header.m_chatmessage = false; // keine Chatnachricht + PackageHeader header; + header.m_content = PTYPE_C2S_COMMAND; // Daten von Client zu Server + header.m_number = 1; // Header in den Puffer schreiben @@ -982,7 +1121,7 @@ int World::getValidId() { // zufällige ID erzeugen; - static int j=0; + static int j=1; return j++; } @@ -990,8 +1129,7 @@ int World::getValidProjectileId() { // zufällige ID erzeugen; - static int i=0; - return i++; + return getValidId(); } @@ -1040,31 +1178,250 @@ } DEBUG5("Trades behandeln abgeschlossen"); + m_network->update(); + + if (m_server) { updateLogins(); acceptLogins(); } - // Schleife ueber die Spieler - map<int,ServerWObject*>::iterator it; - Player* pl; - for (it = m_player_slots->begin(); it != m_player_slots->end(); ++it) - { - - pl = static_cast<Player*>(it->second); - - // TODO: weitere Bedingungen damit ein Spieler in einer Region aktiviert wird - if (pl->getState() == WorldObject::STATE_REGION_ENTERED && pl->getRegion() !=0 ) - { - pl->setState(WorldObject::STATE_ACTIVE); - } - } + + updatePlayers(); m_network->update(); } +void World::updatePlayers() +{ + // Schleife ueber die Spieler + map<int,ServerWObject*>::iterator it; + Player* pl; + int slot; + for (it = m_player_slots->begin(); it != m_player_slots->end(); ++it) + { + slot = it->first; + pl = static_cast<Player*>(it->second); + + if (pl->getState() == WorldObject::STATE_REGION_DATA_REQUEST) + { + DEBUG("send data request to server"); + // Client wartet auf Daten zur Region + pl->setState(WorldObject::STATE_REGION_DATA_WAITING); + + // fehlende Daten zur Region anfordern + PackageHeader header; + header.m_content = PTYPE_C2S_DATA_REQUEST; // Data Request von Client zu Server + header.m_number =1; + + ClientDataRequest datareq; + datareq.m_data = ClientDataRequest::REGION_ALL; + datareq.m_id = pl->getGridLocation()->m_region; + + CharConv msg; + header.toString(&msg); + datareq.toString(&msg); + + m_network->pushSlotMessage(msg.getBitStream()); + } + + if (pl->getState() == WorldObject::STATE_ENTER_REGION && pl->getRegion() !=0 ) + { + insertPlayerIntoRegion(pl,pl->getGridLocation()->m_region); + pl->setState(WorldObject::STATE_ACTIVE); + } + + + if (m_server && slot != -1) + { + // Nachrichten fuer die Spieler abholen und Verteilen + PackageHeader headerp; + Packet* data; + CharConv* cv; + + if (m_network->getSlotStatus( slot )!=NET_CONNECTED) + { + // disconnect + } + else + { + while (m_network->numberSlotMessages( slot )>0) + { + m_network->popSlotMessage( data ,slot); + + cv = new CharConv(data); + + headerp.fromString(cv); + + if (headerp.m_content == PTYPE_C2S_COMMAND) + { + // Kommando Daten erhalten + ClientCommand com; + + // Spielerobjekt die Daten senden + com.fromString(cv); + + handleCommand(&com,slot); + } + + if (headerp.m_content == PTYPE_C2S_DATA_REQUEST) + { + // Datenanfrage erhalten + ClientDataRequest req; + req.fromString(cv); + + handleDataRequest(&req,slot); + } + + delete cv; + } + } + } + + } + + if (!m_server) + { + // Daten vom Server empfangen und verarbeiten + if (m_network->getSlotStatus()!=NET_CONNECTED) + { + // disconnect + } + else + { + PackageHeader headerp; + Packet* data; + CharConv* cv; + + while (m_network->numberSlotMessages()>0) + { + m_network->popSlotMessage( data ,slot); + + cv = new CharConv(data); + + headerp.fromString(cv); + + if (headerp.m_content == PTYPE_S2C_PLAYER) + { + for (int n=0; n< headerp.m_number;n++) + { + // Daten zu Spielern erhalten + // Typ Spieler (schon bekannt) + char tmp; + cv->fromBuffer(tmp); + + // Subtyp + char subt[11]; + subt[10] ='\0'; + cv->fromBuffer(subt,10); + + int id; + cv->fromBuffer(id); + ServerWObject* player; + + DEBUG("got data for player %s id %i",subt,id); + + // Spieler entweder neu anlegen oder aus den existierenden herraussuchen + if (m_players->count(id)==0) + { + // Spieler existiert noch nicht + player = ObjectFactory::createObject(WorldObject::TypeInfo::TYPE_PLAYER, std::string(subt),id); + insertPlayer(player); + } + else + { + player = (*m_players)[id]; + } + + // Daten aktualisieren + player->fromString(cv); + + } + + } + + if (headerp.m_content == PTYPE_S2C_REGION) + { + // Daten zu einer Region erhalten + DEBUG("got data for region %i",headerp.m_number); + short dimx, dimy; + + // Groesse der Region + cv->fromBuffer(dimx); + cv->fromBuffer(dimy); + + // Region anlegen wenn sie noch nicht existiert + if (m_regions[headerp.m_number] ==0) + { + m_regions[headerp.m_number] = new Region(dimx,dimy,headerp.m_number); + } + + // Daten schreiben + m_regions[headerp.m_number]->setRegionData(cv,m_players); + + // lokalen Spieler fuer die Region freischalten + m_local_player->setState(WorldObject::STATE_ENTER_REGION); + } + + if (headerp.m_content == PTYPE_S2C_INITIALISATION) + { + int id; + cv->fromBuffer(id); + DEBUG("ID at server %i",id); + m_players->clear(); + m_local_player->setId(id); + insertPlayer(m_local_player, LOCAL_SLOT); + } + + delete cv; + } + } + } +} + +void World::handleDataRequest(ClientDataRequest* request, int slot ) +{ + // Spieler von dem die Anfrage ausging + ServerWObject* player; + + // Spieler in dem betreffenden Slot aktivieren + if (m_player_slots->count(slot)==0) + { + ERRORMSG("got request from an empty slot %i",slot); + return; + } + else + { + player = (*m_player_slots)[slot]; + } + + if (request->m_data <= ClientDataRequest::REGION_ALL) + { + DEBUG("Daten zur Region %i gefordert",request->m_id); + Region* region = m_regions[request->m_id]; + + if (region!=0) + { + // Daten der Region senden + PackageHeader header; + header.m_content = PTYPE_S2C_REGION; + header.m_number =request->m_id; + + CharConv msg; + header.toString(&msg); + + region->getRegionData(&msg); + + m_network->pushSlotMessage(msg.getBitStream(),slot); + + player->setState(WorldObject::STATE_ENTER_REGION); + + } + + } +} bool World::calcBlockmat(PathfindInfo * pathinfo) {
--- a/src/core/world.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/world.h Sat Sep 20 15:43:41 2008 +0000 @@ -87,6 +87,8 @@ */ ~World(); + + /** * \fn bool init() * \brief initialisiert die Welt @@ -117,6 +119,12 @@ * \return gibt die ID der Region an, die an allen Objekten in der Region gespeichert wird. Im Falle eines Fehlers wird -1 zurueckgegeben. */ short insertRegion(Region* region, int rnr); + + /** + * \fn bool insertPlayerIntoRegion(ServerWObject* player, short region) + * \brief Versucht einen Spieler in eine Region einzufuegen + */ + bool insertPlayerIntoRegion(ServerWObject* player, short region); //Operations /** @@ -244,10 +252,10 @@ bool insertSWObject (ServerWObject* object, float x, float y, short region); /** - * \fn bool insertPlayer(ServerWObject* player, int slot) + * \fn bool insertPlayer(ServerWObject* player, int slot = NOSLOT) * \brief Fuegt einen neuen Spieler hinzu */ - bool insertPlayer(ServerWObject* player, int slot); + bool insertPlayer(ServerWObject* player, int slot= NOSLOT); /** * \fn bool insertProjectile(DmgProjectile* object, float x, float y, short region) @@ -336,10 +344,16 @@ /** * \fn update(float time) - * \brief Lässt für alle Objekte in der Welt die angegebene Zeitspanne verstreichen + * \brief Laesst für alle Objekte in der Welt die angegebene Zeitspanne verstreichen * \param time Zeit um die in der Welt vergeht in Millisekunden */ void update(float time); + + /** + * \fn void updatePlayers() + * \brief Aktualisiert die Spielerobjekte + */ + void updatePlayers(); /** * \fn void calcBlockArray(PathfindInfo* p) @@ -422,20 +436,28 @@ static float getDistance(Shape& s1, Shape& s2); /** - * \fn void handleSavegame(char* data, int slot=-1) + * \fn void handleSavegame(CharConv *cv, int slot=LOCAL_SLOT) * \brief Behandelt den Empfang eines Savegames * \param data Savegame * \param slot Slot ueber den das Savegame empfangen wurde. Wenn das Savegame nicht ueber das Netzwerk uebertragen wurde -1 */ - void handleSavegame(char* data, int slot=-1); + void handleSavegame(CharConv *cv , int slot=LOCAL_SLOT); /** - * \fn void handleCommand(ClientCommand* cmd, int slot=-1) + * \fn void handleCommand(ClientCommand* cmd, int slot=LOCAL_SLOT) * \brief Behandelt ein erhaltenes Kommmando * \param cmd Kommando * \param slot Slot ueber den das Kommando empfangen wurde. Wenn das Kommando nicht ueber das Netzwerk uebertragen wurde -1 */ - void handleCommand(ClientCommand* cmd, int slot=-1); + void handleCommand(ClientCommand* cmd, int slot=LOCAL_SLOT); + + /** + * \fn void handleDataRequest(ClientDataRequest* request, int slot = LOCAL_SLOT) + * \brief Behandelt eine Anfrage nach Daten vom Client + * \param request beschreibt welche Daten gefordert werden + * \param slot Ziel der Daten + */ + void handleDataRequest(ClientDataRequest* request, int slot = LOCAL_SLOT); // debug only @@ -472,9 +494,16 @@ /** * \var m_players - * Liste der Spieler in der Welt + * \brief Liste der Spieler in der Welt mit ihren Slots */ map<int,ServerWObject*>* m_player_slots; + + /** + * \var map<int,ServerWObject*>* m_players + * \brief Liste der Spieler in der Welt sortiert nach ID + */ + map<int,ServerWObject*>* m_players; + /** * \var int m_max_nr_players
--- a/src/core/worldobject.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/worldobject.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -26,20 +26,30 @@ cv->toBuffer((char) m_geometry.m_layer); cv->toBuffer(m_geometry.m_angle); + cv->toBuffer((char) m_state); } void WorldObject::fromString(CharConv* cv) { + int itmp; short tmp; char ctmp; + + // Typ, Subtyp und ID werden extern gelesen + /* cv->fromBuffer<char>(ctmp); m_type_info.m_type = (TypeInfo::ObjectType) ctmp; + char stmp[11]; stmp[10] ='\0'; cv->fromBuffer(stmp,10); - m_type_info.m_subtype = stmp; + m_type_info.m_subtype = stmp; + + cv->fromBuffer<int>(m_id); + + */ cv->fromBuffer<float>(m_geometry.m_shape.m_coordinate_x) ; cv->fromBuffer<float>(m_geometry.m_shape.m_coordinate_y); cv->fromBuffer<char>(ctmp); @@ -58,6 +68,8 @@ m_geometry.m_layer = (Geometry::Layer) ctmp; cv->fromBuffer<float>(m_geometry.m_angle); + cv->fromBuffer<char>(ctmp); + m_state = (State) ctmp; } string WorldObject::getName()
--- a/src/core/worldobject.h Fri Sep 19 13:26:58 2008 +0000 +++ b/src/core/worldobject.h Sat Sep 20 15:43:41 2008 +0000 @@ -314,7 +314,9 @@ STATE_ACTIVE =1, STATE_DIEING =2, STATE_DEAD =3, - STATE_REGION_ENTERED =5, + STATE_REGION_DATA_REQUEST=6, + STATE_REGION_DATA_WAITING=4, + STATE_ENTER_REGION =5, STATE_STATIC = 10, }; @@ -429,6 +431,15 @@ { return m_id; } + + /** + * \fn void setId(int id) + * \brief Setzt die ID eines Objektes + */ + void setId(int id) + { + m_id = id; + } /** * \fn void toString(CharConv* cv)
--- a/src/gl_gui/main.cpp Fri Sep 19 13:26:58 2008 +0000 +++ b/src/gl_gui/main.cpp Sat Sep 20 15:43:41 2008 +0000 @@ -38,6 +38,16 @@ { save = "warrior.sav"; } + + bool server = true; + + if (argc>=3) + { + if (std::string(argv[2]) == "-c") + { + server = false; + } + } // Globales Document anlegen global_doc = new Document(); @@ -45,7 +55,7 @@ global_doc->installShortkey(27,Document::CLOSE_ALL); - global_doc->startGame(true); + global_doc->startGame(server); //Gtk::Main mn( argc,argv ); //Gtk::GL::init( argc,argv );