Posts by red51

    Plugin API 0.6.5.1 (2023-04-23):

    • [New] SQLite and MySQL database support
    • [New] Chunk and ChunkPart classes to access chunk data
    • [New] World.getChunk()
    • [New] World.getChunkPart()
    • [New] World.setTerrainData()
    • [New] World.setTerrainDataInArea()
    • [New] World.setTerrainDataInRadius()
    • [New] World.executeWorldEditBatch() (see WorldEditBatch class)
    • [New] Player.showLocationTicker()
    • [New] Player.hasHealedBones()
    • [New] Player.getState() (see new Player.State enum)
    • [New] Player.getBreath() and Player.setBreath()
    • [New] PlayerHitConstructionEvent/PlayerHitObjectEvent/PlayerHitVegetationEvent.setDamage()
    • [New] Event: SkipNightEvent
    • [New] Event: PlayerCreateAreaEvent
    • [New] Event: PlayerLocationTickerEvent
    • [New] Event: PlayerChangeStateEvent
    • [Change] You can reuse UI Style objects for Internals.overwriteUIStyle() now
    • [Change] Removed Weather enum (use WeatherDefs instead)
    • [Change] Removed Player.isPlayingPiano() (use "Player.getState() == Player.State.Piano" instead)
    • [Bugfix] Fixed PlayerKeyEvent not being triggered in multiplayer
    • [Bugfix] Fixed other plugins not being accessible via getPluginByName() etc.
    • [Bugfix] Server.getOption() now also works in singleplayer
    • [Bugfix] Fixed Server.getType()
    • [Bugfix] Fixed Player.getStamina()

    [ERROR] AddressInUseException: Port 4255 (UDP) is already in use!

    Wie von yahwho erwähnt, der Fehler besagt, dass der Port 4255 (also der Standardport des Servers) leider bereits belegt ist. D.h. irgendein anderer Prozess (ggf. eine vorherige Instanz des Servers?) läuft und hält diesen Port belegt, sodass der Server nicht daran binden kann.

    Apparently this happens if an npc gets stuck somewhere :thinking: This causes the game to spam this message...

    We'll fix the "getting stuck" issue with the upcoming hotfix (which will be ready in the next couple of hours), but we'll also remove the "NPC is falling" message (as it's quite useless anyway) :D

    Mit dem nächsten Hotfix werden die Tiergeräusche generell etwas reduziert. Zudem werden Tiere nachts weniger kommunikativ, ebenso wenn man sich in Gebäuden aufhält.


    looten lassen sie sich nicht, außer man besitzt ein Messer. Ich spiel im Kreativmodus, ein Messer finde ich da unnötig.

    Warum möchtest du die Tiere im Creative-Modus looten, wenn du dort ein Messer bereits unnötig findest? ^^

    Das passiert wenn "Modulares Andocken" aktiv ist und ich mir eine Blockgröße über die "EINFG"-Taste hole. Wie auf dem Bild zu sehen habe ich eine Gleisschwelle platziert und die nächste hat sich von alleine um 90° gedreht. Die Rotation ist allerdings 0 0 0. Die Schwelle auf dem Bild "B" die ich zuerst platziert habe hatte die Maße 0.7 x 0.8 x 3. Damit ich die fehlerhafte Schwelle (ohne Rotation) wieder richtig platzieren kann muss ich die Größe auf 3 x 0.8 x 0.7 setzen "A".

    Ich glaube, ich stehe auf dem Schlauch, aber ich konnte irgendwie nichts ungewöhnliches feststellen :silenced: Oder aber das Problem einfach nicht reproduzieren :wat:


    Grundsätzlich ist es so, dass beim Druck auf EING auch die Rotation des anvisierten Bauteils übernommen wird (das haben wir tatsächlich irgendwann geändert, entweder beim Welt-Update oder beim Tier-Update). Mit dem modularen Andocken sollte das aber keine Probleme machen :thinking:


    Hast du ggf. die Möglichkeit, ein Video von dem Verhalten zu machen? :saint:


    Beim Einstellen von Leuchtblöcken auf 100 % Helligkeit, wird dieser komplett schwarz. Andere Helligkeiten funktionien auch nicht mehr, auch keine Farbe.

    Wenn Schwarz als Farbe einstellt ist, dann hat die Helligkeit grundsätzlich keinen Einfluss mehr (dann bleibt die Lampe immer Schwarz) ;)


    Ich kann, wie auf meinem Screenshot zu sehen ist, durch die matten Glasscheiben nur Umrisse erkennen, allerdings wird durch das Geländer alles sichtbar.

    Das ist tatsächlich unschön, aber leider eine technische Limitierung, die wir momentan nicht so einfach umgehen können (ohne negative Performanceauswirkungen zu riskieren) :/


    die Falltür wird falsch gesetzt wenn mann die leiter in der höhe verändert

    Oh, danke für den Hinweis! Das werden wir beheben (leider wird es das nicht mehr in den kommenden Hotfix schaffen) ;)


    Anscheinend gab es eine Änderung, dass die vorher angemalten Bauteile beim Wechseln der Textur erhalten bleiben.

    Eigentlich nicht, aber diese Änderung ist für den kommenden Hotfix vorgesehen. Derzeit ist es so, dass beim Ändern der Textur die Farbe eines Blockes zurückgesetzt wird - das ist in vielen Situationen ungewollt.


    Nach dem Hotfix wird es so sein, dass die Einfärbung des Blockes bzw. der Blöcke beibehalten wird, es sei denn, man hat beim Ändern der Textur auch eine andere Farbe angegeben (über den kleinen Pinöpel unten links im Texturfeld).


    Wenn man beim Ändern der Textur auch die Farbe zurücksetzen möchte, dann reicht ein Rechtsklick auf o.g. Farbpinöpel ;)


    Diese schlafen nachts nicht mehr (in Rising World) und sind auch nachts nicht ruhig. Nachtaktive Tiere habe ich bisher im Spiel keine ausmachen können.

    Leider schlafen die neuen Tiere bisher noch nicht. Das kommt aber noch mit einem der nächsten Updates^^


    Es gibt ein Problem mit den Treppen. Haben wir heute zusammen festgestellt. Es liegt nicht an der Bauweise, sondern der Player-Charakter bleibt an verschiedenen Stellen stecken, hängen, auch wenn diese Treppe bautechnisch keinen Fehler aufweist. Ob es sich um neu gebaute Treppen oder alte handelt, spielt dabei keine Rolle.

    Ich vermute, dass das ggf. auch mit dem Problem zusammenhängt, dass man manchmal an der oberen Kante des Baugerüsts festhängt :thinking: Es sieht so aus, als wenn sich der Spieler im gebuildeten Spiel anders verhält als bei uns während der Entwicklung im Editor =O

    Das ist leider ein heikles Problem... wir müssen das einmal ganz genau unter die Lupe nehmen.

    Diese Betrugsmasche (Accounts hacken und dann die Freunde dazu überreden, auf dubiose Links zu klicken) ist leider genauso alt wie Steam selbst :/ Sicherheit bringt da tatsächlich nur die 2-Faktor-Authentifizierung (wie von Deirdre erwähnt) i.V.m. der Steam App (die TheKing anspricht)...


    Freut mich aber, dass Patrick den Account zurückbekam ohne weiterreichende Konsequenzen ;)

    Am I correct to believe that it's always going to be better to use the StringBuilder class over String?

    The Java compiler already turns a + concatenation either into a StringBuilder, or uses internal String magic (since Java 9) to combine them (which is even faster than a StringBuilder) ^^ So it's totally fine to use the + operator in most cases.

    But there are situations where the compiler typically can't optimize it, e.g. in loops or if the concatenation happens over multiple methods - so it's much better and faster to use a StringBuilder there ;)

    Oha, danke für den Hinweis, tatsächlich ist das Enum noch aus der Java Version und hat da gar nichts mehr zu suchen :saint: Mit dem kommenden Hotfix werden wir das entfernen (das WeatherChangeEvent und die Server-Methoden auch entsprechend abändern) und stattdessen können dann die WeatherDefs verwendet werden (die die Wetter-Definitionen enthalten). Der Einfachheit halber wird es die bestehenden Wettereffekte darin dann vordefiniert als statische Variablen geben (zB WeatherDefs.Rain) ;)


    Das Enum würde ich also vermeiden. Nach dem Hotfix (höchstwahrscheinlich morgen) wird aus Server.setWeather(Weather.Overcast, true); dann ein Server.setWeather(WeatherDefs.Overcast, true);

    This is indeed C# code (although a few other languages support that feature as well) :D It's called String interpolation. Java doesn't have such a feature directly... instead you either have to use regular concatenation, or the String.format() method. In newer Java versions there is also a new "formatted" method (e.g. "%s bar".formatted("foo");, which is the same as String.format("%s bar", "foo");).


    Strictly speaking, String concatenation is usually a lot faster than String.format(), but only the latter provides proper formatting options. But we're typically talking about nanoseconds here (so you wouldn't really notice a difference unless doing thousands or hundreds of thousands of calls) ^^


    So if you want formatted Strings, use "String.format()" (or the new ".formatted()" method), and if you just want to combine some Strings, use concatenation - unless you're in a loop, then it's much better to use a StringBuilder object directly:

    Java: Bad code
    String text = "Numbers: ";
    for(int i = 0; i < 100; i++){
    text += " " + i;
    }


    Java: Good code
    StringBuilder sb = new StringBuilder(300);
    sb.append("Numbers: ");
    for(int i = 0; i < 100; i++){
    sb.append(' ').append(i);
    }
    String text = sb.toString();

    Gibt es denn schon eine grobe Vorhersage, wann wir Items und Worlditems erstellen können?

    Du meinst eigene, neue Items, also Custom Items? Leider haben wir momentan noch keinen Zeitplan dafür :/ Das zieht leider einen relativ langen Rattenschwanz hinter sich her...


    Geladene Prefabs werden bei Neustart nicht wiederhergestellt. Muss ich das in der Plugin selber machen, oder fehlt hier noch etwas in der API?

    Das Speichern und Laden von "GameObjects" (genau wie UI Elemente) muss im Plugin selbst implementiert werden. Hier könnte der StaticModelLoader der Java Version als Referenz dienen (die API ist in der neuen Version zwar etwas anders, aber die Logik bleibt die gleiche), dort ist sowas zB implementiert ;)


    Man kann bspw. eine eigene SQLite Datenbank im Pluginordner anlegen und dort die Daten drin speichern. Leider ist Seitens der API noch kein SQLite oder MySQL inkludiert, das ändert sich aber mit dem Hotfix, der in Kürze erscheint^^


    Ein paar Beispielscripte wären sicherlich für alle sehr hilfreich.

    Aus Zeitmangel haben wir leider noch keine Beispielplugins bereitstellen können :/ Die Beispielplugins der Java Version können aber als grobe Vorlage verwendet werden.


    Ansonsten enthält dieser Thread noch ein paar Informationen über "GameObjects" (das ist die Grundklasse, die selbstgeladene Elemente in der Spielwelt repräsentiert - in der Java Version hießen die noch "WorldElement"): New Plugin Game Objects

    1. Fließgewässer für Fluss- und Bachbetten. Damit meine ich den optischen Eindruck, nicht den physikalischen.

    Das war ursprünglich für das Wasser geplant (als visueller Effekt wenn Wasser fließt, hätte man aber über statisches Wasser auch platzieren können), hat es aber leider nicht ins damalige Welt-Update geschafft (und ist dadurch auf die lange Bank gerutscht) :/ Das Thema ist aber noch nicht vom Tisch :D


    2. Stehende Gewässer, von dunklerer Eigenschaft, ohne großartigen Wellengang und Dauergeplätscher, zur Darstellung von Mooren oder Tümpeln

    Weitere Wassersorten sind geplant, ggf. kommt schon etwas zusammen mit dem Biomupdate, ansonsten aber vmtl. erst etwas später...


    3 Wasserfälle. Wahrscheinlich am schwierigsten zu bewerkstelligen, aber ich als alter Landschaftsbauliebhaber, gebe die Hoffnung eben nicht auf.

    Wir möchten durchaus ein paar Wasserfälle als "technische Objekte" einbauen - die man also fest platzieren kann. Das werden dann überwiegend Partikeleffekte sein. Ist leider nicht dasselbe, wie richtige Wasserfälle, aber damit sollte sich schon einiges anstellen lassen ^^

    Yes, subsurface scattering is unfortunately indeed disabled right now (because it it's not used by the game yet)... but it's definitely our intention to add it for vegetation and certain other materials in the future ;)

    Das klassische bzw. natürliche Wasser wird sich leider nicht an solche Formen anpassen können - das ist technisch mit heutiger Hardware nicht möglich, da das Wasser dafür eine deutlich kleinere Tröpfchengröße benötigt. Gleichzeitig muss Wasser aber auch persistent sein, d.h. der Zustand bzw. die Position in der Welt gespeichert werden. Ebenso muss es im Multiplayer synchronisiert werden. Ansätze, wie man in einigen Grafikdemos sieht (GPU Wasser, meist auch nur im kleinen Maßstab) funktionieren daher nicht.


    Derzeit besteht ein komplett mit Wasser gefüllter Chunk (32x64x32 Blöcke) aus 65.536 "Wassertropfen" (in Blockgröße). Für präziseres Wasser müsste so ein Tropfen eher die Größe von 0.1 oder gar 0.05 Blöcken haben (vmtl. wäre auch das für kleine Behälter noch zu grob). Bei einer Größe von 0.05 bestünde ein einzelner Chunk bereits aus 524 Millionen Wassertropfen. Das ist einerseits viel zu viel zum Berechnen, andererseits zu viel zum Speichern oder im MP zu snychronisieren...


    Als Lösung wird es aber später die Möglichkeit geben, eine Wassertextur auf Bauteile zu legen. Damit wird man beliebige Formen oder Behälter mit Wasser ausfüllen können ;)


    Eine andere Sache ist das Terrain anzupassen. Ich spreche nicht vom der allgemeinen Möglichkeiten mit dem Tool, sondern, die Höhen von Gebäuden mit der Umgebung in Einstimmung zu bringen.

    Mein Beispiel ist mein alter Friedhof. Wie man unschwer erkennen kann, ist die Hälfte der Grabsteine im Boden verschwunden. Höhenanpassung des Terrains funktioniert nicht, die einzige Möglichkeit ist abreißen und neu hinsetzen, aber dann stimmt die restliche Umgebung nicht mehr. Man versucht ja sein Bestes, aber einen Friedhof mit Platten zu verkleiden oder zukünftige Terrainplatten zu verwenden, ist auch nicht schön. Das Terrain hat im Gegensatz zur gebauten Umgebung immer einen Höhenunterschied. Ich frage mich zwar seit Jahren, warum das so sein muss?

    Blöcke mit einer Größe von 1x1x1 ragen, wenn sie im Raster (größte Stufe) auf flachen Terrain platziert wurden, standardmäßig ein kleines Stückchen heraus. Der Grund liegt darin, dass dadurch das Bauen von Fundamenten usw. in vielen Situationen vereinfacht wird. Das können wir nicht mehr ändern ohne alte Welten zu zerschießen.


    Statt das Terrain zu verschieben bzw. zu ändern, können aber Blöcke natürlich verkleinert oder frei platziert werden, damit sie zB direkt auf dem Terrain aufliegen.


    Langfristig wäre es sonst ggf. noch denkbar, dass optional das Raster der Blöcke verschoben werden könnte :thinking:

    Oh, sorry, I misunderstood your previous message :saint: Actually TextureAsset.loadFromFile(plugin.getPath() + "\\res\\test.jpg"); should already work (if there is a "res" folder in your plugin dir) :wat: If the image doesn't show up, there is likely another reason for that (e.g. maybe another style setting causing the image to be transparent or something like that) :thinking: Could you maybe post your style code here (or send it via PM to me)?^^

    Your code is correct, and the file can be loaded from a plugin .jar indeed, it's just that the data isn't properly synced with the client apparently (due to a bug). This will be definitely fixed soon ;)

    Sure, that could be added with the upcoming hotfix :) However, we have been thinking about adding a more generic event like PlayerChangeStateEvent instead - it would be called every time the player changes his state, e.g. sitting on a chair, lying in a bed, playing a piano etc. So this old code:

    Java
    @EventMethod
    public void onPlayerSleep(PlayerSleepEvent evt){
    Player player = evt.getPlayer();
    //Player is sleeping
    if(evt.isSleeping()) System.out.println("Player " + player.getName() + " is now sleeping");
    //Player is no longer sleeping
    else System.out.println("Player " + player.getName() + " is no longer sleeping...");
    }


    Would look like this in the new API:

    Java
    @EventMethod
    public void onPlayerChangeState(PlayerChangeStateEvent evt){
    Player player = evt.getPlayer();
    //If new state is "sleeping", player went to bed
    if(evt.getNewState() == Player.State.Sleeping) System.out.println("Player " + player.getName() + " is now sleeping");
    //If old state was sleeping, player is now definitely no longer sleeping
    //(otherwise there wouldn't have been a state change)
    else if(evt.getOldState() == Player.State.Sleeping) System.out.println("Player " + player.getName() + " is no longer sleeping...");
    }


    The new event requires a bit more code, but in return, it provides access to other state changes as well (e.g. sitting on a chair, swimming, climbing ladders etc). Do you think that would work in your case?

    Loading from plugin resources is broken atm unfortunately :/ But we try to get it fixed with the upcoming hotfix ;) However, loading from a file (e.g. from plugins folder), url, asset bundle or raw byte data should still work.

    Allerdings komme ich nicht an der net.jiw.unity.runtime.PluginLoader.loadPlugins(PluginLoader.java:71) vorbei

    Nee, es ist anders herum, der erste Aufruf des Stacks ist die obige Zeile (PluginLoader.loadPlugins()), diese wiederum ruft "onEnable()" im Plugin auf, das dann "update()" in JSONManagerMSB, welches "reload()" aufruft - der Aufruf "getDeclaredConstructor()" wirft dann letztenendes die "NoSuchMethodException", was heißt, dass dieser Konstructor nicht gefunden wurde. Das hängt mit dem Classloader eigentlich nicht direkt zusammen (die Klasse kennt er ja scheinbar, sonst hätte Class.forName() schon eine Exception geworfen). Die Klasse befindet sich im gleichen Plugin, oder?


    Wie paulevs erwähnt, die Signatur des Konstruktors scheint eine andere als angegeben zu sein (der Konstruktor erwartet einen String-Parameter, aber du suchst nach einem Konstruktor mit "ClassSeite"-Parameter. Zeile 5 oben muss also - wie paulevs schon sagt - so aussehen: Constructor<?> cons = clazz.getDeclaredConstructor(String.class); ;)