diff --git a/data/sql/db-world/2025_11_25_01_mod_guildhouse_locale.sql b/data/sql/db-world/2025_11_25_01_mod_guildhouse_locale.sql new file mode 100644 index 0000000..12fe62c --- /dev/null +++ b/data/sql/db-world/2025_11_25_01_mod_guildhouse_locale.sql @@ -0,0 +1,249 @@ +CREATE TABLE IF NOT EXISTS `mod_guildhouse_locale` ( + `Id` INT UNSIGNED NOT NULL, + `Locale` VARCHAR(4) NOT NULL, + `Text` TEXT NOT NULL, + PRIMARY KEY (`Id`, `Locale`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `mod_guildhouse_locale` (`Id`, `Locale`, `Text`) VALUES +-- 1: Guild creation +(1, 'enUS', 'You now own a guild. You can purchase a Guild House!'), +(1, 'frFR', 'Vous possédez désormais une guilde. Vous pouvez acheter une maison de guilde !'), +(1, 'koKR', '이제 길드를 소유했습니다. 길드 하우스를 구매할 수 있습니다!'), +(1, 'deDE', 'Du besitzt nun eine Gilde. Du kannst ein Gildenhaus kaufen!'), +(1, 'zhCN', '你现在拥有一个公会。你可以购买公会大厅!'), +(1, 'zhTW', '你現在擁有一個公會。你可以購買公會會館!'), +(1, 'esES', 'Ahora eres dueño de una hermandad. ¡Puedes comprar una casa de hermandad!'), +(1, 'esMX', 'Ahora eres dueño de una hermandad. ¡Puedes comprar una casa de hermandad!'), +(1, 'ruRU', 'Теперь вы владеете гильдией. Вы можете приобрести дом гильдии!'), + +-- 2: no guild +(2, 'enUS', 'You are not in a guild.'), +(2, 'frFR', 'Vous n''êtes pas dans une guilde.'), +(2, 'koKR', '당신은 길드에 속해 있지 않습니다.'), +(2, 'deDE', 'Du bist in keiner Gilde.'), +(2, 'zhCN', '你不在任何公会中。'), +(2, 'zhTW', '你目前沒有加入任何公會。'), +(2, 'esES', 'No estás en una hermandad.'), +(2, 'esMX', 'No estás en una hermandad.'), +(2, 'ruRU', 'Вы не состоите в гильдии.'), + +-- 3: The guild does not have a guild house +(3, 'enUS', 'Your guild does not own a Guild House.'), +(3, 'frFR', 'Votre guilde ne possède pas de maison de guilde.'), +(3, 'koKR', '당신의 길드는 길드 하우스를 소유하고 있지 않습니다.'), +(3, 'deDE', 'Deine Gilde besitzt noch kein Gildenhaus.'), +(3, 'zhCN', '你的公会还没有公会大厅。'), +(3, 'zhTW', '你的公會尚未擁有公會會館。'), +(3, 'esES', 'Tu hermandad no posee una casa de hermandad.'), +(3, 'esMX', 'Tu hermandad no posee una casa de hermandad.'), +(3, 'ruRU', 'Ваша гильдия не владеет домом гильдии.'), + +-- 4: Successful sale +(4, 'enUS', 'You have successfully sold your Guild House.'), +(4, 'frFR', 'Vous avez vendu votre maison de guilde avec succès.'), +(4, 'koKR', '길드 하우스를 성공적으로 판매했습니다.'), +(4, 'deDE', 'Du hast dein Gildenhaus erfolgreich verkauft.'), +(4, 'zhCN', '你已成功出售公会大厅。'), +(4, 'zhTW', '你已成功賣掉公會會館。'), +(4, 'esES', 'Has vendido tu casa de hermandad con éxito.'), +(4, 'esMX', 'Has vendido con éxito tu casa de hermandad.'), +(4, 'ruRU', 'Вы успешно продали дом гильдии.'), + +-- 5: sales error +(5, 'enUS', 'There was an error selling your Guild House.'), +(5, 'frFR', 'Une erreur s''est produite lors de la vente de votre maison de guilde.'), +(5, 'koKR', '길드 하우스를 판매하는 동안 오류가 발생했습니다.'), +(5, 'deDE', 'Beim Verkauf deines Gildenhauses ist ein Fehler aufgetreten.'), +(5, 'zhCN', '出售公会大厅时发生错误。'), +(5, 'zhTW', '在出售公會會館時發生錯誤。'), +(5, 'esES', 'Se ha producido un error al vender tu casa de hermandad.'), +(5, 'esMX', 'Ocurrió un error al vender tu casa de hermandad.'), +(5, 'ruRU', 'Произошла ошибка при продаже дома гильдии.'), + +-- 6: Successful purchase +(6, 'enUS', 'You have successfully purchased a Guild House.'), +(6, 'frFR', 'Vous avez acheté une maison de guilde avec succès.'), +(6, 'koKR', '길드 하우스를 성공적으로 구매했습니다.'), +(6, 'deDE', 'Du hast erfolgreich ein Gildenhaus gekauft.'), +(6, 'zhCN', '你已成功购买公会大厅。'), +(6, 'zhTW', '你已成功購買公會會館。'), +(6, 'esES', 'Has comprado una casa de hermandad con éxito.'), +(6, 'esMX', 'Has comprado con éxito una casa de hermandad.'), +(6, 'ruRU', 'Вы успешно приобрели дом гильдии.'), + +-- 7: The guild already owns a house +(7, 'enUS', 'Your guild already has a Guild House.'), +(7, 'frFR', 'Votre guilde possède déjà une maison de guilde.'), +(7, 'koKR', '당신의 길드는 이미 길드 하우스를 소유하고 있습니다.'), +(7, 'deDE', 'Deine Gilde besitzt bereits ein Gildenhaus.'), +(7, 'zhCN', '你的公会已经拥有公会大厅。'), +(7, 'zhTW', '你的公會已經擁有公會會館。'), +(7, 'esES', 'Tu hermandad ya tiene una casa de hermandad.'), +(7, 'esMX', 'Tu hermandad ya tiene una casa de hermandad.'), +(7, 'ruRU', 'Ваша гильдия уже имеет дом гильдии.'), + +-- 8: Command reserved for the guild master +(8, 'enUS', 'You must be the Guild Master of a guild to use this command!'), +(8, 'frFR', 'Vous devez être maître de guilde pour utiliser cette commande !'), +(8, 'koKR', '이 명령을 사용하려면 길드 마스터여야 합니다!'), +(8, 'deDE', 'Du musst Gildenmeister einer Gilde sein, um diesen Befehl zu verwenden!'), +(8, 'zhCN', '你必须是公会会长才能使用这个命令!'), +(8, 'zhTW', '你必須是公會會長才能使用這個指令!'), +(8, 'esES', '¡Debes ser el maestro de hermandad para usar este comando!'), +(8, 'esMX', '¡Debes ser el maestro de hermandad para usar este comando!'), +(8, 'ruRU', 'Вы должны быть гильдмастером, чтобы использовать эту команду!'), + +-- 9: must be in the guild house +(9, 'enUS', 'You must be in your Guild House to use this command!'), +(9, 'frFR', 'Vous devez être dans votre maison de guilde pour utiliser cette commande !'), +(9, 'koKR', '이 명령을 사용하려면 길드 하우스 안에 있어야 합니다!'), +(9, 'deDE', 'Du musst dich in deinem Gildenhaus befinden, um diesen Befehl zu verwenden!'), +(9, 'zhCN', '你必须在你的公会大厅中才能使用这个命令!'), +(9, 'zhTW', '你必須在你的公會會館中才能使用這個指令!'), +(9, 'esES', '¡Debes estar en tu casa de hermandad para usar este comando!'), +(9, 'esMX', '¡Debes estar en tu casa de hermandad para usar este comando!'), +(9, 'ruRU', 'Вы должны находиться в доме гильдии, чтобы использовать эту команду!'), + +-- 10: Butler already present +(10, 'enUS', 'You already have the Guild House Butler!'), +(10, 'frFR', 'Vous avez déjà le majordome de la maison de guilde !'), +(10, 'koKR', '이미 길드 하우스 집사가 있습니다!'), +(10, 'deDE', 'Du hast den Gildenhausdiener bereits!'), +(10, 'zhCN', '你已经拥有公会大厅管家了!'), +(10, 'zhTW', '你已經擁有公會會館管家了!'), +(10, 'esES', '¡Ya tienes el mayordomo de la casa de hermandad!'), +(10, 'esMX', '¡Ya tienes al mayordomo de la casa de hermandad!'), +(10, 'ruRU', 'У вас уже есть дворецкий дома гильдии!'), + +-- 11: Butler added error +(11, 'enUS', 'Something went wrong when adding the Butler.'), +(11, 'frFR', 'Un problème est survenu lors de l''ajout du majordome.'), +(11, 'koKR', '집사를 추가하는 동안 문제가 발생했습니다.'), +(11, 'deDE', 'Beim Hinzufügen des Dieners ist etwas schiefgelaufen.'), +(11, 'zhCN', '添加管家时出现了一些问题。'), +(11, 'zhTW', '新增管家時發生了一些問題。'), +(11, 'esES', 'Algo salió mal al añadir al mayordomo.'), +(11, 'esMX', 'Algo salió mal al agregar al mayordomo.'), +(11, 'ruRU', 'При добавлении дворецкого что-то пошло не так.'), + +-- 12: Combat command +(12, 'enUS', 'You can''t use this command while in combat!'), +(12, 'frFR', 'Vous ne pouvez pas utiliser cette commande en combat !'), +(12, 'koKR', '전투 중에는 이 명령을 사용할 수 없습니다!'), +(12, 'deDE', 'Du kannst diesen Befehl im Kampf nicht verwenden!'), +(12, 'zhCN', '战斗中不能使用这个命令!'), +(12, 'zhTW', '戰鬥中無法使用這個指令!'), +(12, 'esES', '¡No puedes usar este comando mientras estás en combate!'), +(12, 'esMX', '¡No puedes usar este comando mientras estás en combate!'), +(12, 'ruRU', 'Вы не можете использовать эту команду во время боя!'), + +-- 20: broadcast sale +(20, 'enUS', 'We just sold our Guild House.'), +(20, 'frFR', 'Nous venons de vendre notre maison de guilde.'), +(20, 'koKR', '우리는 방금 길드 하우스를 팔았습니다.'), +(20, 'deDE', 'Wir haben gerade unser Gildenhaus verkauft.'), +(20, 'zhCN', '我们刚刚卖掉了我们的公会大厅。'), +(20, 'zhTW', '我們剛剛賣掉了我們的公會會館。'), +(20, 'esES', 'Acabamos de vender nuestra casa de hermandad.'), +(20, 'esMX', 'Acabamos de vender nuestra casa de hermandad.'), +(20, 'ruRU', 'Мы только что продали наш дом гильдии.'), + +-- 21: broadcast purchase +(21, 'enUS', 'We now have a Guild House!'), +(21, 'frFR', 'Nous avons maintenant une maison de guilde !'), +(21, 'koKR', '이제 우리는 길드 하우스를 갖게 되었습니다!'), +(21, 'deDE', 'Wir haben jetzt ein Gildenhaus!'), +(21, 'zhCN', '我们现在拥有一座公会大厅!'), +(21, 'zhTW', '我們現在擁有一座公會會館!'), +(21, 'esES', '¡Ahora tenemos una casa de hermandad!'), +(21, 'esMX', '¡Ahora tenemos una casa de hermandad!'), +(21, 'ruRU', 'Теперь у нас есть дом гильдии!'), + +-- 22: Broadcast recall of teleport commands +(22, 'enUS', 'You can use `.guildhouse tele` or `.gh tele` to visit the Guild House!'), +(22, 'frFR', 'Vous pouvez utiliser `.guildhouse tele` ou `.gh tele` pour visiter la maison de guilde !'), +(22, 'koKR', '`.guildhouse tele` 또는 `.gh tele`을 사용해서 길드 하우스로 이동할 수 있습니다!'), +(22, 'deDE', 'Ihr könnt `.guildhouse tele` oder `.gh tele` benutzen, um das Gildenhaus zu besuchen!'), +(22, 'zhCN', '你可以使用 `.guildhouse tele` 或 `.gh tele` 前往公会大厅!'), +(22, 'zhTW', '你可以使用 `.guildhouse tele` 或 `.gh tele` 前往公會會館!'), +(22, 'esES', '¡Puedes usar `.guildhouse tele` o `.gh tele` para visitar la casa de hermandad!'), +(22, 'esMX', '¡Puedes usar `.guildhouse tele` o `.gh tele` para visitar la casa de hermandad!'), +(22, 'ruRU', 'Вы можете использовать `.guildhouse tele` или `.gh tele`, чтобы посетить дом гильдии!'), + +-- 30: not authorized to buy +(30, 'enUS', 'You are not authorized to make Guild House purchases.'), +(30, 'frFR', 'Vous n''êtes pas autorisé à faire des achats pour la maison de guilde.'), +(30, 'koKR', '당신은 길드 하우스 구매를 할 권한이 없습니다.'), +(30, 'deDE', 'Du bist nicht berechtigt, Einkäufe für das Gildenhaus zu tätigen.'), +(30, 'zhCN', '你没有权限为公会大厅进行购买。'), +(30, 'zhTW', '你沒有權限為公會會館進行購買。'), +(30, 'esES', 'No estás autorizado para realizar compras de la casa de hermandad.'), +(30, 'esMX', 'No estás autorizado para hacer compras para la casa de hermandad.'), +(30, 'ruRU', 'У вас нет прав совершать покупки для дома гильдии.'), + +-- 31: object already present +(31, 'enUS', 'You already have this object!'), +(31, 'frFR', 'Vous avez déjà cet objet !'), +(31, 'koKR', '이미 이 오브젝트를 가지고 있습니다!'), +(31, 'deDE', 'Du besitzt dieses Objekt bereits!'), +(31, 'zhCN', '你已经拥有这个物体了!'), +(31, 'zhTW', '你已經擁有這個物品了!'), +(31, 'esES', '¡Ya tienes este objeto!'), +(31, 'esMX', '¡Ya tienes este objeto!'), +(31, 'ruRU', 'У вас уже есть этот объект!'), + +-- 100: Gossip about buying a house +(100, 'enUS', 'Buy Guild House!'), +(100, 'frFR', 'Acheter une maison de guilde !'), +(100, 'koKR', '길드 하우스 구입!'), +(100, 'deDE', 'Gildenhaus kaufen!'), +(100, 'zhCN', '购买公会大厅!'), +(100, 'zhTW', '購買公會會館!'), +(100, 'esES', '¡Comprar casa de hermandad!'), +(100, 'esMX', '¡Comprar casa de hermandad!'), +(100, 'ruRU', 'Купить дом гильдии!'), + +-- 101: Confirmation of selling house +(101, 'enUS', 'Are you sure you want to sell your Guild House?'), +(101, 'frFR', 'Êtes-vous sûr de vouloir vendre votre maison de guilde ?'), +(101, 'koKR', '정말 길드 하우스를 판매하시겠습니까?'), +(101, 'deDE', 'Bist du sicher, dass du dein Gildenhaus verkaufen möchtest?'), +(101, 'zhCN', '你确定要出售你的公会大厅吗?'), +(101, 'zhTW', '你確定要賣掉你的公會會館嗎?'), +(101, 'esES', '¿Seguro que quieres vender tu casa de hermandad?'), +(101, 'esMX', '¿Seguro que quieres vender tu casa de hermandad?'), +(101, 'ruRU', 'Вы уверены, что хотите продать дом гильдии?'), + +-- 102: Teleportation to the house +(102, 'enUS', 'Teleport to Guild House'), +(102, 'frFR', 'Téléportation vers la maison de guilde'), +(102, 'koKR', '길드 하우스로 순간이동'), +(102, 'deDE', 'Zum Gildenhaus teleportieren'), +(102, 'zhCN', '传送到公会大厅'), +(102, 'zhTW', '傳送到公會會館'), +(102, 'esES', 'Teletransportarse a la casa de hermandad'), +(102, 'esMX', 'Teletransportarse a la casa de hermandad'), +(102, 'ruRU', 'Телепорт в дом гильдии'), + +-- 103: Close the menu +(103, 'enUS', 'Close'), +(103, 'frFR', 'Fermer'), +(103, 'koKR', '닫기'), +(103, 'deDE', 'Schließen'), +(103, 'zhCN', '关闭'), +(103, 'zhTW', '關閉'), +(103, 'esES', 'Cerrar'), +(103, 'esMX', 'Cerrar'), +(103, 'ruRU', 'Закрыть'), + +-- 104: label sell house +(104, 'enUS', 'Sell Guild House!'), +(104, 'frFR', 'Vendre la maison de guilde !'), +(104, 'koKR', '길드 하우스 판매!'), +(104, 'deDE', 'Gildenhaus verkaufen!'), +(104, 'zhCN', '出售公会大厅!'), +(104, 'zhTW', '賣掉公會會館!'), +(104, 'esES', '¡Vender la casa de hermandad!'), +(104, 'esMX', '¡Vender la casa de hermandad!'), +(104, 'ruRU', 'Продать дом гильдии!'); diff --git a/src/guildhouse.h b/src/guildhouse.h index f21a6f9..b2a40ec 100644 --- a/src/guildhouse.h +++ b/src/guildhouse.h @@ -1,3 +1,7 @@ +#ifndef MOD_GUILDHOUSE_H +#define MOD_GUILDHOUSE_H + +#include // Offsets from creatures_objects.sql constexpr uint32 GetCreatureEntry(uint32 offset) @@ -9,3 +13,43 @@ constexpr uint32 GetGameObjectEntry(uint32 offset) { return 500000 + offset; } + +enum GuildHouseLocaleString : uint32 +{ + GUILDHOUSE_TEXT_YOU_NOW_OWN_A_GUILD = 1, + GUILDHOUSE_TEXT_NOT_IN_GUILD = 2, + GUILDHOUSE_TEXT_GUILD_HAS_NO_HOUSE = 3, + GUILDHOUSE_TEXT_HOUSE_SOLD_SUCCESS = 4, + GUILDHOUSE_TEXT_HOUSE_SOLD_ERROR = 5, + GUILDHOUSE_TEXT_HOUSE_PURCHASED_SUCCESS = 6, + GUILDHOUSE_TEXT_GUILD_ALREADY_HAS_HOUSE = 7, + + GUILDHOUSE_TEXT_CMD_NEED_GUILDMASTER = 8, + GUILDHOUSE_TEXT_CMD_NEED_IN_GUILDHOUSE = 9, + GUILDHOUSE_TEXT_CMD_BUTLER_ALREADY_EXISTS = 10, + GUILDHOUSE_TEXT_CMD_BUTLER_ADD_ERROR = 11, + GUILDHOUSE_TEXT_CMD_IN_COMBAT = 12, + + GUILDHOUSE_TEXT_BROADCAST_HOUSE_SOLD = 20, + GUILDHOUSE_TEXT_BROADCAST_HOUSE_PURCHASED = 21, + GUILDHOUSE_TEXT_BROADCAST_USE_TELEPORT = 22, + + GUILDHOUSE_TEXT_NOT_AUTHORIZED_PURCHASE = 30, + GUILDHOUSE_TEXT_OBJECT_ALREADY_EXISTS = 31, + + GUILDHOUSE_TEXT_GOSSIP_BUY_HOUSE = 100, + GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE_CONFIRM = 101, + GUILDHOUSE_TEXT_GOSSIP_TELEPORT_TO_HOUSE = 102, + GUILDHOUSE_TEXT_GOSSIP_CLOSE = 103, + GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE = 104 +}; + +class Player; + +// Preloads localized texts from mod_guildhouse_locale into memory +void LoadGuildHouseLocales(); + +// Returns localized text for the given id and player locale +std::string GetGuildHouseLocaleText(uint32 id, Player* player); + +#endif // MOD_GUILDHOUSE_H diff --git a/src/mod_guildhouse.cpp b/src/mod_guildhouse.cpp index e7023d4..4dd2ddf 100644 --- a/src/mod_guildhouse.cpp +++ b/src/mod_guildhouse.cpp @@ -14,7 +14,58 @@ #include "GameObject.h" #include "Transport.h" #include "Maps/MapMgr.h" +#include "WorldSession.h" +#include "DatabaseEnv.h" #include "guildhouse.h" +#include +#include + +namespace +{ + // id -> text per LocaleConstant, preloaded once so UI strings don't hit the + // database on the world thread for every message. + std::unordered_map> _guildHouseLocaleTexts; +} // namespace + +void LoadGuildHouseLocales() +{ + _guildHouseLocaleTexts.clear(); + + QueryResult result = WorldDatabase.Query("SELECT `Id`, `Locale`, `Text` FROM `mod_guildhouse_locale`"); + if (!result) + { + LOG_WARN("modules", "GUILDHOUSE: `mod_guildhouse_locale` is empty or missing; localized texts unavailable."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + uint32 id = fields[0].Get(); + LocaleConstant locale = GetLocaleByName(fields[1].Get()); + _guildHouseLocaleTexts[id][locale] = fields[2].Get(); + ++count; + } while (result->NextRow()); + + LOG_INFO("modules", "GUILDHOUSE: Loaded {} localized text entries.", count); +} + +std::string GetGuildHouseLocaleText(uint32 id, Player* player) +{ + if (!player || !player->GetSession()) + return {}; + + auto it = _guildHouseLocaleTexts.find(id); + if (it == _guildHouseLocaleTexts.end()) + return {}; + + LocaleConstant locale = player->GetSession()->GetSessionDbLocaleIndex(); + if (locale < TOTAL_LOCALES && !it->second[locale].empty()) + return it->second[locale]; + + return it->second[LOCALE_enUS]; // fall back to English +} class GuildData : public DataMap::Base { @@ -36,7 +87,7 @@ class GuildHelper : public GuildScript void OnCreate(Guild* /*guild*/, Player* leader, const std::string& /*name*/) { - ChatHandler(leader->GetSession()).PSendSysMessage("You now own a guild. You can purchase a Guild House!"); + ChatHandler(leader->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_YOU_NOW_OWN_A_GUILD, leader).c_str()); } uint32 GetGuildPhase(Guild* guild) @@ -142,7 +193,7 @@ class GuildHouseSeller : public CreatureScript { if (!player->GetGuild()) { - ChatHandler(player->GetSession()).PSendSysMessage("You are not a member of a guild."); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_NOT_IN_GUILD, player).c_str()); CloseGossipMenuFor(player); return false; } @@ -152,14 +203,19 @@ class GuildHouseSeller : public CreatureScript // Only show Teleport option if guild owns a guild house if (has_gh) { - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Teleport to Guild House", GOSSIP_SENDER_MAIN, 1); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, + GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_TELEPORT_TO_HOUSE, player), + GOSSIP_SENDER_MAIN, 1); // Only show "Sell" option if they have a guild house & have permission to sell it Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId()); Guild::Member const* memberMe = guild->GetMember(player->GetGUID()); if (memberMe->IsRankNotLower(sConfigMgr->GetOption("GuildHouseSellRank", 0))) { - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Sell Guild House!", GOSSIP_SENDER_MAIN, 3, "Are you sure you want to sell your Guild House?", 0, false); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, + GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE, player), + GOSSIP_SENDER_MAIN, 3, + GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE_CONFIRM, player), 0, false); } } else @@ -167,11 +223,15 @@ class GuildHouseSeller : public CreatureScript // Only leader of the guild can buy guild house & only if they don't already have a guild house if (player->GetGuild()->GetLeaderGUID() == player->GetGUID()) { - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Buy Guild House!", GOSSIP_SENDER_MAIN, 2); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, + GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_BUY_HOUSE, player), + GOSSIP_SENDER_MAIN, 2); } } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Close", GOSSIP_SENDER_MAIN, 5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, + GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_CLOSE, player), + GOSSIP_SENDER_MAIN, 5); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); return true; } @@ -204,7 +264,7 @@ class GuildHouseSeller : public CreatureScript QueryResult has_gh = CharacterDatabase.Query("SELECT id, `guild` FROM `guild_house` WHERE guild={}", player->GetGuildId()); if (!has_gh) { - ChatHandler(player->GetSession()).PSendSysMessage("Your guild does not own a Guild House!"); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GUILD_HAS_NO_HOUSE, player).c_str()); CloseGossipMenuFor(player); return false; } @@ -212,15 +272,15 @@ class GuildHouseSeller : public CreatureScript // calculate total gold returned: 1) cost of guild house and cost of each purchase made if (RemoveGuildHouse(player)) { - ChatHandler(player->GetSession()).PSendSysMessage("You have successfully sold your Guild House."); - player->GetGuild()->BroadcastToGuild(player->GetSession(), false, "We just sold our Guild House.", LANG_UNIVERSAL); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_HOUSE_SOLD_SUCCESS, player).c_str()); + player->GetGuild()->BroadcastToGuild(player->GetSession(), false, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_BROADCAST_HOUSE_SOLD, player).c_str(), LANG_UNIVERSAL); player->ModifyMoney(+(sConfigMgr->GetOption("CostGuildHouse", 10000000) / 2)); LOG_INFO("modules", "GUILDHOUSE: Successfully returned money and sold Guild House"); CloseGossipMenuFor(player); } else { - ChatHandler(player->GetSession()).PSendSysMessage("There was an error selling your Guild House."); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_HOUSE_SOLD_ERROR, player).c_str()); CloseGossipMenuFor(player); } break; @@ -238,9 +298,9 @@ class GuildHouseSeller : public CreatureScript CharacterDatabase.Query("INSERT INTO `guild_house` (guild, phase, map, positionX, positionY, positionZ, orientation) VALUES ({}, {}, {}, {}, {}, {}, {})", player->GetGuildId(), GetGuildPhase(player), map, posX, posY, posZ, ori); player->ModifyMoney(-(sConfigMgr->GetOption("CostGuildHouse", 10000000))); // Msg to purchaser and Msg Guild as purchaser - ChatHandler(player->GetSession()).PSendSysMessage("You have successfully purchased a Guild House"); - player->GetGuild()->BroadcastToGuild(player->GetSession(), false, "We now have a Guild House!", LANG_UNIVERSAL); - player->GetGuild()->BroadcastToGuild(player->GetSession(), false, "In chat, type `.guildhouse teleport` or `.gh tele` to meet me there!", LANG_UNIVERSAL); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_HOUSE_PURCHASED_SUCCESS, player).c_str()); + player->GetGuild()->BroadcastToGuild(player->GetSession(), false, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_BROADCAST_HOUSE_PURCHASED, player).c_str(), LANG_UNIVERSAL); + player->GetGuild()->BroadcastToGuild(player->GetSession(), false, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_BROADCAST_USE_TELEPORT, player).c_str(), LANG_UNIVERSAL); LOG_INFO("modules", "GUILDHOUSE: GuildId: '{}' has purchased a guildhouse", player->GetGuildId()); // Spawn a portal and the guild house butler automatically as part of purchase. @@ -451,7 +511,7 @@ class GuildHouseSeller : public CreatureScript if (result) { - ChatHandler(player->GetSession()).PSendSysMessage("Your guild already has a Guild House."); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GUILD_ALREADY_HAS_HOUSE, player).c_str()); CloseGossipMenuFor(player); return false; } @@ -475,17 +535,17 @@ class GuildHouseSeller : public CreatureScript if (player->GetGuild()->GetLeaderGUID() == player->GetGUID()) { // Only leader of the guild can buy / sell guild house - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Buy Guild House!", GOSSIP_SENDER_MAIN, 2); - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Sell Guild House!", GOSSIP_SENDER_MAIN, 3, "Are you sure you want to sell your Guild House?", 0, false); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_BUY_HOUSE, player), GOSSIP_SENDER_MAIN, 2); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE, player), + GOSSIP_SENDER_MAIN, 3, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_SELL_HOUSE_CONFIRM, player), 0, false); } - AddGossipItemFor(player, GOSSIP_ICON_TABARD, "Teleport to Guild House", GOSSIP_SENDER_MAIN, 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Close", GOSSIP_SENDER_MAIN, 5); + AddGossipItemFor(player, GOSSIP_ICON_TABARD, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_TELEPORT_TO_HOUSE, player), GOSSIP_SENDER_MAIN, 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GOSSIP_CLOSE, player), GOSSIP_SENDER_MAIN, 5); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); - ChatHandler(player->GetSession()).PSendSysMessage("Your Guild does not own a Guild House"); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GUILD_HAS_NO_HOUSE, player).c_str()); return; } - do { @@ -641,21 +701,21 @@ class GuildHouseCommand : public CommandScript if (!player->GetGuild() || (player->GetGuild()->GetLeaderGUID() != player->GetGUID())) { - handler->SendSysMessage("You must be the Guild Master of a guild to use this command!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_NEED_GUILDMASTER, player).c_str()); handler->SetSentErrorMessage(true); return false; } if (player->GetAreaId() != 876) { - handler->SendSysMessage("You must be in your Guild House to use this command!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_NEED_IN_GUILDHOUSE, player).c_str()); handler->SetSentErrorMessage(true); return false; } if (player->FindNearestCreature(GetCreatureEntry(1), VISIBLE_RANGE, true)) { - handler->SendSysMessage("You already have the Guild House Butler!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_BUTLER_ALREADY_EXISTS, player).c_str()); handler->SetSentErrorMessage(true); return false; } @@ -668,7 +728,7 @@ class GuildHouseCommand : public CommandScript Creature* creature = new Creature(); if (!creature->Create(map->GenerateLowGuid(), map, GetGuildPhase(player), GetCreatureEntry(1), 0, posX, posY, posZ, ori)) { - handler->SendSysMessage("You already have the Guild House Butler!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_BUTLER_ALREADY_EXISTS, player).c_str()); handler->SetSentErrorMessage(true); delete creature; return false; @@ -681,7 +741,7 @@ class GuildHouseCommand : public CommandScript creature = new Creature(); if (!creature->LoadCreatureFromDB(lowguid, player->GetMap())) { - handler->SendSysMessage("Something went wrong when adding the Butler."); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_BUTLER_ADD_ERROR, player).c_str()); handler->SetSentErrorMessage(true); delete creature; return false; @@ -700,7 +760,7 @@ class GuildHouseCommand : public CommandScript if (player->IsInCombat()) { - handler->SendSysMessage("You can't use this command while in combat!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_CMD_IN_COMBAT, player).c_str()); handler->SetSentErrorMessage(true); return false; } @@ -710,7 +770,7 @@ class GuildHouseCommand : public CommandScript if (!result) { - handler->SendSysMessage("Your guild does not own a Guild House!"); + handler->SendSysMessage(GetGuildHouseLocaleText(GUILDHOUSE_TEXT_GUILD_HAS_NO_HOUSE, player).c_str()); handler->SetSentErrorMessage(true); return false; } @@ -749,6 +809,17 @@ class GuildHouseGlobal : public GlobalScript } }; +class GuildHouseWorld : public WorldScript +{ +public: + GuildHouseWorld() : WorldScript("GuildHouseWorld") {} + + void OnStartup() override + { + LoadGuildHouseLocales(); + } +}; + void AddGuildHouseScripts() { new GuildHelper(); @@ -756,4 +827,5 @@ void AddGuildHouseScripts() new GuildHousePlayerScript(); new GuildHouseCommand(); new GuildHouseGlobal(); + new GuildHouseWorld(); } diff --git a/src/mod_guildhouse_butler.cpp b/src/mod_guildhouse_butler.cpp index 76642f0..736d786 100644 --- a/src/mod_guildhouse_butler.cpp +++ b/src/mod_guildhouse_butler.cpp @@ -47,13 +47,13 @@ class GuildHouseSpawner : public CreatureScript if (!memberMe->IsRankNotLower(GuildHouseBuyRank)) { - ChatHandler(player->GetSession()).PSendSysMessage("You are not authorized to make Guild House purchases."); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_NOT_AUTHORIZED_PURCHASE, player).c_str()); return false; } } else { - ChatHandler(player->GetSession()).PSendSysMessage("You are not in a guild!"); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_NOT_IN_GUILD, player).c_str()); return false; } @@ -333,7 +333,7 @@ class GuildHouseSpawner : public CreatureScript { if (player->FindNearestGameObject(entry, VISIBLE_RANGE)) { - ChatHandler(player->GetSession()).PSendSysMessage("You already have this object!"); + ChatHandler(player->GetSession()).PSendSysMessage("%s", GetGuildHouseLocaleText(GUILDHOUSE_TEXT_OBJECT_ALREADY_EXISTS, player).c_str()); CloseGossipMenuFor(player); return; }