eluna-scripts-ornfelt/lua/WowEmulationScriptPack/patch/choices/2016_03_23-GuildLevelSystem.patch
2024-09-23 07:59:23 +02:00

991 lines
38 KiB
Diff

From 3f54ea4a2667200281ccdeb70f24f01c9f821564 Mon Sep 17 00:00:00 2001
From: LordPsyan <realmsofwarcraft@gmail.com>
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<ComparisionType>(ConditionValue2), static_cast<uint32>(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 <cmath>
@@ -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<std::future<PreparedQueryResult>> 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<ChatCommand> 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