Go Back   EQEmulator Home > EQEmulator Forums > Support > Support::General Support

Support::General Support Post all topics here having to do with errors while trying to connect to an EQEMu server but not about the setup/running of the Server itself.

Reply
 
Thread Tools Display Modes
  #1  
Old 05-05-2008, 10:26 PM
Asphixiate
Sarnak
 
Join Date: Jan 2008
Posts: 62
Default Red Skill Caps

Searched the forums pretty thoroughly, this is the best post I could find that describes what I am experiencing..but no one replied to him. http://www.eqemulator.net/forums/sho...ght=skill+caps

So currently my server has a level cap of 60. Reading the skill_caps table, sk 1hs should skill to 260, however the client displays a red skill cap max of 225. The chat log keeps skilling up correctly past 225, but the players attack value does not increase accordingly, suggesting that anything past 225 is not taking effect. So it seems that it is more than a display issue.

Several skills are doing this. Weapon skills, casting schools, dodge, taunt, meditate, and probably more.

Server level cap is 60, and players may only achieve level 60, so nothing funny going on there.

Any idea why this is happening?
Reply With Quote
  #2  
Old 05-06-2008, 12:00 AM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

I have a post on another skills issue here:

http://www.eqemulator.net/forums/showthread.php?t=24808

Basically, my issue isn't the same as yours, but I figured they are sort of related lol. My problem is player skills not being displayed properly for characters over level 70.

I think I found somewhere in the source that sets caps for almost all skills. Though, I think they are supposed to be set in the skillcaps table now. Maybe that is what causes the skill caps in red problems. I will try to see if I can find that part of the source again maybe tomorrow and post it here if someone hasn't resolved your issue by then.

I am no coder, but most of the stuff seems simple enough to find if you read through the source. I just have no idea how to fix things yet lol.
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!
Reply With Quote
  #3  
Old 05-06-2008, 02:52 AM
Asphixiate
Sarnak
 
Join Date: Jan 2008
Posts: 62
Default

Yeah I read yours, just related to this other guy's more. It just seems weird, I'm not doing anything out of the ordinary, so I'm not sure why the skills aren't functioning properly, seems everyone using the PEQ DB would be seeing the same thing, is this not true?
Reply With Quote
  #4  
Old 05-06-2008, 09:50 AM
Andrew80k
Dragon
 
Join Date: Feb 2007
Posts: 659
Default

I'm seeing the same thing on my server. My Ranger's archery is continually skilling up and is in the 270's now, but if I pull up the skills window it has 236 in the skills window.
Reply With Quote
  #5  
Old 05-06-2008, 11:55 AM
jenco420
Banned
 
Join Date: Jan 2006
Location: /dev/null
Posts: 99
Default

maybe not related but, .. i can skill up off green mobs also /ponder
Reply With Quote
  #6  
Old 05-06-2008, 02:10 PM
Bulle
Hill Giant
 
Join Date: Jan 2008
Posts: 102
Default

There is something to remember : although the EQEmu server can implement whatever it wants, the EQ client is kinda frozen. It is the Titanium client, and we do not own the source code for it. The good thing is that not many things are hard-wired in the client, but still some are.

HP/Mana/ATK/AC calculations are re-done on the client. It means the server and the client's view may differ unless the server code computes those values as the client does.

In the end, what the player sees in the EQ client for those values does not matter (let's say it's psychological). The server uses the values it computes for combat etc. Of course over time the server formulas have been tuned to match what the client thinks (based on the stuff equipped, the level, the class etc). For example (chosen at random !), you could code your server to consider that all halflings suck and have AC 0 for mitigation purposes even in full armor, and the client would still show you your great 2500 AC. You would still eat damage like a level 1 wizard, the server decides there.

From my experience the skill caps work in the same way : the client has its own view of what the skill caps are. The server can have another view, and it is this one that matters most of the time... Except in those few situations when the client has control, like when trying to pick locks, hide, equip two weapons : if your class/race/level cannot dual wield in Live EQ you will not be able to dual wield whatever the skill caps you have put in your server DB. The EQ client does not ask the server whether the character can equip two weapons, it considers it "knows" it all from the start.

Hence your "red skills". The EQ client will only abide by the skill caps that Live EQ had back then, at the time of Titanium. You can hit as if your 2-H Slash is 300 no problem but the client will show you 200 if it thinks it is your normal cap.

If someone could deny this I would be very happy, more freedom to us, but that is my experience with the Emu. A few things are hard-coded by the client, you have to live with them.
Reply With Quote
  #7  
Old 05-06-2008, 07:15 PM
Asphixiate
Sarnak
 
Join Date: Jan 2008
Posts: 62
Default

Excellent explanation Bulle, thank you. If that is indeed true, skill caps are working, just not displaying properly, so I can deal with that.
Reply With Quote
  #8  
Old 05-06-2008, 09:55 PM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

Ya, skill caps all seem to work properly server side. They just don't display right. You can use the #showstats command to see your AC going up when you defense skills over cap.

One thing I figured I would mention is that in the source, it looks like there are settings for max skills. I don't know if that is just old code that isn't used anymore since the skills table is where it is supposed to be set now. But, if you look at the zone/maxskill.h file in the source, you can see code that seems to be setting the max skills:

Code:
int16 Mob::MaxSkill_weapon(int16 skillid, int16 class_, int16 level) const{
	if (skillid > HIGHEST_SKILL)
		return 0;
  int16 r_value = 0;
  switch(skillid) {
    case _1H_BLUNT:
    case _2H_BLUNT:
    case PIERCING:
    case HAND_TO_HAND:
    case _1H_SLASHING:
    case _2H_SLASHING:{
    switch (class_) {
        // Pure melee classes
        case WARRIOR: case WARRIORGM:{
              r_value = 5 + (level*5);
              if ( level < 51 && r_value > 200)
                  r_value = 200;
              if ( level > 50 && r_value > 250 )
                  r_value = 250;
                switch (skillid) {
                  case PIERCING:{
                    if ( r_value > 240 )
                      r_value = 240;
                    break;
                  }
                  case HAND_TO_HAND:{
                    if ( r_value > 100 )
                      r_value = 100;
                    break;
                  }
                  default: break;
                }
              break;
        }
If this code is still used, I wonder if it might conflict with the skills table information. That is my best guess if the issue isn't client side.
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!
Reply With Quote
  #9  
Old 05-07-2008, 02:47 AM
Bulle
Hill Giant
 
Join Date: Jan 2008
Posts: 102
Default

A quick grep showed this header file is not included in any other file anymore. Which means it is not used during compilation, ie everything in it is ignored in the current Emu. I guess it has been left there for reference purpose, or just because it has been forgotten. Or may be a dev is dearly attached to it and cannot get to the point of deleting it
Reply With Quote
  #10  
Old 05-07-2008, 02:53 AM
Bulle
Hill Giant
 
Join Date: Jan 2008
Posts: 102
Default

Funny thing is : client.h also declares MaxSkill_weapon but it is used nowhere either. Probably some left-over code too.

The current method used for getting the max skill is (tada !) : MaxSkill

Code:
int16 Client::MaxSkill(SkillType skillid, int16 class_, int16 level) const {
	return(database.GetSkillCap(class_, skillid, level));
}
Reply With Quote
  #11  
Old 10-01-2009, 11:31 AM
Pyre
Fire Beetle
 
Join Date: Nov 2006
Posts: 3
Default

Sorry for the thread necro, but I'm getting strange results and am having trouble following this.

I found Client::MaxSkill, and it eventually inherits from the GetSkillCap function in common/database.cpp.

Code:
int8 Database::GetSkillCap(int8 skillid, int8 in_race, int8 in_class, int16 in_level)
{
	int8 skill_level = 0, skill_formula = 0;
	int16 base_cap = 0, skill_cap = 0, skill_cap2 = 0, skill_cap3 = 0;
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	int32	affected_rows = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;
	//Fetch the data from DB.
	if (RunQuery(query, MakeAnyLenString(&query, "SELECT level, formula, pre50cap, post50cap, post60cap from skillcaps where skill = %i && class = %i", skillid, in_class), errbuf, &result, &affected_rows))
	{
		if (affected_rows != 0)
		{
			row = mysql_fetch_row(result);
			skill_level = atoi(row[0]);
			skill_formula = atoi(row[1]);
			skill_cap = atoi(row[2]);
			if (atoi(row[3]) > skill_cap)
				skill_cap2 = (atoi(row[3])-skill_cap)/10; //Split the post-50 skill cap into difference between pre-50 cap and post-50 cap / 10 to determine amount of points per level.
			skill_cap3 = atoi(row[4]);
		}
		delete[] query;
		mysql_free_result(result);
	}

	int race_skill = GetRaceSkill(skillid,in_race);

	if (race_skill > 0 && (race_skill > skill_cap || skill_cap == 0 || in_level < skill_level))
		return race_skill;

	if (skill_cap == 0) //Can't train this skill at all.
		return 255; //Untrainable

	if (in_level < skill_level)
		return 254; //Untrained

	//Determine pre-51 level-based cap
	if (skill_formula > 0)
		base_cap = in_level*skill_formula+skill_formula;
	if (base_cap > skill_cap || skill_formula == 0)
		base_cap = skill_cap;
	//If post 50, add post 50 cap to base cap.
	if (in_level > 50 && skill_cap2 > 0)
		base_cap += skill_cap2*(in_level-50);
	//No cap should ever go above its post50cap
	if (skill_cap3 > 0 && base_cap > skill_cap3)
		base_cap = skill_cap3;
	//Base cap is now the max value at the person's level, return it!
	return base_cap;
}
The first thing I noticed is that the number of arguments is wrong. Is this overloaded somewhere else that I didn't find?

On the assumption that this is the actual function being used, this code shouldn't work. At least in the peq database I'm running (rev974), there is no skillcaps table. I see a skill_caps table, but it has a different field structure.

I have a bot in PoK doing testing on this, and the script code fragment looks like this:

Code:
if($text=~/skills/i) {
    quest::say("Very well, feel your skills increase!" );
    my $count;
    for ($count = 0; $count <= 74; $count++) {
      if($client->CanHaveSkill($count)) {
        quest::setskill($count,$client->MaxSkill($count));
      }
    }
  }
Am I looking at the wrong implementation of this function?
Reply With Quote
Reply


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 10:07 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3