Browse Source

EQ2Emu Base Updates

Resolves #14
Image 4 years ago
parent
commit
24a1ccf3a2

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

@@ -946,7 +946,7 @@ void Entity::CalculateSpellBonuses(ItemStatsValues* stats){
 		bool race_match = false;
 		while(itr.Next()) {
 			if (itr.value->race_req.size() > 0) {
-				for (int8 i; i < itr.value->race_req.size(); i++) {
+				for (int8 i = 0; i < itr.value->race_req.size(); i++) {
 					if (GetRace() == itr.value->race_req[i]) {
 						race_match = true;
 					}

+ 3 - 0
EQ2/source/WorldServer/Factions.h

@@ -46,6 +46,9 @@ public:
 		for(iter = global_faction_list.begin();iter != global_faction_list.end(); iter++){
 			safe_delete(iter->second);
 		}
+
+		hostile_factions.clear();
+		friendly_factions.clear();
 	}
 	sint32 GetDefaultFactionValue(int32 faction_id){
 		if(global_faction_list.count(faction_id) > 0 && global_faction_list[faction_id])

File diff suppressed because it is too large
+ 240 - 240
EQ2/source/WorldServer/LuaFunctions.cpp


+ 8 - 5
EQ2/source/WorldServer/LuaFunctions.h

@@ -1,4 +1,4 @@
-/*  
+/*
     EQ2Emulator:  Everquest II Server Emulator
     Copyright (C) 2007  EQ2EMulator Development Team (http://www.eq2emulator.net)
 
@@ -112,7 +112,7 @@ int EQ2Emu_lua_GetSpellName(lua_State* state);
 
 //Misc
 int EQ2Emu_lua_SpawnSet(lua_State* state);
-int EQ2Emu_lua_KillSpawn(lua_State* state); 
+int EQ2Emu_lua_KillSpawn(lua_State* state);
 int EQ2Emu_lua_KillSpawnByDistance(lua_State* state);
 int EQ2Emu_lua_SpawnSetByDistance(lua_State* state);
 int EQ2Emu_lua_SetRequiredQuest(lua_State* state);
@@ -240,8 +240,8 @@ int EQ2Emu_lua_Harvest(lua_State* state);
 int EQ2Emu_lua_SetCompleteFlag(lua_State* state);
 int EQ2Emu_lua_CanReceiveQuest(lua_State* state);
 
-int EQ2Emu_lua_HasCollectionsToHandIn(lua_State *state);
-int EQ2Emu_lua_HandInCollections(lua_State *state);
+int EQ2Emu_lua_HasCollectionsToHandIn(lua_State* state);
+int EQ2Emu_lua_HandInCollections(lua_State* state);
 
 int EQ2Emu_lua_UseWidget(lua_State* state);
 int EQ2Emu_lua_SummonPet(lua_State* state);
@@ -280,7 +280,7 @@ int EQ2Emu_lua_ToggleFollow(lua_State* state);
 int EQ2Emu_lua_IsFollowing(lua_State* state);
 int EQ2Emu_lua_SetTempVariable(lua_State* state);
 int EQ2Emu_lua_GetTempVariable(lua_State* state);
-int EQ2Emu_lua_GiveQuestItem(lua_State*state);
+int EQ2Emu_lua_GiveQuestItem(lua_State* state);
 int EQ2Emu_lua_SetQuestRepeatable(lua_State* state);
 
 int EQ2Emu_lua_AddWard(lua_State* state);
@@ -405,4 +405,7 @@ int EQ2Emu_lua_GetPCTOfHP(lua_State* state);
 int EQ2Emu_lua_GetPCTOfPower(lua_State* state);
 int EQ2Emu_lua_GetBoundZoneID(lua_State* state);
 int EQ2Emu_lua_Evac(lua_State* state);
+int EQ2Emu_lua_GetSpellTier(lua_State* state);
+int EQ2Emu_lua_GetSpellID(lua_State* state);
+int EQ2Emu_lua_ProcHate(lua_State* state);
 #endif

File diff suppressed because it is too large
+ 211 - 201
EQ2/source/WorldServer/LuaInterface.cpp


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

@@ -136,7 +136,7 @@ void PlayerGroup::GroupChatMessage(Spawn* from, const char* message) {
 	deque<GroupMemberInfo*>::iterator itr;
 	for(itr = m_members.begin(); itr != m_members.end(); itr++) {
 		GroupMemberInfo* info = *itr;
-		if(info->client && info->client->GetCurrentZone())
+		if(info && info->client && info->client->GetCurrentZone())
 			info->client->GetCurrentZone()->HandleChatMessage(info->client, from, 0, CHANNEL_GROUP_SAY, message, 0);
 	}
 }

+ 2 - 0
EQ2/source/WorldServer/Skills.cpp

@@ -296,6 +296,8 @@ int16 PlayerSkillList::CalculateSkillValue(int32 skill_id, int16 current_val){
 		}
 		return new_val;
 	}
+
+	return current_val;
 }
 
 int16 PlayerSkillList::CalculateSkillMaxValue(int32 skill_id, int16 max_val) {

+ 19 - 6
EQ2/source/WorldServer/Spawn.cpp

@@ -472,7 +472,7 @@ uchar* Spawn::spawn_pos_changes(Player* player, int16 version){
 	player->pos_mutex.writelock(__FUNCTION__, __LINE__);
 	uchar* orig_packet = player->GetSpawnPosPacketForXOR(id);
 	packet->ResetData();
-	InitializePosPacketData(player, packet);
+	InitializePosPacketData(player, packet, true);
 	string* data = packet->serializeString();
 	int32 size = data->length();
 	uchar* xor_pos_packet = player->GetTempPosPacketForXOR();
@@ -1283,7 +1283,7 @@ int32 Spawn::GetTransporterID(){
 	return transporter_id;
 }
 
-void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet){
+void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet, bool bSpawnUpdate) {
 	int16 version = packet->GetVersion();
 	packet->setDataByName("pos_grid_id", appearance.pos.grid_id);
 	bool include_heading = true;
@@ -1351,6 +1351,8 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet){
 		packet->setDataByName("pos_z_velocity", static_cast<sint16>(GetSpeedZ() * 32));
 	}
 
+	bool bSendSpeed = true;
+
 	if (IsWidget() && ((Widget*)this)->GetMultiFloorLift()) {
 		Widget* widget = (Widget*)this;
 
@@ -1377,7 +1379,9 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet){
 		packet->setDataByName("pos_y3", y);
 		packet->setDataByName("pos_z3", z);
 	}
-	else {
+	//If this is a spawn update or this spawn is currently moving we can send these values, otherwise set speed and next_xyz to 0
+	//This fixes the bug where spawns with movement scripts face south when initially spawning if they are at their target location.
+	else if (bSpawnUpdate || memcmp(&appearance.pos.X, &appearance.pos.X2, sizeof(float) * 3) != 0) {
 		packet->setDataByName("pos_next_x", appearance.pos.X2);
 		packet->setDataByName("pos_next_y", appearance.pos.Y2);
 		packet->setDataByName("pos_next_z", appearance.pos.Z2);
@@ -1386,6 +1390,10 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet){
 		packet->setDataByName("pos_y3", appearance.pos.Y3);
 		packet->setDataByName("pos_z3", appearance.pos.Z3);
 	}
+	else
+	{
+		bSendSpeed = false;
+	}
 	//packet->setDataByName("pos_unknown2", 4, 2);
 
 	int16 speed_multiplier = rule_manager.GetGlobalRule(R_Spawn, SpeedMultiplier)->GetInt16(); // was 1280, 600 and now 300... investigating why
@@ -1397,7 +1405,7 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet){
 		packet->setDataByName("pos_speed", player->GetPosPacketSpeed() * speed_multiplier);
 		packet->setDataByName("pos_side_speed", player->GetSideSpeed() * speed_multiplier);
 	}
-	else {
+	else if (bSendSpeed) {
 		packet->setDataByName("pos_speed", GetSpeed() * speed_multiplier);
 	}
 	
@@ -2195,8 +2203,13 @@ void Spawn::CalculateRunningLocation(bool stop){
 void Spawn::FaceTarget(float x, float z){
 	float angle;
 
-	double diff_x=x - GetX();
-	double diff_z=z - GetZ();
+	double diff_x = x - GetX();
+	double diff_z = z - GetZ();
+
+	//If we're very close to the same spot don't bother changing heading
+	if (sqrt(diff_x * diff_x * diff_z * diff_z) < .1) {
+		return;
+	}
 
 	if(diff_z==0){
 	   if(diff_x > 0)

+ 2 - 3
EQ2/source/WorldServer/Spawn.h

@@ -337,8 +337,7 @@ public:
 		last_heading_angle = heading;
 		if (heading != 180)
 			heading = (heading - 180) * 64;
-		SetPos(&appearance.pos.Dir1, (sint16)heading, updateFlags);
-		SetPos(&appearance.pos.Dir2, (sint16)heading, updateFlags);
+		SetHeading((sint16)heading, (sint16)heading, updateFlags);
 	}
 	void SetPitch(sint16 pitch1, sint16 pitch2, bool updateFlags = true){
 		SetPos(&appearance.pos.Pitch1, (sint16)pitch1, updateFlags);
@@ -840,7 +839,7 @@ public:
 	int32	GetTransporterID();
 	bool	MeetsSpawnAccessRequirements(Player* player);
 
-	void	InitializePosPacketData(Player* player, PacketStruct* packet);
+	void	InitializePosPacketData(Player* player, PacketStruct* packet, bool bSpawnUpdate = false);
 	void	InitializeInfoPacketData(Player* player, PacketStruct* packet);
 	void	InitializeVisPacketData(Player* player, PacketStruct* packet);
 	void	InitializeHeaderPacketData(Player* player, PacketStruct* packet, int16 index);

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

@@ -1316,7 +1316,7 @@ bool SpellProcess::CastProcessedSpell(LuaSpell* spell, bool passive){
 			if (i == 0 && !spell->spell->GetSpellData()->not_maintained) {
 				spell->caster->AddMaintainedSpell(spell);
 				//((Entity*)target)->AddMaintainedSpell(spell);
-				LogWrite(SPELL__ERROR, 0, "AddMaintained", "%s", ((Entity*)target)->GetName());
+				LogWrite(SPELL__DEBUG, 0, "Spell", "AddMaintained on %s", ((Entity*)target)->GetName());
 			}
 			
 			SpellEffects* effect = ((Entity*)target)->GetSpellEffect(spell->spell->GetSpellID());

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

@@ -883,7 +883,7 @@ bool Client::HandlePacket(EQApplicationPacket *app) {
 				if(zar)
 				{
 					firstlogin = zar->isFirstLogin ( );
-					LogWrite(ZONE__INFO, 0, "ZoneAuth", "Access Key: %u, Character Name: %s, Account ID: %u", zar->GetAccessKey(), zar->GetCharacterName(), zar->GetAccountID());
+					LogWrite(ZONE__INFO, 0, "ZoneAuth", "Access Key: %u, Character Name: %s, Account ID: %u, Client Data Version: %u", zar->GetAccessKey(), zar->GetCharacterName(), zar->GetAccountID(), version);
 					if(database.loadCharacter(zar->GetCharacterName(), zar->GetAccountID(), this)){
 						version = request->getType_int16_ByName("version");
 						MDeletePlayer.writelock(__FUNCTION__, __LINE__);

+ 3 - 0
EQ2/source/WorldServer/zoneserver.cpp

@@ -2015,6 +2015,9 @@ void ZoneServer::ProcessSpawnLocation(int32 location_id, bool respawn)
 					CalculateSpawnGroup(spawn_location_list[location_id]);
 
 				LogWrite(SPAWN__TRACE, 0, "Spawn", "Exit %s", __FUNCTION__);
+
+				// need to unlock the list before we exit the function
+				MSpawnLocationList.releasereadlock(__FUNCTION__, __LINE__);
 				return;
 			}
 		}

+ 33 - 16
EQ2/structs/LoginStructs.xml

@@ -75,22 +75,39 @@ to zero and treated like placeholders." />
 </Data>
 </Struct>-->
 <Struct Name="LS_WorldList" ClientVersion="1" OpcodeName="OP_WorldListMsg">
-<Data ElementName="num_worlds" Type="int8" />
-<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
-  <Data ElementName="id" Type="int32" Size="1" />
-  <Data ElementName="name" Type="EQ2_16Bit_String" />
-  <Data ElementName="name2" Type="EQ2_16Bit_String" />
-  <Data ElementName="tag" Type="int8" Size="1" />
-  <Data ElementName="locked" Type="int8" Size="1" />
-  <Data ElementName="hidden" Type="int8" Size="1" />
-  <Data ElementName="unknown" Type="int8" Size="1" />
-  <Data ElementName="num_players" Type="int16" Size="1" />
-  <Data ElementName="load" Type="int8" Size="1" />
-  <Data ElementName="number_online_flag" Type="int8" Size="1" />
-  <Data ElementName="feature_set" Type="int8" Size="2" />
-  <Data ElementName="allowed_races" Type="int32" Size="1" />
-</Data>
-<Data ElementName="unknown2" Type="int8" />
+	<Data ElementName="num_worlds" Type="int8" />
+	<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
+		<Data ElementName="id" Type="int32" Size="1" />
+		<Data ElementName="name" Type="EQ2_16Bit_String" />
+		<Data ElementName="name2" Type="EQ2_16Bit_String" />
+		<Data ElementName="tag" Type="int8" Size="1" />
+		<Data ElementName="locked" Type="int8" Size="1" />
+		<Data ElementName="hidden" Type="int8" Size="1" />
+		<Data ElementName="unknown" Type="int8" Size="1" />
+		<Data ElementName="num_players" Type="int16" Size="1" />
+		<Data ElementName="load" Type="int8" Size="1" />
+		<Data ElementName="number_online_flag" Type="int8" Size="1" />
+		<Data ElementName="feature_set" Type="int8" Size="1" />
+		<Data ElementName="allowed_races" Type="int32" Size="1" />
+	</Data>
+</Struct>
+<Struct Name="LS_WorldList" ClientVersion="60100" OpcodeName="OP_WorldListMsg">
+	<Data ElementName="num_worlds" Type="int8" />
+	<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
+		<Data ElementName="id" Type="int32" Size="1" />
+		<Data ElementName="name" Type="EQ2_16Bit_String" />
+		<Data ElementName="name2" Type="EQ2_16Bit_String" />
+		<Data ElementName="tag" Type="int8" Size="1" />
+		<Data ElementName="locked" Type="int8" Size="1" />
+		<Data ElementName="hidden" Type="int8" Size="1" />
+		<Data ElementName="unknown" Type="int8" Size="1" />
+		<Data ElementName="num_players" Type="int16" Size="1" />
+		<Data ElementName="load" Type="int8" Size="1" />
+		<Data ElementName="number_online_flag" Type="int8" Size="1" />
+		<Data ElementName="feature_set" Type="int8" Size="2" />
+		<Data ElementName="allowed_races" Type="int32" Size="1" />
+		</Data>
+	<Data ElementName="unknown2" Type="int8" />
 </Struct>
 <Struct Name="LS_WorldUpdate" ClientVersion="1" OpcodeName="OP_WorldStatusChangeMsg">
 <Data ElementName="server_id" Type="int32" Size="1" />

+ 122 - 1
EQ2/structs/SpawnStructs.xml

@@ -1923,6 +1923,123 @@
 <Data ElementName="activity_timer" Type="int32" Size="1" />
 <Data ElementName="unknown18" Type="int8" Size="68" />-->
 </Struct>
+<Struct Name="Substruct_SpawnInfoStruct" ClientVersion="67633" >
+<Data ElementName="model_type" Type="int32" Size="1" />
+<Data ElementName="soga_model_type" Type="int32" Size="1" />
+<Data ElementName="equipment_types" Type="int32" Size="25" />
+<Data ElementName="unknown7a" Type="int16" Size="2" />
+<Data ElementName="unknown7aa" Type="int16" Size="2" />
+<Data ElementName="hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30" Type="int16" Size="1" />
+<Data ElementName="facial_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30a" Type="int16" Size="1" />
+<Data ElementName="wing_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30b" Type="int16" Size="1" />
+<Data ElementName="chest_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30c" Type="int16" Size="1" />
+<Data ElementName="legs_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown_new_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30d" Type="int16" Size="1" />
+<Data ElementName="unknown30e" Type="int16" Size="1" />
+<Data ElementName="soga_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30f" Type="int16" Size="1" />
+<Data ElementName="soga_facial_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30g" Type="int16" Size="1" />
+<Data ElementName="mount_type" Type="int32" />
+<Data ElementName="combat_voice" Type="int32" Size="1" />
+<Data ElementName="emote_voice" Type="int32" Size="1" />
+<Data ElementName="unknown17" Type="int32" Size="1" />
+<Data ElementName="visual_flag" Type="int8" Size="1" />
+<Data ElementName="interaction_flag" Type="int8" Size="1" />
+<Data ElementName="unknown60055" Type="int8" Size="18" />
+<Data ElementName="equipment_colors" Type="EQ2_Color" Size="25" />
+<Data ElementName="unknown7b" Type="EQ2_Color" Size="2" />
+<Data ElementName="hair_type_color" Type="EQ2_Color" />
+<Data ElementName="hair_face_color" Type="EQ2_Color" />
+<Data ElementName="wing_color1" Type="EQ2_Color" />
+<Data ElementName="unknown10" Type="EQ2_Color" Size="3" />
+<Data ElementName="equipment_highlights" Type="EQ2_Color" Size="25" />
+<Data ElementName="unknown7c" Type="EQ2_Color" Size="2" />
+<Data ElementName="hair_type_highlight_color" Type="EQ2_Color" />
+<Data ElementName="hair_face_highlight_color" Type="EQ2_Color" />
+<Data ElementName="wing_color2" Type="EQ2_Color" />
+<Data ElementName="unknown11" Type="EQ2_Color" Size="3" />
+<Data ElementName="soga_hair_type_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_type_highlight_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_face_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_face_highlight_color" Type="EQ2_Color" />
+<Data ElementName="skin_color" Type="EQ2_Color" Size="1" />
+<Data ElementName="eye_color" Type="EQ2_Color" Size="1" />
+<Data ElementName="soga_eye_color" Type="EQ2_Color" />
+<Data ElementName="soga_skin_color" Type="EQ2_Color" />
+<Data ElementName="kunark_unknown_color1" Type="EQ2_Color" />
+<Data ElementName="kunark_unknown_color2" Type="EQ2_Color" />
+<Data ElementName="unknown12" Type="EQ2_Color" Size="1" />
+<Data ElementName="eye_type" Type="sint8" Size="3" />
+<Data ElementName="ear_type" Type="sint8" Size="3" />
+<Data ElementName="eye_brow_type" Type="sint8" Size="3" />
+<Data ElementName="cheek_type" Type="sint8" Size="3" />
+<Data ElementName="lip_type" Type="sint8" Size="3" />
+<Data ElementName="chin_type" Type="sint8" Size="3" />
+<Data ElementName="nose_type" Type="sint8" Size="3" />
+<Data ElementName="body_size" Type="sint8" Size="1" />
+<Data ElementName="body_size_unknown" Type="sint8" Size="1" />
+<Data ElementName="unknown14a" Type="int8" Size="3" />
+<Data ElementName="soga_eye_type" Type="sint8" Size="3" />
+<Data ElementName="soga_ear_type" Type="sint8" Size="3" />
+<Data ElementName="soga_eye_brow_type" Type="sint8" Size="3" />
+<Data ElementName="soga_cheek_type" Type="sint8" Size="3" />
+<Data ElementName="soga_lip_type" Type="sint8" Size="3" />
+<Data ElementName="soga_chin_type" Type="sint8" Size="3" />
+<Data ElementName="soga_nose_type" Type="sint8" Size="3" />
+<Data ElementName="unknown14b" Type="int8" Size="2" />
+<Data ElementName="mount_color" Type="EQ2_Color" /><!--index 464-->
+<Data ElementName="mount_saddle_color" Type="EQ2_Color" />
+<Data ElementName="hair_color1" Type="EQ2_Color" />
+<Data ElementName="hair_color2" Type="EQ2_Color" />
+<Data ElementName="hair_highlight" Type="EQ2_Color" />
+<Data ElementName="soga_hair_color1" Type="EQ2_Color" />
+<Data ElementName="soga_hair_color2" Type="EQ2_Color" />
+<Data ElementName="soga_hair_highlight" Type="EQ2_Color" />
+<Data ElementName="action_state" Type="int32" Size="1" />
+<Data ElementName="visual_state" Type="int32" Size="1" />
+<Data ElementName="mood_state" Type="int32" Size="1" />
+<Data ElementName="emote_state" Type="int32" Size="1" />
+<Data ElementName="unknown600552" Type="int8" Size="52" />
+<Data ElementName="spell_effects" Substruct="Substruct_TargetSpellEffects" Size="30" />
+<Data ElementName="target_id" Type="int32" Size="1" /> 
+<Data ElementName="follow_target" Type="int32" Size="1" /> 
+<Data ElementName="size_unknown" Type="int32" />
+<Data ElementName="unknown3b" Type="int8" Size="4" />
+<Data ElementName="spawn_type" Type="int8" Size="1" />
+<Data ElementName="icon" Type="int8" Size="1" />
+<Data ElementName="activity_status" Type="int32" Size="1" />
+<Data ElementName="unknownpk1" Type="int8" Size="2" />
+<Data ElementName="activity_timer" Type="int32" Size="1" />
+<Data ElementName="unknown600554" Type="int8" Size="4" />
+<Data ElementName="hp_remaining" Type="int32" Size="1" />
+<Data ElementName="power_percent" Type="int32" Size="1" />
+<Data ElementName="unknown600553" Type="int8" Size="4" />
+<Data ElementName="size_mod" Type="int8" Size="1" />
+<Data ElementName="size_type" Type="int8" Size="1" />
+<Data ElementName="unknown600553b" Type="int8" Size="3" />
+<Data ElementName="unknown4" Type="int8" />
+<Data ElementName="unknown67633" Type="int8" Size="3" />
+<Data ElementName="level" Type="int8" />
+<Data ElementName="unknown5" Type="int8" Size="1" />
+<Data ElementName="heroic_flag" Type="int8" Size="1" />
+<Data ElementName="unknown67633b" Type="int8" Size="1" />
+<Data ElementName="unknown7" Type="int32" Size="1" />
+<Data ElementName="race" Type="int8" Size="1" />
+<Data ElementName="gender" Type="int8" Size="1" />
+<Data ElementName="class" Type="int8" Size="1" />
+<Data ElementName="difficulty" Type="int8" Size="1" />
+<Data ElementName="unknown21" Type="int8" Size="3" /><!--
+<Data ElementName="unknownz5" Type="int16" Size="1" />
+<Data ElementName="unknown6" Type="int8" Size="1" />
+<Data ElementName="activity_timer" Type="int32" Size="1" />
+<Data ElementName="unknown18" Type="int8" Size="68" />-->
+</Struct>
 <Struct Name="WS_SpawnStruct_Footer" ClientVersion="1">
 <Data ElementName="name" Type="EQ2_16Bit_String" Size="1" />
 <Data ElementName="unknown" Type="int32" Size="2" />
@@ -2188,10 +2305,14 @@
 <Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
 <Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
 </Struct>
-
 <Struct Name="WS_SpawnStruct" ClientVersion="60055">
 <Data ElementName="position" Substruct="Substruct_SpawnPositionStruct" Size="1" />
 <Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
 <Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
 </Struct>
+<Struct Name="WS_SpawnStruct" ClientVersion="67633">
+<Data ElementName="position" Substruct="Substruct_SpawnPositionStruct" Size="1" />
+<Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
+<Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
+</Struct>
 </EQ2Emulator>

File diff suppressed because it is too large
+ 1836 - 34
EQ2/structs/WorldStructs.xml


+ 33 - 16
server/LoginStructs.xml

@@ -75,22 +75,39 @@ to zero and treated like placeholders." />
 </Data>
 </Struct>-->
 <Struct Name="LS_WorldList" ClientVersion="1" OpcodeName="OP_WorldListMsg">
-<Data ElementName="num_worlds" Type="int8" />
-<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
-  <Data ElementName="id" Type="int32" Size="1" />
-  <Data ElementName="name" Type="EQ2_16Bit_String" />
-  <Data ElementName="name2" Type="EQ2_16Bit_String" />
-  <Data ElementName="tag" Type="int8" Size="1" />
-  <Data ElementName="locked" Type="int8" Size="1" />
-  <Data ElementName="hidden" Type="int8" Size="1" />
-  <Data ElementName="unknown" Type="int8" Size="1" />
-  <Data ElementName="num_players" Type="int16" Size="1" />
-  <Data ElementName="load" Type="int8" Size="1" />
-  <Data ElementName="number_online_flag" Type="int8" Size="1" />
-  <Data ElementName="feature_set" Type="int8" Size="2" />
-  <Data ElementName="allowed_races" Type="int32" Size="1" />
-</Data>
-<Data ElementName="unknown2" Type="int8" />
+	<Data ElementName="num_worlds" Type="int8" />
+	<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
+		<Data ElementName="id" Type="int32" Size="1" />
+		<Data ElementName="name" Type="EQ2_16Bit_String" />
+		<Data ElementName="name2" Type="EQ2_16Bit_String" />
+		<Data ElementName="tag" Type="int8" Size="1" />
+		<Data ElementName="locked" Type="int8" Size="1" />
+		<Data ElementName="hidden" Type="int8" Size="1" />
+		<Data ElementName="unknown" Type="int8" Size="1" />
+		<Data ElementName="num_players" Type="int16" Size="1" />
+		<Data ElementName="load" Type="int8" Size="1" />
+		<Data ElementName="number_online_flag" Type="int8" Size="1" />
+		<Data ElementName="feature_set" Type="int8" Size="1" />
+		<Data ElementName="allowed_races" Type="int32" Size="1" />
+	</Data>
+</Struct>
+<Struct Name="LS_WorldList" ClientVersion="60100" OpcodeName="OP_WorldListMsg">
+	<Data ElementName="num_worlds" Type="int8" />
+	<Data ElementName="world_list" Type="Array" ArraySizeVariable="num_worlds">
+		<Data ElementName="id" Type="int32" Size="1" />
+		<Data ElementName="name" Type="EQ2_16Bit_String" />
+		<Data ElementName="name2" Type="EQ2_16Bit_String" />
+		<Data ElementName="tag" Type="int8" Size="1" />
+		<Data ElementName="locked" Type="int8" Size="1" />
+		<Data ElementName="hidden" Type="int8" Size="1" />
+		<Data ElementName="unknown" Type="int8" Size="1" />
+		<Data ElementName="num_players" Type="int16" Size="1" />
+		<Data ElementName="load" Type="int8" Size="1" />
+		<Data ElementName="number_online_flag" Type="int8" Size="1" />
+		<Data ElementName="feature_set" Type="int8" Size="2" />
+		<Data ElementName="allowed_races" Type="int32" Size="1" />
+		</Data>
+	<Data ElementName="unknown2" Type="int8" />
 </Struct>
 <Struct Name="LS_WorldUpdate" ClientVersion="1" OpcodeName="OP_WorldStatusChangeMsg">
 <Data ElementName="server_id" Type="int32" Size="1" />

+ 122 - 1
server/SpawnStructs.xml

@@ -1923,6 +1923,123 @@
 <Data ElementName="activity_timer" Type="int32" Size="1" />
 <Data ElementName="unknown18" Type="int8" Size="68" />-->
 </Struct>
+<Struct Name="Substruct_SpawnInfoStruct" ClientVersion="67633" >
+<Data ElementName="model_type" Type="int32" Size="1" />
+<Data ElementName="soga_model_type" Type="int32" Size="1" />
+<Data ElementName="equipment_types" Type="int32" Size="25" />
+<Data ElementName="unknown7a" Type="int16" Size="2" />
+<Data ElementName="unknown7aa" Type="int16" Size="2" />
+<Data ElementName="hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30" Type="int16" Size="1" />
+<Data ElementName="facial_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30a" Type="int16" Size="1" />
+<Data ElementName="wing_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30b" Type="int16" Size="1" />
+<Data ElementName="chest_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30c" Type="int16" Size="1" />
+<Data ElementName="legs_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown_new_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30d" Type="int16" Size="1" />
+<Data ElementName="unknown30e" Type="int16" Size="1" />
+<Data ElementName="soga_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30f" Type="int16" Size="1" />
+<Data ElementName="soga_facial_hair_type_id" Type="int16" Size="1" />
+<Data ElementName="unknown30g" Type="int16" Size="1" />
+<Data ElementName="mount_type" Type="int32" />
+<Data ElementName="combat_voice" Type="int32" Size="1" />
+<Data ElementName="emote_voice" Type="int32" Size="1" />
+<Data ElementName="unknown17" Type="int32" Size="1" />
+<Data ElementName="visual_flag" Type="int8" Size="1" />
+<Data ElementName="interaction_flag" Type="int8" Size="1" />
+<Data ElementName="unknown60055" Type="int8" Size="18" />
+<Data ElementName="equipment_colors" Type="EQ2_Color" Size="25" />
+<Data ElementName="unknown7b" Type="EQ2_Color" Size="2" />
+<Data ElementName="hair_type_color" Type="EQ2_Color" />
+<Data ElementName="hair_face_color" Type="EQ2_Color" />
+<Data ElementName="wing_color1" Type="EQ2_Color" />
+<Data ElementName="unknown10" Type="EQ2_Color" Size="3" />
+<Data ElementName="equipment_highlights" Type="EQ2_Color" Size="25" />
+<Data ElementName="unknown7c" Type="EQ2_Color" Size="2" />
+<Data ElementName="hair_type_highlight_color" Type="EQ2_Color" />
+<Data ElementName="hair_face_highlight_color" Type="EQ2_Color" />
+<Data ElementName="wing_color2" Type="EQ2_Color" />
+<Data ElementName="unknown11" Type="EQ2_Color" Size="3" />
+<Data ElementName="soga_hair_type_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_type_highlight_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_face_color" Type="EQ2_Color" />
+<Data ElementName="soga_hair_face_highlight_color" Type="EQ2_Color" />
+<Data ElementName="skin_color" Type="EQ2_Color" Size="1" />
+<Data ElementName="eye_color" Type="EQ2_Color" Size="1" />
+<Data ElementName="soga_eye_color" Type="EQ2_Color" />
+<Data ElementName="soga_skin_color" Type="EQ2_Color" />
+<Data ElementName="kunark_unknown_color1" Type="EQ2_Color" />
+<Data ElementName="kunark_unknown_color2" Type="EQ2_Color" />
+<Data ElementName="unknown12" Type="EQ2_Color" Size="1" />
+<Data ElementName="eye_type" Type="sint8" Size="3" />
+<Data ElementName="ear_type" Type="sint8" Size="3" />
+<Data ElementName="eye_brow_type" Type="sint8" Size="3" />
+<Data ElementName="cheek_type" Type="sint8" Size="3" />
+<Data ElementName="lip_type" Type="sint8" Size="3" />
+<Data ElementName="chin_type" Type="sint8" Size="3" />
+<Data ElementName="nose_type" Type="sint8" Size="3" />
+<Data ElementName="body_size" Type="sint8" Size="1" />
+<Data ElementName="body_size_unknown" Type="sint8" Size="1" />
+<Data ElementName="unknown14a" Type="int8" Size="3" />
+<Data ElementName="soga_eye_type" Type="sint8" Size="3" />
+<Data ElementName="soga_ear_type" Type="sint8" Size="3" />
+<Data ElementName="soga_eye_brow_type" Type="sint8" Size="3" />
+<Data ElementName="soga_cheek_type" Type="sint8" Size="3" />
+<Data ElementName="soga_lip_type" Type="sint8" Size="3" />
+<Data ElementName="soga_chin_type" Type="sint8" Size="3" />
+<Data ElementName="soga_nose_type" Type="sint8" Size="3" />
+<Data ElementName="unknown14b" Type="int8" Size="2" />
+<Data ElementName="mount_color" Type="EQ2_Color" /><!--index 464-->
+<Data ElementName="mount_saddle_color" Type="EQ2_Color" />
+<Data ElementName="hair_color1" Type="EQ2_Color" />
+<Data ElementName="hair_color2" Type="EQ2_Color" />
+<Data ElementName="hair_highlight" Type="EQ2_Color" />
+<Data ElementName="soga_hair_color1" Type="EQ2_Color" />
+<Data ElementName="soga_hair_color2" Type="EQ2_Color" />
+<Data ElementName="soga_hair_highlight" Type="EQ2_Color" />
+<Data ElementName="action_state" Type="int32" Size="1" />
+<Data ElementName="visual_state" Type="int32" Size="1" />
+<Data ElementName="mood_state" Type="int32" Size="1" />
+<Data ElementName="emote_state" Type="int32" Size="1" />
+<Data ElementName="unknown600552" Type="int8" Size="52" />
+<Data ElementName="spell_effects" Substruct="Substruct_TargetSpellEffects" Size="30" />
+<Data ElementName="target_id" Type="int32" Size="1" /> 
+<Data ElementName="follow_target" Type="int32" Size="1" /> 
+<Data ElementName="size_unknown" Type="int32" />
+<Data ElementName="unknown3b" Type="int8" Size="4" />
+<Data ElementName="spawn_type" Type="int8" Size="1" />
+<Data ElementName="icon" Type="int8" Size="1" />
+<Data ElementName="activity_status" Type="int32" Size="1" />
+<Data ElementName="unknownpk1" Type="int8" Size="2" />
+<Data ElementName="activity_timer" Type="int32" Size="1" />
+<Data ElementName="unknown600554" Type="int8" Size="4" />
+<Data ElementName="hp_remaining" Type="int32" Size="1" />
+<Data ElementName="power_percent" Type="int32" Size="1" />
+<Data ElementName="unknown600553" Type="int8" Size="4" />
+<Data ElementName="size_mod" Type="int8" Size="1" />
+<Data ElementName="size_type" Type="int8" Size="1" />
+<Data ElementName="unknown600553b" Type="int8" Size="3" />
+<Data ElementName="unknown4" Type="int8" />
+<Data ElementName="unknown67633" Type="int8" Size="3" />
+<Data ElementName="level" Type="int8" />
+<Data ElementName="unknown5" Type="int8" Size="1" />
+<Data ElementName="heroic_flag" Type="int8" Size="1" />
+<Data ElementName="unknown67633b" Type="int8" Size="1" />
+<Data ElementName="unknown7" Type="int32" Size="1" />
+<Data ElementName="race" Type="int8" Size="1" />
+<Data ElementName="gender" Type="int8" Size="1" />
+<Data ElementName="class" Type="int8" Size="1" />
+<Data ElementName="difficulty" Type="int8" Size="1" />
+<Data ElementName="unknown21" Type="int8" Size="3" /><!--
+<Data ElementName="unknownz5" Type="int16" Size="1" />
+<Data ElementName="unknown6" Type="int8" Size="1" />
+<Data ElementName="activity_timer" Type="int32" Size="1" />
+<Data ElementName="unknown18" Type="int8" Size="68" />-->
+</Struct>
 <Struct Name="WS_SpawnStruct_Footer" ClientVersion="1">
 <Data ElementName="name" Type="EQ2_16Bit_String" Size="1" />
 <Data ElementName="unknown" Type="int32" Size="2" />
@@ -2188,10 +2305,14 @@
 <Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
 <Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
 </Struct>
-
 <Struct Name="WS_SpawnStruct" ClientVersion="60055">
 <Data ElementName="position" Substruct="Substruct_SpawnPositionStruct" Size="1" />
 <Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
 <Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
 </Struct>
+<Struct Name="WS_SpawnStruct" ClientVersion="67633">
+<Data ElementName="position" Substruct="Substruct_SpawnPositionStruct" Size="1" />
+<Data ElementName="vis" Substruct="Substruct_SpawnVisualizationInfoStruct" Size="1" />
+<Data ElementName="info" Substruct="Substruct_SpawnInfoStruct" Size="1" />
+</Struct>
 </EQ2Emulator>

File diff suppressed because it is too large
+ 1836 - 34
server/WorldStructs.xml


Some files were not shown because too many files changed in this diff