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 );
--- a/src/gl_gui/window_main_gl.cpp	Fri Sep 19 13:26:58 2008 +0000
+++ b/src/gl_gui/window_main_gl.cpp	Sat Sep 20 15:43:41 2008 +0000
@@ -84,7 +84,7 @@
 	// ESC
 	if (key == 27)
 	{
-		//global_doc ->onKeyPress(OIS::KC_ESCAPE);
+		global_doc ->onKeyPress(27);
 	}
 
 }