Code Schnipsel

  • 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

  • "Vieleicht wehre hier eine Liste mit den Style-Phaden 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) ^^

  • javadoc RW: Class SoundAsset

    Supported audio file formats: ogg, mp2, mp3, midi/mid, wav, flac


    Es wird alles gut :) früher oder später :D meistens später :nerd: ... ich wandle Kaffee in Quelltext um.

    Und besucht die Rising World Wiki

  • Hello paulevs could you please help me?
    I'm trying to load a MeshAsset from a bundle:

    Java
    AssetBundle bundle = AssetBundle.loadFromFile(file.getAbsolutePath());
    MaterialAsset ma = MaterialAsset.create("MaterialName");
    ma.setTexture(TextureAsset.loadFromAssetBundle(bundle, Texture.toString()));
    ma.setNormalMap(TextureAsset.loadFromAssetBundle(bundle, Normal.toString()));
    MeshAsset me = MeshAsset.create("MeshName", 0, 0);
    ... ??? ...
    Model mo = new Model(me, ma);

    I can't find the connection.

  • Hi, can you please show your log output?

    Das ist der Teil vom Code:

    ---

    This is the part of the code:

    Code
    [Java] ModellModel={OBJ=wurfel2.obj, Normal=würfel-normal.png, Texture=würfel 3.png}
    [Java] OBJ wurfel2.obj
    [Java] Normal würfel-normal.png
    [Java] Texture würfel 3.png
    REGISTER ASSET ASSETBUNDLE (2) FROM FILE: F:\SteamLibrary\steamapps\common\RisingWorldDedicatedServer\Plugins\0ToolsAPI\Model3D\würfel.bundle (EXT: bundle, CH: e7afa2461d3ced311d05bccd701cb993)


    Are you trying to make a procedural mesh?

    Ich habe einfach eine *.obj erstellt die hat UV-Map dazu die Texute und Normalmap in einen neuen Unterordner im PluginSDK.unitypackage eingefügt, eine Texture währe auch da aber scheinbar nicht von Nöten

    ---

    I simply created an *.obj that added the UV map, the text and the normal map to a new subfolder in the PluginSDK.unitypackage, but a texture was obviously not needed there either


    Also, what is Texture and Normal arguments in your case? That are turned into String

    Das sind StringBuilder wegen einer lambda Schleife zuvor und geben den Datei Namen im Bundel an.


    Aber das ist garnicht mein Problem
    Ich versuche ein würfel.obj in das MeshAsset zu bekommen.


    Oder andersgefragt, wie hast du ein Bundel mit "Mesh/OBJ/FBX", Texture und Normal Daten in ein GameObject bekommen?

    Ein kleiner Code Schnipsel der bei dir Funktioniert würde ja schon ausreichen^^

    ---

    These are StringBuilders because of a lambda loop before and give the filename in the bundle.

    But that's not my problem at all
    I'm trying to get a cube.obj into the MeshAsset.

    Or to put it another way, how did you get a bundle with "Mesh/OBJ/FBX", Texture and Normal data in a GameObject?

    A small code snippet that works for you would be enough^^

  • I think I finally understand your problem. I'm not sure that you can load Mesh directly from unity bundle, but you can load a prefab from it:

    Java
    Prefab prefab = new Prefab();
    prefab.setPrefab(PrefabAsset.loadFromAssetBundle(bundle, "path/to/refab/in/bundle"));
    prefab.setLocalPosition(player.getPosition()); // Or any other pos
    player.addGameObject(prefab);

    And you can change prefab material:

    Java
    MaterialAsset material = MaterialAsset.create("material_name");
    // Set properties and textures here
    prefab.setMaterial("default", material);

    "default" here is the node inside prefab


    And done:

  • PrefabAsset asset = PrefabAsset.loadFromAssetBundle(bundle , "wurfel2.obj");

    That will work only if prefab has "wurfel2.obj" name in Unity itself, in most cases prefab names are different from model names, for example this is how my crystal named:


    And its mesh:


    Both don't have .obj extension (even when model is OBJ), since Unity will change the name of imported models, and prefabs can have name that is different from model

  • The MeshAsset class is only for procedurally generated meshes (i.e. meshes you want to create from scratch by defining individual vertices). That's why it only has a "create()" method and no "loadFromX()" methods ;)


    You can load "PrefabAssets" from the hard drive directly btw (via "loadFromFile()") - in this case the game accepts .obj, .fbx and .zip files (e.g if you have an fbx file with embedded textures, then you can put the textures into the zip file).


    The problem when loading from the hard drive is that it's a bit tricky to assign textures/materials. However, in the near future, the ModelAsset class will get methods to load models from the hard drive (right now you can only load game models). The ModelAsset can then be used with a Model object.


    Right now it's recommendable to load models through Unity (export them to asset bundles, then load them as Prefab through the API) ;)

Participate now!

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