Skip to content

Commit 8e574fc

Browse files
committed
stop first person werewolf rendering when player animator renders a first person animation
- do not add playeranimator as dependency - close #218
1 parent 6154c0f commit 8e574fc

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

src/main/java/de/teamlapen/werewolves/client/core/ClientEventHandler.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.teamlapen.werewolves.config.WerewolvesConfig;
1313
import de.teamlapen.werewolves.core.ModActions;
1414
import de.teamlapen.werewolves.entities.player.werewolf.WerewolfPlayer;
15+
import de.teamlapen.werewolves.modcompat.playeranimator.PlayerAnimatorCompat;
1516
import de.teamlapen.werewolves.util.FormHelper;
1617
import de.teamlapen.werewolves.util.Helper;
1718
import de.teamlapen.werewolves.util.REFERENCE;
@@ -93,7 +94,7 @@ public void onAddLayer(EntityRenderersEvent.AddLayers event) {
9394

9495
@SubscribeEvent
9596
public void onPlayerRender(RenderPlayerEvent.Pre event) {
96-
if (Helper.isWerewolf(event.getEntity())) {
97+
if (Helper.isWerewolf(event.getEntity()) && !PlayerAnimatorCompat.checkAnimation(event.getEntity())) {
9798
if (ClientRegistryHandler.getModPlayerRenderer().renderPlayer((AbstractClientPlayer) event.getEntity(), 1, event.getPartialTick(), event.getPoseStack(), event.getMultiBufferSource(), event.getPackedLight())) {
9899
event.setCanceled(true);
99100
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package de.teamlapen.werewolves.modcompat.playeranimator;
2+
3+
import net.minecraft.client.Minecraft;
4+
import net.minecraft.world.entity.player.Player;
5+
import net.minecraftforge.fml.ModList;
6+
7+
import java.lang.reflect.InvocationTargetException;
8+
import java.lang.reflect.Method;
9+
10+
public class PlayerAnimatorCompat {
11+
12+
private static boolean modChecked = false;
13+
private static boolean skipCheck;
14+
15+
public static boolean checkAnimation(Player player) {
16+
if (!checkMod()) {
17+
return false;
18+
}
19+
if (Minecraft.getInstance().player != player) return false;
20+
return checkFirstPersonAnimation(player);
21+
}
22+
23+
private static boolean checkMod() {
24+
if (!modChecked) {
25+
skipCheck = !ModList.get().isLoaded("playeranimator");
26+
modChecked = false;
27+
}
28+
return !skipCheck;
29+
}
30+
31+
private static boolean checkFirstPersonAnimation(Player player) {
32+
try {
33+
if (!isFirstPersonPass()) return false;
34+
return isAnimationActive(player);
35+
} catch (Exception e) {
36+
return false;
37+
}
38+
}
39+
40+
private static Method isFirstPersonPassMethod;
41+
42+
private static boolean isFirstPersonPass() throws ReflectiveOperationException {
43+
if (isFirstPersonPassMethod == null) {
44+
isFirstPersonPassMethod = Class.forName("dev.kosmx.playerAnim.api.firstPerson.FirstPersonMode").getMethod("isFirstPersonPass");
45+
}
46+
47+
Object isFirstPersonPass = isFirstPersonPassMethod.invoke(null);
48+
return isFirstPersonPass != null && (boolean) isFirstPersonPass;
49+
}
50+
51+
private static Class<?> iAnimatedPlayerClass;
52+
private static Method getAnimationApplierMethod;
53+
54+
private static boolean isAnimationActive(Player player) throws ReflectiveOperationException {
55+
if (iAnimatedPlayerClass == null || getAnimationApplierMethod == null) {
56+
iAnimatedPlayerClass = Class.forName("dev.kosmx.playerAnim.impl.IAnimatedPlayer");
57+
getAnimationApplierMethod = iAnimatedPlayerClass.getMethod("playerAnimator_getAnimation");
58+
}
59+
if (!iAnimatedPlayerClass.isInstance(player)) return false;
60+
Object animationApplier = getAnimationApplierMethod.invoke(player);
61+
return (boolean) animationApplier.getClass().getMethod("isActive").invoke(animationApplier);
62+
}
63+
64+
}

0 commit comments

Comments
 (0)