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)