Browse Source

Spell fails due to range missing auto submits bug

Image 4 years ago
parent
commit
438d9f76a7
3 changed files with 58 additions and 13 deletions
  1. 28 1
      EQ2/source/WorldServer/SpellProcess.cpp
  2. 22 8
      EQ2/source/WorldServer/World.cpp
  3. 8 4
      server/SpawnStructs.xml

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

@@ -940,7 +940,34 @@ void SpellProcess::ProcessSpell(ZoneServer* zone, Spell* spell, Entity* caster,
 				return;
 			}
 
-			if(caster->GetDistance(target) > spell->GetSpellData()->range) 
+			float tmpRange = spell->GetSpellData()->range;
+
+			if (client && target != caster && !spell->GetSpellData()->range)
+			{
+				bool match = false;
+				int tmpTier = 0;
+				Spell* tmpSpell = 0;
+				for (tmpTier = 0; tmpTier < spell->GetSpellTier(); tmpTier++)
+				{
+					tmpSpell = master_spell_list.GetSpell(spell->GetSpellData()->id, tmpTier);
+					if (tmpSpell && tmpSpell->GetSpellData()->range)
+					{
+						match = true;
+						break;
+					}
+				}
+				if (tmpSpell)
+					tmpRange = tmpSpell->GetSpellData()->range;
+
+				if (!match)
+					tmpTier = -1;
+
+				char msg[512];
+				snprintf(msg, 512, "%s: SpellCasted without proper spell range set: %s ID: %i Tier: %i Range obtained from tier %i range %f", caster->GetName(), spell->GetName(), spell->GetSpellID(), spell->GetSpellTier(), tmpTier, tmpRange);
+				commands.Command_ReportBug(client, new Seperator(msg));
+			}
+
+			if(caster->GetDistance(target) > tmpRange)
 			{
 				LogWrite(SPELL__DEBUG, 1, "Spell", "%s: Too far.", spell->GetName());
 				zone->SendSpellFailedPacket(client, SPELL_ERROR_TOO_FAR_AWAY);

+ 22 - 8
EQ2/source/WorldServer/World.cpp

@@ -955,7 +955,7 @@ bool World::ReportBug(string data, char* player_name, int32 account_id, const ch
 			list.push_back(data.substr(old_offset, offset));
 		old_offset = offset;
 	}
-	if(list.size() < 7){
+	if(list.size() > 0 && list.size() < 7){
 		string output = "Invalid bug list:\n";
 		for(int32 i=0;i<list.size();i++)
 			output = output.append("\t").append(list[i]).append("\n");
@@ -964,13 +964,27 @@ bool World::ReportBug(string data, char* player_name, int32 account_id, const ch
 	}
 	ServerPacket* outpack = new ServerPacket(ServerOP_BugReport, sizeof(BugReport));
 	BugReport* report = (BugReport*)outpack->pBuffer;
-	strncpy(report->category, list[0].c_str(), list[0].length() > 63 ? 63 : list[0].length());
-	strncpy(report->subcategory, list[1].c_str(), list[1].length() > 63 ? 63 : list[1].length());
-	strncpy(report->causes_crash, list[2].c_str(), list[2].length() > 63 ? 63 : list[2].length());
-	strncpy(report->reproducible, list[3].c_str(), list[3].length() > 63 ? 63 : list[3].length());
-	strncpy(report->summary, list[4].c_str(), list[4].length() > 127 ? 127 : list[4].length());
-	strncpy(report->description, list[5].c_str(), list[5].length() > 1999 ? 1999 : list[5].length());
-	strncpy(report->version, list[6].c_str(), list[6].length() > 31 ? 31 : list[6].length());
+
+	if (list.size() < 7) {
+		strncpy(report->category, "AutoBug", 7);
+		strncpy(report->subcategory, "AutoGenerate", 12);
+		strncpy(report->causes_crash, "N", 1);
+		strncpy(report->reproducible, "Y", 1);
+		strncpy(report->summary, data.c_str(), data.length() > 127 ? 127 : data.length());
+		strncpy(report->description, data.c_str(), data.length() > 1999 ? 1999 : data.length());
+		strncpy(report->version, "CUR", 3);
+	}
+	else
+	{
+		strncpy(report->category, list[0].c_str(), list[0].length() > 63 ? 63 : list[0].length());
+		strncpy(report->subcategory, list[1].c_str(), list[1].length() > 63 ? 63 : list[1].length());
+		strncpy(report->causes_crash, list[2].c_str(), list[2].length() > 63 ? 63 : list[2].length());
+		strncpy(report->reproducible, list[3].c_str(), list[3].length() > 63 ? 63 : list[3].length());
+		strncpy(report->summary, list[4].c_str(), list[4].length() > 127 ? 127 : list[4].length());
+		strncpy(report->description, list[5].c_str(), list[5].length() > 1999 ? 1999 : list[5].length());
+		strncpy(report->version, list[6].c_str(), list[6].length() > 31 ? 31 : list[6].length());
+	}
+
 	strncpy(report->player, player_name, strlen(player_name) > 63 ? 63 : strlen(player_name));
 	strncpy(report->spawn_name, spawn_name, strlen(spawn_name) > 63 ? 63 : strlen(spawn_name));
 	report->spawn_id = spawn_id;

+ 8 - 4
server/SpawnStructs.xml

@@ -32,7 +32,9 @@
 	<Data ElementName="command_list_max_distance" Type="float" Size="1" />
 	<Data ElementName="command_list_has_error_text" Type="int8" Size="1" />
 	<Data ElementName="command_list_unknown" Type="int8" Size="1" />
-	<Data ElementName="command_list_error" Type="EQ2_16Bit_String" Size="1" />
+	<Data ElementName="command_list_error_array" Type="Array" ArraySizeVariable="command_list_has_error_text">
+		<Data ElementName="command_list_error" Type="EQ2_16Bit_String" Size="1" />
+	</Data>
 	<Data ElementName="command_list_command" Type="EQ2_16Bit_String" />
 </Data>
 <Data ElementName="default_command" Type="EQ2_16Bit_String" Size="1" />
@@ -1887,10 +1889,8 @@
 <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" />
-<Data ElementName="icon" Type="int8" Size="1" />
 <Data ElementName="activity_status" Type="int32" Size="1" />
-<Data ElementName="unknownpk2" Type="int8" Size="2" />
+<Data ElementName="unknownpk2" Type="int8" Size="4" />
 <Data ElementName="activity_timer" Type="int32" Size="1" />
 <Data ElementName="unknown600554" Type="int8" Size="4" />
 <Data ElementName="hp_remaining" Type="int32" Size="1" />
@@ -2170,6 +2170,10 @@
 <Data ElementName="sign_distance" Type="float" Size="1" />
 <Data ElementName="show" Type="int8" Size="1" />
 <Data ElementName="language" Type="int8" Size="1" />
+<Data ElementName="unkStringArrayCount" Type="int8" Size="1" />
+<Data ElementName="unkStringArray" Type="Array" ArraySizeVariable="unkStringArrayCount">
+	<Data ElementName="unkString" Type="EQ2_16Bit_String" />
+</Data>
 </Struct>
 <Struct Name="Substruct_SpawnVisualizationInfoStruct" ClientVersion="1">
 <Data ElementName="arrow_color" Type="int8" Size="1" />