1325 | | QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,amount,maxduration,remaintime,remaincharges FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber()); |
| 1330 | QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber()); |
1335 | | int32 damage = (int32)fields[3].GetUInt32(); |
1336 | | int32 maxduration = (int32)fields[4].GetUInt32(); |
1337 | | int32 remaintime = (int32)fields[5].GetUInt32(); |
1338 | | int32 remaincharges = (int32)fields[6].GetUInt32(); |
| 1340 | uint32 stackcount= fields[3].GetUInt32(); |
| 1341 | int32 damage = (int32)fields[4].GetUInt32(); |
| 1342 | int32 maxduration = (int32)fields[5].GetUInt32(); |
| 1343 | int32 remaintime = (int32)fields[6].GetUInt32(); |
| 1344 | int32 remaincharges = (int32)fields[7].GetUInt32(); |
1375 | | Aura* aura = CreateAura(spellproto, effindex, NULL, this, NULL); |
1376 | | |
1377 | | if(!damage) |
1378 | | damage = aura->GetModifier()->m_amount; |
1379 | | aura->SetLoadedState(caster_guid,damage,maxduration,remaintime,remaincharges); |
1380 | | AddAura(aura); |
| 1381 | for(uint32 i=0; i<stackcount; i++) |
| 1382 | { |
| 1383 | Aura* aura = CreateAura(spellproto, effindex, NULL, this, NULL); |
| 1384 | |
| 1385 | if(!damage) |
| 1386 | damage = aura->GetModifier()->m_amount; |
| 1387 | aura->SetLoadedState(caster_guid,damage,maxduration,remaintime,remaincharges); |
| 1388 | AddAura(aura); |
| 1389 | } |
1393 | | for(AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) |
1394 | | { |
1395 | | // skip all auras from spell that apply at cast SPELL_AURA_MOD_SHAPESHIFT or pet area auras. |
1396 | | SpellEntry const *spellInfo = itr->second->GetSpellProto(); |
1397 | | uint8 i; |
1398 | | for (i = 0; i < 3; i++) |
1399 | | if (spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_STEALTH || |
1400 | | spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_OWNER || |
1401 | | spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PET ) |
| 1402 | if (auras.empty()) |
| 1403 | return; |
| 1404 | |
| 1405 | spellEffectPair lastEffectPair = auras.begin()->first; |
| 1406 | uint32 stackCounter = 1; |
| 1407 | |
| 1408 | for(AuraMap::const_iterator itr = auras.begin(); ; ++itr) |
| 1409 | { |
| 1410 | if(itr == auras.end() || lastEffectPair != itr->first) |
| 1411 | { |
| 1412 | AuraMap::const_iterator itr2 = itr; |
| 1413 | // save previous spellEffectPair to db |
| 1414 | itr2--; |
| 1415 | SpellEntry const *spellInfo = itr2->second->GetSpellProto(); |
| 1416 | /// do not save single target auras (unless they were cast by the player) |
| 1417 | if (!(itr2->second->GetCasterGUID() != GetGUID() && IsSingleTargetSpell(spellInfo))) |
| 1418 | { |
| 1419 | if(!itr2->second->IsPassive()) |
| 1420 | { |
| 1421 | // skip all auras from spell that apply at cast SPELL_AURA_MOD_SHAPESHIFT or pet area auras. |
| 1422 | uint8 i; |
| 1423 | for (i = 0; i < 3; i++) |
| 1424 | if (spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_STEALTH || |
| 1425 | spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_OWNER || |
| 1426 | spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PET ) |
| 1427 | break; |
| 1428 | |
| 1429 | if (i == 3) |
| 1430 | { |
| 1431 | CharacterDatabase.PExecute("INSERT INTO pet_aura (guid,caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges) " |
| 1432 | "VALUES ('%u', '" I64FMTD "', '%u', '%u', '%u', '%d', '%d', '%d', '%d')", |
| 1433 | m_charmInfo->GetPetNumber(), itr2->second->GetCasterGUID(),(uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), stackCounter, itr2->second->GetModifier()->m_amount,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->m_procCharges)); |
| 1434 | } |
| 1435 | } |
| 1436 | } |
| 1437 | if(itr == auras.end()) |
1403 | | |
1404 | | if (i != 3) |
1405 | | continue; |
1406 | | |
1407 | | if(itr->second->IsPassive()) |
1408 | | continue; |
1409 | | |
1410 | | /// do not save single target auras (unless they were cast by the player) |
1411 | | if (itr->second->GetCasterGUID() != GetGUID() && IsSingleTargetSpell(spellInfo)) |
1412 | | continue; |
1413 | | |
1414 | | CharacterDatabase.PExecute("INSERT INTO pet_aura (guid,caster_guid,spell,effect_index,amount,maxduration,remaintime,remaincharges) " |
1415 | | "VALUES ('%u', '" I64FMTD "', '%u', '%u', '%d', '%d', '%d', '%d')", |
1416 | | m_charmInfo->GetPetNumber(), itr->second->GetCasterGUID(),(uint32)(*itr).second->GetId(), (uint32)(*itr).second->GetEffIndex(),(*itr).second->GetModifier()->m_amount,int((*itr).second->GetAuraMaxDuration()),int((*itr).second->GetAuraDuration()),int((*itr).second->m_procCharges)); |
| 1439 | } |
| 1440 | |
| 1441 | if (lastEffectPair == itr->first) |
| 1442 | stackCounter++; |
| 1443 | else |
| 1444 | { |
| 1445 | lastEffectPair = itr->first; |
| 1446 | stackCounter = 1; |
| 1447 | } |