Posts by McKay

A new update (0.9.3) is available now!

    Hallo red51,


    ich spiele Rising World schon sehr lange und finde das Spiel wirklich klasse. Durch die heutige Möglichkeit, KI als Unterstützung zu nutzen, kann ich nun selbst ein wenig mit Plugins experimentieren, obwohl ich bisher kaum Programmiererfahrung habe. Es macht mir viel Spaß, neugierig auszuprobieren, welche kleinen Helfer sich für mich und vielleicht später auch für andere Spieler umsetzen lassen.


    Bei einem automatischen Farm-Plugin bin ich dabei auf einen reproduzierbaren Fehler in World.removePlant() gestoßen.


    UMGEBUNG


    - Rising World Unity: 0.9.3.1 (16)

    - Commit: 90fe38c8a82a80f394db4551a111fc23c3c9079e

    - Plugin API: 0.9.3 aus der lokalen Spielinstallation

    - Einzelspieler / lokaler Server

    - Windows 11 (10.0.26200)

    - JVM 25.0.4.1

    - Plugin mit Java-20-Bytecode gegen die lokale PluginAPI.jar kompiliert


    REPRODUKTION


    Die Plant-Instanz ist vor dem Aufruf gültig und stammt aus dem geladenen Chunk. Getestet wurden in zwei getrennten Spielstarts beide Varianten für cutOnly:


    World.removePlant(

    plant.getGlobalID(),

    plant.getChunkPositionX(),

    plant.getChunkPositionY(),

    plant.getChunkPositionZ(),

    true,

    false

    );


    und:


    World.removePlant(

    plant.getGlobalID(),

    plant.getChunkPositionX(),

    plant.getChunkPositionY(),

    plant.getChunkPositionZ(),

    false,

    false

    );


    TATSÄCHLICHES VERHALTEN


    Bei beiden Varianten erscheint dieselbe interne Ausnahme:


    NullReferenceException: Object reference not set to an instance of an object.

    at RisingWorld.Server.Chunks.ServerChunkManager.FinalizeVegetationRemove

    (RisingWorld.Server.Players.ServerPlayer player,

    RisingWorld.Server.Chunks.ServerChunk chunk,

    RisingWorld.Common.Vegetation.Plant p,

    System.Int32 idx, System.Boolean cutOnly, System.Boolean spawnItems,

    System.Boolean forceSpawnItemsInWorld, UnityEngine.Vector3 impulse,

    System.Boolean destroy, System.Boolean broadcast, System.Boolean updateChunk)

    in Assets/Scripts/Server/Chunks/ServerChunkManager.cs:4231

    at RisingWorld.PluginAPI.Objects.WorldAPI.RemovePlant

    (System.IntPtr envPtr, JIW.JNI.Wrapper.Objects.JObject obj,

    System.Int64 globalID, System.Int32 cx, System.Int32 cy, System.Int32 cz,

    System.Boolean cutOnly, System.Boolean destroy)

    in Assets/Scripts/PluginAPI/Objects/WorldAPI.cs:1478


    Die Pflanze bleibt anschließend im gespeicherten Chunk erhalten. Beim ersten Versuch blieb sie vollständig sichtbar. Beim zweiten Versuch wurde unmittelbar davor testweise plant.setScale(0.001f, 0.001f, 0.001f) aufgerufen; dadurch war sie nur unsichtbar, blieb aber ebenfalls als Pflanzenobjekt gespeichert. Nach einem Neustart waren beide Einträge weiterhin vorhanden.


    ERWARTETES VERHALTEN


    Die angegebene Pflanze sollte serverseitig entfernt, für verbundene Clients ausgeblendet und aus den gespeicherten Chunkdaten gelöscht werden. Falls der Aufruf nicht ausgeführt werden kann, wäre außerdem eine für das Java-Plugin erkennbare Fehlermeldung hilfreich.


    AUSWIRKUNG UND VORLÄUFIGER WORKAROUND


    Plugins können Pflanzen damit derzeit nicht zuverlässig ernten oder entfernen. Wiederholtes Verstecken per Skalierung würde unsichtbare Vegetationseinträge ansammeln. Mein Farm-Plugin verwendet deshalb vorläufig dieselbe Pflanzeninstanz erneut, skaliert sie auf die junge Wachstumsstufe zurück und verwaltet den Wachstumszyklus mit einem eigenen Timer.


    Könnte es sein, dass im Plugin-Aufruf kein ServerPlayer vorhanden ist und FinalizeVegetationRemove() dort einen null-Wert dereferenziert? Das ist nur eine Vermutung anhand des Stacktraces.


    Falls du den vollständigen Player.log oder ein minimales Test-Plugin brauchst, kann ich das gern nachreichen.


    Vielen Dank fürs Prüfen!