The code for the 'hover on death' and respawn window is also in the Titanium client as I was playing with it before Christmas, so it's use for SoF client support may also be optional.
In Titanium, OP_RespawnFromHover=0x011d
This is the code I was using to play with it, it is far from usable in it's current form.
When you die, it brings up the respawn box with two hardcoded options, respawn at bind in Pok, or Rez in Great Divide. It doesn't handle the Client reply which is OP_RespawnFromHover, with a uint32, 0 for respawn at bind, or 1 for the Rez option.
Code:
Index: common/emu_oplist.h
===================================================================
--- common/emu_oplist.h (revision 283)
+++ common/emu_oplist.h (working copy)
@@ -419,3 +419,4 @@
N(OP_VoiceMacroOut),
N(OP_WorldObjectsSent),
N(OP_BlockedBuffs),
+N(OP_RespawnFromHover),
Index: zone/attack.cpp
===================================================================
--- zone/attack.cpp (revision 283)
+++ zone/attack.cpp (working copy)
@@ -1703,7 +1703,7 @@
SetPet(0);
SetHorseId(0);
dead = true;
- dead_timer.Start(5000, true);
+ dead_timer.Start(300000, true);
if (other != NULL)
{
@@ -1908,6 +1908,10 @@
//
m_pp.zone_id = m_pp.binds[0].zoneId;
+
+ RespawnWindow();
+ return;
+
database.MoveCharacterToZone(this->CharacterID(), database.GetZoneName(m_pp.zone_id));
Save();
Index: zone/client.cpp
===================================================================
--- zone/client.cpp (revision 283)
+++ zone/client.cpp (working copy)
@@ -3803,3 +3803,42 @@
if(!worldserver.SendVoiceMacro(this, Type, Target, MacroNumber, GroupOrRaidID))
Message(0, "Error: World server disconnected");
}
+
+
+void Client::RespawnWindow() {
+
+ EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespawnFromHover, 90);
+
+ char* buf = (char *)outapp->pBuffer;
+
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0);
+ //VARSTRUCT_ENCODE_TYPE(uint32, buf, 0x000493e0); // Time in milliseconds, this is 300 Seconds
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 60 * 1000); // Timer ?
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0);
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 2);
+
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0x0); // Bind Location ?
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xca); // 202 Poknowledge
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc3586717); // Unknown
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc2491983); // Unknown
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc31ecf78); // Unknown
+ VARSTRUCT_ENCODE_TYPE(uint16, buf, 0);
+ VARSTRUCT_ENCODE_TYPE(uint16, buf, 0x4399);
+ VARSTRUCT_ENCODE_STRING(buf, "Bind Location");
+ //VARSTRUCT_ENCODE_TYPE(uint8, buf, 0);
+
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 1); // Resurrect ?
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0x76); // 118 Great Divide
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc54d79cf);
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc491f1e5);
+ VARSTRUCT_ENCODE_TYPE(uint32, buf, 0xc360df77);
+ VARSTRUCT_ENCODE_TYPE(uint16, buf, 0); // was 0
+ VARSTRUCT_ENCODE_TYPE(uint16, buf, 0);
+ VARSTRUCT_ENCODE_STRING(buf, "Resurrect");
+
+ VARSTRUCT_ENCODE_TYPE(uint8, buf, 1);
+
+ DumpPacket(outapp);
+ QueuePacket(outapp);
+ safe_delete(outapp);
+}
Index: zone/client.h
===================================================================
--- zone/client.h (revision 283)
+++ zone/client.h (working copy)
@@ -466,6 +466,7 @@
void SacrificeConfirm(Client* caster);
void Sacrifice(Client* caster);
void GoToDeath();
+ void RespawnWindow();
FACTION_VALUE GetReverseFactionCon(Mob* iOther);
FACTION_VALUE GetFactionLevel(int32 char_id, int32 npc_id, int32 p_race, int32 p_class, int32 p_deity, sint32 pFaction, Mob* tnpc);
I didn't progress it any further because I didn't think it was particularly useful.