Files
MinecraftForge/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java
T

437 lines
17 KiB
Java
Raw Normal View History

package net.minecraftforge.debug;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.IBlockState;
2016-03-05 04:43:41 +03:00
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
2016-01-01 18:15:48 +03:00
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.creativetab.CreativeTabs;
2016-01-01 18:15:48 +03:00
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
2016-01-01 18:15:48 +03:00
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
2016-03-05 04:43:41 +03:00
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
2016-03-05 04:43:41 +03:00
import net.minecraft.util.EnumHand;
2016-01-01 18:15:48 +03:00
import net.minecraft.util.ResourceLocation;
2016-03-05 04:43:41 +03:00
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.client.model.animation.Animation;
import net.minecraftforge.client.model.animation.AnimationTESR;
import net.minecraftforge.client.model.b3d.B3DLoader;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.client.model.pipeline.VertexLighterSmoothAo;
import net.minecraftforge.common.animation.Event;
import net.minecraftforge.common.animation.ITimeValue;
import net.minecraftforge.common.animation.TimeValues.VariableValue;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.model.animation.CapabilityAnimation;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.common.model.animation.IAnimationStateMachine;
import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.common.property.Properties;
import net.minecraftforge.fml.client.registry.ClientRegistry;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
2016-01-01 18:15:48 +03:00
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@Mod(modid = ModelAnimationDebug.MODID, name = "ForgeDebugModelAnimation", version = ModelAnimationDebug.VERSION, acceptableRemoteVersions = "*")
public class ModelAnimationDebug
{
public static final String MODID = "forgedebugmodelanimation";
public static final String VERSION = "0.0";
public static String blockName = "test_animation_block";
public static ResourceLocation blockId = new ResourceLocation(MODID, blockName);
public static final PropertyDirection FACING = PropertyDirection.create("facing");
2016-01-01 18:15:48 +03:00
@Instance(MODID)
public static ModelAnimationDebug instance;
@SidedProxy
public static CommonProxy proxy;
private static Logger logger;
2016-01-01 18:15:48 +03:00
public static abstract class CommonProxy
{
public void preInit(FMLPreInitializationEvent event)
{
2016-05-18 05:11:56 -07:00
GameRegistry.register(new Block(Material.WOOD)
{
{
2016-05-18 05:11:56 -07:00
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
setUnlocalizedName(MODID + "." + blockName);
setRegistryName(blockId);
}
@Override
public ExtendedBlockState createBlockState()
{
return new ExtendedBlockState(this, new IProperty[]{FACING, Properties.StaticProperty}, new IUnlistedProperty[]{Properties.AnimationProperty});
}
@Override
public boolean isOpaqueCube(IBlockState state)
{
return false;
}
@Override
public boolean isFullCube(IBlockState state)
{
return false;
}
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
{
return this.getDefaultState().withProperty(FACING, EnumFacing.getDirectionFromEntityLiving(pos, placer));
}
@Override
public IBlockState getStateFromMeta(int meta)
{
return getDefaultState().withProperty(FACING, EnumFacing.getFront(meta));
}
@Override
public int getMetaFromState(IBlockState state)
{
return state.getValue(FACING).getIndex();
}
@Override
public boolean hasTileEntity(IBlockState state)
{
return true;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state)
{
2016-01-01 18:15:48 +03:00
return new Chest();
}
@Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos)
{
2016-01-01 18:15:48 +03:00
return state.withProperty(Properties.StaticProperty, true);
}
/*@Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) {
TileEntity te = world.getTileEntity(pos);
if(te instanceof Chest && state instanceof IExtendedBlockState)
{
return ((Chest)te).getState((IExtendedBlockState)state);
}
return super.getExtendedState(state, world, pos);
}*/
@Override
2016-11-13 17:09:54 -05:00
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ)
{
if (world.isRemote)
{
TileEntity te = world.getTileEntity(pos);
if (te instanceof Chest)
{
((Chest) te).click(player.isSneaking());
}
}
2016-01-01 18:15:48 +03:00
return true;
}
});
2016-05-18 05:11:56 -07:00
GameRegistry.register(new ItemBlock(Block.REGISTRY.getObject(blockId))
{
@Override
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable NBTTagCompound nbt)
{
return new ItemAnimationHolder();
}
}.setRegistryName(blockId));
2016-01-01 18:15:48 +03:00
GameRegistry.registerTileEntity(Chest.class, MODID + ":" + "tile_" + blockName);
}
@Nullable
2016-01-01 18:15:48 +03:00
public abstract IAnimationStateMachine load(ResourceLocation location, ImmutableMap<String, ITimeValue> parameters);
}
2016-01-01 18:15:48 +03:00
public static class ServerProxy extends CommonProxy
{
@Nullable
2016-01-01 18:15:48 +03:00
public IAnimationStateMachine load(ResourceLocation location, ImmutableMap<String, ITimeValue> parameters)
{
return null;
}
}
public static class ClientProxy extends CommonProxy
{
@Override
public void preInit(FMLPreInitializationEvent event)
{
super.preInit(event);
2016-03-21 10:23:27 +03:00
B3DLoader.INSTANCE.addDomain(MODID);
2016-05-18 05:11:56 -07:00
ModelLoader.setCustomModelResourceLocation(Item.REGISTRY.getObject(blockId), 0, new ModelResourceLocation(blockId, "inventory"));
2016-01-01 18:15:48 +03:00
ClientRegistry.bindTileEntitySpecialRenderer(Chest.class, new AnimationTESR<Chest>()
{
@Override
public void handleEvents(Chest chest, float time, Iterable<Event> pastEvents)
{
chest.handleEvents(time, pastEvents);
}
});
String entityName = MODID + ":entity_chest";
//EntityRegistry.registerGlobalEntityID(EntityChest.class, entityName, EntityRegistry.findGlobalUniqueEntityId());
2016-11-17 19:06:42 -08:00
EntityRegistry.registerModEntity(new ResourceLocation(entityName), EntityChest.class, entityName, 0, ModelAnimationDebug.instance, 64, 20, true, 0xFFAAAA00, 0xFFDDDD00);
2016-01-01 18:15:48 +03:00
RenderingRegistry.registerEntityRenderingHandler(EntityChest.class, new IRenderFactory<EntityChest>()
{
@SuppressWarnings("deprecation")
2016-01-01 18:15:48 +03:00
public Render<EntityChest> createRenderFor(RenderManager manager)
{
/*model = ModelLoaderRegistry.getModel(new ResourceLocation(ModelLoaderRegistryDebug.MODID, "block/chest.b3d"));
if(model instanceof IRetexturableModel)
2016-01-01 18:15:48 +03:00
{
model = ((IRetexturableModel)model).retexture(ImmutableMap.of("#chest", "entity/chest/normal"));
}
if(model instanceof IModelCustomData)
{
model = ((IModelCustomData)model).process(ImmutableMap.of("mesh", "[\"Base\", \"Lid\"]"));
}*/
ResourceLocation location = new ModelResourceLocation(new ResourceLocation(MODID, blockName), "entity");
return new RenderLiving<EntityChest>(manager, new net.minecraftforge.client.model.animation.AnimationModelBase<EntityChest>(location, new VertexLighterSmoothAo(Minecraft.getMinecraft().getBlockColors()))
{
@Override
public void handleEvents(EntityChest chest, float time, Iterable<Event> pastEvents)
2016-01-01 18:15:48 +03:00
{
chest.handleEvents(time, pastEvents);
}
}, 0.5f)
2016-01-01 18:15:48 +03:00
{
protected ResourceLocation getEntityTexture(EntityChest entity)
{
2016-05-18 05:11:56 -07:00
return TextureMap.LOCATION_BLOCKS_TEXTURE;
}
};
2016-01-01 18:15:48 +03:00
}
});
}
2016-01-01 18:15:48 +03:00
public IAnimationStateMachine load(ResourceLocation location, ImmutableMap<String, ITimeValue> parameters)
{
return ModelLoaderRegistry.loadASM(location, parameters);
}
2016-01-01 18:15:48 +03:00
}
private static class ItemAnimationHolder implements ICapabilityProvider
{
private final VariableValue cycleLength = new VariableValue(4);
private final IAnimationStateMachine asm = proxy.load(new ResourceLocation(MODID.toLowerCase(), "asms/block/engine.json"), ImmutableMap.<String, ITimeValue>of(
"cycle_length", cycleLength
));
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing)
{
return capability == CapabilityAnimation.ANIMATION_CAPABILITY;
}
@Override
@Nullable
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing)
{
if (capability == CapabilityAnimation.ANIMATION_CAPABILITY)
{
return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm);
}
return null;
}
}
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
logger = event.getModLog();
proxy.preInit(event);
}
public static class Chest extends TileEntity
{
@Nullable
2016-01-01 18:15:48 +03:00
private final IAnimationStateMachine asm;
private final VariableValue cycleLength = new VariableValue(4);
private final VariableValue clickTime = new VariableValue(Float.NEGATIVE_INFINITY);
//private final VariableValue offset = new VariableValue(0);
public Chest()
{
2016-01-01 18:15:48 +03:00
/*asm = proxy.load(new ResourceLocation(MODID.toLowerCase(), "asms/block/chest.json"), ImmutableMap.<String, ITimeValue>of(
"click_time", clickTime
));*/
asm = proxy.load(new ResourceLocation(MODID.toLowerCase(), "asms/block/engine.json"), ImmutableMap.<String, ITimeValue>of(
"cycle_length", cycleLength,
"click_time", clickTime
//"offset", offset
2016-01-01 18:15:48 +03:00
));
}
2016-01-01 18:15:48 +03:00
public void handleEvents(float time, Iterable<Event> pastEvents)
{
for (Event event : pastEvents)
{
logger.info("Event: " + event.event() + " " + event.offset() + " " + getPos() + " " + time);
}
}
@Override
2016-01-01 18:15:48 +03:00
public boolean hasFastRenderer()
{
2016-01-01 18:15:48 +03:00
return true;
}
/*public IExtendedBlockState getState(IExtendedBlockState state) {
return state.withProperty(B3DFrameProperty.instance, curState);
}*/
public void click(boolean sneaking)
{
if (asm != null)
{
if (sneaking)
{
2016-01-01 18:15:48 +03:00
cycleLength.setValue(6 - cycleLength.apply(0));
}
2016-01-01 18:15:48 +03:00
/*else if(asm.currentState().equals("closed"))
{
clickTime.setValue(Animation.getWorldTime(getWorld()));
asm.transition("opening");
}
else if(asm.currentState().equals("open"))
{
clickTime.setValue(Animation.getWorldTime(getWorld()));
asm.transition("closing");
}*/
else if (asm.currentState().equals("default"))
2016-01-01 18:15:48 +03:00
{
float time = Animation.getWorldTime(getWorld(), Animation.getPartialTickTime());
2016-01-01 18:15:48 +03:00
clickTime.setValue(time);
//offset.setValue(time);
//asm.transition("moving");
asm.transition("starting");
}
else if (asm.currentState().equals("moving"))
{
clickTime.setValue(Animation.getWorldTime(getWorld(), Animation.getPartialTickTime()));
2016-01-01 18:15:48 +03:00
asm.transition("stopping");
}
}
}
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing side)
{
if (capability == CapabilityAnimation.ANIMATION_CAPABILITY)
{
return true;
}
return super.hasCapability(capability, side);
}
@Override
@Nullable
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing side)
{
if (capability == CapabilityAnimation.ANIMATION_CAPABILITY)
{
return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm);
}
return super.getCapability(capability, side);
}
}
public static class EntityChest extends EntityLiving
{
2016-01-01 18:15:48 +03:00
private final IAnimationStateMachine asm;
private final VariableValue cycleLength = new VariableValue(getHealth() / 5);
2016-01-01 18:15:48 +03:00
public EntityChest(World world)
{
2016-01-01 18:15:48 +03:00
super(world);
setSize(1, 1);
asm = proxy.load(new ResourceLocation(MODID.toLowerCase(), "asms/block/engine.json"), ImmutableMap.<String, ITimeValue>of(
"cycle_length", cycleLength
2016-01-01 18:15:48 +03:00
));
}
2016-01-01 18:15:48 +03:00
public void handleEvents(float time, Iterable<Event> pastEvents)
{
// TODO Auto-generated method stub
}
@Override
public void onEntityUpdate()
2016-01-01 18:15:48 +03:00
{
super.onEntityUpdate();
if (world.isRemote && cycleLength != null)
{
2016-01-01 18:15:48 +03:00
cycleLength.setValue(getHealth() / 5);
}
}
2016-01-01 18:15:48 +03:00
@Override
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(60);
}
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing side)
{
if (capability == CapabilityAnimation.ANIMATION_CAPABILITY)
{
return true;
}
return super.hasCapability(capability, side);
}
@Override
@Nullable
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing side)
{
if (capability == CapabilityAnimation.ANIMATION_CAPABILITY)
{
return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm);
}
return super.getCapability(capability, side);
}
}
}