diff --git a/src/main/java/carpet/fakes/HungerManagerInterface.java b/src/main/java/carpet/fakes/HungerManagerInterface.java new file mode 100644 index 00000000..028c0bf3 --- /dev/null +++ b/src/main/java/carpet/fakes/HungerManagerInterface.java @@ -0,0 +1,5 @@ +package carpet.fakes; + +public interface HungerManagerInterface { + float getExhaustion(); +} diff --git a/src/main/java/carpet/mixins/HungerManagerMixin_scarpetEventsMixin.java b/src/main/java/carpet/mixins/HungerManagerMixin_scarpetEventsMixin.java new file mode 100644 index 00000000..c9f341e3 --- /dev/null +++ b/src/main/java/carpet/mixins/HungerManagerMixin_scarpetEventsMixin.java @@ -0,0 +1,20 @@ +package carpet.mixins; + +import carpet.fakes.EntityInterface; +import carpet.fakes.HungerManagerInterface; +import carpet.script.EntityEventsGroup; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.player.HungerManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(HungerManager.class) +public class HungerManagerMixin_scarpetEventsMixin implements HungerManagerInterface { + @Shadow private float exhaustion; + public float getExhaustion(){ + return exhaustion; + } +} \ No newline at end of file diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 68c3f14d..faec676c 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -1,17 +1,21 @@ package carpet.script.value; +import carpet.CarpetSettings; import carpet.fakes.EntityInterface; import carpet.fakes.ItemEntityInterface; import carpet.fakes.LivingEntityInterface; import carpet.fakes.MobEntityInterface; +import carpet.fakes.HungerManagerInterface; import carpet.helpers.Tracer; import carpet.patches.EntityPlayerMPFake; import carpet.script.CarpetContext; import carpet.script.EntityEventsGroup; import carpet.script.argument.Vector3Argument; import carpet.script.exception.InternalExpressionException; +import carpet.utils.Messenger; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.entity.player.HungerManager; import net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket; import net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; @@ -285,6 +289,21 @@ 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("hunger", (e, a) -> { + if(e instanceof PlayerEntity) return new NumericValue(((PlayerEntity) e).getHungerManager().getFoodLevel()); + return Value.NULL; + }); + put("saturation", (e, a) -> { + if(e instanceof PlayerEntity) return new NumericValue(((PlayerEntity) e).getHungerManager().getSaturationLevel()); + return Value.NULL; + }); + + put("exhaustion",(e, a)->{ + if(e instanceof PlayerEntity) + return new NumericValue(((HungerManagerInterface)((PlayerEntity) e).getHungerManager()).getExhaustion()); + return Value.NULL; + }); + put("jumping", (e, a) -> { if (e instanceof LivingEntity) { @@ -934,20 +953,24 @@ public class EntityValue extends Value } }); - put("silent",(e,v)->{ - e.setSilent(v.getBoolean()); + put("silent",(e,v)-> e.setSilent(v.getBoolean())); + + put("gravity",(e,v)-> e.setNoGravity(!v.getBoolean())); + + put("invulnerable",(e,v)-> e.setInvulnerable(v.getBoolean())); + + put("fire",(e,v)-> e.setFireTicks((int)NumericValue.asNumber(v).getLong())); + + put("hunger", (e, v)-> { + if(e instanceof PlayerEntity) ((PlayerEntity) e).getHungerManager().setFoodLevel((int) NumericValue.asNumber(v).getLong()); }); - put("gravity",(e,v)->{ - e.setNoGravity(!v.getBoolean()); + put("exhaustion", (e, v)-> { + if(e instanceof PlayerEntity) ((PlayerEntity) e).getHungerManager().addExhaustion((int) NumericValue.asNumber(v).getLong()); }); - put("invulnerable",(e,v)->{ - e.setInvulnerable(v.getBoolean()); - }); - - put("fire",(e,v)->{ - e.setFireTicks((int)NumericValue.asNumber(v).getLong()); + put("saturation", (e, v)-> { + if(e instanceof PlayerEntity) ((PlayerEntity) e).getHungerManager().setSaturationLevelClient((float)NumericValue.asNumber(v).getLong()); }); // gamemode [check] diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 4b63eb8e..65ec4c40 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -155,7 +155,7 @@ "StatType_scarpetMixin", "PointOfInterest_scarpetMixin", "ServerWorld_scarpetEventMixin", - + "HungerManagerMixin_scarpetEventsMixin", "PistonBlock_movableTEMixin", "PistonBlockEntity_movableTEMixin",