![]() |
|
|
|
#1
|
||||
|
Quote:
| |||
|
|
||||
|
#3
|
||||
|
Quote:
__________________
Loramin Frostseer, Oracle of the Tribunal <Anonymous> and Fan of the "Where To Go For XP/For Treasure?" Guides Anyone can improve the wiki! If you are new to the Blue or Green servers, you can improve the wiki to earn a "welcome package" of platinum and/or gear! Send me a forum message for details. | |||
|
|
||||
|
#4
|
||||
|
Quote:
| |||
|
|
||||
|
#5
|
||||
|
Quote:
| |||
|
|
||||
|
#6
|
||||
|
Quote:
If someone else makes a reputable vanilla only server, but fills it with more user friendly amenities then I'd probably give it a shot! But that is just not what p1999 is about... | |||
|
|
||||
|
#7
|
||||
|
Quote:
Look, everyone who wants "classic with QoL improvements" ... or even just "not classic with QoL improvements" ... I think the chorus of complaints that come up every. single patch. like. this. shows that there are many, many players who would love such a server ... [You must be logged in to view images. Log in or Register.] ... and yet ... no one has. There's a ton of EQ emulator servers, yet not a single one with even a decent fraction of P99's population, and no custom content (with or without QoL stuff). That's probably related to the fact that all those other servers allow two-boxing and have crap support compared to P99. It's easy to say "hey devs (who have put a decade of work into your passion project), do something different." But, so far at least, it has proven impossible for anyone to "do something different", in spite of the clear MASSIVE demand for such a server (hell I'd certainly play a PoP server, even with post-PoP QoL, if it was like P99). Maybe, just maybe, it's literally impossible to make an unclassic successful emulated EQ server? Maybe no one else has the stomach/passion to make such a server: only the nutjobs ([You must be logged in to view images. Log in or Register.] <3) like R&N, who care way too much about re-creating a 20-year old game as exactly as possible, have what it takes? A decade of EQEmu history certainly seems to suggest as much.
__________________
Loramin Frostseer, Oracle of the Tribunal <Anonymous> and Fan of the "Where To Go For XP/For Treasure?" Guides Anyone can improve the wiki! If you are new to the Blue or Green servers, you can improve the wiki to earn a "welcome package" of platinum and/or gear! Send me a forum message for details. | |||
|
Last edited by loramin; 09-30-2019 at 12:07 PM..
|
|
|||
|
#8
|
||||
|
Quote:
__________________
Loramin Frostseer, Oracle of the Tribunal <Anonymous> and Fan of the "Where To Go For XP/For Treasure?" Guides Anyone can improve the wiki! If you are new to the Blue or Green servers, you can improve the wiki to earn a "welcome package" of platinum and/or gear! Send me a forum message for details. | |||
|
|
||||
|
#9
|
|||
|
Sure took long enough to implement. To me, that time passed was enough for me to believe staff wasn't as concerned about some of the smaller details. Time has proven me wrong.
| ||
|
Last edited by Castamere; 09-30-2019 at 11:42 AM..
|
|
||
|
#10
|
||||
|
Quote:
The Client psuedocode is 468,710 lines of code long, and most of it looks a lot like this: Code:
//----- (0041ACE9) --------------------------------------------------------
signed int __thiscall sub_41ACE9(_DWORD *this, unsigned int a2)
{
_DWORD *v2; // esi
int v3; // edx
int v4; // eax
int v5; // edi
signed int v6; // ebx
int v7; // edi
int v8; // eax
int v9; // edi
int v10; // eax
int v11; // eax
int v12; // eax
int v13; // eax
int v14; // edi
char v15; // al
int v16; // eax
signed int v17; // ecx
int v18; // eax
int v19; // ebx
signed int v20; // edi
_DWORD *v21; // eax
_DWORD *v22; // eax
int v23; // eax
int v24; // eax
int v25; // edi
int v26; // eax
signed int v28; // [esp+Ch] [ebp-4h]
_DWORD *v29; // [esp+Ch] [ebp-4h]
v2 = this;
v28 = sub_40E722((_DWORD *)((char *)this + *(_DWORD *)(this[1] + 4) + 4), a2);
v4 = v2[2];
if ( v4
&& !*(_BYTE *)(v4 + 580)
&& !*(_BYTE *)(v4 + 598)
&& !sub_4167E2((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4)) )
{
v29 = (_DWORD *)(*(int (**)(void))(*(_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4) + 64))();
v5 = *(_DWORD *)(sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8)) + 4516);
v6 = *(_DWORD *)(sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8)) + 4516);
if ( v6 < (unsigned __int8)sub_5ED510(v29) )
{
v7 = *(_DWORD *)(sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8)) + 4516);
if ( (unsigned __int8)sub_5ED510(v29) >= v7 + 2 )
v5 = *(_DWORD *)(sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8)) + 4516) + 2;
else
v5 = (unsigned __int8)sub_5ED510(v29);
}
v8 = sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8));
v9 = sub_44A448(v5, *(unsigned __int8 *)(v8 + 4508), a2, (int)v29);
if ( sub_40E722((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4), a2) < v9 )
v9 = sub_40E722((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4), a2);
v10 = sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8));
v11 = sub_4184F4(v2, a2, *(_DWORD *)(v10 + 4504));
v28 = v9;
if ( v9 <= v11 )
v28 = v11;
}
v12 = v2[2];
if ( v12 )
{
if ( !*(_BYTE *)(v12 + 580) )
{
v13 = sub_40E934((int)v2, v3, 122, 0);
v14 = v13;
if ( v13 )
{
sub_44D0D0(*(_DWORD *)(v13 + 4));
if ( v15 )
{
sub_40CBD6(*(_DWORD *)(v14 + 4));
if ( v16 )
{
if ( *(_DWORD *)(v16 + 48) == a2 )
{
v17 = *(_DWORD *)(v16 + 240);
if ( v17 > 0 && v17 < 101 )
v28 = v28 * (100 - v17) / 100;
}
}
}
}
}
}
v18 = v2[2];
v19 = 0;
if ( v18 && !*(_BYTE *)(v18 + 580) )
{
v20 = 0;
do
{
if ( sub_40CC50((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4), v20) )
{
v21 = (_DWORD *)sub_40CC50((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4), v20);
if ( !sub_5ECCC0(v21) )
{
v22 = (_DWORD *)sub_40CC50((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 4), v20);
v23 = sub_5E3210(v22, a2, v28, 1);
if ( v23 )
{
if ( v23 > v19 )
v19 = v23;
}
}
}
++v20;
}
while ( v20 < 22 );
if ( v19 )
v28 += v19;
if ( a2 == 35 )
{
if ( *(_DWORD *)(sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8)) + 136) )
{
v24 = sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8));
v25 = sub_5E3210(*(_DWORD **)(v24 + 136), 35, v28, 1);
v26 = sub_5EC220((_DWORD *)((char *)v2 + *(_DWORD *)(v2[1] + 4) + 8));
if ( sub_5ECC00(*(_DWORD **)(v26 + 136)) == 12 )
{
if ( v25 )
v28 += v25;
}
}
}
}
if ( v28 > 252 && sub_44A273(a2) )
v28 = 252;
return v28;
}
// 40CBD6: using guessed type double __stdcall sub_40CBD6(_DWORD);
// 44D0D0: using guessed type double __cdecl sub_44D0D0(_DWORD);
So, we hook it. Hooking is essentially rewriting the running code in memory at the location of this function to do a JMP (Jump/Detour) to our own custom function. At which point we access the Skill Value directly, using a global client pointer to the character's data, and return it: Code:
signed int CHooks::SkillCapCheck2_Detour(unsigned int a1) {
return ((CharData2 *)((*(CharData **)0x905D00)->ExtendedData->pCharData2))->Skill[a1];
}
__________________
| |||
|
|
||||
![]() |
|
|