From cfe1a9e729c79eec4fed379d93768a20b70d3bb9 Mon Sep 17 00:00:00 2001 From: gnembon Date: Mon, 4 May 2020 23:09:02 -0300 Subject: [PATCH 1/2] fix --- src/main/java/carpet/script/CarpetExpression.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 0b0bd068..a2f8154a 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -1164,7 +1164,8 @@ public class CarpetExpression String reqString = requested.getString(); String structureName = FeatureGenerator.featureToStructure.get(reqString); if (structureName == null) throw new InternalExpressionException("Unknown structure: " + reqString); - structure = Feature.STRUCTURES.get(structureName); + structure = Feature.STRUCTURES.get(structureName.toLowerCase(Locale.ROOT)); + if (structure == null) throw new InternalExpressionException("Unsupported structure: " + structureName); } if (lv.size() > locator.offset+1) { From aade01a3b39964327cdbc191ac27a7f055769fc9 Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 5 May 2020 17:18:04 -0300 Subject: [PATCH 2/2] place_item can use non-block items. fixes #260 --- docs/scarpet/Full.md | 11 +++++-- docs/scarpet/api/BlocksAndWorldAccess.md | 11 +++++-- .../java/carpet/script/CarpetExpression.java | 32 +++++++++++++------ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 4e0ea027..97fccb91 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -1646,19 +1646,26 @@ __on_chunk_generated(x, z) -> ( ### `place_item(item, pos, facing?, sneak?)` -Places a given item in the world like it was placed by a player. Item names are default minecraft item name, +Uses a given item in the world like it was used by a player. Item names are default minecraft item name, less the minecraft prefix. Default facing is 'up', but there are other options: 'down', 'north', 'east', 'south', 'west', but also there are other secondary directions important for placement of blocks like stairs, doors, etc. Try experiment with options like 'north-up' which is placed facing north with cursor pointing to the upper part of the block, or 'up-north', which means a block placed facing up (player looking down) and placed smidge away of the block center towards north. Optional sneak is a boolean indicating if a player would be sneaking while placing the -block - this option only affects placement of chests and scaffolding at the moment. Returns true if placement was +block - this option only affects placement of chests and scaffolding at the moment. + +Works with items that have the right-click effect on the block placed, `'like bone_meal`` on grass or axes on logs, +but doesn't open chests / containers, so have no effect on interactive blocks, like TNT, comparators, etc. + +Returns true if placement/use was successful, false otherwise.
 place_item('stone',x,y,z) // places a stone block on x,y,z block
 place_item('piston,x,y,z,'down') // places a piston facing down
 place_item('carrot',x,y,z) // attempts to plant a carrot plant. Returns true if could place carrots at that position.
+place_item('bone_meal',x,y,z) // attempts to bonemeal the ground.
+place_item('wooden_axe',x,y,z) // attempts to strip the log.
 
### `set_poi(pos, type, occupancy?)` diff --git a/docs/scarpet/api/BlocksAndWorldAccess.md b/docs/scarpet/api/BlocksAndWorldAccess.md index e6ae9e39..b9a67339 100644 --- a/docs/scarpet/api/BlocksAndWorldAccess.md +++ b/docs/scarpet/api/BlocksAndWorldAccess.md @@ -102,19 +102,26 @@ __on_chunk_generated(x, z) -> ( ### `place_item(item, pos, facing?, sneak?)` -Places a given item in the world like it was placed by a player. Item names are default minecraft item name, +Uses a given item in the world like it was used by a player. Item names are default minecraft item name, less the minecraft prefix. Default facing is 'up', but there are other options: 'down', 'north', 'east', 'south', 'west', but also there are other secondary directions important for placement of blocks like stairs, doors, etc. Try experiment with options like 'north-up' which is placed facing north with cursor pointing to the upper part of the block, or 'up-north', which means a block placed facing up (player looking down) and placed smidge away of the block center towards north. Optional sneak is a boolean indicating if a player would be sneaking while placing the -block - this option only affects placement of chests and scaffolding at the moment. Returns true if placement was +block - this option only affects placement of chests and scaffolding at the moment. + +Works with items that have the right-click effect on the block placed, `'like bone_meal`` on grass or axes on logs, +but doesn't open chests / containers, so have no effect on interactive blocks, like TNT, comparators, etc. + +Returns true if placement/use was successful, false otherwise.
 place_item('stone',x,y,z) // places a stone block on x,y,z block
 place_item('piston,x,y,z,'down') // places a piston facing down
 place_item('carrot',x,y,z) // attempts to plant a carrot plant. Returns true if could place carrots at that position.
+place_item('bone_meal',x,y,z) // attempts to bonemeal the ground.
+place_item('wooden_axe',x,y,z) // attempts to strip the log.
 
### `set_poi(pos, type, occupancy?)` diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index a2f8154a..99dd9628 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -98,6 +98,7 @@ import net.minecraft.state.property.Property; import net.minecraft.structure.StructurePiece; import net.minecraft.structure.StructureStart; import net.minecraft.text.LiteralText; +import net.minecraft.util.ActionResult; import net.minecraft.util.Clearable; import net.minecraft.util.Identifier; import net.minecraft.util.InvalidIdentifierException; @@ -1008,6 +1009,7 @@ public class CarpetExpression return success ? LazyValue.TRUE : LazyValue.FALSE; }); + // TODO rename to use_item this.expr.addLazyFunction("place_item", -1, (c, t, lv) -> { if (lv.size()<2) @@ -1023,18 +1025,28 @@ public class CarpetExpression boolean sneakPlace = false; if (lv.size() > locator.offset+1) sneakPlace = lv.get(locator.offset+1).evalValue(c).getBoolean(); - if (stackArg.getItem() instanceof BlockItem) + + BlockValue.PlacementContext ctx; + try { + ctx = BlockValue.PlacementContext.from(cc.s.getWorld(), where, facing, sneakPlace, stackArg.createStack(1, false)); + } + catch (CommandSyntaxException e) + { + throw new InternalExpressionException(e.getMessage()); + } + + if (!(stackArg.getItem() instanceof BlockItem)) + { + ActionResult useResult = ctx.getStack().useOnBlock(ctx); + if (useResult == ActionResult.CONSUME || useResult == ActionResult.SUCCESS) + { + return LazyValue.TRUE; + } + } + else + { // not sure we need special case for block items, since useOnBlock can do that as well BlockItem blockItem = (BlockItem) stackArg.getItem(); - BlockValue.PlacementContext ctx; - try - { - ctx = BlockValue.PlacementContext.from(cc.s.getWorld(), where, facing, sneakPlace, stackArg.createStack(1, false)); - } - catch (CommandSyntaxException e) - { - throw new InternalExpressionException(e.getMessage()); - } if (!ctx.canPlace()) return (_c, _t) -> Value.FALSE; BlockState placementState = blockItem.getBlock().getPlacementState(ctx);