diff --git a/docs/scarpet/api/Auxiliary.md b/docs/scarpet/api/Auxiliary.md index 2b4202e5..07b7c683 100644 --- a/docs/scarpet/api/Auxiliary.md +++ b/docs/scarpet/api/Auxiliary.md @@ -399,7 +399,7 @@ Queries in-game statistics for certain values. Categories include: * `picked_up`: items picked up * `dropped`: items dropped * `killed`: mobs killed -* `killed_by`: blocks mined +* `killed_by`: mobs killed by * `custom`: various random stats For the options of `entry`, consult your statistics page, or give it a guess. diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index cc9084d5..3a31838d 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -128,6 +128,10 @@ query(e,'type') => villager Returns a valid string to be used in commands to address an entity. Its UUID for all entities except player, where its their name. +## `query(e, 'persistence')` + +Returns if a mob has a persistence tag or not. Returns `null` for non-mob entities. +
 run('/kill ' + e~'command_name');
 
@@ -411,9 +415,15 @@ Sets the corresponding component of the motion vector. Adds a vector to the motion vector. Most realistic way to apply a force to an entity. -### `modify(e, 'custom_name'), modify(e, 'custom_name', name)` +### `modify(e, 'custom_name')`, `modify(e, 'custom_name', name)`, `modify(e, 'custom_name', name, visible)` -Sets the custom name of the entity. +Sets the custom name of the entity. Without arguments - clears current custom name. Optional visible affects +if the custom name is always visible, even through blocks. + +### `modify(e, 'persistence', bool?)` + +Sets the entity persistence tag to `true` (default) or `false`. Only affects mobs. Persistent mobs +don't despawn and don't count towards the mobcap. ### `modify(e, 'age', number)` diff --git a/src/main/java/carpet/fakes/MobEntityInterface.java b/src/main/java/carpet/fakes/MobEntityInterface.java index 290e5304..9e3ae237 100644 --- a/src/main/java/carpet/fakes/MobEntityInterface.java +++ b/src/main/java/carpet/fakes/MobEntityInterface.java @@ -10,4 +10,6 @@ public interface MobEntityInterface GoalSelector getAI(boolean target); Map getTemporaryTasks(); + + void setPersistence(boolean what); } diff --git a/src/main/java/carpet/mixins/MobEntityMixin.java b/src/main/java/carpet/mixins/MobEntityMixin.java index daa3cee4..2d8a5fff 100644 --- a/src/main/java/carpet/mixins/MobEntityMixin.java +++ b/src/main/java/carpet/mixins/MobEntityMixin.java @@ -16,6 +16,7 @@ public abstract class MobEntityMixin implements MobEntityInterface { @Shadow @Final protected GoalSelector targetSelector; @Shadow @Final protected GoalSelector goalSelector; + @Shadow private boolean persistent; public final Map temporaryTasks = new HashMap<>(); @Override @@ -30,5 +31,9 @@ public abstract class MobEntityMixin implements MobEntityInterface return temporaryTasks; } - + @Override + public void setPersistence(boolean what) + { + persistent = what; + } } diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 5018e62c..20746e15 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -289,6 +289,10 @@ public class EntityValue extends Value put("sneaking", (e, a) -> e.isSneaking()?Value.TRUE:Value.FALSE); put("sprinting", (e, a) -> e.isSprinting()?Value.TRUE:Value.FALSE); put("swimming", (e, a) -> e.isSwimming()?Value.TRUE:Value.FALSE); + put("persistence", (e, a) -> { + if (e instanceof MobEntity) return new NumericValue(((MobEntity) e).isPersistent()); + return Value.NULL; + }); put("hunger", (e, a) -> { if(e instanceof PlayerEntity) return new NumericValue(((PlayerEntity) e).getHungerManager().getFoodLevel()); return Value.NULL; @@ -520,6 +524,10 @@ public class EntityValue extends Value { throw new InternalExpressionException("'modify' for '"+what+"' expects a value"); } + catch (IndexOutOfBoundsException ind) + { + throw new InternalExpressionException("Wrong number of arguments for `modify` option: "+what); + } } private static void updatePosition(Entity e, double x, double y, double z, float yaw, float pitch) @@ -715,9 +723,23 @@ public class EntityValue extends Value e.setCustomName(null); return; } - e.setCustomNameVisible(true); + boolean showName = false; + if (v instanceof ListValue) + { + showName = ((ListValue) v).getItems().get(1).getBoolean(); + v = ((ListValue) v).getItems().get(0); + } + e.setCustomNameVisible(showName); e.setCustomName(new LiteralText(v.getString())); }); + + put("persistence", (e, v) -> + { + if (!(e instanceof MobEntity)) return; + if (v == null) v = Value.TRUE; + ((MobEntityInterface)e).setPersistence(v.getBoolean()); + }); + put("dismount", (e, v) -> e.stopRiding() ); put("mount", (e, v) -> { if (v instanceof EntityValue)