Posts by Bamse

    The story


    In my plugin i haves need to calculate block position in chunk to use latter with chunk.getLODSurfaceLevel(bx,bz);


    For some values with negative values, i get error:

    Code
    java.lang.IndexOutOfBoundsException: Invalid x or z index (x: 32, z: 32)!
    at net.risingworld.api.objects.world.Chunk.getLODSurfaceLevel(Chunk.java:144)

    This is legit error because block position can have value between 0 and 31 and function called with 32!


    But block position are calculated with methods from ChunkUtils.getBlockPositionX / Z / Y !


    So i suspect here is something wrong.



    Research



    One of values who game me error are (X,Z): -32,-32


    I go in game, activate debug view (F3) and noted some coordinates for reference:


    goto -31.9999 95 -31.9999

    - in game (via F3): Chunk -1 1 -1, Block 0 31 0


    goto -32 95 -32

    - in game (via F3): Chunk -2 1 -2, Block 31 31 31


    goto -32.0001 95 -32.001

    - in game (via F3): Chunk -2 1 -2, Block 31 31 31


    After i go back to coding i wrote and run a method in plugin to get same data as reference (log.debug is a custom method who write data to a file):





    And result!


    Global position (X,Z) =-31.999, -31.999 ==> Chunk Position (X,Z) =-1, -1 | Block Position (X,Z) =0, 0

    Global position (X,Z) =-32.000, -32.000 ==> Chunk Position (X,Z) =-2, -2 | Block Position (X,Z) =32, 32

    Global poistion (X,Z) =-32.001, -32.001 ==> Chunk Position (X,Z) =-2, -2 | Block Position (X,Z) =31, 31



    So for -32,-32 getBlockPositionX/Z give wrong result 32!


    Further research



    So culprit is getBlockPositionX/Z/Y


    I opened class in my Eclipse and i see the following code :



    after i look at this code i don't understand why is condition if coordinate are lower than zero:


    Java
    if (x - (float) ((int) x) == 0.0F) {
    x += 0.5F;
    }


    Because that for every negative coordinate who is integer number ( like -1.000, -2.000, etc.) block position is calculated wrong because added 0.5f and for this reason i get value 32 at boundary of chunk.


    So i think a easy fix is to not add 0.5f for negative int values.


    But maybe i miss something..


    Thx red51

    I opened table sectors from chunks.db before cave update and i got all coordinates of them ( x, z) ( x on horizontally growing to east, z on vertically growing to north - Correctly?) .
    I found on world 30 sectors saved which i marked on map with green. Other are sectors starting to be discovered by players. (Blue ocean, yellow arid, light blue Cold.


    PS: I got a report one sector saved was regenerated after cave update (i can't confirm myself because i don't have raw data from that sector), even if sector was found sectors table. Its possible to sector regenerated on this case?

    On updating webmap for Medieval Realm server i research/explored some sector to see their region.

    If for region type Arid, Cold things are clear, i am not sure about region Ocean. This type of regions is very similar with region Default. What are differences between these two?

    Legacy sectors (generated before cave update) have region of type Default. So my guess is region type Ocean is new type of region who replace former Default region? I am not sure how to interpret differences between these regions.


    Thx

    On world of MR will not be a full reset, but is considered to override manually some sectors. So is good to know what already was saved in the past. And i can reuse old data already extracted. Otherwise i must reextract raw data/reprocess again and compare with live sector to see if must change. But i think i can have access at Chunks.db from before update, so i will open externally and extract what sectors are saved here :thumbup:.


    Btw i already updated map with full 20x20 sector around origin 0, 0 Now must fill remaining data about islands and regions!

    I wrote a plugin who export raw data from game and now i have several exported/processed islands and i don't know if they are same (legacy) or a new sectors. I work on local world with same seed as server, so from here i have dilemma, locally except spawn sector all are generated with new algorithm post cave update, but on server several sectors was modified by player prior to update so i must somewhat distinguished old sector who remain unchanged.


    Examples:

    I found a bug regarding watermelon. If are many close to each other, if i gather one with sickle i get seed and watermelon from him, but rest on proximity are destroyed. As how to see in images i collect one from 3 from middle, rest of 2 are destroyed. Or how to see in last image, a whole line are destroyed when i gathered first.



    And second issue:

    Any way to see better planted seed? It's almost impossible to see where you planted seed, before first stage of grow. In inventory, now seeds are more grey and see a bit better after last update, but on terrain when planting ...

    Hmm... maybe the x or z coordinate was out of bounds? I just realized that the getLODSurfaceLevel() method has no safety checks :wat: The game works with native memory here, so if x or z is out of bounds (i.e. < 0 or >= 32), it accesses an invalid memory address which may result in a hard crash...

    We'll change that with the next update, so the API will just throw a proper exception then^^


    However, if you run into any other crashes (or if the method mentioned above still causes crashes despite using valid indices), please let me know ;)

    For sure that was. i think i messed initially calculate x and y of block position and because that i get out of bounds and game no check and got server crash.

    Thx red51.


    Lol i don't read until late after i figure how to make alone.

    BTW i encountered server crash when i try to use function getLODSurfaceLevel() :(

    I will try example from you to see if server still crash when i use function.


    So i make something like this:



    I tested your code. No crash! Function seems to work properly .

    After i tested again my first variant. All worked fine. :thumbup:


    I am not sure why earlier test server crashed many time with exception UNCAUGHT ...



    Hi.


    I want to make a function in API to teleport player on location (x,z), let say function teleport_to_surface(x,z). For this i need to calculate a safe Y value so player don't teleport underground or on high and fall to death. So require is to teleport on ground on terrain or if is any building block here, on top of it.


    Any can have a idea to accomplish that?

    First try was to use function raycastFromWorldPosition(...) but this have serious limitless like chunk when i want to teleport need to be rendered on client side and if teleport far away or on unexplored world .. this approach do not function.

    For second try i think to read somehow position of Z direct from chunk data, but here i am stuck i don't have idea how i can do that. Moreover what happen if i want to work with a chunk which was not yet generated by server ...


    Thx in advance for hints!

    It's the case yahwho say. Survival. I make like other time: just planted and go away in other zone for a few days. When i come back nothing grow, but in same time i collect apples from some wild apple tree and they already have another apples in less 24h. I plant again a apple tree to see tomorrow if grow. BTW all apples tree are one protected area if this matter. And i collect some corn too. This, same like apple tree, don't make another corn. And apple tree and corn are planted at least from Sunday if remember correctly.


    EDIT: I just check and apple tree, planted yesterday, are mature now with apples. That in around 12h. Still others, stuck on grow, apple tree and corn are the same: apple tree in some stage of grow and mature apple tree and corn not make another apple, corn.

    It's like in some cases plants forget to grow. it happens to remains in sap stage, or in some grow stage. In first case collect sap and replant usually fix grow but in latter you lose sap if plant is apple tree for example. And this happen too with mature apple tree or corn. Collect it and it's a chance to not start to make apple or corn again.