Project 1999

Go Back   Project 1999 > Blue Community > Blue Server Chat

Closed Thread
 
Thread Tools Display Modes
  #1  
Old 09-30-2019, 11:43 AM
Castamere Castamere is offline
Fire Giant


Join Date: Jul 2014
Posts: 522
Default

Quote:
Originally Posted by Deathrydar [You must be logged in to view images. Log in or Register.]
I don't believe anyone wants that, I know I don't. But if you're not happy with the server's intention that they made clear a decade ago, then it may be for the best.

/shrug
Agreed. These changes are new. We'll see how they settle in.
  #2  
Old 09-30-2019, 11:43 AM
Sporkotron Sporkotron is offline
Kobold


Join Date: Jan 2012
Posts: 115
Default

Quote:
Originally Posted by Castamere [You must be logged in to view images. Log in or Register.]
Thanks for the suggestion. I personally don't want to see people leave the server.
If the only way they’ll play is if classic changes are rolled back: I do.
  #3  
Old 09-30-2019, 11:43 AM
loramin loramin is offline
Planar Protector

loramin's Avatar

Join Date: Jul 2013
Posts: 10,471
Default

Quote:
Originally Posted by Sporkotron [You must be logged in to view images. Log in or Register.]
If the only way they’ll play is if classic changes are rolled back: I do.
For the record, while I'm too lazy to find the specific quote, Nilbog has said basically this.
__________________

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  
Old 09-30-2019, 11:44 AM
Castamere Castamere is offline
Fire Giant


Join Date: Jul 2014
Posts: 522
Default

Quote:
Originally Posted by Sporkotron [You must be logged in to view images. Log in or Register.]
If the only way they’ll play is if classic changes are rolled back: I do.
You want to see them leave the server, if they want to leave the server? I guess I agree
  #5  
Old 09-30-2019, 11:45 AM
Deathrydar Deathrydar is offline
Planar Protector


Join Date: Oct 2009
Posts: 1,673
Default

Quote:
Originally Posted by Sporkotron [You must be logged in to view images. Log in or Register.]
If the only way they’ll play is if classic changes are rolled back: I do.
You cannot entertain the demands of terrorists. Everything changes once you do that.
  #6  
Old 09-30-2019, 11:44 AM
Jimjam Jimjam is offline
Planar Protector


Join Date: Jul 2013
Posts: 12,717
Default

Quote:
Originally Posted by Castamere [You must be logged in to view images. Log in or Register.]
Thanks for the suggestion. I personally don't want to see people leave the server.
Me neither (okay, well maybe some of them), but if given the choice of people subverting the purpose of the project or those people leaving, then I'm afraid I am going to have to choose the integrity of the project.


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  
Old 09-30-2019, 12:00 PM
loramin loramin is offline
Planar Protector

loramin's Avatar

Join Date: Jul 2013
Posts: 10,471
Default

Quote:
Originally Posted by Jimjam [You must be logged in to view images. Log in or Register.]
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...
This seems like the elephant in the room.

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  
Old 09-30-2019, 11:35 AM
loramin loramin is offline
Planar Protector

loramin's Avatar

Join Date: Jul 2013
Posts: 10,471
Default

Quote:
Originally Posted by Sunderfury [You must be logged in to view images. Log in or Register.]
Previous pet window reversal was stated that it was allowed to stay on blue since it was same patch as custom UI and very close to velious, but hot bars were disabled due to being too far out of classic timeline.

Following this logic, I wouldn't hold your breath for it to stay on blue, too far out of timeline.
__________________

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  
Old 09-30-2019, 11:36 AM
Castamere Castamere is offline
Fire Giant


Join Date: Jul 2014
Posts: 522
Default

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  
Old 09-30-2019, 01:03 PM
Rogean Rogean is offline
¯\_(ツ)_/¯

Rogean's Avatar

Join Date: Oct 2009
Location: Massachusetts
Posts: 5,393
Default

Quote:
Originally Posted by Castamere [You must be logged in to view images. Log in or Register.]
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.
Frankly this argument annoys me. You guys underestimate the difficulty of client side changes. We don't have access to Client source code. We have very limited dissassembly skillsets, and occasionally we rely on pseudocode. Haynar is better than I am at finding specific memory addresses and offsets, and I'm somewhat decent at finding/following code paths for functions to hook and modify their arguments and/or return values. Secrets is better than both of us at anything related to dissassembly, but often too busy to help us.

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);
Now, the function I just listed above is a good example, because it handles the client's visual display of the values of skills in the skill window. In this function, it's handling a lot of processing on those values to check various caps based on class and skill ID, which it really should have no reason to do because we just want it to display what the server tells us it is.

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];
}
And this is actually one of the easier examples.
__________________
Sean "Rogean" Norton
Project 1999 Co-Manager

Project 1999 Setup Guide
Closed Thread


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 11:40 PM.


Everquest is a registered trademark of Daybreak Game Company LLC.
Project 1999 is not associated or affiliated in any way with Daybreak Game Company LLC.
Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.