Fehler #12487
geschlossen[Schwarzfelstiefen] [NPC] Un'rel hat noch eine Englische Gosip Option
Von Shienor vor fast 10 Jahren hinzugefügt. Vor mehr als 8 Jahren aktualisiert.
Un'rel sollte nun der deutschen Sprache mächtig sein.
Beschreibung
Un'rel (Entry: 9039)hat noch eine Englische Gosip Option.
Un'rel sagt: Ihr habt die Sieben herausgefordert; jetzt werdet Ihr sterben!
http://de.wowhead.com/npc=9039/unrel
DELETE FROM `locales_gossip_menu_option` WHERE menu_id=1947;
INSERT INTO `locales_gossip_menu_option` (`menu_id`, `id`, `option_text_loc3`) VALUES
(1947, 0, 'Ihr habt die Sieben herausgefordert; jetzt werdet Ihr sterben!');
Von Rushor vor fast 10 Jahren aktualisiert
Bei solchen 'alten' NPCs kann man immer davon ausgehen, dass die Gossips hardcoded über ein define in einem Script hinterlegt wurden und nicht von der Datenbank abgerufen werden.
Immer wenn man eine Gossipoption übersetzen will sollte man zunächst checken, ob in der `creature_template` in `gossip_menu_id` ein Eintrag hinterlegt ist.
Sollte dies der Fall sein, überprüft man den Eintrag in `gossip_menu_option`.
SELECT * FROM `gossip_menu_option` WHERE `menu_id`=1947;
Wie man sieht, gibt es dort einen Eintrag.
INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES (1947, 0, 0, 'Your bondage is at an end, Doom\'rel. I challenge you!', 1, 1, 0, 0, 0, 0, '');
Nun könnte man meinen, eine Übersetzung wäre ohne weiteres machbar, indem man die entsprechenden Einträge in `locales_gossip_menu_option` hinzufügt mit:
DELETE FROM `locales_gossip_menu_option` WHERE menu_id=1947; INSERT INTO `locales_gossip_menu_option` (`menu_id`, `id`, `option_text_loc3`) VALUES (1947, 0, 'Ihr habt die Sieben herausgefordert; jetzt werdet Ihr sterben!');
Nein!
Das Problem an dieser Stelle ist, dass die Einträge zwar in der DB hinterlegt sind, aber NIEMALS aufgerufen werden.
Warum fragt sie sich?
Weil der NPC mit der ID 9039 ein Corescript besitzt?
Woher weis ich dass der NPC ein Corescript hat?
Zunächst sollte man IMMER überprüfen, ob in der `creature_template` in `ScriptName` ein Eintrag ist:
SELECT `ScriptName` FROM `creature_template` WHERE `entry`=9039;
Dort steht nun also: boss_doomrel
Wo kann ich das Script mit dem Namen: boss_doomrel finden?
Alle Kreaturescripts werden im TC-Repo unter /src/server/scripts hinterlegt:
https://github.com/TrinityCore/TrinityCore/tree/3.3.5/src/server/scripts
Dort angekommen wählt man die entsprechende Instanz aus:
https://github.com/TrinityCore/TrinityCore/blob/3.3.5/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
Weiter unten findet man dann: class boss_doomrel : public CreatureScript
In dem Script selbst sehen wir, dass in dem Script:
bool OnGossipHello(Player* player, Creature* creature) override
eingefügt wurde.
Damit wird bei jeder Interaction über das Corescript eine Aktion eingeleitet.
Was wird dann getan?
Der Spieler added die Gossipoption:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
Wo wird der Satz für GOSSIP_ITEM_CHALLENGE nun festgelegt?
Weiter oben in:
#define GOSSIP_ITEM_CHALLENGE "Your bondage is at an end, Doom'rel. I challenge you!"
Und genau hier liegt unser Problem. Das #define fragt immer den englischen Text: "Your bondage is at an end, Doom'rel. I challenge you!" ab und zieht somit nie die Datenbankeinträge.
Was kann man dagegen tun?
Man ersetzt das
GOSSIP_ITEM_CHALLENGE
durch
player->GetOptionTextWithEntry(GOSSIP_ITEM_CHALLENGE, 0)
Man ersetzt das
#define GOSSIP_ITEM_CHALLENGE "Your bondage is at an end, Doom'rel. I challenge you!"
durch
enum GossipMisc { GOSSIP_ITEM_CHALLENGE = 1947 };
Und was bringt uns der Mist nun?
Durch
player->GetOptionTextWithEntry(GOSSIP_ITEM_CHALLENGE, 0)
wird nun immer die Gossipoption 9039 aus der DB abgefragt und damit auch der `locales_gossip_menu_option`-Eintrag insofern einer vorhanden ist.
Was machen wir, wenn in `creature_template` überhaupt keine `menu_id` vorhanden ist?
Wir fügen eine neu generierte, noch freie ID hinzu (Bei RG wäre das eine ID >= 60086) oder wir gehen auf den Offi, rennen zu dem NPC, schalten den sniffer an und schauen welche ID dort dem client zugeschickt wird.
Wie sieht der komplette Fix am ende aus?
diff --git a/src/server/scripts/RG/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/RG/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index b199351..200e57e 100644 --- a/src/server/scripts/RG/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/RG/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -100,9 +100,13 @@ enum DoomrelSpells SPELL_SUMMON_VOIDWALKERS = 15092 }; -#define GOSSIP_ITEM_CHALLENGE "Your bondage is at an end, Doom'rel. I challenge you!" #define GOSSIP_SELECT_DOOMREL "[PH] Continue..." +enum GossipMisc +{ + GOSSIP_ITEM_CHALLENGE = 9039 +}; + class boss_doomrel : public CreatureScript { public: @@ -133,7 +137,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, player->GetOptionTextWithEntry(GOSSIP_ITEM_CHALLENGE, 0), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); player->SEND_GOSSIP_MENU(2601, creature->GetGUID()); return true;
DELETE FROM `locales_gossip_menu_option` WHERE menu_id=1947; INSERT INTO `locales_gossip_menu_option` (`menu_id`, `id`, `option_text_loc3`) VALUES (1947, 0, 'Ihr habt die Sieben herausgefordert; jetzt werdet Ihr sterben!');
Dat's it.
Von Rushor vor fast 10 Jahren aktualisiert
- Status wurde von Bestätigt zu Testbereit geändert
Von Shienor vor fast 10 Jahren aktualisiert
- Status wurde von Testbereit zu Pending geändert
- Zugewiesen an wurde auf Rushor gesetzt
- Update Text Deutsch aktualisiert (Vergleich)
Von Rushor vor fast 10 Jahren aktualisiert
- Status wurde von Pending zu Ready geändert
- Zugewiesen an
Rushorwurde gelöscht - Update Text Deutsch aktualisiert (Vergleich)
Von Daejiv vor fast 10 Jahren aktualisiert
- Thema wurde von [Schwarfelstiefen] [NPC] Un'rel hat noch eine Englische Gosip Option zu [Schwarzfelstiefen] [NPC] Un'rel hat noch eine Englische Gosip Option geändert
Von Rushor vor mehr als 8 Jahren aktualisiert
Bedeutung Live:
Der Bug wurde erfolgreich behoben und befindet sich auf dem Spielserver. Sollte der Fehler weiterhin bestehen sollte ein neues Ticket ( https://redmine.rising-gods.de/projects/live/issues/new ) erstellt werden. Anmerkungen in dem alten abgewiesenen oder live genommenen Ticket werden ignoriert und gelöscht.