Posts by red51

A new update is now available, introducing "Points of interest" and many more changes!
Latest hotfix: 0.9 (2025-11-04)

    Wir müssen uns mal Gedanken machen, wie wir das Einbinden eigener Items am besten ermöglichen wollen :thinking: Einerseits ist es sinnvoll, wenn ein möglichst einfacher Weg bereitsteht. Andererseits sollte aber auch die API Zugriff darauf erhalten, sodass auch komplexere Items möglich sind (wie paulevs schon erwähnt).


    Es wäre natürlich suboptimal, wenn es zwei verschiedene Systeme dazu gäbe (eines was zB auf Textdateien basiert, und eines, was die API verwendet)... eine Option wäre vll es über die API zu lösen, wir aber zB ein fertiges Plugin dafür bereitstellen (ähnlich wie der CustomItemLoader in der Java Version). Der einzige Nachteil ggü. deinem Vorschlag wäre dann, dass ein User zusätzlich dieses Plugin installieren müsste. Der Vorteil aber wäre, dass ein Plugin-Ersteller volle Kontrolle erhält und auch speziellere Items einbauen könnte (bzw. auch Item-Arten, die es so noch nicht im Spiel gibt) ^^


    Vll ist aber auch eine Hybrid-Lösung möglich (ähnlich wie die Area Protection, die zwar einerseits im Spiel integriert, andererseits aber auch der API zugänglich ist).


    Generell werden wir uns diesem Thema aber vmtl. erst widmen können, wenn die neue Version die Java Version ersetzt hat ;)

    Eine Karte wird es auf offizieller Seite in Zukunft geben, eine Minimap hingegen wahrscheinlich nicht. Vielleicht wird uns das Team von JIW-Games eine passende API-Schnittstelle dazu bereitstellen?

    Genau, eine Karte wird es definitiv geben, eine Minimap hingegen ist erstmal noch nicht geplant... es gab aber für die Java Version mal Überlegungen, dass man ggf. ein GPS-Gerät einbauen könnte, was einem dann eine Minimap beschert. Evtl. könnte man diesen Ansatz weiterverfolgen ^^


    Wenn es eine Karte gibt, wird es auf jeden Fall auch für die API eine Funktion geben, um das Kartenmaterial auszulesen.


    Derzeit ist es aber theoretisch auch so bereits möglich, eine Karte über die API zu generieren (basierend auf dem Terrain) ;)

    Es sieht so aus, als wenn der Server keinen Zugriff auf den Temp bzw. tmp Ordner hat :thinking: Der JDBC SQLite Treiber entpackt seine benötigten Libs standardmäßig in diesen Ordner (das war auch in der Java Version so), und wenn der Zugriff verwehrt wird (durch fehlende Berechtigungen etc), kann SQLite leider nicht von der API verwendet werden (das Portals Plugin benötigt aber SQLite).


    Wenn du bei einem Hoster bist, dann kannst du das selber leider nicht ändern, sondern lediglich der Hoster könnte das anpassen :/ Ggf. kann der Support des Hosters dir da aber weiterhelfen.


    Wir können das ansonsten auch mit dem nächsten Update anpassen, sodass in dem Fall ein anderer Ordner verwendet wird... leider wird es wohl noch ein paar Wochen dauern, bis das nächste Update verfügbar sein wird :silenced:

    Hmm, that's not a problem, but what is the default seed so I can replicate it on a test server? :D

    The default seed is 1 ^^


    However, re-using the same seed name does not yield the same world. :( I believe it just used some random seed instead of name listed but did not DB record what seedID it used.

    Oh, that's weird :wat: Unfortunately I wasn't able to reproduce the issue on my end :thinking: Adding a seed to World_Seed in the server.properties file should be stored in the database (but only when a new world is created of course). The same seed should also always result in the same world (only exception: npc spawns don't rely on the seed, so when reusing a seed, you will get the same world, but different animals will spawn).


    However, apparently there is an issue with the server.properties file if the entry contains a = - the game can't read that line then and resets that property to the default value (so if you seed contains a =, for example, it won't work unfortunately) :/

    After some code and log analysis I found that it happened when Prefab was not loaded from asset bundle (incorrect argument for loadFromAssetBundle) and setMaterialParameter was called for that prefab.

    Oh, yes, I can confirm that this indeed results in an infinite cycle :wat: Thanks for letting me know, we will fix that with the next update!


    When prefab is loaded correctly the bug is missing, but setMaterialParameter is not working for me. I'm trying to set color parameter, probably this is a reason

    Hmm... that should basically work. Unfortunately the setMaterialParameter() method does not have an override which accepts a color object, but you could just use a Vector4f for that :)


    Also make sure to provide the correct property name (the "parameter" parameter^^). It you're using the default HDRP Lit shader, the main color property is "_BaseColor", for the default HDRP Unlit shader it's "_UnlitColor".

    IIRC there was unfortunately a bug in the first world update which caused servers to not generate a random seed during creation if the seed setting was empty :/ The game then falls back to a default seed.

    Ich dachte da an registerMouseButton(Links,Rechts,Mitte,Rad) ähnlich wie bei player.registerKeys zum aun und aus schalten

    Würde es denn ggf. reichen, nur eine setListenForMouseInput(); Funktion zu haben, um Maus-Input generell ein- und auszuschalten? Es gibt ja nur wenige Maustasten, sodass ich nicht weiß, ob wirklich einzelne Tasten registriert werden müssten, oder was meinst du? ^^


    Ich hatte für die Konvertierung der Farbe vom Hex:FFFF FFFF = DEC:4 294 967 295 Probleme weil der Integer ja "nur" bis +2 147 483 647 geht, aber über den umweg das aus einem Long zu hole, den dan zu einem Integer machen und dann kann ich das erst richtig mit ColorRGBA(int rgba)

    *Eigentlich* sollte das kein Problem darstellen, da ein Integer trotzdem 4.294.967.296 verschiedene Werte repräsentieren kann. Da Java leider nur vorzeichenbehaftete Datentypen kennt, geht der Bereich dort halt von -2.147.483.648 bis +2.147.483.647, was aber normalerweise kein Problem darstellen sollte (also zumindest bei den Funktionen des Spiels, welche einen int rgba Wert akzeptieren - aus 0xFFFFFFFF wird dann eben -1) ;)

    Oder bist du auf eine Funktion in der API gestoßen, die damit nicht korrekt umgehen kann?

    That's weird :wat: The 1st line is quite normal, it happens if any component was changed before the prefab was fully loaded (usually there is a small delay until a prefab is fully loaded at the client), the 2nd line then indicates that the prefab was loaded and the material parameter was assigned... I couldn't reproduce it on my end unfortunately, so I'm wondering how this happened exactly :thinking:


    Did you change the material parameter for the prefab parent, or any child element?


    Do you mind sending me the prefab (or more precisely, the AssetBundle) and the code to change the material parameter, so I could try to reproduce the issue? ;)

    In the API, you could use World.getSeed() to get the actual seed of the world. Alternatively you could use an SQLite editor to open the "Meta.db" database in the world folder - there is a table "worldinfos" which contains the seed ;)

    Beim Server werden Beispielpermissions mitgeliefert, die befinden sich im Ordner Permissions.Example (der muss dann einfach nach "Permissions" umbenannt werden). Darin ist die default.json Permission, die für jeden Spieler gilt. Im "groups" Ordner ist eine Beispielpermission für eine Gruppe, die man zB "Admin" nennen kann (nicht zu verwechseln mit richtigen Admins, die in der server.properties eingetragen sind) ;)


    Dieser Thread enthält generell mehr Informationen zu Permissions: Permissions [New Version]


    Richtige Admins in der server.properties sollten aber eigentlich standardmäßig schon keinen Einschränkungen bei Blaupausen unterliegen :thinking:

    Für Texturen benutze ich so eine kleine Funktion um die readable zu machen

    Texturen können zwar in der Tat von der GPU zurückgelesen werden, das funktioniert allerdings nur clientseitig, der Server hat diese Möglichkeit leider nicht (da headless) :(


    Eine Place-Funktion wäre schön damit alles genau so funktioniert und natürlich die Maus-Tasten (PlayerMouseButtonEvent)

    Man müsste sich mal überlegen, wie man so ein "Place-Verhalten" sauber in der API anbieten kann :thinking: Dazu machen wir uns mal Gedanken ;)

    Einem PlayerMouseButtonEvent steht aber natürlich nichts im Wege^^


    Das währe erstmal nur für den Client selber(Ohne das zu Teilen als Poster oder so), an der Stelle wo ich das bräuchte, habe ich das Geladene PrefabAsset ... :thinking:
    Ich könnte da eine Temporäres Prefab erstellen, aber da wehren noch keine TextureAsset erst beim player.addGameObject ?

    So ein rein clientseitiges Handling bringt leider ein paar Probleme mit sich... wenn eine Textur nur clientseitig vorhanden ist, man aber trotzdem eine Referenz in der API hat, dann wirft das jede Menge Fragen auf, wenn diese Referenz bspw. einem anderen Spieler zugewiesen wird. Bzw. die API GameObjects sind ja ohnehin nicht spielergebunden, d.h. dieselbe Referenz kann mehreren Spielern zugewiesen sein. Würde man nun nur clientseitig die Textur auslesen und irgendwo zuweisen, würde das bei anderen Spielern nicht wirklich funktionieren... so ein API Verhalten wäre sehr inkonsistent :/


    Einfacher und sinnvoller ist es bei einem Prefab eigentlich, die benötigten Texturen direkt beim Vorbereiten des Plugins (in Unity) mit ins AssetBundle zu packen - dann kann die Textur uneinschränkt geladen und in der API verwendet werden. Die AssetBundles können ja nicht nur Prefabs speichern, sondern auch Texturen, Meshes etc.


    Ja sollte ausreichen :D ich habe ein Würfel Mesh in die Handbekommen und da überkarm mich die Idee, einen Ingame Würfel zu machen :nerd: um gemeinsam zu Würfeln

    Wenn du nur einen Würfel haben möchtest, dann kannst du auch die Model Klasse verwenden - denn das ModelAsset unterstützt zumindest bereits das Laden eines Meshes aus dem Spiel. Ein paar generische Meshes (zB ein "Cube") sind dort auch direkt exposed:



    gerne auch mit Registrieren(wenn es Sinn macht)

    Wie meinst du das genau?


    interessant wehre da auch isPressd() und ein isDrag() oder vieleicht isHold() damit mann den Plazier Timer umsetzen kann

    Eine isPressed() Funktion würde das Event auf jeden Fall bekommen (d.h. das Event würde beim Drücken sowie Loslassen der Maus getriggert werden, ähnlich wie beim PlayerKeyEvent).


    Beim Draggen müssten wir uns mal Gedanken machen... vll wäre hier ein separates Event denkbar (PlayerMouseDragEvent o.ä) :thinking:


    Ich habe das Pfenomän Festgestellt das nur das aller erste disableClientsideKeys Funktioniert, die Liste scheint dann Fest zu sein, ich habe das auch nur mit einem Plugin getestet

    Oh, tatsächlich :wat: Offenbar wird nur der erste Key übernommen... das ist so nicht gewollt, das werden wir mit dem nächsten Update beheben :saint:


    Settings_LogWorldEvents=False :thinking: oder habe ich den erst jetzt wargenommen

    Das ist tatsächlich schon etwas länger drin :D


    Nur für den Reguleren betrieb vieleicht auch ausschaltbar machen, vieleicht noch Settings_LogPlayerEvents, Settings_LogPluginEvents hier wehre auch eine 4. Farbe schön (Rot Fehler, Gelb Warnung, z.b. Türkis Plugin, Weiß Server) oder wenn man später noch die Plugin Ausgaben noch Färben könnte

    Wie meinst du das genau?


    Was das Färben von Plugin-Ausgaben angeht, meinst du die Ausgaben in der Konsole?


    Das sieht mir nach einem Rundungs/Konvertierungs Problem aus, in Java konnte ich das mit dem (int) (long)Long.parseLong lösen.

    Ich weiß leider nicht genau, was du meinst? :monocle:


    Sowas ist gut, beim Thema Texture2D, gibt es da auch etwas zum Mischen oder Überlagern per Maske?

    Der obige Code von Kryssi_79 kopiert die Textur so wie sie ist von der Grafikkarte zurück zur CPU (aber wie gesagt, das funktioniert leider nur clientseitig, d.h. nicht serverseitig, wo die API ausgeführt wird - die API kann an diese Daten also nicht so einfach rankommen). Um eine Textur in ihrem Aussehen zu ändern, muss sie entweder explizit mit einem bestimmten Shader gerendert werden (das stößt in Unitys HDRP aber auf ein paar Probleme und Einschränkungen), oder aber du musst die Pixeldaten manuell überschreiben.


    Wenn Bedarf dazu ist, könnten wir in der API grundsätzlich auch die Möglichkeit bieten, Texturen prozedural zu erstellen - ähnlich wie beim MeshAsset. Dann könntest du prinzipiell jedem Pixel einen eigenen Farbwert zuweisen.

    1. Manche Boote verschwinden und sinken unter die Oberfläche ab. ;(

    Auf dem Bild sieht es eigentlich so aus, als wenn das Boot korrekt auf der Wasseroberfläche schwimmt? :thinking:


    2. Leider ist es auch nicht möglich die Boote zu versetzen. Mit toggleterrain habe ich zwar ein Anfaßsymbol aber das Boot ist nicht bewegbar. Durch Draufschlagen beim Versuch das rote Schlauchboot zu zerstören, ist dieses wieder an die Oberfläche gelangt. Das Holzboot ließ sich mit F7 Objekt zerstören, nicht entfernen, das Draufhauen zum Zerstören unter Wasser hat auch sehr lange gedauert. Extrem lang.

    Boote können leider nicht direkt gelöscht werden (außer durch Kaputthauen). Das F7 Werkzeug betrifft leider nur platzierte Objekte wie Möbel etc., nicht aber Fahrzeuge bzw. Boote...


    Wir könnten den Schaden pro Schlag bei Booten im Creative-Modus ggf. etwas erhöhen.


    3. Im Kreativmodus dauert der Zusammenbau von Booten genauso lange wie im Survivalmodus. Das müsste viel schneller gehen. :verysad:

    Das können wir ändern, allerdings kannst du mit dem spawnvehicle Befehl auch direkt ein Boot spawnen ;)

    Actually you can already override built-in UI elements ;) You can use Internals.overwriteUIStyle() for that. Just create a new Style object, set the properties you want to override, then assign the Style. To get the path to a built-in element, you can use the uidebugger console command - this enables you to hover an element with your cursor and see the path to the element in the top left corner of the screen. Rightclick on an element to copy the path to clipboard. To disable the UI debugger again, hit the x next to the path (of that doesn't work, press ESC, then hit the x).


    Unfortunately you can't get the path to certain elements, but in this case, you could provide the layer name as parameter to the "uidebugger" command - this prints all paths (use page up/down to scroll) ^^


    Changing the background image of the inventory screen would look like this:

    Java
    Style style = new Style();
    style.backgroundImage.set(TextureAsset.loadFromFile(...));
    style.backgroundImageTintColor.set(1f, 1f, 1f, 1f);
    Internals.overwriteUIStyle(player, "inventoryLayer/inventoryContainer", style);


    Example screenshot: https://www.rising-world.net/a…682-example-internal-jpg/

    Gibt es hier noch etwas zu beachten um das Material zu setzen?

    Der Pfad bei setMaterial() ist so leider nicht korrekt, denn die Funktion sieht vor, dass der Pfad zum Child-Objekt angegeben wird. Bei .obj oder .fbx Dateien ist das leider etwas schwer zu bestimmen... in erster Linie ist diese Funktion auf Prefabs ausgelegt, die in Unity erstellt wurden (wo du den Child-Elementen dann direkt einen passenden Namen geben kannst).


    Für Modelle ist später eigentlich dann das Model Objekt die bessere Wahl - dort wirst du auch direkt ein Material zuweisen können ;)


    Könnte diese Funktion auch die Typen mit angeben oder würde sie nur die Prefab's angeben?

    Würde es gleich eine Komplette liste mit Unterordnern sein oder wie ein Verzeichnis?

    Die Typen anzugeben ist leider etwas komplizierter, da dazu sämtliche Assets einmal in den Speicher geladen werden müssen. Allerdings ist anhand des Datennamens der Typ oft schon erahnbar (zB ist ein Prefab i.d.R. als ".prefab" gespeichert, ein Material als ".mat" usw).


    Die Funktion würde den jeweiligen vollen Assetpfad zurückgeben, also der Pfad, mit dem man das Asset aus dem Bundle laden würde.


    Wehre es möglich den Mesh Render und sein Materials auszulesen, speziell die Base Map?

    Nein, derzeit leider nicht, da das fertige Modell erst beim Client existiert und der Server keinen Zugriff darauf hat. Dazu kommt das Problem, dass Meshes oder Texturen nicht zwangsläufig "readable" sind, d.h. die eigentlichen Mesh- oder Texturdaten können nicht immer ausgelesen werden.


    In den Prefab's sollte man kein Rigidbody benutzen, das verzieht die LocalePosition und ist nicht Muliplayer Tauglich, eine Syncrone Physik kommt aber noch? :D
    Oder fehlt nur die getWorldPosition()?

    Sowas gibt es leider nicht out-of-the-box... wenn wir sowas vom Spiel aus anbieten wollen, müssten wir uns einmal überlegen, wie man das am besten in die API integrieren kann :thinking: Was wir sonst einbauen könnten wäre eine "getWorldPosition()" Funktion, die allerdings dann mit einem Callback arbeiten muss (da die Position erst vom Client ausgelesen und dann zum Server geschickt werden muss). Dann könnte man mit der API zumindest seine eigene Synchronisierung umsetzen^^


    Ich hätte noch gerne noch Analog zum PlayerKeyEvent einen PlayerMouseEvent

    Jap, das ist wahrscheinlich gar nicht so verkehrt, also zumindest für Maustasten (dann quasi ein PlayerMouseButtonEvent oder so) ^^


    Hi red51 mMir ist aufgefallen das player.disableClientsideKeys(Key.Escape); nicht klappt, laut dem Log Disable 1 clientside keys [60] from plugin ToolsAPI (1) gibt es auch keine Probleme

    Hmm... das kann ich bei mir leider nicht reproduzieren :thinking: Mit "player.disableClientsideKeys(Key.Escape);" hat die ESC-Taste keine Funktion mehr (weder um Menüs zu schließen, noch um das Ingame-Menü aufzurufen). Was genau funktioniert denn bei dir in dem Fall nicht?

    Das ist merkwürdig, da kann ich leider nichts zu sagen, weil mir keine Änderung einfällt, die dafür ggf. verantwortlich sein könnte :thinking:


    Ein Befehl, um alle Objekte eines bestimmten Typs anzuzeigen wäre aber generell nicht schlecht, ich packe das mal auf unsere Liste ;)

    Meinst du die maximal erlaubte Größe der Blaupausen? Oder die Anzahl an Elementen, die eine Blaupause enthalten darf? Oder meinst du die Anzahl an Blaupausen, die platziert werden dürfen? ^^


    Grundsätzlich wird das in den Permissions über die "blueprints" Einstellungen gesteuert: Mit placelimitsession wird festgelegt, wieviele Blaupausen pro Session platziert werden können, mit maxelements wird die Maximalzahl an Bauteilen festgelegt und mit maxsize die maximale Größe. Um die Werte auf unbegrenzt zu setzen, kannst du -1 eintragen:


    JSON
    "blueprints": {
    placelimitsession: -1,
    maxelements: -1,
    maxsize: -1
    }

    Was kommt den alles zum nächsten Update? Erze? Werkbänke? Wäre gut zu wissen auf was ich mich freuen kann

    Das Hauptaugenmerk beim nächsten Update liegt auf Postern und Schildern, allerdings wird es auch einige neue Objekte geben ;) Ansonsten kann ich leider noch nicht viel weiteres dazu sagen, denn insgesamt hängt es davon ab, wie weit wir kommen und wieviel wir fertig bekommen, ohne, dass das Update unnötige lange auf sich warten lassen muss^^


    Mit dem API Zeug kann ich nichts anfangen, interessiert mich auch nicht.

    Ich will Inhalte von den jeder Spieler was hatt nicht nur gewisse.

    Naja, der Sinn hinter der API ist eher der, dass Leute damit (hoffentlich) interessante Mods bzw. Plugins erstellen, die dann möglichst vielen Leuten zur Verfügung stehen :) Es ist natürlich logisch und nachvollziehbar, dass nicht jeder die API verwenden kann und will, aber wir wollten diese auch möglichst früh bereitstellen, damit Plugin-Entwickler genügend Zeit haben, tolle Plugins zu erstellen^^

    Die Inventory-API ist leider bislang so gut wie gar nicht implementiert, daher fehlen noch einige Funktionen und auch von den bestehenden Methoden funktionieren die meisten nicht... :/ Das werden wir aber auf jeden Fall noch ändern ;)