Skip to content

Commit

Permalink
Started to implement an animation predicate system, added player mode…
Browse files Browse the repository at this point in the history
…l and animation files
  • Loading branch information
Goodbird committed Dec 31, 2024
1 parent 39cbc74 commit 22e4725
Show file tree
Hide file tree
Showing 20 changed files with 3,840 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.goodbird.playeranimlib.CommonProxy;
import com.goodbird.playeranimlib.client.handler.ClientEventHandler;
import com.goodbird.playeranimlib.client.control.PredicateRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.common.MinecraftForge;

public class ClientProxy extends CommonProxy {
Expand All @@ -14,4 +16,10 @@ public void init(FMLInitializationEvent event) {
MinecraftForge.EVENT_BUS.register(new ClientEventHandler());
FMLCommonHandler.instance().bus().register(new ClientEventHandler());
}

@Override
public void postInit(FMLPostInitializationEvent event) {
super.postInit(event);
PredicateRegistry.init();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.goodbird.playeranimlib.client.control;

import com.goodbird.playeranimlib.client.control.event.PredicateModifyEvent;
import com.goodbird.playeranimlib.client.control.predicate.IPlayerAnimationPredicate;
import com.goodbird.playeranimlib.client.control.event.PredicateRegisterEvent;
import com.goodbird.playeranimlib.client.control.predicate.builtin.DefaultPredicate;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.MinecraftForge;

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

public class PredicateRegistry {
private static final Map<ResourceLocation, IPlayerAnimationPredicate> registry = new HashMap<>();

public static void register(ResourceLocation resourceLocation, IPlayerAnimationPredicate predicate){
registry.put(resourceLocation, predicate);
}

public static IPlayerAnimationPredicate getPredicate(ResourceLocation resourceLocation){
return registry.computeIfAbsent(resourceLocation, (resLoc)->registry.get(new ResourceLocation("playeranimlib", "default")));
}

public static void init(){
register(new ResourceLocation("playeranimlib", "default"), new DefaultPredicate());
MinecraftForge.EVENT_BUS.post(new PredicateRegisterEvent());
MinecraftForge.EVENT_BUS.post(new PredicateModifyEvent());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.goodbird.playeranimlib.client.control.event;

import net.minecraft.entity.player.EntityPlayer;
import software.bernie.geckolib3.core.controller.AnimationController;

public class PlayerAnimationEvent {
private final EntityPlayer animatable;
public double animationTick;
private final float limbSwing;
private final float limbSwingAmount;
private final float partialTick;
protected AnimationController controller;

public PlayerAnimationEvent(EntityPlayer animatable, float limbSwing, float limbSwingAmount, float partialTick) {
this.animatable = animatable;
this.limbSwing = limbSwing;
this.limbSwingAmount = limbSwingAmount;
this.partialTick = partialTick;
}

public double getAnimationTick() {
return this.animationTick;
}

public EntityPlayer getAnimatable() {
return this.animatable;
}

public float getLimbSwing() {
return this.limbSwing;
}

public float getLimbSwingAmount() {
return this.limbSwingAmount;
}

public float getPartialTick() {
return this.partialTick;
}

public AnimationController getController() {
return this.controller;
}

public void setController(AnimationController controller) {
this.controller = controller;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.goodbird.playeranimlib.client.control.event;

import cpw.mods.fml.common.eventhandler.Event;

public class PredicateModifyEvent extends Event {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.goodbird.playeranimlib.client.control.event;

import cpw.mods.fml.common.eventhandler.Event;

public class PredicateRegisterEvent extends Event {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.goodbird.playeranimlib.client.control.predicate;

import com.goodbird.playeranimlib.client.control.event.PlayerAnimationEvent;
import com.goodbird.playeranimlib.mixin.IEntityPlayer;
import software.bernie.geckolib3.core.AnimationState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;

public class BuilderControlledPredicate implements IPlayerAnimationPredicate {

private String name;

public BuilderControlledPredicate(String name){
this.name = name;
}

@Override
public AnimationBuilder getAnimation(PlayerAnimationEvent animationEvent) {
AnimationBuilder builder = ((IEntityPlayer)animationEvent.getAnimatable()).getBuilderByName(name);
if(builder==null) return null;
if(animationEvent.getController().currentAnimationBuilder==builder && animationEvent.getController().getAnimationState() == AnimationState.Stopped){
((IEntityPlayer)animationEvent.getAnimatable()).setBuilderByName(name, null);
return null;
}
return builder;
}

public String getName() {
return name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.goodbird.playeranimlib.client.control.predicate;

import com.goodbird.playeranimlib.client.control.event.PlayerAnimationEvent;
import net.minecraft.entity.player.EntityPlayer;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;

public interface IPlayerAnimationPredicate extends AnimationController.IAnimationPredicate {

default PlayState test(AnimationEvent animationEvent){
PlayerAnimationEvent event = new PlayerAnimationEvent(
(EntityPlayer) animationEvent.getAnimatable(),
animationEvent.getLimbSwing(),
animationEvent.getLimbSwingAmount(),
animationEvent.getPartialTick()
);

animationEvent.getController().setAnimation(getAnimation(event));
return PlayState.CONTINUE;
}

AnimationBuilder getAnimation(PlayerAnimationEvent animationEvent);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.goodbird.playeranimlib.client.control.predicate;

import com.goodbird.playeranimlib.client.control.event.PlayerAnimationEvent;
import com.google.common.collect.Lists;
import software.bernie.geckolib3.core.builder.AnimationBuilder;

import java.util.ArrayList;

public class LayeredPredicate implements IPlayerAnimationPredicate{
private final ArrayList<IPlayerAnimationPredicate> layers = new ArrayList<>();
private String name = "";
private AnimationBuilder defaultAnim;

public LayeredPredicate(String name){
this.name = name;
}

@Override
public AnimationBuilder getAnimation(PlayerAnimationEvent animationEvent) {
for(IPlayerAnimationPredicate predicate : Lists.reverse(layers)){
AnimationBuilder anim = predicate.getAnimation(animationEvent);
if(anim!=null){
return anim;
}
}
return defaultAnim;
}

public LayeredPredicate addLayer(IPlayerAnimationPredicate predicate){
layers.add(predicate);
return this;
}

public ArrayList<IPlayerAnimationPredicate> getLayers(){
return layers;
}

public String getName(){
return name;
}

public AnimationBuilder getDefaultAnim() {
return defaultAnim;
}

public void setDefaultAnim(AnimationBuilder defaultAnim) {
this.defaultAnim = defaultAnim;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.goodbird.playeranimlib.client.control.predicate.builtin;

import com.goodbird.playeranimlib.client.control.predicate.BuilderControlledPredicate;
import com.goodbird.playeranimlib.client.control.predicate.LayeredPredicate;
import com.goodbird.playeranimlib.client.control.predicate.builtin.parts.IdlePosePredicate;
import com.goodbird.playeranimlib.client.control.predicate.builtin.parts.WalkPredicate;
import software.bernie.geckolib3.core.builder.AnimationBuilder;

public class DefaultPredicate extends LayeredPredicate {
public DefaultPredicate() {
super("default");
setDefaultAnim(new AnimationBuilder().loop("idle"));
addLayer(new LayeredPredicate("idle_random").addLayer(new BuilderControlledPredicate("item_random")));
addLayer(new IdlePosePredicate());
addLayer(new WalkPredicate());
addLayer(new LayeredPredicate("item_use").addLayer(new BuilderControlledPredicate("item_use")));
addLayer(new LayeredPredicate("manual").addLayer(new BuilderControlledPredicate("manual")));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.goodbird.playeranimlib.client.control.predicate.builtin.parts;

import com.goodbird.playeranimlib.client.control.event.PlayerAnimationEvent;
import com.goodbird.playeranimlib.client.control.predicate.LayeredPredicate;
import net.minecraft.item.ItemBlock;
import software.bernie.geckolib3.core.builder.AnimationBuilder;

public class IdlePosePredicate extends LayeredPredicate {
public IdlePosePredicate() {
super("idle_pose");
addLayer(this::holdBlockAnimation);
addLayer(this::swimAnimation);
addLayer(this::sleepAnimation);
}

public AnimationBuilder holdBlockAnimation(PlayerAnimationEvent animationEvent) {
if(animationEvent.getAnimatable().getHeldItem()!=null && animationEvent.getAnimatable().getHeldItem().getItem() instanceof ItemBlock){
return new AnimationBuilder().loop("hold_block");
}
return null;
}

public AnimationBuilder swimAnimation(PlayerAnimationEvent animationEvent) {
if(animationEvent.getAnimatable().isInWater()){
return new AnimationBuilder().loop("idle_swim");
}
return null;
}

public AnimationBuilder sleepAnimation(PlayerAnimationEvent animationEvent) {
if(animationEvent.getAnimatable().isPlayerSleeping()){
return new AnimationBuilder().loop("sleep");
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.goodbird.playeranimlib.client.control.predicate.builtin.parts;

import com.goodbird.playeranimlib.client.control.event.PlayerAnimationEvent;
import com.goodbird.playeranimlib.client.control.predicate.LayeredPredicate;
import software.bernie.geckolib3.core.builder.AnimationBuilder;

public class WalkPredicate extends LayeredPredicate {
public WalkPredicate() {
super("walk");
addLayer(this::defaultWalkAnimation);
}

public AnimationBuilder defaultWalkAnimation(PlayerAnimationEvent animationEvent) {
if(Math.abs(animationEvent.getLimbSwingAmount())>0.15){
return new AnimationBuilder().loop("walk");
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.util.Vec3;
import net.minecraftforge.client.event.RenderHandEvent;

public class ClientEventHandler {
Expand All @@ -12,7 +13,9 @@ public void onRenderHand(RenderHandEvent event){
if(Minecraft.getMinecraft().gameSettings.thirdPersonView==0) {
event.setCanceled(true);
Entity player = (Entity) Minecraft.getMinecraft().thePlayer;
GeoFirstPersonRender.INSTANCE.doRender(player, 0, -1.75, 0, event.partialTicks, event.renderPass);
double scale = 0.25;
float angleRad = (float) (player.rotationYaw/180f*Math.PI);
GeoFirstPersonRender.INSTANCE.doRender(player, Math.sin(angleRad)*scale, -1.75, -Math.cos(angleRad)*scale, event.partialTicks, event.renderPass);
}
}
}
Loading

0 comments on commit 22e4725

Please sign in to comment.