diff --git a/src/main/java/xyz/illuc/neuralgiacore/MedicalEffects.java b/src/main/java/xyz/illuc/neuralgiacore/MedicalEffects.java index c9c408a..de26928 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/MedicalEffects.java +++ b/src/main/java/xyz/illuc/neuralgiacore/MedicalEffects.java @@ -16,10 +16,22 @@ public class MedicalEffects { }; public static final MedicalEffect WEAK_ALCOHOL = new MedicalEffect() { - + @Override + public void applyOnSkin(ServerPlayer player, float ml, Limb limb) { + player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA).ifPresent(h->{ + h.setLimbPain(limb, h.getLimbPain(limb)+0.2f*ml); + h.setLimbDesinfected(limb,Math.max(h.getLimbDesinfected(limb),100*ml)); + }); + } }; public static final MedicalEffect ETHANOL = new MedicalEffect() { - + @Override + public void applyOnSkin(ServerPlayer player, float ml, Limb limb) { + player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA).ifPresent(h->{ + h.setLimbPain(limb, h.getLimbPain(limb)+0.2f*ml); + h.setLimbDesinfected(limb,Math.max(h.getLimbDesinfected(limb),700*ml)); + }); + } }; } diff --git a/src/main/java/xyz/illuc/neuralgiacore/items/BloodBagItem.java b/src/main/java/xyz/illuc/neuralgiacore/items/BloodBagItem.java index 9092212..aa6e59a 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/items/BloodBagItem.java +++ b/src/main/java/xyz/illuc/neuralgiacore/items/BloodBagItem.java @@ -7,13 +7,14 @@ import net.adinvas.prototype_pain.fluid_system.MultiTankHelper; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; import xyz.illuc.neuralgiacore.registers.RegisterMedicalFluids; +//TODO make it expire + public class BloodBagItem extends SyringeItem { @Override public int getCapacity() { diff --git a/src/main/java/xyz/illuc/neuralgiacore/items/SyringeItem.java b/src/main/java/xyz/illuc/neuralgiacore/items/SyringeItem.java index 2a072ea..e247211 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/items/SyringeItem.java +++ b/src/main/java/xyz/illuc/neuralgiacore/items/SyringeItem.java @@ -6,6 +6,7 @@ import net.adinvas.prototype_pain.item.multi_tank.MultiTankFluidItem; import net.adinvas.prototype_pain.limbs.Limb; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; @@ -13,6 +14,14 @@ import org.jetbrains.annotations.Nullable; public class SyringeItem extends MultiTankFluidItem implements IMedicalMinigameUsable { + public SyringeItem(Properties properties) { + super(properties); + } + + public SyringeItem() { + super(new Properties()); + } + @Override public int getCapacity() { return 250; diff --git a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinDehydration.java b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinDehydration.java new file mode 100644 index 0000000..8c6f4e8 --- /dev/null +++ b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinDehydration.java @@ -0,0 +1,30 @@ +package xyz.illuc.neuralgiacore.mixin.PrototypePain; + +import com.llamalad7.mixinextras.sugar.Local; +import net.adinvas.prototype_pain.limbs.PlayerHealthData; +import net.dries007.tfc.common.capabilities.food.TFCFoodData; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.food.FoodData; +import org.objectweb.asm.Opcodes; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import xyz.illuc.neuralgiacore.interfaces.IPlayerHealthDataAccessor; + +@Mixin(PlayerHealthData.class) +public abstract class MixinDehydration { + + @Shadow public abstract void setOxygenCap(float value); + + @Shadow public abstract float getOxygenCap(); + + @Inject(method = "tickUpdate", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 5, shift = At.Shift.AFTER), remap = false) + private void modifyConsciousnessWithThirst(ServerPlayer player, CallbackInfo ci) { + FoodData nutrition = player.getFoodData(); + assert nutrition instanceof TFCFoodData; + this.setOxygenCap((float) (this.getOxygenCap() - (100-((TFCFoodData) nutrition).getThirst())/2)); + } +} diff --git a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinModdedMedicalFluids.java b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinModdedMedicalFluids.java index df516cd..fe7a765 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinModdedMedicalFluids.java +++ b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinModdedMedicalFluids.java @@ -28,11 +28,8 @@ public class MixinModdedMedicalFluids { default -> { Stream> tags = fs.defaultFluidState().getTags(); if (tags.anyMatch(n -> { - System.out.println(n.toString()); return n.toString().equals("TagKey[minecraft:fluid / tfc:alcohols]"); - })) { - yield RegisterMedicalFluids.WEAK_ALCOHOL.get(); - } + })) { yield RegisterMedicalFluids.WEAK_ALCOHOL.get(); } yield ModMedicalFluids.VANILLA_WATER.get(); } }; diff --git a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinRespitoryArrest.java b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinRespitoryArrest.java new file mode 100644 index 0000000..1f29fb5 --- /dev/null +++ b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinRespitoryArrest.java @@ -0,0 +1,49 @@ +package xyz.illuc.neuralgiacore.mixin.PrototypePain; + +import com.llamalad7.mixinextras.sugar.Local; +import net.adinvas.prototype_pain.limbs.PlayerHealthData; +import net.dries007.tfc.common.capabilities.food.TFCFoodData; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.food.FoodData; +import org.objectweb.asm.Opcodes; +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.Redirect; +import xyz.illuc.neuralgiacore.interfaces.IPlayerHealthDataAccessor; + +@Mixin(PlayerHealthData.class) +public class MixinRespitoryArrest { + + @Shadow + private boolean respitoryArrest; + + @Redirect( + method = "tickUpdate", // replace with your method name + at = @At( + value = "FIELD", + target = "Lnet/adinvas/prototype_pain/limbs/PlayerHealthData;respitoryArrest:Z", + opcode = Opcodes.PUTFIELD + ), + remap = false + ) + private void tfcpain$redirectRespitoryArrest(PlayerHealthData instance, boolean value, @Local(argsOnly = true) ServerPlayer player) { + boolean dehydrated = false; + boolean septicShock = false; + + FoodData nutrition = player.getFoodData(); + if (nutrition instanceof TFCFoodData) { + if (((TFCFoodData) nutrition).getThirst() == 0) + dehydrated = true; + } + + IPlayerHealthDataAccessor accessor = (IPlayerHealthDataAccessor) this; + if (accessor.getSepsis() > 99F){ + septicShock = true; + } + + boolean modified = value || dehydrated || septicShock; + + respitoryArrest = modified; + } +} diff --git a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinSickness.java b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinSickness.java index 4df97a2..694dc97 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinSickness.java +++ b/src/main/java/xyz/illuc/neuralgiacore/mixin/PrototypePain/MixinSickness.java @@ -1,6 +1,8 @@ package xyz.illuc.neuralgiacore.mixin.PrototypePain; +import net.adinvas.prototype_pain.PlayerHealthProvider; import net.adinvas.prototype_pain.limbs.PlayerHealthData; +import net.dries007.tfc.common.capabilities.food.TFCFoodData; import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,4 +19,42 @@ public class MixinSickness { accessor.setSickness(Math.max(0, Math.min(100, ((accessor.getSickness() + sicknessRemoval))))); } + + @Inject(method = "tickUpdate", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 5, shift = At.Shift.AFTER), remap = false) + private void updateVomitTime(ServerPlayer player, CallbackInfo ci) { + IPlayerHealthDataAccessor accessor = (IPlayerHealthDataAccessor) this; + + float sickness = accessor.getSickness(); + float vomitTime = accessor.getVomitTime(); + + + if (sickness > 50) { + accessor.setVomitTime(vomitTime + (sickness * 0.0025F)); + } else { + accessor.setVomitTime(vomitTime - (sickness * 0.0025F)); + } + + if (accessor.getVomitTime() > 50) { + throwUp(player); + accessor.setVomitTime(0); + } + + accessor.setVomitTime(Math.max(0, accessor.getVomitTime())); + } + + private void throwUp(ServerPlayer player) { + player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA).ifPresent(h -> { + IPlayerHealthDataAccessor accessor = (IPlayerHealthDataAccessor) h; + + if (player.getFoodData() instanceof TFCFoodData) { + float thirst = ((TFCFoodData) player.getFoodData()).getThirst(); + ((TFCFoodData) player.getFoodData()).setThirst(thirst - 10); + } + //System.out.println(player.getFoodData().getFoodLevel()); + player.getFoodData().setFoodLevel(player.getFoodData().getFoodLevel() - 2); + + + accessor.setSickness(Math.max(0, Math.min(100, accessor.getSickness() - 8))); + }); + } } diff --git a/src/main/java/xyz/illuc/neuralgiacore/mixin/Tfc/MixinHealthBar.java b/src/main/java/xyz/illuc/neuralgiacore/mixin/Tfc/MixinHealthBar.java index 37a7d8d..c700812 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/mixin/Tfc/MixinHealthBar.java +++ b/src/main/java/xyz/illuc/neuralgiacore/mixin/Tfc/MixinHealthBar.java @@ -25,15 +25,15 @@ public class MixinHealthBar { remap = false ) private static void renderHealth(LivingEntity player, ForgeGui gui, GuiGraphics graphics, int width, int height) { - tfcpain$renderConscioussnes(gui, graphics, width, height); - tfcpain$renderOxygen(gui, graphics, width, height); + renderConscioussnes(gui, graphics, width, height); + renderOxygen(gui, graphics, width, height); } @Unique - private static final ResourceLocation TEXTURE = new ResourceLocation("tfcpain", "textures/overlay.png"); + private static final ResourceLocation TEXTURE = new ResourceLocation("neuralgiacore", "textures/overlay.png"); @Unique - private static void tfcpain$renderConscioussnes(ForgeGui gui, GuiGraphics graphics, int width, int height) { + private static void renderConscioussnes(ForgeGui gui, GuiGraphics graphics, int width, int height) { PoseStack stack = graphics.pose(); Minecraft minecraft = Minecraft.getInstance(); if ( gui.shouldDrawSurvivalElements() && setup(gui, minecraft)) { @@ -65,7 +65,7 @@ public class MixinHealthBar { } @Unique - private static void tfcpain$renderOxygen(ForgeGui gui, GuiGraphics graphics, int width, int height) { + private static void renderOxygen(ForgeGui gui, GuiGraphics graphics, int width, int height) { PoseStack stack = graphics.pose(); Minecraft minecraft = Minecraft.getInstance(); if ( gui.shouldDrawSurvivalElements() && setup(gui, minecraft)) { diff --git a/src/main/java/xyz/illuc/neuralgiacore/moodles/RadiationSicknessMoodle.java b/src/main/java/xyz/illuc/neuralgiacore/moodles/RadiationSicknessMoodle.java index 651f05b..af38026 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/moodles/RadiationSicknessMoodle.java +++ b/src/main/java/xyz/illuc/neuralgiacore/moodles/RadiationSicknessMoodle.java @@ -41,7 +41,7 @@ public class RadiationSicknessMoodle extends AbstractMoodleVisual { @Override public ResourceLocation renderIcon(GuiGraphics ms, float partialTicks, int x, int y) { - ResourceLocation tex = new ResourceLocation("neuralgia", "textures/moodles/radiation.png"); + ResourceLocation tex = new ResourceLocation("neuralgiacore", "textures/moodles/radiation.png"); ms.blit(tex, x, y, 0.0F, 0.0F, 16, 16, 16, 16); return tex; } @@ -51,16 +51,16 @@ public class RadiationSicknessMoodle extends AbstractMoodleVisual { List componentList = new ArrayList(); switch (this.getMoodleStatus()) { case NORMAL: - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.title1").withStyle(ChatFormatting.YELLOW)); - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.description1").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.title1").withStyle(ChatFormatting.YELLOW)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.description1").withStyle(ChatFormatting.GRAY)); break; case HEAVY: - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.title2").withStyle(ChatFormatting.GOLD)); - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.description2").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.title2").withStyle(ChatFormatting.GOLD)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.description2").withStyle(ChatFormatting.GRAY)); break; case CRITICAL: - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.title3").withStyle(ChatFormatting.RED)); - componentList.add(Component.translatable("neuralgia.gui.moodle.radiation.description3").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.title3").withStyle(ChatFormatting.RED)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.radiation.description3").withStyle(ChatFormatting.GRAY)); } return componentList; diff --git a/src/main/java/xyz/illuc/neuralgiacore/moodles/SepsisMoodle.java b/src/main/java/xyz/illuc/neuralgiacore/moodles/SepsisMoodle.java index e85cb5c..f1d065c 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/moodles/SepsisMoodle.java +++ b/src/main/java/xyz/illuc/neuralgiacore/moodles/SepsisMoodle.java @@ -41,7 +41,7 @@ public class SepsisMoodle extends AbstractMoodleVisual { @Override public ResourceLocation renderIcon(GuiGraphics ms, float partialTicks, int x, int y) { - ResourceLocation tex = new ResourceLocation("neuralgia", "textures/moodles/sepsis.png"); + ResourceLocation tex = new ResourceLocation("neuralgiacore", "textures/moodles/sepsis.png"); ms.blit(tex, x, y, 0.0F, 0.0F, 16, 16, 16, 16); return tex; } @@ -51,16 +51,16 @@ public class SepsisMoodle extends AbstractMoodleVisual { List componentList = new ArrayList(); switch (this.getMoodleStatus()) { case NORMAL: - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.title1").withStyle(ChatFormatting.YELLOW)); - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.description1").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.title1").withStyle(ChatFormatting.YELLOW)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.description1").withStyle(ChatFormatting.GRAY)); break; case HEAVY: - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.title2").withStyle(ChatFormatting.GOLD)); - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.description2").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.title2").withStyle(ChatFormatting.GOLD)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.description2").withStyle(ChatFormatting.GRAY)); break; case CRITICAL: - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.title3").withStyle(ChatFormatting.RED)); - componentList.add(Component.translatable("neuralgia.gui.moodle.sepsis.description3").withStyle(ChatFormatting.GRAY)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.title3").withStyle(ChatFormatting.RED)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sepsis.description3").withStyle(ChatFormatting.GRAY)); } return componentList; diff --git a/src/main/java/xyz/illuc/neuralgiacore/moodles/SicknessMoodle.java b/src/main/java/xyz/illuc/neuralgiacore/moodles/SicknessMoodle.java new file mode 100644 index 0000000..f13ef4a --- /dev/null +++ b/src/main/java/xyz/illuc/neuralgiacore/moodles/SicknessMoodle.java @@ -0,0 +1,74 @@ +package xyz.illuc.neuralgiacore.moodles; + + +import net.adinvas.prototype_pain.PlayerHealthProvider; +import net.adinvas.prototype_pain.client.moodles.AbstractMoodleVisual; +import net.adinvas.prototype_pain.client.moodles.MoodleStatus; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import xyz.illuc.neuralgiacore.interfaces.IPlayerHealthDataAccessor; + +import java.util.ArrayList; +import java.util.List; + +public class SicknessMoodle extends AbstractMoodleVisual { + public SicknessMoodle() { + } + //noinspection ConstantConditions + @Override + public MoodleStatus calculateStatus(Player player) { + if (!player.isLocalPlayer()) return MoodleStatus.NONE; + + return player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA).map(ph -> { + IPlayerHealthDataAccessor accessor = (IPlayerHealthDataAccessor) ph; + float sickness = accessor.getSickness(); + + if (sickness > 75F) { + return (MoodleStatus.CRITICAL); + } else if (sickness > 50F) { + return (MoodleStatus.HEAVY); + } else if (sickness > 30F) { + return (MoodleStatus.NORMAL); + } else if (sickness > 10F) { + return (MoodleStatus.LIGHT); + } else { + return (MoodleStatus.NONE); + } + }).orElse(MoodleStatus.NONE); + } + + @Override + public ResourceLocation renderIcon(GuiGraphics ms, float partialTicks, int x, int y) { + ResourceLocation tex = new ResourceLocation("neuralgiacore", "textures/moodles/sickness.png"); + ms.blit(tex, x, y, 0.0F, 0.0F, 16, 16, 16, 16); + return tex; + } + + @Override + public List getTooltip(Player player) { + List componentList = new ArrayList(); + switch (this.getMoodleStatus()) { + case LIGHT: + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.title1").withStyle(ChatFormatting.YELLOW)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.description1").withStyle(ChatFormatting.GRAY)); + break; + case NORMAL: + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.title2").withStyle(ChatFormatting.YELLOW)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.description2").withStyle(ChatFormatting.GRAY)); + break; + case HEAVY: + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.title3").withStyle(ChatFormatting.GOLD)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.description3").withStyle(ChatFormatting.GRAY)); + break; + case CRITICAL: + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.title4").withStyle(ChatFormatting.RED)); + componentList.add(Component.translatable("neuralgiacore.gui.moodle.sickness.description4").withStyle(ChatFormatting.GRAY)); + } + + return componentList; + } + +} diff --git a/src/main/java/xyz/illuc/neuralgiacore/registers/RegisterMoodles.java b/src/main/java/xyz/illuc/neuralgiacore/registers/RegisterMoodles.java index 764737f..bd28059 100644 --- a/src/main/java/xyz/illuc/neuralgiacore/registers/RegisterMoodles.java +++ b/src/main/java/xyz/illuc/neuralgiacore/registers/RegisterMoodles.java @@ -4,6 +4,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.common.Mod; import xyz.illuc.neuralgiacore.NeuralgiaCoreMod; import xyz.illuc.neuralgiacore.moodles.SepsisMoodle; +import xyz.illuc.neuralgiacore.moodles.SicknessMoodle; import static net.adinvas.prototype_pain.client.moodles.MoodleController.registerMoodle; @@ -11,6 +12,6 @@ import static net.adinvas.prototype_pain.client.moodles.MoodleController.registe public class RegisterMoodles { static { registerMoodle(new SepsisMoodle()); - //registerMoodle(new SicknessMoodle()); + registerMoodle(new SicknessMoodle()); } } \ No newline at end of file diff --git a/src/main/resources/neuralgiacore.mixins.json b/src/main/resources/neuralgiacore.mixins.json index a4b6713..7ac77f8 100644 --- a/src/main/resources/neuralgiacore.mixins.json +++ b/src/main/resources/neuralgiacore.mixins.json @@ -6,10 +6,12 @@ "refmap": "neuralgiacore.refmap.json", "mixins": [ "PrototypePain.MixinAmbientTemperature", + "PrototypePain.MixinDehydration", "PrototypePain.MixinLegUsePacket", "PrototypePain.MixinModdedMedicalFluids", "PrototypePain.MixinOverlayController", "PrototypePain.MixinPlayerHealthDataExtras", + "PrototypePain.MixinRespitoryArrest", "PrototypePain.MixinSepsis", "PrototypePain.MixinSickness", "PrototypePain.MixinSicknessOverlay",