diff --git a/data/sql/updates/pending_db_world/rev_1627113690089052600.sql b/data/sql/updates/pending_db_world/rev_1627113690089052600.sql new file mode 100644 index 000000000..52f60c4dd --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1627113690089052600.sql @@ -0,0 +1,9 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1627113690089052600'); + +ALTER TABLE `creature_template` ADD COLUMN `ExperienceModifier` FLOAT NOT NULL DEFAULT 1 AFTER `ArmorModifier`; + +UPDATE `creature_template` SET `ExperienceModifier` = 2 WHERE `entry` IN (639,642,643,644,645,646,647,1663,1666,1696,1716,1717,1720,1763,1853,2748,3586,3653,3654,3669,3670,3671,3673,3674,3872,3886,3887,3914,3927,3974,3975,3976,3977,3983,4274,4275,4278,4279,4420,4421,4422,4424,4428,4542,4543,4829,4830,4831,4832,4854,4887,5709,5710,5711,5712,5713,5714,5715,5716,5717,5719,5720,5721,5722,5775,6168,6229,6235,6243,6487,6906,6910,7023,7079,7206,7228,7267,7271,7272,7273,7275,7291,7354,7355,7356,7357,7358,7361,7795,7796,7797,7800,8127,8443,8567,8580,8929,8983,9016,9017,9018,9019,9024,9025,9033,9041,9042,9056,9156,9196,9236,9237,9319,9499,9502,9537,9543,9568,9736,9816,9938,10096,10220,10268,10339,10363,10393,10429,10430,10432,10433,10435,10436,10437,10438,10439,10440,10502,10503,10504,10505,10506,10507,10508,10516,10558,10584,10596,10808,10811,10813,10901,10997,11032,11058,11143,11261,11486,11487,11488,11489,11490,11492,11496,11501,11517,11518,11519,11520,11622,12201,12203,12225,12236,12258,12876,12902,13280,13282,13282,13596,13601,13601,14321,14322,14323,14324,14325,14326,14327); +UPDATE `creature_template` SET `ExperienceModifier` = 0.5 WHERE `entry` IN (7076,7077,7309,8477,8615,8658,9157,10387,10389,10441,10461,11460,11466,12473,14350,14396,15546,15720,15733,15735,15738,16032,16286); +UPDATE `creature_template` SET `ExperienceModifier` = 0.1 WHERE `entry` IN (15316,15317); +UPDATE `creature_template` SET `ExperienceModifier` = 0.25 WHERE `entry` IN (2946,6575,9496,10411,11713,14386,16230); +UPDATE `creature_template` SET `ExperienceModifier` = 0.005 WHERE `entry` = 10925; diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index 2ebac78c6..54b703b41 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -65,7 +65,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, detection_range, scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, detection_range, scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 5e37957b7..b5157d3fc 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -128,6 +128,7 @@ struct CreatureTemplate float ModHealth; float ModMana; float ModArmor; + float ModExperience; bool RacialLeader; uint32 movementId; bool RegenHealth; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6bd0e4187..0769175a0 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -473,8 +473,8 @@ void ObjectMgr::LoadCreatureTemplates() "dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, " // 40 41 42 43 44 45 46 47 48 49 "type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " -// 50 51 52 53 54 55 56 57 58 59 60 61 - "InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName " +// 50 51 52 53 54 55 56 57 58 59 60 61 62 + "InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); if (!result) @@ -600,13 +600,14 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.ModHealth = fields[52].GetFloat(); creatureTemplate.ModMana = fields[53].GetFloat(); creatureTemplate.ModArmor = fields[54].GetFloat(); - creatureTemplate.RacialLeader = fields[55].GetBool(); - creatureTemplate.movementId = fields[56].GetUInt32(); - creatureTemplate.RegenHealth = fields[57].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[58].GetUInt32(); - creatureTemplate.SpellSchoolImmuneMask = fields[59].GetUInt8(); - creatureTemplate.flags_extra = fields[60].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[61].GetCString()); + creatureTemplate.ModExperience = fields[55].GetFloat(); + creatureTemplate.RacialLeader = fields[56].GetBool(); + creatureTemplate.movementId = fields[57].GetUInt32(); + creatureTemplate.RegenHealth = fields[58].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[59].GetUInt32(); + creatureTemplate.SpellSchoolImmuneMask = fields[60].GetUInt8(); + creatureTemplate.flags_extra = fields[61].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[62].GetCString()); } void ObjectMgr::LoadCreatureTemplateResistances() diff --git a/src/server/game/Miscellaneous/Formulas.cpp b/src/server/game/Miscellaneous/Formulas.cpp index 6174e1ea8..42818f19e 100644 --- a/src/server/game/Miscellaneous/Formulas.cpp +++ b/src/server/game/Miscellaneous/Formulas.cpp @@ -79,8 +79,7 @@ uint32 Acore::XP::Gain(Player* player, Unit* unit, bool isBattleGround /*= false xpMod *= 2.0f; } - // This requires TrinityCore creature_template.ExperienceModifier feature - // xpMod *= creature->GetCreatureTemplate()->ModExperience; + xpMod *= creature->GetCreatureTemplate()->ModExperience; } xpMod *= isBattleGround ? sWorld->getRate(RATE_XP_BG_KILL) : sWorld->getRate(RATE_XP_KILL);