diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index 47c79225..9d8c4473 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -422,6 +422,10 @@ Numbers related to player's xp. `xp` is the overall xp player has, `xp_level` is Number indicating remaining entity health, or `null` if not applicable. +### `query(e, 'language')` + +Returns `null` for any non-player entity, if not returns the player's language as a string. + ### `query(e, 'holds', slot?)` Returns triple of short name, stack count, and NBT of item held in `slot`, or `null` if nothing or not applicable. Available options for `slot` are: diff --git a/src/main/java/carpet/fakes/ClientSettingsC2SPacketInterface.java b/src/main/java/carpet/fakes/ClientSettingsC2SPacketInterface.java new file mode 100644 index 00000000..c881ee95 --- /dev/null +++ b/src/main/java/carpet/fakes/ClientSettingsC2SPacketInterface.java @@ -0,0 +1,5 @@ +package carpet.fakes; + +public interface ClientSettingsC2SPacketInterface { + public String getLanguage(); +} diff --git a/src/main/java/carpet/fakes/ServerPlayerEntityInterface.java b/src/main/java/carpet/fakes/ServerPlayerEntityInterface.java index 9fd69a30..173081b1 100644 --- a/src/main/java/carpet/fakes/ServerPlayerEntityInterface.java +++ b/src/main/java/carpet/fakes/ServerPlayerEntityInterface.java @@ -7,5 +7,5 @@ public interface ServerPlayerEntityInterface EntityPlayerActionPack getActionPack(); void invalidateEntityObjectReference(); boolean isInvalidEntityObject(); - + String getLanguage(); } diff --git a/src/main/java/carpet/mixins/ClientSettingsC2SPacket_scarpetMixin.java b/src/main/java/carpet/mixins/ClientSettingsC2SPacket_scarpetMixin.java new file mode 100644 index 00000000..66a722c8 --- /dev/null +++ b/src/main/java/carpet/mixins/ClientSettingsC2SPacket_scarpetMixin.java @@ -0,0 +1,18 @@ +package carpet.mixins; + +import carpet.fakes.ClientSettingsC2SPacketInterface; +import net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ClientSettingsC2SPacket.class) +public class ClientSettingsC2SPacket_scarpetMixin implements ClientSettingsC2SPacketInterface { + @Shadow + private String language; + + @Override + public String getLanguage(){ + return this.language; + } +} + diff --git a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java index 511d56dc..06396698 100644 --- a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java @@ -1,5 +1,6 @@ package carpet.mixins; +import carpet.fakes.ClientSettingsC2SPacketInterface; import carpet.fakes.EntityInterface; import carpet.fakes.ServerPlayerEntityInterface; import carpet.script.EntityEventsGroup; @@ -7,6 +8,7 @@ import com.mojang.authlib.GameProfile; import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.stat.Stat; @@ -126,4 +128,16 @@ public abstract class ServerPlayerEntity_scarpetEventMixin extends PlayerEntity { return isInvalidReference; } + + //getting player language + private String language; + + public String getLanguage(){ + return this.language; + } + + @Inject(method = "setClientSettings", at = @At("HEAD")) + public void setClientSettings(ClientSettingsC2SPacket packet, CallbackInfo ci){ + this.language = ((ClientSettingsC2SPacketInterface) packet).getLanguage(); + } } diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 500a1017..0bce0ae6 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -535,6 +535,12 @@ public class EntityValue extends Value }); put("air", (e, a) -> new NumericValue(e.getAir())); + put("language", (e, a)->{ + if(!(e instanceof ServerPlayerEntity)) + return NULL; + String lang = ((ServerPlayerEntityInterface) e).getLanguage(); + return StringValue.of(lang); + }); put("persistence", (e, a) -> { if (e instanceof MobEntity) return new NumericValue(((MobEntity) e).isPersistent()); return Value.NULL; diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index bf1f0789..02262198 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -74,6 +74,7 @@ "ExperienceOrbEntityMixin", "PlayerActionC2SPacketMixin", "ServerPlayerEntityMixin", + "ClientSettingsC2SPacket_scarpetMixin", "PlayerManager_coreMixin", "PlayerManager_fakePlayersMixin", "RedstoneWireBlockMixin",