Skip to content

Commit

Permalink
Fix TiC battle sign not working in offhand (#55)
Browse files Browse the repository at this point in the history
  • Loading branch information
Lyfts authored Jan 22, 2025
1 parent 158f2f4 commit 8fc5639
Show file tree
Hide file tree
Showing 12 changed files with 164 additions and 137 deletions.
23 changes: 0 additions & 23 deletions src/main/java/xonin/backhand/BackhandLateMixins.java

This file was deleted.

11 changes: 11 additions & 0 deletions src/main/java/xonin/backhand/api/core/BackhandUtils.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package xonin.backhand.api.core;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BooleanSupplier;

import javax.annotation.Nullable;
Expand All @@ -15,6 +17,8 @@
@ParametersAreNonnullByDefault
public final class BackhandUtils {

public static final List<Class<?>> offhandPriorityItems = new ArrayList<>();

public static void swapOffhandItem(EntityPlayer player) {
ItemStack mainHand = player.getCurrentEquippedItem();
player.setCurrentItemOrArmor(0, BackhandUtils.getOffhandItem(player));
Expand Down Expand Up @@ -62,4 +66,11 @@ public static boolean isUsingOffhand(EntityPlayer player) {
public static int getOffhandSlot(EntityPlayer player) {
return ((IOffhandInventory) player.inventory).backhand$getOffhandSlot();
}

/**
* Adds an item that when held in the main hand will execute the offhand item action before the main hand action
*/
public static void addOffhandPriorityItem(Class<?> itemClass) {
offhandPriorityItems.add(itemClass);
}
}
12 changes: 1 addition & 11 deletions src/main/java/xonin/backhand/client/ClientProxy.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package xonin.backhand.client;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.settings.KeyBinding;

import org.lwjgl.input.Keyboard;

import cpw.mods.fml.client.registry.ClientRegistry;
import tconstruct.library.tools.HarvestTool;
import xonin.backhand.CommonProxy;
import xonin.backhand.utils.Mods;

public class ClientProxy extends CommonProxy {

Expand All @@ -19,14 +14,9 @@ public class ClientProxy extends CommonProxy {
Keyboard.KEY_F,
"key.categories.gameplay");

public static final List<Class<?>> offhandPriorityItems = new ArrayList<>();

@Override
public void load() {
super.load();
ClientRegistry.registerKeyBinding(swapOffhand);

if (Mods.TINKERS_CONSTRUCT.isLoaded()) {
offhandPriorityItems.add(HarvestTool.class);
}
}
}
36 changes: 36 additions & 0 deletions src/main/java/xonin/backhand/compat/EFRCompat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package xonin.backhand.compat;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.event.entity.living.LivingHurtEvent;

import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber;

import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import ganymedes01.etfuturum.ModItems;
import ganymedes01.etfuturum.core.handlers.ServerEventHandler;
import xonin.backhand.api.core.BackhandUtils;
import xonin.backhand.utils.Mods;

@SuppressWarnings("unused")
@EventBusSubscriber
public class EFRCompat {

@EventBusSubscriber.Condition
public static boolean register() {
return Mods.ET_FUTURUM.isLoaded();
}

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onEntityHurt(LivingHurtEvent event) {
if (!(event.entityLiving instanceof EntityPlayer player)) return;
ItemStack offhand = BackhandUtils.getOffhandItem(player);
if (offhand == null) return;
Item totem = ModItems.TOTEM_OF_UNDYING.get();
if (totem.equals(offhand.getItem())) {
BackhandUtils.useOffhandItem(player, () -> ServerEventHandler.INSTANCE.handleTotemCheck(player, event));
}
}
}
103 changes: 103 additions & 0 deletions src/main/java/xonin/backhand/compat/TConstructCompat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package xonin.backhand.compat;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;

import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber;

import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import tconstruct.library.tools.HarvestTool;
import tconstruct.library.weaponry.IWindup;
import tconstruct.tools.TinkerToolEvents;
import tconstruct.tools.TinkerTools;
import tconstruct.weaponry.client.CrosshairHandler;
import tconstruct.world.TinkerWorldEvents;
import xonin.backhand.api.core.BackhandUtils;
import xonin.backhand.utils.Mods;

@SuppressWarnings("unused")
@EventBusSubscriber
public class TConstructCompat {

private static CrosshairHandler crosshairHandler;
private static MethodHandle onHurt, onAttack;

@EventBusSubscriber.Condition
public static boolean register() {
if (Mods.TINKERS_CONSTRUCT.isLoaded()) {
try {
// Gotta hide those NEW instructions from the JVM
crosshairHandler = CrosshairHandler.class.getConstructor()
.newInstance();
// These need to be MethodHandles since the compiler complains about Mobs-Info not being present
// otherwise
onHurt = MethodHandles.publicLookup()
.findVirtual(
TinkerWorldEvents.class,
"onHurt",
MethodType.methodType(void.class, LivingHurtEvent.class))
.bindTo(
TinkerWorldEvents.class.getConstructor()
.newInstance());
onAttack = MethodHandles.publicLookup()
.findVirtual(
TinkerToolEvents.class,
"onAttack",
MethodType.methodType(void.class, LivingAttackEvent.class))
.bindTo(
TinkerToolEvents.class.getConstructor()
.newInstance());
} catch (Exception ignored) {}
BackhandUtils.addOffhandPriorityItem(HarvestTool.class);
return true;
}
return false;
}

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onEntityHurt(LivingHurtEvent event) {
if (!(event.entityLiving instanceof EntityPlayer player) || event.ammount == 0) return;
ItemStack offhandItem = BackhandUtils.getOffhandItem(player);
if (offhandItem == null) return;
if (offhandItem.getItem() == TinkerTools.cutlass || offhandItem.getItem() == TinkerTools.battlesign) {
BackhandUtils.useOffhandItem(player, () -> {
try {
onHurt.invokeWithArguments(event);
} catch (Throwable ignored) {}
});
}
}

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onAttack(LivingAttackEvent event) {
if (!(event.entityLiving instanceof EntityPlayer player)) return;
ItemStack offhand = BackhandUtils.getOffhandItem(player);
if (offhand == null) return;
if (offhand.getItem() == TinkerTools.battlesign) {
BackhandUtils.useOffhandItem(player, () -> {
try {
onAttack.invokeWithArguments(event);
} catch (Throwable ignored) {}
});
}
}

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onRenderOverlay(RenderGameOverlayEvent.Pre event) {
if (event.type != RenderGameOverlayEvent.ElementType.CROSSHAIRS) return;
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
ItemStack offhand = BackhandUtils.getOffhandItem(player);
if (offhand != null && offhand.getItem() instanceof IWindup) {
BackhandUtils.useOffhandItem(player, () -> crosshairHandler.onRenderOverlay(event));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,18 @@
import java.util.Map;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.gtnewhorizon.gtnhmixins.IEarlyMixinLoader;

import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import xonin.backhand.mixins.Mixins;

public final class BackhandLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader {

public static final Logger LOGGER = LogManager.getLogger(BackhandLoadingPlugin.class);

@Override
public String[] getASMTransformerClass() {
return null;
Expand Down
18 changes: 4 additions & 14 deletions src/main/java/xonin/backhand/mixins/Mixins.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.stream.Collectors;

import cpw.mods.fml.relauncher.FMLLaunchHandler;
import xonin.backhand.Backhand;
import xonin.backhand.coremod.BackhandLoadingPlugin;

public enum Mixins {

Expand Down Expand Up @@ -39,17 +39,7 @@ public enum Mixins {
"minecraft.MixinGuiContainerCreative")
.setPhase(Phase.EARLY)
.setSide(Side.CLIENT)
.addTargetedMod(TargetedMod.VANILLA)),
ET_FUTURUM_TOTEM_SUPPORT(
new Builder("Et Futurum Totem Support").addMixinClasses("etfuturum.MixinServerEventHandler")
.setPhase(Phase.LATE)
.setSide(Side.BOTH)
.addTargetedMod(TargetedMod.ET_FUTURUM)),
TINKERS_CROSSHAIR_FIX(new Builder("Fix crosshair not rendering for offhand weapon")
.addMixinClasses("tconstruct.MixinCrosshairHandler")
.setPhase(Phase.LATE)
.setSide(Side.CLIENT)
.addTargetedMod(TargetedMod.TINKERS_CONSTRUCT)),;
.addTargetedMod(TargetedMod.VANILLA)),;

private final List<String> mixinClasses;
private final Supplier<Boolean> applyIf;
Expand Down Expand Up @@ -86,7 +76,7 @@ public static List<String> getEarlyMixins(Set<String> loadedCoreMods) {
}
}
}
Backhand.LOGGER.info("Not loading the following EARLY mixins: {}", notLoading);
BackhandLoadingPlugin.LOGGER.info("Not loading the following EARLY mixins: {}", notLoading);
return mixins;
}

Expand All @@ -102,7 +92,7 @@ public static List<String> getLateMixins(Set<String> loadedMods) {
}
}
}
Backhand.LOGGER.info("Not loading the following LATE mixins: {}", notLoading.toString());
BackhandLoadingPlugin.LOGGER.info("Not loading the following LATE mixins: {}", notLoading.toString());
return mixins;
}

Expand Down
4 changes: 1 addition & 3 deletions src/main/java/xonin/backhand/mixins/TargetedMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

public enum TargetedMod {

VANILLA("Minecraft", null),
ET_FUTURUM("Et Futurum Requiem", "ganymedes01.etfuturum.mixinplugin.EtFuturumEarlyMixins", "etfuturum"),
TINKERS_CONSTRUCT("Tinkers' Construct", null, "TConstruct");
VANILLA("Minecraft", null);

/** The "name" in the @Mod annotation */
public final String modName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;

import xonin.backhand.api.core.BackhandUtils;
import xonin.backhand.client.ClientProxy;
import xonin.backhand.client.utils.BackhandRenderHelper;
import xonin.backhand.utils.BackhandConfig;

Expand Down Expand Up @@ -267,7 +266,7 @@ public void func_147121_ag() {
private boolean backhand$doesOffhandNeedPriority(ItemStack mainHandItem) {
if (mainHandItem == null) return false;

for (Class<?> clazz : ClientProxy.offhandPriorityItems) {
for (Class<?> clazz : BackhandUtils.offhandPriorityItems) {
if (clazz.isAssignableFrom(
mainHandItem.getItem()
.getClass())) {
Expand Down

This file was deleted.

Loading

0 comments on commit 8fc5639

Please sign in to comment.