I have fooling with this for hours and hours --I cannot get my custom arrow/projectile to render. .. The particle effects display but not the projectile. All my other entities render fine. At one point, after moving things all around I got a white cube but I don't even recall how I did that. Sorry my code is not formatted well, but if someone could point me in the right direction I will name my next child after you ... I am sure this is something so simple that I am doing wrong:
EntityBlasterBolt class:
package com.glistre.glistremod.projectiles.blaster;
import java.util.List;
import com.glistre.glistremod.GlistreMod;
import com.glistre.glistremod.init.ItemRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Items;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.ArrowLooseEvent;
import net.minecraftforge.event.entity.player.ArrowNockEvent;
import com.glistre.glistremod.projectiles.blaster.*;
import com.glistre.glistremod.reference.Reference;
public class Blaster extends Item{
public final String textureName;
public Blaster(int par1, String textureName) {
super();
this.textureName = textureName;
this.setUnlocalizedName(textureName);
this.setFull3D();
}
public void onPlayerStoppedUsing(ItemStack itemStack, World world, EntityPlayer player, int usesRemaining)
{
int j = this.getMaxItemUseDuration(itemStack) - usesRemaining;
ArrowLooseEvent event = new ArrowLooseEvent(player, itemStack, j);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return;
}
j = event.charge;
boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, itemStack) > 0;
if (flag || player.inventory.hasItem(ItemRegistry.glistre_dust))
{
// change normal 20.0F to 1.0F to make instant charge 5.0F = 5 ticks or 1/4 second
float f = (float)j / 1.0F;
f = (f * f + f * 2.0F) / 3.0F;
if ((double)f < 0.1D)
{
return;
}
if (f > 1.0F)
{
f = 1.0F;
}
EntityBlasterBolt par1EntityBlasterBolt = new EntityBlasterBolt(world, player, f * 2.0F);
if (f == 1.0F)
{
par1EntityBlasterBolt.setIsCritical(true);
}
int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, itemStack);
if (k > 0)
{
par1EntityBlasterBolt.setDamage(par1EntityBlasterBolt.getDamage() + (double)k * 0.5D + 0.5D);
}
int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, itemStack);
if (l > 0)
{
par1EntityBlasterBolt.setKnockbackStrength(l);
}
if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, itemStack) > 0)
{
par1EntityBlasterBolt.setFire(100);
}
itemStack.damageItem(1, player);
//this is the sound releasing from blaster but first line of same sound in EntityBlasterBolt will not sound without it,
//the first float is volume 1.0F is usual depends on sound file
world.playSoundAtEntity(player, "glistremod:laser_blaster", 1.0F, 2.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
if (flag)
{
par1EntityBlasterBolt.canBePickedUp = 2;
}
else
{
player.inventory.consumeInventoryItem(ItemRegistry.glistre_dust);
}
if (!world.isRemote)
{
world.spawnEntityInWorld(par1EntityBlasterBolt);
}
//took out the if ...isRemote to get blasterBolt to render in 1.8 but neither way works in 1.8.9
// if (!world.isRemote)
// {
// world.spawnEntityInWorld(par1EntityBlasterBolt);
// }
}
}
public EnumAction getItemUseAction(ItemStack itemStack)
{
return EnumAction.BOW;
}
public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player)
{
ArrowNockEvent event = new ArrowNockEvent(player, itemStack);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return event.result;
}
if (player.capabilities.isCreativeMode || player.inventory.hasItem(ItemRegistry.glistre_dust))
{
player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack));
}
//adds sound effect on ArrowKnock
world.playSoundAtEntity(player, "glistremod:epm_flash", 1.0F, 2.0F);
return itemStack;
}
public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count)
{
this.setDamage(stack, 99999 - count);
}
public int getMaxItemUseDuration(ItemStack par1ItemStack)
{
return 72000;
}
//adds appearance of enchantment
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack par1ItemStack)
{
return true;
}
}
Render blaster bolt class:
package com.glistre.glistremod.projectiles.blaster;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.Entity;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import net.minecraftforge.fml.relauncher.SideOnly;
import com.glistre.glistremod.GlistreMod;
import com.glistre.glistremod.init.GlistreEntityRegistry;
import com.glistre.glistremod.projectiles.blaster.EntityBlasterBolt;
import com.glistre.glistremod.reference.Reference;
@SideOnly(Side.CLIENT)
public class RendreBlast extends Render<EntityBlasterBolt>
{
public RendreBlast(RenderManager renderManager) {
super(renderManager);
}
private static final ResourceLocation blastTextures = new ResourceLocation(Reference.MOD_ID + ":" + "textures/entities/ender_bolt_1.png");
public void doRenderEntity(EntityBlasterBolt par1EntityBlasterBolt, double x, double y, double z, float entityYaw, Float partialTicks)
{
this.bindEntityTexture(par1EntityBlasterBolt);
//this.bindTexture(blastTextures);
GlStateManager.pushMatrix();
GlStateManager.translate((float)x, (float)y, (float)z);
GlStateManager.rotate(par1EntityBlasterBolt.prevRotationYaw + (par1EntityBlasterBolt.rotationYaw - par1EntityBlasterBolt.prevRotationYaw) * partialTicks - 90.0F, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(par1EntityBlasterBolt.prevRotationPitch + (par1EntityBlasterBolt.rotationPitch - par1EntityBlasterBolt.prevRotationPitch) * partialTicks, 0.0F, 0.0F, 1.0F);
Tessellator tessellator = Tessellator.getInstance();
//1.8 update added WorldRenderer and change var10 to worldrenderer
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
int i = 0;
float var12 = 0.0F;
float var13 = 0.5F;
float var14 = (float)(0 + i * 10) / 32.0F;
float var15 = (float)(5 + i * 10) / 32.0F;
float var16 = 0.0F;
float var17 = 0.15625F;
float var18 = (float)(5 + i * 10) / 32.0F;
float var19 = (float)(10 + i * 10) / 32.0F;
float var20 = 0.05625F;
// GL11.glEnable(GL12.GL_RESCALE_NORMAL); changed to below
GlStateManager.enableRescaleNormal();
// GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
// GlStateManager.rotate((float)(this.renderManager.options.thirdPersonView == 2 ? -1 : 1) * this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
float var21 = (float)par1EntityBlasterBolt.arrowShake - partialTicks;
if (var21 > 0.0F)
{
float var22 = -MathHelper.sin(var21 * 3.0F) * var21;
// GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); //changed to below
GlStateManager.rotate(var22, 0.0F, 0.0F, 1.0F);
}
GlStateManager.rotate(45.0F, 1.0F, 0.0F, 0.0F);
GlStateManager.scale(var20, var20, var20);
GlStateManager.translate(-4.0F, 0.0F, 0.0F);
GL11.glNormal3f(var20, 0.0F, 0.0F);
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
worldrenderer.pos(-7.0D, -2.0D, -2.0D).tex((double)var16, (double)var18);
worldrenderer.pos(-7.0D, -2.0D, 2.0D).tex((double)var17, (double)var18);
worldrenderer.pos(-7.0D, -2.0D, 2.0D).tex((double)var17, (double)var19);
worldrenderer.pos(-7.0D, 2.0D, -2.0D).tex((double)var16, (double)var19);
tessellator.draw();
GL11.glNormal3f(-var20, 0.0F, 0.0F);
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
worldrenderer.pos(-7.0D, 2.0D, -2.0D).tex((double)var16, (double)var18);
worldrenderer.pos(-7.0D, 2.0D, 2.0D).tex((double)var17, (double)var18);
worldrenderer.pos(-7.0D, -2.0D, 2.0D).tex((double)var17, (double)var19);
worldrenderer.pos(-7.0D, -2.0D, -2.0D).tex((double)var16, (double)var19);
tessellator.draw();
for (int var23 = 0; var23 < 4; ++var23)
{
GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
GL11.glNormal3f(0.0F, 0.0F, var20);
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
worldrenderer.pos(-8.0D, -2.0D, 0.0D).tex((double)var12, (double)var14);
worldrenderer.pos(8.0D, -2.0D, 0.0D).tex((double)var13, (double)var14);
worldrenderer.pos(8.0D, 2.0D, 0.0D).tex((double)var13, (double)var15);
worldrenderer.pos(-8.0D, 2.0D, 0.0D).tex((double)var12, (double)var15);
tessellator.draw();
}
GlStateManager.disableRescaleNormal();
GlStateManager.popMatrix();
super.doRender(par1EntityBlasterBolt, x, y, z, entityYaw, partialTicks);
}
/**
* Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
* handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
* (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
* double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
*/
@Override
public void doRender(EntityBlasterBolt par1EntityBlasterBolt, double x, double y, double z, float entityYaw, float partialTicks)
{
this.doRenderEntity((EntityBlasterBolt)par1EntityBlasterBolt, x, x, z, entityYaw, partialTicks);
}
/* @Override
protected boolean bindEntityTexture(Entity entity)
{
ResourceLocation resourcelocation = this.getEntityTexture(entity);
if (resourcelocation == null)
{
return false;
}
else
{
this.bindTexture(resourcelocation);
return true;
}
}
@Override
public void bindTexture(ResourceLocation location)
{
this.renderManager.renderEngine.bindTexture(location);
}*/
@Override
public ResourceLocation getEntityTexture(EntityBlasterBolt entity) {
return blastTextures;
}
}
Client Proxy:
package com.glistre.glistremod.proxies;
import java.awt.Color;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.IFluidBlock;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import com.glistre.glistremod.GlistreMod;
import com.glistre.glistremod.blocks.fluids.ModFluids;
import com.glistre.glistremod.effects.EntityPortalFreonFX;
import com.glistre.glistremod.effects.potions.splash.EntitySplashProjectile;
import com.glistre.glistremod.effects.potions.splash.RenderSplashPotion;
import com.glistre.glistremod.entities.*;
import com.glistre.glistremod.entities.blacktobie.BlackModelTobo;
import com.glistre.glistremod.entities.blacktobie.BlackRenderTobo;
import com.glistre.glistremod.entities.blacktobie.EntityBlackTobo;
import com.glistre.glistremod.entities.guardian.EntityTobieSkel;
import com.glistre.glistremod.entities.guardian.TobieModelGuardian;
import com.glistre.glistremod.entities.guardian.TobieSkelRender;
import com.glistre.glistremod.entities.king.EntityTobieKing;
import com.glistre.glistremod.entities.king.TobieKingRender;
import com.glistre.glistremod.entities.king.TobieModelKing;
import com.glistre.glistremod.entities.queen.EntityTobieQueen;
import com.glistre.glistremod.entities.queen.TobieModelQueen;
import com.glistre.glistremod.entities.queen.TobieQueenRender;
import com.glistre.glistremod.entities.wolf.BlackModelWolf;
import com.glistre.glistremod.entities.wolf.BlackRenderWolf;
import com.glistre.glistremod.entities.wolf.EntityBlackWolf;
import com.glistre.glistremod.entities.wolf.EntityGlistreWolf;
import com.glistre.glistremod.entities.wolf.GlistreModelWolf;
import com.glistre.glistremod.entities.wolf.GlistreRenderWolf;
import com.glistre.glistremod.init.BlockRegistry;
import com.glistre.glistremod.init.GMTileEntityRegistry;
import com.glistre.glistremod.init.GlistreEntityRegistry;
import com.glistre.glistremod.init.ItemRegistry;
import com.glistre.glistremod.init.Recipes;
//import com.glistre.glistremod.items.bow.BusterBowRenderer;
import com.glistre.glistremod.projectiles.blaster.EntityBlasterBolt;
import com.glistre.glistremod.projectiles.blaster.EntityEnderBoltFireball;
import com.glistre.glistremod.projectiles.blaster.EntitySceptreBolt;
import com.glistre.glistremod.projectiles.blaster.RendreBlast;
import com.glistre.glistremod.projectiles.blaster.RendreBlast2;
import com.glistre.glistremod.projectiles.blaster.RendreBlast3;
//import com.glistre.glistremod.projectiles.blaster.RendreGlistreFactory;
import com.glistre.glistremod.projectiles.tobyworstsword.MessageExtendedReachAttack;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyEntityProjectile;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyRenderProjectile;
import com.glistre.glistremod.reference.Reference;
import com.glistre.glistremod.render.GlistreChestGoldInventoryRenderer;
import com.glistre.glistremod.render.GlistreChestInventoryRenderer;
import com.glistre.glistremod.render.GlistreChestRenderer;
import com.glistre.glistremod.render.GlistreGoldChestRenderer;
import com.glistre.glistremod.tabs.TabRegistry;
import com.glistre.glistremod.tileentity.TileEntityGlistreChest;
import com.glistre.glistremod.tileentity.TileEntityGlistreChestGold;
import com.glistre.glistremod.util.GlistreModelManager;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.relauncher.Side;
public class ClientProxy extends CommonProxy {
@Override
public void preInit() {
registerSimpleNetworking();
GlistreModelManager.INSTANCE.registerAllModels();
ItemRegistry.registerRenders();
BlockRegistry.registerRenders();
TabRegistry.registerRenders();
GlistreEntityRegistry.registerRenders();
// RenderingRegistry.registerEntityRenderingHandler(EntityBlasterBolt.class, new IRenderFactory<EntityBlasterBolt>(){
RenderingRegistry.registerEntityRenderingHandler(EntityBlasterBolt.class, RendreBlast::new);
/* @Override
public Render<? super EntityBlasterBolt> createRenderFor(RenderManager manager){
return new RendreBlast(manager, GlistreEntityRegistry.blaster_bolt_1, Minecraft.getMinecraft().getRenderItem());
}});*/
RenderingRegistry.registerEntityRenderingHandler(EntityEnderBoltFireball.class, new IRenderFactory<EntityEnderBoltFireball>(){
@Override
public Render<? super EntityEnderBoltFireball> createRenderFor(RenderManager manager){
return new RendreBlast2(manager, GlistreEntityRegistry.ender_bolt_1, Minecraft.getMinecraft().getRenderItem());
}});
RenderingRegistry.registerEntityRenderingHandler(EntitySceptreBolt.class, new IRenderFactory<EntitySceptreBolt>(){
@Override
public Render<? super EntitySceptreBolt> createRenderFor(RenderManager manager){
return new RendreBlast3(manager, GlistreEntityRegistry.sceptre_bolt_1, Minecraft.getMinecraft().getRenderItem());
}});
RenderingRegistry.registerEntityRenderingHandler(EntitySplashProjectile.class, new IRenderFactory<EntitySplashProjectile>(){
@Override
public Render<? super EntitySplashProjectile> createRenderFor(RenderManager manager){
return new RenderSplashPotion(manager, GlistreEntityRegistry.splash_poison_protection, Minecraft.getMinecraft().getRenderItem());
}});
RenderingRegistry.registerEntityRenderingHandler(TobyEntityProjectile.class, new IRenderFactory<TobyEntityProjectile>(){
@Override
public Render<? super TobyEntityProjectile> createRenderFor(RenderManager manager){
return new TobyRenderProjectile(manager, GlistreEntityRegistry.tobie_worst_projectile_1, Minecraft.getMinecraft().getRenderItem());
}});
RenderingRegistry.registerEntityRenderingHandler(EntityGlistreWolf.class, new IRenderFactory<EntityGlistreWolf>(){
@Override
public Render<? super EntityGlistreWolf> createRenderFor(RenderManager manager){
return new GlistreRenderWolf(manager, new GlistreModelWolf(), 0.3F);
}});
RenderingRegistry.registerEntityRenderingHandler(EntityBlackWolf.class, new IRenderFactory<EntityBlackWolf>(){
@Override
public Render<? super EntityBlackWolf> createRenderFor(RenderManager manager){
return new BlackRenderWolf(manager, new BlackModelWolf(), 0.3F);
}});
RenderingRegistry.registerEntityRenderingHandler(EntityBlackTobo.class, new IRenderFactory<EntityBlackTobo>(){
@Override
public Render<? super EntityBlackTobo> createRenderFor(RenderManager manager){
return new BlackRenderTobo(manager, new BlackModelTobo(), 0.7F);
}});
RenderingRegistry.registerEntityRenderingHandler(EntityTobieSkel.class, new IRenderFactory<EntityTobieSkel>(){
@Override
public Render<? super EntityTobieSkel> createRenderFor(RenderManager manager){
return new TobieSkelRender(manager, new TobieModelGuardian(), 0.5F);
}});
RenderingRegistry.registerEntityRenderingHandler(EntityTobieQueen.class, new IRenderFactory<EntityTobieQueen>(){
@Override
public Render<? super EntityTobieQueen> createRenderFor(RenderManager manager){
return new TobieQueenRender(manager, new TobieModelQueen(), 0.5F);
}});
RenderingRegistry.registerEntityRenderingHandler(EntityTobieKing.class, new IRenderFactory<EntityTobieKing>(){
@Override
public Render<? super EntityTobieKing> createRenderFor(RenderManager manager){
return new TobieKingRender(manager, new TobieModelKing(), 0.5F);
}});
}
@Override
public void init(){
this.registerRenders();
}
/*
* Thanks to jabelar copied from his tutorial
*/
/**
* Registers the simple networking channel and messages for both sides
*/
protected void registerSimpleNetworking()
{
// DEBUG
System.out.println("registering simple networking");
GlistreMod.network = NetworkRegistry.INSTANCE.newSimpleChannel(GlistreMod.NETWORK_CHANNEL_NAME);
int packetId = 0;
// register messages from client to server
GlistreMod.network.registerMessage(MessageExtendedReachAttack.Handler.class, MessageExtendedReachAttack.class, packetId++, Side.SERVER);
}
@Override
public EntityPlayer getPlayerEntityFromContext(MessageContext ctx)
{
return (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : super.getPlayerEntityFromContext(ctx));
}
@Override
public void registerRenders(){
GlistreChestRenderer gcr = new GlistreChestRenderer(Minecraft.getMinecraft().getRenderManager());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGlistreChest.class, gcr);
GlistreGoldChestRenderer gcrg = new GlistreGoldChestRenderer(Minecraft.getMinecraft().getRenderManager());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGlistreChestGold.class, gcrg);
TileEntityItemStackRenderer.instance = new GlistreChestInventoryRenderer();
TileEntityItemStackRenderer.instance = new GlistreChestGoldInventoryRenderer();
}
@Override
public void addParticleEffect(EntityFX particle) {
double motionX = particle.worldObj.rand.nextGaussian() * 0.02D;
double motionY = particle.worldObj.rand.nextGaussian() * 0.02D;
double motionZ = particle.worldObj.rand.nextGaussian() * 0.02D;
EntityFX particleMysterious = new EntityPortalFreonFX(
particle.worldObj,
particle.posX + particle.worldObj.rand.nextFloat() * particle.width
* 2.0F - particle.width,
particle.posY + 0.5D + particle.worldObj.rand.nextFloat()
* particle.height,
particle.posZ + particle.worldObj.rand.nextFloat() * particle.width
* 2.0F - particle.width,
motionX,
motionY,
motionZ);
Minecraft.getMinecraft().effectRenderer.addEffect(particle);
}
}
Main:
package com.glistre.glistremod;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.apache.logging.log4j.Logger;
import com.glistre.glistremod.biome.WorldTypeFreon;
import com.glistre.glistremod.biome.WorldTypeGlistre;
import com.glistre.glistremod.blocks.fluids.ModFluids;
import com.glistre.glistremod.effects.GlistreEventHandler;
import com.glistre.glistremod.effects.GlistreModEventHooks;
import com.glistre.glistremod.effects.GlistreModTerrainGenHooks;
import com.glistre.glistremod.effects.potions.splash.EntitySplashProjectile;
import com.glistre.glistremod.entities.blacktobie.EntityBlackTobo;
import com.glistre.glistremod.entities.guardian.EntityTobieSkel;
import com.glistre.glistremod.entities.king.EntityTobieKing;
import com.glistre.glistremod.entities.queen.EntityTobieQueen;
import com.glistre.glistremod.entities.wolf.EntityBlackWolf;
import com.glistre.glistremod.entities.wolf.EntityGlistreWolf;
import com.glistre.glistremod.init.BiomeRegistry;
import com.glistre.glistremod.init.BlockRegistry;
import com.glistre.glistremod.init.DimensionRegistry;
import com.glistre.glistremod.init.GMTileEntityRegistry;
import com.glistre.glistremod.init.GlistreEntityRegistry;
import com.glistre.glistremod.init.ItemRegistry;
import com.glistre.glistremod.init.Recipes;
import com.glistre.glistremod.items.bow.BusterBow;
import com.glistre.glistremod.lib.ConfigurationGlistre;
import com.glistre.glistremod.lib.GlistreGuiFactory;
import com.glistre.glistremod.mapgen.GlistreVillageBuildings;
import com.glistre.glistremod.mapgen.MapGenGlistreVillage;
import com.glistre.glistremod.mapgen.MapGenGlistreVillage.GlistreStart;
import com.glistre.glistremod.projectiles.blaster.EntityBlasterBolt;
import com.glistre.glistremod.projectiles.blaster.EntityEnderBoltFireball;
//import com.glistre.glistremod.projectiles.blaster.RendreGlistreFactory;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyEntityProjectile;
import com.glistre.glistremod.lib.GlistreConfigGui;
import com.glistre.glistremod.proxies.CommonProxy;
import com.glistre.glistremod.reference.Reference;
import com.glistre.glistremod.tabs.TabRegistry;
import com.glistre.glistremod.util.GlistreModelManager;
import com.glistre.glistremod.worldgen.WorldGen;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.FMLLog;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.FMLEventChannel;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.registry.LanguageRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.Item.ToolMaterial;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.potion.Potion;
import net.minecraft.stats.Achievement;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.WeightedRandomChestContent;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.gen.structure.MapGenStructureIO;
import net.minecraft.world.gen.structure.StructureVillagePieces;
import net.minecraftforge.common.AchievementPage;
import net.minecraftforge.common.ChestGenHooks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
//import sun.rmi.runtime.Log;
/* MOD INFO */
@Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION, guiFactory = Reference.GUI_FACTORY, canBeDeactivated = true)
//, dependencies = "required-after:Mystcraft"
public class GlistreMod {
/* PROXY INFO */
@SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS)
public static CommonProxy proxy;
public static Configuration config;
@Mod.Instance(Reference.MOD_ID)
public static GlistreMod instance;
public static Logger log = FMLLog.getLogger();
// use a named channel to identify packets related to this mod
public static final String NETWORK_CHANNEL_NAME = "GlistreMod"; // put the name of your mod here
//or create field public static String NETWORK_CHANNEL_NAME;
public static FMLEventChannel channel;
// networking
public static SimpleNetworkWrapper network;
public static int modEntityID = 0;
/**
* DECLARATION SECTION
* *********************************************************** */
// DECLARE TOOL MATERIAL
/**name, harvestLevel, maxUses, efficiency, damage, enchantability*/
public static ToolMaterial Silvers=EnumHelper.addToolMaterial("Silvers", 4, 1520, 1.0F, 6, 16);
public static ToolMaterial Glistres=EnumHelper.addToolMaterial("Glistres", 4, 2020, 1.0F, 7, 16);
public static ToolMaterial Sparks=EnumHelper.addToolMaterial("Sparks", 4, 3020, 1.0F, 8, 16);
// DECLARE THE NEW ACHIEVEMENTS
public static Achievement blockAchievement_1;
public static Achievement mobKillAchievement_1;
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
config = new Configuration(event.getSuggestedConfigurationFile());
ConfigurationGlistre.syncConfig();
/**
* LOAD SECTION
* *********************************************************** */
BlockRegistry.init();
BlockRegistry.register();
ModFluids.registerFluids();
// GlistreModelManager.registerAllModels();//already in proxy.init (ClientProxy) so don't need it here?
// ItemRegistry.GlistreMod();
ItemRegistry.init(); //Are these not needed since I have public void Init in the client proxy?
ItemRegistry.register();
TabRegistry.initializeTab();
TabRegistry.registerTab();
GMTileEntityRegistry.GlistreMod();
GlistreEntityRegistry.initializeEntity();
GlistreEntityRegistry.register();
GlistreEntityRegistry.registerEntity();
proxy.preInit();
MinecraftForge.EVENT_BUS.register(new GlistreModEventHooks());
// STRUCTURES
MapGenStructureIO.registerStructure(MapGenGlistreVillage.GlistreStart.class, "Glistre_Village");
GlistreVillageBuildings.registerVillagePieces(); //put your custom village in there
// StructureVillagePieces.registerVillagePieces();
log.info("PreInitialization Complete!");
}
@EventHandler
public static void init(FMLInitializationEvent event )
{
EntityRegistry.registerModEntity(EntityBlasterBolt.class, "blaster_bolt_1", ++modEntityID, GlistreMod.instance, 64, 10, true);
proxy.registerRenders(); //can be done in any init phase but must be done AFTER items are registered
proxy.init();
// TabRegistry.GlistreMod();
Recipes.initShapedRecipes();
Recipes.initShapelessRecipes();
Recipes.initSmeltingRecipes();
BiomeRegistry.GlistreMod();
DimensionRegistry.GlistreMod();
WorldGen.initWorldGen();
// GlistreEntityRegistry.GlistreMod();
//the following is code reflection to make Potion effects work
Potion[] potionTypes = null;
for (Field f : Potion.class.getDeclaredFields()) {
f.setAccessible(true);
try {
// if (f.getName().equals("potionTypes") || f.getName().equals("field_76425_a")) {
if (f.getName().equals("potionTypes")) {
Field modfield = Field.class.getDeclaredField("modifiers");
modfield.setAccessible(true);
modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL);
potionTypes = (Potion[])f.get(null);
final Potion[] newPotionTypes = new Potion[256];
System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length);
f.set(null, newPotionTypes);
}
}
catch (Exception e) {
System.err.println("Severe error, please report this to the mod author:");
System.err.println(e);
}
}
FMLCommonHandler.instance().bus().register(instance);
GlistreEventHandler handler = new GlistreEventHandler();
// REGISTER ENTITY
// EntityRegistry.addSpawn(EntityGlistreWolf.class, 20, 3, 7, EnumCreatureType.CREATURE, BiomeRegistry.biomeGlistre);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.jungle);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.jungleEdge);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.taiga);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.forest);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.roofedForest);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.savanna);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.coldTaiga);
EntityRegistry.addSpawn(EntityGlistreWolf.class, 5, 1, 1, EnumCreatureType.CREATURE, BiomeGenBase.swampland);
EntityRegistry.addSpawn(EntityTobieSkel.class, 20, 1, 2, EnumCreatureType.CREATURE, BiomeRegistry.biomeGlistre);
EntityRegistry.addSpawn(EntityBlackTobo.class, 14, 1, 2, EnumCreatureType.CREATURE, BiomeRegistry.biomeFreon);
EntityRegistry.addSpawn(EntityBlackTobo.class, 12, 1, 1, EnumCreatureType.CREATURE, BiomeRegistry.biomeGlistre);
EntityRegistry.addSpawn(EntityBlackTobo.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.forest);
EntityRegistry.addSpawn(EntityBlackTobo.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.coldTaiga);
EntityRegistry.addSpawn(EntityBlackTobo.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.extremeHills);
EntityRegistry.addSpawn(EntityBlackWolf.class, 5, 1, 3, EnumCreatureType.CREATURE, BiomeGenBase.birchForest);
EntityRegistry.addSpawn(EntityBlackWolf.class, 5, 1, 2, EnumCreatureType.CREATURE, BiomeGenBase.forest);
// EntityRegistry.addSpawn(EntityBlackTobo.class, 20, 1, 3, EnumCreatureType.CREATURE, BiomeRegistry.biomeFreon);
//1.8update changed by adding cast
blockAchievement_1 = (Achievement) new Achievement("achievement.blockAchievement_1", "blockAchievement_1", -1, -3, BlockRegistry.silver_ore_1, (Achievement)null).registerStat();
mobKillAchievement_1 = (Achievement) new Achievement("achievement.mobKillAchievement_1", "mobKillAchievement_1", -1, -2, ItemRegistry.ancient_book, blockAchievement_1).setSpecial().registerStat();
AchievementPage.registerAchievementPage(new AchievementPage("GlistreMod Achievements", new Achievement[]{blockAchievement_1, mobKillAchievement_1}));
FMLCommonHandler.instance().bus().register(handler);//don't really need 1.8.9 you register an instance but needed in 1.8 no idea
MinecraftForge.EVENT_BUS.register(handler);
MinecraftForge.TERRAIN_GEN_BUS.register(new GlistreModTerrainGenHooks());
log.info("Initialization Complete!");
}
@SubscribeEvent
public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event){
if(event.modID.equals(Reference.MOD_ID)){
ConfigurationGlistre.syncConfig();
//resync configs this is where restart would or not be required
System.out.println("Config changed!");
log.info("Updating config...");
}
}
@EventHandler
public static void postInit( FMLPostInitializationEvent event )
{
proxy.postInit();
MinecraftForge.EVENT_BUS.register(new GlistreModEventHooks());
MinecraftForge.TERRAIN_GEN_BUS.register(new GlistreModTerrainGenHooks());
// MinecraftForge.EVENT_BUS.register(new GuiModInfo(Minecraft.getMinecraft()));
WorldType BIOMEFREON = new WorldTypeFreon(8, "biomeFreon");
WorldType BIOMEGLISTRE = new WorldTypeGlistre(9, "biomeGlistre");
//if(MystAPI.instability != null) {
//API usage
//}
log.info("Post Initialization Complete!");
}
}
my Entity Registry:
package com.glistre.glistremod.init;
import com.glistre.glistremod.GlistreMod;
import com.glistre.glistremod.effects.potions.splash.EntitySplashProjectile;
import com.glistre.glistremod.effects.potions.splash.ItemSplashPotion;
import com.glistre.glistremod.effects.potions.splash.RenderSplashPotion;
import com.glistre.glistremod.entities.blacktobie.EntityBlackTobo;
import com.glistre.glistremod.entities.guardian.EntityTobieSkel;
import com.glistre.glistremod.entities.king.EntityTobieKing;
import com.glistre.glistremod.entities.queen.EntityTobieQueen;
//import com.glistre.glistremod.entities.unused.EntityTobie;
import com.glistre.glistremod.entities.wolf.EntityBlackWolf;
import com.glistre.glistremod.entities.wolf.EntityGlistreWolf;
import com.glistre.glistremod.projectiles.blaster.EntityBlasterBolt;
import com.glistre.glistremod.projectiles.blaster.EntityEnderBoltFireball;
import com.glistre.glistremod.projectiles.blaster.EntitySceptreBolt;
import com.glistre.glistremod.projectiles.blaster.Projectile2;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyEntityProjectile;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyEntityThrowable;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyEntitySword;
import com.glistre.glistremod.projectiles.tobyworstsword.TobyRenderProjectile;
import com.glistre.glistremod.reference.Reference;
import com.glistre.glistremod.tabs.TabRegistry;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.EntityList;
import net.minecraft.item.Item;
import net.minecraft.item.ItemMonsterPlacer;
import net.minecraft.potion.PotionEffect;
public class GlistreEntityRegistry {
public static void GlistreMod(){
initializeEntity();
// registerEntity();
register();
}
// the ray or blast bolt like an arrow
public static Item blaster_bolt_1;
public static Item splash_poison_protection;
// Tobie's Worst Enemy Sword
public static Item tobie_worst_projectile_1;
// public int blaster_bolt_1ID;
public static Item ender_bolt_1;
// public int ender_bolt_1ID;
public static Item sceptre_bolt_1;
// public static Item item_spawn_egg_2 = new ItemMonsterPlacer().setUnlocalizedName("black_wolf").setCreativeTab(TabRegistry.tab_builder).setMaxStackSize(12);
// public int sceptre_bolt_1ID;
public static int modEntityID = 0;
public static void initializeEntity(){
blaster_bolt_1 = new Projectile2(blaster_bolt_1, "blaster_bolt_1").setUnlocalizedName("blaster_bolt_1").setMaxStackSize(64).setCreativeTab(TabRegistry.tab_potion);
splash_poison_protection = new ItemSplashPotion(17, "splash_poison_protection", new PotionEffect[]{new PotionEffect(31, 1200)}, 888888).setUnlocalizedName("splash_poison_protection");
//TOBIE'S WORST ENEMY Sword/Item
tobie_worst_projectile_1 = new TobyEntitySword(Item.ToolMaterial.IRON).setUnlocalizedName("tobie_worst_projectile_1");
ender_bolt_1 = new Projectile2(ender_bolt_1, "ender_bolt_1").setUnlocalizedName("ender_bolt_1").setMaxStackSize(64).setCreativeTab(TabRegistry.tab_potion);
sceptre_bolt_1 = new Projectile2(sceptre_bolt_1, "sceptre_bolt_1").setUnlocalizedName("sceptre_bolt_1").setMaxStackSize(64).setCreativeTab(TabRegistry.tab_potion);
}
public static void registerEntity() {
// 1.8 removed crash
//SPLASH POTION
// GameRegistry.registerItem(splash_poison_protection, "splash_poison_protection");
// BLASTERS
EntityRegistry.registerModEntity(EntityBlasterBolt.class, "blaster_bolt_1", ++modEntityID, GlistreMod.instance, 64, 10, true);
EntityRegistry.registerModEntity(EntityEnderBoltFireball.class, "ender_bolt_1", ++modEntityID, GlistreMod.instance, 64, 10, true);
EntityRegistry.registerModEntity(EntitySceptreBolt.class, "sceptre_bolt_1", ++modEntityID, GlistreMod.instance, 64, 10, true);
EntityRegistry.registerModEntity(EntitySplashProjectile.class, "splash_poison_protection", ++modEntityID, GlistreMod.instance, 64, 1, true);
//1.8 removed crash
// TOBIE'S WORST ENEMY
// GameRegistry.registerItem(tobie_worst_projectile_1, "tobie_worst_projectile_1");
EntityRegistry.registerModEntity(TobyEntityProjectile.class, "tobie_worst_projectile_1", ++modEntityID, GlistreMod.instance, 64, 1, true);
// MOBS
// 80 is max distance from player, 3 is update frequencies must be 3 for mobs, projectiles must be more precise 1,
//last parameter is send velocity information should be true unless entity never moves
EntityRegistry.registerModEntity(EntityGlistreWolf.class, "glistre_wolf", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityGlistreWolf.class, 0xFFFFFF, 0xFFFF5D);
EntityRegistry.registerModEntity(EntityBlackWolf.class, "black_wolf", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityBlackWolf.class, 0xFFD700, 0xc5b358);
// EntityList.classToStringMapping.put(ItemRegistry.item_spawn_egg_2, "black_wolf");
EntityRegistry.registerModEntity(EntityBlackTobo.class, "corrupted_tobie", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityBlackTobo.class, 0xc5b358, 0xFFD700);
EntityRegistry.registerModEntity(EntityTobieSkel.class, "tobie_skelly_guardian", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityTobieSkel.class, 0xCCAC00, 0xFF9900);
EntityRegistry.registerModEntity(EntityTobieKing.class, "tobie_king", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityTobieKing.class, 0x534600, 0xc5b358);
EntityRegistry.registerModEntity(EntityTobieQueen.class, "tobie_queen_elizabeth", ++modEntityID, GlistreMod.instance, 80, 3, true);
EntityRegistry.registerEgg (EntityTobieQueen.class, 0xFFD700, 0xCC0000);
}
public static void register(){
GameRegistry.registerItem(blaster_bolt_1, "blaster_bolt_1");
GameRegistry.registerItem(splash_poison_protection, "splash_poison_protection");
GameRegistry.registerItem(tobie_worst_projectile_1, "tobie_worst_projectile_1");
GameRegistry.registerItem(ender_bolt_1, "ender_bolt_1");
GameRegistry.registerItem(sceptre_bolt_1, "sceptre_bolt_1");
}
public static void registerRenders(){
registerRender(blaster_bolt_1);
registerRender(splash_poison_protection);
registerRender(tobie_worst_projectile_1);
registerRender(ender_bolt_1);
registerRender(sceptre_bolt_1);
// RenderingRegistry.registerEntityRenderingHandler(TobyEntityProjectile.class, new TobyRenderProjectile(Minecraft.getMinecraft().getRenderManager(), tobie_worst_projectile_1, Minecraft.getMinecraft().getRenderItem()));
// RenderingRegistry.registerEntityRenderingHandler(EntitySplashProjectile.class, new RenderSplashPotion(Minecraft.getMinecraft().getRenderManager(), splash_poison_protection, Minecraft.getMinecraft().getRenderItem()));
}
public static void registerRender(Item item){
// RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
// renderItem.getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));
// ModelLoader.setCustomModelResourceLocation(item, 0 , new ModelResourceLocation(item.getRegistryName(), "inventory"));
ModelLoader.setCustomModelResourceLocation(item, 0 , new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));
}
}