The reason that it seems much different is due to the way the eqlive servers processed a player moving vs the way we do. As your client moves in a direction, it sends packets every x milliseconds to the server letting it know your position as well as your heading and animation (to determine if you are running). Our server stores that every time it receives it and does all calculations based on those locations.
EQLive on the other hand has code in place to determine exactly where you "should" be based on your last update and the amount of time passed since then. Although the packets are still sent multiple times a second, that can make a difference when the server decides if you are close enough to be attacked.
This is also the reason it seems like mobs are able to outrun you or catch up to you while you are fleeing.
No emulator server has even attempted to tackle the implementation of this system, as it would require a major overhaul.
The best we can do is compensate for it. I can either statically increase the melee range, or I can make it that any client that is moving increases the range they can be attacked by by a certain percentage.
For reference, this is the combat range calculation formula from the client's point of view. I'm still figuring out the formula but I haven't spent much time on it yet.
Code:
double __cdecl get_melee_range(int a1, int a2)
{
double result; // st7@3
float v3; // ST04_4@7
float v4; // ST00_4@7
float v5; // [sp+Ch] [bp-10h]@7
float v6; // [sp+10h] [bp-Ch]@4
float v7; // [sp+14h] [bp-8h]@9
float v8; // [sp+18h] [bp-4h]@4
float v9; // [sp+18h] [bp-4h]@7
signed int v10; // [sp+20h] [bp+4h]@5
if ( a1 && a2 )
{
v8 = sub_517AF0(a1);
v6 = sub_517AF0(a2);
if ( dword_9B98EC == 1737909971 )
{
dword_9B95F0 = v10;
if ( v10 > (signed int)((char *)sub_70435F + 4) )
LOBYTE(dword_7738ED) = 0;
}
v3 = PlayerBase::GetSpriteOffsetHeight(a1);
v4 = v3 - PlayerBase::GetSpriteOffsetHeight(a2);
v5 = fabsf(v4);
v9 = (v8 + v6) * 0.75;
if ( v9 < 14.0 )
v9 = 14.0;
v7 = v9 + 2.0 + v5;
if ( v7 > 75.0 )
v7 = 75.0;
result = v7;
}
else
{
result = 14.0;
}
return result;
}