Browse Source

- Fix #544 - login server now correctly loads skin color for appearance data in character select, matches in-game color.
- AoM and DoF now properly sync their appearance properties (hair, face, chest, legs). This is limited to classic (non-SOGA). SOGA will be reviewed in Issue #443
- Fixed inventory being unable to move items around after moving a equipped item to inventory
- DoF: Ranged weapons now properly display in examine, this means they also work in quest accept display windows(Hawk Hunt quest).
- Fixed merchants freezing up on DoF client. DoF and earlier disabled the merchant flag in serialization of items (different structures that were not updated for DoF).
- Disabled item types in DoF (not supported): 'Thrown','House Container','Adornment','Profile','Pattern Set','Item Set','Book','Decoration','Dungeon Maker','Marketplace','Reward Crate2','Infuser1','Infuser2','Experience Vial','Overseer'
- Fixed DoF client crash with merchants (eg. Scion of Khaalista in NorthFreeport).
- DoF bauble items set to generic item packet until structure is properly identified.

Emagi 6 months ago
parent
commit
7324c9a462

+ 21 - 29
EQ2/source/LoginServer/LoginDatabase.cpp

@@ -281,7 +281,7 @@ void LoginDatabase::LoadCharacters(LoginAccount* acct, int16 version){
 			player->packet->setDataByName("account_id", acct->getLoginAccountID());
 			player->packet->setDataByName("account_id2", acct->getLoginAccountID());
 			
-			LoadAppearanceData(atol(row[21]), player->packet);
+			LoadAppearanceData(atoul(row[21]), player->packet);
 
 			if(row[22])
 				player->packet->setMediumStringByName("server_name", row[22]);
@@ -358,10 +358,10 @@ void LoginDatabase::CheckCharacterTimeStamps(LoginAccount* acct){
 	}
 }
 
-void LoginDatabase::SaveCharacterFloats(int32 char_id, char* type, float float1, float float2, float float3){
+void LoginDatabase::SaveCharacterFloats(int32 char_id, char* type, float float1, float float2, float float3,float multiplier){
 	Query query;
 	string create_char = string("insert into login_char_colors (login_characters_id, type, red, green, blue, signed_value) values(%i,'%s',%i,%i,%i, 1)");
-	query.RunQuery2(Q_INSERT, create_char.c_str(), char_id, type, (sint8)(float1*100), (sint8)(float2*100), (sint8)(float3*100));
+	query.RunQuery2(Q_INSERT, create_char.c_str(), char_id, type, (sint8)(float1*multiplier), (sint8)(float2*multiplier), (sint8)(float3*multiplier));
 }
 
 void LoginDatabase::SaveCharacterColors(int32 char_id, char* type, EQ2_Color color){
@@ -376,20 +376,11 @@ void LoginDatabase::LoadAppearanceData(int32 char_id, PacketStruct* char_select_
 	MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT type, signed_value, red, green, blue from login_char_colors where login_characters_id = %i",char_id);
 	while((row = mysql_fetch_row(result))){
 		if(atoi(row[1]) == 0)
-			char_select_packet->setColorByName(row[0], atoi(row[2]), atoi(row[3]), atoi(row[4]));
+			char_select_packet->setColorByName(row[0], atoul(row[2]), atoul(row[3]), atoul(row[4]));
 		else{
-			if (char_select_packet->GetVersion() <= 283)
-			{
-				char_select_packet->setDataByName(row[0], atoi(row[2]) * 2.5, 0);
-				char_select_packet->setDataByName(row[0], atoi(row[3]) * 2.5, 1);
-				char_select_packet->setDataByName(row[0], atoi(row[4]) * 2.5, 2);
-			}
-			else
-			{
 				char_select_packet->setDataByName(row[0], atoi(row[2]), 0);
 				char_select_packet->setDataByName(row[0], atoi(row[3]), 1);
 				char_select_packet->setDataByName(row[0], atoi(row[4]), 2);
-			}
 		}
 	}
 }
@@ -450,22 +441,23 @@ int32 LoginDatabase::SaveCharacter(PacketStruct* create, LoginAccount* acct, int
 	DeactivateCharID(create->getType_int32_ByName("server_id"), world_charid, last_insert_id);
 	int32 char_id = last_insert_id;
 	if (client_version <= 546) {
-		SaveCharacterFloats(char_id, "skin_color", create->getType_float_ByName("skin_color", 0), create->getType_float_ByName("skin_color", 1), create->getType_float_ByName("skin_color", 2));
-		SaveCharacterFloats(char_id, "eye_color", create->getType_float_ByName("eye_color", 0), create->getType_float_ByName("eye_color", 1), create->getType_float_ByName("eye_color", 2));
-		SaveCharacterFloats(char_id, "hair_color1", create->getType_float_ByName("hair_color1", 0), create->getType_float_ByName("hair_color1", 1), create->getType_float_ByName("hair_color1", 2));
-		SaveCharacterFloats(char_id, "hair_color2", create->getType_float_ByName("hair_color2", 0), create->getType_float_ByName("hair_color2", 1), create->getType_float_ByName("hair_color2", 2));
-		SaveCharacterFloats(char_id, "hair_highlight", create->getType_float_ByName("hair_highlight", 0), create->getType_float_ByName("hair_highlight", 1), create->getType_float_ByName("hair_highlight", 2));
-		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2));
-		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2));
-		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2));
-		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2));
-		SaveCharacterFloats(char_id, "hair_face_color", create->getType_float_ByName("hair_face_color", 0), create->getType_float_ByName("hair_face_color", 1), create->getType_float_ByName("hair_face_color", 2));
-		SaveCharacterFloats(char_id, "hair_face_highlight_color", create->getType_float_ByName("hair_face_highlight_color", 0), create->getType_float_ByName("hair_face_highlight_color", 1), create->getType_float_ByName("hair_face_highlight_color", 2));
-		SaveCharacterFloats(char_id, "shirt_color", create->getType_float_ByName("shirt_color", 0), create->getType_float_ByName("shirt_color", 1), create->getType_float_ByName("shirt_color", 2));
-		SaveCharacterFloats(char_id, "unknown_chest_color", create->getType_float_ByName("unknown_chest_color", 0), create->getType_float_ByName("unknown_chest_color", 1), create->getType_float_ByName("unknown_chest_color", 2));
-		SaveCharacterFloats(char_id, "pants_color", create->getType_float_ByName("pants_color", 0), create->getType_float_ByName("pants_color", 1), create->getType_float_ByName("pants_color", 2));
-		SaveCharacterFloats(char_id, "unknown_legs_color", create->getType_float_ByName("unknown_legs_color", 0), create->getType_float_ByName("unknown_legs_color", 1), create->getType_float_ByName("unknown_legs_color", 2));
-		SaveCharacterFloats(char_id, "unknown9", create->getType_float_ByName("unknown9", 0), create->getType_float_ByName("unknown9", 1), create->getType_float_ByName("unknown9", 2));
+		float classic_multiplier = 250.0f;
+		SaveCharacterFloats(char_id, "skin_color", create->getType_float_ByName("skin_color", 0), create->getType_float_ByName("skin_color", 1), create->getType_float_ByName("skin_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "eye_color", create->getType_float_ByName("eye_color", 0), create->getType_float_ByName("eye_color", 1), create->getType_float_ByName("eye_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_color1", create->getType_float_ByName("hair_color1", 0), create->getType_float_ByName("hair_color1", 1), create->getType_float_ByName("hair_color1", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_color2", create->getType_float_ByName("hair_color2", 0), create->getType_float_ByName("hair_color2", 1), create->getType_float_ByName("hair_color2", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_highlight", create->getType_float_ByName("hair_highlight", 0), create->getType_float_ByName("hair_highlight", 1), create->getType_float_ByName("hair_highlight", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_face_color", create->getType_float_ByName("hair_face_color", 0), create->getType_float_ByName("hair_face_color", 1), create->getType_float_ByName("hair_face_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_face_highlight_color", create->getType_float_ByName("hair_face_highlight_color", 0), create->getType_float_ByName("hair_face_highlight_color", 1), create->getType_float_ByName("hair_face_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "shirt_color", create->getType_float_ByName("shirt_color", 0), create->getType_float_ByName("shirt_color", 1), create->getType_float_ByName("shirt_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown_chest_color", create->getType_float_ByName("unknown_chest_color", 0), create->getType_float_ByName("unknown_chest_color", 1), create->getType_float_ByName("unknown_chest_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "pants_color", create->getType_float_ByName("pants_color", 0), create->getType_float_ByName("pants_color", 1), create->getType_float_ByName("pants_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown_legs_color", create->getType_float_ByName("unknown_legs_color", 0), create->getType_float_ByName("unknown_legs_color", 1), create->getType_float_ByName("unknown_legs_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown9", create->getType_float_ByName("unknown9", 0), create->getType_float_ByName("unknown9", 1), create->getType_float_ByName("unknown9", 2), classic_multiplier);
 	}
 	else {
 		SaveCharacterColors(char_id, "skin_color", create->getType_EQ2_Color_ByName("skin_color"));

+ 1 - 1
EQ2/source/LoginServer/LoginDatabase.h

@@ -50,7 +50,7 @@ public:
 	void CheckCharacterTimeStamps(LoginAccount* acct);
 	string GetCharacterName(int32 char_id , int32 server_id, int32 account_id);
 	void SaveCharacterColors(int32 char_id, char* type, EQ2_Color color);
-	void SaveCharacterFloats(int32 char_id, char* type, float float1, float float2, float float3);
+	void SaveCharacterFloats(int32 char_id, char* type, float float1, float float2, float float3, float multiplier=100.0f);
 	int16 GetAppearanceID(string name);
 	void DeactivateCharID(int32 server_id, int32 char_id, int32 exception_id);
 	int32 SaveCharacter(PacketStruct* create, LoginAccount* acct, int32 world_charid, int32 client_version);

+ 4 - 4
EQ2/source/LoginServer/client.cpp

@@ -276,9 +276,9 @@ bool Client::Process() {
 				DumpPacket(app);
 				playWaitTimer = new Timer ( 15000 );
 				playWaitTimer->Start ( );
-				cout << "Char Create Request From: " << GetAccountName() << "....";
-				if(packet->LoadPacketData(app->pBuffer,app->size)){
-					cout << "Loaded Successfully\n";
+				
+				LogWrite(WORLD__INFO, 1, "World", "Character creation request from account %s", GetAccountName());
+				if(packet->LoadPacketData(app->pBuffer,app->size, GetVersion() <= 546 ? false : true)){
 					packet->setDataByName("account_id",GetAccountID());
 					LWorld* world_server = world_list.FindByID(packet->getType_int32_ByName("server_id"));
 					if(!world_server)
@@ -308,7 +308,7 @@ bool Client::Process() {
 					}
 				}
 				else{
-					cout << "Error loading Char Create Packet!!\n";
+					LogWrite(WORLD__ERROR, 1, "World", "Error in character creation request from account %s!", GetAccountName());
 					safe_delete(packet);
 				}
 				//	world_list.SendWorldChanged(create.profile.server_id, false, this);

+ 29 - 28
EQ2/source/WorldServer/Commands/Commands.cpp

@@ -2096,9 +2096,8 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 				if(strcmp(sep->arg[0], "inventory") == 0){
 					int32 item_index = atol(sep->arg[1]);
 					
-					if(client->GetVersion() <= 546) {
-						item_index = (uint32)-(sint32)item_index & 0xFFFFFFFF;
-						item_index -= 1;
+					if(client->GetVersion() <= 546 && item_index <= 255) {
+						item_index = 255 - item_index;
 					}
 					Item* item = client->GetPlayer()->item_list.GetItemFromIndex(item_index);
 					if(item){
@@ -2117,7 +2116,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 						}
 					}
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Index: %u", item_index);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info inventory: Unknown Index: %u", item_index);
 				}
 				else if(strcmp(sep->arg[0], "equipment") == 0){
 					int32 item_index = client->GetPlayer()->ConvertSlotFromClient(atol(sep->arg[1]), client->GetVersion());
@@ -2129,7 +2128,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 							lua_interface->RunItemScript(item->GetItemScript(), "examined", item, client->GetPlayer());
 					}
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Index: %u", item_index);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info equipment: Unknown Index: %u", item_index);
 				}
 				else if(strcmp(sep->arg[0], "appearance") == 0){
 					int32 item_index = client->GetPlayer()->ConvertSlotFromClient(atol(sep->arg[1]), client->GetVersion());
@@ -2141,7 +2140,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 							lua_interface->RunItemScript(item->GetItemScript(), "examined", item, client->GetPlayer());
 					}
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Index: %u", item_index);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info appearance: Unknown Index: %u", item_index);
 				}
 				else if(strcmp(sep->arg[0], "item") == 0 || strcmp(sep->arg[0], "merchant") == 0 || strcmp(sep->arg[0], "store") == 0 || strcmp(sep->arg[0], "buyback") == 0 || strcmp(sep->arg[0], "consignment") == 0){
 					int32 item_id = atoul(sep->arg[1]);
@@ -2151,7 +2150,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 						client->QueuePacket(app);
 					}
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Item ID: %u", item_id);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info item|merchant|store|buyback|consignment: Unknown Item ID: %u", item_id);
 				}
 				else if (strcmp(sep->arg[0], "spell") == 0) {
 					sint32 spell_id = atol(sep->arg[1]);
@@ -2160,7 +2159,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 					if (outapp)
 						client->QueuePacket(outapp);
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, tier);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info spell: Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, tier);
 				}
 				else if (strcmp(sep->arg[0], "achievement") == 0) {
 					sint32 spell_id = atol(sep->arg[2]);
@@ -2170,12 +2169,12 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 					SpellBookEntry* spellentry = 0;
 					int8 tier = client->GetPlayer()->GetSpellTier(spell_id);
 				
-					LogWrite(COMMAND__ERROR, 0, "Command", "AA Spell ID and/or Tier, ID: %u, Group: %i", spell_id, group);
+					LogWrite(COMMAND__ERROR, 0, "Command", "/info achievement: AA Spell ID and/or Tier, ID: %u, Group: %i", spell_id, group);
 					EQ2Packet* outapp = master_spell_list.GetAASpellPacket(spell_id, tier, client, true, 0x45);
 					if (outapp)
 						client->QueuePacket(outapp);
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, group);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info achievement: Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, group);
 				}
 				else if (strcmp(sep->arg[0], "spellbook") == 0) {
 					sint32 spell_id = atol(sep->arg[1]);
@@ -2189,7 +2188,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 					if (outapp)
 						client->QueuePacket(outapp);
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, tier);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info spellbook: Unknown Spell ID and/or Tier, ID: %u, Tier: %i", spell_id, tier);
 				}
 				else if (strcmp(sep->arg[0], "recipe") == 0) {
 					sint32 recipe_id = atol(sep->arg[1]);
@@ -2197,7 +2196,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 					if(outapp)
 						client->QueuePacket(outapp);
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Recipe ID: %u", recipe_id);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info recipe: Unknown Recipe ID: %u", recipe_id);
 				}
 				else if (strcmp(sep->arg[0], "recipe_product") == 0) {
 					sint32 recipe_id = atol(sep->arg[1]);
@@ -2213,31 +2212,31 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 								client->QueuePacket(app);
 							}
 							else
-								LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Item ID: %u", recipe->GetProductID());
+								LogWrite(COMMAND__ERROR, 0, "Command", "/info recipe_product: Unknown Item ID: %u", recipe->GetProductID());
 						}
 						else {
-								LogWrite(COMMAND__ERROR, 0, "Command", "recipe_product recipe->GetProductID() has value 0 for recipe id %u.", recipe_id);
+								LogWrite(COMMAND__ERROR, 0, "Command", "/info recipe_product: recipe->GetProductID() has value 0 for recipe id %u.", recipe_id);
 						}
 					}
 					else {
-							LogWrite(COMMAND__ERROR, 0, "Command", "recipe_product with recipe id %u not found (recipe missing or no product in stage 1 assigned).", recipe_id);
+							LogWrite(COMMAND__ERROR, 0, "Command", "/info recipe_product: with recipe id %u not found (recipe missing or no product in stage 1 assigned).", recipe_id);
 					}
 				}
 				else if (strcmp(sep->arg[0], "maintained") ==0) {
 					int32 slot = atol(sep->arg[1]);
 					int32 spell_id = atol(sep->arg[2]);
-					LogWrite(COMMAND__DEBUG, 5, "Command", "Unknown Spell ID - Slot: %u unknown: %u", slot, spell_id);
+					LogWrite(COMMAND__DEBUG, 5, "Command", "/info maintained: Spell ID - Slot: %u unknown: %u", slot, spell_id);
 					//int8 tier = client->GetPlayer()->GetSpellTier(spell_id);
 					MaintainedEffects* info = client->GetPlayer()->GetMaintainedSpellBySlot(slot);
 					EQ2Packet* outapp = master_spell_list.GetSpellPacket(info->spell_id, info->tier, client, true, 0x00);
 					if(outapp)
 						client->QueuePacket(outapp);
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Spell ID: %u", spell_id);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info maintained: Unknown Spell ID: %u", spell_id);
 				}
 				else if (strcmp(sep->arg[0], "effect") == 0) {
 					int32 spell_id = atol(sep->arg[1]);
-					LogWrite(COMMAND__DEBUG, 5, "Command", "Unknown Spell ID: %u", spell_id);
+					LogWrite(COMMAND__DEBUG, 5, "Command", "/info effect: Spell ID: %u", spell_id);
 					int8 tier = client->GetPlayer()->GetSpellTier(spell_id);
 					int8 type = 0;
 					if (client->GetVersion() <= 546)
@@ -2247,7 +2246,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 						client->QueuePacket(outapp);
 					}
 					else
-						LogWrite(COMMAND__ERROR, 0, "Command", "Unknown Spell ID: %u", spell_id);
+						LogWrite(COMMAND__ERROR, 0, "Command", "/info effect: Unknown Spell ID: %u", spell_id);
 				}
 			}
 			else if (sep && strcmp(sep->arg[0], "overflow") == 0) {
@@ -2257,7 +2256,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
 					client->QueuePacket(app);
 				}
 				else
-					LogWrite(COMMAND__ERROR, 0,"Command", "Unable to retrieve an overflow item.");
+					LogWrite(COMMAND__ERROR, 0,"Command", "/info overflow: Unable to retrieve an overflow item.");
 			}
 			else
 				client->SimpleMessage(CHANNEL_COLOR_YELLOW,"Usage:  /info {inventory|equipment|spell} {id}");
@@ -11126,14 +11125,16 @@ void Commands::Command_SendMerchantWindow(Client* client, Seperator* sep, bool s
 			if(!(spawn->GetMerchantType() & MERCHANT_TYPE_NO_BUY_BACK))
 				client->SendBuyBackList(sell);
 
-			PacketStruct* packet = configReader.getStruct("WS_UpdateMerchant", client->GetVersion());
-			if (packet) {
-				packet->setDataByName("spawn_id", 0xFFFFFFFF);
-				packet->setDataByName("type", 16);
-				EQ2Packet* outapp = packet->serialize();
-				if (outapp)
-					client->QueuePacket(outapp);
-				safe_delete(packet);
+			if(client->GetVersion() > 546) {
+				PacketStruct* packet = configReader.getStruct("WS_UpdateMerchant", client->GetVersion());
+				if (packet) {
+					packet->setDataByName("spawn_id", 0xFFFFFFFF);
+					packet->setDataByName("type", 16);
+					EQ2Packet* outapp = packet->serialize();
+					if (outapp)
+						client->QueuePacket(outapp);
+					safe_delete(packet);
+				}
 			}
 		}
 		if (spawn->GetMerchantType() & MERCHANT_TYPE_REPAIR)

+ 22 - 12
EQ2/source/WorldServer/Items/Items.cpp

@@ -2226,7 +2226,13 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16
 		if (adornment_info)
 			LogWrite(ITEM__DEBUG, 0, "Items", "\ttype: %i, Duration: %i, item_types_: %i, slot_type: %i", generic_info.item_type, adornment_info->duration, adornment_info->item_types, adornment_info->slot_type);
 
-		packet->setSubstructDataByName("header", "item_type", generic_info.item_type);
+		int8 tmpType = generic_info.item_type;
+		if (client->GetVersion() <= 283 && generic_info.item_type > ITEM_TYPE_RECIPE)
+			tmpType = 0;
+		else if(client->GetVersion() <= 546 && (generic_info.item_type > ITEM_TYPE_HOUSE || generic_info.item_type == ITEM_TYPE_BAUBLE))
+			tmpType = 0;
+		
+		packet->setSubstructDataByName("header", "item_type", tmpType);
 		switch(generic_info.item_type){
 			case ITEM_TYPE_WEAPON:{
 				if(weapon_info){
@@ -2396,7 +2402,7 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16
 				break;
 			}
 			case ITEM_TYPE_BAUBLE:{
-				if(bauble_info && client->GetVersion() >= 284){
+				if(bauble_info && client->GetVersion() >= 546){
 					packet->setDataByName("cast", bauble_info->cast);
 					packet->setDataByName("recovery", bauble_info->recovery);
 					packet->setDataByName("duration", bauble_info->duration);
@@ -2585,10 +2591,16 @@ PacketStruct* Item::PrepareItem(int16 version, bool merchant_item, bool loot_ite
 		packet = configReader.getStruct("WS_ItemGeneric", version);
 		packet->AddFlag("loot");
 	}
+	else if(version <= 546 && (generic_info.item_type > ITEM_TYPE_HOUSE || generic_info.item_type == ITEM_TYPE_BAUBLE)) {
+		packet = configReader.getStruct("WS_ItemGeneric", version);
+	}
 	else{
 		int8 tmpType = generic_info.item_type;
 		if (version <= 283 && generic_info.item_type > ITEM_TYPE_RECIPE)
 			tmpType = 0;
+		else if(version <= 546 && (generic_info.item_type > ITEM_TYPE_HOUSE || generic_info.item_type == ITEM_TYPE_BAUBLE))
+			tmpType = 0;
+		
 		switch(tmpType){
 			case ITEM_TYPE_WEAPON:{
 				if(merchant_item)
@@ -3646,19 +3658,17 @@ void PlayerItemList::AddItemToPacket(PacketStruct* packet, Player* player, Item*
 	if (overflow) {
 		packet->setSubstructArrayDataByName("items", "index", 0xFFFF, 0, i);
 	}
-	else if(client->GetVersion() <= 546) {
-		if(item->details.inv_slot_id == 0 && item->details.slot_id < 6) {
-			packet->setSubstructArrayDataByName("items", "bag_id", item->details.bag_id, 0, i);
+	else {
+		
+		if(i < 6) {
+			packet->setSubstructArrayDataByName("items", "bag_id", item->details.bag_id ? item->details.bag_id : i, 0, i);
+			packet->setSubstructArrayDataByName("items", "index", 0xFF, 0, i);
+			
 		}
 		else {
-			packet->setSubstructArrayDataByName("items", "bag_id", i, 0, i);
+			packet->setSubstructArrayDataByName("items", "bag_id", item->details.bag_id, 0, i);
+			packet->setSubstructArrayDataByName("items", "index", i, 0, i);
 		}
-		packet->setSubstructArrayDataByName("items", "index", 0xFFFF, 0, i);
-		item->details.index = i;
-	}
-	else {
-		packet->setSubstructArrayDataByName("items", "bag_id", item->details.bag_id, 0, i);
-		packet->setSubstructArrayDataByName("items", "index", i, 0, i);
 		item->details.index = i;
 	}
 	packet->setSubstructArrayDataByName("items", "icon", item->details.icon, 0, i);

+ 1 - 1
EQ2/source/WorldServer/LoginServer.cpp

@@ -317,7 +317,7 @@ bool LoginServer::Process() {
 			int8 resp = 0;
 			int32 acct_id = 0;
 			int32 char_id = 0;
-			if(packet && packet->LoadPacketData(pack->pBuffer+sizeof(int16),pack->size - sizeof(int16))){
+			if(packet && packet->LoadPacketData(pack->pBuffer+sizeof(int16),pack->size - sizeof(int16), version <= 546 ? false : true)){
 				EQ2_16BitString name = packet->getType_EQ2_16BitString_ByName("name");
 				resp = database.CheckNameFilter(name.data.c_str());
 				acct_id = packet->getType_int32_ByName("account_id");

+ 2 - 1
EQ2/source/WorldServer/Spawn.cpp

@@ -2555,6 +2555,7 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet) {
 			packet->setDataByName("soga_chin_type", entity->features.soga_chin_type[i], i);
 			packet->setDataByName("soga_nose_type", entity->features.soga_nose_type[i], i);
 		}
+		
 		packet->setColorByName("skin_color", entity->features.skin_color);
 		packet->setColorByName("model_color", entity->features.model_color);
 		packet->setColorByName("eye_color", entity->features.eye_color);
@@ -2577,7 +2578,7 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet) {
 		packet->setColorByName("soga_hair_face_color", entity->features.soga_hair_face_color);
 		packet->setColorByName("soga_hair_face_highlight_color", entity->features.soga_hair_face_highlight_color);
 		packet->setColorByName("soga_hair_highlight", entity->features.soga_hair_highlight_color);
-
+		
 		packet->setDataByName("body_size", entity->features.body_size);
 		packet->setDataByName("body_age", entity->features.body_age);
 

+ 73 - 53
EQ2/source/WorldServer/WorldDatabase.cpp

@@ -2227,10 +2227,10 @@ bool WorldDatabase::UpdateAdminStatus(char* character_name, sint16 flag){
 	return true;
 }
 
-void WorldDatabase::SaveCharacterFloats(int32 char_id, const char* type, float float1, float float2, float float3){
+void WorldDatabase::SaveCharacterFloats(int32 char_id, const char* type, float float1, float float2, float float3, float multiplier){
 	Query query;
 	string create_char = string("insert into char_colors (char_id, type, red, green, blue, signed_value) values(%i,'%s',%i,%i,%i, 1)");
-	query.RunQuery2(Q_INSERT, create_char.c_str(), char_id, type, (sint8)(float1*100), (sint8)(float2*100), (sint8)(float3*100));
+	query.RunQuery2(Q_INSERT, create_char.c_str(), char_id, type, (sint8)(float1*multiplier), (sint8)(float2*multiplier), (sint8)(float3*multiplier));
 	if(query.GetError() && strlen(query.GetError()) > 0){
 		LogWrite(WORLD__ERROR, 0, "World", "Error in SaveCharacterFloats query '%s': %s", query.GetQuery(), query.GetError());
 	}
@@ -2422,57 +2422,77 @@ int32 WorldDatabase::SaveCharacter(PacketStruct* create, int32 loginID){
 
 	AddNewPlayerToServerGuild(loginID, char_id);
 
-	SaveCharacterColors(char_id,"skin_color", create->getType_EQ2_Color_ByName("skin_color"));
-	SaveCharacterColors(char_id,"model_color", create->getType_EQ2_Color_ByName("model_color"));
-	SaveCharacterColors(char_id,"eye_color", create->getType_EQ2_Color_ByName("eye_color"));
-	SaveCharacterColors(char_id,"hair_color1", create->getType_EQ2_Color_ByName("hair_color1"));
-	SaveCharacterColors(char_id,"hair_color2", create->getType_EQ2_Color_ByName("hair_color2"));
-	SaveCharacterColors(char_id,"hair_highlight", create->getType_EQ2_Color_ByName("hair_highlight"));
-	SaveCharacterColors(char_id,"hair_type_color", create->getType_EQ2_Color_ByName("hair_type_color"));
-	SaveCharacterColors(char_id,"hair_type_highlight_color", create->getType_EQ2_Color_ByName("hair_type_highlight_color"));
-	SaveCharacterColors(char_id,"hair_face_color", create->getType_EQ2_Color_ByName("hair_face_color"));
-	SaveCharacterColors(char_id,"hair_face_highlight_color", create->getType_EQ2_Color_ByName("hair_face_highlight_color"));
-	SaveCharacterColors(char_id,"wing_color1", create->getType_EQ2_Color_ByName("wing_color1"));
-	SaveCharacterColors(char_id,"wing_color2", create->getType_EQ2_Color_ByName("wing_color2"));
-	SaveCharacterColors(char_id,"shirt_color", create->getType_EQ2_Color_ByName("shirt_color"));
-	SaveCharacterColors(char_id,"unknown_chest_color", create->getType_EQ2_Color_ByName("unknown_chest_color"));
-	SaveCharacterColors(char_id,"pants_color", create->getType_EQ2_Color_ByName("pants_color"));
-	SaveCharacterColors(char_id,"unknown_legs_color", create->getType_EQ2_Color_ByName("unknown_legs_color"));
-	SaveCharacterColors(char_id,"unknown9", create->getType_EQ2_Color_ByName("unknown9"));
-	SaveCharacterFloats(char_id,"eye_type", create->getType_float_ByName("eyes2",0), create->getType_float_ByName("eyes2",1), create->getType_float_ByName("eyes2",2));
-	SaveCharacterFloats(char_id,"ear_type", create->getType_float_ByName("ears",0), create->getType_float_ByName("ears",1), create->getType_float_ByName("ears",2));
-	SaveCharacterFloats(char_id,"eye_brow_type", create->getType_float_ByName("eye_brows",0), create->getType_float_ByName("eye_brows",1), create->getType_float_ByName("eye_brows",2));
-	SaveCharacterFloats(char_id,"cheek_type", create->getType_float_ByName("cheeks",0), create->getType_float_ByName("cheeks",1), create->getType_float_ByName("cheeks",2));
-	SaveCharacterFloats(char_id,"lip_type", create->getType_float_ByName("lips",0), create->getType_float_ByName("lips",1), create->getType_float_ByName("lips",2));
-	SaveCharacterFloats(char_id,"chin_type", create->getType_float_ByName("chin",0), create->getType_float_ByName("chin",1), create->getType_float_ByName("chin",2));
-	SaveCharacterFloats(char_id,"nose_type", create->getType_float_ByName("nose",0), create->getType_float_ByName("nose",1), create->getType_float_ByName("nose",2));
-	SaveCharacterFloats(char_id,"body_size", create->getType_float_ByName("body_size",0), 0, 0);
-
-	SaveCharacterColors(char_id,"soga_skin_color", create->getType_EQ2_Color_ByName("soga_skin_color"));
-	SaveCharacterColors(char_id,"soga_model_color", create->getType_EQ2_Color_ByName("soga_model_color"));
-	SaveCharacterColors(char_id,"soga_eye_color", create->getType_EQ2_Color_ByName("soga_eye_color"));
-	SaveCharacterColors(char_id,"soga_hair_color1", create->getType_EQ2_Color_ByName("soga_hair_color1"));
-	SaveCharacterColors(char_id,"soga_hair_color2", create->getType_EQ2_Color_ByName("soga_hair_color2"));
-	SaveCharacterColors(char_id,"soga_hair_highlight", create->getType_EQ2_Color_ByName("soga_hair_highlight"));
-	SaveCharacterColors(char_id,"soga_hair_type_color", create->getType_EQ2_Color_ByName("soga_hair_type_color"));
-	SaveCharacterColors(char_id,"soga_hair_type_highlight_color", create->getType_EQ2_Color_ByName("soga_hair_type_highlight_color"));
-	SaveCharacterColors(char_id,"soga_hair_face_color", create->getType_EQ2_Color_ByName("soga_hair_face_color"));
-	SaveCharacterColors(char_id,"soga_hair_face_highlight_color", create->getType_EQ2_Color_ByName("soga_hair_face_highlight_color"));
-	SaveCharacterColors(char_id,"soga_wing_color1", create->getType_EQ2_Color_ByName("soga_wing_color1"));
-	SaveCharacterColors(char_id,"soga_wing_color2", create->getType_EQ2_Color_ByName("soga_wing_color2"));
-	SaveCharacterColors(char_id,"soga_shirt_color", create->getType_EQ2_Color_ByName("soga_shirt_color"));
-	SaveCharacterColors(char_id,"soga_unknown_chest_color", create->getType_EQ2_Color_ByName("soga_unknown_chest_color"));
-	SaveCharacterColors(char_id,"soga_pants_color", create->getType_EQ2_Color_ByName("soga_pants_color"));
-	SaveCharacterColors(char_id,"soga_unknown_legs_color", create->getType_EQ2_Color_ByName("soga_unknown_legs_color"));
-	SaveCharacterColors(char_id,"soga_unknown13", create->getType_EQ2_Color_ByName("soga_unknown13"));
-	SaveCharacterFloats(char_id,"soga_eye_type", create->getType_float_ByName("soga_eyes2",0), create->getType_float_ByName("soga_eyes2",1), create->getType_float_ByName("soga_eyes2",2));
-	SaveCharacterFloats(char_id,"soga_ear_type", create->getType_float_ByName("soga_ears",0), create->getType_float_ByName("soga_ears",1), create->getType_float_ByName("soga_ears",2));
-	SaveCharacterFloats(char_id,"soga_eye_brow_type", create->getType_float_ByName("soga_eye_brows",0), create->getType_float_ByName("soga_eye_brows",1), create->getType_float_ByName("soga_eye_brows",2));
-	SaveCharacterFloats(char_id,"soga_cheek_type", create->getType_float_ByName("soga_cheeks",0), create->getType_float_ByName("soga_cheeks",1), create->getType_float_ByName("soga_cheeks",2));
-	SaveCharacterFloats(char_id,"soga_lip_type", create->getType_float_ByName("soga_lips",0), create->getType_float_ByName("soga_lips",1), create->getType_float_ByName("soga_lips",2));
-	SaveCharacterFloats(char_id,"soga_chin_type", create->getType_float_ByName("soga_chin",0), create->getType_float_ByName("soga_chin",1), create->getType_float_ByName("soga_chin",2));
-	SaveCharacterFloats(char_id,"soga_nose_type", create->getType_float_ByName("soga_nose",0), create->getType_float_ByName("soga_nose",1), create->getType_float_ByName("soga_nose",2));
-
+	if (create->GetVersion() <= 546) {
+		float classic_multiplier = 250.0f;
+		SaveCharacterFloats(char_id, "skin_color", create->getType_float_ByName("skin_color", 0), create->getType_float_ByName("skin_color", 1), create->getType_float_ByName("skin_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "eye_color", create->getType_float_ByName("eye_color", 0), create->getType_float_ByName("eye_color", 1), create->getType_float_ByName("eye_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_color1", create->getType_float_ByName("hair_color1", 0), create->getType_float_ByName("hair_color1", 1), create->getType_float_ByName("hair_color1", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_color2", create->getType_float_ByName("hair_color2", 0), create->getType_float_ByName("hair_color2", 1), create->getType_float_ByName("hair_color2", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_highlight", create->getType_float_ByName("hair_highlight", 0), create->getType_float_ByName("hair_highlight", 1), create->getType_float_ByName("hair_highlight", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_color", create->getType_float_ByName("hair_type_color", 0), create->getType_float_ByName("hair_type_color", 1), create->getType_float_ByName("hair_type_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_type_highlight_color", create->getType_float_ByName("hair_type_highlight_color", 0), create->getType_float_ByName("hair_type_highlight_color", 1), create->getType_float_ByName("hair_type_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_face_color", create->getType_float_ByName("hair_face_color", 0), create->getType_float_ByName("hair_face_color", 1), create->getType_float_ByName("hair_face_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "hair_face_highlight_color", create->getType_float_ByName("hair_face_highlight_color", 0), create->getType_float_ByName("hair_face_highlight_color", 1), create->getType_float_ByName("hair_face_highlight_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "shirt_color", create->getType_float_ByName("shirt_color", 0), create->getType_float_ByName("shirt_color", 1), create->getType_float_ByName("shirt_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown_chest_color", create->getType_float_ByName("unknown_chest_color", 0), create->getType_float_ByName("unknown_chest_color", 1), create->getType_float_ByName("unknown_chest_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "pants_color", create->getType_float_ByName("pants_color", 0), create->getType_float_ByName("pants_color", 1), create->getType_float_ByName("pants_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown_legs_color", create->getType_float_ByName("unknown_legs_color", 0), create->getType_float_ByName("unknown_legs_color", 1), create->getType_float_ByName("unknown_legs_color", 2), classic_multiplier);
+		SaveCharacterFloats(char_id, "unknown9", create->getType_float_ByName("unknown9", 0), create->getType_float_ByName("unknown9", 1), create->getType_float_ByName("unknown9", 2), classic_multiplier);
+	}
+	else {
+		SaveCharacterColors(char_id, "skin_color", create->getType_EQ2_Color_ByName("skin_color"));
+		SaveCharacterColors(char_id, "model_color", create->getType_EQ2_Color_ByName("model_color"));
+		SaveCharacterColors(char_id, "eye_color", create->getType_EQ2_Color_ByName("eye_color"));
+		SaveCharacterColors(char_id, "hair_color1", create->getType_EQ2_Color_ByName("hair_color1"));
+		SaveCharacterColors(char_id, "hair_color2", create->getType_EQ2_Color_ByName("hair_color2"));
+		SaveCharacterColors(char_id, "hair_highlight", create->getType_EQ2_Color_ByName("hair_highlight"));
+		SaveCharacterColors(char_id, "hair_type_color", create->getType_EQ2_Color_ByName("hair_type_color"));
+		SaveCharacterColors(char_id, "hair_type_highlight_color", create->getType_EQ2_Color_ByName("hair_type_highlight_color"));
+		SaveCharacterColors(char_id, "hair_face_color", create->getType_EQ2_Color_ByName("hair_face_color"));
+		SaveCharacterColors(char_id, "hair_face_highlight_color", create->getType_EQ2_Color_ByName("hair_face_highlight_color"));
+		SaveCharacterColors(char_id, "wing_color1", create->getType_EQ2_Color_ByName("wing_color1"));
+		SaveCharacterColors(char_id, "wing_color2", create->getType_EQ2_Color_ByName("wing_color2"));
+		SaveCharacterColors(char_id, "shirt_color", create->getType_EQ2_Color_ByName("shirt_color"));
+		SaveCharacterColors(char_id, "unknown_chest_color", create->getType_EQ2_Color_ByName("unknown_chest_color"));
+		SaveCharacterColors(char_id, "pants_color", create->getType_EQ2_Color_ByName("pants_color"));
+		SaveCharacterColors(char_id, "unknown_legs_color", create->getType_EQ2_Color_ByName("unknown_legs_color"));
+		SaveCharacterColors(char_id, "unknown9", create->getType_EQ2_Color_ByName("unknown9"));		
+
+		SaveCharacterColors(char_id, "soga_skin_color", create->getType_EQ2_Color_ByName("soga_skin_color"));
+		SaveCharacterColors(char_id, "soga_model_color", create->getType_EQ2_Color_ByName("soga_model_color"));
+		SaveCharacterColors(char_id, "soga_eye_color", create->getType_EQ2_Color_ByName("soga_eye_color"));
+		SaveCharacterColors(char_id, "soga_hair_color1", create->getType_EQ2_Color_ByName("soga_hair_color1"));
+		SaveCharacterColors(char_id, "soga_hair_color2", create->getType_EQ2_Color_ByName("soga_hair_color2"));
+		SaveCharacterColors(char_id, "soga_hair_highlight", create->getType_EQ2_Color_ByName("soga_hair_highlight"));
+		SaveCharacterColors(char_id, "soga_hair_type_color", create->getType_EQ2_Color_ByName("soga_hair_type_color"));
+		SaveCharacterColors(char_id, "soga_hair_type_highlight_color", create->getType_EQ2_Color_ByName("soga_hair_type_highlight_color"));
+		SaveCharacterColors(char_id, "soga_hair_face_color", create->getType_EQ2_Color_ByName("soga_hair_face_color"));
+		SaveCharacterColors(char_id, "soga_hair_face_highlight_color", create->getType_EQ2_Color_ByName("soga_hair_face_highlight_color"));
+		SaveCharacterColors(char_id, "soga_wing_color1", create->getType_EQ2_Color_ByName("soga_wing_color1"));
+		SaveCharacterColors(char_id, "soga_wing_color2", create->getType_EQ2_Color_ByName("soga_wing_color2"));
+		SaveCharacterColors(char_id, "soga_shirt_color", create->getType_EQ2_Color_ByName("soga_shirt_color"));
+		SaveCharacterColors(char_id, "soga_unknown_chest_color", create->getType_EQ2_Color_ByName("soga_unknown_chest_color"));
+		SaveCharacterColors(char_id, "soga_pants_color", create->getType_EQ2_Color_ByName("soga_pants_color"));
+		SaveCharacterColors(char_id, "soga_unknown_legs_color", create->getType_EQ2_Color_ByName("soga_unknown_legs_color"));
+		SaveCharacterColors(char_id, "soga_unknown13", create->getType_EQ2_Color_ByName("soga_unknown13"));
+		SaveCharacterFloats(char_id, "soga_eye_type", create->getType_float_ByName("soga_eyes2", 0), create->getType_float_ByName("soga_eyes2", 1), create->getType_float_ByName("soga_eyes2", 2));
+		SaveCharacterFloats(char_id, "soga_ear_type", create->getType_float_ByName("soga_ears", 0), create->getType_float_ByName("soga_ears", 1), create->getType_float_ByName("soga_ears", 2));
+		SaveCharacterFloats(char_id, "soga_eye_brow_type", create->getType_float_ByName("soga_eye_brows", 0), create->getType_float_ByName("soga_eye_brows", 1), create->getType_float_ByName("soga_eye_brows", 2));
+		SaveCharacterFloats(char_id, "soga_cheek_type", create->getType_float_ByName("soga_cheeks", 0), create->getType_float_ByName("soga_cheeks", 1), create->getType_float_ByName("soga_cheeks", 2));
+		SaveCharacterFloats(char_id, "soga_lip_type", create->getType_float_ByName("soga_lips", 0), create->getType_float_ByName("soga_lips", 1), create->getType_float_ByName("soga_lips", 2));
+		SaveCharacterFloats(char_id, "soga_chin_type", create->getType_float_ByName("soga_chin", 0), create->getType_float_ByName("soga_chin", 1), create->getType_float_ByName("soga_chin", 2));
+		SaveCharacterFloats(char_id, "soga_nose_type", create->getType_float_ByName("soga_nose", 0), create->getType_float_ByName("soga_nose", 1), create->getType_float_ByName("soga_nose", 2));
+	}
+	SaveCharacterFloats(char_id, "eye_type", create->getType_float_ByName("eyes2", 0), create->getType_float_ByName("eyes2", 1), create->getType_float_ByName("eyes2", 2));
+	SaveCharacterFloats(char_id, "ear_type", create->getType_float_ByName("ears", 0), create->getType_float_ByName("ears", 1), create->getType_float_ByName("ears", 2));
+	SaveCharacterFloats(char_id, "eye_brow_type", create->getType_float_ByName("eye_brows", 0), create->getType_float_ByName("eye_brows", 1), create->getType_float_ByName("eye_brows", 2));
+	SaveCharacterFloats(char_id, "cheek_type", create->getType_float_ByName("cheeks", 0), create->getType_float_ByName("cheeks", 1), create->getType_float_ByName("cheeks", 2));
+	SaveCharacterFloats(char_id, "lip_type", create->getType_float_ByName("lips", 0), create->getType_float_ByName("lips", 1), create->getType_float_ByName("lips", 2));
+	SaveCharacterFloats(char_id, "chin_type", create->getType_float_ByName("chin", 0), create->getType_float_ByName("chin", 1), create->getType_float_ByName("chin", 2));
+	SaveCharacterFloats(char_id, "nose_type", create->getType_float_ByName("nose", 0), create->getType_float_ByName("nose", 1), create->getType_float_ByName("nose", 2));
+	SaveCharacterFloats(char_id, "body_size", create->getType_float_ByName("body_size", 0), 0, 0);
 	return char_id;
 }
 

+ 1 - 1
EQ2/source/WorldServer/WorldDatabase.h

@@ -186,7 +186,7 @@ public:
 	void	SaveBuyBack(int32 char_id, int32 item_id, int16 quantity, int32 price);
 	void	DeleteItem(int32 char_id, Item* item, const char* type);
 	void	SaveCharacterColors(int32 char_id, const char* type, EQ2_Color color);
-	void	SaveCharacterFloats(int32 char_id, const char* type, float float1, float float2, float float3);
+	void	SaveCharacterFloats(int32 char_id, const char* type, float float1, float float2, float float3, float multiplier = 100.0f);
 	int16	GetAppearanceID(string name);
 	vector<int16>* GetAppearanceIDsLikeName(string name, bool filtered = true);
 	string	GetAppearanceName(int16 appearance_id);

+ 3 - 2
EQ2/source/WorldServer/client.cpp

@@ -2597,7 +2597,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
 	{
 		LogWrite(OPCODE__DEBUG, 1, "Opcode", "Opcode 0x%X (%i): OP_SubmitCharCust", opcode, opcode);
 		PacketStruct* packet = configReader.getStruct("WS_SubmitCharCust", version);
-		if (packet && packet->LoadPacketData(app->pBuffer, app->size)) {
+		if (packet && packet->LoadPacketData(app->pBuffer, app->size, GetVersion() <= 546 ? false : true)) {
 			int8 type = packet->getType_int8_ByName("type");
 			if (type == 0) {
 				/*if (player->custNPC) {
@@ -3098,7 +3098,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
 		Item* item = master_item_list.GetItem(id);
 		if (item) {
 			//only display popup for non merchant links
-			EQ2Packet* app = item->serialize(GetVersion(), (request->getType_int8_ByName("show_popup") != 0), GetPlayer(), true, 0, 0, true);
+			EQ2Packet* app = item->serialize(GetVersion(), (request->getType_int8_ByName("show_popup") != 0), GetPlayer(), true, 0, 0, GetVersion() > 546 ? true : false);
 			//DumpPacket(app);
 			QueuePacket(app);
 		}
@@ -7965,6 +7965,7 @@ void Client::SendBuyMerchantList(bool sell) {
 					else
 						packet->setDataByName("type", 2);
 				}
+				packet->PrintPacket();
 				EQ2Packet* outapp = packet->serialize();
 				//	DumpPacket(outapp);
 				QueuePacket(outapp);

+ 7 - 5
EQ2/source/common/PacketStruct.cpp

@@ -1119,7 +1119,7 @@ void PacketStruct::AddFlag(const char* name) {
 	flags.push_back(string(name));
 }
 
-bool PacketStruct::LoadPacketData(uchar* data, int32 data_len) {
+bool PacketStruct::LoadPacketData(uchar* data, int32 data_len, bool create_color) {
 	loadedSuccessfully = true;
 	DataStruct* data_struct = 0;
 	try {
@@ -1304,7 +1304,7 @@ bool PacketStruct::LoadPacketData(uchar* data, int32 data_len) {
 					useType2 = true;
 				safe_delete(varnames);
 			}
-			if (!StructLoadData(data_struct, GetStructPointer(data_struct), data_struct->GetLength(), useType2))
+			if (!StructLoadData(data_struct, GetStructPointer(data_struct), data_struct->GetLength(), useType2, create_color))
 			{
 				loadedSuccessfully = false;
 				break;
@@ -1316,7 +1316,7 @@ bool PacketStruct::LoadPacketData(uchar* data, int32 data_len) {
 	}
 	return loadedSuccessfully;
 }
-bool PacketStruct::StructLoadData(DataStruct* data_struct, void* data, int32 len, bool useType2) {
+bool PacketStruct::StructLoadData(DataStruct* data_struct, void* data, int32 len, bool useType2, bool create_color) {
 	int8 type = 0;
 	if (useType2) {
 		type = data_struct->GetType2();
@@ -1415,7 +1415,9 @@ bool PacketStruct::StructLoadData(DataStruct* data_struct, void* data, int32 len
 		break;
 	}
 	case DATA_STRUCT_COLOR: {
-		if (strcmp(GetName(), "CreateCharacter") == 0 || strcmp(GetName(), "WS_SubmitCharCust") == 0)
+			// lets not do this again, DoF behaves differently than AoM, DoF is not compatible with CreateEQ2Color
+			//if (strcmp(GetName(), "CreateCharacter") == 0 || strcmp(GetName(), "WS_SubmitCharCust") == 0)
+		if(create_color)
 			CreateEQ2Color((EQ2_Color*)data);
 		else
 			LoadData((EQ2_Color*)data, len);
@@ -1439,7 +1441,7 @@ bool PacketStruct::StructLoadData(DataStruct* data_struct, void* data, int32 len
 		}
 		if (ps && size > 0) {
 			//for(int i=0;i<size && (GetLoadLen()-GetLoadPos()) > 0;i++){
-			if(ps->LoadPacketData(GetLoadBuffer() + GetLoadPos(), GetLoadLen() - GetLoadPos())) {
+			if(ps->LoadPacketData(GetLoadBuffer() + GetLoadPos(), GetLoadLen() - GetLoadPos(), create_color)) {
 				SetLoadPos(GetLoadPos() + ps->GetLoadPos());
 			}
 			//}

+ 2 - 2
EQ2/source/common/PacketStruct.h

@@ -413,8 +413,8 @@ public:
 	}
 	void UpdateArrayByArrayLengthName(const char* name, int32 index, int32 size);
 	void UpdateArrayByArrayLength(DataStruct* data_struct, int32 index, int32 size);
-	bool StructLoadData(DataStruct* data_struct, void* data, int32 len, bool useType2 = false);
-	bool LoadPacketData(uchar* data, int32 data_len);
+	bool StructLoadData(DataStruct* data_struct, void* data, int32 len, bool useType2 = false, bool create_color = false);
+	bool LoadPacketData(uchar* data, int32 data_len, bool create_color = false);
 	bool CheckFlagExists(const char* name);
 
 	void setColorByName(const char* name, EQ2_Color* data, int32 index = 0) {

+ 2 - 3
server/CommonStructs.xml

@@ -43,6 +43,7 @@ to zero and treated like placeholders." />
 <Data ElementName="body_size" Type="float" Size="1" />
 <Data ElementName="body_age" Type="float" Size="1" />
 </Struct>
+
 <Struct Name="CreateCharacter" ClientVersion="546" OpcodeName="OP_CreateCharacterRequestMsg">
 <Data ElementName="unknown0" Type="int8" />
 <Data ElementName="unknown1" Type="int32" />
@@ -58,9 +59,7 @@ to zero and treated like placeholders." />
 <Data ElementName="cc_unknown_0" Type="int8" />
 <Data ElementName="version" Type="int8" />
 <Data ElementName="race_file" Type="EQ2_16Bit_String" />
-<Data ElementName="skin_color" Type="EQ2_Color" />
-<Data ElementName="skin_color2" Type="EQ2_Color" />
-<Data ElementName="skin_color3" Type="EQ2_Color" />
+<Data ElementName="skin_color" Type="float" Size="3" />
 <Data ElementName="eye_color" Type="float" Size="3" />
 <Data ElementName="hair_color1" Type="float" Size="3" />
 <Data ElementName="hair_color2" Type="float" Size="3" />

+ 31 - 1
server/ItemStructs.xml

@@ -4083,6 +4083,14 @@
 </Data>
 <Data ElementName="equip_flag" Type="int8" Size="1" />
 </Struct>
+<Struct Name="WS_UpdateInventory" ClientVersion="546" OpcodeName="OP_UpdateInventoryMsg" >
+<Data ElementName="item_count" Type="int16" />
+<Data ElementName="packed_size" Type="int32" />
+<Data ElementName="item_array" Type="Array" ArraySizeVariable="item_count">
+  <Data ElementName="items" Substruct="Substruct_Item" Size="1" />
+</Data>
+<Data ElementName="equip_flag" Type="int8" Size="1" />
+</Struct>
 <Struct Name="WS_UpdateInventory" ClientVersion="547" OpcodeName="OP_UpdateInventoryMsg" >
 <Data ElementName="item_count" Type="int16" />
 <Data ElementName="packed_size" Type="int32" />
@@ -4202,7 +4210,6 @@
 <Data ElementName="delay" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
 <Data ElementName="range_low" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
 <Data ElementName="range_high" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
-<Data ElementName="damage_type" Type="int8" Size="1" />
 <Data ElementName="rating" Type="float" Size="1" />
 <Data ElementName="footer" Substruct="Substruct_ItemFooter" Size="1" />
 </Struct>
@@ -4329,6 +4336,16 @@
 <Data ElementName="delay" Type="int8" Size="1"/>
 <Data ElementName="range_low" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
 
+<Data ElementName="damage_type" Type="int8" Size="1" />
+</Struct>
+<Struct Name="WS_ItemRangeDetails"  ClientVersion="547">
+<Data ElementName="damage_low1" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="damage_high1" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="damage_low2" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="damage_high2" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="delay" Type="int8" Size="1"/>
+<Data ElementName="range_low" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+
 <Data ElementName="damage_type" Type="int8" Size="1" />
 </Struct>
 <Struct Name="WS_ItemArmorDetails" ClientVersion="1">
@@ -4460,6 +4477,19 @@
 <Data ElementName="display_until_cancelled" Type="int8" Size="1" />
 <Data ElementName="footer" Substruct="Substruct_ItemFooter" Size="1" />
 </Struct>
+<Struct Name="WS_ItemBauble" ClientVersion="547" OpcodeName="OP_ClientCmdMsg" OpcodeType="OP_EqExamineInfoCmd">
+<Data ElementName="header" Substruct="Substruct_ItemDescription" Size="1" />
+<Data ElementName="cast" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="recovery" Type="int16" Size="1" OversizedValue="127" OversizedByte="127" />
+<Data ElementName="duration" Type="int32" Size="1" />
+<Data ElementName="recast" Type="float" Size="1" />
+<Data ElementName="display_cast_time" Type="int8" Size="1" />
+<Data ElementName="display_bauble_type" Type="int8" Size="1" />
+<Data ElementName="effect_radius" Type="float" Size="1" />
+<Data ElementName="max_aoe_targets" Type="int32" Size="1" />
+<Data ElementName="display_until_cancelled" Type="int8" Size="1" />
+<Data ElementName="footer" Substruct="Substruct_ItemFooter" Size="1" />
+</Struct>
 <Struct Name="WS_ItemSkill" ClientVersion="546" OpcodeName="OP_ClientCmdMsg" OpcodeType="OP_EqExamineInfoCmd">
 <Data ElementName="header" Substruct="Substruct_ItemDescription" Size="1" />
 <Data ElementName="spell_info" Substruct="WS_SpellInfo" Size="1" />

+ 3 - 3
server/LoginStructs.xml

@@ -268,14 +268,14 @@ to zero and treated like placeholders." />
 <Data ElementName="unknown5" Type="int32" Size="1" /> <!-- 4 -->
 <Data ElementName="version" Type="int8" Size="1" /> <!-- 4 -->
 <Data ElementName="race_type" Type="int16" Size="1" />
-<Data ElementName="skin_color" Type="sint8" Size="3" />
+<Data ElementName="skin_color" Type="sint8" Size="3"/>
 <Data ElementName="eye_color" Type="sint8" Size="3" />
 <Data ElementName="equip" Type="EQ2_EquipmentItem" Size="23" />
 <Data ElementName="hair_type" Type="int16" Size="1" />
 <Data ElementName="hair_type_color" Type="sint8" Size="3" />
 <Data ElementName="hair_type_highlight_color" Type="sint8" Size="3" />
 <Data ElementName="hair_face_type" Type="int16" Size="1" />
-<Data ElementName="hair_face_color" Type="sint8" Size="3" />
+<Data ElementName="hair_face_color" Type="sint8" Size="3" />	
 <Data ElementName="hair_face_highlight_color" Type="sint8" Size="3" />
 <Data ElementName="chest_type" Type="int16" Size="1" />
 <Data ElementName="shirt_color" Type="sint8" Size="3" />
@@ -301,7 +301,7 @@ to zero and treated like placeholders." />
 <Data ElementName="hair_color3" Type="sint8" Size="3" />
 <Data ElementName="unknown11" Type="int8" Size="10" />
 <Data ElementName="soga_race_type" Type="int16" Size="1" />
-<Data ElementName="soga_skin_color" Type="EQ2_Color" />
+<Data ElementName="soga_skin_colorx" Type="EQ2_Color" />
 <Data ElementName="soga_eye_color" Type="EQ2_Color" />
 <Data ElementName="Unknown12" Type="int8" Size="3" />
 <Data ElementName="soga_eye_type" Type="sint8" Size="3" />