diff --git a/data/sql/db-world/2024_04_07_01_guildhouse_spawns.sql b/data/sql/db-world/2024_04_07_01_guildhouse_spawns.sql index 75df72e..9cddaeb 100644 --- a/data/sql/db-world/2024_04_07_01_guildhouse_spawns.sql +++ b/data/sql/db-world/2024_04_07_01_guildhouse_spawns.sql @@ -27,23 +27,23 @@ REPLACE INTO `guild_house_spawns` (`id`, `entry`, `posX`, `posY`, `posZ`, `orien (10, @C_TEMPLATE + 2, 16218.9, 16284.5, 13.1761, 6.18533, 'Innkeeper'), (11, 30605, 16228.0, 16280.5, 13.1761, 2.98877, 'Banker'), (12, 29195, 16252.3, 16284.9, 20.9324, 1.79537, 'Death Knight Trainer'), - (13, 2836, 16220.5, 16302.3, 13.176, 6.14647, 'Blacksmithing Trainer'), - (14, 8128, 16220.2, 16299.6, 13.178, 6.22894, 'Mining Trainer'), - (15, 8736, 16219.8, 16296.9, 13.1746, 6.24465, 'Engineering Trainer'), - (16, 18774, 16222.4, 16293, 13.1813, 1.51263, 'Jewelcrafting Trainer (Alliance)'), - (17, 18751, 16222.4, 16293, 13.1813, 1.51263, 'Jewelcrafting Trainer (Horde)'), - (18, 18773, 16227.5, 16292.3, 13.1839, 1.49691, 'Enchanting Trainer (Alliance)'), - (19, 18753, 16227.5, 16292.3, 13.1839, 1.49691, 'Enchanting Trainer (Horde)'), - (20, 30721, 16231.6, 16301, 13.1757, 3.07372, 'Inscription Trainer (Alliance)'), - (21, 30722, 16231.6, 16301, 13.1757, 3.07372, 'Inscription Trainer (Horde)'), - (22, 19187, 16231.2, 16295, 13.1761, 3.06574, 'Leatherworking Trainer'), - (23, 19180, 16228.9, 16304.7, 13.1819, 4.64831, 'Skinning Trainer'), - (24, 19052, 16218.1, 16281.8, 13.1756, 6.1975, 'Alchemy Trainer'), - (25, 908, 16218.3, 16284.3, 13.1756, 6.1975, 'Herbalism Trainer'), - (26, 2627, 16220.4, 16278.7, 13.1756, 1.46157, 'Tailoring Trainer'), - (27, 19184, 16225, 16310.9, 29.262, 6.22119, 'First Aid Trainer'), - (28, 2834, 16225.3, 16313.9, 29.262, 6.28231, 'Fishing Trainer'), - (29, 19185, 16227, 16278, 13.1762, 1.4872, 'Cooking Trainer'), + (13, 28694, 16220.5, 16302.3, 13.176, 6.14647, 'Blacksmithing Trainer'), + (14, 28698, 16220.2, 16299.6, 13.178, 6.22894, 'Mining Trainer'), + (15, 28697, 16219.8, 16296.9, 13.1746, 6.24465, 'Engineering Trainer'), + (16, 28701, 16222.4, 16293, 13.1813, 1.51263, 'Jewelcrafting Trainer'), + (17, 18751, 16222.4, 16293, 13.1813, 1.51263, ''), + (18, 28693, 16227.5, 16292.3, 13.1839, 1.49691, 'Enchanting Trainer'), + (19, 18753, 16227.5, 16292.3, 13.1839, 1.49691, ''), + (20, 28702, 16231.6, 16301, 13.1757, 3.07372, 'Inscription Trainer'), + (21, 30722, 16231.6, 16301, 13.1757, 3.07372, ''), + (22, 28700, 16231.2, 16295, 13.1761, 3.06574, 'Leatherworking Trainer'), + (23, 28696, 16228.9, 16304.7, 13.1819, 4.64831, 'Skinning Trainer'), + (24, 28703, 16218.1, 16281.8, 13.1756, 6.1975, 'Alchemy Trainer'), + (25, 28704, 16218.3, 16284.3, 13.1756, 6.1975, 'Herbalism Trainer'), + (26, 28699, 16220.4, 16278.7, 13.1756, 1.46157, 'Tailoring Trainer'), + (27, 28706, 16225, 16310.9, 29.262, 6.22119, 'First Aid Trainer'), + (28, 28742, 16225.3, 16313.9, 29.262, 6.28231, 'Fishing Trainer'), + (29, 33587, 16227, 16278, 13.1762, 1.4872, 'Cooking Trainer'), (30, 8719, 16242, 16291.6, 22.9311, 1.52061, 'Alliance Auctioneer'), (31, 9856, 16242, 16291.6, 22.9311, 1.52061, 'Horde Auctioneer'), (32, 184137, 16220.3, 16272, 12.9736, 4.45592, 'Mailbox (Object)'), 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..8b78978 --- /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 succès.'), +(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', 'Продать дом гильдии!'); \ No newline at end of file diff --git a/src/guildhouse.h b/src/guildhouse.h index f21a6f9..2f121ca 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,40 @@ 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; + +// Returns localized text for the given id and player locale +std::string GetGuildHouseLocaleText(uint32 id, Player* player); + + #endif // MOD_GUILDHOUSE_H \ No newline at end of file diff --git a/src/mod_guildhouse.cpp b/src/mod_guildhouse.cpp index 23002c7..c571352 100644 --- a/src/mod_guildhouse.cpp +++ b/src/mod_guildhouse.cpp @@ -14,8 +14,57 @@ #include "GameObject.h" #include "Transport.h" #include "Maps/MapMgr.h" +#include "WorldSession.h" +#include "DatabaseEnv.h" #include "guildhouse.h" +namespace +{ + // returns locale code used by the DB + char const* GetGuildHouseLocaleCode(LocaleConstant locale) + { + switch (locale) + { + case LOCALE_koKR: return "koKR"; + case LOCALE_frFR: return "frFR"; + case LOCALE_deDE: return "deDE"; + case LOCALE_zhCN: return "zhCN"; + case LOCALE_zhTW: return "zhTW"; + case LOCALE_esES: return "esES"; + case LOCALE_esMX: return "esMX"; + case LOCALE_ruRU: return "ruRU"; + case LOCALE_enUS: + default: return "enUS"; + } + } +} // namespace + +std::string GetGuildHouseLocaleText(uint32 id, Player* player) +{ + if (!player || !player->GetSession()) + return {}; + + LocaleConstant locale = player->GetSession()->GetSessionDbLocaleIndex(); + char const* localeCode = GetGuildHouseLocaleCode(locale); + + QueryResult result = WorldDatabase.Query( + "SELECT `Text` FROM `mod_guildhouse_locale` WHERE `Id` = {} AND `Locale` = '{}'", + id, localeCode); + + if (!result && locale != LOCALE_enUS) + result = WorldDatabase.Query( + "SELECT `Text` FROM `mod_guildhouse_locale` WHERE `Id` = {} AND `Locale` = 'enUS'", + id); + + if (!result) + return {}; + + if (Field* fields = result->Fetch()) + return fields[0].Get(); + + return {}; +} + class GuildData : public DataMap::Base { public: @@ -36,7 +85,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 +191,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 +201,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 +221,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 +262,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 +270,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 +296,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 +509,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 +533,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 +699,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 +726,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 +739,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 +758,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 +768,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; } diff --git a/src/mod_guildhouse_butler.cpp b/src/mod_guildhouse_butler.cpp index 76642f0..ae890c8 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; } @@ -107,7 +107,7 @@ class GuildHouseSpawner : public CreatureScript break; case 4: // Objects & Portals ClearGossipMenuFor(player); - AddGossipItemFor(player, GOSSIP_ICON_TALK, "Forge", GOSSIP_SENDER_MAIN, 1685, "Add a forge?", GuildHouseObject, false); + AddGossipItemFor(player, GOSSIP_ICON_TALK, "Forge", GOSSIP_SENDER_MAIN, 1685, "Add a Forge?", GuildHouseObject, false); AddGossipItemFor(player, GOSSIP_ICON_TALK, "Anvil", GOSSIP_SENDER_MAIN, 4087, "Add an Anvil?", GuildHouseObject, false); AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "Guild Vault", GOSSIP_SENDER_MAIN, 187293, "Add Guild Vault?", GuildHouseObject, false); AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, "Barber Chair", GOSSIP_SENDER_MAIN, 191028, "Add a Barber Chair?", GuildHouseObject, false); @@ -147,38 +147,26 @@ class GuildHouseSpawner : public CreatureScript break; case 7: // Spawn Profession Trainers ClearGossipMenuFor(player); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Alchemy Trainer", GOSSIP_SENDER_MAIN, 19052, "Spawn Alchemy Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Blacksmithing Trainer", GOSSIP_SENDER_MAIN, 2836, "Spawn Blacksmithing Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Engineering Trainer", GOSSIP_SENDER_MAIN, 8736, "Spawn Engineering Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Tailoring Trainer", GOSSIP_SENDER_MAIN, 2627, "Spawn Tailoring Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Leatherworking Trainer", GOSSIP_SENDER_MAIN, 19187, "Spawn Leatherworking Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Skinning Trainer", GOSSIP_SENDER_MAIN, 19180, "Spawn Skinning Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Mining Trainer", GOSSIP_SENDER_MAIN, 8128, "Spawn Mining Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Herbalism Trainer", GOSSIP_SENDER_MAIN, 908, "Spawn Herbalism Trainer?", GuildHouseProf, false); - - if (player->GetTeamId() == TEAM_ALLIANCE) - { - // ALLIANCE players get these options - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Enchanting Trainer", GOSSIP_SENDER_MAIN, 18773, "Spawn Enchanting Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Jewelcrafing Trainer", GOSSIP_SENDER_MAIN, 18774, "Spawn Jewelcrafting Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Inscription Trainer", GOSSIP_SENDER_MAIN, 30721, "Spawn Inscription Trainer?", GuildHouseProf, false); - } - else - { - // HORDE players get these options - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Enchanting Trainer", GOSSIP_SENDER_MAIN, 18753, "Spawn Enchanting Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Jewelcrafing Trainer", GOSSIP_SENDER_MAIN, 18751, "Spawn Jewelcrafting Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Inscription Trainer", GOSSIP_SENDER_MAIN, 30722, "Spawn Inscription Trainer?", GuildHouseProf, false); - } + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Alchemy Trainer", GOSSIP_SENDER_MAIN, 28703, "Spawn Alchemy Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Blacksmithing Trainer", GOSSIP_SENDER_MAIN, 28694, "Spawn Blacksmithing Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Engineering Trainer", GOSSIP_SENDER_MAIN, 28697, "Spawn Engineering Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Tailoring Trainer", GOSSIP_SENDER_MAIN, 28699, "Spawn Tailoring Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Leatherworking Trainer", GOSSIP_SENDER_MAIN, 28700, "Spawn Leatherworking Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Skinning Trainer", GOSSIP_SENDER_MAIN, 28696, "Spawn Skinning Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Mining Trainer", GOSSIP_SENDER_MAIN, 28698, "Spawn Mining Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Herbalism Trainer", GOSSIP_SENDER_MAIN, 28704, "Spawn Herbalism Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Enchanting Trainer", GOSSIP_SENDER_MAIN, 28693, "Spawn Enchanting Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Jewelcrafing Trainer", GOSSIP_SENDER_MAIN, 28701, "Spawn Jewelcrafting Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, "Inscription Trainer", GOSSIP_SENDER_MAIN, 28702, "Spawn Inscription Trainer?", GuildHouseProf, false); AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Go Back!", GOSSIP_SENDER_MAIN, 9); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); break; case 8: // Secondary Profession Trainers ClearGossipMenuFor(player); - AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "First Aid Trainer", GOSSIP_SENDER_MAIN, 19184, "Spawn First Aid Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "Fishing Trainer", GOSSIP_SENDER_MAIN, 2834, "Spawn Fishing Trainer?", GuildHouseProf, false); - AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "Cooking Trainer", GOSSIP_SENDER_MAIN, 19185, "Spawn Cooking Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "First Aid Trainer", GOSSIP_SENDER_MAIN, 28706, "Spawn First Aid Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "Fishing Trainer", GOSSIP_SENDER_MAIN, 28742, "Spawn Fishing Trainer?", GuildHouseProf, false); + AddGossipItemFor(player, GOSSIP_ICON_MONEY_BAG, "Cooking Trainer", GOSSIP_SENDER_MAIN, 33587, "Spawn Cooking Trainer?", GuildHouseProf, false); AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Go Back!", GOSSIP_SENDER_MAIN, 9); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); break; @@ -208,23 +196,22 @@ class GuildHouseSpawner : public CreatureScript cost = GuildHouseTrainer; SpawnNPC(action, player); break; - case 2836: // Blacksmithing - case 8128: // Mining - case 8736: // Engineering - case 18774: // Jewelcrafting (Alliance) - case 18751: // Jewelcrafting (Horde) - case 18773: // Enchanting (Alliance) - case 18753: // Enchanting (Horde) - case 30721: // Inscription (Alliance) - case 30722: // Inscription (Horde) - case 19187: // Leatherworking - case 19180: // Skinning - case 19052: // Alchemy - case 908: // Herbalism - case 2627: // Tailoring - case 19185: // Cooking - case 2834: // Fishing - case 19184: // First Aid + case 28694: // Blacksmithing + case 28698: // Mining + case 28697: // Engineering + case 28701: // Jewelcrafting + case 28693: // Enchanting + case 18753: // + case 28702: // Inscription + case 30722: // + case 28700: // Leatherworking + case 28696: // Skinning + case 28703: // Alchemy + case 28704: // Herbalism + case 28699: // Tailoring + case 33587: // Cooking + case 28742: // Fishing + case 28706: // First Aid cost = GuildHouseProf; SpawnNPC(action, player); break; @@ -333,7 +320,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; }