BUG:FIXED spells(buffs) and TS spells not stacking correctly

Old bugs stored here for reference.
Locked
User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

BUG:FIXED spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Thu Mar 07, 2019 3:40 pm

so far none of the tradeskill buffs are stacking i created some test spells and when testing spell one stats go correctly bu when casting spell 2 spell 1 buffs disappear

also if i then cancel spell 2, spell 2 buffs reappear

please test and confirm

User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Sat Mar 09, 2019 7:03 am

i found the issue to apparently be in this code

Code: Select all

void Entity::CalculateSpellBonuses(ItemStatsValues* stats){
	if(stats){
		MutexList<BonusValues*>::iterator itr = bonus_list.begin();
		vector<BonusValues*> bv;
		//First check if we meet the requirement for each bonus
		while(itr.Next()) {
			int64 class1 = pow(2.0, (GetAdventureClass() - 1));
			int64 class2 = pow(2.0, (classes.GetSecondaryBaseClass(GetAdventureClass()) - 1));
			int64 class3 = pow(2.0, (classes.GetBaseClass(GetAdventureClass()) - 1));
			if (itr.value->class_req == 0 || (itr.value->class_req & class1) == class1 || (itr.value->class_req & class2) == class2 || (itr.value->class_req & class3) == class3)
				bv.push_back(itr.value);
		}
		//Sort the bonuses by spell id and luaspell
		BonusValues* bonus;
		map <int32, map<LuaSpell*, vector<BonusValues*> > > sort;
		for (int8 i = 0; i < bv.size(); i++){
			bonus = bv.at(i);
			sort[bonus->spell_id][bonus->luaspell].push_back(bonus);
		}
		//Now check for the highest tier of each spell id and apply those bonuses
		map<LuaSpell*, vector<BonusValues*> >::iterator tier_itr;
		map <int32, map<LuaSpell*, vector<BonusValues*> > >::iterator sort_itr;
		for (sort_itr = sort.begin(); sort_itr != sort.end(); sort_itr++){
			LuaSpell* key;
			sint8 highest_tier = -1;
			//Find the highest tier for this spell id
			for (tier_itr = sort_itr->second.begin(); tier_itr != sort_itr->second.end(); tier_itr++){
				LuaSpell* current_spell = tier_itr->first;
				sint8 current_tier ;
				if (current_spell && ((current_tier = current_spell->spell->GetSpellTier()) > highest_tier)) {
					highest_tier = current_tier;
					key = current_spell;
				}
			}
			//We've found the highest tier for this spell id, so add the bonuses
			vector<BonusValues*>* final_bonuses = &sort_itr->second[key];
			for (int8 i = 0; i < final_bonuses->size(); i++)
				world.AddBonuses(stats, final_bonuses->at(i)->type, final_bonuses->at(i)->value, this);
		}
	}
}
in the for statement right after this line
//Find the highest tier for this spell id
both spells i want to stack pass through here the first spell will see that it is the highest tier
but the second spell which is different except for the bonus will think it is not the highest tier because highest tier was already set by the first spell
please help me what is wrong with it

tyrbo
Team Member
Posts: 271
Joined: Thu Feb 18, 2016 12:33 pm

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by tyrbo » Sun Mar 10, 2019 12:37 am

I thought you said they weren't the same spell though?

The sort map that is being iterated there is a map of spell IDs to LuaSpells/bonuses, so you should only see that behavior if you're trying to use the same spell but with a different version (like Adept vs Expert).

User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Sun Mar 10, 2019 9:33 am

tyrbo wrote: Sun Mar 10, 2019 12:37 am I thought you said they weren't the same spell though?

The sort map that is being iterated there is a map of spell IDs to LuaSpells/bonuses, so you should only see that behavior if you're trying to use the same spell but with a different version (like Adept vs Expert).
exactly "should" but there is something wrong with it

Jabantiz
Lead Developer
Posts: 2912
Joined: Wed Jul 25, 2007 2:52 pm
Location: California

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by Jabantiz » Sun Mar 10, 2019 4:41 pm

I see a mutex container in there, those cause all sorts of odd behavior so the first thing I would suggest doing is to replace it with a standard container and a mutex to wrap it, no clue how often this list is used so that itself could end up being a large change.

User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Mon Mar 11, 2019 3:15 am

Jabantiz wrote: Sun Mar 10, 2019 4:41 pm I see a mutex container in there, those cause all sorts of odd behavior so the first thing I would suggest doing is to replace it with a standard container and a mutex to wrap it, no clue how often this list is used so that itself could end up being a large change.
perfect now i have to figure out what a mutex container is, and how to make it into a standard container, and then, how to wrap it in a mutex

do we have an expample of that in code elsewhere i could look at

User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

Re: BUG: spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Mon Mar 11, 2019 4:07 am

Yeah , I found the fix for this and will test and commit later
you will see from the earlier posted code that this line

Code: Select all

sort[bonus->spell_id][bonus->luaspell].push_back(bonus);
is referencing bonus->spell_id

but what i found when tracing the debug that spell_id was the same for everyspell passing through that line
so looking at the following code

Code: Select all

void Entity::AddSpellBonus(LuaSpell* spell, int16 type, sint32 value, int64 class_req){
	CheckSpellBonusRemoval(spell, type); 
	BonusValues* bonus = new BonusValues;
	bonus->spell_id = spell->spell->GetSpellID();
	bonus->luaspell = spell;
	bonus->type = type;
	bonus->value = value;
	bonus->class_req = class_req;
	bonus->tier = spell ? spell->spell->GetSpellTier() : 0;
	bonus_list.Add(bonus);
}
i found that this line was missing

Code: Select all

bonus->spell_id = spell->spell->GetSpellID();
once i added it in, all my tests of spell stacking started working

User avatar
Ememjr
Team Member
Posts: 975
Joined: Wed Mar 15, 2017 9:41 am
EQ2Emu Server: Perseverance

Re: BUG:FIXED spells(buffs) and TS spells not stacking correctly

Post by Ememjr » Mon Mar 11, 2019 7:34 am

I have committed a fix for this SVN it is included in SVN revision # 2798

Locked

Who is online

Users browsing this forum: No registered users and 0 guests