diff options
Diffstat (limited to 'src/main/java/com/anthonyhilyard/iceberg/mixin')
-rw-r--r-- | src/main/java/com/anthonyhilyard/iceberg/mixin/EntityMixin.java | 66 | ||||
-rw-r--r-- | src/main/java/com/anthonyhilyard/iceberg/mixin/PlayerAdvancementsMixin.java | 31 |
2 files changed, 97 insertions, 0 deletions
diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/EntityMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/EntityMixin.java new file mode 100644 index 0000000..f4ca091 --- /dev/null +++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/EntityMixin.java @@ -0,0 +1,66 @@ +package com.anthonyhilyard.iceberg.mixin; + +import java.util.Objects; + +import com.anthonyhilyard.iceberg.events.EntityFluidEvent; + +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.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.entity.Entity; +import net.minecraft.fluid.Fluid; +import net.minecraft.tags.ITag; +import net.minecraftforge.common.MinecraftForge; + +@Mixin(Entity.class) +public class EntityMixin extends net.minecraftforge.common.capabilities.CapabilityProvider<Entity> +{ + private Fluid previousFluidOnEyes = null; + + @Shadow + protected ITag<Fluid> fluidOnEyes; + + protected EntityMixin(Class<Entity> baseClass) { super(baseClass); } + + @Inject(method = "updateFluidOnEyes", at = @At(value = "RETURN")) + public void onUpdateFluidOnEyes(CallbackInfo callbackInfo) + { + if (fluidOnEyes != null && fluidOnEyes.getValues().size() > 0) + { + previousFluidOnEyes = fluidOnEyes.getValues().get(0); + } + else if (previousFluidOnEyes != null) + { + // We were submerged in a fluid that we no longer are. + if (previousFluidOnEyes != null) + { + MinecraftForge.EVENT_BUS.post(new EntityFluidEvent.Exited((Entity)(Object)this, previousFluidOnEyes)); + } + previousFluidOnEyes = null; + } + } + + @Inject(method = "updateFluidOnEyes", + at = @At(value = "FIELD", target = "Lnet/minecraft/entity/Entity;fluidOnEyes:Lnet/minecraft/tags/ITag;", ordinal = 1, shift = Shift.AFTER)) + public void onUpdateFluidOnEyeAssign(CallbackInfo callbackInfo) + { + Fluid currentFluid = null; + if (fluidOnEyes != null && fluidOnEyes.getValues().size() > 0) + { + currentFluid = fluidOnEyes.getValues().get(0); + } + + if (!Objects.equals(previousFluidOnEyes, currentFluid)) + { + // We are now submerged in a fluid that doesn't match the previous one. + if (currentFluid != null) + { + MinecraftForge.EVENT_BUS.post(new EntityFluidEvent.Entered((Entity)(Object)this, currentFluid)); + } + } + } +} diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/PlayerAdvancementsMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/PlayerAdvancementsMixin.java new file mode 100644 index 0000000..b27b219 --- /dev/null +++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/PlayerAdvancementsMixin.java @@ -0,0 +1,31 @@ +package com.anthonyhilyard.iceberg.mixin; + +import com.anthonyhilyard.iceberg.events.CriterionEvent; + +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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.PlayerAdvancements; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraftforge.common.MinecraftForge; + +@Mixin(PlayerAdvancements.class) +public class PlayerAdvancementsMixin +{ + @Shadow + private ServerPlayerEntity player; + + @Inject(method = "award", at = @At(value = "TAIL"), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + public void onAward(Advancement advancement, String criterionKey, CallbackInfoReturnable<Boolean> callbackInfo, boolean success) + { + if (success) + { + MinecraftForge.EVENT_BUS.post(new CriterionEvent(player, advancement, criterionKey)); + } + } +} |