Projekt

Allgemein

Profil

Aktionen

Fehler #12487

geschlossen

[Schwarzfelstiefen] [NPC] Un'rel hat noch eine Englische Gosip Option

Von Shienor vor mehr als 9 Jahren hinzugefügt. Vor etwa 8 Jahren aktualisiert.

Status:
Live
Priorität:
Normal
Zugewiesen an:
-
Kategorie:
Kreaturen
Beginn:
24.01.2015
Update Text Deutsch:

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!');

Aktionen #1

Von Rushor vor mehr als 9 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.

Aktionen #2

Von Rushor vor mehr als 9 Jahren aktualisiert

  • Status wurde von Bestätigt zu Testbereit geändert
Aktionen #3

Von Shienor vor mehr als 9 Jahren aktualisiert

  • Status wurde von Testbereit zu Pending geändert
  • Zugewiesen an wurde auf Rushor gesetzt
  • Update Text Deutsch aktualisiert (Vergleich)
Aktionen #4

Von Rushor vor etwa 9 Jahren aktualisiert

  • Status wurde von Pending zu Ready geändert
  • Zugewiesen an Rushor wurde gelöscht
  • Update Text Deutsch aktualisiert (Vergleich)
Aktionen #5

Von Daejiv vor etwa 9 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
Aktionen #6

Von Rushor vor etwa 9 Jahren aktualisiert

  • Status wurde von Ready zu Live geändert
Aktionen #7

Von Rushor vor etwa 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.

Aktionen

Auch abrufbar als: Atom PDF