Project 1999

Go Back   Project 1999 > Class Discussions > Tanks

Closed Thread
 
Thread Tools Display Modes
  #31  
Old 04-11-2019, 07:17 AM
DMN DMN is offline
Planar Protector

DMN's Avatar

Join Date: May 2016
Location: My own special hell
Posts: 1,919
Default

It's certainly possible on p99. Not so sure it's classic though. Reality is it was a long ass time ago and most people doing testing by the time velious came out would do it with the assumption of maxed str. Unfortunately, i can't find any classic period posts related to it. It all seems to be stuff several years after velious, after they monkeyed around with hate generation.
  #32  
Old 04-11-2019, 09:03 AM
Dillusional Dillusional is offline
Kobold


Join Date: Jun 2018
Posts: 113
Default

Quote:
Originally Posted by DMN [You must be logged in to view images. Log in or Register.]
It's certainly possible on p99. Not so sure it's classic though. Reality is it was a long ass time ago and most people doing testing by the time velious came out would do it with the assumption of maxed str. Unfortunately, i can't find any classic period posts related to it. It all seems to be stuff several years after velious, after they monkeyed around with hate generation.
someone linked me this awhile back

http://www.eqemulator.org/forums/showthread.php?t=39819
  #33  
Old 04-11-2019, 09:47 AM
Troxx Troxx is offline
Planar Protector

Troxx's Avatar

Join Date: Jun 2014
Location: Colorado
Posts: 2,296
Default

Part of the magic of Everquest when it was new was very few people knew the content, the quests, and the mechanics of the game. This is really evident when you dial back the clock and actually read (or remember) through the misinformation ... great example was the pervasive tall tale of a mythical leviathan living at the bottom of lake rathe. Most classic era posts were more misinformation than not. Thott (Afterlife) and a select few others were amongst the first to look under the hood and try to figure out the nuts and bolts.

While there have been shifts and changes over the years, the basic backbone mechanics have been pretty constant over time.

In this case, testing the hypothesis is very easy. It’s easy to assume that melee hate linearly correlates with damage done. Many still do, but we know that misses generate threat the same as hits and parsing that out is/was actually more challenging than strength.

The strength factor is really straightforward. Get 2 guys of the same class of the same level (assuming capped combat skills) with the same haste (or none at all) and the same no-proc weapon. Now buff the strength of one of them up and leave the other significantly lower.

As previously stated, if the bonus damage potential from higher strength generates more threat, the high strength character cannot possibly not eventually overtake the lower strength warrior. The gap between them from that point on would continue to grow.

Very simple test and one I do recommend you try out on your own.

Our understanding of melee threat is simply:
-ratio of weapon
-delay of weapon as it relates to frequency of damage bonus application
-haste and it’s impact on frequency of hate per swing
-double attack and dual wield rates
-misses = same threat as a hit
-minimum hit = same threat as a max
-attack/str increase functional damage output but not threat
__________________
60 War Bard Shm Dru Pal Mag Nec Mnk // 55 Clr
  #34  
Old 04-11-2019, 12:28 PM
Dillusional Dillusional is offline
Kobold


Join Date: Jun 2018
Posts: 113
Default

Quote:
Originally Posted by DMN [You must be logged in to view images. Log in or Register.]
Where is the proof of strength not increasing hate on a per swing basis? I beleive the hate was from some mathematical average of potential damage which should be higher with higher strength.

The current logic for eqemu generating white noise agroe is in this file I believe (in the Client::Attack function, which rogean has edited).

https://github.com/EQEmu/Server/blob...one/attack.cpp

I don't have any reason to believe this is different on p99 in the relevant places.

Lines 1434 through 1520 (specifically lines 1435 and 1479) show how white noise hate is fixed per swing as Weapon Damage + DmgBonus for melee classes.

There is a little bit of extra logic for modifying hate in the eqemu code if you are using a shield or the ExtraAttackOptions parameter has been set to do a higher percent or flat amount of damage. But I don't believe your strength effects the ExtraAttackOptions parameter. Also you get hate for "elemental damage" per swing in the emulator source, which i guess is some kind of gross thing weapons get on live.
Last edited by Dillusional; 04-11-2019 at 12:33 PM..
  #35  
Old 04-11-2019, 01:01 PM
Xaeophi Xaeophi is offline
Banned


Join Date: Oct 2012
Posts: 817
Default

Sorry if this bursts anyones bubble. I know some of you spent a lot of time writing out opinions but figured I'd chime in just to give a more straight forward way of explaining.

Str actually will effect hate generation due to the fact that your potential damage possible is what generates the threat which is why misses can still of course make a mob turn to you.
Strength is one of the modifiers which effect the damage you can do. If you are not capped and someone is capped, their modifier is going to be higher then yours which means more then likely they will have a potential to do more damage then you regardless if RNG rolls in your favor and for that fight you did more damage then them.. somehow.
Other factors come into play when determining hate generation (ex. delay, proximity, procs, lifetaps, yadda yadda) but after typing up what I have already I've become bored and am play league of legends now.
Oh.. and im im wrong on what i just stated. Just call me a big gunky and correct accordingly.
  #36  
Old 04-11-2019, 01:34 PM
Crede Crede is offline
Fire Giant


Join Date: Oct 2013
Posts: 797
Default

Quote:
Originally Posted by Xaeophi [You must be logged in to view images. Log in or Register.]
Sorry if this bursts anyones bubble. I know some of you spent a lot of time writing out opinions but figured I'd chime in just to give a more straight forward way of explaining.

Str actually will effect hate generation due to the fact that your potential damage possible is what generates the threat which is why misses can still of course make a mob turn to you.
Strength is one of the modifiers which effect the damage you can do. If you are not capped and someone is capped, their modifier is going to be higher then yours which means more then likely they will have a potential to do more damage then you regardless if RNG rolls in your favor and for that fight you did more damage then them.. somehow.
Other factors come into play when determining hate generation (ex. delay, proximity, procs, lifetaps, yadda yadda) but after typing up what I have already I've become bored and am play league of legends now.
Oh.. and im im wrong on what i just stated. Just call me a big gunky and correct accordingly.
Bro. You just said the same thing wallicker did in a much longer statement. Which was then disputed a bunch more times.

In b4 troxx comes back and restates everything he just said.
  #37  
Old 04-11-2019, 02:17 PM
Troxx Troxx is offline
Planar Protector

Troxx's Avatar

Join Date: Jun 2014
Location: Colorado
Posts: 2,296
Default

Quote:
Originally Posted by Xaeophi [You must be logged in to view images. Log in or Register.]
Sorry if this bursts anyones bubble. I know some of you spent a lot of time writing out opinions but figured I'd chime in just to give a more straight forward way of explaining.

Str actually will effect hate generation due to the fact that your potential damage possible is what generates the threat which is why misses can still of course make a mob turn to you.
Strength is one of the modifiers which effect the damage you can do. If you are not capped and someone is capped, their modifier is going to be higher then yours which means more then likely they will have a potential to do more damage then you regardless if RNG rolls in your favor and for that fight you did more damage then them.. somehow.
Other factors come into play when determining hate generation (ex. delay, proximity, procs, lifetaps, yadda yadda) but after typing up what I have already I've become bored and am play league of legends now.
Oh.. and im im wrong on what i just stated. Just call me a big gunky and correct accordingly.
You say it quite confidently, but is this subjectively how you feel or objectively how you have proven it to function? Honest question. If itís subjective/anecdotal I have already clearly spelled out how to test it. If you or anyone has objective data that points in a different I sincerely (no sarcasm) would love to see it.

Quote:
Originally Posted by Dillusional [You must be logged in to view images. Log in or Register.]
I don't have any reason to believe this is different on p99 in the relevant places.

Lines 1434 through 1520 (specifically lines 1435 and 1479) show how white noise hate is fixed per swing as Weapon Damage + DmgBonus for melee classes.
Precisely. This is how melee threat functioned on live. Trials I have run on this server indicate this is how p99 coding functions.

Quote:
Originally Posted by Crede [You must be logged in to view images. Log in or Register.]
In b4 troxx comes back and restates everything he just said.
Unfortunately some people have to hear the same thing a few times before it sinks in.
__________________
60 War Bard Shm Dru Pal Mag Nec Mnk // 55 Clr
  #38  
Old 04-11-2019, 02:37 PM
Wallicker Wallicker is offline
Fire Giant


Join Date: Nov 2018
Posts: 777
Default

Bro rogean even said yesterday str affects everything.
  #39  
Old 04-11-2019, 03:09 PM
Dillusional Dillusional is offline
Kobold


Join Date: Jun 2018
Posts: 113
Default

Here is the code i was talking about earlier since my link broke, i highlighted the relevant parts

Code:
bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool IsFromSpell, ExtraAttackOptions *opts)
{
	if (!other) {
		SetTarget(nullptr);
		Log(Logs::General, Logs::Error, "A null Mob object was passed to Client::Attack() for evaluation!");
		return false;
	}

	if (!GetTarget())
		SetTarget(other);

	Log(Logs::Detail, Logs::Combat, "Attacking %s with hand %d %s", other ? other->GetName() : "(nullptr)", Hand, bRiposte ? "(this is a riposte)" : "");

	//SetAttackTimer();
	if (
		(IsCasting() && GetClass() != BARD && !IsFromSpell)
		|| other == nullptr
		|| ((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead))
		|| (GetHP() < 0)
		|| (!IsAttackAllowed(other))
		) {
		Log(Logs::Detail, Logs::Combat, "Attack canceled, invalid circumstances.");
		return false; // Only bards can attack while casting
	}

	if (DivineAura() && !GetGM()) {//cant attack while invulnerable unless your a gm
		Log(Logs::Detail, Logs::Combat, "Attack canceled, Divine Aura is in effect.");
		Message_StringID(MT_DefaultText, DIVINE_AURA_NO_ATK);	//You can't attack while invulnerable!
		return false;
	}

	if (GetFeigned())
		return false; // Rogean: How can you attack while feigned? Moved up from Aggro Code.

	EQEmu::ItemInstance* weapon = nullptr;
	if (Hand == EQEmu::invslot::slotSecondary) {	// Kaiyodo - Pick weapon from the attacking hand
		weapon = GetInv().GetItem(EQEmu::invslot::slotSecondary);
		OffHandAtk(true);
	}
	else {
		weapon = GetInv().GetItem(EQEmu::invslot::slotPrimary);
		OffHandAtk(false);
	}

	if (weapon != nullptr) {
		if (!weapon->IsWeapon()) {
			Log(Logs::Detail, Logs::Combat, "Attack canceled, Item %s (%d) is not a weapon.", weapon->GetItem()->Name, weapon->GetID());
			return(false);
		}
		Log(Logs::Detail, Logs::Combat, "Attacking with weapon: %s (%d)", weapon->GetItem()->Name, weapon->GetID());
	}
	else {
		Log(Logs::Detail, Logs::Combat, "Attacking without a weapon.");
	}

	DamageHitInfo my_hit;
	// calculate attack_skill and skillinuse depending on hand and weapon
	// also send Packet to near clients
	my_hit.skill = AttackAnimation(Hand, weapon);
	Log(Logs::Detail, Logs::Combat, "Attacking with %s in slot %d using skill %d", weapon ? weapon->GetItem()->Name : "Fist", Hand, my_hit.skill);

	// Now figure out damage
	my_hit.damage_done = 1;
	my_hit.min_damage = 0;
	uint8 mylevel = GetLevel() ? GetLevel() : 1;
	uint32 hate = 0;
	if (weapon)
		hate = (weapon->GetItem()->Damage + weapon->GetItem()->ElemDmgAmt);

	my_hit.base_damage = GetWeaponDamage(other, weapon, &hate);
	if (hate == 0 && my_hit.base_damage > 1)
		hate = my_hit.base_damage;

	//if weapon damage > 0 then we know we can hit the target with this weapon
	//otherwise we cannot and we set the damage to -5 later on
	if (my_hit.base_damage > 0) {
		// if we revamp this function be more general, we will have to make sure this isn't
		// executed for anything BUT normal melee damage weapons from auto attack
		if (Hand == EQEmu::invslot::slotPrimary || Hand == EQEmu::invslot::slotSecondary)
			my_hit.base_damage = DoDamageCaps(my_hit.base_damage);
		auto shield_inc = spellbonuses.ShieldEquipDmgMod + itembonuses.ShieldEquipDmgMod + aabonuses.ShieldEquipDmgMod;
		if (shield_inc > 0 && HasShieldEquiped() && Hand == EQEmu::invslot::slotPrimary) {
			my_hit.base_damage = my_hit.base_damage * (100 + shield_inc) / 100;
			hate = hate * (100 + shield_inc) / 100;
		}

		CheckIncreaseSkill(my_hit.skill, other, -15);
		CheckIncreaseSkill(EQEmu::skills::SkillOffense, other, -15);

		// ***************************************************************
		// *** Calculate the damage bonus, if applicable, for this hit ***
		// ***************************************************************

#ifndef EQEMU_NO_WEAPON_DAMAGE_BONUS

		// If you include the preprocessor directive "#define EQEMU_NO_WEAPON_DAMAGE_BONUS", that indicates that you do not
		// want damage bonuses added to weapon damage at all. This feature was requested by ChaosSlayer on the EQEmu Forums.
		//
		// This is not recommended for normal usage, as the damage bonus represents a non-trivial component of the DPS output
		// of weapons wielded by higher-level melee characters (especially for two-handed weapons).

		int ucDamageBonus = 0;

		if (Hand == EQEmu::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass())
		{
			// Damage bonuses apply only to hits from the main hand (Hand == MainPrimary) by characters level 28 and above
			// who belong to a melee class. If we're here, then all of these conditions apply.

			ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr);

			my_hit.min_damage = ucDamageBonus;
			hate += ucDamageBonus;
		}
#endif
		//Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon.
		if (Hand == EQEmu::invslot::slotSecondary) {
			if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc) {

				ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr, true);

				my_hit.min_damage = ucDamageBonus;
				hate += ucDamageBonus;
			}
		}

		// damage = mod_client_damage(damage, skillinuse, Hand, weapon, other);

		Log(Logs::Detail, Logs::Combat, "Damage calculated: base %d min damage %d skill %d", my_hit.base_damage, my_hit.min_damage, my_hit.skill);

		int hit_chance_bonus = 0;
		my_hit.offense = offense(my_hit.skill); // we need this a few times
		my_hit.hand = Hand;

		if (opts) {
			my_hit.base_damage *= opts->damage_percent;
			my_hit.base_damage += opts->damage_flat;
			hate *= opts->hate_percent;
			hate += opts->hate_flat;
			hit_chance_bonus += opts->hit_chance;
		}

		my_hit.tohit = GetTotalToHit(my_hit.skill, hit_chance_bonus);

		DoAttack(other, my_hit, opts);
	}
	else {
		my_hit.damage_done = DMG_INVULNERABLE;
	}

	// Hate Generation is on a per swing basis, regardless of a hit, miss, or block, its always the same.
	// If we are this far, this means we are atleast making a swing.

	other->AddToHateList(this, hate);


I strongly suspect that "opts->hate_percent" and "opts->hate_flat" are usually set to 1.0 and 0 respectively

they would have to be modified before this function is called based on your strength for what people to be saying about strength to be true on eqemu. I expect p99 to use the relevant logic, rogean even modded that function at one point.

I'll go back and sanity check this later. Maybe I'm making the wrong assumptions about what that ExtraAttackOptions structure is for? I don't think it's for passing information about how strength is going to modify minimum damage but maybe....I'll sanity check that later.... But white noise agroe looks like it works like people have always said it works at first glance.
Last edited by Dillusional; 04-11-2019 at 03:26 PM..
  #40  
Old 04-11-2019, 03:47 PM
Pringles Pringles is offline
Planar Protector

Pringles's Avatar

Join Date: Nov 2010
Location: Retired player, Norrath
Posts: 1,928
Default

When a warrior falls below 40% hp.... ExtraAttackOptions
Closed Thread

Thread Tools
Display Modes

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 09:55 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 - 2020, Jelsoft Enterprises Ltd.