Log in

View Full Version : Respawn Window


trevius
05-22-2009, 05:45 AM
I think I have the respawn window structure figured out for SoF at least. I also think I figured out why people get disconnected if they die in the zone they are bound in on SoF clients. I will try to get the disconnect issue fixed tonight and on the SVN, but to get the code to support the respawn window might take longer if I can even figure it out myself. Here is the structure I have for it from Live anyway:

typedef struct {
/*000*/ uint32 bind_number; // Number of this bind in the iteration
/*004*/ uint32 bind_zone_id; // ID of the zone for this bind point or resurect point
/*008*/ float x; // X loc for this bind point
/*012*/ float y; // Y loc for this bind point
/*016*/ float z; // Z loc for this bind point
/*020*/ float heading; // Heading for this bind point
/*024*/ char bind_zone_name[14]; // Or "Bind Location" or "Resurrect"
/*000*/ uint8 validity; // 0 = valid choice, 1 = not a valid choice at this time (resurrection)
} RespawnOptions_Struct;

struct RespawnWindow_Struct {
/*000*/ uint32 unknown000; // Seen 0
/*004*/ uint32 time_remaining; // Total time before respawn in milliseconds
/*008*/ uint32 unknown008; // Seen 0
/*012*/ uint32 total_binds; // Total Bind Point Options? - Seen 2
/*016*/ RespawnOptions_Struct bind_points;
// First bind point is "Bind Location" and the last one is "Ressurect"
};

EDIT:
Nope, I guess I was wrong about why they get disconnected. I thought maybe it was because the zoneplayertobind structure was not being encoded and had changed (it did change on live). But, it looks like we send the death packet and wait for the client to send the zone request. In Titanium, I think it will send that automatically, so we know to zone them. But, in SoF, it looks like the client is waiting for the OP_RespawnWindow packet and we aren't sending that yet. Hopefully, I can figure out what is needed to get that working soon.

trevius
05-22-2009, 05:20 PM
So, I have the basic code in to kinda hack the Respawn Window to work now. Now the window will pop up when you die, but either something is wrong with the struct or something is wrong with how I am sending something, because it still disconnects after a couple seconds when dieing in the same zone you are bound in.

Once I can get the Respawn Window to work without the disconnects, I might try to see if I can get it to work the actual way it is supposed to, but I am not sure if that is something I can do or not. Basically, the idea is to get it working for now so that it will just give you 1 choice and that is to respawn at your bind point. Ideally, it should at least give you the option of resurrecting as well and maybe other options (I haven't played Live since it was put in other than to collect data).

trevius
05-23-2009, 04:21 AM
Well, I got a hacked version of the Respawn Window working. It isn't coded properly the way it should be, but it sends the packet the same way that Live does. I figure that once I get it working, I can either start trying to get it working the correct way, or see if someone else might be able to finish that part of the coding of it. Mostly, I just want to get it in to stop the disconnects when you die in the zone you are bound in on SoF.

I am still getting disconnected even with the Respawn Window seeming to work as it should. I am starting to think that we do a forced session disconnect somewhere in the death code since that is basically what happens when Titanium clients die. They get disconnected and build a new connection to the zone they are zoning to.

One reason I think it is the server disconnecting us is what the EQ debug says:

[Sat May 23 02:59:48 2009]00731:I died.

[Sat May 23 02:59:48 2009]00326:D3DXCreateTextureFromFileEx() failed to create texture dust_02.dds for particle system.

[Sat May 23 02:59:53 2009]00732:Networking: connection terminated [client:DisconnectReasonOtherSideTerminated,server: DisconnectReasonNone]
[Sat May 23 02:59:53 2009]00733:disconnected at C:\p4\EverQuest\live\EverQuest\EverQuest.cpp:18773 (char. select) DisconnectReasonOtherSideTerminated,DisconnectReas onNone

[Sat May 23 02:59:53 2009]00734:Character is Bluie.

[Sat May 23 02:59:53 2009]00735:YOU HAVE BEEN DISCONNECTED.
[Sat May 23 02:59:53 2009]00736:
end of DisplayScreen

[Sat May 23 03:00:12 2009]00737:Networking: Connection Closed [0] with 0 pending bytes.

I just haven't been able to find the code that is sending that disconnect yet.

trevius
05-27-2009, 05:48 PM
I added most of the code for the Respawn Window to the SVN. It isn't completed yet and is also not actually being used on death yet, but it is there. If I am able to get it figured out at some point, I will try to finish it. Until I can figure out why the server is disconnecting the player when they die instead of giving them the respawn window option, there is no reason to send the Respawn Window packet to them.

As it is, I have a temp hack in to let it send the Respawn Window packet if it is added to the death code. The code that handles it will need to be adjusted to do it the proper way, but until it stops disconnecting the character, it doesn't matter that much. At least the base code is there for it if someone else wants to pick it up and finish it at some point.

I think Derision mentioned that the Respawn Window also exists in Titanium, so if we can get it working in SoF, it shouldn't be hard to get it going in Titanium as well.