From 3f54ea4a2667200281ccdeb70f24f01c9f821564 Mon Sep 17 00:00:00 2001 From: LordPsyan Date: Wed, 23 Mar 2016 10:52:19 -0500 Subject: [PATCH] 2016_03_23-GuildLevelSystem --- .../GuildLevelSystem/auth_guild_level_system.sql | 7 + .../characters_guild_level_system.sql | 55 ++++++++ .../GuildLevelSystem/world_guild_level_system.sql | 7 + .../Database/Implementation/CharacterDatabase.cpp | 10 +- .../Database/Implementation/CharacterDatabase.h | 7 +- src/server/game/Accounts/RBAC.h | 4 +- src/server/game/Conditions/ConditionMgr.cpp | 22 ++++ src/server/game/Conditions/ConditionMgr.h | 3 +- src/server/game/Entities/Player/Player.cpp | 42 +++++- src/server/game/Entities/Unit/Unit.cpp | 22 +++- src/server/game/Guilds/Guild.cpp | 144 +++++++++++++++++++++ src/server/game/Guilds/Guild.h | 37 ++++++ src/server/game/Handlers/LootHandler.cpp | 11 ++ src/server/game/Miscellaneous/Formulas.h | 12 +- src/server/game/Miscellaneous/Language.h | 4 +- src/server/game/Reputation/ReputationMgr.cpp | 10 ++ src/server/game/World/World.cpp | 87 ++++++++++++- src/server/game/World/World.h | 20 +++ src/server/scripts/Commands/cs_guild.cpp | 121 +++++++++++++++++ 19 files changed, 613 insertions(+), 12 deletions(-) create mode 100644 sql/TrinityCore-Patches/GuildLevelSystem/auth_guild_level_system.sql create mode 100644 sql/TrinityCore-Patches/GuildLevelSystem/characters_guild_level_system.sql create mode 100644 sql/TrinityCore-Patches/GuildLevelSystem/world_guild_level_system.sql diff --git a/sql/TrinityCore-Patches/GuildLevelSystem/auth_guild_level_system.sql b/sql/TrinityCore-Patches/GuildLevelSystem/auth_guild_level_system.sql new file mode 100644 index 0000000..0846910 --- /dev/null +++ b/sql/TrinityCore-Patches/GuildLevelSystem/auth_guild_level_system.sql @@ -0,0 +1,7 @@ +INSERT INTO `rbac_permissions` VALUES ('1000', 'Command: guild linfo'); +INSERT INTO `rbac_permissions` VALUES ('1001', 'Command: guild setlevel'); +INSERT INTO `rbac_permissions` VALUES ('1002', 'Command: guild givexp'); + +INSERT INTO `rbac_linked_permissions` VALUES ('195', '1000'); +INSERT INTO `rbac_linked_permissions` VALUES ('192', '1001'); +INSERT INTO `rbac_linked_permissions` VALUES ('192', '1002'); diff --git a/sql/TrinityCore-Patches/GuildLevelSystem/characters_guild_level_system.sql b/sql/TrinityCore-Patches/GuildLevelSystem/characters_guild_level_system.sql new file mode 100644 index 0000000..ae05ff6 --- /dev/null +++ b/sql/TrinityCore-Patches/GuildLevelSystem/characters_guild_level_system.sql @@ -0,0 +1,55 @@ +ALTER TABLE `guild` ADD `xp` INT(10) DEFAULT 0 NOT NULL AFTER `BankMoney`; +ALTER TABLE `guild` ADD `level` TINYINT(3) DEFAULT 0 NOT NULL AFTER `xp`; + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for `guild_bonus_config` +-- ---------------------------- +DROP TABLE IF EXISTS `guild_bonus_config`; +CREATE TABLE `guild_bonus_config` ( + `BonusId` smallint(5) NOT NULL DEFAULT '0', + `RequiredGuildLevel` tinyint(3) NOT NULL DEFAULT '0', + `comment` longtext CHARACTER SET utf8 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- ---------------------------- +-- Records of guild_bonus_config +-- ---------------------------- +INSERT INTO `guild_bonus_config` VALUES ('1', '1', 'Goldbonus | 5% Bonus gold for the guild bank'); +INSERT INTO `guild_bonus_config` VALUES ('2', '1', 'XP-Bonus | +5% XP at the end of quest or kill monsters'); +INSERT INTO `guild_bonus_config` VALUES ('3', '2', 'Faster Spirit | Double movement speed as spirit'); +INSERT INTO `guild_bonus_config` VALUES ('4', '2', 'Cheap repair | -25% Repair costs'); +INSERT INTO `guild_bonus_config` VALUES ('5', '3', 'Goldbonus-2 | 10% Bonus gold for the guild bank'); +INSERT INTO `guild_bonus_config` VALUES ('6', '4', 'Riding Pace | +5% Riding pace (Except Battlegrounds and Arenas)'); +INSERT INTO `guild_bonus_config` VALUES ('7', '4', 'Good Relationships | +5% Reputation gain'); +INSERT INTO `guild_bonus_config` VALUES ('8', '5', 'XP-Bonus-2 | +10% XP at the end of quest or kill monsters'); +INSERT INTO `guild_bonus_config` VALUES ('9', '6', 'Cheap Repair-2 | -50% Repair costs'); +INSERT INTO `guild_bonus_config` VALUES ('10', '6', 'Riding Pace-2 | +10% Riding pace (Except Battlegrounds and Arenas)'); +INSERT INTO `guild_bonus_config` VALUES ('11', '7', 'Good Relationships-2 | +10% Reputation gain'); +INSERT INTO `guild_bonus_config` VALUES ('12', '5', 'Bonus Honor | +5% Honor'); +INSERT INTO `guild_bonus_config` VALUES ('13', '8', 'Bonus Honor-2 | +10% Honor'); + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for `guild_xp_for_next_level` +-- ---------------------------- +DROP TABLE IF EXISTS `guild_xp_for_next_level`; +CREATE TABLE `guild_xp_for_next_level` ( + `level` tinyint(3) NOT NULL DEFAULT '0', + `xp_for_next_level` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`level`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- ---------------------------- +-- Records of guild_xp_for_next_level +-- ---------------------------- +INSERT INTO `guild_xp_for_next_level` VALUES ('0', '8000000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('1', '12000000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('2', '18000000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('3', '27000000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('4', '40500000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('5', '60750000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('6', '91125000'); +INSERT INTO `guild_xp_for_next_level` VALUES ('7', '136687500'); \ No newline at end of file diff --git a/sql/TrinityCore-Patches/GuildLevelSystem/world_guild_level_system.sql b/sql/TrinityCore-Patches/GuildLevelSystem/world_guild_level_system.sql new file mode 100644 index 0000000..fcf2396 --- /dev/null +++ b/sql/TrinityCore-Patches/GuildLevelSystem/world_guild_level_system.sql @@ -0,0 +1,7 @@ +DELETE FROM `trinity_string` WHERE `entry` IN (13000, 13001); +INSERT INTO `trinity_string` VALUES ('13000', 'Guild Level: %u.', null, null, null, null, null, null, null, null); +INSERT INTO `trinity_string` VALUES ('13001', 'Guild Experience: %u/%u.', null, null, null, null, null, null, null, null); +DELETE FROM `command` WHERE `permission` IN (1000, 1001, 1002); +INSERT INTO `command` VALUES ('guild linfo', '1000', 'Syntax: .guild linfo'); +INSERT INTO `command` VALUES ('guild setlevel', '1001', 'Syntax: .guild setlevel $GuildName $Level'); +INSERT INTO `command` VALUES ('guild givexp', '1002', 'Syntax: .guild givexp $GuildName $Xp'); \ No newline at end of file diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index fb6fd68..2f2e5b0 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -618,7 +618,15 @@ void CharacterDatabaseConnection::DoPrepareStatements() // Prepatch by LordPsyan // 01 // 02 - // 03 + //Guild-Level-System + //Load + PrepareStatement(CHAR_SEL_GUILD_BONUS_INFO, "SELECT RequiredGuildLevel FROM guild_bonus_config WHERE BonusId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_LEVEL_INFO, "SELECT xp, level FROM guild WHERE guildid = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_XP_FOR_NEXT_LEVEL, "SELECT xp_for_next_level FROM guild_xp_for_next_level WHERE level = ?", CONNECTION_SYNCH); + + //Save + PrepareStatement(CHAR_UPD_GUILD_LEVEL, "UPDATE guild SET level = ? WHERE guildid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_GUILD_XP, "UPDATE guild SET xp = (xp + ?) WHERE guildid = ?", CONNECTION_ASYNC); // 04 // 05 // 06 diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 8490609..5613bb9 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -536,7 +536,12 @@ enum CharacterDatabaseStatements // Prepatch by LordPsyan // 01 // 02 - // 03 + //Guild-Level-System + CHAR_SEL_GUILD_BONUS_INFO, + CHAR_SEL_GUILD_LEVEL_INFO, + CHAR_SEL_GUILD_XP_FOR_NEXT_LEVEL, + CHAR_UPD_GUILD_LEVEL, + CHAR_UPD_GUILD_XP, // 04 // 05 // 06 diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 98152af..4f9ce50 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -700,7 +700,9 @@ enum RBACPermissions // custom permissions 1000+ // Prepatch by LordPsyan - // 01 + RBAC_PERM_COMMAND_GUILD_LINFO = 1000, + RBAC_PERM_COMMAND_GUILD_SET_LEVEL = 1001, + RBAC_PERM_COMMAND_GUILD_GIVE_XP = 1002, // 02 // 03 // 04 diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 50e3e64..4eefbd7 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -27,6 +27,7 @@ #include "ScriptMgr.h" #include "SpellAuras.h" #include "SpellMgr.h" +#include "Guild.h" char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX] = { @@ -448,6 +449,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const } break; } + case CONDITION_GUILD_LEVEL: + { + if (Player* player = object->ToPlayer()) + if (Guild* guild = player->GetGuild()) + condMeets = CompareValues(static_cast(ConditionValue2), static_cast(guild->GetLevel()), ConditionValue1); + break; + } default: condMeets = false; break; @@ -621,6 +629,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const case CONDITION_STAND_STATE: mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_GUILD_LEVEL: + mask |= GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -2145,6 +2156,17 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } break; } + case CONDITION_GUILD_LEVEL: + { + if (cond->ConditionValue2 >= COMP_TYPE_MAX) + { + TC_LOG_ERROR("sql.sql", "Guildlevel condition has invalid option (%u), skipped", cond->ConditionValue2); + return false; + } + if (cond->ConditionValue3) + TC_LOG_ERROR("sql.sql", "Guildlevel condition has useless data in value3 (%u)!", cond->ConditionValue3); + break; + } default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 0b49552..aaf5c6b 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -73,7 +73,8 @@ enum ConditionTypes CONDITION_IN_WATER = 40, // 0 0 0 true if unit in water CONDITION_TERRAIN_SWAP = 41, // only for 6.x CONDITION_STAND_STATE = 42, // stateType state 0 true if unit matches specified sitstate (0,x: has exactly state x; 1,0: any standing state; 1,1: any sitting state;) - CONDITION_MAX = 43 // MAX + CONDITION_GUILD_LEVEL = 43, // Guildlevel Level match_type + CONDITION_MAX = 44 // MAX }; /*! Documentation on implementing a new ConditionSourceType: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1b9482f..a009601 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4685,6 +4685,12 @@ void Player::BuildPlayerRepop() // convert player body to ghost SetHealth(1); + //Guild-Level-System (Bonus: Faster spirit) + if (!GetMap()->IsBattlegroundOrArena()) + if (Guild* guild = GetGuild()) + if (guild->HasLevelForBonus(GUILD_BONUS_SCHNELLER_GEIST)) + SetSpeed(MOVE_RUN, 2.0f, true); + SetMovement(MOVE_WATER_WALK); if (!GetSession()->isLogingOut()) SetMovement(MOVE_UNROOT); @@ -4733,6 +4739,9 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) SetMovement(MOVE_LAND_WALK); SetMovement(MOVE_UNROOT); + //Guild-Level-System (Bonus: Faster spirit) + SetSpeed(MOVE_RUN, 1.0f, true); + m_deathTimer = 0; // set health/powers (0- will be set in caller) @@ -5077,6 +5086,15 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST)); + //Guild-Level-System (Bonus: Guenstige Reperatur) + if (Guild* guild = GetGuild()) + { + if (guild->HasLevelForBonus(GUILD_BONUS_REPERATUR_1)) + costs -= uint32(costs*0.25f); + if (guild->HasLevelForBonus(GUILD_BONUS_REPERATUR_2)) + costs -= uint32(costs*0.5f); + } + if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT costs = 1; @@ -6886,7 +6904,16 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto // 21 // 22 // 23 - // 24 + + //Guild-Level-System (Bonus: Ehre) + if (Guild* guild = GetGuild()) + { + if (guild->HasLevelForBonus(GUILD_BONUS_EHRE_1)) + honor_f *= 0.05f; + if (guild->HasLevelForBonus(GUILD_BONUS_EHRE_2)) + honor_f *= 0.1f; + } + // 25 // 26 // 27 @@ -15043,7 +15070,18 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // Prepatch by LordPsyan // 41 // 42 - // 43 + //Guild-Level-System (Bonus: QuestXP) + if (Guild* guild = GetGuild()) + { + //QuestXP for the Guild + guild->GiveXp(50000); + + //GuildXP-Bonus + if (guild->HasLevelForBonus(GUILD_BONUS_XP_1)) + XP += uint32(XP*0.05f); + if (guild->HasLevelForBonus(GUILD_BONUS_XP_2)) + XP += uint32(XP*0.1f); + } // 44 // 45 // 46 diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 96ccc2c..6f17ca3 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -63,6 +63,7 @@ #include "World.h" #include "WorldPacket.h" #include "WorldSession.h" +#include "Guild.h" #include @@ -12308,6 +12309,23 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) float stack_bonus = 1.0f; float non_stack_bonus = 1.0f; + //Guild-Level-System (Bonus: Reittempo) + uint8 bonusSpeed = 0; + if (GetTypeId() == TYPEID_PLAYER) + { + Player* player = ToPlayer(); + if (Guild* guild = player->GetGuild()) + { + if (!player->GetMap()->IsBattlegroundOrArena()) + { + if (guild->HasLevelForBonus(GUILD_BONUS_REITTEMPO_1)) + bonusSpeed = 5; + if (guild->HasLevelForBonus(GUILD_BONUS_REITTEMPO_2)) + bonusSpeed = 10; + } + } + } + switch (mtype) { // Only apply debuffs @@ -12321,7 +12339,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { if (IsMounted()) // Use on mount auras { - main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED); + main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) + bonusSpeed; stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS); non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK) / 100.0f; } @@ -12355,7 +12373,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) } else if (IsMounted()) { - main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); + main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) + bonusSpeed; stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS); } else // Use not mount (shapeshift for example) auras (should stack) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 87494e7..c6bca4f 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1207,6 +1207,9 @@ bool Guild::Create(Player* pLeader, std::string const& name) if (ret) sScriptMgr->OnGuildCreate(this, pLeader, name); + //Guild-Level-System + LoadLevelInfo(); + return ret; } @@ -1958,6 +1961,10 @@ bool Guild::LoadFromDB(Field* fields) m_bankTabs[i] = new BankTab(m_id, i); _CreateLogHolders(); + + //Guild-Level-System + LoadLevelInfo(); + return true; } @@ -2925,3 +2932,140 @@ void Guild::ResetTimes() _BroadcastEvent(GE_BANK_TAB_AND_MONEY_UPDATED, ObjectGuid::Empty); } + +//Guild-Level-System [Start] +void Guild::LoadLevelInfo() +{ + PreparedStatement* stmt; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_LEVEL_INFO); + stmt->setUInt32(0, m_id); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + { + m_current_guildXp = (*result)[0].GetUInt32(); + m_guild_level = (*result)[1].GetUInt8(); + } + else + { + m_current_guildXp = 0; + m_guild_level = 0; + } + + if (m_guild_level < GUILD_MAX_LEVEL) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_XP_FOR_NEXT_LEVEL); + stmt->setUInt32(0, m_guild_level); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + m_xp_for_next_level = (*result)[0].GetUInt32(); + else + m_xp_for_next_level = 0; + } +} + +bool Guild::HasLevelForBonus(uint8 guildBonus) +{ + switch (guildBonus) + { + case GUILD_BONUS_GOLD_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_GOLD_1); + break; + case GUILD_BONUS_XP_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_XP_1); + break; + case GUILD_BONUS_SCHNELLER_GEIST: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_SCHNELLER_GEIST); + break; + case GUILD_BONUS_REPERATUR_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_REPERATUR_1); + break; + case GUILD_BONUS_GOLD_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_GOLD_2); + break; + case GUILD_BONUS_REITTEMPO_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_REITTEMPO_1); + break; + case GUILD_BONUS_RUF_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_RUF_1); + break; + case GUILD_BONUS_XP_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_XP_2); + break; + case GUILD_BONUS_REPERATUR_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_REPERATUR_2); + break; + case GUILD_BONUS_REITTEMPO_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_REITTEMPO_2); + break; + case GUILD_BONUS_RUF_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_RUF_2); + break; + case GUILD_BONUS_EHRE_1: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_EHRE_1); + break; + case GUILD_BONUS_EHRE_2: + return m_guild_level >= sWorld->GetReqGuildLevelForBonus(GUILD_BONUS_EHRE_2); + break; + default: + return false; + break; + } +} + +void Guild::GiveXp(uint32 value) +{ + if (m_guild_level > GUILD_MAX_LEVEL) + return; + + if ((m_current_guildXp + value) >= m_xp_for_next_level) + { + m_current_guildXp = ((m_current_guildXp + value) - m_xp_for_next_level); + SetLevel(m_guild_level + 1, false); + } + else + m_current_guildXp += value; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_XP); + stmt->setUInt32(0, value); + stmt->setUInt32(1, m_id); + CharacterDatabase.Execute(stmt); +} + +void Guild::SetLevel(uint8 level, bool byCommand) +{ + if (level > GUILD_MAX_LEVEL) + return; + + m_guild_level = level; + + if (byCommand) + { + m_current_guildXp = 0; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_XP); + stmt->setUInt8(0, m_current_guildXp); + stmt->setUInt32(1, m_id); + CharacterDatabase.Execute(stmt); + } + + char worldMsg[250]; + sprintf(worldMsg, "The Guild %s has reached Guild Level %d.", m_name.c_str(), level); + sWorld->SendWorldText(SERVER_MSG_STRING, worldMsg); + + //Save to DB + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_LEVEL); + stmt->setUInt8(0, level); + stmt->setUInt32(1, m_id); + CharacterDatabase.Execute(stmt); + + //reqXp fuers naechste Level laden + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_XP_FOR_NEXT_LEVEL); + stmt->setUInt32(0, level); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + m_xp_for_next_level = (*result)[0].GetUInt32(); +} +//Guild-Level-System [End] diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 2bc57a7..b274589 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -222,6 +222,29 @@ enum GuildMemberFlags GUILDMEMBER_STATUS_MOBILE = 0x0008, // remote chat from mobile app }; +//Guild-Level-System [Start] +enum GuildBonus +{ + GUILD_BONUS_GOLD_1 = 1, + GUILD_BONUS_XP_1 = 2, + GUILD_BONUS_SCHNELLER_GEIST = 3, + GUILD_BONUS_REPERATUR_1 = 4, + GUILD_BONUS_GOLD_2 = 5, + GUILD_BONUS_REITTEMPO_1 = 6, + GUILD_BONUS_RUF_1 = 7, + GUILD_BONUS_XP_2 = 8, + GUILD_BONUS_REPERATUR_2 = 9, + GUILD_BONUS_REITTEMPO_2 = 10, + GUILD_BONUS_RUF_2 = 11, + GUILD_BONUS_EHRE_1 = 12, + GUILD_BONUS_EHRE_2 = 13, + + GUILD_BONUS_MAX = 14 +}; + +#define GUILD_MAX_LEVEL 8 +//Guild-Level-System [End] + // Emblem info class EmblemInfo { @@ -744,6 +767,15 @@ public: void ResetTimes(); + //Guild-Level-System + void LoadLevelInfo(); + bool HasLevelForBonus(uint8 guildBonus); + void GiveXp(uint32 value); + void SetLevel(uint8 level, bool byCommand); + uint8 GetLevel() const { return m_guild_level; }; + uint32 GetCurrentXP() const { return m_current_guildXp; }; + uint32 GetXpForNextLevel() const { return m_xp_for_next_level; }; + protected: ObjectGuid::LowType m_id; std::string m_name; @@ -764,6 +796,11 @@ protected: LogHolder* m_eventLog; LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; + //Guild-Level-System + uint8 m_guild_level; + uint32 m_current_guildXp; + uint32 m_xp_for_next_level; + private: inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 82fdc2e..52c85fc 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -28,6 +28,7 @@ #include "Player.h" #include "WorldPacket.h" #include "WorldSession.h" +#include "Guild.h" void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData) { @@ -202,6 +203,16 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) SendPacket(&data); } + //Guild-Level-System (Bonus: Gold) + if (Guild* guild = player->GetGuild()) + { + //Extra Gold fuer die Gildenbank + if (guild->HasLevelForBonus(GUILD_BONUS_GOLD_1)) + guild->HandleMemberDepositMoney(this, uint32(loot->gold*0.05f)); + if (guild->HasLevelForBonus(GUILD_BONUS_GOLD_2)) + guild->HandleMemberDepositMoney(this, uint32(loot->gold*0.1f)); + } + loot->gold = 0; // Delete the money loot record from the DB diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 451883c..6a92b38 100644 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -31,7 +31,7 @@ // 04 // 05 // 06 -// 07 +#include "Guild.h" // 08 // 09 // 10 @@ -221,7 +221,15 @@ namespace Trinity // 29 // 30 // 31 - // 32 + //Guild-Level-System (Bonus: MonsterKillXp) + if (Guild* guild = player->GetGuild()) + { + //GuildXP-Bonus + if (guild->HasLevelForBonus(GUILD_BONUS_XP_1)) + gain += uint32(gain*0.05f); + if (guild->HasLevelForBonus(GUILD_BONUS_XP_2)) + gain += uint32(gain*0.1f); + } // 33 // 34 // 35 diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index b5bf85f..6ed74a8 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1191,7 +1191,9 @@ enum TrinityStrings LANG_AUTO_BROADCAST = 11000, LANG_INVALID_REALMID = 11001, // Prepatch by LordPsyan - // 01 + //Guild-Level-System + LANG_GUILDINFO_LEVEL = 13000, + LANG_GUILDINFO_XP_INFO = 13001, // 02 // 03 // 04 diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index fb2873f..461b4a5 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -25,6 +25,7 @@ #include "ObjectMgr.h" #include "ScriptMgr.h" #include "WorldSession.h" +#include "Guild.h" const int32 ReputationMgr::PointsInRank[MAX_REPUTATION_RANK] = {36000, 3000, 3000, 3000, 6000, 12000, 21000, 1000}; @@ -370,6 +371,15 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in standing += itr->second.Standing + BaseRep; } + //Guild-Level-System (Bonus: Ruf) + if (Guild* guild = _player->GetGuild()) + { + if (guild->HasLevelForBonus(GUILD_BONUS_RUF_1)) + standing += uint32(standing*0.05f); + if (guild->HasLevelForBonus(GUILD_BONUS_RUF_2)) + standing += uint32(standing*0.1f); + } + if (standing > Reputation_Cap) standing = Reputation_Cap; else if (standing < Reputation_Bottom) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b185655..84d5798 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1371,7 +1371,8 @@ void World::LoadConfigSettings(bool reload) // 04 // 05 // 06 -// 07 + //Guild-Level-System + LoadGuildBonusInfo(); // 08 // 09 // 10 @@ -3384,6 +3385,90 @@ void World::ReloadRBAC() session->InvalidateRBACData(); } +//Guild-Level-System [Start] +void World::LoadGuildBonusInfo() +{ + //Moechte keinen riesigen Abschnitt in die Worldconf hinzufuegen, deswegen + //soll das ganze ueber eine Tabelle in der CharDB geregelt werden. + //Hier werden die benoetigten Daten geladen. + m_req_guildLevel_gold_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_GOLD_1); + m_req_guildLevel_xp_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_XP_1); + m_req_guildLevel_schneller_geist = SelectReqGuildLevelForBonus(GUILD_BONUS_SCHNELLER_GEIST); + m_req_guildLevel_reperatur_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_REPERATUR_1); + m_req_guildLevel_gold_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_GOLD_2); + m_req_guildLevel_reittempo_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_REITTEMPO_1); + m_req_guildLevel_reputation_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_RUF_1); + m_req_guildLevel_xp_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_XP_2); + m_req_guildLevel_reperatur_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_REPERATUR_2); + m_req_guildLevel_reittempo_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_REITTEMPO_2); + m_req_guildLevel_reputation_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_RUF_2); + m_req_guildLevel_honor_1 = SelectReqGuildLevelForBonus(GUILD_BONUS_EHRE_1); + m_req_guildLevel_honor_2 = SelectReqGuildLevelForBonus(GUILD_BONUS_EHRE_2); +} + +uint8 World::SelectReqGuildLevelForBonus(uint8 guildBonus) +{ + PreparedStatement* stmt; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BONUS_INFO); + stmt->setUInt8(0, guildBonus); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + return (*result)[0].GetUInt8(); + else + return 0; +} + +uint8 World::GetReqGuildLevelForBonus(uint8 guildBonus) +{ + switch (guildBonus) + { + case GUILD_BONUS_GOLD_1: + return m_req_guildLevel_gold_1; + break; + case GUILD_BONUS_GOLD_2: + return m_req_guildLevel_gold_2; + break; + case GUILD_BONUS_EHRE_1: + return m_req_guildLevel_honor_1; + break; + case GUILD_BONUS_EHRE_2: + return m_req_guildLevel_honor_2; + break; + case GUILD_BONUS_REITTEMPO_1: + return m_req_guildLevel_reittempo_1; + break; + case GUILD_BONUS_REITTEMPO_2: + return m_req_guildLevel_reittempo_2; + break; + case GUILD_BONUS_REPERATUR_1: + return m_req_guildLevel_reperatur_1; + break; + case GUILD_BONUS_REPERATUR_2: + return m_req_guildLevel_reperatur_2; + break; + case GUILD_BONUS_RUF_1: + return m_req_guildLevel_reputation_1; + break; + case GUILD_BONUS_RUF_2: + return m_req_guildLevel_reputation_2; + break; + case GUILD_BONUS_SCHNELLER_GEIST: + return m_req_guildLevel_schneller_geist; + break; + case GUILD_BONUS_XP_1: + return m_req_guildLevel_xp_1; + break; + case GUILD_BONUS_XP_2: + return m_req_guildLevel_xp_2; + break; + default: + return 0; + break; + } +} +//Guild-Level-System [End] + void World::RemoveOldCorpses() { m_timers[WUPDATE_CORPSES].SetCurrent(m_timers[WUPDATE_CORPSES].GetInterval()); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 055c6e1..f9edf54 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -876,6 +876,11 @@ class World void RemoveOldCorpses(); + //Guild-Level-System + void LoadGuildBonusInfo(); + uint8 GetReqGuildLevelForBonus(uint8 guildBonus); + uint8 SelectReqGuildLevelForBonus(uint8 guildBonus); + protected: void _UpdateGameTime(); // callback for UpdateRealmCharacters @@ -979,6 +984,21 @@ class World void ProcessQueryCallbacks(); std::deque> m_realmCharCallbacks; + + //Guild-Level-System + uint8 m_req_guildLevel_gold_1; + uint8 m_req_guildLevel_xp_1; + uint8 m_req_guildLevel_schneller_geist; + uint8 m_req_guildLevel_reperatur_1; + uint8 m_req_guildLevel_gold_2; + uint8 m_req_guildLevel_reittempo_1; + uint8 m_req_guildLevel_reputation_1; + uint8 m_req_guildLevel_xp_2; + uint8 m_req_guildLevel_reperatur_2; + uint8 m_req_guildLevel_reittempo_2; + uint8 m_req_guildLevel_reputation_2; + uint8 m_req_guildLevel_honor_1; + uint8 m_req_guildLevel_honor_2; }; extern Realm realm; diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 98fc852..be5dabb 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -45,6 +45,9 @@ public: { "rank", rbac::RBAC_PERM_COMMAND_GUILD_RANK, true, &HandleGuildRankCommand, "" }, { "rename", rbac::RBAC_PERM_COMMAND_GUILD_RENAME, true, &HandleGuildRenameCommand, "" }, { "info", rbac::RBAC_PERM_COMMAND_GUILD_INFO, true, &HandleGuildInfoCommand, "" }, + { "linfo", rbac::RBAC_PERM_COMMAND_GUILD_LINFO, true, &HandleGuildLInfoCommand, "" }, + { "setlevel", rbac::RBAC_PERM_COMMAND_GUILD_SET_LEVEL,true, &HandleGuildSetLevelCommand, "" }, + { "givexp", rbac::RBAC_PERM_COMMAND_GUILD_GIVE_XP, true, &HandleGuildGiveXpCommand, "" }, }; static std::vector commandTable = { @@ -286,6 +289,124 @@ public: handler->PSendSysMessage(LANG_GUILD_INFO_EXTRA_INFO, guild->GetInfo().c_str()); // Extra Information return true; } + + //Guild-Level-System + static bool HandleGuildLInfoCommand(ChatHandler* handler, char const* /*args*/) + { + Guild* guild = handler->GetSession()->GetPlayer()->GetGuild(); + + if (guild) + { + handler->PSendSysMessage(LANG_GUILDINFO_LEVEL, guild->GetLevel()); + + if (guild->GetLevel() >= GUILD_MAX_LEVEL) + handler->PSendSysMessage(LANG_GUILDINFO_XP_INFO, 0, 0); + else + handler->PSendSysMessage(LANG_GUILDINFO_XP_INFO, guild->GetCurrentXP(), guild->GetXpForNextLevel()); + + handler->PSendSysMessage("Active Bonus:"); + + if (guild->GetLevel() > 0) + { + if (guild->HasLevelForBonus(GUILD_BONUS_GOLD_1)) + handler->PSendSysMessage("Gold bonus [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_XP_1)) + handler->PSendSysMessage("Bonus Experience [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_SCHNELLER_GEIST)) + handler->PSendSysMessage("Faster Ghost"); + if (guild->HasLevelForBonus(GUILD_BONUS_REPERATUR_1)) + handler->PSendSysMessage("Cheaper Repairs [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_GOLD_2)) + handler->PSendSysMessage("Gold bonus [Rank 2]"); + if (guild->HasLevelForBonus(GUILD_BONUS_REITTEMPO_1)) + handler->PSendSysMessage("Mount Speed [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_RUF_1)) + handler->PSendSysMessage("Reputation [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_XP_2)) + handler->PSendSysMessage("Bonus Experience [Rank 2]"); + if (guild->HasLevelForBonus(GUILD_BONUS_REPERATUR_2)) + handler->PSendSysMessage("Cheaper Repairs [Rank 2]"); + if (guild->HasLevelForBonus(GUILD_BONUS_REITTEMPO_2)) + handler->PSendSysMessage("Mount Speed [Rank 2]"); + if (guild->HasLevelForBonus(GUILD_BONUS_REPERATUR_2)) + handler->PSendSysMessage("Reputation [Rank 2]"); + if (guild->HasLevelForBonus(GUILD_BONUS_EHRE_1)) + handler->PSendSysMessage("Bonus Honor [Rank 1]"); + if (guild->HasLevelForBonus(GUILD_BONUS_EHRE_2)) + handler->PSendSysMessage("Bonus Honor [Rank 2]"); + } + else + handler->PSendSysMessage("None"); + + return true; + } + else + { + handler->PSendSysMessage("You are not in a guild"); + return false; + } + } + + static bool HandleGuildSetLevelCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* guildNameStr; + char* levelStr; + handler->extractOptFirstArg((char*)args, &guildNameStr, &levelStr); + + if (!levelStr) + return false; + + uint8 newLevel = uint8(atoi(levelStr)); + Guild* guild = sGuildMgr->GetGuildByName(guildNameStr); + + if (guild) + { + if (newLevel > GUILD_MAX_LEVEL) + { + handler->PSendSysMessage("Your guild is max level"); + return false; + } + else + guild->SetLevel(newLevel, true); + } + else + { + handler->PSendSysMessage("There is no guild named [%s] found.", guildNameStr); + return false; + } + + return true; + } + + static bool HandleGuildGiveXpCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* guildNameStr; + char* xpStr; + handler->extractOptFirstArg((char*)args, &guildNameStr, &xpStr); + + if (!xpStr) + return false; + + uint32 value = uint32(atoi(xpStr)); + + Guild* guild = sGuildMgr->GetGuildByName(guildNameStr); + + if (guild) + guild->GiveXp(value); + else + { + handler->PSendSysMessage("There was no guild with the name [%s] found.", guildNameStr); + return false; + } + + return true; + } }; void AddSC_guild_commandscript() -- 2.1.4