mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
738 lines
43 KiB
C++
738 lines
43 KiB
C++
|
||
/*
|
||
* This file is part of the Pandaria 5.4.8 Project. See THANKS file for Copyright information
|
||
*
|
||
* This program is free software; you can redistribute it and/or modify it
|
||
* under the terms of the GNU General Public License as published by the
|
||
* Free Software Foundation; either version 2 of the License, or (at your
|
||
* option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||
* more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License along
|
||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#include <map>
|
||
#include "Config.h"
|
||
#include "DatabaseEnv.h"
|
||
#include "ScriptMgr.h"
|
||
#include "Unit.h"
|
||
#include "ObjectAccessor.h"
|
||
#include "Player.h"
|
||
#include "Pet.h"
|
||
#include "Map.h"
|
||
#include "Group.h"
|
||
#include "InstanceScript.h"
|
||
#include "Chat.h"
|
||
#include "Log.h"
|
||
#include <math.h>
|
||
#include <unordered_map>
|
||
|
||
enum SolocraftTrinityStrings
|
||
{
|
||
SOLOCRAFT_TRINITYSTRING_ACTIVE = 30000, // |cff4CFF00SoloCraft system|r active.
|
||
SOLOCRAFT_TRINITYSTRING_STATUS = 30001, // |cffFF0000[SoloCraft]|r |cffFF8000 %s entered %s - Difficulty Offset: %0.2f. Spellpower Bonus: %i. Class Balance Weight: %i. XP Gain: |cffFF0000%s XP Balancing:%s |cff4CFF00%s
|
||
SOLOCRAFT_TRINITYSTRING_ERR_LEVEL_TOO_HIGH = 30002, // |cff4CFF00[SoloCraft]|r |cffFF0000 %s entered %s - |cffFF0000You have not been buffed.|r |cffFF8000Your level is higher than the max level (%i) threshold for this dungeon.
|
||
SOLOCRAFT_TRINITYSTRING_ERR_GROUP_ALREADY_BUFFED = 30003, // |cffFF0000[SoloCraft]|r |cffFF8000 %s entered %s - |cffFF0000BE ADVISED - You have been debuffed by offset: %0.2f with a Class Balance Weight: %i. |cffFF8000A group member already inside has the dungeon's full buff offset. No Spellpower buff will be applied to spell casters. ALL group members must exit the dungeon and re-enter to receive a balanced offset.
|
||
SOLOCRAFT_TRINITYSTRING_CLEAR_BUFFS = 30004, // |cffFF0000[SoloCraft]|r |cffFF8000 %s exited to %s - Reverting Difficulty Offset: %0.2f. Spellpower Bonus Removed: %i
|
||
SOLOCRAFT_TRINITYSTRING_ENABLED = 30005, // Enabled
|
||
SOLOCRAFT_TRINITYSTRING_DISABLED = 30006, // Disabled
|
||
};
|
||
|
||
class SolocraftConfig
|
||
{
|
||
public:
|
||
|
||
SolocraftConfig()
|
||
{
|
||
loadConfig();
|
||
}
|
||
|
||
static SolocraftConfig &getInstance() {
|
||
static SolocraftConfig instance;
|
||
return instance;
|
||
}
|
||
|
||
void loadConfig()
|
||
{
|
||
SoloCraftEnable = sConfigMgr->GetBoolDefault("Solocraft.Enable", 0);
|
||
SoloCraftAnnounceModule = sConfigMgr->GetBoolDefault("Solocraft.Announce", 1);
|
||
SoloCraftDebuffEnable = sConfigMgr->GetBoolDefault("SoloCraft.Debuff.Enable", 1);
|
||
SoloCraftSpellMult = sConfigMgr->GetFloatDefault("SoloCraft.Spellpower.Mult", 2.5);
|
||
SoloCraftStatsMult = sConfigMgr->GetFloatDefault("SoloCraft.Stats.Mult", 100.0);
|
||
|
||
classes =
|
||
{
|
||
{1, sConfigMgr->GetIntDefault("SoloCraft.Warrior", 100) },
|
||
{2, sConfigMgr->GetIntDefault("SoloCraft.Paladin", 100) },
|
||
{3, sConfigMgr->GetIntDefault("SoloCraft.Hunter", 100) },
|
||
{4, sConfigMgr->GetIntDefault("SoloCraft.Rogue", 100) },
|
||
{5, sConfigMgr->GetIntDefault("SoloCraft.Priest", 100) },
|
||
{6, sConfigMgr->GetIntDefault("SoloCraft.Death.Knight", 100) },
|
||
{7, sConfigMgr->GetIntDefault("SoloCraft.Shaman", 100) },
|
||
{8, sConfigMgr->GetIntDefault("SoloCraft.Mage", 100) },
|
||
{9, sConfigMgr->GetIntDefault("SoloCraft.Warlock", 100) },
|
||
{10, sConfigMgr->GetIntDefault("SoloCraft.Monk", 100) },
|
||
{11, sConfigMgr->GetIntDefault("SoloCraft.Druid", 100) },
|
||
};
|
||
|
||
SolocraftXPEnabled = sConfigMgr->GetBoolDefault("Solocraft.XP.Enabled", 1);
|
||
SolocraftXPBalancingEnabled = sConfigMgr->GetBoolDefault("Solocraft.XP.Balancing.Enabled", 1);
|
||
SolocraftLevelDiff = sConfigMgr->GetIntDefault("Solocraft.Max.Level.Diff", 10);
|
||
SolocraftDungeonLevel = sConfigMgr->GetIntDefault("Solocraft.Dungeon.Level", 90);
|
||
|
||
dungeons =
|
||
{
|
||
/// VANILLA
|
||
{34, sConfigMgr->GetIntDefault("Solocraft.Stockades.Level", 22) },
|
||
{43, sConfigMgr->GetIntDefault("Solocraft.WailingCaverns.Level", 17) },
|
||
{47, sConfigMgr->GetIntDefault("Solocraft.RazorfenKraul.Level", 30) },
|
||
{48, sConfigMgr->GetIntDefault("Solocraft.BlackfathomDeeps.Level", 20) },
|
||
{70, sConfigMgr->GetIntDefault("Solocraft.Uldaman.Level", 40) },
|
||
{90, sConfigMgr->GetIntDefault("Solocraft.Gnomeregan.Level", 24) },
|
||
{109, sConfigMgr->GetIntDefault("Solocraft.SunkenTemple.Level", 50) },
|
||
{129, sConfigMgr->GetIntDefault("Solocraft.RazorfenDowns.Level", 40) },
|
||
{209, sConfigMgr->GetIntDefault("Solocraft.ZulFarrak.Level", 44) },
|
||
{229, sConfigMgr->GetIntDefault("Solocraft.BlackRockSpire.Level", 55) },
|
||
{230, sConfigMgr->GetIntDefault("Solocraft.BlackrockDepths.Level", 50) },
|
||
{249, sConfigMgr->GetIntDefault("Solocraft.OnyxiaLair.Level", 60) },
|
||
{329, sConfigMgr->GetIntDefault("Solocraft.Stratholme.Level", 55) },
|
||
{349, sConfigMgr->GetIntDefault("Solocraft.Mauradon.Level", 48) },
|
||
{389, sConfigMgr->GetIntDefault("Solocraft.RagefireChasm.Level", 15) },
|
||
{409, sConfigMgr->GetIntDefault("Solocraft.MoltenCore.Level", 60) },
|
||
{429, sConfigMgr->GetIntDefault("Solocraft.DireMaul.Level", 48) },
|
||
{469, sConfigMgr->GetIntDefault("Solocraft.BlackwingLair.Level", 40) },
|
||
{509, sConfigMgr->GetIntDefault("Solocraft.RuinsOfAhnQiraj.Level", 60) },
|
||
{531, sConfigMgr->GetIntDefault("Solocraft.TempleOfAhnQiraj.Level", 60) },
|
||
/// BURNING CRUSADE
|
||
{269, sConfigMgr->GetIntDefault("Solocraft.TheBlackMorass.Level", 68) },
|
||
{532, sConfigMgr->GetIntDefault("Solocraft.Karazahn.Level", 68) },
|
||
{534, sConfigMgr->GetIntDefault("Solocraft.TheBattleForMountHyjal.Level", 70) },
|
||
{540, sConfigMgr->GetIntDefault("Solocraft.TheShatteredHalls.Level", 68) },
|
||
{542, sConfigMgr->GetIntDefault("Solocraft.TheBloodFurnace.Level", 68) },
|
||
{543, sConfigMgr->GetIntDefault("Solocraft.HellfireRampart.Level", 68) },
|
||
{544, sConfigMgr->GetIntDefault("Solocraft.MagtheridonsLair.Level", 68) },
|
||
{545, sConfigMgr->GetIntDefault("Solocraft.TheSteamVault.Level", 68) },
|
||
{546, sConfigMgr->GetIntDefault("Solocraft.TheUnderbog.Level", 68) },
|
||
{547, sConfigMgr->GetIntDefault("Solocraft.TheSlavePens.Level", 68) },
|
||
{548, sConfigMgr->GetIntDefault("Solocraft.SerpentshrineCavern.Level", 70) },
|
||
{550, sConfigMgr->GetIntDefault("Solocraft.TheEye.Level", 70) },
|
||
{552, sConfigMgr->GetIntDefault("Solocraft.TheArcatraz.Level", 68) },
|
||
{553, sConfigMgr->GetIntDefault("Solocraft.TheBotanica.Level", 68) },
|
||
{554, sConfigMgr->GetIntDefault("Solocraft.TheMechanar.Level", 68) },
|
||
{555, sConfigMgr->GetIntDefault("Solocraft.ShadowLabyrinth.Level", 68) },
|
||
{556, sConfigMgr->GetIntDefault("Solocraft.SethekkHalls.Level", 68) },
|
||
{557, sConfigMgr->GetIntDefault("Solocraft.ManaTombs.Level", 68) },
|
||
{558, sConfigMgr->GetIntDefault("Solocraft.AuchenaiCrypts.Level", 68) },
|
||
{560, sConfigMgr->GetIntDefault("Solocraft.OldHillsbradFoothills.Level", 68) },
|
||
{564, sConfigMgr->GetIntDefault("Solocraft.BlackTemple.Level", 70) },
|
||
{565, sConfigMgr->GetIntDefault("Solocraft.GruulsLair.Level", 70) },
|
||
{580, sConfigMgr->GetIntDefault("Solocraft.SunwellPlateau.Level", 70) },
|
||
{585, sConfigMgr->GetIntDefault("Solocraft.MagistersTerrace.Level", 68) },
|
||
/// WRATH OF THE LICH KING
|
||
{533, sConfigMgr->GetIntDefault("Solocraft.Naxxramas.Level", 78) },
|
||
{574, sConfigMgr->GetIntDefault("Solocraft.UtgardeKeep", 78) },
|
||
{575, sConfigMgr->GetIntDefault("Solocraft.UtgardePinnacle.Level", 78) },
|
||
{578, sConfigMgr->GetIntDefault("Solocraft.Oculus.Level", 78) },
|
||
{595, sConfigMgr->GetIntDefault("Solocraft.TheCullingOfStratholme.Level", 78) },
|
||
{599, sConfigMgr->GetIntDefault("Solocraft.HallsOfStone.Level", 78) },
|
||
{600, sConfigMgr->GetIntDefault("Solocraft.DrakTharonKeep.Level", 78) },
|
||
{601, sConfigMgr->GetIntDefault("Solocraft.AzjolNerub.Level", 78) },
|
||
{602, sConfigMgr->GetIntDefault("Solocraft.HallsOfLighting.Level", 78) },
|
||
{603, sConfigMgr->GetIntDefault("Solocraft.Ulduar.Level", 80) },
|
||
{604, sConfigMgr->GetIntDefault("Solocraft.GunDrak.Level", 78) },
|
||
{608, sConfigMgr->GetIntDefault("Solocraft.VioletHold.Level", 78) },
|
||
{615, sConfigMgr->GetIntDefault("Solocraft.TheObsidianSanctum.Level", 80) },
|
||
{616, sConfigMgr->GetIntDefault("Solocraft.TheEyeOfEternity.Level", 80) },
|
||
{619, sConfigMgr->GetIntDefault("Solocraft.AhnkahetTheOldKingdom.Level", 78) },
|
||
{631, sConfigMgr->GetIntDefault("Solocraft.IcecrownCitadel.Level", 80) },
|
||
{632, sConfigMgr->GetIntDefault("Solocraft.TheForgeOfSouls.Level", 78) },
|
||
{649, sConfigMgr->GetIntDefault("Solocraft.TrialOfTheCrusader.Level", 80) },
|
||
{650, sConfigMgr->GetIntDefault("Solocraft.TrialOfTheChampion.Level", 80) },
|
||
{658, sConfigMgr->GetIntDefault("Solocraft.PitOfSaron.Level", 78) },
|
||
{668, sConfigMgr->GetIntDefault("Solocraft.HallsOfReflection.Level", 78) },
|
||
{724, sConfigMgr->GetIntDefault("Solocraft.TheRubySanctum.Level", 80) },
|
||
/// CATACLYSM
|
||
{33, sConfigMgr->GetIntDefault("Solocraft.ShadowfangKeep.Level", 85) },
|
||
{36, sConfigMgr->GetIntDefault("Solocraft.DeadMines.Level", 85) },
|
||
{645, sConfigMgr->GetIntDefault("Solocraft.BlackrockCaverns.Level", 85) },
|
||
{643, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheTides.Level", 85) },
|
||
{657, sConfigMgr->GetIntDefault("Solocraft.TheVortexPinnacle.Level", 85) },
|
||
{725, sConfigMgr->GetIntDefault("Solocraft.TheStonecore.Level", 85) },
|
||
{755, sConfigMgr->GetIntDefault("Solocraft.LostCityOfTheTol'vir.Level", 85) },
|
||
{644, sConfigMgr->GetIntDefault("Solocraft.HallsOfOrigination.Level", 85) },
|
||
{670, sConfigMgr->GetIntDefault("Solocraft.GrimBatol.Level", 85) },
|
||
{669, sConfigMgr->GetIntDefault("Solocraft.BlackwingDescent.Level", 85) },
|
||
{671, sConfigMgr->GetIntDefault("Solocraft.TheBastionOfTwilight.Level", 85) },
|
||
{754, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheFourWinds.Level", 85) },
|
||
{757, sConfigMgr->GetIntDefault("Solocraft.BaradinHold.Level", 85) },
|
||
{720, sConfigMgr->GetIntDefault("Solocraft.Firelands.Level", 85) },
|
||
{967, sConfigMgr->GetIntDefault("Solocraft.DragonSoul.Level", 85) },
|
||
{938, sConfigMgr->GetIntDefault("Solocraft.EndTime.Level", 85) },
|
||
{939, sConfigMgr->GetIntDefault("Solocraft.WellOfEternity.Level", 85) },
|
||
{940, sConfigMgr->GetIntDefault("Solocraft.HourOfTwilight.Level", 85) },
|
||
{859, sConfigMgr->GetIntDefault("Solocraft.Zul'gurub.Level", 85) },
|
||
{568, sConfigMgr->GetIntDefault("Solocraft.ZulAman.Level", 85) },
|
||
{576, sConfigMgr->GetIntDefault("Solocraft.Nexus.Level", 85) },
|
||
/// MISTS OF PANDARIA
|
||
{959, sConfigMgr->GetIntDefault("Solocraft.ShadoPanMonastery.Level", 90) },
|
||
{1007, sConfigMgr->GetIntDefault("Solocraft.Scholomance.Level", 90) },
|
||
{1004, sConfigMgr->GetIntDefault("Solocraft.ScarletMonastery.Level", 90) },
|
||
{994, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanPalace.Level", 90) },
|
||
{1008, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanVaults.Level", 90) },
|
||
{1136, sConfigMgr->GetIntDefault("Solocraft.SiegeOfOrgrimmar.Level", 90) },
|
||
{1098, sConfigMgr->GetIntDefault("Solocraft.ThroneOfThunder.Level", 90) },
|
||
{1009, sConfigMgr->GetIntDefault("Solocraft.HeartOfFear.Level", 90) },
|
||
{996, sConfigMgr->GetIntDefault("Solocraft.TerraceOfEndlessSpring.Level", 90) },
|
||
{1001, sConfigMgr->GetIntDefault("Solocraft.ScarletHalls.Level", 90) },
|
||
{962, sConfigMgr->GetIntDefault("Solocraft.GateOfTheSettingSun.Level", 90) },
|
||
{1011, sConfigMgr->GetIntDefault("Solocraft.SiegeOfNiuzaoTemple.Level", 90) },
|
||
{960, sConfigMgr->GetIntDefault("Solocraft.TempleOfTheJadeSerpent.Level", 90) },
|
||
{961, sConfigMgr->GetIntDefault("Solocraft.StormstoutBrewery.Level", 90) },
|
||
};
|
||
|
||
// Dungeon difficulty
|
||
D5 = sConfigMgr->GetFloatDefault("Solocraft.Dungeon", 5.0);
|
||
D10 = sConfigMgr->GetFloatDefault("Solocraft.Heroic", 10.0);
|
||
D25 = sConfigMgr->GetFloatDefault("Solocraft.Raid25", 25.0);
|
||
D40 = sConfigMgr->GetFloatDefault("Solocraft.Raid40", 40.0);
|
||
// Множитель (обычный)
|
||
diff_Multiplier =
|
||
{
|
||
/// VANILLA
|
||
{34, sConfigMgr->GetFloatDefault("Solocraft.Stockades", 5.0) },
|
||
{43, sConfigMgr->GetFloatDefault("Solocraft.WailingCaverns", 5.0) },
|
||
{47, sConfigMgr->GetFloatDefault("Solocraft.RazorfenKraul", 5.0) },
|
||
{48, sConfigMgr->GetFloatDefault("Solocraft.BlackfathomDeeps", 5.0) },
|
||
{70, sConfigMgr->GetFloatDefault("Solocraft.Uldaman", 5.0) },
|
||
{90, sConfigMgr->GetFloatDefault("Solocraft.Gnomeregan", 5.0) },
|
||
{109, sConfigMgr->GetFloatDefault("Solocraft.SunkenTemple", 5.0) },
|
||
{129, sConfigMgr->GetFloatDefault("Solocraft.RazorfenDowns", 5.0) },
|
||
{209, sConfigMgr->GetFloatDefault("Solocraft.ZulFarrak", 5.0) },
|
||
{229, sConfigMgr->GetFloatDefault("Solocraft.BlackRockSpire", 10.0) },
|
||
{230, sConfigMgr->GetFloatDefault("Solocraft.BlackrockDepths", 5.0) },
|
||
{249, sConfigMgr->GetFloatDefault("Solocraft.OnyxiaLair", 40.0) },
|
||
{329, sConfigMgr->GetFloatDefault("Solocraft.Stratholme", 5.0) },
|
||
{349, sConfigMgr->GetFloatDefault("Solocraft.Mauradon", 5.0) },
|
||
{389, sConfigMgr->GetFloatDefault("Solocraft.RagefireChasm", 5.0) },
|
||
{409, sConfigMgr->GetFloatDefault("Solocraft.MoltenCore", 40.0) },
|
||
{429, sConfigMgr->GetFloatDefault("Solocraft.DireMaul", 5.0) },
|
||
{469, sConfigMgr->GetFloatDefault("Solocraft.BlackwingLair", 40.0) },
|
||
{509, sConfigMgr->GetFloatDefault("Solocraft.RuinsOfAhnQiraj", 20.0) },
|
||
{531, sConfigMgr->GetFloatDefault("Solocraft.TempleOfAhnQiraj", 40.0) },
|
||
/// BURNING CRUSADE
|
||
{269, sConfigMgr->GetFloatDefault("Solocraft.TheBlackMorass", 5.0) },
|
||
{532, sConfigMgr->GetFloatDefault("Solocraft.Karazahn", 10.0) },
|
||
{534, sConfigMgr->GetFloatDefault("Solocraft.TheBattleForMountHyjal", 25.0) },
|
||
{540, sConfigMgr->GetFloatDefault("Solocraft.TheShatteredHalls", 5.0) },
|
||
{542, sConfigMgr->GetFloatDefault("Solocraft.TheBloodFurnace", 5.0) },
|
||
{543, sConfigMgr->GetFloatDefault("Solocraft.HellfireRampart", 5.0) },
|
||
{544, sConfigMgr->GetFloatDefault("Solocraft.MagtheridonsLair", 25.0) },
|
||
{545, sConfigMgr->GetFloatDefault("Solocraft.TheSteamVault", 5.0) },
|
||
{546, sConfigMgr->GetFloatDefault("Solocraft.TheUnderbog", 5.0) },
|
||
{547, sConfigMgr->GetFloatDefault("Solocraft.TheSlavePens", 5.0) },
|
||
{548, sConfigMgr->GetFloatDefault("Solocraft.SerpentshrineCavern", 25.0) },
|
||
{550, sConfigMgr->GetFloatDefault("Solocraft.TheEye", 25.0) },
|
||
{552, sConfigMgr->GetFloatDefault("Solocraft.TheArcatraz", 5.0) },
|
||
{553, sConfigMgr->GetFloatDefault("Solocraft.TheBotanica", 5.0) },
|
||
{554, sConfigMgr->GetFloatDefault("Solocraft.TheMechanar", 5.0) },
|
||
{555, sConfigMgr->GetFloatDefault("Solocraft.ShadowLabyrinth", 5.0) },
|
||
{556, sConfigMgr->GetFloatDefault("Solocraft.SethekkHalls", 5.0) },
|
||
{557, sConfigMgr->GetFloatDefault("Solocraft.ManaTombs", 5.0) },
|
||
{558, sConfigMgr->GetFloatDefault("Solocraft.AuchenaiCrypts", 5.0) },
|
||
{560, sConfigMgr->GetFloatDefault("Solocraft.OldHillsbradFoothills", 5.0) },
|
||
{564, sConfigMgr->GetFloatDefault("Solocraft.BlackTemple", 25.0) },
|
||
{565, sConfigMgr->GetFloatDefault("Solocraft.GruulsLair", 25.0) },
|
||
{580, sConfigMgr->GetFloatDefault("Solocraft.SunwellPlateau", 25.0) },
|
||
{585, sConfigMgr->GetFloatDefault("Solocraft.MagistersTerrace", 5.0) },
|
||
/// WRATH OF THE LICH KING
|
||
{533, sConfigMgr->GetFloatDefault("Solocraft.Naxxramas", 10.0) },
|
||
{574, sConfigMgr->GetFloatDefault("Solocraft.UtgardeKeep", 5.0) },
|
||
{575, sConfigMgr->GetFloatDefault("Solocraft.UtgardePinnacle", 5.0) },
|
||
{578, sConfigMgr->GetFloatDefault("Solocraft.Oculus", 5.0) },
|
||
{595, sConfigMgr->GetFloatDefault("Solocraft.TheCullingOfStratholme", 5.0) },
|
||
{599, sConfigMgr->GetFloatDefault("Solocraft.HallsOfStone", 5.0) },
|
||
{600, sConfigMgr->GetFloatDefault("Solocraft.DrakTharonKeep", 5.0) },
|
||
{601, sConfigMgr->GetFloatDefault("Solocraft.AzjolNerub", 5.0) },
|
||
{602, sConfigMgr->GetFloatDefault("Solocraft.HallsOfLighting", 5.0) },
|
||
{603, sConfigMgr->GetFloatDefault("Solocraft.Ulduar", 10.0) },
|
||
{604, sConfigMgr->GetFloatDefault("Solocraft.GunDrak", 5.0) },
|
||
{608, sConfigMgr->GetFloatDefault("Solocraft.VioletHold", 5.0) },
|
||
{615, sConfigMgr->GetFloatDefault("Solocraft.TheObsidianSanctum", 10.0) },
|
||
{616, sConfigMgr->GetFloatDefault("Solocraft.TheEyeOfEternity", 10.0) },
|
||
{619, sConfigMgr->GetFloatDefault("Solocraft.AhnkahetTheOldKingdom", 5.0) },
|
||
{631, sConfigMgr->GetFloatDefault("Solocraft.IcecrownCitadel", 10.0) },
|
||
{632, sConfigMgr->GetFloatDefault("Solocraft.TheForgeOfSouls", 5.0) },
|
||
{649, sConfigMgr->GetFloatDefault("Solocraft.TrialOfTheCrusader", 10.0) },
|
||
{650, sConfigMgr->GetFloatDefault("Solocraft.TrialOfTheChampion", 5.0) },
|
||
{658, sConfigMgr->GetFloatDefault("Solocraft.PitOfSaron", 5.0) },
|
||
{668, sConfigMgr->GetFloatDefault("Solocraft.HallsOfReflection", 5.0) },
|
||
{724, sConfigMgr->GetFloatDefault("Solocraft.TheRubySanctum", 10.0) },
|
||
/// CATACLYSM
|
||
{33, sConfigMgr->GetIntDefault("Solocraft.ShadowfangKeep", 5.0) }, // ShadowfangKeep
|
||
{36, sConfigMgr->GetIntDefault("Solocraft.DeadMines", 5.0) }, // DeadMines
|
||
{645, sConfigMgr->GetIntDefault("Solocraft.BlackrockCaverns", 5.0) }, // BlackrockCaverns
|
||
{643, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheTides", 5.0) }, // Трон Приливов
|
||
{657, sConfigMgr->GetIntDefault("Solocraft.TheVortexPinnacle", 5.0) }, // Вершина Смерча
|
||
{725, sConfigMgr->GetIntDefault("Solocraft.TheStonecore", 5.0) }, // Каменные Недра
|
||
{755, sConfigMgr->GetIntDefault("Solocraft.LostCityOfTheTol'vir", 5.0) }, // Затерянный город Тол'вир
|
||
{644, sConfigMgr->GetIntDefault("Solocraft.HallsOfOrigination", 5.0) }, // Чертоги Созидания
|
||
{670, sConfigMgr->GetIntDefault("Solocraft.GrimBatol", 5.0) }, // Грим Батол
|
||
{669, sConfigMgr->GetIntDefault("Solocraft.BlackwingDescent", 10.0) }, // Твердыня Крыла Тьмы
|
||
{671, sConfigMgr->GetIntDefault("Solocraft.TheBastionOfTwilight", 10.0) }, // Сумеречный бастион
|
||
{754, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheFourWinds", 10.0) }, // Трон Четырех Ветров
|
||
{757, sConfigMgr->GetIntDefault("Solocraft.BaradinHold", 10.0) }, // Крепость Барадин
|
||
{720, sConfigMgr->GetIntDefault("Solocraft.Firelands", 10.0) }, // Огненные Просторы
|
||
{967, sConfigMgr->GetIntDefault("Solocraft.DragonSoul", 10.0) }, // Душа Дракона
|
||
{859, sConfigMgr->GetIntDefault("Solocraft.Zul'gurub", 5.0) }, // Зул'Гуруб
|
||
{568, sConfigMgr->GetIntDefault("Solocraft.ZulAman", 5.0) }, // Зул'Аман
|
||
{576, sConfigMgr->GetIntDefault("Solocraft.Nexus", 5.0) }, // Нексус
|
||
/// MISTS OF PANDARIA
|
||
{959, sConfigMgr->GetIntDefault("Solocraft.ShadoPanMonastery", 5.0) }, // Монастырь Шадо-Пан
|
||
{1007, sConfigMgr->GetIntDefault("Solocraft.Scholomance", 5.0) }, // Некроситет
|
||
{1004, sConfigMgr->GetIntDefault("Solocraft.ScarletMonastery", 5.0) }, // Монастырь Алого ордена
|
||
{994, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanPalace", 5.0) }, // Дворец Могу'шан
|
||
{1008, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanVaults", 10.0) }, // Подземелья Могу'шан
|
||
{1136, sConfigMgr->GetIntDefault("Solocraft.SiegeOfOrgrimmar", 10.0) }, // Осада Оргриммара
|
||
{1098, sConfigMgr->GetIntDefault("Solocraft.ThroneOfThunder", 10.0) }, // Престол Гроз
|
||
{1009, sConfigMgr->GetIntDefault("Solocraft.HeartOfFear", 10.0) }, // Сердце Страха
|
||
{996, sConfigMgr->GetIntDefault("Solocraft.TerraceOfEndlessSpring", 10.0) }, // Терраса Вечной Весны
|
||
{1001, sConfigMgr->GetIntDefault("Solocraft.ScarletHalls", 5.0) }, // Залы Алого ордена
|
||
{962, sConfigMgr->GetIntDefault("Solocraft.GateOfTheSettingSun", 5.0) }, // Врата Заходящего Солнца
|
||
{1011, sConfigMgr->GetIntDefault("Solocraft.SiegeOfNiuzaoTemple", 5.0) }, // Осада храма Нюцзао
|
||
{960, sConfigMgr->GetIntDefault("Solocraft.TempleOfTheJadeSerpent", 5.0) }, // Храм Нефритовой Змеи
|
||
{961, sConfigMgr->GetIntDefault("Solocraft.StormstoutBrewery", 5.0) }, // Хмелеварня Буйных Портеров
|
||
};
|
||
// diff_Multiplier_Heroics
|
||
diff_Multiplier_Heroics =
|
||
{
|
||
/// BURNING CRUSADE
|
||
{269, sConfigMgr->GetFloatDefault("Solocraft.TheBlackMorassH", 5.0) },
|
||
{540, sConfigMgr->GetFloatDefault("Solocraft.TheShatteredHallsH", 5.0) },
|
||
{542, sConfigMgr->GetFloatDefault("Solocraft.TheBloodFurnaceH", 5.0) },
|
||
{543, sConfigMgr->GetFloatDefault("Solocraft.HellfireRampartH", 5.0) },
|
||
{545, sConfigMgr->GetFloatDefault("Solocraft.TheSteamVaultH", 5.0) },
|
||
{546, sConfigMgr->GetFloatDefault("Solocraft.TheUnderbogH", 5.0) },
|
||
{547, sConfigMgr->GetFloatDefault("Solocraft.TheSlavePensH", 5.0) },
|
||
{552, sConfigMgr->GetFloatDefault("Solocraft.TheArcatrazH", 5.0) },
|
||
{553, sConfigMgr->GetFloatDefault("Solocraft.TheBotanicaH", 5.0) },
|
||
{554, sConfigMgr->GetFloatDefault("Solocraft.TheMechanarH", 5.0) },
|
||
{555, sConfigMgr->GetFloatDefault("Solocraft.ShadowLabyrinthH", 5.0) },
|
||
{556, sConfigMgr->GetFloatDefault("Solocraft.SethekkHallsH", 5.0) },
|
||
{557, sConfigMgr->GetFloatDefault("Solocraft.ManaTombsH", 5.0) },
|
||
{558, sConfigMgr->GetFloatDefault("Solocraft.AuchenaiCryptsH", 5.0) },
|
||
{560, sConfigMgr->GetFloatDefault("Solocraft.OldHillsbradFoothillsH", 5.0) },
|
||
{585, sConfigMgr->GetFloatDefault("Solocraft.MagistersTerraceH", 5.0) },
|
||
/// WRATH OF THE LICH KING
|
||
{533, sConfigMgr->GetFloatDefault("Solocraft.NaxxramasH", 25.0) },
|
||
{574, sConfigMgr->GetFloatDefault("Solocraft.UtgardeKeepH", 5.0) },
|
||
{575, sConfigMgr->GetFloatDefault("Solocraft.UtgardePinnacleH", 5.0) },
|
||
{578, sConfigMgr->GetFloatDefault("Solocraft.OculusH", 5.0) },
|
||
{595, sConfigMgr->GetFloatDefault("Solocraft.TheCullingOfStratholmeH", 5.0) },
|
||
{599, sConfigMgr->GetFloatDefault("Solocraft.HallsOfStoneH", 5.0) },
|
||
{600, sConfigMgr->GetFloatDefault("Solocraft.DrakTharonKeepH", 5.0) },
|
||
{601, sConfigMgr->GetFloatDefault("Solocraft.AzjolNerubH", 5.0) },
|
||
{602, sConfigMgr->GetFloatDefault("Solocraft.HallsOfLightingH", 5.0) },
|
||
{603, sConfigMgr->GetFloatDefault("Solocraft.UlduarH", 25.0) },
|
||
{604, sConfigMgr->GetFloatDefault("Solocraft.GunDrakH", 5.0) },
|
||
{608, sConfigMgr->GetFloatDefault("Solocraft.VioletHoldH", 5.0) },
|
||
{615, sConfigMgr->GetFloatDefault("Solocraft.TheObsidianSanctumH", 25.0) },
|
||
{616, sConfigMgr->GetFloatDefault("Solocraft.TheEyeOfEternityH", 25.0) },
|
||
{619, sConfigMgr->GetFloatDefault("Solocraft.AhnkahetTheOldKingdomH", 5.0) },
|
||
{631, sConfigMgr->GetFloatDefault("Solocraft.IcecrownCitadelH", 25.0) },
|
||
{632, sConfigMgr->GetFloatDefault("Solocraft.TheForgeOfSoulsH", 5.0) },
|
||
{649, sConfigMgr->GetFloatDefault("Solocraft.TrialOfTheCrusaderH", 25.0) },
|
||
{650, sConfigMgr->GetFloatDefault("Solocraft.TrialOfTheChampionH", 5.0) },
|
||
{658, sConfigMgr->GetFloatDefault("Solocraft.PitOfSaronH", 5.0) },
|
||
{668, sConfigMgr->GetFloatDefault("Solocraft.HallsOfReflectionH", 5.0) },
|
||
{724, sConfigMgr->GetFloatDefault("Solocraft.TheRubySanctumH", 25.0) },
|
||
/// CATACLYSM
|
||
{33, sConfigMgr->GetFloatDefault("Solocraft.ShadowfangKeepH", 5.0) },
|
||
{36, sConfigMgr->GetFloatDefault("Solocraft.DeadMinesH", 5.0) },
|
||
{645, sConfigMgr->GetIntDefault("Solocraft.BlackrockCavernsH", 5.0) },
|
||
{643, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheTidesH", 5.0) },
|
||
{657, sConfigMgr->GetIntDefault("Solocraft.TheVortexPinnacleH", 5.0) },
|
||
{725, sConfigMgr->GetIntDefault("Solocraft.TheStonecoreH", 5.0) },
|
||
{755, sConfigMgr->GetIntDefault("Solocraft.LostCityOfTheTol'virH", 5.0) },
|
||
{644, sConfigMgr->GetIntDefault("Solocraft.HallsOfOriginationH", 5.0) },
|
||
{670, sConfigMgr->GetIntDefault("Solocraft.GrimBatolH", 5.0) },
|
||
{669, sConfigMgr->GetIntDefault("Solocraft.BlackwingDescentH", 25.0) },
|
||
{671, sConfigMgr->GetIntDefault("Solocraft.TheBastionOfTwilightH", 25.0) },
|
||
{754, sConfigMgr->GetIntDefault("Solocraft.ThroneOfTheFourWindsH", 25.0) },
|
||
{757, sConfigMgr->GetIntDefault("Solocraft.BaradinHoldH", 25.0) },
|
||
{720, sConfigMgr->GetIntDefault("Solocraft.FirelandsH", 25.0) },
|
||
{967, sConfigMgr->GetIntDefault("Solocraft.DragonSoulH", 25.0) },
|
||
{938, sConfigMgr->GetIntDefault("Solocraft.EndTimeH", 5.0) },
|
||
{939, sConfigMgr->GetIntDefault("Solocraft.WellOfEternityH", 5.0) },
|
||
{940, sConfigMgr->GetIntDefault("Solocraft.HourOfTwilightH", 5.0) },
|
||
{859, sConfigMgr->GetIntDefault("Solocraft.Zul'gurubH", 5.0) },
|
||
{568, sConfigMgr->GetIntDefault("Solocraft.ZulAmanH", 5.0) },
|
||
{576, sConfigMgr->GetIntDefault("Solocraft.NexusH", 5.0) },
|
||
/// MISTS OF PANDARIA
|
||
{959, sConfigMgr->GetIntDefault("Solocraft.ShadoPanMonasteryH", 5.0) },
|
||
{1007, sConfigMgr->GetIntDefault("Solocraft.ScholomanceH", 5.0) },
|
||
{1004, sConfigMgr->GetIntDefault("Solocraft.ScarletMonasteryH", 5.0) },
|
||
{994, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanPalaceH", 5.0) },
|
||
{1008, sConfigMgr->GetIntDefault("Solocraft.Mogu'shanVaultsH", 25.0) },
|
||
{1136, sConfigMgr->GetIntDefault("Solocraft.SiegeOfOrgrimmarH", 25.0) },
|
||
{1098, sConfigMgr->GetIntDefault("Solocraft.ThroneOfThunderH", 25.0) },
|
||
{1009, sConfigMgr->GetIntDefault("Solocraft.HeartOfFearH", 25.0) },
|
||
{996, sConfigMgr->GetIntDefault("Solocraft.TerraceOfEndlessSpringH", 25.0) },
|
||
{1001, sConfigMgr->GetIntDefault("Solocraft.ScarletHallsH", 5.0) },
|
||
{962, sConfigMgr->GetIntDefault("Solocraft.GateOfTheSettingSunH", 5.0) },
|
||
{1011, sConfigMgr->GetIntDefault("Solocraft.SiegeOfNiuzaoTempleH", 5.0) },
|
||
{960, sConfigMgr->GetIntDefault("Solocraft.TempleOfTheJadeSerpentH", 5.0) },
|
||
{961, sConfigMgr->GetIntDefault("Solocraft.StormstoutBreweryH", 5.0) },
|
||
};
|
||
|
||
D649H10 = sConfigMgr->GetFloatDefault("Solocraft.ArgentTournamentRaidH10", 10.0); // Trial of the Crusader 10 Heroic
|
||
D649H25 = sConfigMgr->GetFloatDefault("Solocraft.ArgentTournamentRaidH25", 25.0); // Trial of the Crusader 25 Heroic
|
||
|
||
}
|
||
|
||
|
||
public:
|
||
bool SoloCraftEnable = false;
|
||
bool SoloCraftAnnounceModule = true;
|
||
bool SoloCraftDebuffEnable = true;
|
||
bool SolocraftXPBalancingEnabled = true;
|
||
bool SolocraftXPEnabled = true;
|
||
bool SolocraftNoXPFlag = false;
|
||
|
||
float SoloCraftSpellMult = 1.0;
|
||
float SoloCraftStatsMult = 100.0;
|
||
float SoloCraftXPMod = 1.0;
|
||
|
||
uint32 SolocraftLevelDiff = 1;
|
||
uint32 SolocraftDungeonLevel = 1;
|
||
|
||
std::unordered_map<uint32, uint32> dungeons;
|
||
std::unordered_map<uint32, float> diff_Multiplier;
|
||
std::unordered_map<uint32, float> diff_Multiplier_Heroics;
|
||
std::unordered_map<uint8, uint32> classes;
|
||
|
||
float D5 = 1.0;
|
||
float D10 = 1.0;
|
||
float D25 = 1.0;
|
||
float D40 = 1.0;
|
||
float D649H10 = 1.0;
|
||
float D649H25 = 1.0;
|
||
};
|
||
|
||
class solocraft_system_announce : public PlayerScript
|
||
{
|
||
public:
|
||
solocraft_system_announce() : PlayerScript("solocraft_system_announce")
|
||
{
|
||
solocraftConfig = SolocraftConfig::getInstance();
|
||
}
|
||
|
||
void OnLogin(Player* player) override
|
||
{
|
||
if (solocraftConfig.SoloCraftEnable && solocraftConfig.SoloCraftAnnounceModule)
|
||
{
|
||
ChatHandler(player->GetSession()).SendSysMessage(player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_ACTIVE));
|
||
}
|
||
}
|
||
|
||
void OnLogout(Player* player) override
|
||
{
|
||
QueryResult result = CharacterDatabase.PQuery("SELECT `GUID` FROM `custom_solocraft_character_stats` WHERE GUID = %u", player->GetGUID());
|
||
if (result)
|
||
{
|
||
CharacterDatabase.PExecute("DELETE FROM custom_solocraft_character_stats WHERE GUID = %u", player->GetGUID());
|
||
}
|
||
}
|
||
|
||
void OnGiveXP(Player* /*player*/, uint32& amount, Unit* /*victim*/) override
|
||
{
|
||
if (solocraftConfig.SolocraftXPBalancingEnabled)
|
||
{
|
||
amount = uint32(amount * solocraftConfig.SoloCraftXPMod);
|
||
}
|
||
}
|
||
|
||
protected:
|
||
SolocraftConfig solocraftConfig;
|
||
};
|
||
|
||
class solocraft_system_player_instance_handler : public PlayerScript
|
||
{
|
||
public:
|
||
solocraft_system_player_instance_handler() : PlayerScript("solocraft_system_player_instance_handler")
|
||
{
|
||
solocraftConfig = SolocraftConfig::getInstance();
|
||
}
|
||
|
||
void OnMapChanged(Player* player) override
|
||
{
|
||
if (solocraftConfig.SoloCraftEnable)
|
||
{
|
||
Map* map = player->GetMap();
|
||
float difficulty = CalculateDifficulty(map, player);
|
||
int dunLevel = CalculateDungeonLevel(map, player);
|
||
int numInGroup = GetNumInGroup(player);
|
||
uint32 classBalance = GetClassBalance(player);
|
||
ApplyBuffs(player, map, difficulty, dunLevel, numInGroup, classBalance);
|
||
}
|
||
}
|
||
|
||
private:
|
||
std::map<uint32, float> _unitDifficulty;
|
||
protected:
|
||
SolocraftConfig solocraftConfig;
|
||
bool noXPGainFlag = false; // if noXPGainFlag before solocraft setting
|
||
|
||
int CalculateDifficulty(Map* map, Player* /*player*/)
|
||
{
|
||
if (map)
|
||
{
|
||
if (map->Is25ManRaid())
|
||
{
|
||
if (map->IsHeroic() && map->GetId() == 649)
|
||
{
|
||
return solocraftConfig.D649H25;
|
||
}
|
||
else if (solocraftConfig.diff_Multiplier_Heroics.find(map->GetId()) == solocraftConfig.diff_Multiplier_Heroics.end())
|
||
{
|
||
return solocraftConfig.D25;
|
||
}
|
||
else
|
||
return solocraftConfig.diff_Multiplier_Heroics[map->GetId()];
|
||
}
|
||
|
||
if (map->IsHeroic())
|
||
{
|
||
if (map->GetId() == 649)
|
||
{
|
||
return solocraftConfig.D649H10;
|
||
}
|
||
else if (solocraftConfig.diff_Multiplier_Heroics.find(map->GetId()) == solocraftConfig.diff_Multiplier_Heroics.end())
|
||
{
|
||
return solocraftConfig.D10;
|
||
}
|
||
else
|
||
return solocraftConfig.diff_Multiplier_Heroics[map->GetId()];
|
||
}
|
||
|
||
if (solocraftConfig.diff_Multiplier.find(map->GetId()) == solocraftConfig.diff_Multiplier.end())
|
||
{
|
||
if (map->IsDungeon())
|
||
{
|
||
return solocraftConfig.D5;
|
||
}
|
||
else if (map->IsRaid())
|
||
{
|
||
return solocraftConfig.D40;
|
||
}
|
||
}
|
||
else
|
||
return solocraftConfig.diff_Multiplier[map->GetId()];
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int CalculateDungeonLevel(Map* map, Player* /*player*/)
|
||
{
|
||
if (solocraftConfig.dungeons.find(map->GetId()) == solocraftConfig.dungeons.end())
|
||
{
|
||
return solocraftConfig.SolocraftDungeonLevel;
|
||
}
|
||
else
|
||
return solocraftConfig.dungeons[map->GetId()];
|
||
}
|
||
|
||
int GetNumInGroup(Player* player)
|
||
{
|
||
int numInGroup = 1;
|
||
Group* group = player->GetGroup();
|
||
|
||
if (group)
|
||
{
|
||
Group::MemberSlotList const& groupMembers = group->GetMemberSlots();
|
||
numInGroup = groupMembers.size();
|
||
}
|
||
return numInGroup;
|
||
}
|
||
|
||
uint32 GetClassBalance(Player* player)
|
||
{
|
||
uint32 classBalance = 100;
|
||
|
||
if (solocraftConfig.classes.find(player->getClass()) == solocraftConfig.classes.end())
|
||
{
|
||
return classBalance;
|
||
}
|
||
else if (solocraftConfig.classes[player->getClass()] <= 100)
|
||
{
|
||
return solocraftConfig.classes[player->getClass()];
|
||
}
|
||
else
|
||
return classBalance;
|
||
}
|
||
|
||
void ApplyBuffs(Player* player, Map* map, float difficulty, int dunLevel, int numInGroup, int classBalance)
|
||
{
|
||
if (difficulty != 0)
|
||
{
|
||
|
||
int SpellPowerBonus = 0;
|
||
|
||
if (player->HasFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN))
|
||
{
|
||
noXPGainFlag = true;
|
||
}
|
||
|
||
if (player->GetLevel() <= dunLevel + solocraftConfig.SolocraftLevelDiff)
|
||
{
|
||
float GroupDifficulty = GetGroupDifficulty(player);
|
||
|
||
if (GroupDifficulty >= difficulty && solocraftConfig.SoloCraftDebuffEnable)
|
||
{
|
||
difficulty = (-abs(difficulty)) + ((((float)classBalance / 100) * difficulty) / numInGroup);
|
||
difficulty = roundf(difficulty * 100) / 100;
|
||
|
||
if (!player->HasFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN) && solocraftConfig.SolocraftXPBalancingEnabled)
|
||
{
|
||
player->SetFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN);
|
||
}
|
||
}
|
||
|
||
QueryResult result = CharacterDatabase.PQuery("SELECT `GUID`, `Difficulty`, `GroupSize`, `SpellPower`, `Stats` FROM `custom_solocraft_character_stats` WHERE GUID = %u", player->GetGUID());
|
||
|
||
for (int32 i = STAT_STRENGTH; i < MAX_STATS; ++i)
|
||
{
|
||
if (result)
|
||
{
|
||
player->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_VALUE, (*result)[1].GetFloat() * (*result)[4].GetFloat(), false);
|
||
}
|
||
|
||
player->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_VALUE, difficulty * solocraftConfig.SoloCraftStatsMult, true);
|
||
}
|
||
|
||
player->SetFullHealth();
|
||
player->CastSpell(player, 6962, true);
|
||
|
||
if (player->GetPowerType() == POWER_MANA || player->getClass() == 11)
|
||
{
|
||
player->SetPower(POWER_MANA, player->GetMaxPower(POWER_MANA));
|
||
|
||
if (result)
|
||
{
|
||
player->ApplySpellPowerBonus((*result)[3].GetUInt32() * (*result)[4].GetFloat(), false);
|
||
}
|
||
|
||
if (difficulty > 0)
|
||
{
|
||
SpellPowerBonus = static_cast<int>((player->GetLevel() * solocraftConfig.SoloCraftSpellMult) * difficulty);
|
||
player->ApplySpellPowerBonus(SpellPowerBonus, true);
|
||
}
|
||
}
|
||
|
||
if (!solocraftConfig.SolocraftXPEnabled)
|
||
{
|
||
if (!player->HasFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN))
|
||
{
|
||
player->SetFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN);
|
||
}
|
||
}
|
||
|
||
if (difficulty > 0)
|
||
{
|
||
|
||
const char* solocraft_enabled = player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_ENABLED);
|
||
const char* solocraft_disabled = player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_DISABLED);
|
||
ChatHandler(player->GetSession()).PSendSysMessage(player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_STATUS), player->GetName().c_str(), map->GetMapName(), difficulty, SpellPowerBonus, classBalance, solocraftConfig.SolocraftXPEnabled?solocraft_enabled:solocraft_disabled, solocraftConfig.SolocraftXPBalancingEnabled?solocraft_enabled:solocraft_disabled);
|
||
//|cffFF0000[SoloCraft]|r |cffFF8000 %s entered %s - Difficulty Offset: %0.2f. Spellpower Bonus: %i. Class Balance Weight: %i. XP Gain: |cffFF0000%s XP Balancing:%s |cff4CFF00%s
|
||
|
||
}
|
||
else
|
||
{
|
||
ChatHandler(player->GetSession()).PSendSysMessage(player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_ERR_GROUP_ALREADY_BUFFED), player->GetName().c_str(), map->GetMapName(), difficulty, classBalance);
|
||
// |cffFF0000[SoloCraft]|r |cffFF8000 %s entered %s - |cffFF0000BE ADVISED - You have been debuffed by offset: %0.2f with a Class Balance Weight: %i. |cffFF8000A group member already inside has the dungeon's full buff offset. No Spellpower buff will be applied to spell casters. ALL group members must exit the dungeon and re-enter to receive a balanced offset.
|
||
}
|
||
|
||
CharacterDatabase.PExecute("REPLACE INTO `custom_solocraft_character_stats` (`GUID`, `Difficulty`, `GroupSize`, `SpellPower`, `Stats`) VALUES (%u, %f, %u, %i, %f)", player->GetGUID(), difficulty, numInGroup, SpellPowerBonus, solocraftConfig.SoloCraftStatsMult);
|
||
}
|
||
else
|
||
{
|
||
ChatHandler(player->GetSession()).PSendSysMessage(player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_ERR_LEVEL_TOO_HIGH), player->GetName().c_str(), map->GetMapName(), dunLevel + solocraftConfig.SolocraftLevelDiff);
|
||
ClearBuffs(player, map);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ClearBuffs(player, map);
|
||
}
|
||
}
|
||
|
||
float GetGroupDifficulty(Player* player)
|
||
{
|
||
float GroupDifficulty = 0.0;
|
||
Group* group = player->GetGroup();
|
||
|
||
if (group)
|
||
{
|
||
Group::MemberSlotList const& groupMembers = group->GetMemberSlots();
|
||
|
||
for (Group::member_citerator itr = groupMembers.begin(); itr != groupMembers.end(); ++itr)
|
||
{
|
||
if (itr->guid != player->GetGUID())
|
||
{
|
||
QueryResult result = CharacterDatabase.PQuery("SELECT `GUID`, `Difficulty`, `GroupSize` FROM `custom_solocraft_character_stats` WHERE GUID = %u", itr->guid);
|
||
|
||
if (result)
|
||
{
|
||
if ((*result)[1].GetFloat() > 0)
|
||
{
|
||
GroupDifficulty = GroupDifficulty + (*result)[1].GetFloat();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return GroupDifficulty;
|
||
}
|
||
|
||
void ClearBuffs(Player* player, Map* map)
|
||
{
|
||
QueryResult result = CharacterDatabase.PQuery("SELECT `GUID`, `Difficulty`, `GroupSize`, `SpellPower`, `Stats` FROM `custom_solocraft_character_stats` WHERE GUID = %u", player->GetGUID());
|
||
|
||
if (result)
|
||
{
|
||
float difficulty = (*result)[1].GetFloat();
|
||
int SpellPowerBonus = (*result)[3].GetUInt32();
|
||
float StatsMultPct = (*result)[4].GetFloat();
|
||
|
||
ChatHandler(player->GetSession()).PSendSysMessage(player->GetSession()->GetTrinityString(SOLOCRAFT_TRINITYSTRING_CLEAR_BUFFS), player->GetName().c_str(), map->GetMapName(), difficulty, SpellPowerBonus);
|
||
|
||
for (int32 i = STAT_STRENGTH; i < MAX_STATS; ++i)
|
||
{
|
||
player->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_VALUE, difficulty * StatsMultPct, false);
|
||
}
|
||
|
||
if (player->GetPowerType() == POWER_MANA && difficulty > 0)
|
||
{
|
||
player->ApplySpellPowerBonus(SpellPowerBonus, false);
|
||
}
|
||
|
||
if (player->HasFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN) && !noXPGainFlag && !solocraftConfig.SolocraftNoXPFlag)
|
||
{
|
||
player->RemoveFlag(PLAYER_FIELD_PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN);
|
||
}
|
||
|
||
CharacterDatabase.PExecute("DELETE FROM `custom_solocraft_character_stats` WHERE GUID = %u", player->GetGUID());
|
||
}
|
||
}
|
||
};
|
||
|
||
void AddSC_solocraft_system()
|
||
{
|
||
new solocraft_system_announce();
|
||
new solocraft_system_player_instance_handler();
|
||
}
|