Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/main/java/rlmixins/config/FirstAidConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package rlmixins.config;

import fermiumbooter.annotations.MixinConfig;
import net.minecraftforge.common.config.Config;
import rlmixins.RLMixins;
import rlmixins.util.ModLoadedUtil;

@MixinConfig(name = RLMixins.MODID)
public class FirstAidConfig {

@Config.Comment("Properly preserve health when using the Exit End Portal")
@Config.Name("End Exit Health Patch (FirstAid)")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(
earlyMixin = "mixins.rlmixins.early.firstaid.endexithealth.json",
lateMixin = "mixins.rlmixins.late.firstaid.endexithealth.json",
defaultValue = false)
@MixinConfig.CompatHandling(
modid = ModLoadedUtil.FirstAid_MOID,
desired = true,
reason = "Requires mod to properly function"
)
public boolean endExitHealthPatch = false;

@Config.Comment("Compatibility patch for the End Exit Health Patch when PotionCore is present")
@Config.Name("End Exit Health Patch with PotionCore Compat (FirstAid/PotionCore)")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(lateMixin = "mixins.rlmixins.late.firstaid.potioncore.endexithealth.json", defaultValue = false)
@MixinConfig.CompatHandlingContainer({
@MixinConfig.CompatHandling(
modid = ModLoadedUtil.FirstAid_MOID,
desired = true,
reason = "Requires mod to properly function"
),
@MixinConfig.CompatHandling(
modid = ModLoadedUtil.PotionCore_MODID,
desired = true,
reason = "Requires mod to properly function"
)
})
public boolean endExitHealthPatchPotionCoreCompat = false;

@Config.Comment("Properly preserve health when logging in")
@Config.Name("Login Health Patch (FirstAid)")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(lateMixin = "mixins.rlmixins.late.firstaid.login.json", defaultValue = false)
@MixinConfig.CompatHandling(
modid = ModLoadedUtil.FirstAid_MOID,
desired = true,
reason = "Requires mod to properly function"
)
public boolean loginHealthPatch = false;
}
5 changes: 5 additions & 0 deletions src/main/java/rlmixins/config/PotionCoreConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,9 @@ public class PotionCoreConfig {
@Config.Name("Cure Applies On Attack")
@Config.RequiresMcRestart
public boolean cureAppliesOnAttack = false;

@Config.Comment("Makes health persist when using the Exit End Portal\nThere is a similar issue with ScalingHealth)")
@Config.Name("Persistent Health Fix")
@Config.RequiresMcRestart
public boolean persistentHealthFix = false;
}
13 changes: 13 additions & 0 deletions src/main/java/rlmixins/config/ScalingHealthConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,19 @@ public class ScalingHealthConfig {
)
public boolean enableAdditionalBlightPotionEffects = false;

@Config.Comment("Makes the player keep their health when using the Exit End portal instead of restoring it to" +
"full\nNote: this also prevents restoring the Max Health, \"Keep Attributes on End Exit\" should be used" +
"in conjunction with this to keep the Max Health as well")
@Config.Name("Keep Health on End Exit (ScalingHealth)")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(lateMixin = "mixins.rlmixins.late.scalinghealth.endexithealth.json", defaultValue = false)
@MixinConfig.CompatHandling(
modid = ModLoadedUtil.ScalingHealth_MODID,
desired = true,
reason = "Requires mod to properly function"
)
public boolean keepHealthOnEndExit = false;

@Config.Comment("The potion effects to apply on blights (Format: modid:potionname, amplifier)" + "\n" +
"Requires \"Additional Blight Potion Effects (ScalingHealth)\" enabled")
@Config.Name("Additional Blight Potion Effects List")
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/rlmixins/config/VanillaConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ public class VanillaConfig {
@MixinConfig.MixinToggle(earlyMixin = "mixins.rlmixins.early.vanilla.zombietrades.json", defaultValue = false)
public boolean zombieVillagersKeepTrades = false;

@Config.Comment("Fixes MC-6431: potion effects not carrying over when using the exit End Portal")
@Config.Name("Keep Potion Effects on End Exit")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(earlyMixin = "mixins.rlmixins.early.vanilla.endportaleffects.json", defaultValue = false)
public boolean keepEffectsOnEndExit = false;

@Config.Comment("Copies the player's attributes when using the Exit End Portal")
@Config.Name("Keep Attributes on End Exit")
@Config.RequiresMcRestart
@MixinConfig.MixinToggle(earlyMixin = "mixins.rlmixins.early.vanilla.endportalattributes.json", defaultValue = false)
public boolean keepAttributesOnEndExit = false;

@Config.Comment("Chance on curing zombie villagers to increase their prices and/or remove xp from some of their trades, per trade" + "\n" +
"Requires \"Cured Zombie Villagers Keep Trades (Vanilla)\" enabled")
@Config.Name("Curing Trauma Chance (Vanilla)")
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/rlmixins/handlers/ConfigHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public class ConfigHandler {

@Config.Name("EpicSiegeMod Config")
public static final EpicSiegeModConfig EPICSIEGEMOD_CONFIG = new EpicSiegeModConfig();

@Config.Name("FirstAid Config")
public static final FirstAidConfig FIRSTAID_CONFIG = new FirstAidConfig();

@Config.Name("InFRLCraft Config")
public static final InFRLCraftConfig INFRLCRAFT_CONFIG = new InFRLCraftConfig();
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/rlmixins/handlers/firstaid/EndExitHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package rlmixins.handlers.firstaid;

import ichttt.mods.firstaid.FirstAid;
import ichttt.mods.firstaid.api.CapabilityExtendedHealthSystem;
import ichttt.mods.firstaid.api.damagesystem.AbstractPlayerDamageModel;
import ichttt.mods.firstaid.common.network.MessageSyncDamageModel;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

import java.util.Objects;

/**
* Fix by XXMA16
*/
public class EndExitHandler {

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onPlayerClone(PlayerEvent.Clone event) {
if(event.isWasDeath()) {
return;
}
EntityPlayer player = event.getEntityPlayer();
if(!player.world.isRemote && player instanceof EntityPlayerMP) {
// damage model was already copied in the mixin, firing the event from there is too early
AbstractPlayerDamageModel cap = player.getCapability(CapabilityExtendedHealthSystem.INSTANCE, null);
FirstAid.NETWORKING.sendTo(new MessageSyncDamageModel(Objects.requireNonNull(cap), true), (EntityPlayerMP)player);
}
}
}
21 changes: 21 additions & 0 deletions src/main/java/rlmixins/handlers/potioncore/HealthFixHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package rlmixins.handlers.potioncore;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class HealthFixHandler {

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onPlayerClone(PlayerEvent.Clone event) {
if(event.isWasDeath()) {
return;
}
NBTTagCompound old = event.getOriginal().getEntityData();
if(old.hasKey("Potion Core - Health Fix")) {
float oldHealth = old.getFloat("Potion Core - Health Fix");
event.getEntityPlayer().getEntityData().setFloat("Potion Core - Health Fix", oldHealth);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package rlmixins.mixin.firstaid;

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import ichttt.mods.firstaid.api.damagesystem.AbstractDamageablePart;
import ichttt.mods.firstaid.api.damagesystem.AbstractPlayerDamageModel;
import ichttt.mods.firstaid.common.EventHandler;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import java.util.function.Consumer;

/**
* Fix by XXMA16
*/
@Mixin(EventHandler.class)
public abstract class EventHandler_EndExitMixin {
@WrapOperation(
method = "onPlayerRespawn",
at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/common/gameevent/PlayerEvent$PlayerRespawnEvent;isEndConquered()Z"),
remap = false
)
private static boolean rlmixins_firstAidModEventHandler_onPlayerRespawn(PlayerEvent.PlayerRespawnEvent instance, Operation<Boolean> original) {
return false;
}

@WrapWithCondition(
method = "onPlayerRespawn",
at = @At(value = "INVOKE", target = "Lichttt/mods/firstaid/api/damagesystem/AbstractPlayerDamageModel;forEach(Ljava/util/function/Consumer;)V"),
remap = false
)
private static boolean rlmixins_firstAidModEventHandler_onPlayerRespawn(AbstractPlayerDamageModel instance, Consumer<AbstractDamageablePart> consumer, PlayerEvent.PlayerRespawnEvent event) {
return !event.isEndConquered();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package rlmixins.mixin.firstaid;

import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import ichttt.mods.firstaid.api.damagesystem.AbstractDamageablePart;
import ichttt.mods.firstaid.common.damagesystem.PlayerDamageModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.HashMap;
import java.util.Map;

/**
* Fix by XXMA16
*/
@Mixin(PlayerDamageModel.class)
public abstract class PlayerDamageModel_JoinDamageMixin {

@Inject(
method = "runScaleLogic",
at = @At(
value = "INVOKE",
target = "Lichttt/mods/firstaid/common/damagesystem/PlayerDamageModel;iterator()Ljava/util/Iterator;",
ordinal = 0),
remap = false
)
private void rlmixins_firstAidModEventHandler_runScaleLogic_init(CallbackInfo ci, @Share("partsHp") LocalRef<Map<AbstractDamageablePart, Float>> hps) {
hps.set(new HashMap<>());
}

@Inject(method = "runScaleLogic",
at = @At(value = "INVOKE",
target = "Lichttt/mods/firstaid/api/damagesystem/AbstractDamageablePart;setMaxHealth(I)V",
ordinal = 0),
remap = false
)
private void rlmixins_firstAidModEventHandler_runScaleLogic_populate(CallbackInfo ci, @Local AbstractDamageablePart part, @Share("partsHp") LocalRef<Map<AbstractDamageablePart, Float>> hps) {
hps.get().put(part, part.currentHealth);
}

@Inject(method = "runScaleLogic",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/profiler/Profiler;endSection()V",
ordinal = 0, remap = true),
remap = false
)
private void rlmixins_firstAidModEventHandler_runScaleLogic_restore(CallbackInfo ci, @Share("partsHp") LocalRef<Map<AbstractDamageablePart, Float>> hps) {
hps.get().forEach((part, hp) -> part.currentHealth = Math.min(hp, part.getMaxHealth()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package rlmixins.mixin.firstaid.potioncore;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.tmtravlr.potioncore.PotionCoreEventHandler;
import ichttt.mods.firstaid.common.DataManagerWrapper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayerMP;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

/**
* Fix by XXMA16
*/
@Mixin(PotionCoreEventHandler.class)
public abstract class PotionCoreEventHandler_EndExitMixin {

@WrapOperation(
method = "updateEntityModifiers",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/entity/EntityLivingBase;setHealth(F)V",
ordinal = 0,
remap = true
),
remap = false
)
private static void rlmixins_firstAidModEventHandler_updateEntityModifiers(EntityLivingBase instance, float health, Operation<Void> original) {
if (!(instance instanceof EntityPlayerMP)) {
return;
}
DataManagerWrapper wrapper = (DataManagerWrapper) instance.getDataManager();
wrapper.toggleTracking(false);
original.call(instance, health);
wrapper.toggleTracking(true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package rlmixins.mixin.firstaid.vanilla;

import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.ai.attributes.AbstractAttributeMap;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(EntityLivingBase.class)
public interface EntityAttributeMapAccessor {

@Accessor("attributeMap")
void rlmixins$setAttributeMap(AbstractAttributeMap attributeMap);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package rlmixins.mixin.firstaid.vanilla;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.mojang.authlib.GameProfile;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import rlmixins.wrapper.FirstAidWrapper;

/**
* Fix by XXMA16
*/
@Mixin(value = EntityPlayerMP.class, priority = 6000)
public abstract class EntityPlayerMP_EndExitMixin extends EntityPlayer {

public EntityPlayerMP_EndExitMixin(World worldIn, GameProfile gameProfileIn) {
super(worldIn, gameProfileIn);
}

@WrapOperation(method = "copyFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayerMP;setHealth(F)V"))
private void rlmixins_firstAidEntityPlayerMP_copyFrom(EntityPlayerMP instance, float hp, Operation<Void> original, EntityPlayerMP that, boolean keepEverything) {
EntityDataManager dataManager = instance.getDataManager();
FirstAidWrapper.toggleTracking(dataManager, false);
original.call(instance, hp);
FirstAidWrapper.copyPlayerDamageModel(that, instance);
FirstAidWrapper.toggleTracking(dataManager, true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package rlmixins.mixin.scalinghealth;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import net.silentchaos512.scalinghealth.event.ScalingHealthCommonEvents;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

/**
* Fix by XXMA16
*/
@Mixin(ScalingHealthCommonEvents.class)
public abstract class CommonEvents_EndHealthMixin {
@ModifyExpressionValue(
method = "onPlayerRespawn",
at = @At(
value = "FIELD",
target = "Lnet/silentchaos512/scalinghealth/config/Config$Player$Health;allowModify:Z",
opcode = Opcodes.GETSTATIC
),
remap = false
)
private boolean rlmixins_scalingHealthCommonEvents_onPlayerRespawn(boolean original, PlayerEvent.PlayerRespawnEvent event) {
return original && !event.isEndConquered();
}
}
Loading