Events auf eine andere Map kopieren

  • Huhu,


    ich bins schon wieder, und diesmal mit einem sehr speziellen Problem. Ich habe dem Spieler die Möglichkeit gegeben, per Knopfdruck auf einer bestimmten Map Events anzulegen (warum das so ist, möchte ich wegen des Jams nicht spoilern :D). Das funktioniert mit dem Event Spawner echt super. Ich habe eine Vorlage erstellt, die mit diesem Plugin zum Spieler teleportiert (gespawnt) wird. Ein paar Optionen, die der Spieler selber noch festlegen kann, und die Sache ist soweit gegessen.


    Leider ist mir jetzt eingefallen, dass ich sämtliche, vom Spieler selbst erstellte, Events auch noch auf eine zweite Map kopieren muss. Und hier steh ich jetzt vor einem Problem. Ich habe zwar tatsächlich die Möglichkeit, mit Yanflys Plugin die einzelnen gespawnten Events durchzugehen.


    Code
    1. $gameMap.FirstSpawnedEvent()
    2. - This will grab the first available spawned event as an object.
    3. - If the first event has been despawned, the next on in the list will be
    4. returned as an object. If there are no spawned events left, this script
    5. call will return an undefined value.

    Alternativ vielleicht auch der hier:

    Code
    1. $gameMap.event(eventId)
    2. - This will grab the event as an object.
    3. - Replace 'eventId' with the ID of the event you wish to grab.
    4. - ID's past 1000 (or whatever you've set it to in the plugin parameters)
    5. are spawned events.


    Mit dem ersten Befehl, in Schleife laufend bis nur noch undefined rauskommt, könnte ich die Events wieder abfragen. Aber wie kopiere ich die jetzt auf eine andere Map? Wie kriege ich die Position des originalen Events raus, von dem ich ja nicht weiß, an welcher Stelle der Spieler es gespawnt hat? Es soll auf der zweiten Map an exakt der gleichen Stelle spawnen.


    Hat jemand ne Idee?

  • Soweit ich weiß, kann man keine Events auf eine andere Map kopieren. Du müsstest daher die gespawnten Events vor dem Anzeigen der Map (also bevor der Spieler diese wieder sieht) wieder neu erzeugen und ob das so einfach geht, weiß ich nicht, da ich dieses Plugin nicht kenne. Die Position der gespawnten Events müsste sich mit Hilfe der ID-Nummern, die für diese Art von Events verwendet werden, herausfinden lassen. Diese werden ja, wenn ich deinen 2. Code-Ausschnitt richtig verstanden habe, über einen Plugin-Parameter festgelegt. Mit diesen Nummern kannst du dann über die Script-Befehle $gameMap.event(eventId).x bzw. $gameMap.event(eventId).y die jeweilige x- bzw. y-Position abfragen und in ein Array speichern.

  • Versuch's mal mit dem Plugin "Orange Custom Events".

    So mache ich das bei Quester, wo man erst die Strecke baut und dann abläuft.

  • Ich kenne Yanflys Eventspawner auch nicht, aber ich denke es wird kein Weg an @Ariyanas Lösung vorbei führen. Wenn die Events statisch sind, dann kannst du die Koordinaten ins Array speichern, wenn das Event gespawnt wird. Somit sparst du dir etwas Wartezeit beim Verlassen der Map, da du dann keine Schleife für die Abfragen brauchst.


    Wenn das Plugin aber die Möglichkeit bietet, dass die Events gespeichert werden, also dass sich die Map daran "erinnert" wo die Events waren, dann müssen irgendwo die Koordinaten gespeichert sein. Da müsste man ins Plugin reinschauen.

  • Vielen Dank euch allen :)

    Mit diesen Nummern kannst du dann über die Script-Befehle $gameMap.event(eventId).x bzw. $gameMap.event(eventId).y die jeweilige x- bzw. y-Position abfragen und in ein Array speichern.

    Kenne mich noch nicht wirklich mit Arrays aus. Wie mach ich das denn?

    Versuch's mal mit dem Plugin "Orange Custom Events".

    So mache ich das bei Quester, wo man erst die Strecke baut und dann abläuft.

    Oh, das ist super, das sehe ich mir an :thumbup:

    Wenn die Events statisch sind, dann kannst du die Koordinaten ins Array speichern, wenn das Event gespawnt wird. Somit sparst du dir etwas Wartezeit beim Verlassen der Map, da du dann keine Schleife für die Abfragen brauchst.

    Mit statisch meinst du, dass sie auf Map 1 bei den gleichen Koordinaten sein sollen wie auf Map 2? Dann wäre die Antwort ja. Wenn die Events einmal gesetzt sind, verändern sie ihre Position nicht mehr.

    Hier wäre allerdings auch wieder die Frage, wie ich das ins Array kriege und später wieder abfrage?

  • Mit statisch meinst du, dass sie auf Map 1 bei den gleichen Koordinaten sein sollen wie auf Map 2?

    Nein. Das hatte ich tatsächlich schon angenommen, weil du ja die Koordinaten auslesen möchtest, um sie auf der anderen Map zu platzieren. Ich meinte eher, ob sie sich bewegen dürfen. Aber das hast du ja mit deinem dritten Satz erklärt. Somit reicht es also, wenn jedes Event auf Seite 1 einen Autorun oder parallelen Prozess hat und seine Koordinaten speichert.


    Dafür musst du irgendwo am Anfang des Spiels das Array deklarieren. Dazu einfach $gameSystem.zionsEventCoordinates = [] per Scriptcall aufrufen. Jetzt hast du ein Array. Den Namen nach dem Punkt kannst du dir frei wählen. Es sollte aber irgendwas eindeutiges sein, das definitiv nicht in Plugins genutzt wird. Diese Variable wird übrigens auch im Spielstand gespeichert, wenn du speicherst.


    Der Scriptschnipsel für deinen Autorun ist:


    Code
    1. var mapId = $gameMap.mapId();
    2. var id = this._eventId;
    3. var x = $gameMap.event(id).x;
    4. var y = $gameMap.event(id).y;
    5. // optional:
    6. id -= 1000; // für den Fall, dass du so hohe EventIds hast, wird hier der Startwert abgezogen. In diesem Beispiel sollten die SpawnEvents bei der ID 1001 anfangen.
    7. // optional ende
    8. if(!$gameSystem.zionsEventCoordinates[mapId]) $gameSystem.zionsEventCoordinates[mapId] = [];
    9. $gameSystem.zionsEventCoordinates[mapId][id] = {x: x, y: y};


    Abrufen kannst du das dann mit folgendem Scriptcall, den du auf die neue Map machst:


    Code
    1. var mapId = id; // Statt id die ID der Map eintragen, auf der sich der Spieler vor dem Transfer befand
    2. var source = $gameSystem.zionsEventCoordinates[mapId]; // Das dient der Übersicht
    3. for(var i = 0; i < source.length; i++){
    4.     if(source[i]){
    5.         var x = source[i].x;
    6.         var y = source[i].y;
    7.         // Hier muss dein Spawnscriptcall rein. Für die Koordinaten verwendest du einfach die Buchstaben x und y
    8.     }
    9. }


    Habe das nicht getestet. Sollte aber klappen.