Posted January 2, 20178 yr 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")); } }
January 10, 20178 yr Author bump would it help if I put everything on GitHub instead of posting the code? this is the last thing I could find not working on my 1.8.9 mod and need to move on to 1.10
January 11, 20178 yr 1. Move to 1.11.2 if you are going to update 2. extend RenderArrow instead of Render, like this: @SideOnly(Side.CLIENT) public class RenderModArrow extends RenderArrow<ENTITY> { public static final ResourceLocation ARROW_TEXTURES = new ResourceLocation(TEXTURE LOCATION); public RenderCheeseArrow(RenderManager manager) { super(manager); } protected ResourceLocation getEntityTexture(ENTITY entity) { return ARROW_TEXTURES; } } 3. You gave us your item instead of entity Classes: 94 Lines of code: 12173 Other files: 206 Github repo: https://github.com/KokkieBeer/DeGeweldigeMod
January 11, 20178 yr I'm having this exact same problem. It might help both of us if you'd upload your code to GitHub. I've had some odd errors with my code, like 'NoSuchMethodError: MathHelper.atan2' and 'NoSuchFieldError: POSITION_TEX'. I had mine sorta working at one point, but I've lost the source code for it. They used to render as dark red messed up arrow models, but now they won't render at all. I eventually ended up just removing the game-crashing bits, but I really want to get my gem staves working. GitHub: https://github.com/blahblahbal/Blah-s-Minecraft-Mod
January 11, 20178 yr Might want to look at my github, my arrow works... Classes: 94 Lines of code: 12173 Other files: 206 Github repo: https://github.com/KokkieBeer/DeGeweldigeMod
January 12, 20178 yr Yes, but you're using 1.11.2, correct? I'm using 1.8.9. There are probably similarities though. I'll have a look. EDIT: Just realized what I'm trying to do is slightly different. I want a projectile that has a range that isn't controlled by how long you hold down the use button. I just want a set range, and the projectile texture is simply a circle rendered in multiple planes to look like a sphere. My GitHub link will be in my signature shortly. GitHub: https://github.com/blahblahbal/Blah-s-Minecraft-Mod
January 14, 20178 yr Author Might want to look at my github, my arrow works... I get "remove type arguments" over RenderArrow "public class RendreBlast extends RenderArrow<EntityBlasterBolt> { public RendreBlast(RenderManager renderManagerIn) { super(renderManagerIn); } But then if I change RenderArrow to RenderArrow and add #doRender I get invisible arrow If I remove EntityBlasterBolt from <> I render the vanilla arrow
January 15, 20178 yr Author 1. Move to 1.11.2 if you are going to update 2. extend RenderArrow instead of Render, like this: @SideOnly(Side.CLIENT) public class RenderModArrow extends RenderArrow<ENTITY> { public static final ResourceLocation ARROW_TEXTURES = new ResourceLocation(TEXTURE LOCATION); public RenderCheeseArrow(RenderManager manager) { super(manager); } protected ResourceLocation getEntityTexture(ENTITY entity) { return ARROW_TEXTURES; } } 3. You gave us your item instead of entity My present version still renders invisible: This is what I have currently for EntityBlaster Bolt class: package com.glistre.glistremod.projectiles.blaster; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import java.util.List; import com.glistre.glistremod.GlistreMod; import com.glistre.glistremod.init.GlistreEntityRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S2BPacketChangeGameState; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityBlasterBolt extends Entity { private int xTile = -1; private int yTile = -1; private int zTile = -1; private Block inTile; private int inData; private boolean inGround; /** 1 if the player can pick up the arrow */ public int canBePickedUp; /** Seems to be some sort of timer for animating an arrow. */ public int arrowShake; /** The owner of this arrow. */ public Entity shootingEntity; private int ticksInGround; private int ticksInAir; // private double damage = 2.0D; //original value // sets damage to entity from blasterbolt hit private double damage = 6.0D; /** The amount of knockback an arrow applies when it hits a mob. */ private int knockbackStrength; // private float explosionRadius; //sets the explosion radius 1.0F is not too crazy private float explosionRadius= 0.5F; public EntityBlasterBolt(World worldIn) { super(worldIn); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); } public EntityBlasterBolt(World worldIn, double x, double y, double z) { super(worldIn); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); this.setPosition(x, y, z); // this.getYOffset(); } public EntityBlasterBolt(World worldIn, EntityLivingBase shooter, EntityLivingBase target, float float0, float float1) { super(worldIn); this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; if (shooter instanceof EntityPlayer) { this.canBePickedUp = 1; } this.posY = shooter.posY + (double)shooter.getEyeHeight() - 0.10000000149011612D; double d0 = target.posX - shooter.posX; double d1 = target.getEntityBoundingBox().minY + (double)(target.height / 3.0F) - this.posY; double d2 = target.posZ - shooter.posZ; double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2); if (d3 >= 1.0E-7D) { float f = (float)(MathHelper.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; float f1 = (float)(-(MathHelper.atan2(d1, d3) * 180.0D / Math.PI)); double d4 = d0 / d3; double d5 = d2 / d3; this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f, f1); float f2 = (float)(d3 * 0.20000000298023224D); this.setThrowableHeading(d0, d1 + (double)f2, d2, float0, float1); //1.8 update next line was yoffset = 0.0F now 0.0D method in Entity // this.getYOffset(); //// this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f2, f3); //// float f4 = (float)d3 * 0.2F; //// this.setThrowableHeading(d0, d1 + (double)f4, d2, float0, float1); } } //velocity == shadow? public EntityBlasterBolt(World worldIn, EntityLivingBase shooter, float velocity) { super(worldIn); this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; if (shooter instanceof EntityPlayer) { this.canBePickedUp = 1; } this.setSize(0.5F, 0.5F); this.setLocationAndAngles(shooter.posX, shooter.posY + (double)shooter.getEyeHeight(), shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.posY -= 0.10000000149011612D; this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.setPosition(this.posX, this.posY, this.posZ); // this.getYOffset(); this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, velocity * 1.5F, 1.0F); } protected void entityInit() { this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); } /** * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. */ public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy) { float f = MathHelper.sqrt_double(x * x + y * y + z * z); x = x / (double)f; y = y / (double)f; z = z / (double)f; x = x + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; y = y + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; z = z + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; x = x * (double)velocity; y = y * (double)velocity; z = z * (double)velocity; this.motionX = x; this.motionY = y; this.motionZ = z; float f1 = MathHelper.sqrt_double(x * x + z * z); this.prevRotationYaw = this.rotationYaw = (float)(MathHelper.atan2(x, z) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(MathHelper.atan2(y, (double)f1) * 180.0D / Math.PI); this.ticksInGround = 0; } /** * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, * posY, posZ, yaw, pitch */ // func_180426_a replaced #setPositionAndRotation2 in 1.8 update then back to setPositionAndRotation2 again @Override @SideOnly(Side.CLIENT) public void setPositionAndRotation2(double x, double y, double z, float floatYaw, float floatPitch, int pofRotationIncrements, boolean isTeleport) { this.setPosition(x, y, z); this.setRotation(floatYaw, floatPitch); } /** * Sets the velocity to the args. Args: x, y, z */ @SideOnly(Side.CLIENT) public void setVelocity(double x, double y, double z) { this.motionX = x; this.motionY = y; this.motionZ = z; if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(x * x + z * z); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(x, z) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(y, (double)f) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch; this.prevRotationYaw = this.rotationYaw; this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.ticksInGround = 0; } } /** * Called to update the entity's position/logic. */ public void onUpdate() { super.onUpdate(); if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); } BlockPos blockpos = new BlockPos(this.xTile, this.yTile, this.zTile); IBlockState iblockstate = this.worldObj.getBlockState(blockpos); Block block = iblockstate.getBlock(); if (block.getMaterial() != Material.air) { block.setBlockBoundsBasedOnState(this.worldObj, blockpos); AxisAlignedBB axisalignedbb = block.getCollisionBoundingBox(this.worldObj, blockpos, iblockstate); if (axisalignedbb != null && axisalignedbb.isVecInside(new Vec3(this.posX, this.posY, this.posZ))) { this.inGround = true; } } if (this.arrowShake > 0) { --this.arrowShake; } if (this.inGround) { int j = block.getMetaFromState(iblockstate); if (block == this.inTile && j == this.inData) { ++this.ticksInGround; //changed 1200 to 10 in next line to try to remove arrow if (this.ticksInGround >= 10) { this.setDead(); } } else { this.inGround = false; this.motionX *= (double)(this.rand.nextFloat() * 0.2F); this.motionY *= (double)(this.rand.nextFloat() * 0.2F); this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); this.ticksInGround = 0; this.ticksInAir = 0; } } else { ++this.ticksInAir; Vec3 vec31 = new Vec3(this.posX, this.posY, this.posZ); Vec3 vec3 = new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec31, vec3, false, true, false); vec31 = new Vec3(this.posX, this.posY, this.posZ); vec3 = new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); if (movingobjectposition != null) { vec3 = new Vec3(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); } Entity entity = null; List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); double d0 = 0.0D; int i; float f1; for (i = 0; i < list.size(); ++i) { Entity entity1 = (Entity)list.get(i); if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { f1 = 0.3F; AxisAlignedBB axisalignedbb1 = entity1.getEntityBoundingBox().expand((double)f1, (double)f1, (double)f1); MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); if (movingobjectposition1 != null) { double d1 = vec31.distanceTo(movingobjectposition1.hitVec); if (d1 < d0 || d0 == 0.0D) { entity = entity1; d0 = d1; } } } } if (entity != null) { movingobjectposition = new MovingObjectPosition(entity); } if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) { movingobjectposition = null; } } float f2; float f3; float f4; if (movingobjectposition != null) { if (movingobjectposition.entityHit != null) { f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); int k = MathHelper.ceiling_double_int((double)f2 * this.damage); if (this.getIsCritical()) { k += this.rand.nextInt(k / 2 + 2); } DamageSource damagesource; if (this.shootingEntity == null) { damagesource = DamageSource.causeThrownDamage(this, this); } else { damagesource = DamageSource.causeThrownDamage(this, this.shootingEntity); } if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { movingobjectposition.entityHit.setFire(5); } if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) { if (movingobjectposition.entityHit instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit; if (!this.worldObj.isRemote) { entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); } if (this.knockbackStrength > 0) { f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); if (f4 > 0.0F) { movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4); } } if (this.shootingEntity instanceof EntityLivingBase) { //1.8.9 .func_151384_a changed to apply Thorn Enchants EnchantmentHelper.applyThornEnchantments(entitylivingbase, this.shootingEntity); EnchantmentHelper.applyArthropodEnchantments((EntityLivingBase)this.shootingEntity, entitylivingbase); } if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) { ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F)); } } this.playSound("glistremod:ender_blaster", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); //creates explosion on entity hit this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)this.explosionRadius, true); //next line possibly lower sound volume /raise pitch of explosion? // this.playSound("random.explosion1", 2.1F, 4.2F); this.setDead(); //sets fire to entity hit movingobjectposition.entityHit.setFire(10); if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { this.setDead(); } } else { this.motionX *= -0.10000000149011612D; this.motionY *= -0.10000000149011612D; this.motionZ *= -0.10000000149011612D; this.rotationYaw += 180.0F; this.prevRotationYaw += 180.0F; this.ticksInAir = 0; } } else { BlockPos blockpos1 = movingobjectposition.getBlockPos(); this.xTile = blockpos1.getX(); this.yTile = blockpos1.getY(); this.zTile = blockpos1.getZ(); iblockstate = this.worldObj.getBlockState(blockpos1); this.inTile = iblockstate.getBlock(); this.inData = this.inTile.getMetaFromState(iblockstate); this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX)); this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY)); this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ)); f3 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); this.posX -= this.motionX / (double)f3 * 0.05000000074505806D; this.posY -= this.motionY / (double)f3 * 0.05000000074505806D; this.posZ -= this.motionZ / (double)f3 * 0.05000000074505806D; //this is the sound when it hits a target this.playSound("glistremod:ender_blaster", 1.0F, 2.0F / (this.rand.nextFloat() * 0.2F + 0.9F)); this.inGround = true; this.arrowShake = 7; this.setIsCritical(false); if (this.inTile.getMaterial() != Material.air) { this.inTile.onEntityCollidedWithBlock(this.worldObj, blockpos1, iblockstate, this); } } } if (this.getIsCritical()) { for (i = 0; i < 4; ++i) { //change from "crit" (arrow smoke) to "" to remove particle effect or magicCrit (blue), witchMagic (heavy purple) or smoke or bubble or fireworksSpark (white X's) // this.worldObj.spawnParticle(EnumParticleTypes.SPELL_WITCH, this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ, new int[0]); // this.worldObj.spawnParticle(EnumParticleTypes.CRIT, this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ, new int[0]); } } this.posX += this.motionX; this.posY += this.motionY; this.posZ += this.motionZ; f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { ; } while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { this.prevRotationPitch += 360.0F; } while (this.rotationYaw - this.prevRotationYaw < -180.0F) { this.prevRotationYaw -= 360.0F; } while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { this.prevRotationYaw += 360.0F; } this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; f3 = 0.99F; f1 = 0.05F; if (this.isInWater()) { for (int l = 0; l < 4; ++l) { f4 = 0.25F; this.worldObj.spawnParticle(EnumParticleTypes.WATER_BUBBLE, this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ, new int[0]); } f3 = 0.6F; } if (this.isWet()) { this.extinguish(); } this.motionX *= (double)f3; this.motionY *= (double)f3; this.motionZ *= (double)f3; this.motionY -= (double)f1; this.setPosition(this.posX, this.posY, this.posZ); this.doBlockCollisions(); } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound p_70014_1_) { p_70014_1_.setShort("xTile", (short)this.xTile); p_70014_1_.setShort("yTile", (short)this.yTile); p_70014_1_.setShort("zTile", (short)this.zTile); p_70014_1_.setShort("life", (short)this.ticksInGround); p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.inTile)); p_70014_1_.setByte("inData", (byte)this.inData); p_70014_1_.setByte("shake", (byte)this.arrowShake); p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); p_70014_1_.setByte("pickup", (byte)this.canBePickedUp); p_70014_1_.setDouble("damage", this.damage); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound p_70037_1_) { this.xTile = p_70037_1_.getShort("xTile"); this.yTile = p_70037_1_.getShort("yTile"); this.zTile = p_70037_1_.getShort("zTile"); this.ticksInGround = p_70037_1_.getShort("life"); this.inTile = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); this.inData = p_70037_1_.getByte("inData") & 255; this.arrowShake = p_70037_1_.getByte("shake") & 255; this.inGround = p_70037_1_.getByte("inGround") == 1; if (p_70037_1_.hasKey("damage", 99)) { this.damage = p_70037_1_.getDouble("damage"); } if (p_70037_1_.hasKey("pickup", 99)) { this.canBePickedUp = p_70037_1_.getByte("pickup"); } else if (p_70037_1_.hasKey("player", 99)) { this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0; } } /** * Called by a player entity when they collide with an entity */ public void onCollideWithPlayer(EntityPlayer p_70100_1_) { // removed !this.worldObj.isRemote && if ( this.inGround && this.arrowShake <= 0) { boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(GlistreEntityRegistry.blaster_bolt_1, 1))) { flag = false; } if (flag) { this.playSound("glistremod:ender_blaster", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); p_70100_1_.onItemPickup(this, 1); this.setDead(); } } } /** * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to * prevent them from trampling crops */ protected boolean canTriggerWalking() { return false; } @SideOnly(Side.CLIENT) public float getShadowSize() { return 0.0F; } public void setDamage(double p_70239_1_) { this.damage = p_70239_1_; } public double getDamage() { return this.damage; } /** * Sets the amount of knockback the arrow applies when it hits a mob. */ public void setKnockbackStrength(int p_70240_1_) { this.knockbackStrength = p_70240_1_; } /** * If returns false, the item will not inflict any damage against entities. */ public boolean canAttackWithItem() { return false; } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public void setIsCritical(boolean p_70243_1_) { byte b0 = this.dataWatcher.getWatchableObjectByte(16); if (p_70243_1_) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2))); } } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public boolean getIsCritical() { byte b0 = this.dataWatcher.getWatchableObjectByte(16); return (b0 & 1) != 0; } //next is 1.11 /* @Override public ItemStack getArrowStack() { return new ItemStack(GlistreEntityRegistry.blaster_bolt_1); }*/ // @Override /** * Called by the server when constructing the spawn packet. * Data should be added to the provided stream. * * @param buffer The packet data stream */ /* public void writeSpawnData(ByteBuf buffer) { buffer.writeInt(shootingEntity != null ? shootingEntity.getEntityId() : -1); } @Override public void readSpawnData (ByteBuf buffer) { //Replicate EntityArrow's special spawn packet handling from NetHandlerPlayClient#handleSpawnObject: Entity shooter = worldObj.getEntityByID(buffer.readInt()); if (shooter instanceof EntityLivingBase) { shootingEntity = (EntityLivingBase) shooter; } }*/ } RendreBlast (my renderer): 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.RenderArrow; 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; /*//, Item item, RenderItem renderItem) public RendreBlast(RenderManager renderManager) { //super(Minecraft.getMinecraft().getRenderManager()); super(renderManager);*/ @SideOnly(Side.CLIENT) public class RendreBlast extends Render<EntityBlasterBolt> { public RendreBlast(RenderManager renderManagerIn) { super(renderManagerIn); } public static final ResourceLocation blastTextures = new ResourceLocation(Reference.MOD_ID + ":" + "textures/entities/blaster_bolt_1.png"); // } protected ResourceLocation getEntityTexture(EntityBlasterBolt entity) { return blastTextures; } // private static final ResourceLocation blastTextures = new ResourceLocation(Reference.MOD_ID + ":" + "textures/entities/ender_bolt_1.png"); public void doRender(EntityBlasterBolt par1EntityBlasterBolt, double x, double y, double z, float entityYaw, Float partialTicks) { // this.loadTexture("/GlistreMod/blast.png"); this.bindEntityTexture(par1EntityBlasterBolt); this.renderManager.renderEngine.bindTexture(blastTextures); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);//added from arrow might make it white 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(); // Minecraft.getMinecraft().getRenderItem().renderItem(GlistreEntityRegistry.blaster_bolt_1), ItemCameraTransforms.TransformType.GROUND); //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) { // entity.getRender(renderManager).doRender(entity.otherEntity, x, y, z, entityYaw, partialTicks); // super.doRender(par1EntityBlasterBolt, x, y, z, entityYaw, partialTicks); // this.doRender((EntityBlasterBolt)par1Entity, par2, par4, par6, par8, par9); this.doRender((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; } }*/
January 18, 20178 yr Author public void doRender(EntityBlasterBolt par1EntityBlasterBolt, double x, double y, double z, float entityYaw, Float partialTicks) Why do you have this method here? It is never called. Why not? Because it does not actually override anything from it's superclass. Please, for the love of all things holy, use @Override if you intend to override. If it produces an error, fix the error, do not just remove @Override, otherwise you are just putting your hands over your eyes and singing that the monster isn't there. Yes that was wrong. I replaced "Float" with "float." Still same problem ...arrow is invisible
January 18, 20178 yr Here is my render class for "Fire Orb" it may help, from 1.11 though: package guru.tbe.entity.render; import guru.tbe.entity.EntityFireOrb; import guru.tbe.entity.model.ModelFireOrb; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderOrbFire extends Render { protected ModelFireOrb model; public RenderOrbFire(RenderManager renderManager) { super(renderManager); this.model = new ModelFireOrb(); } public void doRender(EntityFireOrb entity, double x, double y, double z, float f, float partialTicks) { GlStateManager.pushMatrix(); this.bindEntityTexture(entity); GlStateManager.translate(x, y - 0.4734, z); GlStateManager.rotate(entity.rotationYaw, 1, 80, 1); if(model.shouldBeTransparent()) { GlStateManager.enableNormalize(); GlStateManager.enableBlend(); GlStateManager.blendFunc(770, 771); model.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); GlStateManager.disableBlend(); GlStateManager.disableNormalize(); } else model.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); GlStateManager.popMatrix(); super.doRender(entity, x, y, z, f, partialTicks); } protected ResourceLocation getTexture(EntityFireOrb entity) { return model.getTexture(); } protected ResourceLocation getEntityTexture(Entity entity) { return this.getTexture((EntityFireOrb)entity); } public void doRender(Entity entity, double x, double y, double z, float f, float partialTicks) { this.doRender((EntityFireOrb)entity, x, y, z, f, partialTicks); } }
January 20, 20178 yr Author Thank you . . .I am not really sure what #doRender method is doing and you are not overriding it? I will keep trying. . .maybe I am not registering renders properly
January 21, 20178 yr Author So you have @Override on your doRender method now and it does not produce an error? In any case, please post updated code. Yes Edited: This is the state of my code currently ... I keep moving things around. When I have the rendering in the Init event either in Client Proxy or the main mod file, I get a white cube. But when I put rendering where it should be, that is, as I understand from reading some other posts, #registerEntityRenderingHandler should be in preInit event . . .and it is invisible 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.RenderArrow; 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.item.ItemStack; 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; /*//, Item item, RenderItem renderItem) public RendreBlast(RenderManager renderManager) { //super(Minecraft.getMinecraft().getRenderManager()); super(renderManager);*/ @SideOnly(Side.CLIENT) public class RendreBlast extends Render<EntityBlasterBolt> { public RendreBlast(RenderManager renderManagerIn) { super(renderManagerIn); } public static final ResourceLocation blastTextures = new ResourceLocation("glistremod:textures/entities/blaster_bolt_1.png"); // } protected ResourceLocation getTexture(EntityBlasterBolt entity) { return blastTextures; } protected ResourceLocation getEntityTexture(EntityBlasterBolt entity) { return blastTextures; } @Override public void doRender(EntityBlasterBolt entitybolt, double x, double y, double z, float entityYaw, float partialTicks) { this.bindEntityTexture(entitybolt); this.bindTexture(blastTextures); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);//added from arrow might make it white? GlStateManager.pushMatrix(); GlStateManager.translate((float)x, (float)y, (float)z); GlStateManager.rotate(entitybolt.prevRotationYaw + (entitybolt.rotationYaw - entitybolt.prevRotationYaw) * partialTicks - 90.0F, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(entitybolt.prevRotationPitch + (entitybolt.rotationPitch - entitybolt.prevRotationPitch) * partialTicks, 0.0F, 0.0F, 1.0F); Tessellator tessellator = Tessellator.getInstance(); // Minecraft.getMinecraft().getRenderItem().renderItem(GlistreEntityRegistry.blaster_bolt_1), ItemCameraTransforms.TransformType.GROUND); //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)entitybolt.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(entitybolt, x, y, z, entityYaw, partialTicks); } //was in 1.8 removed in 1.8.9 /** * 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(Entity par1EntityBlasterBolt, double x, double y, double z, float entityYaw, float partialTicks) { // entity.getRender(renderManager).doRender(entity.otherEntity, x, y, z, entityYaw, partialTicks); // super.doRender(par1EntityBlasterBolt, x, y, z, entityYaw, partialTicks); // this.doRender((EntityBlasterBolt)par1Entity, par2, par4, par6, par8, par9); this.doRender((EntityBlasterBolt)par1EntityBlasterBolt, x, x, z, entityYaw, partialTicks); }*/ } 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.register();//this should be here in preInit for items to render GlistreEntityRegistry.registerRenders();//this should be here in preInit for items to render // RenderingRegistry.registerEntityRenderingHandler(EntityBlasterBolt.class, new IRenderFactory<EntityBlasterBolt>(){ // can use Render...::new if there is a single argument of RenderManager in Render constructor // RenderingRegistry.registerEntityRenderingHandler must be called in preInit. 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); }}); RenderingRegistry.registerEntityRenderingHandler(EntityBlasterBolt.class, RendreBlast::new); } @Override public void init(){ // this.registerRenders(); //RenderingRegistry.registerEntityRenderingHandler must be called in preInit. /* RenderingRegistry.registerEntityRenderingHandler(EntityBlasterBolt.class, new IRenderFactory<EntityBlasterBolt>(){ @Override public Render<? super EntityBlasterBolt>createRenderFor(RenderManager manager) { return new RendreBlast(manager); }});*/ } /* * 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) { // Note that if you simply return 'Minecraft.getMinecraft().thePlayer', // your packets will not work because you will be getting a client // player even when you are on the server! Sounds absurd, but it's true. // Solution is to double-check side before returning the player: // return (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : ctx.getServerHandler().playerEntity); return (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : super.getPlayerEntityFromContext(ctx)); } @Override public void registerRenders(){ // RenderingRegistry.registerEntityRenderingHandler(TobyEntityProjectile.class, RendreGlistreFactory.FACTORY); 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 class: 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.RendreBlast; import com.glistre.glistremod.projectiles.blaster.RendreBlast2; //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.IRenderFactory; 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.Render; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; 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 * *********************************************************** */ //Blocks, Items and other IForgeRegistryEntry implementations //should be registered in preInit. The same goes for entities. BlockRegistry.init(); BlockRegistry.register(); ModFluids.registerFluids(); // GlistreModelManager.registerAllModels();//already in proxy.init (ClientProxy) so don't need it here? // ItemRegistry.GlistreMod(); //Item models should be registered in preInit from your client proxy //(not your @Mod class, you'll crash the dedicated server) with 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.init(); // GlistreEntityRegistry.register(); GlistreEntityRegistry.registerEntity(); proxy.preInit(); proxy.registerRenders(); //can be done in any init phase but must be done AFTER items are registered 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 ) { 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!"); } } GlistreEntityRegistry: 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(){ init(); // 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 init(){ 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() { // 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); // 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())); } //Item models should be registered in preInit from your client proxy //(not your @Mod class, you'll crash the dedicated server) with ModelLoader.setCustomModelResourceLocation/setCustomMeshDefinition //rather than in init with ItemModelMesher#register. 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")); } } EntityBlasterBolt: package com.glistre.glistremod.projectiles.blaster; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import java.util.List; import com.glistre.glistremod.GlistreMod; import com.glistre.glistremod.init.GlistreEntityRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S2BPacketChangeGameState; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityBlasterBolt extends Entity { private int xTile = -1; private int yTile = -1; private int zTile = -1; private Block inTile; private int inData; private boolean inGround; /** 1 if the player can pick up the arrow */ public int canBePickedUp; /** Seems to be some sort of timer for animating an arrow. */ public int arrowShake; /** The owner of this arrow. */ public Entity shootingEntity; private int ticksInGround; private int ticksInAir; // private double damage = 2.0D; //original value // sets damage to entity from blasterbolt hit private double damage = 6.0D; /** The amount of knockback an arrow applies when it hits a mob. */ private int knockbackStrength; // private float explosionRadius; //sets the explosion radius 1.0F is not too crazy private float explosionRadius= 0.5F; public EntityBlasterBolt(World worldIn) { super(worldIn); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); } public EntityBlasterBolt(World worldIn, double x, double y, double z) { super(worldIn); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); this.setPosition(x, y, z); // this.getYOffset(); } public EntityBlasterBolt(World worldIn, EntityLivingBase shooter, EntityLivingBase target, float float0, float float1) { super(worldIn); this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; if (shooter instanceof EntityPlayer) { this.canBePickedUp = 1; } this.posY = shooter.posY + (double)shooter.getEyeHeight() - 0.10000000149011612D; double d0 = target.posX - shooter.posX; double d1 = target.getEntityBoundingBox().minY + (double)(target.height / 3.0F) - this.posY; double d2 = target.posZ - shooter.posZ; double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2); if (d3 >= 1.0E-7D) { float f = (float)(MathHelper.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; float f1 = (float)(-(MathHelper.atan2(d1, d3) * 180.0D / Math.PI)); double d4 = d0 / d3; double d5 = d2 / d3; this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f, f1); float f2 = (float)(d3 * 0.20000000298023224D); this.setThrowableHeading(d0, d1 + (double)f2, d2, float0, float1); //1.8 update next line was yoffset = 0.0F now 0.0D method in Entity // this.getYOffset(); //// this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f2, f3); //// float f4 = (float)d3 * 0.2F; //// this.setThrowableHeading(d0, d1 + (double)f4, d2, float0, float1); } } //velocity == shadow? public EntityBlasterBolt(World worldIn, EntityLivingBase shooter, float velocity) { super(worldIn); this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; if (shooter instanceof EntityPlayer) { this.canBePickedUp = 1; } this.setSize(0.5F, 0.5F); this.setLocationAndAngles(shooter.posX, shooter.posY + (double)shooter.getEyeHeight(), shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.posY -= 0.10000000149011612D; this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.setPosition(this.posX, this.posY, this.posZ); // this.getYOffset(); this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, velocity * 1.5F, 1.0F); } protected void entityInit() { this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); } /** * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. */ public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy) { float f = MathHelper.sqrt_double(x * x + y * y + z * z); x = x / (double)f; y = y / (double)f; z = z / (double)f; x = x + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; y = y + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; z = z + this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)inaccuracy; x = x * (double)velocity; y = y * (double)velocity; z = z * (double)velocity; this.motionX = x; this.motionY = y; this.motionZ = z; float f1 = MathHelper.sqrt_double(x * x + z * z); this.prevRotationYaw = this.rotationYaw = (float)(MathHelper.atan2(x, z) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(MathHelper.atan2(y, (double)f1) * 180.0D / Math.PI); this.ticksInGround = 0; } /** * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, * posY, posZ, yaw, pitch */ // func_180426_a replaced #setPositionAndRotation2 in 1.8 update then back to setPositionAndRotation2 again @Override @SideOnly(Side.CLIENT) public void setPositionAndRotation2(double x, double y, double z, float floatYaw, float floatPitch, int posRotationIncrements, boolean isTeleport) { this.setPosition(x, y, z); this.setRotation(floatYaw, floatPitch); } /** * Sets the velocity to the args. Args: x, y, z */ @SideOnly(Side.CLIENT) public void setVelocity(double x, double y, double z) { this.motionX = x; this.motionY = y; this.motionZ = z; if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(x * x + z * z); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(x, z) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(y, (double)f) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch; this.prevRotationYaw = this.rotationYaw; this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.ticksInGround = 0; } } /** * Called to update the entity's position/logic. */ public void onUpdate() { super.onUpdate(); if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); } BlockPos blockpos = new BlockPos(this.xTile, this.yTile, this.zTile); IBlockState iblockstate = this.worldObj.getBlockState(blockpos); Block block = iblockstate.getBlock(); if (block.getMaterial() != Material.air) { block.setBlockBoundsBasedOnState(this.worldObj, blockpos); AxisAlignedBB axisalignedbb = block.getCollisionBoundingBox(this.worldObj, blockpos, iblockstate); if (axisalignedbb != null && axisalignedbb.isVecInside(new Vec3(this.posX, this.posY, this.posZ))) { this.inGround = true; } } if (this.arrowShake > 0) { --this.arrowShake; } if (this.inGround) { int j = block.getMetaFromState(iblockstate); if (block == this.inTile && j == this.inData) { ++this.ticksInGround; //changed 1200 to 10 in next line to try to remove arrow if (this.ticksInGround >= 10) { this.setDead(); } } else { this.inGround = false; this.motionX *= (double)(this.rand.nextFloat() * 0.2F); this.motionY *= (double)(this.rand.nextFloat() * 0.2F); this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); this.ticksInGround = 0; this.ticksInAir = 0; } } else { ++this.ticksInAir; Vec3 vec31 = new Vec3(this.posX, this.posY, this.posZ); Vec3 vec3 = new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec31, vec3, false, true, false); vec31 = new Vec3(this.posX, this.posY, this.posZ); vec3 = new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); if (movingobjectposition != null) { vec3 = new Vec3(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); } Entity entity = null; List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); double d0 = 0.0D; int i; float f1; for (i = 0; i < list.size(); ++i) { Entity entity1 = (Entity)list.get(i); if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { f1 = 0.3F; AxisAlignedBB axisalignedbb1 = entity1.getEntityBoundingBox().expand((double)f1, (double)f1, (double)f1); MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); if (movingobjectposition1 != null) { double d1 = vec31.distanceTo(movingobjectposition1.hitVec); if (d1 < d0 || d0 == 0.0D) { entity = entity1; d0 = d1; } } } } if (entity != null) { movingobjectposition = new MovingObjectPosition(entity); } if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) { movingobjectposition = null; } } float f2; float f3; float f4; if (movingobjectposition != null) { if (movingobjectposition.entityHit != null) { f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); int k = MathHelper.ceiling_double_int((double)f2 * this.damage); if (this.getIsCritical()) { k += this.rand.nextInt(k / 2 + 2); } DamageSource damagesource; if (this.shootingEntity == null) { damagesource = DamageSource.causeThrownDamage(this, this); } else { damagesource = DamageSource.causeThrownDamage(this, this.shootingEntity); } if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { movingobjectposition.entityHit.setFire(5); } if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) { if (movingobjectposition.entityHit instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit; if (!this.worldObj.isRemote) { entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); } if (this.knockbackStrength > 0) { f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); if (f4 > 0.0F) { movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4); } } if (this.shootingEntity instanceof EntityLivingBase) { //1.8.9 .func_151384_a changed to apply Thorn Enchants EnchantmentHelper.applyThornEnchantments(entitylivingbase, this.shootingEntity); EnchantmentHelper.applyArthropodEnchantments((EntityLivingBase)this.shootingEntity, entitylivingbase); } if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) { ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F)); } } this.playSound("glistremod:ender_blaster", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); //creates explosion on entity hit this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)this.explosionRadius, true); //next line possibly lower sound volume /raise pitch of explosion? // this.playSound("random.explosion1", 2.1F, 4.2F); this.setDead(); //sets fire to entity hit movingobjectposition.entityHit.setFire(10); if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { this.setDead(); } } else { this.motionX *= -0.10000000149011612D; this.motionY *= -0.10000000149011612D; this.motionZ *= -0.10000000149011612D; this.rotationYaw += 180.0F; this.prevRotationYaw += 180.0F; this.ticksInAir = 0; } } else { BlockPos blockpos1 = movingobjectposition.getBlockPos(); this.xTile = blockpos1.getX(); this.yTile = blockpos1.getY(); this.zTile = blockpos1.getZ(); iblockstate = this.worldObj.getBlockState(blockpos1); this.inTile = iblockstate.getBlock(); this.inData = this.inTile.getMetaFromState(iblockstate); this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX)); this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY)); this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ)); f3 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); this.posX -= this.motionX / (double)f3 * 0.05000000074505806D; this.posY -= this.motionY / (double)f3 * 0.05000000074505806D; this.posZ -= this.motionZ / (double)f3 * 0.05000000074505806D; //this is the sound when it hits a target this.playSound("glistremod:ender_blaster", 1.0F, 2.0F / (this.rand.nextFloat() * 0.2F + 0.9F)); this.inGround = true; this.arrowShake = 7; this.setIsCritical(false); if (this.inTile.getMaterial() != Material.air) { this.inTile.onEntityCollidedWithBlock(this.worldObj, blockpos1, iblockstate, this); } } } if (this.getIsCritical()) { for (i = 0; i < 4; ++i) { //change from "crit" (arrow smoke) to "" to remove particle effect or magicCrit (blue), witchMagic (heavy purple) or smoke or bubble or fireworksSpark (white X's) // this.worldObj.spawnParticle(EnumParticleTypes.SPELL_WITCH, this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ, new int[0]); // this.worldObj.spawnParticle(EnumParticleTypes.CRIT, this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ, new int[0]); } } this.posX += this.motionX; this.posY += this.motionY; this.posZ += this.motionZ; f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { ; } while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { this.prevRotationPitch += 360.0F; } while (this.rotationYaw - this.prevRotationYaw < -180.0F) { this.prevRotationYaw -= 360.0F; } while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { this.prevRotationYaw += 360.0F; } this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; f3 = 0.99F; f1 = 0.05F; if (this.isInWater()) { for (int l = 0; l < 4; ++l) { f4 = 0.25F; this.worldObj.spawnParticle(EnumParticleTypes.WATER_BUBBLE, this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ, new int[0]); } f3 = 0.6F; } if (this.isWet()) { this.extinguish(); } this.motionX *= (double)f3; this.motionY *= (double)f3; this.motionZ *= (double)f3; this.motionY -= (double)f1; this.setPosition(this.posX, this.posY, this.posZ); this.doBlockCollisions(); } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound p_70014_1_) { p_70014_1_.setShort("xTile", (short)this.xTile); p_70014_1_.setShort("yTile", (short)this.yTile); p_70014_1_.setShort("zTile", (short)this.zTile); p_70014_1_.setShort("life", (short)this.ticksInGround); p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.inTile)); p_70014_1_.setByte("inData", (byte)this.inData); p_70014_1_.setByte("shake", (byte)this.arrowShake); p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); p_70014_1_.setByte("pickup", (byte)this.canBePickedUp); p_70014_1_.setDouble("damage", this.damage); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound p_70037_1_) { this.xTile = p_70037_1_.getShort("xTile"); this.yTile = p_70037_1_.getShort("yTile"); this.zTile = p_70037_1_.getShort("zTile"); this.ticksInGround = p_70037_1_.getShort("life"); this.inTile = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); this.inData = p_70037_1_.getByte("inData") & 255; this.arrowShake = p_70037_1_.getByte("shake") & 255; this.inGround = p_70037_1_.getByte("inGround") == 1; if (p_70037_1_.hasKey("damage", 99)) { this.damage = p_70037_1_.getDouble("damage"); } if (p_70037_1_.hasKey("pickup", 99)) { this.canBePickedUp = p_70037_1_.getByte("pickup"); } else if (p_70037_1_.hasKey("player", 99)) { this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0; } } /** * Called by a player entity when they collide with an entity */ public void onCollideWithPlayer(EntityPlayer p_70100_1_) { if ( !this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(GlistreEntityRegistry.blaster_bolt_1, 1))) { flag = false; } if (flag) { this.playSound("glistremod:ender_blaster", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); p_70100_1_.onItemPickup(this, 1); this.setDead(); } } } /** * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to * prevent them from trampling crops */ protected boolean canTriggerWalking() { return false; } @SideOnly(Side.CLIENT) public float getShadowSize() { return 0.0F; } public void setDamage(double p_70239_1_) { this.damage = p_70239_1_; } public double getDamage() { return this.damage; } /** * Sets the amount of knockback the arrow applies when it hits a mob. */ public void setKnockbackStrength(int p_70240_1_) { this.knockbackStrength = p_70240_1_; } /** * If returns false, the item will not inflict any damage against entities. */ public boolean canAttackWithItem() { return false; } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public void setIsCritical(boolean p_70243_1_) { byte b0 = this.dataWatcher.getWatchableObjectByte(16); if (p_70243_1_) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2))); } } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public boolean getIsCritical() { byte b0 = this.dataWatcher.getWatchableObjectByte(16); return (b0 & 1) != 0; } //next is 1.11 /* @Override public ItemStack getArrowStack() { return new ItemStack(GlistreEntityRegistry.blaster_bolt_1); }*/ // @Override /** * Called by the server when constructing the spawn packet. * Data should be added to the provided stream. * * @param buffer The packet data stream */ /* public void writeSpawnData(ByteBuf buffer) { buffer.writeInt(shootingEntity != null ? shootingEntity.getEntityId() : -1); } @Override public void readSpawnData (ByteBuf buffer) { //Replicate EntityArrow's special spawn packet handling from NetHandlerPlayClient#handleSpawnObject: Entity shooter = worldObj.getEntityByID(buffer.readInt()); if (shooter instanceof EntityLivingBase) { shootingEntity = (EntityLivingBase) shooter; } }*/ } Edited: SOLVED!: Problem was the variables values that I had used in worldrenderer
January 23, 20178 yr Author Might want to look at my github, my arrow works... I tried extending RenderArrow<EntityBlasterBolt> such as you did, but I don't think that works in 1.8.9 ...I get red underlined "remove type arguments"
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.