mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 19:37:03 +00:00
[10332] Save cast item guid for auras also.
This must fix another way duplicate aura adding to DB error. It also prevent wrong stacking work for weapon equip bufs in cases when its allowed for both wepoan indepndently apply.
This commit is contained in:
parent
59e672f1bc
commit
779e40d5ff
11 changed files with 68 additions and 29 deletions
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
DROP TABLE IF EXISTS `character_db_version`;
|
||||
CREATE TABLE `character_db_version` (
|
||||
`required_10312_02_characters_pet_aura` bit(1) default NULL
|
||||
`required_10332_02_characters_pet_aura` bit(1) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
||||
|
||||
--
|
||||
|
|
@ -370,6 +370,7 @@ DROP TABLE IF EXISTS `character_aura`;
|
|||
CREATE TABLE `character_aura` (
|
||||
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
|
||||
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
|
||||
`item_guid` int(11) unsigned NOT NULL default '0',
|
||||
`spell` int(11) unsigned NOT NULL default '0',
|
||||
`stackcount` int(11) NOT NULL default '1',
|
||||
`remaincharges` int(11) NOT NULL default '0',
|
||||
|
|
@ -383,7 +384,7 @@ CREATE TABLE `character_aura` (
|
|||
`remaintime1` INT(11) NOT NULL DEFAULT '0',
|
||||
`remaintime2` INT(11) NOT NULL DEFAULT '0',
|
||||
`effIndexMask` INT(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`guid`,`caster_guid`,`spell`)
|
||||
PRIMARY KEY (`guid`,`caster_guid`,`item_guid`,`spell`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
|
||||
|
||||
--
|
||||
|
|
@ -1455,6 +1456,7 @@ DROP TABLE IF EXISTS `pet_aura`;
|
|||
CREATE TABLE `pet_aura` (
|
||||
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
|
||||
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
|
||||
`item_guid` int(11) unsigned NOT NULL default '0',
|
||||
`spell` int(11) unsigned NOT NULL default '0',
|
||||
`stackcount` int(11) NOT NULL default '1',
|
||||
`remaincharges` int(11) NOT NULL default '0',
|
||||
|
|
@ -1468,7 +1470,7 @@ CREATE TABLE `pet_aura` (
|
|||
`remaintime1` INT(11) NOT NULL DEFAULT '0',
|
||||
`remaintime2` INT(11) NOT NULL DEFAULT '0',
|
||||
`effIndexMask` INT(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`guid`,`caster_guid`,`spell`)
|
||||
PRIMARY KEY (`guid`,`caster_guid`,`item_guid`,`spell`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Pet System';
|
||||
|
||||
--
|
||||
|
|
|
|||
7
sql/updates/10332_01_characters_character_aura.sql
Normal file
7
sql/updates/10332_01_characters_character_aura.sql
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
ALTER TABLE character_db_version CHANGE COLUMN required_10312_02_characters_pet_aura required_10332_01_characters_character_aura bit;
|
||||
|
||||
ALTER TABLE `character_aura`
|
||||
ADD COLUMN `item_guid` int(11) unsigned NOT NULL default '0' AFTER `caster_guid`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`guid`,`caster_guid`,`item_guid`,`spell`);
|
||||
|
||||
7
sql/updates/10332_02_characters_pet_aura.sql
Normal file
7
sql/updates/10332_02_characters_pet_aura.sql
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
ALTER TABLE character_db_version CHANGE COLUMN required_10332_01_characters_character_aura required_10332_02_characters_pet_aura bit;
|
||||
|
||||
ALTER TABLE `pet_aura`
|
||||
ADD COLUMN `item_guid` int(11) unsigned NOT NULL default '0' AFTER `caster_guid`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`guid`,`caster_guid`,`item_guid`,`spell`);
|
||||
|
||||
|
|
@ -72,6 +72,8 @@ pkgdata_DATA = \
|
|||
10323_02_mangos_command.sql \
|
||||
10331_01_mangos_mangos_string.sql \
|
||||
10331_02_mangos_command.sql \
|
||||
10332_01_characters_character_aura.sql \
|
||||
10332_02_characters_pet_aura.sql \
|
||||
README
|
||||
|
||||
## Additional files to include when running 'make dist'
|
||||
|
|
@ -124,4 +126,6 @@ EXTRA_DIST = \
|
|||
10323_02_mangos_command.sql \
|
||||
10331_01_mangos_mangos_string.sql \
|
||||
10331_02_mangos_command.sql \
|
||||
10332_01_characters_character_aura.sql \
|
||||
10332_02_characters_pet_aura.sql \
|
||||
README
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ bool LoginQueryHolder::Initialize()
|
|||
"health, power1, power2, power3, power4, power5, power6, power7, specCount, activeSpec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars FROM characters WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGROUP, "SELECT groupId FROM group_member WHERE memberGuid ='%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADBOUNDINSTANCES, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADAURAS, "SELECT caster_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM character_aura WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADAURAS, "SELECT caster_guid,item_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM character_aura WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
|
|
|
|||
|
|
@ -1144,7 +1144,7 @@ void Pet::_LoadAuras(uint32 timediff)
|
|||
{
|
||||
RemoveAllAuras();
|
||||
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber());
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,item_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber());
|
||||
|
||||
if(result)
|
||||
{
|
||||
|
|
@ -1152,19 +1152,20 @@ void Pet::_LoadAuras(uint32 timediff)
|
|||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint64 caster_guid = fields[0].GetUInt64();
|
||||
uint32 spellid = fields[1].GetUInt32();
|
||||
uint32 stackcount= fields[2].GetUInt32();
|
||||
int32 remaincharges = (int32)fields[3].GetUInt32();
|
||||
uint32 item_lowguid = fields[1].GetUInt32();
|
||||
uint32 spellid = fields[2].GetUInt32();
|
||||
uint32 stackcount= fields[3].GetUInt32();
|
||||
int32 remaincharges = (int32)fields[4].GetUInt32();
|
||||
int32 damage[MAX_EFFECT_INDEX];
|
||||
int32 maxduration[MAX_EFFECT_INDEX];
|
||||
int32 remaintime[MAX_EFFECT_INDEX];
|
||||
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
|
||||
{
|
||||
damage[i] = (int32)fields[i+4].GetUInt32();
|
||||
maxduration[i] = (int32)fields[i+7].GetUInt32();
|
||||
remaintime[i] = (int32)fields[i+10].GetUInt32();
|
||||
damage[i] = (int32)fields[i+5].GetUInt32();
|
||||
maxduration[i] = (int32)fields[i+8].GetUInt32();
|
||||
remaintime[i] = (int32)fields[i+11].GetUInt32();
|
||||
}
|
||||
uint32 effIndexMask = (int32)fields[13].GetUInt32();
|
||||
uint32 effIndexMask = (int32)fields[14].GetUInt32();
|
||||
|
||||
SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid);
|
||||
if(!spellproto)
|
||||
|
|
@ -1213,7 +1214,7 @@ void Pet::_LoadAuras(uint32 timediff)
|
|||
|
||||
if (!holder->IsEmptyHolder())
|
||||
{
|
||||
holder->SetLoadedState(caster_guid, stackcount, remaincharges);
|
||||
holder->SetLoadedState(caster_guid, item_lowguid ? MAKE_NEW_GUID(HIGHGUID_ITEM, 0, item_lowguid) : 0, stackcount, remaincharges);
|
||||
AddSpellAuraHolder(holder);
|
||||
}
|
||||
else
|
||||
|
|
@ -1282,7 +1283,13 @@ void Pet::_SaveAuras()
|
|||
if (!effIndexMask)
|
||||
continue;
|
||||
|
||||
CharacterDatabase.PExecute("INSERT INTO pet_aura (guid, caster_guid, spell, stackcount, remaincharges, basepoints0, basepoints1, basepoints2, maxduration0, maxduration1, maxduration2, remaintime0, remaintime1, remaintime2, effIndexMask) VALUES ('%u', '" UI64FMTD "', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')", m_charmInfo->GetPetNumber(), holder->GetCasterGUID(), holder->GetId(), holder->GetStackAmount(), holder->GetAuraCharges(), damage[EFFECT_INDEX_0], damage[EFFECT_INDEX_1], damage[EFFECT_INDEX_2], maxduration[EFFECT_INDEX_0], maxduration[EFFECT_INDEX_1], maxduration[EFFECT_INDEX_2], remaintime[EFFECT_INDEX_0], remaintime[EFFECT_INDEX_1], remaintime[EFFECT_INDEX_2], effIndexMask);
|
||||
CharacterDatabase.PExecute("INSERT INTO pet_aura (guid, caster_guid, item_guid, spell, stackcount, remaincharges, basepoints0, basepoints1, basepoints2, maxduration0, maxduration1, maxduration2, remaintime0, remaintime1, remaintime2, effIndexMask) VALUES "
|
||||
"('%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')",
|
||||
m_charmInfo->GetPetNumber(), holder->GetCasterGUID(), GUID_LOPART(holder->GetCastItemGUID()), holder->GetId(), holder->GetStackAmount(), holder->GetAuraCharges(),
|
||||
damage[EFFECT_INDEX_0], damage[EFFECT_INDEX_1], damage[EFFECT_INDEX_2],
|
||||
maxduration[EFFECT_INDEX_0], maxduration[EFFECT_INDEX_1], maxduration[EFFECT_INDEX_2],
|
||||
remaintime[EFFECT_INDEX_0], remaintime[EFFECT_INDEX_1], remaintime[EFFECT_INDEX_2],
|
||||
effIndexMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15661,9 +15661,9 @@ void Player::_LoadActions(QueryResult *result)
|
|||
|
||||
void Player::_LoadAuras(QueryResult *result, uint32 timediff)
|
||||
{
|
||||
//RemoveAllAuras(); -- some spells casted before aura load, for example in LoadSkills, aura list explcitly cleaned early
|
||||
//RemoveAllAuras(); -- some spells casted before aura load, for example in LoadSkills, aura list explicitly cleaned early
|
||||
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM character_aura WHERE guid = '%u'",GetGUIDLow());
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,item_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,maxduration0,maxduration1,maxduration2,remaintime0,remaintime1,remaintime2,effIndexMask FROM character_aura WHERE guid = '%u'",GetGUIDLow());
|
||||
|
||||
if(result)
|
||||
{
|
||||
|
|
@ -15671,19 +15671,20 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
|
|||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint64 caster_guid = fields[0].GetUInt64();
|
||||
uint32 spellid = fields[1].GetUInt32();
|
||||
uint32 stackcount = fields[2].GetUInt32();
|
||||
int32 remaincharges = (int32)fields[3].GetUInt32();
|
||||
uint32 item_lowguid = fields[1].GetUInt64();
|
||||
uint32 spellid = fields[2].GetUInt32();
|
||||
uint32 stackcount = fields[3].GetUInt32();
|
||||
int32 remaincharges = (int32)fields[4].GetUInt32();
|
||||
int32 damage[MAX_EFFECT_INDEX];
|
||||
int32 maxduration[MAX_EFFECT_INDEX];
|
||||
int32 remaintime[MAX_EFFECT_INDEX];
|
||||
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
|
||||
{
|
||||
damage[i] = (int32)fields[i+4].GetUInt32();
|
||||
maxduration[i] = (int32)fields[i+7].GetUInt32();
|
||||
remaintime[i] = (int32)fields[i+10].GetUInt32();
|
||||
damage[i] = (int32)fields[i+5].GetUInt32();
|
||||
maxduration[i] = (int32)fields[i+8].GetUInt32();
|
||||
remaintime[i] = (int32)fields[i+11].GetUInt32();
|
||||
}
|
||||
uint32 effIndexMask = (int32)fields[13].GetUInt32();
|
||||
uint32 effIndexMask = (int32)fields[14].GetUInt32();
|
||||
|
||||
SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid);
|
||||
if(!spellproto)
|
||||
|
|
@ -15732,7 +15733,7 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
|
|||
if (caster_guid != GetGUID() && holder->IsSingleTarget())
|
||||
holder->SetIsSingleTarget(false);
|
||||
|
||||
holder->SetLoadedState(caster_guid, stackcount, remaincharges);
|
||||
holder->SetLoadedState(caster_guid, item_lowguid ? MAKE_NEW_GUID(item_lowguid, 0, HIGHGUID_ITEM) : 0, stackcount, remaincharges);
|
||||
AddSpellAuraHolder(holder);
|
||||
DETAIL_LOG("Added auras from spellid %u", spellproto->Id);
|
||||
}
|
||||
|
|
@ -16979,7 +16980,13 @@ void Player::_SaveAuras()
|
|||
if (!effIndexMask)
|
||||
continue;
|
||||
|
||||
CharacterDatabase.PExecute("INSERT INTO character_aura (guid, caster_guid, spell, stackcount, remaincharges, basepoints0, basepoints1, basepoints2, maxduration0, maxduration1, maxduration2, remaintime0, remaintime1, remaintime2, effIndexMask) VALUES ('%u', '" UI64FMTD "', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')", GetGUIDLow(), holder->GetCasterGUID(), holder->GetId(), holder->GetStackAmount(), holder->GetAuraCharges(), damage[EFFECT_INDEX_0], damage[EFFECT_INDEX_1], damage[EFFECT_INDEX_2], maxduration[EFFECT_INDEX_0], maxduration[EFFECT_INDEX_1], maxduration[EFFECT_INDEX_2], remaintime[EFFECT_INDEX_0], remaintime[EFFECT_INDEX_1], remaintime[EFFECT_INDEX_2], effIndexMask);
|
||||
CharacterDatabase.PExecute("INSERT INTO character_aura (guid, caster_guid, item_guid, spell, stackcount, remaincharges, basepoints0, basepoints1, basepoints2, maxduration0, maxduration1, maxduration2, remaintime0, remaintime1, remaintime2, effIndexMask) VALUES "
|
||||
"('%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')",
|
||||
GetGUIDLow(), holder->GetCasterGUID(), GUID_LOPART(holder->GetCastItemGUID()), holder->GetId(), holder->GetStackAmount(), holder->GetAuraCharges(),
|
||||
damage[EFFECT_INDEX_0], damage[EFFECT_INDEX_1], damage[EFFECT_INDEX_2],
|
||||
maxduration[EFFECT_INDEX_0], maxduration[EFFECT_INDEX_1], maxduration[EFFECT_INDEX_2],
|
||||
remaintime[EFFECT_INDEX_0], remaintime[EFFECT_INDEX_1], remaintime[EFFECT_INDEX_2],
|
||||
effIndexMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8092,6 +8092,10 @@ Unit* SpellAuraHolder::GetCaster() const
|
|||
|
||||
bool SpellAuraHolder::IsWeaponBuffCoexistableWith(SpellAuraHolder* ref)
|
||||
{
|
||||
// only item casted spells
|
||||
if (!GetCastItemGUID())
|
||||
return false;
|
||||
|
||||
// Exclude Debuffs
|
||||
if (!IsPositive())
|
||||
return false;
|
||||
|
|
@ -8118,7 +8122,7 @@ bool SpellAuraHolder::IsWeaponBuffCoexistableWith(SpellAuraHolder* ref)
|
|||
return false;
|
||||
|
||||
// form different weapons
|
||||
return ref->GetCastItemGUID() != GetCastItemGUID();
|
||||
return ref->GetCastItemGUID() && ref->GetCastItemGUID() != GetCastItemGUID();
|
||||
}
|
||||
|
||||
bool SpellAuraHolder::IsNeedVisibleSlot(Unit const* caster) const
|
||||
|
|
|
|||
|
|
@ -142,9 +142,10 @@ class MANGOS_DLL_SPEC SpellAuraHolder
|
|||
|
||||
void SetVisibleAura(bool remove) { m_target->SetVisibleAura(m_auraSlot, remove ? 0 : GetId()); }
|
||||
void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
|
||||
void SetLoadedState(uint64 casterGUID, int32 stackAmount, int32 charges)
|
||||
void SetLoadedState(uint64 casterGUID, uint64 itemGUID, int32 stackAmount, int32 charges)
|
||||
{
|
||||
m_caster_guid = casterGUID;
|
||||
m_castItemGuid = itemGUID;
|
||||
m_procCharges = charges;
|
||||
m_stackAmount = stackAmount;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "10331"
|
||||
#define REVISION_NR "10332"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#ifndef __REVISION_SQL_H__
|
||||
#define __REVISION_SQL_H__
|
||||
#define REVISION_DB_CHARACTERS "required_10312_02_characters_pet_aura"
|
||||
#define REVISION_DB_CHARACTERS "required_10332_02_characters_pet_aura"
|
||||
#define REVISION_DB_MANGOS "required_10331_02_mangos_command"
|
||||
#define REVISION_DB_REALMD "required_10008_01_realmd_realmd_db_version"
|
||||
#endif // __REVISION_SQL_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue