diff --git a/src/main/java/carpet/mixins/GuardianEntityMixin.java b/src/main/java/carpet/mixins/GuardianEntityMixin.java index ad7234ce..41afb22b 100644 --- a/src/main/java/carpet/mixins/GuardianEntityMixin.java +++ b/src/main/java/carpet/mixins/GuardianEntityMixin.java @@ -24,7 +24,7 @@ public abstract class GuardianEntityMixin extends HostileEntity @Override public void onStruckByLightning(LightningEntity lightning) { - if (!this.world.isClient && !this.removed && CarpetSettings.renewableSponges) + if (!this.world.isClient && !this.removed && CarpetSettings.renewableSponges && !((Object)this instanceof ElderGuardianEntity)) { ElderGuardianEntity elderGuardian = new ElderGuardianEntity(EntityType.ELDER_GUARDIAN ,this.world); elderGuardian.refreshPositionAndAngles(this.getX(), this.getY(), this.getZ(), this.yaw, this.pitch); diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index bd12b0ca..020698cc 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -23,6 +23,7 @@ import carpet.utils.Messenger; public class EntityPlayerMPFake extends ServerPlayerEntity { public Runnable fixStartingPosition = () -> {}; + public boolean isAShadow; public static EntityPlayerMPFake createFake(String username, MinecraftServer server, double d0, double d1, double d2, double yaw, double pitch, DimensionType dimension, GameMode gamemode) { @@ -38,7 +39,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity { gameprofile = SkullBlockEntity.loadProperties(gameprofile); } - EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, gameprofile, interactionManagerIn); + EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, gameprofile, interactionManagerIn, false); instance.fixStartingPosition = () -> instance.refreshPositionAndAngles(d0, d1, d2, (float) yaw, (float) pitch); server.getPlayerManager().onPlayerConnect(new NetworkManagerFake(NetworkSide.SERVERBOUND), instance); if (instance.dimension != dimension) //player was logged in in a different dimension @@ -73,7 +74,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity ServerWorld worldIn = server.getWorld(player.dimension); ServerPlayerInteractionManager interactionManagerIn = new ServerPlayerInteractionManager(worldIn); GameProfile gameprofile = player.getGameProfile(); - EntityPlayerMPFake playerShadow = new EntityPlayerMPFake(server, worldIn, gameprofile, interactionManagerIn); + EntityPlayerMPFake playerShadow = new EntityPlayerMPFake(server, worldIn, gameprofile, interactionManagerIn, true); server.getPlayerManager().onPlayerConnect(new NetworkManagerFake(NetworkSide.SERVERBOUND), playerShadow); playerShadow.setHealth(player.getHealth()); @@ -90,9 +91,10 @@ public class EntityPlayerMPFake extends ServerPlayerEntity return playerShadow; } - private EntityPlayerMPFake(MinecraftServer server, ServerWorld worldIn, GameProfile profile, ServerPlayerInteractionManager interactionManagerIn) + private EntityPlayerMPFake(MinecraftServer server, ServerWorld worldIn, GameProfile profile, ServerPlayerInteractionManager interactionManagerIn, boolean shadow) { super(server, worldIn, profile, interactionManagerIn); + isAShadow = shadow; } diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index a579512b..4990c1b4 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -155,6 +155,7 @@ public class CarpetExpression private final Expression expr; Expression getExpr() {return expr;} private static long tickStart = 0L; + // dummy entity for dummy requirements in the loot tables (see snowball) private static FallingBlockEntity DUMMY_ENTITY = new FallingBlockEntity(EntityType.FALLING_BLOCK, null); private static boolean stopAll = false; @@ -2157,6 +2158,17 @@ public class CarpetExpression *

String with gamemode, or null if not a player.

*

query(e,'gamemode_id')

*

Good'ol gamemode id, or null if not a player.

+ *

query(e,'player_type')

+ *

Returns null if the argument is not a player, otherwise:

+ * *

query(e,'permission_level')

*

Player's permission level, or null if not applicable for this entity.

* diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 4760a84e..f3a39475 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -4,6 +4,7 @@ import carpet.fakes.EntityInterface; import carpet.fakes.ItemEntityInterface; import carpet.fakes.MobEntityInterface; import carpet.helpers.Tracer; +import carpet.patches.EntityPlayerMPFake; import carpet.script.CarpetContext; import carpet.script.EntityEventsGroup; import carpet.script.exception.InternalExpressionException; @@ -32,6 +33,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; @@ -311,6 +313,23 @@ public class EntityValue extends Value return Value.NULL; }); + put("player_type", (e, a) -> { + if (e instanceof PlayerEntity) + { + if (e instanceof EntityPlayerMPFake) return new StringValue(((EntityPlayerMPFake) e).isAShadow?"shadow":"fake"); + PlayerEntity p = (PlayerEntity)e; + MinecraftServer server = p.getEntityWorld().getServer(); + if (server.isDedicated()) return new StringValue("multiplayer"); + boolean runningLan = server.isRemote(); + if (!runningLan) return new StringValue("singleplayer"); + boolean isowner = server.isOwner(p.getGameProfile()); + if (isowner) return new StringValue("lan_host"); + return new StringValue("lan player"); + // realms? + } + return Value.NULL; + }); + //spectating_entity // isGlowing put("effect", (e, a) ->