Skip to content

Commit

Permalink
compat with EpicFight
Browse files Browse the repository at this point in the history
  • Loading branch information
xTracr committed Apr 22, 2023
1 parent 7e22122 commit 45deacd
Show file tree
Hide file tree
Showing 11 changed files with 184 additions and 39 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ Download the mod from [Releases page](https://github.com/xTracr/RealCamera/relea
* Player Animation Lib
* First Person Model
* Pehkui
* Incompatible:
* Epic Fight
* Incompatible:
* Yes Steve Model(GeckoLib?)
* Cause crash:

Expand Down
2 changes: 1 addition & 1 deletion README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
* Player Animation Lib
* First Person Model
* Pehkui
* 不兼容:
* Epic Fight
* 不兼容:
* Yes Steve Model(GeckoLib?)
* 引起崩溃:

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ allprojects {
maven { url "https://maven.shedaniel.me/" }
maven { url "https://maven.terraformersmc.com/releases/" }
//maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" }
//maven { url "https://cursemaven.com" }
maven { url "https://cursemaven.com" }
//maven { url "https://jitpack.io" }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,19 +132,7 @@ private static void setBindingOffset(Camera camera, MinecraftClient MC, float ti

if (config.compatPehkui()) PehkuiCompat.scaleMatrices(matrixStack, player, tickDelta);

ClientCommand.virtualRenderException = null;
if (config.isUsingModModel()) {
try {
matrixStack.push();
VirtualRenderer.virtualRender(tickDelta, matrixStack);
} catch (Exception exception) {
ClientCommand.virtualRenderException = exception;
matrixStack.pop();
virtualRender(player, playerRenderer, tickDelta, matrixStack);
}
} else {
virtualRender(player, playerRenderer, tickDelta, matrixStack);
}
virtualRender(player, playerRenderer, tickDelta, matrixStack);

// ModelPart$Cuboid.renderCuboid
double cameraX = config.getScale() * config.getBindingX();
Expand Down Expand Up @@ -172,11 +160,25 @@ private static void setBindingOffset(Camera camera, MinecraftClient MC, float ti

}

private static void virtualRender(AbstractClientPlayerEntity player, PlayerEntityRenderer renderer, float tickDelta, MatrixStack matrixStack) {
private static void virtualRender(AbstractClientPlayerEntity player, PlayerEntityRenderer playerRenderer, float tickDelta, MatrixStack matrixStack) {

ClientCommand.virtualRenderException = null;
if (config.isUsingModModel()) {
try {
matrixStack.push();
if (!VirtualRenderer.virtualRender(tickDelta, matrixStack)) {
return;
}
} catch (Exception exception) {
ClientCommand.virtualRenderException = exception;
matrixStack.pop();
}
}

// PlayerEntityRenderer.render
((PlayerEntityRendererAccessor)renderer).invokeSetModelPose(player);
((PlayerEntityRendererAccessor)playerRenderer).invokeSetModelPose(player);
// LivingEntityRenderer.render
PlayerEntityModel<AbstractClientPlayerEntity> playerModel = renderer.getModel();
PlayerEntityModel<AbstractClientPlayerEntity> playerModel = playerRenderer.getModel();
float n;
Direction direction;
playerModel.handSwingProgress = player.getHandSwingProgress(tickDelta);
Expand Down Expand Up @@ -212,9 +214,9 @@ private static void virtualRender(AbstractClientPlayerEntity player, PlayerEntit
matrixStack.translate((float)(-direction.getOffsetX()) * n, 0.0f, (float)(-direction.getOffsetZ()) * n);
}
float l = player.age + tickDelta;
((PlayerEntityRendererAccessor)renderer).invokeSetupTransforms(player, matrixStack, l, h, tickDelta);
((PlayerEntityRendererAccessor)playerRenderer).invokeSetupTransforms(player, matrixStack, l, h, tickDelta);
matrixStack.scale(-1.0f, -1.0f, 1.0f);
((PlayerEntityRendererAccessor)renderer).invokeScale(player, matrixStack, tickDelta);
((PlayerEntityRendererAccessor)playerRenderer).invokeScale(player, matrixStack, tickDelta);
matrixStack.translate(0.0f, -1.501f, 0.0f);
n = 0.0f;
float o = 0.0f;
Expand Down Expand Up @@ -251,6 +253,6 @@ private static void virtualRender(AbstractClientPlayerEntity player, PlayerEntit
}
*/
// ModelPart.render
config.getVanillaModelPart().get(renderer.getModel()).rotate(matrixStack);
config.getVanillaModelPart().get(playerRenderer.getModel()).rotate(matrixStack);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.xtracr.realcamera.command;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jetbrains.annotations.Nullable;

import com.mojang.brigadier.CommandDispatcher;
Expand All @@ -19,16 +24,31 @@
public abstract class ClientCommand<S extends CommandSource> {

private static final ModConfig config = ConfigFile.modConfig;
private static final Map<FeedbackType, List<feedbackProvider>> addnlFeedbackProvider = new HashMap<>();

@Nullable
public static Exception virtualRenderException = null;

static {
for (FeedbackType type : FeedbackType.values()) {
addnlFeedbackProvider.put(type, new ArrayList<>());
}
}

public static void registerFeedback(FeedbackType type, feedbackProvider provider) {
try {
addnlFeedbackProvider.get(type).add(provider);
} catch (Exception exception) {

}
}

public void register(CommandDispatcher<S> dispatcher) {
final LiteralArgumentBuilder<S> builder = literal(RealCamera.MODID);
builder.then(literal("debug")
.then(literal("config").executes(this::config)
.then(literal("detail").executes(this::detail)))
.then(literal("camera").executes(this::camera)));
.then(literal(FeedbackType.config.name()).executes(this::config)
.then(literal(FeedbackType.detail.name()).executes(this::detail)))
.then(literal(FeedbackType.camera.name()).executes(this::camera)));

dispatcher.register(builder);
}
Expand All @@ -39,8 +59,13 @@ private int config(CommandContext<S> context) throws CommandSyntaxException {
.append("Mapped Model Part Name: [" + VirtualRenderer.getModelPartFieldName() + "]\n"));

if (virtualRenderException != null) {
this.sendFeedback(source, new LiteralText("Failed to get model part: " + virtualRenderException.getClass().getSimpleName() + "\n"));
this.sendFeedback(source, new LiteralText("Failed to bind camera: " + virtualRenderException.getClass().getSimpleName() + "\n"));
}

addnlFeedbackProvider.get(FeedbackType.config).forEach((provider) -> {
this.sendFeedback(source, new LiteralText(provider.provide()));
});

return 0;
}

Expand All @@ -64,15 +89,25 @@ private int detail(CommandContext<S> context) throws CommandSyntaxException {
interim = "";

if (virtualRenderException != null) {
this.sendFeedback(source, new LiteralText("Failed to get model part: " + virtualRenderException.getClass().getSimpleName() + "\n"));
this.sendFeedback(source, new LiteralText("Failed to bind camera: " + virtualRenderException.getClass().getSimpleName() + "\n"));
}

addnlFeedbackProvider.get(FeedbackType.detail).forEach((provider) -> {
this.sendFeedback(source, new LiteralText(provider.provide()));
});

return 0;
}

private int camera(CommandContext<S> context) throws CommandSyntaxException {
final S source = context.getSource();
this.sendFeedback(source, new LiteralText("Camera offset: " + CameraController.getCameraOffset().toString() + "\n")
.append("Camera rotation: " + CameraController.getCameraRotation().toString()));

addnlFeedbackProvider.get(FeedbackType.camera).forEach((provider) -> {
this.sendFeedback(source, new LiteralText(provider.provide()));
});

return 0;
}

Expand All @@ -82,4 +117,15 @@ private LiteralArgumentBuilder<S> literal(final String name) {
return LiteralArgumentBuilder.literal(name);
}

public enum FeedbackType {
config,
detail,
camera;
}

@FunctionalInterface
public interface feedbackProvider{
String provide();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,10 @@ public static void register() {
/**
*
* This method's code should include as much as possible all parts related to {@code matrixStack} in the code that renders the player model,
* to ensure that the result of {@code matrixStack} after processing is identical to the actual rendering
* to ensure that the result of {@code matrixStack} after processing is identical to the actual rendering.
* @param tickDelta or particalTick(s) (official mapping)
* @param matrixStack or poseStack (official mapping)
* @return {@code boolean} skip rendering if true
* @see net.minecraft.client.render.entity.EntityRenderDispatcher#render
* @see net.minecraft.client.render.entity.PlayerEntityRenderer#render
* @see net.minecraft.client.render.entity.LivingEntityRenderer#render
Expand All @@ -143,7 +144,7 @@ public static void register() {
*
*/
@SuppressWarnings("resource")
public static void virtualRender(float tickDelta, MatrixStack matrixStack)
public static boolean virtualRender(float tickDelta, MatrixStack matrixStack)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
PlayerEntityRenderer renderer = (PlayerEntityRenderer)MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(player);
Expand Down Expand Up @@ -226,6 +227,7 @@ public static void virtualRender(float tickDelta, MatrixStack matrixStack)
*/
// ModelPart.render
((ModelPart)getModelPartMethod.invoke(null, playerModel)).rotate(matrixStack);
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,19 @@

import net.minecraft.client.util.math.MatrixStack;

/**
*
* This method's code should include as much as possible all parts related to {@code matrixStack} in the code that renders the player model,
* to ensure that the result of {@code matrixStack} after processing is identical to the actual rendering.
* <p>{@link com.xtracr.realcamera.compat.CompatExample#virtualRender See example here}
*
* @param tickDelta or particalTick(s) (official mapping)
* @param matrixStack or poseStack (official mapping)
* @return {@code boolean} skip rendering if true
* @throws Exception
*
*/
@FunctionalInterface
public interface VirtualRenderFunction {
void virtualRender(float tickDelta, MatrixStack matrixStack) throws Exception;
boolean virtualRender(float tickDelta, MatrixStack matrixStack) throws Exception;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class VirtualRenderer {
/**
*
* @param modid
* @param function a {@link VirtualRenderFunction}
* @param function a {@link VirtualRenderFunction} return a boolean
* @param nameMap a mapping from the {@link com.xtracr.realcamera.config.ModConfig.Compats#modModelPart name} of {@code ModelPart}
* to the name of the {@link java.lang.reflect.Field field} of {@code ModelPart} in the code.
* {@link com.xtracr.realcamera.compat.CompatExample#nameMap See example}
Expand All @@ -40,21 +40,25 @@ public static void register(final String modid, final VirtualRenderFunction func

/**
*
* @param rendererClass containing a {@link String} {@code modid}, a {@link Method void Method} {@code virtualRender}
* @param rendererClass containing a {@link String} {@code modid}, a {@link Method boolean Method} {@code virtualRender}
* and a {@link Map} {@code nameMap} from String to String.These should all be {@code static}.
* {@link com.xtracr.realcamera.compat.CompatExample See example}
*
*/
@SuppressWarnings("unchecked")
public static void register(final Class<?> rendererClass) {
register((String)getFieldValue(rendererClass, "modid", null), rendererClass, "virtualRender",
(Map<String, String>)getFieldValue(rendererClass, "nameMap", null));
try {
register((String)getFieldValue(rendererClass, "modid", null), rendererClass, "virtualRender",
(Map<String, String>)getFieldValue(rendererClass, "nameMap", null));
} catch (Exception exception) {
register((String)getFieldValue(rendererClass, "modid", null), rendererClass, "virtualRender", null);
}
}

/**
*
* @param modid
* @param rendererClass containing a {@link Method void Method} {@code methodName}.
* @param rendererClass containing a {@link Method boolean Method} {@code methodName}.
* {@link com.xtracr.realcamera.compat.CompatExample See example}
* @param methodName {@code virtualRender} default
* @param nameMap a mapping from the {@link com.xtracr.realcamera.config.ModConfig.Compats#modModelPart name} of {@code ModelPart}
Expand Down Expand Up @@ -102,11 +106,11 @@ public static Object getModelPart(final Object model) {
return getFieldValue(model.getClass(), getModelPartFieldName(), model);
}

public static void virtualRender(float tickDelta, MatrixStack matrixStack) throws Exception {
public static boolean virtualRender(float tickDelta, MatrixStack matrixStack) throws Exception {
if (functionProvider.containsKey(config.getModelModID())) {
functionProvider.get(config.getModelModID()).virtualRender(tickDelta, matrixStack);
return functionProvider.get(config.getModelModID()).virtualRender(tickDelta, matrixStack);
} else {
methodProvider.get(config.getModelModID()).get().invoke(null, tickDelta, matrixStack);
return (boolean)methodProvider.get(config.getModelModID()).get().invoke(null, tickDelta, matrixStack);
}
}

Expand Down
4 changes: 3 additions & 1 deletion forge/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ dependencies {
// Cloth Config
//modImplementation "me.shedaniel.cloth:cloth-config-forge:${rootProject.cloth_config_version}"

// GeckoLib
//modImplementation "software.bernie.geckolib:geckolib-forge-1.18:3.0.57"
// Epic Fight
//modImplementation "curse.maven:epicfightmod-405076:4018756"
modImplementation "curse.maven:epicfightmod-405076:4018756"

common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.xtracr.realcamera;

import com.xtracr.realcamera.compat.EpicFightCompat;
import com.xtracr.realcamera.config.ConfigScreen;

import net.minecraftforge.client.ClientRegistry;
Expand Down Expand Up @@ -31,6 +32,7 @@ public RealCameraForge() {
public void clientSetup(FMLClientSetupEvent event) {

RealCamera.setup();
if (ModList.get().isLoaded("epicfight")) EpicFightCompat.register();

MinecraftForge.EVENT_BUS.addListener(EventHandler::onKeyInput);
MinecraftForge.EVENT_BUS.addListener(EventHandler::onCameraSetup);
Expand Down
Loading

0 comments on commit 45deacd

Please sign in to comment.