Browse Source

- Fix #564 - Mail support for DoF!
- Mail list inbox now updated when a mail item is read (previously unread)
- Fix run speed like sprint stacking on the player
- Removed some unnecessary spell code that was unused, nullified spell when cast timer is performing delete/cleanup

Emagi 1 week ago
parent
commit
96902a5564

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

@@ -2365,6 +2365,9 @@ float Entity::CalculateCastingSpeedMod() {
 
 float Entity::GetSpeed() {
 	float ret = speed > GetBaseSpeed() ? speed : GetBaseSpeed();
+	if(IsPlayer()) {
+		ret = GetBaseSpeed();
+	}
 	MStats.lock();
 	
 	if ((IsStealthed() || IsInvis()) && stats.count(ITEM_STAT_STEALTHINVISSPEEDMOD)) {

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

@@ -1019,22 +1019,6 @@ Spell* SpellProcess::GetSpell(Entity* caster){
 	return spell;
 }
 
-Spawn* SpellProcess::GetSpellTarget(Entity* caster){
-	Spawn* target = 0;
-	if(cast_timers.size() > 0){		
-		CastTimer* cast_timer = 0;
-		MutexList<CastTimer*>::iterator itr = cast_timers.begin();
-		while(itr.Next()){
-			 cast_timer = itr->value;
-			 if(cast_timer && cast_timer->spell->caster == caster){
-				target = caster->GetZone()->GetSpawnByID(cast_timer->spell->initial_target);
-				break;
-			 }
-		}
-	}
-	return target;
-}
-
 void SpellProcess::ProcessSpell(ZoneServer* zone, Spell* spell, Entity* caster, Spawn* target, bool lock, bool harvest_spell, LuaSpell* customSpell, int16 custom_cast_time, bool in_heroic_opp)
 {
 	if((customSpell != 0 || spell != 0) && caster)
@@ -2006,11 +1990,9 @@ void SpellProcess::Interrupted(Entity* caster, Spawn* interruptor, int16 error_c
 		if (spell && ((from_movement && !spell->spell->GetSpellData()->cast_while_moving) || (!from_movement && spell->spell->GetSpellData()->interruptable) ||
 			cancel)) 
 		{
-			Spawn* target = GetSpellTarget(caster);
 			InterruptStruct* interrupt = new InterruptStruct;
 			interrupt->interrupted = caster;
 			interrupt->spell = spell;
-			interrupt->target = target;
 			interrupt->error_code = error_code;
 			spell->interrupted = true;
 			interrupt_list.Add(interrupt);
@@ -2041,6 +2023,7 @@ void SpellProcess::RemoveSpellTimersFromSpawn(Spawn* spawn, bool remove_all, boo
 			 if(cast_timer && cast_timer->spell && cast_timer->spell->caster == spawn){
 				cast_timer->spell->caster = 0;
 				cast_timer->delete_timer = true;
+				cast_timer->spell = nullptr;
 			 }
 		}
 	}

+ 0 - 1
EQ2/source/WorldServer/SpellProcess.h

@@ -122,7 +122,6 @@
 #define GET_VALUE_BAD_VALUE				0xFFFFFFFF
 struct InterruptStruct{
 	Spawn*			interrupted;
-	Spawn*			target;
 	LuaSpell*		spell;
 	int16			error_code;
 };

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

@@ -8969,7 +8969,6 @@ void Client::SendMailList() {
 			p->setDataByName("unknown4", 0x01000000);
 			EQ2Packet* pack = p->serialize();
 			//DumpPacket(pack);
-			//p->PrintPacket();
 			QueuePacket(pack);
 			safe_delete(p);
 		}
@@ -8992,6 +8991,10 @@ void Client::DisplayMailMessage(int32 mail_id) {
 				QueuePacket(update->serialize());
 				safe_delete(update);
 			}
+			if(GetVersion() <= 547 && !mail->already_read) {
+				mail->already_read = true;
+				SendMailList();
+			}
 			PacketStruct* packet = configReader.getStruct("WS_MailGetMessage", GetVersion());
 			if (packet) {
 				packet->setDataByName("kiosk_id", kiosk_id);
@@ -9025,7 +9028,6 @@ void Client::DisplayMailMessage(int32 mail_id) {
 					packet->setDataByName("end_tag2", GetItemPacketType(GetVersion()));
 					packet->setDataByName("end_tag3", 0xFF);
 				}
-				mail->already_read = true;
 				mail->save_needed = true;
 				EQ2Packet* pack = packet->serialize();
 				QueuePacket(pack);

+ 24 - 26
server/WorldStructs.xml

@@ -15158,28 +15158,28 @@ to zero and treated like placeholders." />
 <Data ElementName="location_z" Type="float" Size="1" />
 </Data>
 </Struct>
-
 <Struct Name="WS_GetMailHeader" ClientVersion="1" OpcodeName="OP_MailGetHeadersReplyMsg">
 <Data ElementName="kiosk_id" Type="int32" />
-<Data ElementName="num_messages" Type="int16" Size="1" />
+<Data ElementName="num_messages" Type="int8" Size="1" />
 <Data ElementName="message_array" Type="Array" ArraySizeVariable="num_messages">
-	<Data ElementName="mail_id" Type="int32" Size="1" />
-	<Data ElementName="player_to_id" Type="int32" Size="1" />
-	<Data ElementName="player_from" Type="EQ2_16Bit_String" />
-	<Data ElementName="subject" Type="EQ2_16Bit_String" />
-	<Data ElementName="unknown1" Type="int16" Size="1" />
-	<Data ElementName="already_read" Type="int8" Size="1" />
-	<Data ElementName="mail_deletion" Type="int32" Size="1" />
-	<Data ElementName="mail_type" Type="int8" Size="1" />
-	<Data ElementName="mail_expire" Type="int32" Size="1" />
-	<Data ElementName="coin_copper" Type="int32" Size="1" />
-	<Data ElementName="coin_silver" Type="int32" Size="1" />
-	<Data ElementName="coin_gold" Type="int32" Size="1" />
-	<Data ElementName="coin_plat" Type="int32" Size="1" />
-	<Data ElementName="num_items" Type="int16" Size="1" />
-	<Data ElementName="packettype" Type="int16" Size="1" />
-	<Data ElementName="packetsubtype" Type="int8" />
-	<Data ElementName="unknown2" Type="int32" />
+    <Data ElementName="mail_id" Type="int32" Size="1" />
+    <Data ElementName="player_to_id" Type="int32" Size="1" />
+    <Data ElementName="subject" Type="EQ2_16Bit_String" />
+    <Data ElementName="player_from" Type="EQ2_16Bit_String" />
+    <Data ElementName="unknown1" Type="int16" Size="1" />
+    <Data ElementName="already_read" Type="int8" Size="1" />
+    <Data ElementName="mail_deletion" Type="int32" Size="1" />
+    <Data ElementName="mail_type" Type="int8" Size="1" />
+    <Data ElementName="mail_expire" Type="int32" Size="1" />
+    <Data ElementName="coin_copper" Type="int32" Size="1" />
+    <Data ElementName="coin_silver" Type="int32" Size="1" />
+    <Data ElementName="coin_gold" Type="int32" Size="1" />
+    <Data ElementName="coin_plat" Type="int32" Size="1" />
+    <Data ElementName="item" Type="EQ2_Item" Optional="TRUE"/>
+    <Data ElementName="end_tagx" Type="int16" IfVariableNotSet="item_%i"/>
+    <Data ElementName="end_tag2" Type="int16" IfVariableNotSet="item_%i"/>
+    <Data ElementName="end_tag3" Type="int16" IfVariableNotSet="item_%i"/>
+    <Data ElementName="end_tag4" Type="int8" size="4"/>
 </Data>
 <Data ElementName="postage_cost" Type="int32" Size="1" />
 <Data ElementName="attachment_cost" Type="int32" Size="1" />
@@ -15230,13 +15230,11 @@ to zero and treated like placeholders." />
 <Data ElementName="coin_silver" Type="int32" />
 <Data ElementName="coin_gold" Type="int32" />
 <Data ElementName="coin_plat" Type="int32" />
-<Data ElementName="stack" Type="int16" Size="1" />
-<Data ElementName="packettype" Type="int16" Size="1" />
-<Data ElementName="packetsubtype" Type="int8" />
-<Data ElementName="unknown4" Type="int32" IfVariableNotSet="stack_0" />
-<Data ElementName="unknown5" Type="int32" Size="1" />
-<Data ElementName="unknown6" Type="int16" Size="1" />
-<Data ElementName="unknown7" Type="int8" Size="3" />
+<Data ElementName="item" Type="EQ2_Item" Optional="TRUE"/>
+<Data ElementName="end_tagx" Type="int16" IfVariableNotSet="item_%i"/>
+<Data ElementName="end_tag2" Type="int16" IfVariableNotSet="item_%i"/>
+<Data ElementName="end_tag3" Type="int8" IfVariableNotSet="item_%i"/>
+<Data ElementName="end_tag4" Type="int8" size="5"/>
 </Struct>
 <Struct Name="WS_MailGetMessage" ClientVersion="1193" OpcodeName="OP_MailGetMessageReplyMsg">
 <Data ElementName="kiosk_id" Type="int32" />