Plugin API - Wehre schön, wenn & Fehlerberichte - It would be nice, if & bug reports

  • Die flex-Einstellungen in deinem Code sind nur relevant für Child-Elemente ;) Generell ist das Flex Layout aber auch nur relevant, wenn du nicht setPosition() verwendest - denn das setzt das Style für das Element auf eine absolute Positionierung.


    Die Einstellung für Zeilenumbruch heißt "whiteSpace", also wäre der Code style.whiteSpace.set(WhiteSpace.Normal); (die Benennung ist vll im ersten Moment nicht sehr intuitiv, orientiert sich aber an Unitys IStyle, und das wiederum an CSS) ^^


    Kann vieleicht noch für den Clickable Event eine Maske einfügen, damit bei Runden oder Transparenten Bildern auch nur im Richtiegen Bereich der Event ausgelöst wird.

    Schwierig... also das clickable sollte bspw. abgerundete Ecken korrekt erkennen (wenn du sie zB über style.borderTopLeftRadius etc setzt, wie hier). Bilder bzw. der Alphawert der Bilder wird da momentan aber nicht berücksichtigt. Dafür müsste der Pixelwert des Bildes ausgelesen werden, allerdings hängt die genaue Ausrichtung und Größe des Bildes wiederum vom Style ab, d.h. an en eigentlichen Pixelwert kommen wir gar nicht wirklich ran... :|


    Mit OverflowClipBox.ContentBox kann ich auch nichts Steuern, selbst innerhalb vom Ramen bringt nix

    Die hat damit nichts zutun^^ Das ist der entsprechende Property in Unitys IStyle: https://docs.unity3d.com/2022.…unityOverflowClipBox.html

    Das Verhalten dieser Eigenschaft ist etwas schwierig zu erklären. Es wirkt sich darauf aus, wie der Inhalt des Elements geclipped wird (also ausgeblendet wird) wenn Padding eingestellt wird. In den meisten Fällen muss man diese Eigenschaft aber nicht anrühren (ich glaube in unserer gesamten UI haben wir das nicht einmal verwendet) :D

  • :saint:Ja, vieleicht war ich etwas zu Müde und zu Ungeduldig
    Die Seite mit IStyle habe ich neben bei offen, nur Blind gewesen
    Zeilenumbruch klappt einbanfrei:thumbup:

    Nur der clickable hat die Runde Ecke nicht erkannt


    Wenn ich hier nix gemacht haben um das Abzuschalten
    Klappt das noch nicht richtig


    panelHG ist mit Fester Größe, deswegen kann ich die Rundung so berechnen


    Also wenn das mit den Rundungen klappt reicht das ja schon:thumbup:müssen ja nicht übertreiben:saint:

  • Nur der clickable hat die Runde Ecke nicht erkannt

    Hmm... ich habe wohl zu viel in Unitys Verhalten reininterpretiert :saint: Leider werden auch runde Ecken nicht erkannt... ich dachte eigentlich, dass Unity damit von sich aus korrekt umgeht... kA ob das ein Bug ist... leider können wir von unserer Seite da wahrscheinlich nicht viel machen, da hier ein bisschen dasselbe Problem wie bei den Bildern vorherrscht (wir kennen nicht direkt das fertige "Layout" des UI Elements wenn es auf dem Bildschirm angezeigt wird, da das Aussehen ja u.U. von vielen Faktoren abhängt [andere UI Elemente, Parent, Childs etc]). Ich muss mir das aber nochmal genauer anschauen ;)


    PS: Die UI sieht bis jetzt schon sehr vielversprechend aus! 8):thumbup:

  • 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"));

  • Wie bekomme ich die ServerOptionen herraus?

    Variante 1 und 3 sind korrekt ;) Du hast das vermutlich im Singleplayer probiert, oder? Das Problem ist, dass im SP momentan keine server.properties geladen wird. Die Werte sind zwar vorhanden (fast alle befinden sich auf Standardwert, doch manche Werte werden auch im SP überschrieben), aber die API findet sie nicht.


    Stellt sich die Frage, wie die API am besten damit umgehen sollte im SP... Wahrscheinlich ist es aber sinnvoll, wenn auch im SP die Werte ausgegeben werden. Das werden wir mit dem nächsten Hotfix ändern ^^

  • 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?

  • 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:

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

    But that constructor accepts a String argument, and in your logs looks like you are giving it de.chaoswg.ClassASBConfig$ClassSeite, so probably instead of clazz.getDeclaredConstructor(componentType); you should call clazz.getDeclaredConstructor(String.class);

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

    Well, for personal usage I made a very simple config system, it stores data in internal entries which can be called at any time. In some of my other projects I used simple json configs with similar approach

  • 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:

  • 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); ;)

  • Kann ich beim LoadingScreen den Fotschtitt abfragen?
    Gibt es den Direckt oder über das auslesen vom Orginal Fortschrittbalken

    Dort kann man bestimt ähnliches machen wie beim plugin-advanced-status^^

    Vieleicht wehre hier eine Liste mit den Style-Phden nicht schlecht, am ende für die Komponenten im UITarget.

    Diereckt würde micht der LoadingScreen interessieren^^

  • Kann ich beim LoadingScreen den Fotschtitt abfragen?

    Leider gibts dazu momentan keine Funktion :/ Der Server kennt den Ladevorgang des Spielers leider nicht, sondern bekommst nur Bescheid, wenn der Spieler fertig ist mit Laden.


    Die universellste Lösung dafür wäre ggf. eine Funktion, um ein beliebiges UI Element bzw. den Zustand (Style, Text etc) auszulesen (dann könnte das vom Ladeelemente ausgelesen werden)^^ Dazu müssen wir uns mal Gedanken machen.


    Vieleicht wehre hier eine Liste mit den Style-Phden nicht schlecht, am ende für die Komponenten im UITarget.

    Das wird eine gewaltig lange Liste :D Grundsätzlich kannst du Elemente aber auch im Spiel auslesen: Dazu musst du einfach uidebugger in die Konsole eingeben - dadurch kannst du mit der Maus über ein Element fahren und siehst dann oben links den Pfad. Via Rechtsklick auf das Element kannst du den Pfad in die Zwischenablage kopieren.

    Zum Beenden, einfach das kleine X oben links neben dem Pfad drücken (wenn das nicht geht, kurz ESC drücken und dann das X auswählen).


    Manche Elemente können aber leider nicht darüber erfasst werden (zB der Ladebildschirm), dafür akzeptiert der Befehl aber noch einen weiteren Parameter: Du kannst eine UI Layer angeben, dann werden alle zugehörigen Pfade ausgegeben. Wenn du zB uidebugger loadinglayer eingibst, dann bekommst du alle Elemente des Ladebildschirms (mit Bild Auf/Ab kannst du in der Konsole scrollen) ^^

  • Die universellste Lösung dafür wäre ggf. eine Funktion, um ein beliebiges UI Element bzw. den Zustand (Style, Text etc) auszulesen (dann könnte das vom Ladeelemente ausgelesen werden)^^ Dazu müssen wir uns mal Gedanken machen.

    Kein Stress, war nur so ein Gedanke
    Aber sehrwarscheinlich will man an der Stelle Maximal den Ladebalken Überarbeiten, wenn das Später dann Überschrieben werden könnte, denke ich das Reicht
    Interessant wehre da so ein Balken der ein eigenes Bild (Hintergrund und Higlight) was sich Procentual überlagert Interresant, ich weiß aber nicht wie umfangreich das für Unity ist:D

  • Hi red51 ,

    :DIch Spiele gerade ein bisschen mit den AssetBundle herumm.

    Es scheint erstmal so als ob mann Derzeit Wissen muss was im *.bundle enthalten ist
    Ich habe zwar ein GetAllAssetNames gefunden, aber ich finde keinen Zugang dazu


    Ist es machbar so ein Bundle durchzu Scannen?



    Ein anderer gedanke wehre eine direckte Funktion für AssetBundle.loadFromFile(String obj, String Diffuse, String Normal) zu haben, dazu habe ich den Runtime OBJ Importer gefunden.
    Ist der schon enthalten und wie kann ich derzeit eine einfache OBJ und Texture Laden?

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!