Giter VIP home page Giter VIP logo

niels-ntg / gdmc_http_interface Goto Github PK

View Code? Open in Web Editor NEW
15.0 3.0 3.0 849 KB

Minecraft Forge Mod that implements an HTTP interface for reading and writing blocks (and more) with an external program or script. Intended for use in the GDMC competition.

Home Page: https://gendesignmc.wikidot.com

License: MIT License

Java 99.14% Shell 0.86%
generative-art generative-design level-editor minecraft minecraft-forge minecraft-mod procedural-generation gdmc-competition gdmc architecture

gdmc_http_interface's Issues

Block entity information does get placed when placing structure with rotation and/or pivot

When placing a structure using the POST /structure endpoint with the parameters rotate and the pivot parameters, block entity information gets "misaligned" and does not get applied to to the proper place.

To replicate:

  1. Create a structure NBT file of at least 2x1x2 blocks in size with a sign with written text on it.
  2. Place structure using the POST /structure endpoint with pivot coordinate that does not have the same x and z coordinate as the sign and pass a rotate=1, rotate=2 or rotate=3.
  3. Structure will appear in the world, including the sign itself. The sign's text is missing.

Player interaction endpoints

Certain interactions cannot currently be replicated through the interface. Some interactions can be replicated, but are comparatively tedious (requesting, interpreting, modifying player-accessible data).
These interactions may include:

  • (can be replicated) 'Right click' on block / entity (attack/mine)
  • (can be replicated) 'Middle-click' on block / entity (return block / entity)
  • (can be replicated) Empty-handed 'left click' on block / entity (remove item from armour stand / item frame)
  • 'Left-click' with item in air or on block / entity (use item) which may include:
    • Applying bonemeal to blocks
    • Forcing a block update
    • Tethering animals to fences
      Some interactions may require a player-like entity to take effect. Such actions are unlikely to have an effect on the generation and may be ignored.

Internal server error (500) when sending specific malformed sign SNBT data

Calling PUT /blocks with a sign block with SNBT data in which one of the elements of front_text.messages or back_text.messages is an empty string causes an internal server error. The sign will however still be placed.

Example request that produces the error:

PUT localhost:9000/blocks

[
    {
        "x": 0,
        "y": 100,
        "z": 0,
        "id": "minecraft:oak_sign",
        "data": "{front_text:{messages:['']}}"
    }
]

Response:

{
    "status": 500,
    "message": "java.lang.NullPointerException\n\tat [email protected]/com.google.common.base.Preconditions.checkNotNull(Preconditions.java:903)\n\tat [email protected]/com.google.common.collect.ImmutableList$Builder.add(ImmutableList.java:815)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.ListCodec.lambda$decode$1(ListCodec.java:49)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult$Instance.ap2(DataResult.java:318)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult.apply2stable(DataResult.java:179)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.ListCodec.lambda$decode$2(ListCodec.java:48)\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:75)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.ListCodec.lambda$decode$4(ListCodec.java:45)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult.lambda$flatMap$11(DataResult.java:139)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.datafixers.util.Either$Left.map(Either.java:38)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult.flatMap(DataResult.java:137)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.ListCodec.decode(ListCodec.java:39)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.Decoder$1.decode(Decoder.java:49)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.Codec$2.decode(Codec.java:71)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.Decoder.parse(Decoder.java:18)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.RecordCodecBuilder$Instance$7.decode(RecordCodecBuilder.java:406)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.MapDecoder.lambda$compressedDecode$1(MapDecoder.java:52)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult.lambda$flatMap$11(DataResult.java:139)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.datafixers.util.Either$Left.map(Either.java:38)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.DataResult.flatMap(DataResult.java:137)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)\n\tat MC-BOOTSTRAP/[email protected]/com.mojang.serialization.Decoder.parse(Decoder.java:18)\n\tat TRANSFORMER/[email protected]/net.minecraft.world.level.block.entity.SignBlockEntity.m_142466_(SignBlockEntity.java:106)\n\tat TRANSFORMER/[email protected]/net.minecraftforge.common.extensions.IForgeBlockEntity.deserializeNBT(IForgeBlockEntity.java:35)\n\tat TRANSFORMER/[email protected]/nl.nielspoldervaart.gdmc.handlers.BlocksHandler.setBlockNBT(BlocksHandler.java:516)\n\tat TRANSFORMER/[email protected]/nl.nielspoldervaart.gdmc.handlers.BlocksHandler.lambda$putBlocksHandler$4(BlocksHandler.java:247)\n\tat java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104)\n\tat java.base/java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:617)\n\tat TRANSFORMER/[email protected]/nl.nielspoldervaart.gdmc.handlers.BlocksHandler.putBlocksHandler(BlocksHandler.java:229)\n\tat TRANSFORMER/[email protected]/nl.nielspoldervaart.gdmc.handlers.BlocksHandler.internalHandle(BlocksHandler.java:118)\n\tat TRANSFORMER/[email protected]/nl.nielspoldervaart.gdmc.handlers.HandlerBase.handle(HandlerBase.java:61)\n\tat jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:95)\n\tat jdk.httpserver/sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:82)\n\tat jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:98)\n\tat jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:851)\n\tat jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:95)\n\tat jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:818)\n\tat jdk.httpserver/sun.net.httpserver.ServerImpl$DefaultExecutor.execute(ServerImpl.java:201)\n\tat jdk.httpserver/sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:561)\n\tat jdk.httpserver/sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:527)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n"
}

Tested with:

  • GDMC-HTTP 1.4.4
  • Forge 48.1.0
  • Minecraft 1.20.2

Overwriting a container drops its contents even with `spawnDrops=false`

Overwriting a container block (e.g. a chest) with a different block will cause its contents to be dropped, even when spawnDrops is set to the default value false. Based on the documentation of spawnDrops, this seems like unintended behavior.

Example request that produces this effect (sending two requests works too):

PUT localhost:9000/blocks

[
    {
        "x": 0,
        "y": 100,
        "z": 0,
        "id": "minecraft:chest",
        "data": "{Items: [{Slot: 13b, id: 'apple', Count: 1b}]}"
    },
    {
        "x": 0,
        "y": 100,
        "z": 0,
        "id": "minecraft:stone"
    }
]

Tested with:

  • GDMC-HTTP 1.4.4
  • Forge 48.1.0
  • Minecraft 1.20.2

This behavior was not there in GDMC-HTTP 1.1.1, but I don't know which version introduced it (and I didn't feel like doing a binary search :P). I would guess it's 1.2.3 (which touched overwriting blocks with NBT data) or 1.4.0 (which optimized everything).

Specific `/item` command does not work as expected with `POST /commands`

To reproduce:

  1. Open a world and place a container block (e.g. a chest) at (0,100,0)
  2. Send the following request:
    POST localhost:9000/commands
    
    item replace block 0 100 0 container.13 with minecraft:apple 1
    

Expected result:
An apple is placed in slot 13 of the chest.

Observed result:
No apple is placed. Response:

[
    {
        "status": 0,
        "message": "Target position 0, 100, 0 is not a container"
    }
]

The exact same command does work as expected when issued in-game, so this seems to be a problem with GDMC-HTTP.

A more complicated version of this command (involving /execute) is used in one of the GDPC examples.

Tested with:

  • GDMC-HTTP 1.4.4
  • Forge 48.1.0
  • Minecraft 1.20.2

This behavior was not there in GDMC-HTTP 1.1.1 / Forge 43.2.0 / Minecraft 1.19.2, but I don't know which version introduced it.

1.18/1.19 compatibility

This may include:

  • Updating to Forge for MC 1.18 (Java 16)
  • Checking handling of sub-zero Y-coordinates
  • Checking handling of biomes stacked in Y-axis (3D biomes)

Structure endpoints

To allow for easy use and exchange of structure files. May include:

  • Endpoints for getting and setting in-world structure files (in NBT format, as if saving with a structure block)
  • Endpoint for placing a structure file in an NBT format (as if loading a structure file in-world)
  • Endpoint for placing an in-world structure file at x y z with rotation, deterioration etc. (as if activating a structure block)

Improve documentation

The wiki page in this repo does an oke job documenting the workings of the endpoints, but can use some clarification. Also the code itself needs some more documentation for future maintainers (including my future self).

  • Restructure endpoints documentation
  • Add comments to the code aimed at future maintainers

Timeout on big /get_blocks request

Could a timeout parameter be added to /get_blocks? It times out at around a minute, which doesn't work for big requests (n>1 million)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.