mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Merge commit 'origin/master' into 310
This commit is contained in:
commit
21a38a42d8
10 changed files with 413 additions and 340 deletions
|
|
@ -78,8 +78,9 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
sLog.outErrorDb( "Table `achievement_criteria_data` have data for not supported criteria type (Entry: %u Type: %u), ignore.", criteria->ID, criteria->requiredType);
|
sLog.outErrorDb( "Table `achievement_criteria_data` have data for not supported criteria type (Entry: %u Type: %u), ignore.", criteria->ID, criteria->requiredType);
|
||||||
|
|
@ -861,6 +862,30 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
if(GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
|
if(GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
|
||||||
SetCriteriaProgress(achievementCriteria, 1);
|
SetCriteriaProgress(achievementCriteria, 1);
|
||||||
break;
|
break;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||||
|
{
|
||||||
|
// miscvalue1=loot_type (note: 0 = LOOT_CORSPE and then it ignored)
|
||||||
|
// miscvalue2=count of item loot
|
||||||
|
if (!miscvalue1 || !miscvalue2)
|
||||||
|
continue;
|
||||||
|
if (miscvalue1 != achievementCriteria->loot_type.lootType)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// zone specific
|
||||||
|
if(achievementCriteria->loot_type.lootTypeCount==1)
|
||||||
|
{
|
||||||
|
// those requirements couldn't be found in the dbc
|
||||||
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
|
if(!data)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!data->Meets(GetPlayer(),unit))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCriteriaProgress(achievementCriteria, miscvalue2, PROGRESS_ACCUMULATE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||||
// speedup for non-login case
|
// speedup for non-login case
|
||||||
if(miscvalue1 && achievementCriteria->own_item.itemID != miscvalue1)
|
if(miscvalue1 && achievementCriteria->own_item.itemID != miscvalue1)
|
||||||
|
|
@ -1142,7 +1167,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
|
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
|
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
|
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
|
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
|
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
|
||||||
break; // Not implemented yet :(
|
break; // Not implemented yet :(
|
||||||
|
|
@ -1232,6 +1256,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||||
return progress->counter >= achievementCriteria->cast_spell.castCount;
|
return progress->counter >= achievementCriteria->cast_spell.castCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
||||||
return progress->counter >= 1;
|
return progress->counter >= 1;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||||
|
return progress->counter >= achievementCriteria->loot_type.lootTypeCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||||
return progress->counter >= achievementCriteria->own_item.itemCount;
|
return progress->counter >= achievementCriteria->own_item.itemCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||||
|
|
@ -1672,18 +1698,22 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
|
||||||
if(!GetCriteriaDataSet(criteria))
|
|
||||||
sLog.outErrorDb( "Table `achievement_criteria_data` not have expected data for for criteria (Entry: %u Type: %u).", criteria->ID, criteria->requiredType);
|
|
||||||
break;
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
|
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
|
||||||
if(criteria->do_emote.count && !GetCriteriaDataSet(criteria))
|
if(criteria->do_emote.count==0)
|
||||||
sLog.outErrorDb( "Table `achievement_criteria_data` not have expected data for for criteria (Entry: %u Type: %u).", criteria->ID, criteria->requiredType);
|
continue;
|
||||||
break;
|
break;
|
||||||
default: // unexpected case processed in IsValid check
|
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: // any cases
|
||||||
break;
|
break;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: // need skip generic cases
|
||||||
|
if(criteria->loot_type.lootTypeCount!=1)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
default: // type not use DB data, ignore
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!GetCriteriaDataSet(criteria))
|
||||||
|
sLog.outErrorDb( "Table `achievement_criteria_data` not have expected data for for criteria (Entry: %u Type: %u).", criteria->ID, criteria->requiredType);
|
||||||
}
|
}
|
||||||
|
|
||||||
sLog.outString();
|
sLog.outString();
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,7 @@ void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data )
|
||||||
|
|
||||||
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
player->SendNewItem(newitem, uint32(item->count), false, false, true);
|
||||||
player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
|
player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
|
||||||
|
player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item->count);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player->SendEquipError( msg, NULL, NULL );
|
player->SendEquipError( msg, NULL, NULL );
|
||||||
|
|
@ -497,6 +498,7 @@ void WorldSession::HandleLootMasterGiveOpcode( WorldPacket & recv_data )
|
||||||
Item * newitem = target->StoreNewItem( dest, item.itemid, true, item.randomPropertyId );
|
Item * newitem = target->StoreNewItem( dest, item.itemid, true, item.randomPropertyId );
|
||||||
target->SendNewItem(newitem, uint32(item.count), false, false, true );
|
target->SendNewItem(newitem, uint32(item.count), false, false, true );
|
||||||
target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
|
target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
|
||||||
|
target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, pLoot->loot_type, item.count);
|
||||||
|
|
||||||
// mark as looted
|
// mark as looted
|
||||||
item.count=0;
|
item.count=0;
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,21 @@ enum PermissionTypes
|
||||||
NONE_PERMISSION = 3
|
NONE_PERMISSION = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum LootType
|
||||||
|
{
|
||||||
|
LOOT_CORPSE = 1,
|
||||||
|
LOOT_PICKPOCKETING = 2,
|
||||||
|
LOOT_FISHING = 3,
|
||||||
|
LOOT_DISENCHANTING = 4,
|
||||||
|
// ignored always by client
|
||||||
|
LOOT_SKINNING = 6,
|
||||||
|
LOOT_PROSPECTING = 7,
|
||||||
|
LOOT_MILLING = 8,
|
||||||
|
|
||||||
|
LOOT_FISHINGHOLE = 20, // unsupported by client, sending LOOT_FISHING instead
|
||||||
|
LOOT_INSIGNIA = 21 // unsupported by client, sending LOOT_CORPSE instead
|
||||||
|
};
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
class LootStore;
|
class LootStore;
|
||||||
|
|
||||||
|
|
@ -224,8 +239,9 @@ struct Loot
|
||||||
std::vector<LootItem> items;
|
std::vector<LootItem> items;
|
||||||
uint32 gold;
|
uint32 gold;
|
||||||
uint8 unlootedCount;
|
uint8 unlootedCount;
|
||||||
|
LootType loot_type; // required for achievement system
|
||||||
|
|
||||||
Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0) {}
|
Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0), loot_type(LOOT_CORPSE) {}
|
||||||
~Loot() { clear(); }
|
~Loot() { clear(); }
|
||||||
|
|
||||||
// if loot becomes invalid this reference is used to inform the listener
|
// if loot becomes invalid this reference is used to inform the listener
|
||||||
|
|
|
||||||
|
|
@ -7307,6 +7307,9 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// need know merged fishing/corpse loot type for achievements
|
||||||
|
loot->loot_type = loot_type;
|
||||||
|
|
||||||
WorldPacket data(SMSG_LOOT_RESPONSE, (9+50)); // we guess size
|
WorldPacket data(SMSG_LOOT_RESPONSE, (9+50)); // we guess size
|
||||||
|
|
||||||
data << uint64(guid);
|
data << uint64(guid);
|
||||||
|
|
@ -11399,301 +11402,304 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
|
||||||
if(!ignore_condition && pEnchant->EnchantmentCondition && !((Player*)this)->EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
|
if(!ignore_condition && pEnchant->EnchantmentCondition && !((Player*)this)->EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (int s=0; s<3; s++)
|
if (!item->IsBroken())
|
||||||
{
|
{
|
||||||
uint32 enchant_display_type = pEnchant->type[s];
|
for (int s=0; s<3; s++)
|
||||||
uint32 enchant_amount = pEnchant->amount[s];
|
|
||||||
uint32 enchant_spell_id = pEnchant->spellid[s];
|
|
||||||
|
|
||||||
switch(enchant_display_type)
|
|
||||||
{
|
{
|
||||||
case ITEM_ENCHANTMENT_TYPE_NONE:
|
uint32 enchant_display_type = pEnchant->type[s];
|
||||||
break;
|
uint32 enchant_amount = pEnchant->amount[s];
|
||||||
case ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL:
|
uint32 enchant_spell_id = pEnchant->spellid[s];
|
||||||
// processed in Player::CastItemCombatSpell
|
|
||||||
break;
|
switch(enchant_display_type)
|
||||||
case ITEM_ENCHANTMENT_TYPE_DAMAGE:
|
{
|
||||||
if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
|
case ITEM_ENCHANTMENT_TYPE_NONE:
|
||||||
HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
|
break;
|
||||||
else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
|
case ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL:
|
||||||
HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
|
// processed in Player::CastItemCombatSpell
|
||||||
else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
|
break;
|
||||||
HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
case ITEM_ENCHANTMENT_TYPE_DAMAGE:
|
||||||
break;
|
if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
|
||||||
case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:
|
HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
if(enchant_spell_id)
|
else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
|
||||||
{
|
HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
if(apply)
|
else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
|
||||||
|
HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
break;
|
||||||
|
case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:
|
||||||
|
if(enchant_spell_id)
|
||||||
{
|
{
|
||||||
int32 basepoints = 0;
|
if(apply)
|
||||||
// Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
|
|
||||||
if (item->GetItemRandomPropertyId())
|
|
||||||
{
|
{
|
||||||
ItemRandomSuffixEntry const *item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
int32 basepoints = 0;
|
||||||
if (item_rand)
|
// Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
|
||||||
|
if (item->GetItemRandomPropertyId())
|
||||||
{
|
{
|
||||||
// Search enchant_amount
|
ItemRandomSuffixEntry const *item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
||||||
for (int k=0; k<3; k++)
|
if (item_rand)
|
||||||
{
|
{
|
||||||
if(item_rand->enchant_id[k] == enchant_id)
|
// Search enchant_amount
|
||||||
|
for (int k=0; k<3; k++)
|
||||||
{
|
{
|
||||||
basepoints = int32((item_rand->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
if(item_rand->enchant_id[k] == enchant_id)
|
||||||
break;
|
{
|
||||||
|
basepoints = int32((item_rand->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Cast custom spell vs all equal basepoints getted from enchant_amount
|
||||||
|
if (basepoints)
|
||||||
|
CastCustomSpell(this,enchant_spell_id,&basepoints,&basepoints,&basepoints,true,item);
|
||||||
|
else
|
||||||
|
CastSpell(this,enchant_spell_id,true,item);
|
||||||
}
|
}
|
||||||
// Cast custom spell vs all equal basepoints getted from enchant_amount
|
|
||||||
if (basepoints)
|
|
||||||
CastCustomSpell(this,enchant_spell_id,&basepoints,&basepoints,&basepoints,true,item);
|
|
||||||
else
|
else
|
||||||
CastSpell(this,enchant_spell_id,true,item);
|
RemoveAurasDueToItemSpell(item,enchant_spell_id);
|
||||||
}
|
}
|
||||||
else
|
break;
|
||||||
RemoveAurasDueToItemSpell(item,enchant_spell_id);
|
case ITEM_ENCHANTMENT_TYPE_RESISTANCE:
|
||||||
}
|
if (!enchant_amount)
|
||||||
break;
|
|
||||||
case ITEM_ENCHANTMENT_TYPE_RESISTANCE:
|
|
||||||
if (!enchant_amount)
|
|
||||||
{
|
|
||||||
ItemRandomSuffixEntry const *item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
|
||||||
if(item_rand)
|
|
||||||
{
|
{
|
||||||
for (int k=0; k<3; k++)
|
ItemRandomSuffixEntry const *item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
||||||
|
if(item_rand)
|
||||||
{
|
{
|
||||||
if(item_rand->enchant_id[k] == enchant_id)
|
for (int k=0; k<3; k++)
|
||||||
{
|
{
|
||||||
enchant_amount = uint32((item_rand->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
if(item_rand->enchant_id[k] == enchant_id)
|
||||||
break;
|
{
|
||||||
|
enchant_amount = uint32((item_rand->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
|
HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
break;
|
break;
|
||||||
case ITEM_ENCHANTMENT_TYPE_STAT:
|
case ITEM_ENCHANTMENT_TYPE_STAT:
|
||||||
{
|
|
||||||
if (!enchant_amount)
|
|
||||||
{
|
{
|
||||||
ItemRandomSuffixEntry const *item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
if (!enchant_amount)
|
||||||
if(item_rand_suffix)
|
|
||||||
{
|
{
|
||||||
for (int k=0; k<3; k++)
|
ItemRandomSuffixEntry const *item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
|
||||||
|
if(item_rand_suffix)
|
||||||
{
|
{
|
||||||
if(item_rand_suffix->enchant_id[k] == enchant_id)
|
for (int k=0; k<3; k++)
|
||||||
{
|
{
|
||||||
enchant_amount = uint32((item_rand_suffix->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
if(item_rand_suffix->enchant_id[k] == enchant_id)
|
||||||
break;
|
{
|
||||||
|
enchant_amount = uint32((item_rand_suffix->prefix[k]*item->GetItemSuffixFactor()) / 10000 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
sLog.outDebug("Adding %u to stat nb %u",enchant_amount,enchant_spell_id);
|
sLog.outDebug("Adding %u to stat nb %u",enchant_amount,enchant_spell_id);
|
||||||
switch (enchant_spell_id)
|
switch (enchant_spell_id)
|
||||||
{
|
|
||||||
case ITEM_MOD_AGILITY:
|
|
||||||
sLog.outDebug("+ %u AGILITY",enchant_amount);
|
|
||||||
HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
ApplyStatBuffMod(STAT_AGILITY, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_STRENGTH:
|
|
||||||
sLog.outDebug("+ %u STRENGTH",enchant_amount);
|
|
||||||
HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
ApplyStatBuffMod(STAT_STRENGTH, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_INTELLECT:
|
|
||||||
sLog.outDebug("+ %u INTELLECT",enchant_amount);
|
|
||||||
HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
ApplyStatBuffMod(STAT_INTELLECT, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_SPIRIT:
|
|
||||||
sLog.outDebug("+ %u SPIRIT",enchant_amount);
|
|
||||||
HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
ApplyStatBuffMod(STAT_SPIRIT, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_STAMINA:
|
|
||||||
sLog.outDebug("+ %u STAMINA",enchant_amount);
|
|
||||||
HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
ApplyStatBuffMod(STAT_STAMINA, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_DEFENSE_SKILL_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u DEFENCE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_DODGE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_DODGE, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u DODGE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_PARRY_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_PARRY, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u PARRY", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_BLOCK_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SHIELD_BLOCK", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_HIT_MELEE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u MELEE_HIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_HIT_RANGED_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u RANGED_HIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_HIT_SPELL_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SPELL_HIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_CRIT_MELEE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u MELEE_CRIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_CRIT_RANGED_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u RANGED_CRIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_CRIT_SPELL_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SPELL_CRIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
// Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
|
|
||||||
// in Enchantments
|
|
||||||
// case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_HASTE_MELEE_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_HASTE_RANGED_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
case ITEM_MOD_HASTE_SPELL_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_HIT_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u HIT", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_CRIT_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u CRITICAL", enchant_amount);
|
|
||||||
break;
|
|
||||||
// Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
|
|
||||||
// case ITEM_MOD_HIT_TAKEN_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
// case ITEM_MOD_CRIT_TAKEN_RATING:
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
|
||||||
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
|
||||||
// break;
|
|
||||||
case ITEM_MOD_RESILIENCE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u RESILIENCE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_HASTE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u HASTE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_EXPERTISE_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u EXPERTISE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_ATTACK_POWER:
|
|
||||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
sLog.outDebug("+ %u ATTACK_POWER", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_RANGED_ATTACK_POWER:
|
|
||||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
|
||||||
sLog.outDebug("+ %u RANGED_ATTACK_POWER", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_FERAL_ATTACK_POWER:
|
|
||||||
((Player*)this)->ApplyFeralAPBonus(enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u FERAL_ATTACK_POWER", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_SPELL_HEALING_DONE:
|
|
||||||
((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SPELL_HEALING_DONE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_SPELL_DAMAGE_DONE:
|
|
||||||
((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SPELL_DAMAGE_DONE", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_MANA_REGENERATION:
|
|
||||||
((Player*)this)->ApplyManaRegenBonus(enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u MANA_REGENERATION", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_ARMOR_PENETRATION_RATING:
|
|
||||||
((Player*)this)->ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u ARMOR PENETRATION", enchant_amount);
|
|
||||||
break;
|
|
||||||
case ITEM_MOD_SPELL_POWER:
|
|
||||||
((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
|
|
||||||
((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
|
|
||||||
sLog.outDebug("+ %u SPELL_POWER", enchant_amount);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
|
|
||||||
{
|
|
||||||
if(getClass() == CLASS_SHAMAN)
|
|
||||||
{
|
|
||||||
float addValue = 0.0f;
|
|
||||||
if(item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
|
|
||||||
{
|
{
|
||||||
addValue = float(enchant_amount * item->GetProto()->Delay/1000.0f);
|
case ITEM_MOD_AGILITY:
|
||||||
HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, addValue, apply);
|
sLog.outDebug("+ %u AGILITY",enchant_amount);
|
||||||
}
|
HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
else if(item->GetSlot() == EQUIPMENT_SLOT_OFFHAND )
|
ApplyStatBuffMod(STAT_AGILITY, enchant_amount, apply);
|
||||||
{
|
break;
|
||||||
addValue = float(enchant_amount * item->GetProto()->Delay/1000.0f);
|
case ITEM_MOD_STRENGTH:
|
||||||
HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, addValue, apply);
|
sLog.outDebug("+ %u STRENGTH",enchant_amount);
|
||||||
|
HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
ApplyStatBuffMod(STAT_STRENGTH, enchant_amount, apply);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_INTELLECT:
|
||||||
|
sLog.outDebug("+ %u INTELLECT",enchant_amount);
|
||||||
|
HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
ApplyStatBuffMod(STAT_INTELLECT, enchant_amount, apply);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_SPIRIT:
|
||||||
|
sLog.outDebug("+ %u SPIRIT",enchant_amount);
|
||||||
|
HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
ApplyStatBuffMod(STAT_SPIRIT, enchant_amount, apply);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_STAMINA:
|
||||||
|
sLog.outDebug("+ %u STAMINA",enchant_amount);
|
||||||
|
HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
ApplyStatBuffMod(STAT_STAMINA, enchant_amount, apply);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_DEFENSE_SKILL_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u DEFENCE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_DODGE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_DODGE, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u DODGE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_PARRY_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_PARRY, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u PARRY", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_BLOCK_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SHIELD_BLOCK", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_HIT_MELEE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u MELEE_HIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_HIT_RANGED_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u RANGED_HIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_HIT_SPELL_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SPELL_HIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_CRIT_MELEE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u MELEE_CRIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_CRIT_RANGED_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u RANGED_CRIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_CRIT_SPELL_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SPELL_CRIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
// Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
|
||||||
|
// in Enchantments
|
||||||
|
// case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_HASTE_MELEE_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_HASTE_RANGED_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
case ITEM_MOD_HASTE_SPELL_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_HIT_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u HIT", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_CRIT_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u CRITICAL", enchant_amount);
|
||||||
|
break;
|
||||||
|
// Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
|
||||||
|
// case ITEM_MOD_HIT_TAKEN_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
// case ITEM_MOD_CRIT_TAKEN_RATING:
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
||||||
|
// ((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
||||||
|
// break;
|
||||||
|
case ITEM_MOD_RESILIENCE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u RESILIENCE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_HASTE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u HASTE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_EXPERTISE_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u EXPERTISE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_ATTACK_POWER:
|
||||||
|
HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
sLog.outDebug("+ %u ATTACK_POWER", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_RANGED_ATTACK_POWER:
|
||||||
|
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
|
||||||
|
sLog.outDebug("+ %u RANGED_ATTACK_POWER", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_FERAL_ATTACK_POWER:
|
||||||
|
((Player*)this)->ApplyFeralAPBonus(enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u FERAL_ATTACK_POWER", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_SPELL_HEALING_DONE:
|
||||||
|
((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SPELL_HEALING_DONE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_SPELL_DAMAGE_DONE:
|
||||||
|
((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SPELL_DAMAGE_DONE", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_MANA_REGENERATION:
|
||||||
|
((Player*)this)->ApplyManaRegenBonus(enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u MANA_REGENERATION", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_ARMOR_PENETRATION_RATING:
|
||||||
|
((Player*)this)->ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u ARMOR PENETRATION", enchant_amount);
|
||||||
|
break;
|
||||||
|
case ITEM_MOD_SPELL_POWER:
|
||||||
|
((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
|
||||||
|
((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
|
||||||
|
sLog.outDebug("+ %u SPELL_POWER", enchant_amount);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
|
||||||
}
|
{
|
||||||
case ITEM_ENCHANTMENT_TYPE_USE_SPELL:
|
if(getClass() == CLASS_SHAMAN)
|
||||||
// processed in Player::CastItemUseSpell
|
{
|
||||||
break;
|
float addValue = 0.0f;
|
||||||
case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:
|
if(item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
|
||||||
// nothing do..
|
{
|
||||||
break;
|
addValue = float(enchant_amount * item->GetProto()->Delay/1000.0f);
|
||||||
default:
|
HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, addValue, apply);
|
||||||
sLog.outError("Unknown item enchantment (id = %d) display type: %d", enchant_id, enchant_display_type);
|
}
|
||||||
break;
|
else if(item->GetSlot() == EQUIPMENT_SLOT_OFFHAND )
|
||||||
} /*switch(enchant_display_type)*/
|
{
|
||||||
} /*for*/
|
addValue = float(enchant_amount * item->GetProto()->Delay/1000.0f);
|
||||||
|
HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, addValue, apply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ITEM_ENCHANTMENT_TYPE_USE_SPELL:
|
||||||
|
// processed in Player::CastItemUseSpell
|
||||||
|
break;
|
||||||
|
case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:
|
||||||
|
// nothing do..
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sLog.outError("Unknown item enchantment (id = %d) display type: %d", enchant_id, enchant_display_type);
|
||||||
|
break;
|
||||||
|
} /*switch(enchant_display_type)*/
|
||||||
|
} /*for*/
|
||||||
|
}
|
||||||
|
|
||||||
// visualize enchantment at player and equipped items
|
// visualize enchantment at player and equipped items
|
||||||
if(slot == PERM_ENCHANTMENT_SLOT)
|
if(slot == PERM_ENCHANTMENT_SLOT)
|
||||||
|
|
@ -17461,7 +17467,7 @@ void Player::LeaveBattleground(bool teleportToEntryPoint)
|
||||||
bg->RemovePlayerAtLeave(GetGUID(), teleportToEntryPoint, true);
|
bg->RemovePlayerAtLeave(GetGUID(), teleportToEntryPoint, true);
|
||||||
|
|
||||||
// call after remove to be sure that player resurrected for correct cast
|
// call after remove to be sure that player resurrected for correct cast
|
||||||
if( bg->isBattleGround() && sWorld.getConfig(CONFIG_BATTLEGROUND_CAST_DESERTER) )
|
if( bg->isBattleGround() && !isGameMaster() && sWorld.getConfig(CONFIG_BATTLEGROUND_CAST_DESERTER) )
|
||||||
{
|
{
|
||||||
if( bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN )
|
if( bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN )
|
||||||
CastSpell(this, 26013, true); // Deserter
|
CastSpell(this, 26013, true); // Deserter
|
||||||
|
|
|
||||||
|
|
@ -459,20 +459,7 @@ enum ActivateTaxiReplies
|
||||||
ERR_TAXINOTSTANDING = 12
|
ERR_TAXINOTSTANDING = 12
|
||||||
};
|
};
|
||||||
|
|
||||||
enum LootType
|
|
||||||
{
|
|
||||||
LOOT_CORPSE = 1,
|
|
||||||
LOOT_PICKPOCKETING = 2,
|
|
||||||
LOOT_FISHING = 3,
|
|
||||||
LOOT_DISENCHANTING = 4,
|
|
||||||
// ignored always by client
|
|
||||||
LOOT_SKINNING = 6,
|
|
||||||
LOOT_PROSPECTING = 7,
|
|
||||||
LOOT_MILLING = 8,
|
|
||||||
|
|
||||||
LOOT_FISHINGHOLE = 20, // unsupported by client, sending LOOT_FISHING instead
|
|
||||||
LOOT_INSIGNIA = 21 // unsupported by client, sending LOOT_CORPSE instead
|
|
||||||
};
|
|
||||||
|
|
||||||
enum MirrorTimerType
|
enum MirrorTimerType
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2182,65 +2182,97 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
case SPELLFAMILY_GENERIC:
|
case SPELLFAMILY_GENERIC:
|
||||||
{
|
{
|
||||||
// Unstable Power
|
switch(GetId())
|
||||||
if( GetId()==24658 )
|
|
||||||
{
|
{
|
||||||
uint32 spellId = 24659;
|
// Unstable Power
|
||||||
if (apply && caster)
|
case 24658:
|
||||||
{
|
{
|
||||||
const SpellEntry *spell = sSpellStore.LookupEntry(spellId);
|
uint32 spellId = 24659;
|
||||||
if (!spell)
|
if (apply && caster)
|
||||||
return;
|
{
|
||||||
|
const SpellEntry *spell = sSpellStore.LookupEntry(spellId);
|
||||||
|
if (!spell)
|
||||||
|
return;
|
||||||
|
|
||||||
for (int i=0; i < spell->StackAmount; ++i)
|
for (int i=0; i < spell->StackAmount; ++i)
|
||||||
caster->CastSpell(m_target, spell->Id, true, NULL, NULL, GetCasterGUID());
|
caster->CastSpell(m_target, spell->Id, true, NULL, NULL, GetCasterGUID());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_target->RemoveAurasDueToSpell(spellId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_target->RemoveAurasDueToSpell(spellId);
|
// Restless Strength
|
||||||
return;
|
case 24661:
|
||||||
}
|
|
||||||
// Restless Strength
|
|
||||||
if( GetId()==24661 )
|
|
||||||
{
|
|
||||||
uint32 spellId = 24662;
|
|
||||||
if (apply && caster)
|
|
||||||
{
|
{
|
||||||
const SpellEntry *spell = sSpellStore.LookupEntry(spellId);
|
uint32 spellId = 24662;
|
||||||
if (!spell)
|
if (apply && caster)
|
||||||
|
{
|
||||||
|
const SpellEntry *spell = sSpellStore.LookupEntry(spellId);
|
||||||
|
if (!spell)
|
||||||
|
return;
|
||||||
|
for (int i=0; i < spell->StackAmount; ++i)
|
||||||
|
caster->CastSpell(m_target, spell->Id, true, NULL, NULL, GetCasterGUID());
|
||||||
return;
|
return;
|
||||||
for (int i=0; i < spell->StackAmount; ++i)
|
}
|
||||||
caster->CastSpell(m_target, spell->Id, true, NULL, NULL, GetCasterGUID());
|
m_target->RemoveAurasDueToSpell(spellId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_target->RemoveAurasDueToSpell(spellId);
|
//Summon Fire Elemental
|
||||||
return;
|
case 40133:
|
||||||
}
|
|
||||||
//Summon Fire Elemental
|
|
||||||
if (GetId() == 40133 && caster)
|
|
||||||
{
|
|
||||||
Unit *owner = caster->GetOwner();
|
|
||||||
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
{
|
{
|
||||||
if(apply)
|
if (!caster)
|
||||||
owner->CastSpell(owner,8985,true);
|
return;
|
||||||
else
|
|
||||||
((Player*)owner)->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Summon Earth Elemental
|
Unit *owner = caster->GetOwner();
|
||||||
if (GetId() == 40132 && caster)
|
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
{
|
{
|
||||||
Unit *owner = caster->GetOwner();
|
if(apply)
|
||||||
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
owner->CastSpell(owner,8985,true);
|
||||||
{
|
else
|
||||||
if(apply)
|
((Player*)owner)->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
|
||||||
owner->CastSpell(owner,19704,true);
|
}
|
||||||
else
|
return;
|
||||||
((Player*)owner)->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
|
|
||||||
}
|
}
|
||||||
return;
|
//Summon Earth Elemental
|
||||||
|
case 40132 :
|
||||||
|
{
|
||||||
|
if (!caster)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Unit *owner = caster->GetOwner();
|
||||||
|
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
{
|
||||||
|
if(apply)
|
||||||
|
owner->CastSpell(owner,19704,true);
|
||||||
|
else
|
||||||
|
((Player*)owner)->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// LK Intro VO (1)
|
||||||
|
case 58204:
|
||||||
|
if(m_target->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
{
|
||||||
|
// Play part 1
|
||||||
|
if(apply)
|
||||||
|
m_target->PlayDirectSound(14970, (Player *)m_target);
|
||||||
|
// continue in 58205
|
||||||
|
else
|
||||||
|
m_target->CastSpell(m_target, 58205, true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
// LK Intro VO (2)
|
||||||
|
case 58205:
|
||||||
|
if(m_target->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
{
|
||||||
|
// Play part 2
|
||||||
|
if(apply)
|
||||||
|
m_target->PlayDirectSound(14971, (Player *)m_target);
|
||||||
|
// Play part 3
|
||||||
|
else
|
||||||
|
m_target->PlayDirectSound(14972, (Player *)m_target);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -436,9 +436,9 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
|
||||||
SetMapId(newMapid);
|
SetMapId(newMapid);
|
||||||
Relocate(x, y, z);
|
Relocate(x, y, z);
|
||||||
|
|
||||||
for(PlayerSet::const_iterator itr = m_passengers.begin(); itr != m_passengers.end();)
|
for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();)
|
||||||
{
|
{
|
||||||
PlayerSet::const_iterator it2 = itr;
|
PlayerSet::iterator it2 = itr;
|
||||||
++itr;
|
++itr;
|
||||||
|
|
||||||
Player *plr = *it2;
|
Player *plr = *it2;
|
||||||
|
|
|
||||||
|
|
@ -7285,7 +7285,7 @@ void Unit::RemoveAllAttackers()
|
||||||
{
|
{
|
||||||
while (!m_attackers.empty())
|
while (!m_attackers.empty())
|
||||||
{
|
{
|
||||||
AttackerSet::const_iterator iter = m_attackers.begin();
|
AttackerSet::iterator iter = m_attackers.begin();
|
||||||
if(!(*iter)->AttackStop())
|
if(!(*iter)->AttackStop())
|
||||||
{
|
{
|
||||||
sLog.outError("WORLD: Unit has an attacker that isn't attacking it!");
|
sLog.outError("WORLD: Unit has an attacker that isn't attacking it!");
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ class ReactorRunnable : protected ACE_Task_Base
|
||||||
|
|
||||||
ACE_ASSERT (m_Reactor);
|
ACE_ASSERT (m_Reactor);
|
||||||
|
|
||||||
SocketSet::const_iterator i, t;
|
SocketSet::iterator i, t;
|
||||||
|
|
||||||
while (!m_Reactor->reactor_event_loop_done ())
|
while (!m_Reactor->reactor_event_loop_done ())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7732"
|
#define REVISION_NR "7738"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue