Skip to content

Commit

Permalink
feat: Implement transmog interface command (#188)
Browse files Browse the repository at this point in the history
* feat: Implement transmog interface command

* Update transmog_scripts.cpp
  • Loading branch information
Nyeriah authored Jan 10, 2025
1 parent 4800a5c commit 434d295
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 27 deletions.
11 changes: 7 additions & 4 deletions data/sql/db-world/trasm_world_texts.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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\nвсе предметы которые вы преобразовали, отображаются так, что вы видите, что вы сохраняете.\r\nЕсли вы считаете, что набор в порядке, вы можете нажать, чтобы сохранить набор и назвать его по своему желанию.\r\n\r\nЧтобы использовать набор, можно щелкнуть сохраненный набор в меню управления набором, а затем выбрать использовать набор.\r\nЕсли в наборе есть трансмогрификация предмета, который уже трансмогрифицирован, старая трансмогрификация теряется.\r\nОбратите внимание, что те же ограничения на трансмогрификацию применяются, когда пытается использовать набор, как при обычной трансмогрификации.\r\n\r\nЧтобы удалить набор, вы можете перейти в меню набора и выбрать удалить набор.');

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`)
VALUES
(11100, 'Item successfully transmogrified.', '성공적으로 형상변환된 아이템', 'Objet transmogrifié avec succès', 'Gegenstand erfolgreich transmogrifiziert', '物品变形成功', '物品變身成功。', 'Objeto transfigurado con éxito', 'Objeto transfigurado con éxito', 'Предмет успешно трансмогрифицирован'),
Expand All @@ -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.', 'Выбранный предмет не подходит для преображения.'),
(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...'),
(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
('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 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 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.');
3 changes: 3 additions & 0 deletions src/Transmogrification.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ enum TransmogSettings
{
SETTING_HIDE_TRANSMOG = 0,
SETTING_RETROACTIVE_CHECK = 1,
SETTING_VENDOR_INTERFACE = 2,

// Subscriptions
SETTING_TRANSMOG_MEMBERSHIP_LEVEL = 0
Expand Down Expand Up @@ -64,6 +65,8 @@ enum TransmogAcoreStrings // Language.h might have same entries, appears when ex
LANG_CMD_TRANSMOG_ADD_FORBIDDEN = 11114,
LANG_CMD_TRANSMOG_BEGIN_SYNC = 11115,
LANG_CMD_TRANSMOG_COMPLETE_SYNC = 11116,
LANG_CMD_TRANSMOG_VENDOR_INTERFACE_ENABLE = 11117,
LANG_CMD_TRANSMOG_VENDOR_INTERFACE_DISABLE = 11118
};

enum ArmorClassSpellIDs
Expand Down
32 changes: 12 additions & 20 deletions src/cs_transmog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ class transmog_commandscript : public CommandScript

static ChatCommandTable transmogTable =
{
{ "add", addCollectionTable },
{ "", HandleDisableTransMogVisual, SEC_PLAYER, Console::No },
{ "sync", HandleSyncTransMogCommand, SEC_PLAYER, Console::No },
{ "portable", HandleTransmogPortableCommand, SEC_PLAYER, Console::No },
{ "add", addCollectionTable },
{ "", HandleDisableTransMogVisual, SEC_PLAYER, Console::No },
{ "sync", HandleSyncTransMogCommand, SEC_PLAYER, Console::No },
{ "portable", HandleTransmogPortableCommand, SEC_PLAYER, Console::No },
{ "interface", HandleInterfaceOption, SEC_PLAYER, Console::No }
};

static ChatCommandTable commandTable =
Expand Down Expand Up @@ -99,27 +100,19 @@ class transmog_commandscript : public CommandScript
}

if (!player)
{
player = PlayerIdentifier::FromTargetOrSelf(handler);
}

if (!player)
{
return false;
}

Player* target = player->GetConnectedPlayer();
bool isNotConsole = handler->GetSession();
bool suitableForTransmog;

if (target)
{
suitableForTransmog = sTransmogrification->SuitableForTransmogrification(target, itemTemplate);
}
else
{
suitableForTransmog = sTransmogrification->SuitableForTransmogrification(player->GetGUID(), itemTemplate);
}

if (!sTransmogrification->GetTrackUnusableItems() && !suitableForTransmog)
{
Expand Down Expand Up @@ -192,14 +185,10 @@ class transmog_commandscript : public CommandScript
}

if (!player)
{
player = PlayerIdentifier::FromTargetOrSelf(handler);
}

if (!player)
{
return false;
}

Player* target = player->GetConnectedPlayer();
ItemSetEntry const* set = sItemSetStore.LookupEntry(uint32(itemSetId));
Expand Down Expand Up @@ -277,16 +266,12 @@ class transmog_commandscript : public CommandScript

// Successful command execution
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);
}
}

// Notify target of new item in appearance collection
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]);
}

return true;
}
Expand Down Expand Up @@ -318,6 +303,13 @@ class transmog_commandscript : public CommandScript

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()
Expand Down
13 changes: 10 additions & 3 deletions src/transmog_scripts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ class npc_transmogrifier : public CreatureScript
}
}

return sTransmogrification->IsEnabled() && (target && !target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).value);
return sTransmogrification->IsEnabled() && (target && !target->GetPlayerSetting("mod-transmog", SETTING_HIDE_TRANSMOG).IsEnabled());
}
};

Expand Down Expand Up @@ -538,13 +538,20 @@ class npc_transmogrifier : public CreatureScript
switch (sender)
{
case EQUIPMENT_SLOT_END: // Show items you can use
{
sT->selectionCache[player->GetGUID()] = action;

bool useVendorInterface = player->GetPlayerSetting("mod-transmog", SETTING_VENDOR_INTERFACE).IsEnabled();

if (sT->GetUseVendorInterface())
ShowTransmogItemsInFakeVendor(player, creature, action);
else
useVendorInterface ? ShowTransmogItemsInFakeVendor(player, creature, action) :
ShowTransmogItemsInGossipMenu(player, creature, action, sender);
else
useVendorInterface ? ShowTransmogItemsInGossipMenu(player, creature, action, sender) :
ShowTransmogItemsInFakeVendor(player, creature, action);

break;
}
case EQUIPMENT_SLOT_END + 1: // Main menu
OnGossipHello(player, creature);
break;
Expand Down

0 comments on commit 434d295

Please sign in to comment.