feat: Implement transmog interface command (#188)

* feat: Implement transmog interface command

* Update transmog_scripts.cpp
This commit is contained in:
Andrew
2025-01-10 13:46:25 -03:00
committed by GitHub
parent 4800a5c711
commit 434d2957ea
4 changed files with 32 additions and 27 deletions

View File

@@ -24,7 +24,7 @@ INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`) VALUES
(@TEXT_ID+1, 'ruRU', 'Вы можете сохранять свои собственные наборы для трансмогрификации.\r\n\r\nЧтобы сохранить, сначала вы должны трансмогрифицировать свои экипированные предметы.\r\nЗатем, когда вы перейдете в меню управления наборами и перейдете в меню сохранения набора,\r\се предметы которые вы преобразовали, отображаются так, что вы видите, что вы сохраняете.\r\nЕсли вы считаете, что набор в порядке, вы можете нажать, чтобы сохранить набор и назвать его по своему желанию.\r\n\r\nЧтобы использовать набор, можно щелкнуть сохраненный набор в меню управления набором, а затем выбрать использовать набор.\r\nЕсли в наборе есть трансмогрификация предмета, который уже трансмогрифицирован, старая трансмогрификация теряется.\r\nОбратите внимание, что те же ограничения на трансмогрификацию применяются, когда пытается использовать набор, как при обычной трансмогрификации.\r\n\r\nЧтобы удалить набор, вы можете перейти в меню набора и выбрать удалить набор.'); (@TEXT_ID+1, 'ruRU', 'Вы можете сохранять свои собственные наборы для трансмогрификации.\r\n\r\nЧтобы сохранить, сначала вы должны трансмогрифицировать свои экипированные предметы.\r\nЗатем, когда вы перейдете в меню управления наборами и перейдете в меню сохранения набора,\r\се предметы которые вы преобразовали, отображаются так, что вы видите, что вы сохраняете.\r\nЕсли вы считаете, что набор в порядке, вы можете нажать, чтобы сохранить набор и назвать его по своему желанию.\r\n\r\nЧтобы использовать набор, можно щелкнуть сохраненный набор в меню управления набором, а затем выбрать использовать набор.\r\nЕсли в наборе есть трансмогрификация предмета, который уже трансмогрифицирован, старая трансмогрификация теряется.\r\nОбратите внимание, что те же ограничения на трансмогрификацию применяются, когда пытается использовать набор, как при обычной трансмогрификации.\r\n\r\nЧтобы удалить набор, вы можете перейти в меню набора и выбрать удалить набор.');
SET @STRING_ENTRY := 11100; SET @STRING_ENTRY := 11100;
DELETE FROM `acore_string` WHERE `entry` IN (@STRING_ENTRY+0,@STRING_ENTRY+1,@STRING_ENTRY+2,@STRING_ENTRY+3,@STRING_ENTRY+4,@STRING_ENTRY+5,@STRING_ENTRY+6,@STRING_ENTRY+7,@STRING_ENTRY+8,@STRING_ENTRY+9,@STRING_ENTRY+10, @STRING_ENTRY+11, @STRING_ENTRY+12, @STRING_ENTRY+13, @STRING_ENTRY+14, @STRING_ENTRY+15, @STRING_ENTRY+16); DELETE FROM `acore_string` WHERE `entry` BETWEEN @STRING_ENTRY AND @STRING_ENTRY+18;
INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)
VALUES VALUES
(11100, 'Item successfully transmogrified.', ' ', 'Objet transmogrifié avec succès', 'Gegenstand erfolgreich transmogrifiziert', '', '', 'Objeto transfigurado con éxito', 'Objeto transfigurado con éxito', 'Предмет успешно трансмогрифицирован'), (11100, 'Item successfully transmogrified.', ' ', 'Objet transmogrifié avec succès', 'Gegenstand erfolgreich transmogrifiziert', '', '', 'Objeto transfigurado con éxito', 'Objeto transfigurado con éxito', 'Предмет успешно трансмогрифицирован'),
@@ -43,12 +43,15 @@ VALUES
(11113, 'The selected item is not suitable for transmogrification.', ' .', 'L''objet sélectionné ne convient pas à la métamorphose.', 'Der ausgewählte Gegenstand ist nicht für die Verwandlung geeignet.', '', '', 'El elemento seleccionado no es adecuado para la transfiguración.', 'El elemento seleccionado no es adecuado para la transfiguración.', 'Выбранный предмет не подходит для преображения.'), (11113, 'The selected item is not suitable for transmogrification.', ' .', 'L''objet sélectionné ne convient pas à la métamorphose.', 'Der ausgewählte Gegenstand ist nicht für die Verwandlung geeignet.', '', '', 'El elemento seleccionado no es adecuado para la transfiguración.', 'El elemento seleccionado no es adecuado para la transfiguración.', 'Выбранный предмет не подходит для преображения.'),
(11114, 'The selected item cannot be used for transmogrification of the target player.', ' .', 'L''objet sélectionné ne peut pas être utilisé pour la transmogrification du joueur ciblé', 'Der ausgewählte Gegenstand kann nicht für die Transmogrifizierung des Zielspielers verwendet werden', '', '', 'El elemento seleccionado no se puede usar para la transfiguración del jugador objetivo', 'El elemento seleccionado no se puede usar para la transfiguración del jugador objetivo', 'Выбранный предмет нельзя использовать для трансмогрификации целевого игрока.'), (11114, 'The selected item cannot be used for transmogrification of the target player.', ' .', 'L''objet sélectionné ne peut pas être utilisé pour la transmogrification du joueur ciblé', 'Der ausgewählte Gegenstand kann nicht für die Transmogrifizierung des Zielspielers verwendet werden', '', '', 'El elemento seleccionado no se puede usar para la transfiguración del jugador objetivo', 'El elemento seleccionado no se puede usar para la transfiguración del jugador objetivo', 'Выбранный предмет нельзя использовать для трансмогрификации целевого игрока.'),
(11115, 'Performing transmog appearance sync...', ' ...', 'Exécution de la synchronisation de l''apparence de transmogrification...', 'Synchronisierung des Transmog-Erscheinungsbilds wird durchgeführt ...', ' Transmog ...', '...', 'Realizando sincronización de apariencia de transfiguración...', 'Realizando sincronización de apariencia de transfiguración...', 'Выполнение синхронизации внешнего вида Transmog...'), (11115, 'Performing transmog appearance sync...', ' ...', 'Exécution de la synchronisation de l''apparence de transmogrification...', 'Synchronisierung des Transmog-Erscheinungsbilds wird durchgeführt ...', ' Transmog ...', '...', 'Realizando sincronización de apariencia de transfiguración...', 'Realizando sincronización de apariencia de transfiguración...', 'Выполнение синхронизации внешнего вида Transmog...'),
(11116, 'Appearance sync complete.', ' ', 'Synchronisation complète de l''apparence', 'Vollständige Synchronisierung des Erscheinungsbilds', '', '', 'Sincronización de apariencia completa', 'Sincronización de apariencia completa', 'Полная синхронизация внешнего вида'); (11116, 'Appearance sync complete.', ' ', 'Synchronisation complète de l''apparence', 'Vollständige Synchronisierung des Erscheinungsbilds', '', '', 'Sincronización de apariencia completa', 'Sincronización de apariencia completa', 'Полная синхронизация внешнего вида'),
(11117, 'The transmog NPC will now display available appearances as a vendor interface, allowing preview. \nDISCLAIMER: If you have too many appearances, some will not be displayed due to a client limitation. In that case, disable this option.', '', '', '', '', '', '', '', ''),
(11118, 'The transmog NPC will now display available apperances as gossip list.', '', '', '', '', '', '', '', '');
DELETE FROM `command` WHERE `name` IN ('transmog', 'transmog add', 'transmog sync', 'transmog add set', 'transmog portable'); DELETE FROM `command` WHERE `name` IN ('transmog', 'transmog add', 'transmog sync', 'transmog add set', 'transmog portable', 'transmog interface');
INSERT INTO `command` (`name`, `security`, `help`) VALUES INSERT INTO `command` (`name`, `security`, `help`) VALUES
('transmog', 0, 'Syntax: .transmog <on/off>\nAllows seeing transmogrified items and the transmogrifier NPC.'), ('transmog', 0, 'Syntax: .transmog <on/off>\nAllows seeing transmogrified items and the transmogrifier NPC.'),
('transmog add', 1, 'Syntax: .transmog add $player $item\nAdds an item to a player\'s appearance collection.'), ('transmog add', 1, 'Syntax: .transmog add $player $item\nAdds an item to a player\'s appearance collection.'),
('transmog sync', 0, 'Syntax: .transmog sync\nSyncs transmog addon appearances with the server.'), ('transmog sync', 0, 'Syntax: .transmog sync\nSyncs transmog addon appearances with the server.'),
('transmog add set', 1, 'Syntax: .transmog add set $player $itemSet\nAdds items of an item set to a player\'s appearance collection.'), ('transmog add set', 1, 'Syntax: .transmog add set $player $itemSet\nAdds items of an item set to a player\'s appearance collection.'),
('transmog portable', 1, 'Syntax: .transmog portable \nSummons the Ethereal Warpweaver, a portable version of the transmogrification NPC.'); ('transmog portable', 1, 'Syntax: .transmog portable \nSummons the Ethereal Warpweaver, a portable version of the transmogrification NPC.'),
('transmog interface', 1, 'Syntax: .transmog interface <on/off>\nEnables transmogrifier "vendor" interface, allowing appearance previews.\nDISCLAIMER: If you have too many appearances, some will not be displayed due to a client limitation. In that case, disable this option.');

View File

@@ -29,6 +29,7 @@ enum TransmogSettings
{ {
SETTING_HIDE_TRANSMOG = 0, SETTING_HIDE_TRANSMOG = 0,
SETTING_RETROACTIVE_CHECK = 1, SETTING_RETROACTIVE_CHECK = 1,
SETTING_VENDOR_INTERFACE = 2,
// Subscriptions // Subscriptions
SETTING_TRANSMOG_MEMBERSHIP_LEVEL = 0 SETTING_TRANSMOG_MEMBERSHIP_LEVEL = 0
@@ -64,6 +65,8 @@ enum TransmogAcoreStrings // Language.h might have same entries, appears when ex
LANG_CMD_TRANSMOG_ADD_FORBIDDEN = 11114, LANG_CMD_TRANSMOG_ADD_FORBIDDEN = 11114,
LANG_CMD_TRANSMOG_BEGIN_SYNC = 11115, LANG_CMD_TRANSMOG_BEGIN_SYNC = 11115,
LANG_CMD_TRANSMOG_COMPLETE_SYNC = 11116, LANG_CMD_TRANSMOG_COMPLETE_SYNC = 11116,
LANG_CMD_TRANSMOG_VENDOR_INTERFACE_ENABLE = 11117,
LANG_CMD_TRANSMOG_VENDOR_INTERFACE_DISABLE = 11118
}; };
enum ArmorClassSpellIDs enum ArmorClassSpellIDs

View File

@@ -40,10 +40,11 @@ public:
static ChatCommandTable transmogTable = static ChatCommandTable transmogTable =
{ {
{ "add", addCollectionTable }, { "add", addCollectionTable },
{ "", HandleDisableTransMogVisual, SEC_PLAYER, Console::No }, { "", HandleDisableTransMogVisual, SEC_PLAYER, Console::No },
{ "sync", HandleSyncTransMogCommand, SEC_PLAYER, Console::No }, { "sync", HandleSyncTransMogCommand, SEC_PLAYER, Console::No },
{ "portable", HandleTransmogPortableCommand, SEC_PLAYER, Console::No }, { "portable", HandleTransmogPortableCommand, SEC_PLAYER, Console::No },
{ "interface", HandleInterfaceOption, SEC_PLAYER, Console::No }
}; };
static ChatCommandTable commandTable = static ChatCommandTable commandTable =
@@ -99,27 +100,19 @@ public:
} }
if (!player) if (!player)
{
player = PlayerIdentifier::FromTargetOrSelf(handler); player = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!player) if (!player)
{
return false; return false;
}
Player* target = player->GetConnectedPlayer(); Player* target = player->GetConnectedPlayer();
bool isNotConsole = handler->GetSession(); bool isNotConsole = handler->GetSession();
bool suitableForTransmog; bool suitableForTransmog;
if (target) if (target)
{
suitableForTransmog = sTransmogrification->SuitableForTransmogrification(target, itemTemplate); suitableForTransmog = sTransmogrification->SuitableForTransmogrification(target, itemTemplate);
}
else else
{
suitableForTransmog = sTransmogrification->SuitableForTransmogrification(player->GetGUID(), itemTemplate); suitableForTransmog = sTransmogrification->SuitableForTransmogrification(player->GetGUID(), itemTemplate);
}
if (!sTransmogrification->GetTrackUnusableItems() && !suitableForTransmog) if (!sTransmogrification->GetTrackUnusableItems() && !suitableForTransmog)
{ {
@@ -192,14 +185,10 @@ public:
} }
if (!player) if (!player)
{
player = PlayerIdentifier::FromTargetOrSelf(handler); player = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!player) if (!player)
{
return false; return false;
}
Player* target = player->GetConnectedPlayer(); Player* target = player->GetConnectedPlayer();
ItemSetEntry const* set = sItemSetStore.LookupEntry(uint32(itemSetId)); ItemSetEntry const* set = sItemSetStore.LookupEntry(uint32(itemSetId));
@@ -277,16 +266,12 @@ public:
// Successful command execution // Successful command execution
if (target != handler->GetPlayer()) if (target != handler->GetPlayer())
{
handler->PSendSysMessage("ItemSet |cffffffff|Hitemset:{}|h[{} {}]|h|r has been added to the appearance collection of Player {}.", uint32(itemSetId), setName.c_str(), localeNames[locale], nameLink); handler->PSendSysMessage("ItemSet |cffffffff|Hitemset:{}|h[{} {}]|h|r has been added to the appearance collection of Player {}.", uint32(itemSetId), setName.c_str(), localeNames[locale], nameLink);
}
} }
// Notify target of new item in appearance collection // Notify target of new item in appearance collection
if (target && !(target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).value)) if (target && !(target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).value))
{
ChatHandler(target->GetSession()).PSendSysMessage("ItemSet |cffffffff|Hitemset:%d|h[{} {}]|h|r has been added to your appearance collection.", uint32(itemSetId), setName.c_str(), localeNames[locale]); ChatHandler(target->GetSession()).PSendSysMessage("ItemSet |cffffffff|Hitemset:%d|h[{} {}]|h|r has been added to your appearance collection.", uint32(itemSetId), setName.c_str(), localeNames[locale]);
}
return true; return true;
} }
@@ -318,6 +303,13 @@ public:
return true; return true;
}; };
static bool HandleInterfaceOption(ChatHandler* handler, bool enable)
{
handler->GetPlayer()->UpdatePlayerSetting("mod-transmog", SETTING_VENDOR_INTERFACE, enable);
handler->SendSysMessage(enable ? LANG_CMD_TRANSMOG_VENDOR_INTERFACE_ENABLE : LANG_CMD_TRANSMOG_VENDOR_INTERFACE_DISABLE);
return true;
}
}; };
void AddSC_transmog_commandscript() void AddSC_transmog_commandscript()

View File

@@ -485,7 +485,7 @@ public:
} }
} }
return sTransmogrification->IsEnabled() && (target && !target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).value); return sTransmogrification->IsEnabled() && (target && !target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).IsEnabled());
} }
}; };
@@ -538,13 +538,20 @@ public:
switch (sender) switch (sender)
{ {
case EQUIPMENT_SLOT_END: // Show items you can use case EQUIPMENT_SLOT_END: // Show items you can use
{
sT->selectionCache[player->GetGUID()] = action; sT->selectionCache[player->GetGUID()] = action;
bool useVendorInterface = player->GetPlayerSetting("mod-transmog", SETTING_VENDOR_INTERFACE).IsEnabled();
if (sT->GetUseVendorInterface()) if (sT->GetUseVendorInterface())
ShowTransmogItemsInFakeVendor(player, creature, action); useVendorInterface ? ShowTransmogItemsInFakeVendor(player, creature, action) :
else
ShowTransmogItemsInGossipMenu(player, creature, action, sender); ShowTransmogItemsInGossipMenu(player, creature, action, sender);
else
useVendorInterface ? ShowTransmogItemsInGossipMenu(player, creature, action, sender) :
ShowTransmogItemsInFakeVendor(player, creature, action);
break; break;
}
case EQUIPMENT_SLOT_END + 1: // Main menu case EQUIPMENT_SLOT_END + 1: // Main menu
OnGossipHello(player, creature); OnGossipHello(player, creature);
break; break;