Posts by noci

    LoadingScreen.mp4



    Ich bekomme Folgende Fehlermeldung:

    Code
    [12:43:51] Java RegisterEvent - Event not found: Events.General.UpdateEvent
    UnityEngine.Logger:Log(LogType, Object)
    UnityEngine.Debug:LogError(Object)
    RisingWorld.PluginAPI.PluginEventHandler:OnRegisterEvent(IntPtr, JObject, JString)

    Ich mache da noch nichts besonderes

    getstatisticnew-api-vs-old-api


    Java
    @EventMethod
    public void onChatMessage(PlayerChatEvent evt) {
    processChatEvent(evt);
    }
    public void processChatEvent(PlayerChatEvent evt) {
    System.out.println(evt.getChatMessage());
    }



    new-plugin-ui





    new-plugin-game-objects




    Als "Workaround" bis dahin kannst du sonst das HUD auf Screenshots sichtbar lassen, aber über die API ausblenden. Das geht über diesen Code:

    Code
    Style s = new Style();
    s.display.set(DisplayStyle.None);
    Internals.overwriteUIStyle(player, "HudLayer/hudContainer", s);

    Nur Vorsicht: Du kannst danach den Chat nicht mehr bedienen (daher macht das Sinn, das nicht über einen Command zu machen, sondern über einen Tastendruck, wodurch "DisplayStyle" anschließend wieder auf "Flex" gesetzt werden kann).


    Im Zweifelsfall kannst du die Welt neu laden, dabei wird die UI wieder zurückgesetzt ^^




    some-gui-question



    plugin-api-wehre-schön-wenn-fehlerberichte-it-would-be-nice-if-bug-reports

    Java
    //Load an image from a plugin resource
    TextureAsset image = TextureAsset.loadFromPlugin(this, ...);
    //Create new UI element and assign the image
    UIElement panel = new UIElement();
    panel.style.backgroundImage.set(image);
    //Add element to player screen
    player.addUIElement(panel);



    chat-farben

    Code
    player.sendTextMessage("<color=red>Roter Text</color>");
    player.sendTextMessage("<color=#ff0000>Roter Text</color>");

    Supported rich-text tags

    javadoc: Class Player

    ColorNames



    getstatistic



    calculate-height-on-z-axis



    onplayersleepevent


    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...");
    }


    ui-override

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


    an-callback-example

    Java
    event.getPlayer().showMessageBox(MessageBoxButtons.Yes_No_Cancel, "Title", "Question", 0, button -> {
    switch (button) {
    case 0 -> event.getPlayer().sendTextMessage("YES!");
    case 1 -> event.getPlayer().sendTextMessage("NO!");
    case 2 -> event.getPlayer().sendTextMessage("CANCEL! (Or just timeout)");
    }
    });


    Wetter Ändern

    Java
    WeatherDefs.Weather heavyRain = Definitions.getWeather("heavyrain");
    Server.setWeather(heavyRain, true);


    playercraftitemevent

    Java
    //Example: Prevent player from crafting the repeater item or paper press object
    @EventMethod
    public void onPlayerCraftItem(PlayerCraftItemEvent evt) {
    Crafting.Recipe recipe = evt.getRecipe();
    if (recipe.name.equals("repeater") || recipe.name.equals("paperpress")) {
    evt.setCancelled(true);
    }
    }


    blueprints-and-total-elements

    ehrlich gesagt ein bisschen "Overengineered"

    :lol:Ja, sorry das kommt bei mir immer mal wieder vor:D


    wir könnten ggf. ein weiteres UITarget einführen

    Ja, ich denke auch das würde Reichen:thumbup:


    =Oda muss ich erstmal noch einiges Lesen:Dich vermisse an einiegen Stellen kleine Beispiele in der API, zum besseren verständnis der zusammenhänge, alles zu seiner Zeit:saint:

    OKe, das habe ich übersehen


    Aber irgendwie sind die jetzt etwas unterschiedlich


    Vorher hat es mir besser gefallen, das der Hud nicht mit dabei war


    Kann ich nicht im Plugin entscheiden ob es auf dem Screenshoot mit erscheinen Darf oder generell nicht?
    Könntest du da Vieleicht noch eine Option für "nur Sicht"(kein HUD) und mit "Normal"(wie vorher war) und "Alles"(so wie Jetzt ist) machen:saint:
    Geht das nicht das auf dem HUD Mehrere Ebenen sind? (Spiel-HUD, Spiel-Anzeigen,UIElement,Yell-Nachrichten)
    Gibt es da schon eine nur für UIElemente?
    Die Ebenen könnten ja dann für den Screenshoot einzeln eingestellt werden^^

    :thumbup:Super, Danke für das Update


    Andere Plugins könen jetzt geladen werden^^
    Die System.out.println & System.err.println sind jetzt in der Konsole gut zu unterscheiden:wow:

    Noch eine kleinigkeit, wegen dem UIElement und dem hoverStyle, wenn ich einen PlayerUIElementClickEvent habe und wie in ASB den Inhalt überarbeite, Funktioniert danach das Hovern nicht mehr.
    Ich hatte auch schon Versucht nach dem überarbeiten die betreffenden style & hoverStyle neu zu setzen, ohne erfolg.
    Meine Vermutung liegt darin das eventuell das mir dem ClickEvent und der Maus Position im Hoverbereich zusammen hängt. Wie wenn ich eine Taste gedrückt halte, das Spiel den Focus verliert und damit den "KeyUp" nicht mehr registriert, und ich damit Dauerfeuer "geschietet" habe ^^

    Mein zewiter Ansatz ist, weil die UIElemente über die Player Attribute gespeichert werden und da etwas nicht Richtig mit kommt.


    Ist das absicht?

    Das bei einem PlayerUIElementClickEvent mir der Event von allen Registrierten Playern auftaucht?

    Dieses Plugin verlangt bei der ersten Server Anmeldung vom Spieler, die Regeln durchzublättern und zu akzeptieren oder abzulehnen. (Steuerung über Maus)

    Werden die ASB akzeptiert, wird der Spieler in die Gruppe acceptGrouphinzugefügt.

    Andernfalls wird er in die Gruppe defaultGroup gesetzt, wenn er nicht schon in ihr ist.


    Sollte sich jemand erneut anmelden, der zuvor schon die Bedingung abgelehnt hat, wird ihm das Regelwerk ab der 2. Seite wieder angezeigt.



    Die Texte können alle gängigen Rich Text Tags enthalten



    ### INSTALATION ###

    Das Arcive Öffnen und den Ordner ASB in den OrdnerPlugins



    :!:Es müssen beide Dateien Heruntergeladen werden und im gleichen Ordner liegen um sie zu Entpacken:!:

    Bei meiner dock Steht was von public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) und ein String wird nicht Akzeptiert

    Wo anders habe ich die aussage A NoSuchMethodErrorist der Hinweis auf einen defekten Klassenpfad (mit gemischten und/oder inkompatiblen Versionen) gefunden und hoffe noch das es mit dem ClassLoader-Fix auch behoben wird:saint:

    Looks like there is no such constructor in target class, at least for these arguments. Usage of reflections is also not a very good way, is it possible to avoid them for your case?


    Also der Konstrukter ist definitiv da, sogar in einer Seperaten Datei

    ---

    So the constructor is definitely there, even in a separate file


    Ja eigendlich wollte ich mit den Fields Arbeiten

    ---

    Actually, I wanted to work with the Fields

    Code
    public Object reload(Object config, JSONObject loadConfig){
    Class<?> configClass = config.getClass();
    Field[] fields = configClass.getDeclaredFields();
        ...
    }


    Ich Lade die vorkonfiegurirte Variable und überschreibe die Vorhandenen Daten, das geht auch so weit ohne große Probleme.

    Nur wenn ich einen neuwn Datensatz hinzufüge, brauche ich eine Vorlage
    Nehme ich eine der vorhandenen, da es "nur" Zeiger sind , bekomme ich das Orginal der Vorlage und habe eine Identische Kopie
    Hier muss ich eine dan die Class erstellen mit neuem Zeiger, aber hier gibt es auch sein Java8 eine umstellung und Chaos

    Und selbst wenn ich mit den Metoden arbeite muss ich ja wenn etwas hinzu kommt auch einen "Unbekannten Type" inizialiesieren
    Das bauche ich auf jeden fall noch, um zwischen dem Orginal-Type der Klasse und dem JSON-Typen zu Konvertieren

    ---

    I load the preconfigured variable and overwrite the existing data, that goes so far without any major problems.

    Only when I add a new record do I need a template
    If I take one of the existing ones, since they are "only" pointers, I get the original of the template and have an identical copy
    Here I have to create a dan the class with a new pointer, but here there is also a Java8 conversion and chaos

    And even if I work with the methods, I have to initialize an "unknown type" if something is added
    In any case, I still need that to convert between the original type of the class and the JSON type



    Wenn du einen anderen ansatz hast, große Konfigurationen Überlichtlich zu Schreiben und dabei noch Dynamisch beim Laden zu halten, lass es mich wissen ^^

    Das ist gedacht um soviel wie möglich an Einstellungen und anpassung für den Serverbetreiber zur verfügung zu stellen.

    z.b das ein Serverbetreiber mit einer Config ein eigenes Rezept (Konfiguration, Bilder) mit Item (3D Daten) mit Event auswahl selber definieren kann, und das ebend soviel er Konfigurieren kann8)

    ---

    If you have another approach to overlighting large configs while still keeping dynamic while loading, let me know ^^

    This is meant to provide as much settings and customization as possible for the server operator.

    e.g. that a server operator can define his own recipe (configuration, images) with item (3D data) with event selection with a config, and that as much as he can configure8)


    Schöner als uhrConfigRecipe.yml.txt und mehr:saint:

    Ich habe noch ein Problem, ich versuche eine neue Insctance zu erstellen(so im Netzt gefunden):


    Java
    Class<?> clazz = Class.forName(componentType.getName());
    System.out.println("("+i+":> "+" NewClass["+componentType.getName()+"] ");
    System.out.println("("+i+":> "+" NewClass["+clazz.getClass()+"] ");
    // Get the private constructor.
    Constructor<?> cons = clazz.getDeclaredConstructor(componentType);
    // Since it is private, make it accessible.
    cons.setAccessible(true);
    // Create new object.
    Object obj = cons.newInstance();

    Allerdings komme ich nicht an der net.jiw.unity.runtime.PluginLoader.loadPlugins(PluginLoader.java:71) vorbei, das Netz liefert keine andere Lösung, die ClassASBConfig ist public und constructor ist auch vorhanden.

    Code
    Apr. 20, 2023 1:20:53 AM de.chaoswg.JSONManagerASB reload
    SCHWERWIEGEND: null
    java.lang.NoSuchMethodException: de.chaoswg.ClassASBConfig$ClassSeite.<init>(de.chaoswg.ClassASBConfig$ClassSeite)
    at java.base/java.lang.Class.getConstructor0(Class.java:3685)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2854)
    at de.chaoswg.JSONManagerASB.reload(JSONManagerASB.java:304)
    at de.chaoswg.JSONManagerASB.update(JSONManagerASB.java:472)
    at de.chaoswg.ASB.onEnable(ASB.java:119)
    at net.jiw.unity.runtime.PluginLoader.loadPlugins(PluginLoader.java:71)

    Ich hoffe ja das es mit dem Update beim Classloader Funktioniert, vieleicht kannst du ja schon sehen ob sich das geben wird
    Oder muss ich noch etwas berücksichtiegen?

    Wie bekomme ich die ServerOptionen herraus?
    Normal sollte das ja mit Server.getOptiongehen.

    Ich bekomme bei allen Varianten NULL zurück:

    System.out.println("SRV Option: "+Server.getOption("Permissions_DefaultNewPlayerPermissionGroup"));

    System.out.println("SRV Option: "+Server.getOption("Permissions DefaultNewPlayerPermissionGroup"));

    System.out.println("SRV Option: "+Server.getOption("DefaultNewPlayerPermissionGroup"));