changeset 10:30e67179d6cd

=serveritem und item verschmolzen
author wuha
date Tue, 30 Sep 2008 14:44:34 +0000
parents c2ec7089a2b5
children 3dcd6f906783
files src/core/Makefile.objs src/core/action.cpp src/core/creature.cpp src/core/document.cpp src/core/document.h src/core/event.h src/core/gridunit.h src/core/item.cpp src/core/item.h src/core/itemfactory.cpp src/core/itemfactory.h src/core/itemlist.cpp src/core/itemlist.h src/core/itemloader.h src/core/monster.cpp src/core/player.cpp src/core/player.h src/core/region.cpp src/core/serveritem.cpp src/core/serveritem.h src/core/world.cpp src/gui/mainwindow.cpp src/gui/scene.cpp
diffstat 23 files changed, 855 insertions(+), 1163 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/Makefile.objs	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/Makefile.objs	Tue Sep 30 14:44:34 2008 +0000
@@ -26,7 +26,6 @@
 ../core/priest.o
 ../core/itemfactory.o
 ../core/itemloader.o
-../core/serveritem.o
 ../core/damage.o
 ../core/random.o
 ../core/region.o
--- a/src/core/action.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/action.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -26,7 +26,7 @@
 	a->m_description = "descr_noaction";
 	a->m_enum_name = "noaction";
 	a->m_animation[NO_WEAPON].push_back("idle");
-	a->m_animation[ONE_HANDED].push_back("attack");
+	a->m_animation[ONE_HANDED].push_back("idle");
 	a->m_animation[TWO_HANDED].push_back("idle");
 	
 	
@@ -52,7 +52,7 @@
 
 	a = &(Action::m_base_info[Action::TAKE_ITEM]);
 	a->m_timer_nr=0;
-	a->m_standard_time=50;
+	a->m_standard_time=20;
 	a->m_timer=0;
 	a->m_base_action = Action::WALK;
 	a->m_critical_perc=0.7;
--- a/src/core/creature.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/creature.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -1683,7 +1683,7 @@
 		range =getGeometry()->m_shape.m_radius;
 
 	if (m_command.m_type == Action::TAKE_ITEM)
-		range = 1;
+		range = 2;
 
 	// Koordinaten des Zielpunktes
 	float goalx = m_command.m_goal_coordinate_x;
--- a/src/core/document.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/document.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -471,9 +471,15 @@
 	command.m_id =id;
 	command.m_number=0;
 
+	// Linksklick auf die eigene Figur unnoetig
+	if (command.m_id == getLocalPlayer()->getId())
+	{
+		command.m_id=0;
+	}
+	
 	if (command.m_id!=0)
 	{
-		DEBUG("angeklicktes Objekt %i",command.m_id);
+		DEBUG5("angeklicktes Objekt %i",command.m_id);
 	}
 
 	if (command.m_id ==0 && m_gui_state.m_cursor_item_id!=0)
@@ -481,6 +487,8 @@
 		// Item angeklickt
 		command.m_action = Action::TAKE_ITEM;
 		command.m_id = m_gui_state.m_cursor_item_id;
+		
+		DEBUG5("clicked at item %i",m_gui_state.m_cursor_item_id);
 	}
 
 	// Paket an den Server senden
@@ -1151,263 +1159,6 @@
 	*/
 }
 
-
-/*
-void Document::handleDataPkg(CharConv* cv, ServerHeader* headerp)
-{
-	//DEBUG("read bits: %i bytes",cv->getBitStream()->GetReadOffset());
-	/*
-	map<int, ClientWObject*>::iterator iter;
-	ClientWObject* cwo=0;
-	map<int,Projectile*>::iterator it;
-	Projectile* pr=0;
-
-	if (!headerp->m_chatmessage)
-	{
-		
-			//usleep( 25000 );
-			//INFO( "get_ob %i",  m_temp_objects_bintree->size() );
-		DEBUG5( "Got a begin of update" );
-
-			// Daten sperren
-		lock();
-		if (m_main_player)
-		{
-			DEBUG5("mainplayer %i, pointer %p",m_main_player->getId(),m_main_player);
-		}
-
-			//Datenstrukturen leeren
-			// Anmerkung: main_player wird mit geloescht
-		for (iter = m_objects_bintree->begin(); iter!=m_objects_bintree->end(); iter++)
-		{
-			cwo = iter->second;
-			DEBUG5("Speicher freigeben: obj %i at %p", cwo->getId(),cwo);
-			if (cwo!=0)
-				delete cwo;
-		}
-
-		m_objects_bintree->clear();
-
-		for (it=m_projectiles->begin();it!=m_projectiles->end();++it)
-		{
-			pr = (it->second);
-			if (pr)
-				delete pr;
-		}
-		m_projectiles->clear();
-		DEBUG5("data cleared");
-		// Neue Daten einlesen
-		
-		m_main_player = new ClientMPlayer(0);
-			// Daten aus dem Startpaket auslesen
-		m_main_player->fromString(cv);
-		cwo = m_main_player;
-		DEBUG5("inserting object %i, pointer %p",cwo->getId(),cwo);
-		m_objects_bintree->insert(make_pair(cwo->getId(),cwo));
-
-		// TODO: QuestInformationen auslesen
-
-		// Partyinformationen
-		if (m_party !=0)
-		{
-			delete m_party;
-			m_party=0;
-		}
-		m_party = new Party();
-		m_party->fromString(cv);
-
-
-		
-
-		
-
-		int i;
-		DEBUG5("number of objects %i",headerp->m_objects);
-		for (i=0;i<headerp->m_objects;i++)
-		{
-			cwo = new ClientWObject(0);
-			cwo->fromString(cv);
-
-
-			DEBUG5("inserting object %i, pointer %p",cwo->getId(),cwo);
-
-			// WorldObject in die temporaeren Datenstrukturen einfuegen
-			m_objects_bintree->insert(make_pair(cwo->getId(),cwo));
-
-				//DEBUG4( "got (%f,%f) [%i] type %i subtype %i",cwo->m_coordinate_x,cwo->m_coordinate_y,cwo->m_id,cwo->m_type,cwo->m_subtype );
-
-		}
-
-		// Geschosse einlesen
-		DEBUG5("Number of projectiles %i",headerp->m_projectiles);
-		for (i=0;i<headerp->m_projectiles;i++)
-		{
-			pr = new Projectile();
-			pr->fromString(cv);
-			DEBUG5("got Projectile %i %f %f",pr->getType(),pr->getGeometry()->m_coordinate_x,pr->getGeometry()->m_coordinate_y);
-
-
-			m_projectiles->insert(make_pair(pr->getId(),pr));
-		}
-
-		
-		// Items einlesen
-		DEBUG5("Number of Items %i",headerp->m_items);
-		m_main_player->m_equipement->fromString(cv,headerp->m_items);
-
-		
-		
-		
-		
-		// Items am Boden einlesen
-		DropItem di;
-		map<int,DropItem>::iterator it3;
-		for (it3 = m_drop_items->begin(); it3 != m_drop_items->end(); ++it3)
-		{
-			delete it3->second.m_item;
-		}
-		m_drop_items->clear();
-		DEBUG5("Number of dropped Items %i",headerp->m_drop_items);
-		for (i=0;i<headerp->m_drop_items;i++)
-		{
-			di.m_item = new Item;
-			di.fromString(cv);
-			m_drop_items->insert(make_pair(di.m_x*10000+di.m_y,di));
-		}
-		
-		// Daten entsperren
-		unlock();
-		
-	}
-	
-
-	DEBUG5("objects modified");
-	m_modified |= OBJECTS_MODIFIED;
-
-
-}
-
-
-void Document::handleSavegame(CharConv* cv)
-{
-	DEBUG5("received Save file");
-	if (m_savegame!=0)
-		delete m_savegame;
-
-	int len = cv->getBitStream()->GetNumberOfUnreadBits()/8;
-	DEBUG5("savegame length %i",len);
-	m_savegame = new char[len];
-	cv->getBitStream()->Read(m_savegame, len);
-	
-	//hexwrite(datap,len);
-
-
-	if (m_state ==SHUTDOWN_REQUEST)
-	{
-		// Savegame erhalten, Shutdown
-		m_state = SHUTDOWN_WRITE_SAVEGAME;
-	}
-
-}
-
-void Document::handleDetailedItem(CharConv* cv)
-{
-	if (m_detailed_item !=0)
-	{
-		delete m_detailed_item;
-	}
-
-	// Daten des Items einlesen
-	m_detailed_item = new ServerItem();
-	m_detailed_item->fromStringComplete(cv, m_detailed_item_pos);
-	DEBUG4("received item at %i",m_detailed_item_pos);
-
-	// Itemdaten wurden geaendert
-	m_modified |= ITEM_MODIFIED;
-	DEBUG5("m_modified %i",m_modified);
-
-}
-
-void Document::handleAbilityDamage(CharConv* cv, ServerHeader* headerp)
-{
-	// Feld fuer detailliertes Item wird missbraucht fuer den Aktionstyp...
-	m_ability_pos = (Action::ActionType) headerp->m_detailed_item;
-
-	// Schaden einlesen
-	m_ability_damage.init();
-	m_ability_damage.fromString(cv);
-
-	// geaenderte Daten anzeigen
-	m_modified |= ABILITY_MODIFIED;
-}
-
-void Document::handleRegionData(CharConv* cv)
-{
-	DEBUG("got region data");
-
-	// Groesse der Region einlesen
-	cv->fromBuffer<short>(m_region_data.m_dimx);
-	cv->fromBuffer<short>(m_region_data.m_dimy);
-
-	// Anzahl der Objekte
-	short nr;
-	 cv->fromBuffer<short>(nr);
-
-	DEBUG("receiving %i objects",nr);
-
-	map<int,WorldObject*>::iterator it;
-
-	// alte Objekte loeschen
-	for (it = m_region_data.m_static_objects->begin(); it!=m_region_data.m_static_objects->end();++it)
-	{
-		delete (it->second);
-	}
-	m_region_data.m_static_objects->clear();
-
-	if (m_region_data.m_tiles!=0)
-	{
-		delete m_region_data.m_static_objects;
-	}
-	WorldObject* wo;
-
-	// neue Objekte einlesen
-	int i,j;
-	for (i=0;i<nr;i++)
-	{
-		wo = new WorldObject(0);
-		wo->fromString(cv);
-
-		// einfuegen in Binaerbaum
-		m_region_data.m_static_objects->insert(make_pair(wo->getId(),wo));
-
-		DEBUG("got WorldObject %s %p",wo->getNameId().c_str(),wo);
-	}
-
-	// Matrix fuer die Tiles anlegen
-	if (m_region_data.m_tiles!=0)
-		delete (m_region_data.m_tiles);
-
-
-	m_region_data.m_tiles = new Matrix2d<char>(2*m_region_data.m_dimx,2*m_region_data.m_dimy);
-
-	// Tiles einlesen
-	for (i=0;i<m_region_data.m_dimx*2;i++)
-	{
-		for (j=0;j<m_region_data.m_dimy*2;j++)
-		{
-			cv->fromBuffer<char>(*(m_region_data.m_tiles->ind(i,j)));
-			//printf("%i ",*(m_region_data.m_tiles->ind(i,j)));
-		}
-		//printf("\n");
-	}
-
-
-	// Daten zur Region wurden geaendert
-	m_modified |= REGION_MODIFIED;
-
-}
-*/
-
 void* Document::writeSaveFile(void* doc_ptr)
 {
 	Document* doc = (Document*) doc_ptr;
--- a/src/core/document.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/document.h	Tue Sep 30 14:44:34 2008 +0000
@@ -60,7 +60,7 @@
 #include "damage.h"
 #include "itemlist.h"
 #include "random.h"
-#include "serveritem.h"
+#include "item.h"
 #include "matrix2d.h"
 #include "tiles.h"
 #include "dropitem.h"
@@ -382,40 +382,6 @@
 		m_modified = mod;
 	}
 
-	
-	
-	
-	
-
-	
-	/**
-	 * \fn ServerItem* getDetailedItem()
-	 * \brief Gibt Zeiger auf das Item, das aktuell per Tooltip genauer angezeigt wird zurueck
-	 */
-	//ServerItem* getDetailedItem();
-
-	
-	/**
-	 * \fn ServerItem* getDetailedItem()
-	 * \brief Gibt Position des Items, das aktuell per Tooltip genauer angezeigt wird zurueck
-	 */
-	/*short getDetailedItemPos()
-	{
-		return 0;
-	}
-*/
-	
-	/**
-	 * \fn Action::ActionType getAbilityPos()
-	 * \brief Gibt die Position der Aktion die gerade als Tooltip angezeigt zurueck
-	 */
-	/*
-	Action::ActionType getAbilityPos()
-	{
-		return Action::NOACTION;
-	}
-	*/
-
 
 	/**
 	 * \fn Party* getParty()
--- a/src/core/event.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/event.h	Tue Sep 30 14:44:34 2008 +0000
@@ -25,6 +25,7 @@
   
 		PLAYER_ITEM_EQUIPED = 20,
 		PLAYER_NOITEM_EQUIPED = 21,
+		PLAYER_ITEM_PICKED_UP = 22,
 		
 		ITEM_DROPPED = 30,
 		ITEM_REMOVED = 31,
--- a/src/core/gridunit.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/gridunit.h	Tue Sep 30 14:44:34 2008 +0000
@@ -56,7 +56,7 @@
 	short m_nr_creature;
 
 	/**
-	 * \var list<ServerItem*>* m_items
+	 * \var list<DropItem*>* m_items
 	 * \brief Liste der Items auf dem Feld
 	 */
 	list<DropItem*> m_items;
--- a/src/core/item.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/item.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -1,5 +1,86 @@
 #include "item.h"
 
+ItemBasicData::ItemBasicData()
+{
+	m_useup_effect=0;
+	m_equip_effect=0;
+	m_weapon_attr=0;
+	m_level_req = 0;
+	m_char_req = Item::REQ_NONE;
+	
+	for (int i=0;i<31;i++)
+	{
+		m_modchance[i] =0;
+	}
+	m_min_enchant =0;
+	m_max_enchant =0;
+	
+}
+
+
+Item::Item()
+{
+	m_useup_effect=0;
+	m_equip_effect=0;
+	m_weapon_attr=0;
+	m_level_req = 0;
+	m_char_req = REQ_NONE;
+}
+
+Item::Item(ItemBasicData& data)
+{
+	m_type = data.m_type;
+	m_subtype = data.m_subtype;
+	m_size = data.m_size;
+	m_price = data.m_price;
+	
+	if (data.m_useup_effect)
+	{
+		DEBUG5("copy useup effect");
+		m_useup_effect = new CreatureDynAttrMod;
+		memcpy(m_useup_effect,data.m_useup_effect,sizeof(m_useup_effect));
+	}
+	else
+	{
+		m_useup_effect =0;
+	}
+	
+	if (data.m_equip_effect)
+	{
+		DEBUG5("copy equip effect");
+		m_equip_effect = new CreatureBaseAttrMod;
+		memcpy(m_equip_effect,data.m_equip_effect,sizeof(m_equip_effect));
+	}
+	else
+	{
+		m_equip_effect =0;
+	}
+	
+	if (data.m_weapon_attr)
+	{
+		DEBUG5("copy weapon attr");
+		
+		m_weapon_attr = new WeaponAttr;
+		memcpy(m_weapon_attr,data.m_weapon_attr,sizeof(m_weapon_attr));
+		memcpy(&(m_weapon_attr->m_damage) , &(data.m_weapon_attr->m_damage),sizeof(Damage));
+		
+	}
+	else
+	{
+		m_equip_effect =0;
+	}
+	
+	m_level_req = data.m_level_req;
+	m_char_req = data.m_char_req;
+}
+
+Item::~Item()
+{
+	if (m_useup_effect) delete m_useup_effect;
+	if (m_equip_effect) delete m_equip_effect;
+	if (m_weapon_attr) delete  m_weapon_attr;
+}
+
 
 string Item::getName()
 {
@@ -34,5 +115,417 @@
 	// Daten werden extern eingelesen
 }
 
+void Item::toStringComplete(CharConv* cv)
+{
+
+	toString(cv);
+	
+	cv->toBuffer(m_price);
+	cv->toBuffer(m_level_req);
+	cv->toBuffer(m_char_req);	
+	cv->toBuffer(m_magic_power);
+	
+	char mask = NOINFO;
+	
+	if (m_useup_effect!=0)
+		mask |= USEUP_INFO;
+	
+	if (m_equip_effect!=0)
+		mask |= EQUIP_INFO;
+
+	if (m_weapon_attr!=0)
+		mask |= WEAPON_INFO;
+	
+	cv->toBuffer(mask);
+	
+	int i;
+	if (m_useup_effect!=0)
+	{
+		DEBUG5("writing useup effect");
+		cv->toBuffer(m_useup_effect->m_dhealth);
+		for (i=0;i<NR_STATUS_MODS;i++)
+		{
+			cv->toBuffer(m_useup_effect->m_dstatus_mod_immune_time[i]);
+		}
+	}
+	
+	if (m_equip_effect!=0)
+	{
+		DEBUG5("writing equip effect");
+		cv->toBuffer(m_equip_effect->m_darmor);
+		cv->toBuffer(m_equip_effect->m_dblock);
+		cv->toBuffer(m_equip_effect->m_dmax_health);
+		cv->toBuffer(m_equip_effect->m_dattack);
+		cv->toBuffer(m_equip_effect->m_dstrength);
+		cv->toBuffer(m_equip_effect->m_ddexterity);
+		cv->toBuffer(m_equip_effect->m_dmagic_power);
+		cv->toBuffer(m_equip_effect->m_dwillpower);
+		for (i=0;i<4;i++)
+		{
+			cv->toBuffer(m_equip_effect->m_dresistances[i]);
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			cv->toBuffer(m_equip_effect->m_dresistances_cap[i]);
+		}
+		
+		cv->toBuffer(m_equip_effect->m_dwalk_speed);
+		cv->toBuffer(m_equip_effect->m_dattack_speed);
+		cv->toBuffer(m_equip_effect->m_xspecial_flags);
+		
+		for (i=0;i<6;i++)
+		{
+			cv->toBuffer(m_equip_effect->m_xabilities[i]);
+		}
+		cv->toBuffer(m_equip_effect->m_ximmunity);
+		
+	}
+	
+	if (m_weapon_attr!=0)
+	{
+		DEBUG5("writing weapon attr");
+		m_weapon_attr->m_damage.toString(cv);
+		cv->toBuffer(m_weapon_attr->m_attack_range);
+		cv->toBuffer(m_weapon_attr->m_two_handed);
+		cv->toBuffer(m_weapon_attr->m_dattack_speed);
+		
+	}
+	
+	
+	
+	
+}
+
+void Item::fromStringComplete(CharConv* cv)
+{
+	fromString(cv);	
+	
+	cv->fromBuffer<int>(m_price);
+	cv->fromBuffer<char>(m_level_req);
+	cv->fromBuffer<char>(m_char_req);
+	cv->fromBuffer<float>(m_magic_power);
+
+	
+	char mask = NOINFO;
+	cv->fromBuffer<char>(mask);
+	
+	if (mask & USEUP_INFO)
+	{
+		if (m_useup_effect !=0)
+			delete m_useup_effect;
+		
+		m_useup_effect= new CreatureDynAttrMod();
+	}
+	
+	if (mask & EQUIP_INFO)
+	{
+		if (m_equip_effect !=0)
+			delete m_equip_effect;
+		
+		m_equip_effect=new CreatureBaseAttrMod();
+	}
+
+	if (mask & WEAPON_INFO)
+	{
+		if (m_weapon_attr !=0)
+			delete m_weapon_attr;
+		
+		m_weapon_attr = new WeaponAttr();
+	}
+	
+	
+	int i;
+	if (m_useup_effect!=0)
+	{
+		DEBUG5("loading useup effect");
+		cv->fromBuffer<float>(m_useup_effect->m_dhealth );
+		for (i=0;i<NR_STATUS_MODS;i++)
+		{
+			cv->fromBuffer<float>(m_useup_effect->m_dstatus_mod_immune_time[i]);
+		}
+	}
+	
+	if (m_equip_effect!=0)
+	{
+		DEBUG5("loading equip effect");
+		cv->fromBuffer<short>(m_equip_effect->m_darmor);
+		cv->fromBuffer<short>(m_equip_effect->m_dblock);
+		cv->fromBuffer<float>(m_equip_effect->m_dmax_health);
+		cv->fromBuffer<short>(m_equip_effect->m_dattack);
+		cv->fromBuffer<short>(m_equip_effect->m_dstrength);
+		cv->fromBuffer<short>(m_equip_effect->m_ddexterity);
+		cv->fromBuffer<short>(m_equip_effect->m_dmagic_power);
+		cv->fromBuffer<short>(m_equip_effect->m_dwillpower);
+		for (i=0;i<4;i++)
+		{
+			cv->fromBuffer<short>(m_equip_effect->m_dresistances[i]);
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			cv->fromBuffer<short>(m_equip_effect->m_dresistances_cap[i]);
+		}
+		
+		cv->fromBuffer<short>(m_equip_effect->m_dwalk_speed);
+		cv->fromBuffer<short>(m_equip_effect->m_dattack_speed);
+		cv->fromBuffer<int>(m_equip_effect->m_xspecial_flags );
+		
+		for (i=0;i<6;i++)
+		{
+			cv->fromBuffer<int>(m_equip_effect->m_xabilities[i]);
+		}
+		cv->fromBuffer<char>(m_equip_effect->m_ximmunity);
+		
+	}
+	
+	if (m_weapon_attr!=0)
+	{
+		DEBUG5("loading weapon attr");
+		m_weapon_attr->m_damage.fromString(cv);
+		cv->fromBuffer<float>(m_weapon_attr->m_attack_range);
+		cv->fromBuffer<bool>(m_weapon_attr->m_two_handed);
+		cv->fromBuffer<short>(m_weapon_attr->m_dattack_speed);
+		
+	}
+	
+
+}
+
+std::string Item::getDescription()
+{
+	
+	// String fuer die Beschreibung
+	ostringstream out_stream;
+	out_stream.str("");
+	out_stream<<getName()<<"\n";
+	int i;
+	// Levelbeschraenkung
+	out_stream <<"Wert: "<<m_price;
+	if (m_level_req>0)
+	{
+		out_stream<<"\n" << "Mindestlevel: "<<(int) m_level_req;
+	}
+	
+	// TODO: Beschraenkung nach Charakterklasse
+	
+	// Effekt beim Verbrauchen
+	if (m_useup_effect)
+	{
+		// HP Heilung
+		if (m_useup_effect->m_dhealth>0)
+		{
+			out_stream <<"\n"<< "heilt "<<(int) m_useup_effect->m_dhealth<<" HP";
+		}
+		
+		// Heilen/ Immunisieren gegen Statusmods
+		for (i=0;i<8;i++)
+		{
+			if (	m_useup_effect->m_dstatus_mod_immune_time[i]>0)
+			{
+				out_stream <<"\n"<< "heilt "<<Damage::getStatusModName((Damage::StatusMods) i);
+				if (m_useup_effect->m_dstatus_mod_immune_time[i]>=1000)
+				{
+					out_stream <<", immunisiert "<< (int) (m_useup_effect->m_dstatus_mod_immune_time[i]*0.001f)<<"s";
+				}
+			}
+		}
+		
+	}
+	
+	// Daten einer Waffe
+	if (m_weapon_attr)
+	{
+		if (m_weapon_attr->m_two_handed)
+		{
+			out_stream <<"\n"<< "Zweihand-Waffe";
+		}
+		// Reichweite / Angriffsgeschwindigkeit
+		if (m_type == WEAPON)
+		{
+			out_stream << "\n" << "Reichweite: "<<m_weapon_attr->m_attack_range;
+		}
+		
+		//out_stream << "\n" << "Angriffe: "<<m_weapon_attr->m_attack_speed*0.001f<<"/s";
+		
+		// Schaden
+		std::string dmgstring = m_weapon_attr->m_damage.getDamageString(Damage::ITEM);
+		if (dmgstring != "")
+		{
+			if (m_type == WEAPON)
+			{
+				out_stream << "\n" << "Schaden:";
+			}
+			out_stream<<"\n"<<dmgstring;
+		}
+		
+	}
+	
+	// Effekte von Ausruestungsgegenstaenden
+	if (m_equip_effect)
+	{
+		if (m_equip_effect->m_darmor>0)
+		{
+			out_stream<<"\n"<<"Ruestung: "<<m_equip_effect->m_darmor;
+		}
+		
+		if (m_equip_effect->m_dblock>0)
+		{
+			out_stream<<"\n"<<"Block: "<<m_equip_effect->m_dblock;
+		}
+		
+		if (m_equip_effect->m_dmax_health>0)
+		{
+			out_stream<<"\n"<<"+"<<(int) m_equip_effect->m_dmax_health<< " max HP";
+		}
+		
+		if (m_equip_effect->m_dstrength>0)
+		{
+			out_stream<<"\n"<<"+"<<m_equip_effect->m_dstrength<< " Staerke";
+		}
+		
+		if (m_equip_effect->m_ddexterity>0)
+		{
+			out_stream<<"\n"<<"+"<<m_equip_effect->m_ddexterity<< " Geschick";
+		}
+		
+		if (m_equip_effect->m_dmagic_power>0)
+		{
+			out_stream<<"\n"<<"+"<<m_equip_effect->m_dmagic_power<< " Zauberkraft";
+		}
+		
+		if (m_equip_effect->m_dwillpower>0)
+		{
+			out_stream<<"\n"<<"+"<<m_equip_effect->m_dwillpower<< " Willenskraft";
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			if (m_equip_effect->m_dresistances[i]>0)
+			{
+				out_stream<<"\n"<<"+"<<m_equip_effect->m_dresistances[i]<<" "<<Damage::getDamageTypeName((Damage::DamageType) i)<< "Resistenz";
+			}
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			if (m_equip_effect->m_dresistances_cap[i]>0)
+			{
+				out_stream<<"\n"<<"+"<<m_equip_effect->m_dresistances_cap[i]<<" max. "<<Damage::getDamageTypeName((Damage::DamageType) i)<< "Resistenz";
+			}		
+		}
+		
+		
+		// TODO: Angriffsgeschwindigkeit
+		// TODO: special Flags
+		// TODO: Faehigkeiten
+		// TODO: Immunitaeten
+		
+	}
+	
+	
+	return out_stream.str();
+}
+
+void Item::calcPrice()
+{
+	if (m_useup_effect !=0)
+	{
+		// Trank, beim generieren erzeugten wert nutzen
+		return;
+	}
+	
+	// Nutzwert des Gegenstandes
+	float value =0;
+	// Faktor fuer den wert
+	float mult =1;
+	
+	int i;
+	if (m_weapon_attr !=0)
+	{
+		// Wert des Schadens;
+		float dvalue=0;
+		// Multiplikator des Schadens
+		float dmult =1;
+		dmult *= min(2.0,sqrt(m_weapon_attr->m_attack_range));
+		dmult *= (1+m_weapon_attr->m_dattack_speed/2000.0);
+		
+		// Schaden der Waffe
+		Damage & dmg = m_weapon_attr->m_damage;
+		dvalue += dmg.m_min_damage[Damage::PHYSICAL]*0.5;
+		dvalue += dmg.m_max_damage[Damage::PHYSICAL]*0.5;
+		for (i=1;i<4;i++)
+		{
+			dvalue += dmg.m_min_damage[i]*0.3;
+			dvalue += dmg.m_max_damage[i]*0.3;
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			dmult *=  dmg.m_multiplier[i];
+		}
+		
+		for (i=1;i<4;i++)
+		{
+			dvalue +=  ((dmg.m_multiplier[i]*dmg.m_multiplier[i])-1)*100;
+		}
+		
+		dvalue += dmg.m_attack*0.1;
+		dvalue += dmg.m_power*0.1;
+		
+		dmult *= (1+dmg.m_crit_perc*2);
+		
+		for (i=0;i<8;i++)
+		{
+			dvalue += dmg.m_status_mod_power[i]*0.2;
+		}
+				
+		// TODO: Flags einberechnen
+		value += dvalue *dmult;
+
+	}
+	
+	if (m_equip_effect!=0)
+	{
+		// Modifikation beim anlegen
+		CreatureBaseAttrMod* cbasm = m_equip_effect;
+		
+		value += cbasm->m_darmor;
+		value += cbasm->m_dblock*0.5;
+		value += cbasm->m_dattack*0.2;
+		value += cbasm->m_dmax_health*0.4;
+		value += cbasm->m_dstrength*2;
+		value += cbasm->m_ddexterity*2;
+		value += cbasm->m_dwillpower*2;
+		value += cbasm->m_dmagic_power*2;
+		mult *= (1+cbasm->m_dattack_speed/2000.0);
+		
+		for (i=0;i<4;i++)
+		{
+			value += cbasm->m_dresistances[i]*2;
+		}
+		
+		for (i=0;i<4;i++)
+		{
+			value += cbasm->m_dresistances_cap[i]*4;
+		}
+		
+		
+		// TODO: Special Flags einberechnen
+		
+		// TODO: Immunitaeten einberechnen
+		
+		// TODO: Skills mit einberechnen
+		
+	}
+	
+
+	
+	value = ceil(mult*value*value);
+	value = min (value,1000000.0f);
+	m_price = (int) value;
+}
 
 
+
+
--- a/src/core/item.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/item.h	Tue Sep 30 14:44:34 2008 +0000
@@ -40,8 +40,68 @@
 #include "charconv.h"
 #include "debug.h"
 
+#include "damage.h"
+#include "creaturestruct.h"
+
+#include <math.h>
+
+
 using namespace std;
 
+/**
+ * \struct WeaponAttr
+ * \brief Eigenschaften und Attribute einer Waffe
+ */
+struct WeaponAttr
+{
+	/**
+	 * \var m_damage
+	 * \brief Schaden, den die Waffe austeilt
+	 */
+	Damage m_damage;
+
+	/**
+	 * \var m_attack_range
+	 * \brief Gibt die Reichweite der Waffe an. Fuer Schusswaffen auf  ITEM_BOW_RANGE setzen
+	 */
+	float m_attack_range;
+
+	/**
+	 * \var m_two_handed
+	 * \brief Ist auf true gesetzt, wenn die Waffe beidhaendig benutzt wird.
+	 */
+	bool m_two_handed;
+
+	/**
+	 * \var m_dattack_speed
+	 * \brief Gibt die Aenderung der Angriffsgeschwindigkeit bei Benutzen dieser Waffe an
+	 */
+	short m_dattack_speed;
+
+	/**
+	 * \fn void init()
+	 * \brief initialisiert die Datenfelder
+	 */
+	void init()
+	{
+		m_attack_range=1;
+		m_dattack_speed=0;
+		m_two_handed=false;
+		m_damage.init();
+	}
+
+	/**
+	 * \fn WeaponAttr()
+	 * \brief Konstruktor
+	 */
+	WeaponAttr()
+	{
+		init();
+	}
+};
+
+struct ItemBasicData;
+
 
 /**
  * \struct Item
@@ -83,44 +143,7 @@
 	 * \var  Subtype
 	 */
 	typedef std::string Subtype;
-/*
-	enum Subtype
-	{
-		NOSUBTYPE = 0,
 
-		SHORT_SWORD = 1,
-		LONG_SWORD = 2,
-		WOODEN_BOW = 3,
-		LONG_BOW = 4,
-		BURNING_BOW = 5,
-		BATTLE_AXE = 6,
-		HOLY_FLAIL = 7,
-		FROZEN_MAGIC_WAND = 14,
-
-
-		LEATHER_ARMOR = 1000,
-		TILED_ARMOR = 1001,
-		HEAVY_ARMOR = 1002,
-
-		STEEL_HELMET = 2000,
-		DIVINE_HELMET =2001,
-
-		MAGIC_RING = 3000,
-
-		SMALL_HEAL_POTION = 4000,
-		BIG_HEAL_POTION = 4001,
-		HEAL_BLIND_POTION = 4002,
-		UNFREEZE_POTION = 4003,
-
-
-		WOODEN_SHIELD = 5000,
-		IRON_SHIELD=5001,
-
-		LEATHER_GLOVES = 6000,
-
-		MAGIC_AMULET = 7000,
-	};
-*/
 	/**
 	 * \enum CharRequirement
 	 * \brief Aufzaehlung der Charakterklassen als Vorraussetzung fuer das Verwendung eines Gegenstandes
@@ -133,14 +156,39 @@
 		REQ_PRIEST=8,
 		REQ_NONE=15,
 	};
+	
+	/**
+	 * \fn enum InfoFlags
+	 * \brief Zaehlt auf, welche Informationen zu einem Item vorliegen koennen
+	 */
+	enum InfoFlags
+	{
+		NOINFO=0,
+		USEUP_INFO=1,
+		EQUIP_INFO=2,
+		WEAPON_INFO=4,
+	};
 
 	/**
+	 * \fn Item()
+	 * \brief Konstruktor
+	 */
+	Item();
+
+	
+	/**
+	 * \fn Item(ItemBasicData& data)
+	 * \brief erzeugt ein neuen Gegenstand mit den vorgegebenen Daten
+	 * \param data Daten auf deren Basis der Gegenstand erzeugt wird
+	 */
+	Item(ItemBasicData& data);
+	
+	/**
 	 * \fn virtual ~Item()
 	 * \brief Destruktor
 	 */
-	virtual ~Item()
-	{
-	}
+	virtual ~Item();
+	
 
 	/**
 	 * \fn String getName()
@@ -170,9 +218,39 @@
 	 * \return Zeiger hinter den gelesenen Datenbereich
 	 */
 	virtual void fromString(CharConv* cv);
+	
+	
+	/**
+	 * \fn char* toSavegame(CharConv* cv)
+	 * \brief Schreibt das Item inklusive allen Extradaten in den Puffer
+	 * \param buf Ausgabepuffer
+	 * \return Zeiger hinter den beschriebenen Datenbereich
+	 */
+	void toStringComplete(CharConv* cv);
 
 
 	/**
+	 * \fn char* fromSavegame(CharConv* cv)
+	 * \brief Laedt das Item inklusive allen Extradaten aus dem Puffer
+	 * \param buf Zeiger auf Savegame
+	 * \return Zeiger hinter den Datenbereich
+	 */
+	void fromStringComplete(CharConv* cv);
+
+	/**
+	 * \fn std::string getDescription()
+	 * \brief Gibt eine Beschreibung in Textform aus
+	 */
+	std::string getDescription();
+
+	/**
+	 * \fn calcPrice()
+	 * \brief Berechnet den Wert des Items
+	 */
+	void calcPrice();
+	
+
+	/**
 	* \var m_subtype;
 	* \brief Gibt die Unterart eines Gegenstands an ((Langschwert, Dolch usw)
 	*/
@@ -192,13 +270,133 @@
 	Size m_size;
 
 
+/**
+	 * \var m_price;
+	 * \brief Gibt Preis des Gegenstands an
+ */
+	int m_price;
 
+	/**
+	 * \var m_useup_effect
+	 * \brief Gibt die Veraenderung der dynamischen Attribute an, die beim verbrauchen des Gegenstandes eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht verbraucht werden.
+	 */
+	CreatureDynAttrMod* m_useup_effect;
+
+	/**
+	 * \var m_equip_effect
+	 * \brief Gibt die Veraenderung der Basisattribute an, die beim verwenden des Gegenstandes aus Ausruestungsgegenstand eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht auf diese Weise verwendet werden.
+	 */
+	CreatureBaseAttrMod* m_equip_effect;
+
+	/**
+	 * \var m_weapon_attr
+	 * \brief Gibt den Attribute des Gegenstandes als Waffe an. Sollte bei allen Gegenstaenden, die nicht Waffen sind auf NULL gesetzt sein
+	 */
+	WeaponAttr* m_weapon_attr;
+
+	/**
+	 * \var char m_level_req
+	 * \brief Erforderliches Level um das Item zu verwenden
+	 */
+	char m_level_req;
+
+	/**
+	 * \var char m_char_req
+	 * \brief Anforderungen an die Charakterklasse
+	 */
+	char m_char_req;
+
+	/**
+	 * \var float m_magic_power
+	 * \brief Gibt Verzauberungsstärke an
+	 */
+	float m_magic_power;
 
 };
 
-/*
+
+/**
+ * \struct ItemBasicData
+ *  \brief Informationen die noetig sind, um ein bestimmtes Item zu erzeugen
+ */
+struct ItemBasicData
+{
+    /**
+	 * \var m_useup_effect
+	 * \brief Gibt die Veraenderung der dynamischen Attribute an, die beim verbrauchen des Gegenstandes eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht verbraucht werden.
+	 */
+	CreatureDynAttrMod* m_useup_effect;
+
+	/**
+	 * \var m_equip_effect
+	 * \brief Gibt die Veraenderung der Basisattribute an, die beim verwenden des Gegenstandes aus Ausruestungsgegenstand eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht auf diese Weise verwendet werden.
+	 */
+	CreatureBaseAttrMod* m_equip_effect;
+
+	/**
+	 * \var m_weapon_attr
+	 * \brief Gibt den Attribute des Gegenstandes als Waffe an. Sollte bei allen Gegenstaenden, die nicht Waffen sind auf NULL gesetzt sein
+	 */
+	WeaponAttr* m_weapon_attr;
+
+	/**
+	 * \var char m_level_req
+	 * \brief Erforderliches Level um das Item zu verwenden
+	 */
+	char m_level_req;
+
+	/**
+	 * \var char m_char_req
+	 * \brief Anforderungen an die Charakterklasse
+	 */
+	char m_char_req;
 
-*/
+	/**
+	 * \var m_subtype;
+	 * \brief Gibt die Unterart eines Gegenstands an ((Langschwert, Dolch usw)
+	 */
+	Item::Subtype m_subtype;
+
+
+	/**
+	 * \var m_type;
+	 * \brief Gibt Typ des Gegenstands an (Waffe, Helm usw...)
+	 */
+	Item::Type m_type;
+
+	/**
+	 * \var m_size
+	\brief Gibt die Groesse des Gegenstandes (klein,mittel, gross) an
+	 */
+	Item::Size m_size;
+	
+	/**
+	 * \var int m_price
+	 * \brief Wert des Gegenstandes
+	 */
+	int m_price;
+
+	/**
+	 * \var float m_modchance[31]
+	 * \brief relative Chance auf die verschiedenen Modifikationen
+	 */
+	float m_modchance[31];
+
+	/**
+	 * \var float m_min_enchant
+	 * \brief minimale Starke einer Verzauberung des Items
+	 */
+	float m_min_enchant;
+
+	/**
+	 * \var float m_max_enchant
+	 * \brief maximale Starke einer Verzauberung des Items
+	 */
+	float m_max_enchant;
+
+	ItemBasicData();
+
+};
 
 
 
--- a/src/core/itemfactory.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/itemfactory.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -16,12 +16,12 @@
 }
 
 
-ServerItem* ItemFactory::createItem(Item::Type type, Item::Subtype subtype,float magic_power)
+Item* ItemFactory::createItem(Item::Type type, Item::Subtype subtype,float magic_power)
 {
 	DEBUG5("creating item %i / %s",type, subtype.c_str());
 	map<Item::Subtype,ItemBasicData*>::iterator it;
 	it = m_item_data.find(subtype);
-	ServerItem * item;
+	Item * item;
 	float min_enchant =30;
 	float max_enchant =100;
 
@@ -29,7 +29,7 @@
 	{
 		DEBUG("found item data for subtype %s",subtype.c_str());
 		ItemBasicData* idata = it->second;
-		item = new ServerItem(*idata);
+		item = new Item(*idata);
 
 		//createMagicMods(item,idata->m_modchance,magic_power, idata->m_min_enchant, idata->m_max_enchant);
 
@@ -41,7 +41,7 @@
 
 
 
-	item = new ServerItem;
+	item = new Item;
 
 	item->m_type = type;
 	item->m_subtype = subtype;
@@ -413,7 +413,7 @@
 }
 
 
-void ItemFactory::createMagicMods(ServerItem* item, float* modchance, float magic_power, float min_enchant, float max_enchant)
+void ItemFactory::createMagicMods(Item* item, float* modchance, float magic_power, float min_enchant, float max_enchant)
 {
 	// Modifikationen des Items auswuerfeln
 	DEBUG4("mods auswuerfeln");
@@ -743,7 +743,7 @@
 
 }
 
-ServerItem* ItemFactory::createItem(DropSlot &slot)
+Item* ItemFactory::createItem(DropSlot &slot)
 {
 	DEBUG5("get item by dropslot");
 	// wenn maximales Level unter 0 liegt kein Item ausgeben
@@ -757,12 +757,12 @@
 		return 0;
 
 	DEBUG("item size: %i",size);
-	ServerItem* item =0;
+	Item* item =0;
 	if (size  == Item::GOLD)
 	{
 		return 0;
 		// Gold gedroppt
-		item = new ServerItem;
+		item = new Item;
 		item->m_size = Item::GOLD;
 		item->m_price = Random::randrangei((slot.m_max_level*slot.m_max_level)*5, (slot.m_max_level*slot.m_max_level)*29);
 
--- a/src/core/itemfactory.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/itemfactory.h	Tue Sep 30 14:44:34 2008 +0000
@@ -2,7 +2,7 @@
 #define ITEMFACTORY_H
 
 
-#include "serveritem.h"
+#include "item.h"
 #include "random.h"
 #include <map>
 #include "dropslot.h"
@@ -57,16 +57,16 @@
 	ItemFactory();
 
 	/**
-	 * \fn ServerItem* createItem(Item::Type type, Item::Subtype subtype)
+	 * \fn Item* createItem(Item::Type type, Item::Subtype subtype)
 	 * \brief Erzeugt Objekt anhand zweier Parameter
 	 * \param type Typ des Items
 	 * \param subtype Untertyp des Items
 	 * \return Neues ServerItem
 	 */
-	static ServerItem* createItem(Item::Type type, Item::Subtype subtype, float magic_power =0);
+	static Item* createItem(Item::Type type, Item::Subtype subtype, float magic_power =0);
 
 	/**
-	 * \fn static void createMagicMods(ServerItem* item, float* modchance, float magic_power, float min_enchant, float max_enchant)
+	 * \fn static void createMagicMods(Item* item, float* modchance, float magic_power, float min_enchant, float max_enchant)
 	 * \brief Belegt einen Gegenstanden mit magischen Attributen
 	 * \param item Gegenstand der die magischen Eigenschaften erhaelt
 	 * \param modchance Array mit Wahrscheinlichkeiten fuer das Auftreten der einzelnen Modifikationen
@@ -74,7 +74,7 @@
 	 * \param min_enchant minimale Starke einer einzelnen Verzauberung
 	 * \param max_enchant maximale Starke einer einzelnen Verzauberung
 	 */
-	static void createMagicMods(ServerItem* item, float* modchance, float magic_power, float min_enchant, float max_enchant);
+	static void createMagicMods(Item* item, float* modchance, float magic_power, float min_enchant, float max_enchant);
 
 	/**
 	 * \fn static void registerItem(Item::Subtype subtype, ItemBasicData* data)
@@ -95,10 +95,10 @@
 	static void registerItemDrop(Item::Type type, Item::Subtype subtype, DropChance chance);
 
 	/**
-	 * \fn static ServerItem* createItem(DropSlot &slot)
+	 * \fn static Item* createItem(DropSlot &slot)
 	 * \brief Erzeugt einen Gegenstand anhand eines Dropslots. Wenn kein Item entsteht wird NULL ausgegeben
 	 */
-	static ServerItem* createItem(DropSlot &slot);
+	static Item* createItem(DropSlot &slot);
 
 	/**
 	 * \fn static void init()
--- a/src/core/itemlist.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/itemlist.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -408,10 +408,10 @@
 	return swapItem(m_cursor_item,pos);
 }
 	
-bool  Equipement::insertItem(Item* item)
+short  Equipement::insertItem(Item* item)
 {
 	if (item ==0)
-		return true;
+		return NONE;
 	
 	Item* itm = item;
 	int pos;
@@ -421,23 +421,25 @@
 	
 	if (pos ==-1)
 	{
-		return false;
+		return NONE;
 	}
 	
 	if (item->m_size == Item::SMALL)
 	{
 		swapItem(itm,pos+SMALL_ITEMS);
+		return pos+SMALL_ITEMS;
 	}
 	if (item->m_size == Item::MEDIUM)
 	{
 		swapItem(itm,pos+MEDIUM_ITEMS);
+		return pos+MEDIUM_ITEMS;
 	}
 	if (item->m_size == Item::BIG)
 	{
 		swapItem(itm,pos+BIG_ITEMS);
+		return pos+BIG_ITEMS;
 	}
 	
-	return true;
 }
 	
 int Equipement::getNumberItems(bool secondary_equip)
--- a/src/core/itemlist.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/itemlist.h	Tue Sep 30 14:44:34 2008 +0000
@@ -255,12 +255,12 @@
 	Item* getItem(int pos);
 
 	/**
-	 * \fn bool insertItem(Item* item)
+	 * \fn short insertItem(Item* item)
 	 * \brief Fuegt Gegenstand ins Inventar ein
 	 * \param item Zeiger auf den Gegenstand
-	 * \return Gibt an ob das Item aufgenommen werden konnte
+	 * \return Gibt an, wo das item eingefuegt wurde
 	 */
-	bool insertItem(Item* item);
+	short insertItem(Item* item);
 	
 	/**
 	 * \fn bool swapCursorItem(int pos)
--- a/src/core/itemloader.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/itemloader.h	Tue Sep 30 14:44:34 2008 +0000
@@ -1,7 +1,7 @@
 #ifndef ITEMLOADER_H
 #define ITEMLOADER_H
 
-#include "serveritem.h"
+#include "item.h"
 #include "itemfactory.h"
 #include <map>
 #include "dropslot.h"
--- a/src/core/monster.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/monster.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -388,7 +388,7 @@
 			}
 		}
 	
-		ServerItem* si;
+		Item* si;
 		for (int i=0;i<4;i++)
 		{
 			si = ItemFactory::createItem(m_drop_slots[i]);
--- a/src/core/player.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/player.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -227,7 +227,7 @@
 			{
 				com->m_type = Action::TAKE_ITEM;
 				com->m_goal_object_id =command->m_id;
-				DEBUG("take item");
+				DEBUG5("take item");
 			}
 			else
 			{
@@ -343,7 +343,7 @@
 	}
 
 	// das Item welches, des Spieler aktuell *in der Hand* hat
-	ServerItem* it = static_cast<ServerItem*>(m_equipement->getItem(Equipement::CURSOR_ITEM));
+	Item* it = m_equipement->getItem(Equipement::CURSOR_ITEM);
 
 	DEBUG5("got Item %p",it);
 
@@ -472,7 +472,7 @@
 			{
 				event.m_type = Event::PLAYER_ITEM_EQUIPED;
 			}
-			DEBUG("event: %i at %i",event.m_type,event.m_data);
+			DEBUG5("event: %i at %i",event.m_type,event.m_data);
 			getWorld()->insertEvent(event);
 		}
 
@@ -480,7 +480,7 @@
 		if (pos==Equipement::WEAPON || pos == Equipement::WEAPON2)
 		{
 			// Waffe wurde angelegt, bei zweihaendig testen ob der Schild Slot frei ist
-			ServerItem* weapon = getWeapon();
+			Item* weapon = getWeapon();
 			if (weapon!=0 && weapon->m_weapon_attr->m_two_handed)
 			{
 				if (getShield()!=0)
@@ -534,7 +534,7 @@
 		if (pos==Equipement::SHIELD || pos == Equipement::SHIELD2)
 		{
 			// Schild soll verwendet werden, testen dass keine zweihaendige Waffe benutzt wird
-			ServerItem* weapon = getWeapon();
+			Item* weapon = getWeapon();
 			if (weapon!=0 && weapon->m_weapon_attr->m_two_handed)
 			{
 				
@@ -569,7 +569,7 @@
 	else
 	{
 		// Item soll verbraucht werden
-		it = static_cast<ServerItem*>(m_equipement->getItem(pos));
+		it = m_equipement->getItem(pos);
 		if (it!=0)
 		{
 			if (it->m_useup_effect==0)
@@ -598,7 +598,7 @@
 				// suchen nach einem aehnlichen Item zum nachruecken
 				for (int i=10;i<30;i++)
 				{
-					it = static_cast<ServerItem*>(m_equipement->getItem(Equipement::SMALL_ITEMS+i));
+					it = m_equipement->getItem(Equipement::SMALL_ITEMS+i);
 
 					if (it==0)
 						continue;
@@ -622,29 +622,47 @@
 	return true;
 }
 
-ServerItem* Player::getWeapon()
+short Player::insertItem(Item* itm)
 {
-	ServerItem* si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::WEAPON));
+	short pos = getEquipement()->insertItem(itm);
+	
+	if (getWorld()->isServer())
+	{
+		Event event;
+		event.m_type =  Event::PLAYER_ITEM_PICKED_UP ;
+		event.m_data = pos;
+		event.m_id = getId();
+							
+		DEBUG5("event: item picked up %i",pos);
+							
+		getWorld()->insertEvent(event);
+	}
+	return pos;
+}
+
+Item* Player::getWeapon()
+{
+	Item* si = m_equipement->getItem(Equipement::WEAPON);
 	if (m_secondary_equip)
 	{
-		si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::WEAPON2));
+		si = m_equipement->getItem(Equipement::WEAPON2);
 	}
 	return si;
 }
 
-ServerItem* Player::getShield()
+Item* Player::getShield()
 {
-	ServerItem* si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::SHIELD));
+	Item* si = m_equipement->getItem(Equipement::SHIELD);
 		if (m_secondary_equip)
 	{
-		si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::SHIELD2));
+		si = m_equipement->getItem(Equipement::SHIELD2);
 	}
 	return si;
 }
 
 Action::ActionEquip Player::getActionEquip()
 {
-	ServerItem* weapon = getWeapon();
+	Item* weapon = getWeapon();
 	if (weapon ==0)
 	{
 		return Action::NO_WEAPON;
@@ -1266,13 +1284,15 @@
 {
 	if (getAction()->m_type == Action::TAKE_ITEM)
 	{
+		// Item suchen
 		Item* itm = getRegion()->getItem(getCommand()->m_goal_object_id);
 
 		if (itm !=0)
 		{
-			bool ret = getEquipement()->insertItem(itm);
+			// Item einfuegen
+			short pos = insertItem(itm);
 
-			if (ret ==true)
+			if (pos != Equipement::NONE)
 			{
 				getRegion()->deleteItem(getCommand()->m_goal_object_id);
 			}
@@ -1433,7 +1453,7 @@
 void Player::sendDetailedItem(short pos)
 {
 	/*
-	ServerItem* it = static_cast<ServerItem*>(m_equipement->getItem(pos));
+	Item* it = static_cast<Item*>(m_equipement->getItem(pos));
 
 	if (it!=0)
 	{
@@ -1512,7 +1532,7 @@
 	Creature::calcBaseDamage(act,dmg);
 
 
-	ServerItem* weapon = getWeapon();
+	Item* weapon = getWeapon();
 
 	if (weapon!=0)
 	{
@@ -1546,7 +1566,7 @@
 void Player::calcBaseAttrMod()
 {
 	Creature::calcBaseAttrMod();
-	ServerItem* si;
+	Item* si;
 
 	// Wirkung der Ausruestungsgegenstaende einfuegen
 
@@ -1574,14 +1594,14 @@
 
 
 	// Ruestung
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::ARMOR));
+	si = m_equipement->getItem(Equipement::ARMOR);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
 	}
 
 	// Helm
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::HELMET));
+	si = m_equipement->getItem(Equipement::HELMET);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
@@ -1595,28 +1615,28 @@
 	}
 
 	// Handschuhe
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::GLOVES));
+	si = m_equipement->getItem(Equipement::GLOVES);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
 	}
 
 	// Ring links
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::RING_LEFT));
+	si = m_equipement->getItem(Equipement::RING_LEFT);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
 	}
 
 	// Ring rechts
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::RING_RIGHT));
+	si = m_equipement->getItem(Equipement::RING_RIGHT);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
 	}
 
 	// Amulett
-	si = static_cast<ServerItem*>(m_equipement->getItem(Equipement::AMULET));
+	si = m_equipement->getItem(Equipement::AMULET);
 	if (si!=0 && si->m_equip_effect !=0)
 	{
 		applyBaseAttrMod(si->m_equip_effect,false);
@@ -1964,7 +1984,7 @@
 void Player::writeEquipement(CharConv* cv)
 {
 	/*
-	ServerItem* it;
+	Item* it;
 
 	short nr=0;
 	short i;
@@ -1980,7 +2000,7 @@
 
 	for (i=1;i<=Equipement::SMALL_ITEMS+30;i++)
 	{
-		it = static_cast<ServerItem*>(m_equipement->getItem(i));
+		it = static_cast<Item*>(m_equipement->getItem(i));
 		if (it!=0)
 		{
 			DEBUG5("saving item at pos %i",i);
@@ -1996,7 +2016,7 @@
 {
 	/*
 	m_equipement->clear();
-	ServerItem* it;
+	Item* it;
 	Item* itm;
 	short pos;
 
@@ -2007,7 +2027,7 @@
 	DEBUG5("reading %i items",nr);
 	for (i=0;i<nr;i++)
 	{
-		it = new ServerItem();
+		it = new Item();
 		it->fromStringComplete(cv,pos);
 		DEBUG5("loaded Item at pos %i",pos);
 		itm  = it;
--- a/src/core/player.h	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/player.h	Tue Sep 30 14:44:34 2008 +0000
@@ -36,7 +36,7 @@
 #include "dropitem.h"
 #include "networkstruct.h"
 #include "servernetwork.h"
-#include "serveritem.h"
+#include "item.h"
 
 /**
  * \class Player
@@ -145,16 +145,16 @@
 	virtual void calcBaseAttrMod();
 	
 	/**
-	 * \fn ServerItem* getWeapon()
+	 * \fn Item* getWeapon()
 	 * \brief Gibt die aktuell genutzte Waffe zurueck
 	 */
-	ServerItem* getWeapon();
+	Item* getWeapon();
 	
 	/**
-	 * \fn ServerItem* getShield()
+	 * \fn Item* getShield()
 	 * \brief Gibt das aktuell genutzte Schild zurueck
 	 */
-	ServerItem* getShield();
+	Item* getShield();
 	
 	
 	/**
@@ -183,6 +183,14 @@
 	bool onItemClick(ClientCommand* command);
 	
 	/**
+	 * \fn bool insertItem(Item* itm)
+	 * \brief Fuegt ein Items in das Inventar ein
+	 * \param itm einzufuegendes Item
+	 * \return Position an der das Item eingefuegt wurde
+	 */
+	short insertItem(Item* itm);
+	
+	/**
 	 * \fn void abortAction()
 	 * \brief Bricht die aktuell angefangene Aktion ab
 	 */
--- a/src/core/region.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/region.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -1050,7 +1050,7 @@
 	di->m_item = item;
 	di->m_x = sx;
 	di->m_y = sy;
-	DEBUG5("dropped item %i", sx*10000+sy);
+	DEBUG("dropped item %i", sx*10000+sy);
 	di->m_time = 0;
 			
 	Gridunit* gu = (m_data_grid->ind(sx/8,sy/8));
@@ -1372,6 +1372,8 @@
 			insertEvent(event);
 		}
 		
+		DEBUG("item deleted %i",id);
+		
 		return true;
 	}
 }
--- a/src/core/serveritem.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,498 +0,0 @@
-#include "serveritem.h"
-
-ItemBasicData::ItemBasicData()
-{
-	m_useup_effect=0;
-	m_equip_effect=0;
-	m_weapon_attr=0;
-	m_level_req = 0;
-	m_char_req = Item::REQ_NONE;
-	
-	for (int i=0;i<31;i++)
-	{
-		m_modchance[i] =0;
-	}
-	m_min_enchant =0;
-	m_max_enchant =0;
-	
-}
-
-
-ServerItem::ServerItem()
-{
-	m_useup_effect=0;
-	m_equip_effect=0;
-	m_weapon_attr=0;
-	m_level_req = 0;
-	m_char_req = REQ_NONE;
-}
-
-ServerItem::ServerItem(ItemBasicData& data)
-{
-	m_type = data.m_type;
-	m_subtype = data.m_subtype;
-	m_size = data.m_size;
-	m_price = data.m_price;
-	
-	if (data.m_useup_effect)
-	{
-		DEBUG5("copy useup effect");
-		m_useup_effect = new CreatureDynAttrMod;
-		memcpy(m_useup_effect,data.m_useup_effect,sizeof(m_useup_effect));
-	}
-	else
-	{
-		m_useup_effect =0;
-	}
-	
-	if (data.m_equip_effect)
-	{
-		DEBUG5("copy equip effect");
-		m_equip_effect = new CreatureBaseAttrMod;
-		memcpy(m_equip_effect,data.m_equip_effect,sizeof(m_equip_effect));
-	}
-	else
-	{
-		m_equip_effect =0;
-	}
-	
-	if (data.m_weapon_attr)
-	{
-		DEBUG5("copy weapon attr");
-		
-		m_weapon_attr = new WeaponAttr;
-		memcpy(m_weapon_attr,data.m_weapon_attr,sizeof(m_weapon_attr));
-		memcpy(&(m_weapon_attr->m_damage) , &(data.m_weapon_attr->m_damage),sizeof(Damage));
-		
-	}
-	else
-	{
-		m_equip_effect =0;
-	}
-	
-	m_level_req = data.m_level_req;
-	m_char_req = data.m_char_req;
-	
-	
-
-}
-
-ServerItem::~ServerItem()
-{
-	if (m_useup_effect) delete m_useup_effect;
-	if (m_equip_effect) delete m_equip_effect;
-	if (m_weapon_attr) delete  m_weapon_attr;
-}
-
-void ServerItem::toStringComplete(CharConv* cv)
-{
-
-	Item::toString(cv);
-	
-	cv->toBuffer(m_price);
-	cv->toBuffer(m_level_req);
-	cv->toBuffer(m_char_req);	
-	cv->toBuffer(m_magic_power);
-	
-	char mask = NOINFO;
-	
-	if (m_useup_effect!=0)
-		mask |= USEUP_INFO;
-	
-	if (m_equip_effect!=0)
-		mask |= EQUIP_INFO;
-
-	if (m_weapon_attr!=0)
-		mask |= WEAPON_INFO;
-	
-	cv->toBuffer(mask);
-	
-	int i;
-	if (m_useup_effect!=0)
-	{
-		DEBUG5("writing useup effect");
-		cv->toBuffer(m_useup_effect->m_dhealth);
-		for (i=0;i<NR_STATUS_MODS;i++)
-		{
-			cv->toBuffer(m_useup_effect->m_dstatus_mod_immune_time[i]);
-		}
-	}
-	
-	if (m_equip_effect!=0)
-	{
-		DEBUG5("writing equip effect");
-		cv->toBuffer(m_equip_effect->m_darmor);
-		cv->toBuffer(m_equip_effect->m_dblock);
-		cv->toBuffer(m_equip_effect->m_dmax_health);
-		cv->toBuffer(m_equip_effect->m_dattack);
-		cv->toBuffer(m_equip_effect->m_dstrength);
-		cv->toBuffer(m_equip_effect->m_ddexterity);
-		cv->toBuffer(m_equip_effect->m_dmagic_power);
-		cv->toBuffer(m_equip_effect->m_dwillpower);
-		for (i=0;i<4;i++)
-		{
-			cv->toBuffer(m_equip_effect->m_dresistances[i]);
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			cv->toBuffer(m_equip_effect->m_dresistances_cap[i]);
-		}
-		
-		cv->toBuffer(m_equip_effect->m_dwalk_speed);
-		cv->toBuffer(m_equip_effect->m_dattack_speed);
-		cv->toBuffer(m_equip_effect->m_xspecial_flags);
-		
-		for (i=0;i<6;i++)
-		{
-			cv->toBuffer(m_equip_effect->m_xabilities[i]);
-		}
-		cv->toBuffer(m_equip_effect->m_ximmunity);
-		
-	}
-	
-	if (m_weapon_attr!=0)
-	{
-		DEBUG5("writing weapon attr");
-		m_weapon_attr->m_damage.toString(cv);
-		cv->toBuffer(m_weapon_attr->m_attack_range);
-		cv->toBuffer(m_weapon_attr->m_two_handed);
-		cv->toBuffer(m_weapon_attr->m_dattack_speed);
-		
-	}
-	
-	
-	
-	
-}
-
-void ServerItem::fromStringComplete(CharConv* cv)
-{
-	Item::fromString(cv);	
-	
-	cv->fromBuffer<int>(m_price);
-	cv->fromBuffer<char>(m_level_req);
-	cv->fromBuffer<char>(m_char_req);
-	cv->fromBuffer<float>(m_magic_power);
-
-	
-	char mask = NOINFO;
-	cv->fromBuffer<char>(mask);
-	
-	if (mask & USEUP_INFO)
-	{
-		if (m_useup_effect !=0)
-			delete m_useup_effect;
-		
-		m_useup_effect= new CreatureDynAttrMod();
-	}
-	
-	if (mask & EQUIP_INFO)
-	{
-		if (m_equip_effect !=0)
-			delete m_equip_effect;
-		
-		m_equip_effect=new CreatureBaseAttrMod();
-	}
-
-	if (mask & WEAPON_INFO)
-	{
-		if (m_weapon_attr !=0)
-			delete m_weapon_attr;
-		
-		m_weapon_attr = new WeaponAttr();
-	}
-	
-	
-	int i;
-	if (m_useup_effect!=0)
-	{
-		DEBUG5("loading useup effect");
-		cv->fromBuffer<float>(m_useup_effect->m_dhealth );
-		for (i=0;i<NR_STATUS_MODS;i++)
-		{
-			cv->fromBuffer<float>(m_useup_effect->m_dstatus_mod_immune_time[i]);
-		}
-	}
-	
-	if (m_equip_effect!=0)
-	{
-		DEBUG5("loading equip effect");
-		cv->fromBuffer<short>(m_equip_effect->m_darmor);
-		cv->fromBuffer<short>(m_equip_effect->m_dblock);
-		cv->fromBuffer<float>(m_equip_effect->m_dmax_health);
-		cv->fromBuffer<short>(m_equip_effect->m_dattack);
-		cv->fromBuffer<short>(m_equip_effect->m_dstrength);
-		cv->fromBuffer<short>(m_equip_effect->m_ddexterity);
-		cv->fromBuffer<short>(m_equip_effect->m_dmagic_power);
-		cv->fromBuffer<short>(m_equip_effect->m_dwillpower);
-		for (i=0;i<4;i++)
-		{
-			cv->fromBuffer<short>(m_equip_effect->m_dresistances[i]);
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			cv->fromBuffer<short>(m_equip_effect->m_dresistances_cap[i]);
-		}
-		
-		cv->fromBuffer<short>(m_equip_effect->m_dwalk_speed);
-		cv->fromBuffer<short>(m_equip_effect->m_dattack_speed);
-		cv->fromBuffer<int>(m_equip_effect->m_xspecial_flags );
-		
-		for (i=0;i<6;i++)
-		{
-			cv->fromBuffer<int>(m_equip_effect->m_xabilities[i]);
-		}
-		cv->fromBuffer<char>(m_equip_effect->m_ximmunity);
-		
-	}
-	
-	if (m_weapon_attr!=0)
-	{
-		DEBUG5("loading weapon attr");
-		m_weapon_attr->m_damage.fromString(cv);
-		cv->fromBuffer<float>(m_weapon_attr->m_attack_range);
-		cv->fromBuffer<bool>(m_weapon_attr->m_two_handed);
-		cv->fromBuffer<short>(m_weapon_attr->m_dattack_speed);
-		
-	}
-	
-
-}
-
-std::string ServerItem::getDescription()
-{
-	
-	// String fuer die Beschreibung
-	ostringstream out_stream;
-	out_stream.str("");
-	out_stream<<getName()<<"\n";
-	int i;
-	// Levelbeschraenkung
-	out_stream <<"Wert: "<<m_price;
-	if (m_level_req>0)
-	{
-		out_stream<<"\n" << "Mindestlevel: "<<(int) m_level_req;
-	}
-	
-	// TODO: Beschraenkung nach Charakterklasse
-	
-	// Effekt beim Verbrauchen
-	if (m_useup_effect)
-	{
-		// HP Heilung
-		if (m_useup_effect->m_dhealth>0)
-		{
-			out_stream <<"\n"<< "heilt "<<(int) m_useup_effect->m_dhealth<<" HP";
-		}
-		
-		// Heilen/ Immunisieren gegen Statusmods
-		for (i=0;i<8;i++)
-		{
-			if (	m_useup_effect->m_dstatus_mod_immune_time[i]>0)
-			{
-				out_stream <<"\n"<< "heilt "<<Damage::getStatusModName((Damage::StatusMods) i);
-				if (m_useup_effect->m_dstatus_mod_immune_time[i]>=1000)
-				{
-					out_stream <<", immunisiert "<< (int) (m_useup_effect->m_dstatus_mod_immune_time[i]*0.001f)<<"s";
-				}
-			}
-		}
-		
-	}
-	
-	// Daten einer Waffe
-	if (m_weapon_attr)
-	{
-		if (m_weapon_attr->m_two_handed)
-		{
-			out_stream <<"\n"<< "Zweihand-Waffe";
-		}
-		// Reichweite / Angriffsgeschwindigkeit
-		if (m_type == WEAPON)
-		{
-			out_stream << "\n" << "Reichweite: "<<m_weapon_attr->m_attack_range;
-		}
-		
-		//out_stream << "\n" << "Angriffe: "<<m_weapon_attr->m_attack_speed*0.001f<<"/s";
-		
-		// Schaden
-		std::string dmgstring = m_weapon_attr->m_damage.getDamageString(Damage::ITEM);
-		if (dmgstring != "")
-		{
-			if (m_type == WEAPON)
-			{
-				out_stream << "\n" << "Schaden:";
-			}
-			out_stream<<"\n"<<dmgstring;
-		}
-		
-	}
-	
-	// Effekte von Ausruestungsgegenstaenden
-	if (m_equip_effect)
-	{
-		if (m_equip_effect->m_darmor>0)
-		{
-			out_stream<<"\n"<<"Ruestung: "<<m_equip_effect->m_darmor;
-		}
-		
-		if (m_equip_effect->m_dblock>0)
-		{
-			out_stream<<"\n"<<"Block: "<<m_equip_effect->m_dblock;
-		}
-		
-		if (m_equip_effect->m_dmax_health>0)
-		{
-			out_stream<<"\n"<<"+"<<(int) m_equip_effect->m_dmax_health<< " max HP";
-		}
-		
-		if (m_equip_effect->m_dstrength>0)
-		{
-			out_stream<<"\n"<<"+"<<m_equip_effect->m_dstrength<< " Staerke";
-		}
-		
-		if (m_equip_effect->m_ddexterity>0)
-		{
-			out_stream<<"\n"<<"+"<<m_equip_effect->m_ddexterity<< " Geschick";
-		}
-		
-		if (m_equip_effect->m_dmagic_power>0)
-		{
-			out_stream<<"\n"<<"+"<<m_equip_effect->m_dmagic_power<< " Zauberkraft";
-		}
-		
-		if (m_equip_effect->m_dwillpower>0)
-		{
-			out_stream<<"\n"<<"+"<<m_equip_effect->m_dwillpower<< " Willenskraft";
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			if (m_equip_effect->m_dresistances[i]>0)
-			{
-				out_stream<<"\n"<<"+"<<m_equip_effect->m_dresistances[i]<<" "<<Damage::getDamageTypeName((Damage::DamageType) i)<< "Resistenz";
-			}
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			if (m_equip_effect->m_dresistances_cap[i]>0)
-			{
-				out_stream<<"\n"<<"+"<<m_equip_effect->m_dresistances_cap[i]<<" max. "<<Damage::getDamageTypeName((Damage::DamageType) i)<< "Resistenz";
-			}		
-		}
-		
-		
-		// TODO: Angriffsgeschwindigkeit
-		// TODO: special Flags
-		// TODO: Faehigkeiten
-		// TODO: Immunitaeten
-		
-	}
-	
-	
-	return out_stream.str();
-}
-
-void ServerItem::calcPrice()
-{
-	if (m_useup_effect !=0)
-	{
-		// Trank, beim generieren erzeugten wert nutzen
-		return;
-	}
-	
-	// Nutzwert des Gegenstandes
-	float value =0;
-	// Faktor fuer den wert
-	float mult =1;
-	
-	int i;
-	if (m_weapon_attr !=0)
-	{
-		// Wert des Schadens;
-		float dvalue=0;
-		// Multiplikator des Schadens
-		float dmult =1;
-		dmult *= min(2.0,sqrt(m_weapon_attr->m_attack_range));
-		dmult *= (1+m_weapon_attr->m_dattack_speed/2000.0);
-		
-		// Schaden der Waffe
-		Damage & dmg = m_weapon_attr->m_damage;
-		dvalue += dmg.m_min_damage[Damage::PHYSICAL]*0.5;
-		dvalue += dmg.m_max_damage[Damage::PHYSICAL]*0.5;
-		for (i=1;i<4;i++)
-		{
-			dvalue += dmg.m_min_damage[i]*0.3;
-			dvalue += dmg.m_max_damage[i]*0.3;
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			dmult *=  dmg.m_multiplier[i];
-		}
-		
-		for (i=1;i<4;i++)
-		{
-			dvalue +=  ((dmg.m_multiplier[i]*dmg.m_multiplier[i])-1)*100;
-		}
-		
-		dvalue += dmg.m_attack*0.1;
-		dvalue += dmg.m_power*0.1;
-		
-		dmult *= (1+dmg.m_crit_perc*2);
-		
-		for (i=0;i<8;i++)
-		{
-			dvalue += dmg.m_status_mod_power[i]*0.2;
-		}
-				
-		// TODO: Flags einberechnen
-		value += dvalue *dmult;
-
-	}
-	
-	if (m_equip_effect!=0)
-	{
-		// Modifikation beim anlegen
-		CreatureBaseAttrMod* cbasm = m_equip_effect;
-		
-		value += cbasm->m_darmor;
-		value += cbasm->m_dblock*0.5;
-		value += cbasm->m_dattack*0.2;
-		value += cbasm->m_dmax_health*0.4;
-		value += cbasm->m_dstrength*2;
-		value += cbasm->m_ddexterity*2;
-		value += cbasm->m_dwillpower*2;
-		value += cbasm->m_dmagic_power*2;
-		mult *= (1+cbasm->m_dattack_speed/2000.0);
-		
-		for (i=0;i<4;i++)
-		{
-			value += cbasm->m_dresistances[i]*2;
-		}
-		
-		for (i=0;i<4;i++)
-		{
-			value += cbasm->m_dresistances_cap[i]*4;
-		}
-		
-		
-		// TODO: Special Flags einberechnen
-		
-		// TODO: Immunitaeten einberechnen
-		
-		// TODO: Skills mit einberechnen
-		
-	}
-	
-
-	
-	value = ceil(mult*value*value);
-	value = min (value,1000000.0f);
-	m_price = (int) value;
-}
-
-
--- a/src/core/serveritem.h	Thu Sep 25 11:07:24 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,260 +0,0 @@
-#ifndef SERVERITEM_H
-#define SERVERITEM_H
-
-#include "item.h"
-#include "damage.h"
-#include "creaturestruct.h"
-
-#include <math.h>
-
-
-/**
- * \struct WeaponAttr
- * \brief Eigenschaften und Attribute einer Waffe
- */
-struct WeaponAttr
-{
-	/**
-	 * \var m_damage
-	 * \brief Schaden, den die Waffe austeilt
-	 */
-	Damage m_damage;
-
-	/**
-	 * \var m_attack_range
-	 * \brief Gibt die Reichweite der Waffe an. Fuer Schusswaffen auf  ITEM_BOW_RANGE setzen
-	 */
-	float m_attack_range;
-
-	/**
-	 * \var m_two_handed
-	 * \brief Ist auf true gesetzt, wenn die Waffe beidhaendig benutzt wird.
-	 */
-	bool m_two_handed;
-
-	/**
-	 * \var m_dattack_speed
-	 * \brief Gibt die Aenderung der Angriffsgeschwindigkeit bei Benutzen dieser Waffe an
-	 */
-	short m_dattack_speed;
-
-	/**
-	 * \fn void init()
-	 * \brief initialisiert die Datenfelder
-	 */
-	void init()
-	{
-		m_attack_range=1;
-		m_dattack_speed=0;
-		m_two_handed=false;
-		m_damage.init();
-	}
-
-	/**
-	 * \fn WeaponAttr()
-	 * \brief Konstruktor
-	 */
-	WeaponAttr()
-	{
-		init();
-	}
-};
-
-/**
- * \struct ItemBasicData
- *  \brief Informationen die noetig sind, um ein bestimmtes Item zu erzeugen
- */
-struct ItemBasicData
-{
-    /**
-	 * \var m_useup_effect
-	 * \brief Gibt die Veraenderung der dynamischen Attribute an, die beim verbrauchen des Gegenstandes eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht verbraucht werden.
-	 */
-	CreatureDynAttrMod* m_useup_effect;
-
-	/**
-	 * \var m_equip_effect
-	 * \brief Gibt die Veraenderung der Basisattribute an, die beim verwenden des Gegenstandes aus Ausruestungsgegenstand eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht auf diese Weise verwendet werden.
-	 */
-	CreatureBaseAttrMod* m_equip_effect;
-
-	/**
-	 * \var m_weapon_attr
-	 * \brief Gibt den Attribute des Gegenstandes als Waffe an. Sollte bei allen Gegenstaenden, die nicht Waffen sind auf NULL gesetzt sein
-	 */
-	WeaponAttr* m_weapon_attr;
-
-	/**
-	 * \var char m_level_req
-	 * \brief Erforderliches Level um das Item zu verwenden
-	 */
-	char m_level_req;
-
-	/**
-	 * \var char m_char_req
-	 * \brief Anforderungen an die Charakterklasse
-	 */
-	char m_char_req;
-
-	/**
-	* \var m_subtype;
-	* \brief Gibt die Unterart eines Gegenstands an ((Langschwert, Dolch usw)
-	*/
-	Item::Subtype m_subtype;
-
-
-	/**
-	 * \var m_type;
-	 * \brief Gibt Typ des Gegenstands an (Waffe, Helm usw...)
-	 */
-	Item::Type m_type;
-
-	/**
-	* \var m_size
-	\brief Gibt die Groesse des Gegenstandes (klein,mittel, gross) an
-	*/
-	Item::Size m_size;
-	
-	/**
-	 * \var int m_price
-	 * \brief Wert des Gegenstandes
-	 */
-	int m_price;
-
-	/**
-	 * \var float m_modchance[31]
-	 * \brief relative Chance auf die verschiedenen Modifikationen
-	 */
-	float m_modchance[31];
-
-	/**
-	 * \var float m_min_enchant
-	 * \brief minimale Starke einer Verzauberung des Items
-	 */
-	float m_min_enchant;
-
-	/**
-	 * \var float m_max_enchant
-	 * \brief maximale Starke einer Verzauberung des Items
-	 */
-	float m_max_enchant;
-
-	ItemBasicData();
-
-};
-
-/**
- * \struct ServerItem
- * \brief Item mit zusaetzlichen Informationen zu Attributen und Eigenschaften
- */
-struct ServerItem : public Item
-{
-
-	/**
-	 * \fn ServerItem()
-	 * \brief Konstruktor
-	 */
-	ServerItem();
-
-	
-	/**
-	 * \fn ServerItem(ItemBasicData& data)
-	 * \brief erzeugt ein neuen Gegenstand mit den vorgegebenen Daten
-	 * \param data Daten auf deren Basis der Gegenstand erzeugt wird
-	 */
-	ServerItem(ItemBasicData& data);
-
-	/**
-	 * \fn virtual ~ServerItem()
-	 * \brief Destruktor
-	 */
-	virtual ~ServerItem();
-
-
-	/**
-	 * \fn enum InfoFlags
-	 * \brief Zaehlt auf, welche Informationen zu einem Item vorliegen koennen
-	 */
-	enum InfoFlags
-	{
-		NOINFO=0,
-		USEUP_INFO=1,
- 		EQUIP_INFO=2,
-		WEAPON_INFO=4,
-	};
-
-	/**
-	 * \var m_price;
-	 * \brief Gibt Preis des Gegenstands an
-	 */
-	int m_price;
-
-	/**
-	 * \var m_useup_effect
-	 * \brief Gibt die Veraenderung der dynamischen Attribute an, die beim verbrauchen des Gegenstandes eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht verbraucht werden.
-	 */
-	CreatureDynAttrMod* m_useup_effect;
-
-	/**
-	 * \var m_equip_effect
-	 * \brief Gibt die Veraenderung der Basisattribute an, die beim verwenden des Gegenstandes aus Ausruestungsgegenstand eintritt. Wenn der Zeiger auf NULL gesetzt ist, kann der Gegenstand nicht auf diese Weise verwendet werden.
-	 */
-	CreatureBaseAttrMod* m_equip_effect;
-
-	/**
-	 * \var m_weapon_attr
-	 * \brief Gibt den Attribute des Gegenstandes als Waffe an. Sollte bei allen Gegenstaenden, die nicht Waffen sind auf NULL gesetzt sein
-	 */
-	WeaponAttr* m_weapon_attr;
-
-	/**
-	 * \var char m_level_req
-	 * \brief Erforderliches Level um das Item zu verwenden
-	 */
-	char m_level_req;
-
-	/**
-	 * \var char m_char_req
-	 * \brief Anforderungen an die Charakterklasse
-	 */
-	char m_char_req;
-
-	/**
-	 * \var float m_magic_power
-	 * \brief Gibt Verzauberungsstärke an
-	 */
-	float m_magic_power;
-
-	/**
-	 * \fn char* toSavegame(CharConv* cv)
-	 * \brief Erzeugt ein binaeres Savegame und schreibt es in den Puffer
-	 * \param buf Ausgabepuffer
-	 * \return Zeiger hinter den beschriebenen Datenbereich
-	 */
-	void toStringComplete(CharConv* cv);
-
-
-	/**
-	 * \fn char* fromSavegame(CharConv* cv)
-	 * \brief Laedt die Daten aus einem Savegame
-	 * \param buf Zeiger auf Savegame
-	 * \return Zeiger hinter den Datenbereich
-	 */
-	void fromStringComplete(CharConv* cv);
-
-
-	/**
-	 * \fn std::string getDescription()
-	 * \brief Gibt eine Beschreibung in Textform aus
-	 */
-	std::string getDescription();
-
-	/**
-	 * \fn calcPrice()
-	 * \brief Berechnet den Wert des Items
-	 */
-	void calcPrice();
-
-};
-
-#endif
--- a/src/core/world.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/core/world.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -1248,6 +1248,8 @@
 		slot = it->first;
 		pl = static_cast<Player*>(it->second);
 		
+		// feststellen, ob ein Spieler das Spiel verlassen hat
+		// ggf Event erstellen
 		if (m_server && slot != LOCAL_SLOT &&  
 				  (m_network->getSlotStatus( slot )!=NET_CONNECTED || pl->getState() == WorldObject::STATE_QUIT))
 		{
@@ -1267,6 +1269,7 @@
 			continue;
 		}
 		
+		// Spielern die auf Daten zur aktuellen Region warten, Daten senden
 		if (pl->getState() == WorldObject::STATE_REGION_DATA_REQUEST)
 		{
 			DEBUG("send data request to server");
@@ -1289,13 +1292,15 @@
 			m_network->pushSlotMessage(msg.getBitStream());
 		}
 		
+		// Spieler, deren Regionen komplett geladen wurden aktivieren
 		if (pl->getState() == WorldObject::STATE_ENTER_REGION && pl->getRegion() !=0 )
 		{
 			insertPlayerIntoRegion(pl,pl->getGridLocation()->m_region);
 			pl->setState(WorldObject::STATE_ACTIVE);
 		}
 		
-		
+		// Wenn aktuelle Instanz Server ist:
+		// Daten von allen verbundenen Client annehmen und verarbeiten
 		if (m_server && slot != LOCAL_SLOT)
 		{
 			// Nachrichten fuer die Spieler abholen und Verteilen
@@ -1303,7 +1308,7 @@
 			Packet* data;
 			CharConv* cv;
 			
-			
+			// Schleife ueber die Nachrichten
 			while (m_network->numberSlotMessages( slot )>0)
 			{
 				m_network->popSlotMessage( data ,slot);
@@ -1312,6 +1317,7 @@
 
 				headerp.fromString(cv);
 				
+				// Kommando bearbeiten
 				if (headerp.m_content ==  PTYPE_C2S_COMMAND)
 				{
 					// Kommando Daten erhalten
@@ -1329,6 +1335,7 @@
 					handleCommand(&com,slot,cv->getDelay());
 				}
 				
+				// Datenanfrage bearbeiten
 				if (headerp.m_content == PTYPE_C2S_DATA_REQUEST)
 				{
 					// Datenanfrage erhalten
--- a/src/gui/mainwindow.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/gui/mainwindow.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -2783,7 +2783,7 @@
 
 void MainWindow::updateItemTooltip(unsigned int pos)
 {
-	ServerItem* item = static_cast<ServerItem*>(m_document->getLocalPlayer()->getEquipement()->getItem(pos));
+	Item* item = m_document->getLocalPlayer()->getEquipement()->getItem(pos);
 	if (item ==0)
 		return;
 	
@@ -3044,10 +3044,13 @@
 			}
 			else
 			{
-				m_document->getGUIState()->m_cursor_object_id =0;
-				m_document->getGUIState()->m_cursor_object="";
+				m_document->getGUIState()->m_cursor_item_id =0;
 			}
 		}
+		else
+		{
+			m_document->getGUIState()->m_cursor_item_id =0;
+		}
 
 
 	}
--- a/src/gui/scene.cpp	Thu Sep 25 11:07:24 2008 +0000
+++ b/src/gui/scene.cpp	Tue Sep 30 14:44:34 2008 +0000
@@ -763,7 +763,7 @@
 {
 	std::string node_name = name + "Node";
 
-	DEBUG("deleting item %s",name.c_str());
+	DEBUG5("deleting item %s",name.c_str());
 
 	destroySceneNode(node_name);