diff options
author | Sarjuuk <Sarjuuk@trinitycore.contrib> | 2011-06-27 14:20:20 +0200 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-06-27 14:23:58 +0200 |
commit | 249692b54b61a7260673c8c1f50ab6630af9615a (patch) | |
tree | bca2151575a7fd18f4eafad791c620717bef8a70 /src | |
parent | 8fd3c912c1a297bc32c7df8e7117e8e589777f64 (diff) |
Core/Vehicles: Remove vehicle stat scaling hack and implement it properly trough the spell system. NOTE: This does need some further research on coefficients for different vehicles.
Signed-off-by: Machiavelli <machiavelli.trinity@gmail.com>
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 15 | ||||
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.h | 8 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 42 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectMgr.h | 10 | ||||
-rwxr-xr-x | src/server/game/World/World.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 53 |
6 files changed, 53 insertions, 78 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 05da6f15c12..52a625e872d 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -361,21 +361,6 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) { if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) ASSERT(false); - - // hack: should be done by aura system - if (VehicleScalingInfo const* scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID)) - { - Player* player = unit->ToPlayer(); - float averageItemLevel = player->GetAverageItemLevel(); - if (averageItemLevel < scalingInfo->baseItemLevel) - averageItemLevel = scalingInfo->baseItemLevel; - averageItemLevel -= scalingInfo->baseItemLevel; - - float currentHealthPct = float(me->GetHealth() / me->GetMaxHealth()); - m_bonusHP = uint32(me->GetMaxHealth() * (averageItemLevel * scalingInfo->scalingFactor)); - me->SetMaxHealth(me->GetMaxHealth() + m_bonusHP); - me->SetHealth(uint32((me->GetHealth() + m_bonusHP) * currentHealthPct)); - } } if (me->IsInWorld()) diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 06b009ddc4d..5158d5d29b4 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -95,16 +95,8 @@ struct VehicleAccessory uint32 SummonTime; }; -struct VehicleScalingInfo -{ - uint32 ID; - float baseItemLevel; - float scalingFactor; -}; - typedef std::vector<VehicleAccessory> VehicleAccessoryList; typedef std::map<uint32, VehicleAccessoryList> VehicleAccessoryMap; -typedef std::map<uint32, VehicleScalingInfo> VehicleScalingMap; typedef std::map<int8, VehicleSeat> SeatMap; class Vehicle diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2640af253d4..80fdc3060f4 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2935,48 +2935,6 @@ void ObjectMgr::LoadVehicleAccessories() sLog->outString(); } -void ObjectMgr::LoadVehicleScaling() -{ - uint32 oldMSTime = getMSTime(); - - m_VehicleScalingMap.clear(); // needed for reload case - - uint32 count = 0; - - QueryResult result = WorldDatabase.Query("SELECT `entry`, `baseItemLevel`, `scalingFactor` FROM `vehicle_scaling_info`"); - - if (!result) - { - sLog->outString(">> Loaded 0 vehicle scaling entries. DB table `vehicle_scaling_info` is empty."); - sLog->outString(); - return; - } - - do - { - Field *fields = result->Fetch(); - - uint32 vehicleEntry = fields[0].GetUInt32(); - float baseItemLevel = fields[1].GetFloat(); - float scalingFactor = fields[2].GetFloat(); - - if (!sVehicleStore.LookupEntry(vehicleEntry)) - { - sLog->outErrorDb("Table `vehicle_scaling_info`: vehicle entry %u does not exist.", vehicleEntry); - continue; - } - - m_VehicleScalingMap[vehicleEntry].ID = vehicleEntry; - m_VehicleScalingMap[vehicleEntry].baseItemLevel = baseItemLevel; - m_VehicleScalingMap[vehicleEntry].scalingFactor = scalingFactor; - - ++count; - } while (result->NextRow()); - - sLog->outString(">> Loaded %u vehicle scaling entries in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - sLog->outString(); -} - void ObjectMgr::LoadPetLevelInfo() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f7468f19755..e309809ef22 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -791,14 +791,6 @@ class ObjectMgr return NULL; } - VehicleScalingInfo const* GetVehicleScalingInfo(uint32 vehicleEntry) const - { - VehicleScalingMap::const_iterator itr = m_VehicleScalingMap.find(vehicleEntry); - if (itr != m_VehicleScalingMap.end()) - return &itr->second; - return NULL; - } - DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) { UNORDERED_MAP<uint32, DungeonEncounterList>::const_iterator itr = mDungeonEncounters.find(MAKE_PAIR32(mapId, difficulty)); @@ -896,7 +888,6 @@ class ObjectMgr void LoadMailLevelRewards(); void LoadVehicleTemplateAccessories(); void LoadVehicleAccessories(); - void LoadVehicleScaling(); void LoadGossipText(); @@ -1280,7 +1271,6 @@ class ObjectMgr VehicleAccessoryMap m_VehicleTemplateAccessoryMap; VehicleAccessoryMap m_VehicleAccessoryMap; - VehicleScalingMap m_VehicleScalingMap; typedef std::vector<LocaleConstant> LocalForIndex; LocalForIndex m_LocalForIndex; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 976e8ba660e..15cc7c9abaf 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1349,9 +1349,6 @@ void World::SetInitialWorldSettings() sLog->outString("Loading Creature template addons..."); sObjectMgr->LoadCreatureTemplateAddons(); - sLog->outString("Loading Vehicle scaling information..."); - sObjectMgr->LoadVehicleScaling(); - sLog->outString("Loading Reputation Reward Rates..."); sObjectMgr->LoadReputationRewardRate(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e7b6b146197..75102b9f856 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1213,6 +1213,58 @@ class spell_gen_launch : public SpellScriptLoader } }; +class spell_gen_vehicle_scaling : public SpellScriptLoader +{ + public: + spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } + + class spell_gen_vehicle_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + Unit* caster = GetCaster(); + if (!caster || !caster->ToPlayer()) + return; + + float factor; + uint16 baseItemLevel; + + // TODO: Reserach coeffs for different vehicles + switch (GetId()) + { + case 66668: + factor = 0.01; + baseItemLevel = 205; + break; + default: + factor = 0.01f; + baseItemLevel = 170; + break; + } + + float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); + if (avgILvl < baseItemLevel) + return; + + amount = 100 - uint16(100.0f * avgILvl / baseItemLevel); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_vehicle_scaling_AuraScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -1241,4 +1293,5 @@ void AddSC_generic_spell_scripts() new spell_gen_magic_rooster(); new spell_gen_allow_cast_from_item_only(); new spell_gen_launch(); + new spell_gen_vehicle_scaling(); } |