[Guide][Wiki-Beitrag] How-To Total RP 3 Extended ❔

Extended am Sonntag #16


Geheime Dokumente

Heute geht es darum, geheime Informationen oder wertvolle Gegenstände vor den Blicken oder Händen Unbefugter zu schützen. Das kann ein neugieriger Bote sein, der eine Nachricht überbringen, aber nicht lesen soll. Das kann ein Teilnehmer einer Schnitzeljagd sein, der die Trophäe erst bekommen soll, wenn bestimmte Vorbedingungen erfüllt sind. Oder es kann irgendetwas anderes sein, was der Extended-Benutzer (noch) nicht sehen können soll.
In den folgenden Beispielen wird der Schutzmechanismus immer ein Passwort sein, man könnte die Information aber auch hinter einem Rätsel oder allgemein einer Aufgabe verbergen.

:warning: Beachte, dass die Sicherheit hier lediglich im Spielkontext gewährleistet ist. Du solltest mit den folgenden Items auf keinen Fall echte Daten schützen!

Level 1: Statische Daten, statisches Passwort

Importcode: Geheimes Dokument !Trv4sjoqm4NL7b402c4CYm(dSG2ohwqtb88hHwBxHouAz2Db17g5z)s2f6nC6aZg2Szt(Y3(fqxmgJCPVoTOvpeiRRxRoT98E8(Tp5GrTOiGWiEnVoJnX)cH(JqyyiTtJWD9zV3rEIgX7d6z9hmaJUWXbHRJXRra8TUh3ZwtotpIWF20n7JBtR(9(KfILII1c5(KyXB6Z(Z5B(GUaDLR9)jg9dYoIVie0A(niCB6AXn1v6OA560YHPYfceU5b8zeMfIrT7qvoWLJSVqPlQENdoylhvGh7((TKF25CR3XhZACDDPUytGinxiPQYagI6rjQE121IknA)yyIW4dTguxnrj4FaX8QPdfn9Aroc7sLZ3iRxVHUlHxL9qyCQs9ATuBEa2y3KZmput9bczlfzRg34Vd7)acOVLfQgaDAKNcf64NLPvzljBdQYQRYpU5aoTW0KjcLhGy9PyJlg74QRoiq2rTAvrQC12Jq5L0IY7ekvktTpTDHS4Lx2NStiFvuSqi1FdHke8ogU3NzlsUzy75QL1VEcH9FI09jSY8lzeANsKTvwOFFOyNO0WQgHlmAYXNSgnm0N4k3ZDADUN3(eVwD7CzxNlqWNLVIskbQVhVuMwwIWuEOHC)fhLpLsZzDoZXovmGu56PhMXGHKNCIs8)uTA31JPdWFKbEHSsgEab69gcjZBTnknGm9NGrC2NXgnNqnr3k7a2eGVFp))Px3NukuIk71B6zRUEmqiZ9s6XmKoSOA38sHwlKZDVWaLNTs)BTZMQ9jndbS4Io9(EgPanwtBMeXRt7zGNVzySpxapNlPihycb4)nyMjCI9OvFtEMnW2mAJM3YFAe)7d

Der einfachste Fall ist ein Dokument, dass sich nur dann öffnet, wenn man ein Passwort eingibt.

  1. Erstelle einen Dokument-Gegenstand. Wenn du die Vorlage „Dokument-Gegenstand“ benutzt, wird automatisch ein vorbereitetes, inneres Dokument angelegt, dass sich bei Benutzung (onUse) öffnet.
  2. Überführe den Gegenstand in den Experten-Modus, denn es wird ein zweiter Arbeitsablauf benötigt.
  3. Füge dem Gegenstand neben onUse einen zweiten Arbeitsablauf hinzu: checkPassword.
  4. Entferne den Effekt „Dokument öffnen“ aus dem onUse-Arbeitsablauf, denn das Dokument soll erst nach der Passwortkontrolle angezeigt werden.
  5. Füge den Effekt „Experte > Eingabeaufforderung“ in den Arbeitsablauf onUse ein. Stelle darin die Objektvariable password ein sowie den Rückruf-Arbeitsablauf checkPassword.
  6. Der erste Effekt in checkPassword wird eine Bedingung sein: "Objektvariable password ist gleich dem direkten Text-Wert eniarku"
    In der Bedingung steht also das gesuchte Passwort. Als Fehlermeldung bei Nichterfüllung wähle eine Phrase wie „Zugriff verweigert“. Dieser Text wird angezeigt, wenn das falsche Passwort eingegeben wurde.
  7. Der zweite Effekt ist der „Dokument öffnen“-Effekt, der vorher aus dem Arbeitsablauf onUse entfernt wurde. Das Öffnen des Dokuments wird also hinter die Passwortkontrolle verlegt.

Das ist schonmal ein guter Anfang, aber das Passwort ist fest an das Item gebunden. Wenn sich das Passwort einmal herumgesprochen hat, benötigt man eine neue Version mit einem neuen Passwort.

Level 2: Statische Daten, dynamisches Passwort

Importcode: Ganz Geheimes Dokument !nsv3YPTsm4NLEBNPn2MqtdZKladjqkyiznH(ZCwSXwaUXExgVlesZe)003K(IvP1GZa9KZPJ9S)ODL0N(KwXT5(CpB83Qgo6Wz4SJLLvTtR7fwBBg3RgEdwppAmwgrt(FHZApKZ63d3P5SbTjPdqjEdP9DBwkVBhU3hSS4Sw(8wC2KECVtRJBh1S0PKP(mN90Qgrp3zRohYkcwalHKmiViWh2QFZtNS65IRlU2CNNste3)2OLHIfWOqL6bzE8B3Tqxe8RFkIHCXZKoO7ra0Y9tCVpIZKdzEnrylVFDgimNoA6LC2vHzGVuMQtw1fcr95SlVLpJZyUKoh6mscZNgnGhQcJKyoBty(0v5YSvOPdZxOkpK5bRbvrWEtueajOfNbcdBR0YCiUY(izZKilXzCV60sDzGG)PjknF)hRRnb(2GsNiE8sPq3D9caf7qIVb9OMeoDN0A7JusONmplmTpcr8OwdjqwswgsAe6zB7ZrOnMrjn3Hezqu3vHIFueCvz(bJOkQKOe8o300aFwlAZypA8oueMVDneABYYowNJ3SdTVNlYBIntZsurtfsnmxMgdX2XMce8ctmJUgJpPdzj9(0Iumwb)Vzd5SVdrhMnKgw)Bx8pgSEm7t8(rmotWzoKaN)6m((ksJRseRwR)xYVrlHO7Fr(RNSp6MhgZZQWtKueVFZoewcqJ6i(oGaoevKBiPxCXUx7)xQEeNvbtdpXMhMKoauQqQ46RRxKNmFErWgi)bizbKRFtviolpueT8vywSrJP2AQAP8Hdi3JApveq9KETxjkiADEI(X(Wgi1q(MwwSHJ3xcv19Qp29kgXSlwZZGuub178xMhMMILXCVZmf2)XjS2yIW5eRAN44ueyz1W2UHZzL9c7GT203TRZkl(o8MVV(7PNdhRKvTgNwNGc(yJqxpQIFWeZBN2JntyzpdRAy94S6BPf3IlivOEX98nVwXXMUV0IRiifuyBgJUvrBmOXuKY0GwBQelrLMZ)n

Um das obige Dokument zu verbessern, soll ein Mechanismus eingebaut werden, mit dem man das Passwort ändern kann. Das wird über einen Dokument-Link geschehen, d.h. wenn das Dokument geöffnet ist, hat man die Möglichkeit, das Passwort zu verändern.
Das Passwort wird dann nicht mehr in der Datenbank gespeichert, sondern individuell in jedem Item. Man kann also auch verschiedene Passwörter vergeben.
Ausgehend vom oben dargestellten Dokument-Item, gehe folgendermaßen vor:

  1. Im Arbeitsablauf onUse, füge den Effekt „Experte > Variablenoperation (Initialisierung)“ an erster Stelle ein. In diesem Effekt setzen wir die Objekt-Variable storedPassword. Das Standardpasswort soll zunächst leer bleiben.
  2. Im Effekt „Eingabeaufforderung“ ändere den Variablennamen zu inputPassword. Das gesuchte Passwort wird also in der Variable storedPassword gespeichert, während das eingegebene Passwort in inputPassword steht.
  3. Die Bedingung im Arbeitsablauf checkPassword muss dann entsprechend angepasst werden. Statt das eingegebene Passwort mit einem festen Text zu vergleichen, steht nun auf der einen Seite inputPassword und auf der anderen storedPassword.
  4. Jetzt fehlt nur noch die „Passwort ändern“-Funktion. Dazu legen wir einen dritten Arbeitsablauf changePassword an. Dieser liegt jedoch im inneren Dokument und nicht im Item selbst.
    Einziger Effekt in diesem Arbeitsabaluf ist „Experte > Eingabeaufforderung“ mit der Objektvariable storedPassword.
  5. Damit changePassword auch aufgerufen werden kann, fügen wir dem Dokument einen Dokument-Link hinzu.

Wir haben jetzt ein Dokument-Item, bei dem wir jedem Exemplar ein individuelles Passwort zuweisen können, bevor es verteilt wird. Aber das reicht mir noch nicht, denn der Inhalt ist festgelegt und kann nur in der Datenbank geändert werden.

Level 3: Die allesverschlingende* Schließkassette

* allesverschlingend-aber-danach-auch-wieder-ausspuckend-sofern-man-sich-das-passwort-gemerkt-hat

Importcode: Schließkassette !TF1xtnUnq8plDM(wBZz78hMlZKhcjP9YvWHdLaxBNQyh71jUySzKKdCCZ5Vk9f(MWxSURSXGdoPqkp2jzSLwjT)2D1U)Km3KpLBBI)nAIpT4m8TLHHLPHXYpOoiGB3eNbBSn(uXzt)nSn2NnGKMeptcud2u6jPlgKRqSvOpNT2vmpzXFbE4ADflL5dYs0q9h9(ts9mPYvLkNc3O42T4Sjbbqmcg9JH)JcL4ZyoZIe0CpbjkX7cWxdqGBeA21aqlsG1EcGoyu6ecWBLsEruiIA8pM5KEzMdeRw5gPGyiZ5xGLqSuD)DX(ypim(2uP3QOq4()UENVjjOnzrlkTTa3WOZtexeeLCnoBXxMftUjN5Le7)WSkCJCVWBfqJ7wXdkcneKu3E9k20xVrOcTIoLg2cHBS3kQtR9mGjvjcW)exP86er(otDoEBsWb1JXvIKlVQkg2qkiZCkuBUhTjsn1McHNDBQ5gOQi)C6t9YTgZ3r4omE9CCaLBymiMlJsuZjZUi0J)RlEhhgvk)hYf)svO1UvylTcB)kuyZDRWoAfEWRqHT2PcZ3TpOOTUVo6U30l92SUxjsRTSFV4v6vtr)TuvE)0GhRKZCQqeuh67fPtV6iopdeeYjs5)gfsvKKjPX(4o1Cjefubm2p)zco73BA0Pdb5In1B91)spr4g1LuZg5(td01KnOefKrmZPxMZth8b5FSoH0K)63QZ5AxkSKgSAMZJLW)F56lsHVKYvRCcXJbP0DjWzhcRU)o8iorMZLPsKhEDc20hEEDreqtsIN81OCZ8XZu2s9qn89vi6dJVkvvdppwMMNsSf(ED3Yj9QYB26PQvTLNfk31s348QslSsO(3txkcdcWqmiUgcxcc13vsNTz88TGD7n)knVDmFB9kJBLYB3euBJBQcX1h3jL2tQtEQbrxG6vFJPNDs2wVbR(YsDQXFFru8T3cfFHaj4LkcvF5iynePx8rJjaMm7HpfaN0mMU(zWdIy9XMF)xltL629)uEeX9Z(qFU(Rrgmrd)y0MzStP6vgBm(6Mw5wa(A4mUTbND850lCjhslLnCervfNQUfrWpeYPJWx)kwZbkfuyw(Up5QKzo3MM5OnlbsAXobV(OP57rqhpiNm9YqP3CABArYnlxLivHIeCt5Orue4Xu2UD15RFt7aOPB3hn3cp8IcdqtbHJ9P(6n8t6tDMztppRV2LgCk1zizewMy6XNgPNcJFiNDUE6SdPNdMQLmQiaC8qkaC0eoZh0tHXGiCdv(ttxjCJIq9JzbiKdgIrsR3z08DwwzoggDTm7AG46FgkVr7gytfov9hoYog13OpJ6Q6Im7AA0Tno(GNJJISa8SNiPoHz0G5NoQpBI9C0ZgFY0I0ZN95O18jQ5PNuyk3UuC()a

Das letzte Item ist ein Behälter, in den man beliebige Gegenstände einschließen kann.
Um das Passwort einzustellen, benutzt man den leeren, geöffneten Behälter. Wenn man Items in den Behälter legt und ihn dann benutzt, werden die Items eingeschlossen. Sie sind dann nicht mehr im Behälter zu sehen. Um die Items wieder auszuschließen, muss man den Behälter nochmals benutzen und das vorher festgelegte Passwort eingeben.

Damit das ganze funktioniert, braucht es etwas Luarkanmagie.

  1. Im onUse-Arbeitsablauf initialisiere ich zunächst einige Variablen, die wichtigste davon ist locked, die festhält, ob der Behälter gerade auf- oder zugeschlossen ist.
  2. Im fünften Effekt von onUse prüfe ich, ob der Beählter geöffnet ist. Wenn ja, prüfe im nächsten Effekt, ob der Behälter leer ist. Wenn der Behälter leer ist (und geöffnet), erfrage ein neues Passwort.
  3. Der Arbeitsablauf lock kümmert sich um das Einschließen. Zunächst werden die Zustandsvariablen aktualisiert, dann kommt das Herzstück, ein Luaskript:
    args.object.vars.content = args.object.content
    args.object.content = {}
    
    Der gesamte Inhalt (args.object.content) wandert in die Objektvariable content. Das was der Code macht, ist quasi ein Etikettentausch, so wie ein cleverer Arbeiter, der Zementsäcke vom Keller ins Lager schleppen soll, und daraufhin einfach "Lager" auf die Kellertür schreibt.
  4. Das Aufschließen funktioniert sehr ähnlich, nur, dass die Passwortabfrage vorgeschaltet wird. Außerdem prüfe ich, ob der Behälter leer ist, damit die eingeschlossenen Items keine anderen Items ersetzen. tryUnlock prüft, ob aufgeschlossen werden kann, onUnlock überprüft das Passwort, ändert die Zustandsvariablen und führt dann ein sehr ähnliches Luaskript wie oben aus.

Die Schließkassette ist sehr vielseitig, da man beliebige Items, sogar ganze Taschen, einschließen kann.
Hierbei gibt es einen kleinen Schönheitsfehler: Der Behälter wird nicht aktualisiert, während er benutzt wird, d.h. man kann Items sehen, die nur scheinbar darin liegen, bzw. leere Slots, die in Wirklichkeit belegt sind. Man kann sich behelfen, indem man die Tasche mit Doppelklick erneut öffnet.
Wer diesen Anzeigefehler beheben kann, darf sich einen Keks aussuchen.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

4 Likes

Juhuuu!
Vielen Dank für die Mühe und die vielen Guides und Tipps! :smiley:

1 Like

Extended am Sonntag #17


Die Konzeptomate

Kennst du das auch? Du möchtest einen neuen Charakter erstellen aber dir fällt einfach kein Konzept ein?
Hadere nicht länger, iss eine Konzeptomate!

Kostprobe:

Der Charakter verbrachte die Jugendjahre in einem Wanderzirkus in Unterstadt.
Eine im Alkohol ertrunkene Handelsreise machte schließlich überdeutlich, worauf es ankommt:
Geld. Und im Zweifelsfall richtet man sich nach Velen.

Importcode: Konzeptomate !LZv3UTnUs4xMfO3C22yN2KUfyVWn)3M)ALtsp7fYM2I2I10KzjPIBsr9RYEZ(mSxL78l2zgkhBlhYeVahymafiqrswI8JdhoZ8nIKP1sBMEAn4Vn2eowpnb()21RxV2gBZhT136ME6MWtKC0P4XmDx8Fn)VPj7EwAYXhbx5stE)zyrKCyJYlpCp4LEZgW9BM((0KKDkV95nkRkSa(sAY3V(hJ)WUCZ427KZmSbo80B4Mogw3ChFC7mbC4df95QSVYYnWf)Y31grFH6hJBlu4LsDxMtOv)4LJ)W3FfwG(sDpHY)0)zbtk6j4MFGxXVHRCWzdNw(2U5sbFYFjfDZh3EY9D4MmEHdV8)mU9iTHv0BCBUDCBMAGE4q37Quj)Y3DgMWbvD7luzaIgoU9FmIl6XL2EmPCCBJaRihwJaAT(QrXWJ)Y3fzA5dOgeoOqCNpME6BH)JIPKtBaIy9GIHaM9Y0nBTFAYbSH891k3PAZqM8yMPppnz)pN2jn5QJsp91Oq)WA4tUl36eQBXh(Wc8PoSoE7pva3hVzRY7EEOBEYUicob6Gp9mp2CLD5h1CANzIL72dLM45jnXJVbpWN1blYstUHzAP78vEx417Qvzp8JtFIYhOBoV7GwQ0ew5VKmYReA81kE2V)7t1aVbAFpGgOHBN(86YNcFOeFpm(yGGY44QRHJ3(W7a)jfw4iuzBH341RdiV5kd5Df8oq)GUWecXVbVr9ARdixFJvgZxPHsUu1)aEVj)TQVsyxg(iW3yDa8A)2kd8l5gaPwgOUhqydYz4KARffKARUgYN5zbHBnVYrmDJR5gga0flEJV4h5lE8h1dXYV83kDcmthyzjJVMwld2RT6J2t6Ml61ZA4cBybKF8(MRduxFLb9o6UdCmHmQrkS9dc81aORTYG(9CWjPOFHQFieVPx743wlq(TRmMtUwBC3GJcSoM0fb7En(eOyxhGF7vh8DZlKwa0rg6JM8s2EDa6TwzmFa3h5JfK55G1fzejo2dcEIxdq)n)lGENcJd0t6B7XHahdHBSZlzTOKV664hcoIVJlCb1r8A2Rff7vxV(qqXacuoQjBVEDT1I2rTvx9yQJghWmi8WrVUrT1Y4XAR(asa2sK0tqi7hgwBT4CS2Q7D8CZK77ZLCrqm7DnwB94BC1DoEoqJnIz6spJ1wlaE1dF)eU1YFwpJ1kd6BTec)Qhb)XGOwXnt(NE9uXa(SUoGV6XttvawreIY6dzWOKcOwbnjmbcHAo0H0AvqZmkM1weeZuI2AfuFLq54M)SGlLlJBhz4RwbXxGaggNM5cjOjfL1k4(mtFJy4qwWyP(jL6Afb0NaLWx4YzswWHqeI86sJ7LG)oviithMRvqCJcmfVcvqx0uI7AvlvCRdZNCiqtksRvqDIRWmCKaQ4qQ00H1Avv6cJ2f2qfDiRUeIvd4YCMi44q6WuTcOpGL1N7UlSTdcXwTcO3diQQSDZhkIKfwkXyTcY)mZb4M7ckTPeH1QgqesWA9qDeliuI1AfCFsHSV2eMfiLOTwb0FmND342NOZImMKs0xRcCEmZieI0AvJFAzwm71Z700QlSiSNsvnGK3uOAnsBg0tQhfOMN9fAdunErtGHopFroJeDGsnwqFpFPEuMoy0nETUabS)8L4NE4d)hQyJXJ(5l2Z8Z(GqLPNgZ2Lkq4R8nOWTGdd41GR3ERT2(TPjz(YbEWmUKDlO95V(jcU45rutCkiecqXC9NP76NtbTS5lvMlnVpg3gNShHusJ5G2QluzTezTSCzVkfDY(Fbb8PBbb(bdi6eQylDFgy8QWXh2cgOAbCx91MwkZednjvMD8ZoKYqhK6)SGRU7FJY4))X7ZrAFb8MBWjbZGiFpbkLtN5G(kwF(WIhbyhzsMZCOEP2GtgOGcxsLhN5q(ymB8H9z9ZzgCMlA(mh6kh3UaNdyNzYIMmA6KgN5yFxH9oX1YW(0OtwCMd4gkMPBUG8zWzoIbxtzIyXmrQ83mhZjoEUmYWD6K6M54DF2qHmSsbDYBZc(x9rggaS0jFnZb7b8Sczyo40jtnlQkOCmByDbkLHMfhSHtfcBh(OcR1z5rOgsPe1Si4N83MbHZ2bLsrZCeFKYbS4IyCJsjOPcK5sjc6Guiiv2zw0WHf8u3DqqitOSZSiIJyOBX5rGpzfnjfttCTe4BaVFeqtMnml4KMHomnNJxwKpghLOyodTxQLV4Rp26SJmmmNJuEKO3if7YzWn5w5nmvKV(9pN0lNjBAMZK3ATgwqHdD4uodWnuzfuNp5CWkLCJiOSLsSjNH3lC5HZPnPisox59wCei1N46ZG7bS7K6reNg5cO1y028qOLo8iNH2pMZY6hzoGrhEKZG7hGitcAwGsCixWjHjYeeIu0gNJ3caV3goLyKI24meFsbMgp6tACoGzYEfMiPDKumgNb5J1Mxa(3IntrjeLX5qwif4A7(sTnC0RlYCC(hLUjPOpoBvY7BsSclWB3Vo2J46MoejFeYL4IcimQPeLYQ4UqnAY94QQ8r42rgQLvrSRW0PaOy6O)QNUkWLmvFq1wgqw)tmzZLKr8CJHlGQiOiIouoxE0FpCd9aSEfh80Hb6JWUH3pMLlkXeTkUVwlfoHD22NI38ByBcuIFA1gHs4)(9O0xHB7lszSoccXzTAtiJpCY9oruni6WETkU7ykCmzqithkSvHm34mS(pH9r6qMDjGJQhmJlIRpkXRTkWhYuIRlKWLHd3GuuCxc6t(htg3GwiP)NiTk0hi9OMNZ6frStjAVvXoUDe1qoqNRLGDDyalUizc7xIumHR2k6vihkuSibztj6WlzOP46C9tOZViL4PtO6MKIpC5EmxzGzs742FuGtTpUqHBfCjAzgZf(RRrhIXpztyXTEdmONqnfkXwEHgtH6HDjqMzOdJxBFVIMHWFv2hd)ZfMyQqKI78cih3Ufr1ha9mPdoRp36xGdyFqJm)wEy05G3pP0Qdl(6x46m5EtFUFo27vHFcjhDyBVSjLVo5EvFRdnOCJgAf12c3daXuhcGpWasAX)E5wZ7zfaMhez9ktjg4p2CYHfDaXUHHRUDUmMSNumWFCJWt(UbUzVoBKI1z4k)noqxaM8JhleD4LVSEfo7YM8x8OAw0HzEmKNj4bxVw0HG(YiVqXZ5EJRtJ8jOodD4PVm(BYToBbaHbUfc78obtY)g4SuGlFVhS6MbrXnU9iwUYkukr5OfLEy4OlOej)WEhXythXnd4MNkEckX4pC7qIBMV34ZL4t7GNszaiqtbysFfsxWCNWmi8w8ePseWYJLUIHKCIz9LuS)xg6GhVrt(NCLpeR9eQ74YbEAC(b(LzGeozVOE8Pukcc04Son6F5jns)q3TdZwq3cJWD7X8B4sFz6395to7I0PRwE3d7C5hFgMs80KeCZNNlHxW(RtNImjxMIeot2jWpLSlAu5vBS5RQxFC76B(UnQ)oWmMFJqFVVaf5LWV)Y38s41DxMwUH5NSt1xQ(7Qx7DB4TpTZzE4DeU5SFYvPNcV2Ux4)xYoyOWjjhb8S)gEYNNs4UCRFF39G6t5YN83sWbW75o2V(rn09FTdKGjNNGddE7wPjxKG7U(hdp9PSCdUSdX6St5Eh)03qpeyA6ZUIVz)Pg((KZB43X49hVSHht743e53fl86Bac3pThE9r7GMcUP1qGLDREADwRxVPxUc)2fNIh3PPVO2dleNhtqlOb8A3va2oUe6MV2NNbuJf3tyhaoMhGRlEuimRFlJJ7eYOIJx561piODPP)V

Wie es funktioniert

Man kann es sich sicherlich schon denken: Das Item benutzt vorgefertigte Textbausteine und fügt sie zufällig zusammen.

Ein Blick ins innere Dokument offenbart, welche Teile des Textes sich ändern können und welche nicht:

{p}
Der Charakter verbrachte die Jugendjahre ${origin} in ${location}.
{/p}
{p}
Eine ${qualifier} ${event} machte schließlich überdeutlich, worauf es ankommt:
{/p}
{p}
${trait}. Und im Zweifelsfall richtet man sich nach ${idol}.
{/p}

Die mit ${} markierten Stellen sind Variablen, die vor der Anzeige im Item-Arbeitsablauf onUse ihre Werte zugewiesen bekommen.

Das Auswürfeln der sechs Variablen habe ich auf einen Arbeitsablauf pro Variable aufgeteilt. Das ist nicht notwendig, aber übersichtlicher. Jeder der sechs Arbeitsabläufe (z.B. setEvent) funktioniert ähnlich: Würfle eine Zufallszahl zwischen 1 und 20 aus und weise dann, abhängig vom Ergebnis, einen der vordefinierten Werte zu.

All diese sechs Arbeitsabläufe werden im onUse-Arbeitsablauf der Reihe nach ausgeführt, zum Schluss noch etwas Deko und ganz am Ende das Anzeigen des Ergebnis-Dokuments.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

4 Likes

Extended am Sonntag #18


Hinter den Kulissen der Datenbank

In diesem Beitrag von Enestress werden bereits alle wichtigen Funktionen der Objektdatenbank vorgestellt.
Im Folgenden wird es um das Konzept dahinter gehen, denn wenn man das Prinzip versteht, fällt es leichter, Kreationen zu verstehen.

Item ist nicht gleich Item

Wenn von „Item/Kampagne erstellen“ die Rede ist, ist üblicherweise das Festlegen von Eigenschaften, Arbeitsabläufen, etc. gemeint.
Mit einem Item in der Datenbank hat man aber noch kein Item in Inventar, denn die Datenbank ist keine Sammlung von Items, sondern von Itemvorlagen, man spricht hier üblicherweise von Klassen.
Dass die Datenbank kein „Lager“ ist, wird auch klar, wenn man die Datenbank-Funktion „Zu Inventar hinzufügen“ verwendet. Das betreffende Item verschwindet nicht aus der Datenbank, sondern ein Exemplar (Instanz) entsteht. Wenn dieses erstellte Exemplar zerstört wird, bleibt es in der Datenbank erhalten. Umgedreht bleibt ein Item im Inventar erhalten, wenn der zugehörige Datenbankeintrag verschwindet. Das Item ist dann aber nicht mehr benutzbar. Extended meldet uns „Missing Class“.

Datenbank = Bauplanbibliothek

Während das Inventar speichert, welche Items in meinem Besitz sind, speichert die Datenbank, was diese Items können, also ihre Eigenschaften.
Ein typischer Itemdatensatz ist sehr klein:

  • Item-Klasse
  • Taschenplatz
  • Anzahl (falls stapelbar)
  • ggf. Item-Variablen

Wenn das Item benutzt wird, konsultiert Extended die Datenbank:

  1. Gibt es die Item-Klasse in der Datenbank?
  2. Wenn ja, ist ein Verhalten „Bei Benutzug“ angegeben?
  3. Wenn ja, gibt es den angegebenen Arbeitsablauf?
  4. Wenn ja, führe den Arbeitsablauf aus.

Ohne Datenbankeintrag gibt es also kein Verhalten und auch keine Eigenschaften.

Austausch von Items

Wenn man einem anderen Spieler ein Item gibt, müssen folglich beide Teile (Klasse und Instanz) übertragen werden.
Wenn der Empfänger den Datenbankeintag bereits besitzt, wird die Klasseninformation ausgespart, aber halt:
Hier kommt die Version ins Spiel. Wer sich jemals gefragt hat, warum Extended zu jeder Item-Klasse eine Versionsnummer abspeichert, bekommt hier die Antwort. Die Versionsnummer wird verwendet, um nachzuprüfen, ob Absender und Empfänger eines Items oder einer Kampagne auf dem selben Stand sind. Sollte das nicht der Fall sein, fragt Extended nach, ob man die Version des Senders übernehmen möchte.
Die Datenbank kann immer nur eine einzige Version eines Objekts abspeichern, jedes Item der selben Klasse verhält sich also gleich. Wenn man eine neue Version eines Items erhält (entweder, weil man abspeichert, oder weil man einen neuen Import-Code einfügt), werden automatisch alle Inventar-Instanzen des Items aktualisiert.

Durchbrochene Hierarchien

In der Datenbank wird über innere Objekte eine Hierarchie aufgebaut. Diese Objekthierarchie hat genau zwei Aufgaben:

  • Übersicht beim Erstellen verschaffen
  • dafür sorgen, dass beim Handeln alle notwendigen Klassendaten mitgeliefert werden

Und das war’s. Im Inventar hat sie keinerlei (*) Bedeutung. Das einzige Ordnungsprinzip, das das Inventar kennt, ist die Anordnung der Taschen.
Jedes innere Item wird im Inventar zu einem eigenständigen Gegenstand, selbst, wenn das äußere Item suggeriert, dass das innere Item von diesem produziert/erschaffen/etc. wird oder auf sonstige Weise mit ihm zu tun hat.

(*) Bis auf eine Ausnahme: Wenn man bei einer Tasche festlegt, dass sie nur innere Items enthalten darf, wird es nicht möglich sein, ein anderes Item darin abzulegen.

Jedes Item steht für sich

Dass jedes Item (d.h. jede Instanz) losgelöst von der Objekthierarchie in der Datenbank existiert, hat zwei Konsequenzen.
Einerseits ist es möglich, jedem einzelnen Item einen individuellen Satz von Variablen zu verpassen, also einen individuellen Zustand.
Andererseits ist es nicht mehr möglich, mit einem Item im Inventar Einfluss auf ein anderes zu nehmen.

Typische Fragestellungen:

Wie kann ich die Variablen eines inneren Items verändern?

  • Es ist nicht klar, welches innere Item gemeint ist, denn es könnten mehrere Exemplare im Inventar liegen.
  • Hier liegt ein kategorisches Missverständnis vor: Innere Items sind Eigenschaften der Klasse, aber Variablen gehören zur Instanz.

Wie kann ich das äußere Item löschen?

  • Wie bei der ersten Frage ist nicht klar, welches Exemplar gelöscht werden soll.
  • In diesem konkreten Fall kann man sich behelfen, indem man das Item direkt über die Id anspricht, statt sich auf die Eigenschaft „äußeres Item“ zu verlassen.

Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…

2 Likes

Extended am Sonntag #19


Texturen und Bilder

Dokumente können Bilder enthalten, ebenso wie Zwischensequenzen. Bei Zwischensequenzen kann man außerdem noch ein Hintergrundbild einstellen.
Während Extended bei Dokumenten eine Bildersuche anbietet, muss man bei Zwischensequenzen den Bildpfad angeben.
Heute wird es darum gehen, wie man an diese Bildpfade kommt.

Grundsätzliches

In Extended können nur Bilder, Artworks oder Texturen aus dem Spielclient verwendet werden, eigene Kreationen (wie z.B. eine Charakterzeichnung) können nicht angezeigt werden.
Die Experten unter uns werden einwenden, dass man Bilder, die im Addons-Verzeichnis liegen, sehr wohl im Spiel anzeigen kann. Das würde dann aber nur auf dem eigenen Rechner funktionieren, was dem Zweck von Extended, nämlich dem Austausch von Items, zuwiderläuft.

Die Bildersuche im Dokument-Editor enthält bereits eine ganze Reihe an Bildpfaden, die man verwenden kann, sie ist aber nicht vollständig.

Die einfache Methode

Im einfachsten Fall ist das gewünschte Bild bereits in der Bildersuche hinterlegt. Wenn man solch einen Bildpfad benötigt, kann man wie folgt vorgehen:

  • Erstelle ein Dummy-Dokument.
  • Suche das Bild mit der eingebauten Bildersuche und füge es ins Dokument ein.
  • Der Bildpfad steht nun als Teil des {img}-Tags im Dokument, z.B. {img:Interface\QuestionFrame\answer-warboard-classic-StonetalonMountains:512:256}. Hier ist der gesuchte Pfad Interface\QuestionFrame\answer-warboard-classic-StonetalonMountains.

Möchte man dieses Bild für eine Zwischensequenz verwenden, benutzt man genau diesen Pfad.

Die fortgeschrittene Methode

Sollte man kein passendes Bild in der Bildersuche finden, kann man zunächst „informiert raten“. Wenn der Standard-Hintergrund für Zwischensequenzen bspw. Interface\DRESSUPFRAME\DressUpBackground-NightElf1 ist, dann gibt es bestimmt auch Interface\DRESSUPFRAME\DressUpBackground-Orc1
Wer einen besseren Überblick haben möchte, kann sich auch auf vorgefertigten Ressourcensammlungen im Internet umsehen. Auf diversen Projektseiten haben sich Addon-Autoren die Mühe gemacht, alle im Spiel enthaltenen Bilder aufzulisten.
:warning: Beachte, dass alle Bilder aus dem Spielclient geistiges Eigentum von Blizzard sind!

Die Expertenmethode

Texturensammlungen im Internet können veraltet oder unvollständig sein. Für alle, die es wirklich wissen wollen, hat WOW eine eingebaute Exportfunktion. Damit kann man alle Bilder aus dem Spiel in ein separates Verzeichnis extrahieren, wie aus einer ZIP-Datei, um sie anschließend zu betrachten.

  1. Besorge dir ein Bildbetrachtungsprogramm, das in der Lage ist, BLP-Dateien anzuzeigen.
  2. Stelle sicher, dass genügend Platz auf deiner Festplatte ist. Du wirst ca. 6 GB benötigen.
  3. Starte das Spiel mit der Konsolenoption:
    Öffne die Spieloptionen im Battle.net (Zahnrad neben dem blauen Startknopf).
    Setze einen Haken in „Zusätzliche Befehlszeilenargumente“. Ein Eingabefeld erscheint.
    In dieses schreibst du -console.
  4. Logge dich auf einem beliebigen Charakter ein.
  5. Gib den Makrobefehl /run SetConsoleKey("z") in den Chat ein. Dieser Schritt ist notwendig, weil die Standardtaste, um die Konsole aufzurufen, sich mit dem deutschen Tastaturlayout beißt.
  6. Logge dich aus. „Ausloggen“, nicht „Spiel verlassen“.
    Du landest wieder im Charakterbildschirm.
  7. Drücke die Taste z, also die eben festgelegte Konsolentaste.
    Ein Konsolenfenster öffnet sich.
  8. Gib ExportInterfaceFiles art ein und drücke dann die Eingabetaste.
    Dieser Befehl braucht seine Zeit. Das Bild kann für mehrere Minuten einfrieren, denn hier werden mehrere GB an Bilddaten entpackt.
    Übrigens: Mit ExportInterfaceFiles code bekommt man den Lua-Code des Standardinterfaces.
  9. Entferne das zusätzliche Argument aus Schritt 3 wieder. Der Makrobefehl aus 5. setzt sich nach einem Spielneustart von selbst zurück.

Nun sollten alle Texturen in _retail_\BlizzardInterfaceArt\ im WOW-Installationsverzeichnis liegen. Wenn du ein passendes Bild gefunden hast, entspricht der Pfad, den du in Extended angeben musst, dem Teil, der mit Interface anfängt, aber ohne die Dateiendung .BLP.


Viel Spaß beim Experimentieren und
:wave: bis zum nächsten Sonntag…


(OT) Edit/Nachtrag: Defekte Dokument-Links in Version 1.5.0

In Version 1.5.0 hat sich ein Fehler eingeschlichen, der bewirkt, dass externe Links in Dokumenten nicht mehr angezeigt werden.
Wer diese Feature ausgiebig benutzt, kann auf einen Bugfix warten, oder, im Geiste dieses Threads, die defekte Datei vorab selbst austauschen.
Die Korrektur ist bereits auf dem GitHub von Extended verfügbar. GitHub ist eine öffentlich zugängliche Code-Bibliothek für viele Software-Projekte, darunter auch WoW-Addons wie Extended.

  1. Lade die Datei https://raw.githubusercontent.com/Total-RP/Total-RP-3-Extended/8656bced78199dde22792df5823e5569b7ae99e1/totalRP3_Extended/document/document.lua herunter.
    Auch zu erreichen unter https://github.com/Total-RP/Total-RP-3-Extended/blob/master/totalRP3_Extended/document/document.lua. Von dort klickt man auf „History“ und dann auf das Commit vom 18. März („Document URL fix“). Dort klickt man rechts auf der Titelleiste der geänderten Datei auf weiteres „(…)“ und dann „View file“. Zum Schluss führt ein Klick auf „Raw“ zur gesuchten Datei.
  2. Speichere die Datei in deinem WoW-Installationsverzeichnis unter _retail_\Interface\AddOns\totalRP3_Extended\document\document.lua.

Wer so vorgeht, bekommt das Beste aus beiden Welten, die aktuellste Version, aber ohne den nervigen Bug.
Sobald die nächste Extended-Version erscheint, werden alle Dateien regulär mit der neuesten veröffentlichten Version überschrieben, es ist nicht notwendig, diesen kleinen Vorab-Fix „aufzuräumen“.

2 Likes

Jeah! Vielen dank für die Infos!

1 Like

Extended am Sonntag #20


Kampagne: Hasenjagd

Im letzten Teil dieser Miniserie stelle ich eine kleine Kampagne vor, in der man sich auf die Suche nach allerhand Hasen begeben soll. Natürlich hat das total überhaupt keinen Bezug zu einem gewissen Feiertag, von dem ich nie etwas gehört habe.

Importcode: Hasenjagd !nRv3UTTXs4NLauGc0ARs9VKr7Xq)fBLAlL4v2UNGasrjTIAJPivixzh7IYNKdW5M(mKRYD6f7mZSl)rYYXXXQbhedjXLlNz2z)MVzMLXmV5aZE5H)mkcFwWKzuYOAH8LRuQCR3(kNUM9kcZG1Th8P0Kn4FBYA1WKXAPUEcxAlCdvx8Mo4u)GrbR53A5zpNBjcTMzhWXHB0kvcV58ujCsx13N2gN1P9nz96JxFCd14nBq6VLjlCb311AUTJyS1cF3BN7hSywG9OrcyAT7yYYLlx0WjlJgov4bgw0W5IXZIg6bFkZzYE9zMnbPdw)PCHx0WEGfgnuect8y7qo8006CeQ141lBaQ9WcwGiTDjlCd7uBF4ZrYozUSb)bm(SGOHZShb6ych1P)iBxh7aj3BgOtyeh(0LG16bMEh0QUeVkypy(2HHrd5H6N8grWvU06XrmcxoVSlSCKAhjZ3RJNKhG)uzZ4glJR2DHFjMaMMpiBlXeRqU7utMDGtO6(m2l)dCZVxL81XnC0fG)Jb)5coitMNjRaoqX7lvHKp3YEYK1e4gOOOHBbvenmmp6RMaRshhc8LxP9ELaX6Dn3t6hC7M2IenL7zfFyjpucGJGR6p69T994pzZHmaFYG22YVOEWmqtekdoBfeM1NLUlKbbPX9WV0R2hge1gamTxI4LWeWBc8aX234FZlOn(ySMwIOYAQaCTTdMcGA8rvc4A)Gqje4W9omA42b(rVQlnFBhaRfWfrdBl8C4he9QOxTpbeHGOvFkycI)GNSzG94zU2WghE73U6ZoC6xnyT62fFiunW8AaclmeKZWJ3Rr0q2ED2941ABfVQVeuYCFj)lQKjcBxFhRqjeu(KXmzGWtCDSgT0ZBl41SWgLIbFqIXX6CbS1D2RlA150(daASw9JNN2knzGBF8vwCmIW6A7aWon102KOrK7V9BAQ6RrP1aqeX35Nv3iryl9esRjGPz7nMdmPcpzIazlCTVf2wqN7(5lwVCoYb3B)I1Rwix5ez(RjkRxbZmRXgzz13AibdJ1HVoNL6iopKtpk7Wdpmt4a4l6qaPl5Usaxgc)C6QpdmQem(AEWe75ZLifzhbIIBDma1AWyDIg(MZ7Wg0P3lEbeW8AgS0YxRcPuio5eqW)U98f2oinb4U1Hta5mxtoZfeKbUXBAq0rSM4fx2a)8cyid4bpJgQdDrBuhfmkQsvbKxwW60YOkOD6zoNsqaziHpBrc(SUaKaZb8EBNjzdmqVXZlSOuTcfl9fcmKAqgRprLWoZKvg(cmOYFSKAtb(Q950k70lXV00DD3c5LMPd(vAmqY0A1gIKQ)lgL(LcfIgwO4bLQCqPAW4W(aJ7cq6W9hazXDDjF89gtRgg7bKZfQyGyitxTTMsYm5l6lvPnC8h4ZK8fFlX)XP7)Ir9PreDITkjHzITfI6EjrYVv2FWj0gHmhDmm5tieBNxtOOZXvD7c1QwOY9qXyjgGR5iypcJbNApM)UJobImE3P(t4UHV78Uw9eoZKJ8d84DCN(UQSZSoYoau5Gao3QLTN)IBnaVXjNNWnqmaAB(v2GfFPVoBYCfVFtUR)mVLEohQm7t68YnSA0o)H)ugS4aLmpy6sx3)cLCXyjtPKgHX5q5quHtzxvpSdzBUajgcRL7XaSY)EYdQ36gmnNi8hJg(EU8UFe3cKYN5QPCSwpD1NGIq5OtclqfuSUUuSWoihPhzablNRZDt5CtZZI5MHz4tUckH7HpvhqLytPdupWCBxqhISRUCp9vx1yr(RT3YwKQqvGAEjUGigBGBagyehuFmR9)sP2E971zD129uu6n7tXINFwwiC3w97XExwo2tuKWd6tFDjWcubiWoUJ6BGPvNOuZIb0ej)MP5U63KymskrdxxX9rqfGp)wOoQaXQprLTtm3qsRgur4Ke(GHQwaIzazrsYgM2dJ9iHRqERLe2AVckYsLL7LA9ekqG4iouZw8fR(7zZ3tRUjyvzrdLl9wRBMJvnsS6ZJ4iN5l0Ldk)67XkUNSDvxpnGYn12maRxgq(p7LtD4HlG83WkDjcQdPcNeaM)3bopIL7)xAQrLx4BROWn1JCRnSqTnfWN7F9J2QswyvMkohd6mWw13KHHbUgF4UMEGwyE861YgM84TWG7(R(pkGiS1cB7nUJh4lNrLRbBYJVcXcHej3vUQ8feqbYJKjmaGlegsHtgptWx9FH7Chsq2KFdulOMs5L(sFIQgjAcqAiCKRixdusiwM30z2ldLcoMU(gFStOeUxhEaCXu4jCcSNctb5J5btIXIBVplSpTJS9UJSSvFclfvWHL7jaeh0IatjIwciMRKXl2qFkbJ3Yamui8WDpkF7Tc9Lq5s(hxhE3jygsn7bTS9d)5tfj(xKDu8ja)PtnySpbOwVHhKCNMYyyHltBp5PAtu0X6bfu7lPnlr1lsw5Zoi8R4Wl(MddzAfn4b6CkGda6q8eIUIkMaduYeGC3YKWiiTLmBlwDNWTD1prtHlvIX1(EQiqapGRsnvoGVVBPhF2Cm1NQRQ65FSUQsJhZ2svrQXOMpElv5Z0s1Cr4ylyHaXacUYHyzuiU5kvlA7KwSGEST8xaI3B9J1cUhUtFdz)uF0ElgBHJwspdiJHdxMUdV9WqbjMpcvyKs9G(0qAHRuIepDvOIlyRNU2dBkloyAuI5U1Wh0(PZminY5gvOWKKyGShyqEJQgfQMCRFAJtm4jlUcvkxtbZXOHFsvi83S4QuQAD9rpuHKw1NJ0QvVyDvmFVAK0Q)CKwH6flutDN8gK4Y)82jkBuRAch6uBH7P8WqBhiKQnMw83jupMLs4qPRWSl7PByaJYxdrLldHdcOgbi6XZWlOotE0Jq9FcW1MhhLsT(JE)xnlpjgFRnKBgvMKe8RNs)(YCJG3k4aLUVx7XZmNVw(AvFWCZiWMv973UrMGPD5MX6IDNSxKkYnCzy8gRY3pxww6SDPpBd5UtCAzK5gEnevZQ)9ZRLHzCxKsjLxetP8ZBKs5BEpyDRCNSfKkYn2bYthnzTVFBbzs1TlXTRl2DIplvKB4ZQJdqPuFwNC7gvV)GhAlUhniBQYhRsReNO14Lbqgx5xVZCloWKZsYJw0Ym)7FKtSxU9ZattImq1pp(2NwIDfCmDCY6J8knzPEA9eC1lieCWhV6VHUnYCazjBX6j33vCnmJBGUONTHuv0(65nW31wS5muby6z0i4kPiCTPOxzQv9j9X6O3(lC4cOuYYB)9oGVVH8gXVVbdJdku4G8LtFFetUaUFUY5m0VIJQjVAI8huUYbLGPkX3nb(FRcjDgNudEBTHpz2tie7Z598B4UJHI4KcphaJdnL5rNSe7mOHQ8rd3pAyEddv)Bm9rQrhNBAJA7PhrD6dyNGo0rwSLZJjhDARSJSdcElq(0qDgL7d9YmYfWPPhYyCBuHCaSdt5eWL5QA5hjLv(dPP5)7d

Wie es funktioniert

… muss wohl ein Geheimnis bleiben, denn das kleine Rätsel soll doch nicht gespoilert werden.
Wer dennoch wissen möchte, wie die Kampagne aufgebaut ist, kann nach dem Importieren gern einen Blick in die Datenbank werfen.

Wer weiß, vielleicht findet sich ja jemand, der das Abenteuer weiterführt?


Viel Spaß beim Experimentieren und
:wave: bis irgendwann mal wieder…

2 Likes

Die Textkopiermaschine

Früher, wo alles besser war, wo Extended noch GHI hieß und Gott noch ein DJ war, konnte man den Inhalt von Büchern einfach in ein eigenes Item übertragen.
<Suggestivfrage>Ob das auch mit Extended geht?</Suggestivfrage>

Hör auf zu labern und gib mir die Lösung!

Auf Wago findest du die aktuelle Version des Items: https://wago.io/y8juN17eZ.
Mit einem Klick auf „Import-String kopieren“ erhältst du einen Import-Code, den du wie gewohnt in deine Objektdatenbank einfügen kannst.

  1. Bereite das Dokument-Item („Rohling“) vor, in den der Text eingefügt werden soll. Dieses Item muss ein leeres inneres Dokument enthalten.
  2. Lege die Kopiermaschine in dein Inventar. Du kannst dazu die Datenbank-Funktion „Zu Hauptinventar hinzufügen“ benutzen. Die Kopiermaschine findest du unter „Datenbank anderer Spieler“.
  3. Die Maschine benutzt den Makro-Effekt. Damit sie funktioniert, musst du sie in den Sicherheitseinstellungen freischalten (Alt+Rechtsklick).
  4. Die Kopiermaschine ist ein Behälter. Öffne ihn mit Doppelklick und lege deinen Dokument-Rohling in den ersten Platz der Maschine.
  5. :warning: Beachte: Die Itemdaten deines Rohlings werden verändert! Eventuell vorhanderer Text wird überschrieben. :warning:
  6. Lies die Warnung in Schritt 5.
  7. Öffne das gewünschte Buch bzw. den Brief im Spiel.
  8. Benutze die Maschine per Rechtsklick.

Wenn alles geklappt hat öffnet sich die Datenbank und der Text ist in der Dokumentvorlage sichtbar. Du kannst ihn jetzt weiterbearbeiten.

Wie funktioniert das Teil?

Idealerweise sollte diese Funktion Teil von Extended oder von einem TRP3-Zusatzmodul sein. Ich habe es in ein Item gegossen, um euch ein weiteres Addon zu ersparen. Wer Lust hat, aus dem Code ein Modul zu bauen, darf das gern tun.

Kern des Items ist ein Makro-Effekt. Dieser führt ein Lua-Skript aus, das ungewöhnlicherweise in den Item-Notizen zu finden ist. Hier war also etwas schwarze Magie erforderlich.

Das Skript aus der Item-Notiz ist das eigentliche Herzstück. Der obere Teil sucht nach dem Item (das Item sucht sich quasi selbst), während der eigentliche Kopiervorgang am Ende steht:

local currPage = ItemTextGetPage()
for i = 1,currPage-1 do
	ItemTextPrevPage() -- blättere zur ersten Seite zurück
end
local PA = {}
table.insert(PA, {TX = "{h1:c}" .. (ItemTextGetItem() or "") .. "{/h1}\n" .. ItemTextGetText()}) -- erste Seite mit Überschrift
while ItemTextHasNextPage() do
	ItemTextNextPage() -- alle anderen Seiten einfügen
	table.insert(PA, {TX = ItemTextGetText()})
end
documentClass.PA = PA -- Au weia!

In der letzten Zeile geschieht dann das Ungeheure. Eigentlich sollte man die Itemdatenbank nicht so direkt bearbeiten. In diesem Fall geht alles gut, aber es wäre schöner, wenn die Funktion in das Addon selbst oder in ein Modul wandert, wo sie eigentlich hingehört. :wink:

7 Likes

Mit dem neuen Inhaltsupdate 9.2.5 erhielten auch TRP3 (auf Version 2.3.11.) und TRP3 Extended (auf Version 1.5.1.) ihre Updates, die das oben zitierte Problem beheben. Ich empfehle daher zeitnah auf die entsprechenden Versionen zu updaten.

Womöglich gar auch die ideale Gelegenheit dem „Guide für Backups und der Datenrettung“ nochmals einen Besuch abzustatten, sollte man sich zu den Leidgeplagten zählen, die öfters nach einem Update ihre Flags missen.

▲ Zurück nach oben
▲ Zurück nach oben
Item mit Aufladungen / Begrenzte Anzahl Anwendungen

Einen besonderen Dank an Frejna(@DieAldorEU), basiert die Idee und der erste Entwurf dieser Itemart auf einer Frage zu TRP3E, die sie einst stellte. Eigentlich bestand zunächst gar keine Absicht einen kleinen Guide zu dieser Art Items zu verfassen, liegt das gemeinsame Herumtüfteln mit Frenja auch bereits gut ein Jahr zurück.

Doch wiederkehrende Fragen, die nach dieser oder ähnlicher Möglichkeiten in TRP3E sich erkundigten, legten nahe, dass es womöglich eine hilfreiche Ergänzung für diesen How-To sein könnte.

Dass es so ist, mag verständlich sein, ist die Lösung wohl nicht direkt offensichtlich. TRP3E bietet keine Checkbox an, die mit einem einfachen Klick es ermöglicht ein Item mit begrenzten Aufladungen oder einer begrenzten Anzahl an Benutzungen zu erzeugen. Leider wird man dafür etwas mehr tun müssen als das. Aber keine Sorge, einmal verstanden, ist die Lösung recht simpel.

In diesem Beispiel bauen wir ein simples Puderdöschen, welches genug Inhalt besitzt, um das Näschen genau fünf mal zu pudern.

Sollte man Schwierigkeiten haben, so kann man das Item, welches wir nun bauen, auch als Import-Code weiter unten finden.

Aber der Reihe nach.


Ein Puderdöschen

Zu Beginn brauch es natürlich überhaupt eines Items, welches wir mit den begrenzten Anzahl an Aufladungen ausstatten können.

Der einfachste Weg, um alles zu bekommen, das wir brauchen werden, ist schlicht ein ‚Expertenitem‘ zu bauen. Keine Sorge, es klingt komplexer als es eigentlich ist.

Gegenstand erstellen → Experten-Gegenstand

Auf diesen Gegenstand können nun nach eigener Vorliebe alle Anzeigeeinstellungen ausgefüllt werden. Die für dieses Beispiel wichtigen Einstellungen sind jedoch die folgenden:

  • Ein Häkchen bei ‚Benutzen‘ setzen
  • Die Textvariabel ${useVar::5} in einer der Beschreibungsfelder des Items schreiben

Während die Itemeigenschaft ‚Benutzen‘ womöglich recht selbsterklärend ist, mag die Textzeile ${useVar::5} vermutlich zunächst eher kryptisch erscheinen. Was genau bedeutet sie?

${variabelname} ist ein Textplatzhalter. An dieser Stelle wird in einem Text immer der Wert angezeigt, der unter dem entsprechenden Variablennamen gespeichert ist. In diesem konkreten Beispiel weiter oben also der Wert, der unter der Variabel useVar gespeichert wurde. Noch existiert diese Variabel aber nicht, weswegen wir einen ‚Defaultwert‘ angeben müssen. Dies geschieht, indem wir ::x hinter dem Variablennamen setzen. Wobei X alles Beliebige sein kann. In unserem Beispiel sehen wir eine 5 dort stehen. Das bedeutet, solange die Variabel nicht initialisiert worden ist, wird an dieser Stelle im Text der Wert 5 stehen.

Natürlich, kann dort auch jede andere beliebige Zahl stehen. Welche, das kommt ganz darauf an, wie viele Aufladungen/Benutzungen zu Beginn möglich sind.

Im Beispielitem habe ich diesen Platzhalter in das Feld ‚Rechter Tooltip-Text‘ geschrieben. Jedoch kann er nahezu überall in den Anzeigeeinstellungen verwendet werden. Ebenso kann man ihn in Dokumenten-Items verwenden. Weitere Beispiele kann man im Guide von Seleves zu Dokumente unter TRP3E unter dem Punkt Variablen-Tags in Dokumenten nachlesen.

Warum machen wir das aber? Nun, das ist im Grunde ganz simpel. Wir sollten natürlich demjenigen, der dieses Item benutzt, mitteilen, wie viele Anwendungen ihm noch verbleiben. Es direkt in den Tooltip zu schreiben, ist dabei die offensichtlichste Möglichkeit.

Damit haben wir jetzt ein Item, mit dem wir fortfahren können. Ihr solltet also zu diesem Zeitpunkt etwas haben, das ungefähr so aussieht:

Nun speichern nicht vergessen.

Ein Arbeitsablauf anlegen

Jetzt fehlt nur noch ein Arbeitsablauf, der das Mitzählen von Benutzungen ermöglicht. Keine Sorge, in seiner simpelsten Ausführung ist dieser Arbeitsablauf äußerst kurz. Genaugenommen sind nur drei Schritte wirklich notwendig.

Sobald ihr also einen Arbeitsablauf erstellt habt unter dem Reiter ‚Arbeitsabläufe‘, fügen wir mit ‚Element in Arbeitsablauf einfügen‘ folgende drei Arbeitsschritte ein:

Variabel initialisieren
Effekt → Experte → Variabelnoperation

In diesem Effekt wählen wir die folgenden Einstellungen:

  • Quelle: Objekt
  • Art der Rechenoperation: Initialisierung
  • Variabelnname: useVar
  • Wert: 5

Was genau haben wir damit aber nun bezweckt?

Wir haben eine Variabel erzeugt (initialisiert), die so lange gespeichert wird, wie das Item besteht (Quelle: Objekt). Diese Variabel hört auf den Namen useVar und beginnt mit dem Wert 5.

Sowohl Name als auch der Startwert können frei gewählt werden. Es muss an anderen Stellen dieses Beispielitems nur berücksichtigt werden dann. So z.B. der Variablen-Platzhalter, wie er weiter oben beschrieben wurde.


Variabel subtrahieren
Effekt → Experte → Variabelnoperation

In diesem Effekt wählen wir die folgenden Einstellungen:

  • Quelle: Objekt
  • Art der Rechenoperation: Subtraktion
  • Variabelnname: useVar
  • Wert: 1

Dieser Arbeitsschritt bewirkt, dass, wann immer er durchlaufen wird, die Zahl, die unter useVar gerade gespeichert ist, um 1 reduziert wird. Also, die Ausladungen/Anwendungen des Items reduzieren sich um 1.


Gegenstand verbrauchen
Effekt → Inventar → Gegenstand verbrauchen

Zum Schluss möchten wir natürlich, dass das Item ‚verbraucht‘ wird, sobald alle Aufladungen/Benutzungen aufgebraucht worden sind. Also, der Inhalt des Puderdöschens aufgebraucht worden ist.

Lassen wir diesen Eintrag so nun im Arbeitsablauf stehen, wird er bei jeder Gelegenheit ausgeführt, was wir natürlich nicht wollen. Daher müssen wir ihn mit einer Bedingung belegen:

  • Rechtsklick auf Effekt: Gegenstand verbrauchen
  • Effektbedingung bearbeiten
  • Auf den ersten Eintrag unter ‚Bedingungstest‘ klicken
  • Im linken Feld: Experte → Variablenwert (numerisch) setzen
  • Dort Quelle: Objekt und Variablenname: useVar setzen
  • Im mittleren Feld ‚ist gleich‘ auswählen
  • Im rechten Feld: Direkter Wert → Zahlenwert setzen
  • Dort eine 0 als Wert setzen

Am Ende müsste bei Euch etwas zu sehen sein, das so aussieht:

Damit wurde sichergestellt, dass das Item nur dann aufgebraucht wird, wenn alle Benutzungen aufgebraucht worden sind. Also die Variabel useVar den Wert 0 erreicht hat.

Nun speichern nicht vergessen.

Euer Arbeitsablauf sollte nun folgendermaßen aussehen:

In Worten gefasst, wird der Arbeitsablauf jetzt also folgendes machen: Er wird bei einer erstmaligen Ausführung die Variabel useVar erzeugen. Vor der Benutzung wird im Textplatzhalter der Defaultwert angezeigt. Die Rechenoperation: Initialisierung wird genau ein mal ausgeführt, egal wie oft der Arbeitsablauf durchlaufen wird. Mit jedem Durchlauf wird die Variabel um ein reduziert. Dies geschieht so lange, bis wir den Wert 0 erreichen, worauf das Item zerstört wird. Es wurde also aufgebraucht.

Natürlich kann man diesen Arbeitsablauf noch um eigene Schritte ergänzen. Wie Textmeldungen, die erscheinen, wenn bestimmte Füllstände erreicht worden sind oder aber Klänge, die abgespielt werden, wenn das Items benutzt wird.

Damit wären wir beinahe durch.

Den Arbeitsablauf verknüpfen

Das einzige, was nun noch fehlt, ist es, die Benutzen Aktion mit dem Arbeitsverkauf zu verknüpfen. Dazu gehen wir schlicht in den Reiter ‚Ereignisverknüpfung‘ und wählen für den Punkt ‚Bei Benutzung‘ den Arbeitsablauf aus, den wir gerade erzeugt haben.

Geschafft! Du hast soeben ein Item mit einer begrenzten Anzahl an Benutzungen angelegt.

▲ Zurück nach oben

An dieser Stelle sei bedankt, wer mir bis hier hin gefolgt ist. Und ich hoffe, dieser kleine Guide konnte dem ein oder anderen von Nutzen sein.

Wer auf Probleme stößt oder Fragen hat, darf gerne diese in diesem Thread äußern oder aber im Privaten direkt über den Ingamechat an mich wenden. Oder sie oder er möge in das Beispielitem hinein schauen können. Wie dieser Code zu verwenden ist, kann man hier nachlesen.

TRP3 Extendend Beispiel-Item-Code (klicken zum erweitern ...)

!vk12UTjqq0FM(AIzHqXfj)a(IuTKdo1JV0QQUemS1zBTxIGfRErnFw9hO)y9mluvLK(sfOb25Y5CMzhPqUwMkWRxWlLP(sYluejc8gggDyyuDJmnazqZtH1kP1Vd)JZ0e2BrLPP9Kk5JwvnNarRzlJjP6ag)PlL0586SQ9FsvamYRp00fKQCu((rFGPHABuBZRLPxjPqqg)q49OUbwJK8zhbphCTvDkRxlorv(NW950XFXDQIpNbCYFe79SYSXhhnQVLplt96vXJuILfY)xdEXtBpX)Q9c(lxLkBU(yt3mFXCMKLBE68gHUEQBQpfssmq4pW3)HBfdJf(XEGLjJrS70L5xmvRsowwvlPTqqqlLBHiUm8Yqa)sMpiLT9Bb01WZS3I6bUIObEHD4ge7nmomcy(CCHwEDsNCNS0j35Y9iRv8vjrZXNVCLBTHWNPB4zlD9UUrmTHKD7uuLztd0sc(DSY0A)MYWjmMXMUHGcfVs4kaAyXm0pQ69h1Q9kJ6HB7kP1CqzIDcbsinbf2wQQl)1pBWkGXTLIaVjXDdHMbh2K6CnJTtwX2DZWKkeQCkZQVadTTOIqp4AxcNXno7Ci1iVmTPPOwFVvxzYUxF4KYyZQRAu5w0otCeUctHx89UTG44WFWnwJQOTwB)6c1z1rElX2TF4UASs5V)d

1 Like

Extended 2.0 macht Auren möglich

Mit dem Extended-Update 2.0.0 kann man nun neben Gegenständen und Quests auch Buffs oder Debuffs selbst erstellen.

Neuer Objekttyp Aura

Damit du dich selbst anständig stärken (oder schwächen) kannst, steht der Objekttyp „Aura“ zur Verfügung. Ein Aura-Objekt muss als inneres Objekt erstellt werden, d.h. du benötigst ein weiteres Objekt, das die Aura auslöst, im einfachsten Fall ein Item.
Als Einstieg kannst du dir die Vorlage „Auren-Item“ in der Datenbank unter Gegenstand erstellen ansehen.

Sichtbares Verhalten

Wie „normale“ Buffs werden auch Extended-Auren als Icon in einer separaten Buff- bzw. Debuffleiste angezeigt. Du kannst die typischen Eigenschaften wie Name, Beschreibung oder Laufzeit ähnlich wie bei Items in der Objektdatenbank einstellen.
Jede Aura ist einzigartig pro Profil, d.h. man kann unter dem Effekt der Aura stehen oder eben nicht, man kann dieselbe Aura aber nicht mehrfach haben. Wenn du das Profil wechselst, verschwinden deine Auren nicht, sondern werden pausiert, bis du wieder zum ursprünglichen Profil zurückkehrst.

Arbeitsabläufe und Ereignisse

Ähnlich wie Items können auch Auren weit mehr als nur hübsch aussehen. Eine Aura kann, während sie aktiv ist, regelmäßig einen Arbeitsablauf auslösen, z.B. um einen DOT-Effekt zu simulieren.
Auren können außerdem auf Spielereignisse reagieren. Man kann z.B. eine Aura erstellen, die erlischt, wenn man ein bestimmtes Gebiet verlässt, oder einen Buff, der schneller abläuft, wenn man anstrengende Dinge tut wie Kämpfen.

Eine Aura als Brücke

Die Eigenschaft, einzigartig zu sein (pro Profil, pro Auren-Objekt), macht eine Aura zu einem guten Kandidaten, um Zustandsdaten des Charakters zu speichern.
Zwei Items können so z.B. über einen Buff „kommunizieren“, was vorher nicht so leicht ging.

2 Likes

Auren in Aktion: Der Trank des unerbittlichen Plünderers

Wie wäre es, wenn Extended-Gegenstände droppen könnten, während man sich so durch die Welt von Warcraft schnetzelt?

Importcode: Trank des unerbittlichen Plünderers !9A12YTTnq0VL(AV4qrk1yLPPZitXMOzSPCcKKBFbuqsquyeiPgas548G(AY3qFQV5FSEwqDXw2XTEAChBddS4YUNZUC3L3GpGh3a)6fCkp2NZ8A5714uFVGGwJAlFhpoaNG1lMgfvgX(vLC2zDOvrr8jCwNo04zH0yVqC2jkTQ8MetrALeJAD5c5KICP1RfNfgYpJZ6oek(uppmlc)jSBgFP(2)kFM0KVz86cm8ozAUBvQ86B)YctjntltL5LA10fBg)5k7TFP8Z0c5MXNjRkLNWzXDGfvnptAwAfzlLkCVzs8(v41MOkDxwMFqFsJLZEFezvxrJaDSqcDf5NxuusZydOrIWyYAwdZuZ4S1ctsXkPrKJfctQTExMXrOxtuiJ2SiJh3C7EnC71ayVC7pm8RwzXyoN5tccEOQuLYSenzqSPfqDB3B7bQnfaSPltWJi2QRRD6Y40cn7xF7wV6AEC7FEV4FOw6Z7T(L7(wNUdkhiH6B5ClUZRYxNKPSttMist8E9Dv5uTWA71LqMkpuKTsOsHhYQ0RLgsAvEjfOwR7Miq7rPUMKa))pOoVVHuxRxcQBAXQvphQlGe06fI6E7DG7H4()J494Sv7H6tG0skg5LhJTB)TbI33LMwONThLT(h8NToi(9D2)YrJ4SZ73Fqs)lJIJ66s0TlnhlS)dqEnQLRrk3eWc7rFS)JHBwUsVx(3F03fpZNAUqBL7XaSUZ7XDfEUOlDIl6Je99P1d(dKUFy9zO59gCi99ql5O)6zVTGlNLOMLyL653l)n73(DYKId8BH4vyvtEms(jtvJqjBvMKFCa4JKFIkUMiwTsFZ9mIJIW3m2veUoPZx5t4TITYPvguc(CW3AxrOAAleUCFVx516v(bBg3403479MaSBiQ9XqT11s7pnyHrO1C2iOjpkCHZMjX2hF1M0THfmIx3bXoFcBgcY8pX7eSj7HV7Uanw)Eu)cxCfp2RUDaV6WXM4F9qa8NOjFSosEB7guRcrMSB)ZuQgoQRlT)4MXtKQS719qxvEQKApyZ45kilhhAMcsIQmYD9vqnzyiruNeOkJTeXNYC0aXLmGOgTFnNnKrnfaZDsDBfdqP8L)B6MarC4kFOJJ6bjGfdJPXrDC4m8J0IUKI8BGEI(q0UENO0ccnEYSBsA7LmhPcwMyKii5sxxwx5gdDVp6wj23rpWqb90b3pwyDqFHqxsMfcWbi)03T7t9HUVQGhTuO0w3NuU0iB9yLC(Fd

Wie es funktioniert

Im Kern ist der Trank ein Gegenstand, der dem Spieler eine Aura gibt. Diese Aura überwacht während seiner Laufzeit, ob der Spieler etwas plündert, d.h. das Beute-Fenster öffnet.

  1. Starte mit einem Auren-Gegenstand in der Datenbank: Gegenstand erstellen > Auren-Gegenstand
  2. In dieser Vorlage sind die wichtigen Objekte und Arbeitsabläufe bereits voreingestellt.
  3. Suche dir passende Bezeichnungen, Icons, etc, aus.
  4. Im „Benutzen“-Arbeitsablauf wird bereits die voreingestellte Aura vergeben. Ich habe noch den Sound-Effekt von Salyis Kriegsmeute (Sound-Id 32500: Plündern und brandschatzen… hahaha) vorgeschaltet, sowie den Effekt „Gegenstand verbrauchen“, da es sich in meinem Fall um einen Trank handelt. Beides ist optional, wichtig ist der Effekt „Aura anwenden“.

Wenn im Gegenstand alles fertig eingestellt ist, kannst du zum inneren Objekt aura übergehen. Auch hier kannst du zunächst das Aussehen anpassen:

  1. Wähle einen passenden Namen.
  2. Suche dir ein entsprechendes Icon aus.
  3. Die Laufzeit sollte nicht zu knapp sein, ich habe 30 min gewählt.

Jetzt fehlt nur noch die Aktion, die beim Plündern eintreten soll. Bereite dazu den Arbeitsablauf onLoot vor, innerhalb des inneren Objekts aura.
Im Tab „Ereignisverknüpfungen“ verbinden wir diesen in der rechten Hälfte mit den Spielereignis LOOT_OPENED, zu finden im Ereigniskatalog unter „Loot“. Ich habe dem Ereignis noch die Bedingung „2. Ereignisparameter ist nil“ angefügt. Das sorgt dafür, dass Truhen, die man aus dem Inventar heraus plündert, keine Zusatzbeute geben können.
Was der Spieler am Ende bekommt, würfle ich im Arbeitsablauf onLoot aus. Dabei gehe ich wie in im Beitrag über das Würfeln mit variabler Verteilung vor.

  1. Effekt: Würfle von 1 bis 100.
  2. Alles unter 90 ist eine Niete und der Spieler bekommt keine zusätzliche Beute (nichts passiert, also kein Effekt nötig)
  3. Zwischen 90 und 95 gebe ich dem Spieler mit dem Effekt „Zeige Beute“ Kupfermünzen.
  4. Entsprechend bekommt er bei einem Würfelergebnis zwischen 96 und 98 Silber.
  5. Wenn der Zufallsgenerator genau eine 99 ausgewürfelt hat, bekommt der Spieler Extended-Goldmünzen.
  6. Bei einer 100 gibt es einen neuen Trank.

Die Wahrscheinlichkeiten und die möglichen Items sind dabei natürlich jedem selbst überlassen. Ich habe mich in diesem Beispiel für Münzen entschieden.

1 Like

Hey, ich wollte mal hier fragen ob es eine Möglichkeit gibt das der RP-Char auch andere Sprachen sprechen kann, also im TRP Add-on. Es gibt ja neben der Gemeindesprache auf beiden Fraktionsseiten noch die Rasseneigene Sprache und da würde es mich interessieren ob man nicht vielleicht als Menschenmagier auch Thalassisch sprechen könnte.

Hey das ist einfach beantwortet, es gab in TRP2 damals ein Sprachenbereich wo man als Alli die Hordensprachen und als Hordler die Allianz sprachen auswählen konnte. Auch gab es noch einige neben sprachen wie Murloc, Kalimag, Eredun/Dämonisch und noch ein paar mehr leider hat Blizzard da Probleme gemacht weil das Addon noch von Cata zeit stammt wo Cross Faction reden noch nicht zu Debatte stand, darum gibt es dies seit TRP 3 nicht mehr.

Echt schade. Aber danke der Info! :grin: