From 0973a7c3288d1c519ad38ec0755b2e775427e2bc Mon Sep 17 00:00:00 2001 From: Shinare Date: Sat, 3 Aug 2024 18:21:25 +0300 Subject: [PATCH] Nex minibosses WIP --- .../com/zivilon/cinder_loe/CinderLoE.java | 28 ++++- .../cinder_loe/blocks/NexIceCrystal.java | 51 ++++++++++ .../client/model/ModelNexIceCrystal.java | 71 +++++++++++++ .../client/render/RenderNexMiniboss.java | 52 ++++++++++ .../render/block/RenderNexIceCrystal.java | 69 +++++++++++++ .../zivilon/cinder_loe/entity/NexFire.java | 26 +++++ .../com/zivilon/cinder_loe/entity/NexIce.java | 26 +++++ .../zivilon/cinder_loe/entity/NexShadow.java | 96 +++++++++++------- .../zivilon/cinder_loe/entity/NexToxin.java | 26 +++++ .../cinder_loe/items/CinderLoESpawnEgg.java | 5 + .../zivilon/cinder_loe/items/ToxicCore.java | 2 +- .../tileentity/TileEntityNexIceCrystal.java | 7 ++ .../zivilon/cinder_loe/util/Utilities.java | 10 +- .../assets/cinder_loe/mob/nex/fire.png | Bin 0 -> 6362 bytes .../assets/cinder_loe/mob/nex/ice.png | Bin 0 -> 6352 bytes .../assets/cinder_loe/mob/nex/shadow.png | Bin 0 -> 6329 bytes .../assets/cinder_loe/mob/nex/toxin.png | Bin 0 -> 6353 bytes .../lotr/textures/blocks/nex_ice_crystal.png | Bin 0 -> 6683 bytes 18 files changed, 428 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/zivilon/cinder_loe/blocks/NexIceCrystal.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceCrystal.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/RenderNexMiniboss.java create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/block/RenderNexIceCrystal.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/NexFire.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/NexIce.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/NexToxin.java create mode 100644 src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityNexIceCrystal.java create mode 100644 src/main/resources/assets/cinder_loe/mob/nex/fire.png create mode 100644 src/main/resources/assets/cinder_loe/mob/nex/ice.png create mode 100644 src/main/resources/assets/cinder_loe/mob/nex/shadow.png create mode 100644 src/main/resources/assets/cinder_loe/mob/nex/toxin.png create mode 100644 src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index 6af591f..2bd23f8 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -143,6 +143,7 @@ public class CinderLoE { public static Block entityBarrier; public static Block iceCage; public static Block enchantedIce; + public static Block nexIceCrystal; //public static Block verticalWeaponRack; @@ -358,7 +359,7 @@ public class CinderLoE { event.registerServerCommand(new CommandCinderCharacter()); } - public void registerEntities() { // Last ID added: 45 + public void registerEntities() { // Last ID added: 49 ///GameRegistry.registerTileEntity(TileEntityMistBlock.class, "TileEntityMistBlock"); ///.registerBlock(TileEntityRustedSword, "TileEntityRustedSword"); @@ -376,8 +377,7 @@ public class CinderLoE { // Others EntityRegistry.registerModEntity(DarkSpider.class, "DarkSpider", (entityID + 42), this, 64, 1, true); - EntityRegistry.registerModEntity(Nex.class, "Nex", (entityID + 44), this, 64, 1, true); - EntityRegistry.registerModEntity(EntityWarDart.class, "WarDart", (entityID + 45), this, 64, 1, true); + EntityRegistry.registerModEntity(EntityWarDart.class, "WarDart", (entityID + 44), this, 64, 1, true); EntityRegistry.registerModEntity(CorruptDwarf.class, "CorruptDwarf", (entityID + 36), this, 64, 1, true); EntityRegistry.registerModEntity(CorruptElf.class, "CorruptElf", (entityID + 37), this, 64, 1, true); @@ -426,6 +426,13 @@ public class CinderLoE { EntityRegistry.registerModEntity(LOTREntitySauron.class, "LOTREntitySauron", (entityID + 28), this, 64, 1, true); EntityRegistry.registerModEntity(UtumnoSlaveTrader.class, "UtumnoSlaveTrader", (entityID + 30), this, 64, 1, true); + + // Frozen Dungeon + EntityRegistry.registerModEntity(Nex.class, "Nex", (entityID + 45), this, 64, 1, true); + EntityRegistry.registerModEntity(NexShadow.class, "NexShadow", (entityID + 46), this, 64, 1, true); + EntityRegistry.registerModEntity(NexIce.class, "NexIce", (entityID + 47), this, 64, 1, true); + EntityRegistry.registerModEntity(NexFire.class, "NexFire", (entityID + 48), this, 64, 1, true); + EntityRegistry.registerModEntity(NexToxin.class, "NexToxin", (entityID + 49), this, 64, 1, true); } public void registerBlocks() { @@ -493,14 +500,19 @@ public class CinderLoE { GameRegistry.registerBlock(mistBlock, "mist"); voidblock = (new voidblock()); GameRegistry.registerBlock(voidblock, "voidblock"); - shadowTile = (new ShadowTile()); - GameRegistry.registerBlock(shadowTile, "shadow_tile"); entityBarrier = (new EntityBarrier()); GameRegistry.registerBlock(entityBarrier, "entity_barrier"); + + // Frozen Dungeon + shadowTile = (new ShadowTile()); + GameRegistry.registerBlock(shadowTile, "shadow_tile"); iceCage = (new IceCage()); GameRegistry.registerBlock(iceCage, "ice_cage"); enchantedIce = (new EnchantedIce()); GameRegistry.registerBlock(enchantedIce, "enchanted_ice"); + nexIceCrystal = (new NexIceCrystal()); + GameRegistry.registerBlock(nexIceCrystal, "nex_ice_crystal"); + GameRegistry.registerTileEntity(TileEntityNexIceCrystal.class, "tileEntityNexIceCrystal"); // Building Blocks cutDrystone = (new cutDrystone()); @@ -951,6 +963,8 @@ public class CinderLoE { // RenderingRegistry.registerEntityRenderingHandler(HaradLevy.class, new LOTRRenderNearHaradrim()); // RenderingRegistry.registerEntityRenderingHandler(DwarfLevy.class, new LOTRRenderDwarf()); RenderingRegistry.registerBlockHandler(new RenderIceCage()); + RenderingRegistry.registerBlockHandler(new RenderNexIceCrystal()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityNexIceCrystal.class, new RenderNexIceCrystal()); RenderingRegistry.registerEntityRenderingHandler(EntityWarDart.class, new RenderWarDart()); RenderingRegistry.registerEntityRenderingHandler(BladorthinSmith.class, new LOTRRenderDorwinionElfVintner()); @@ -1004,6 +1018,10 @@ public class CinderLoE { RenderingRegistry.registerEntityRenderingHandler(LOTREntitySauron.class, new LOTRRenderSauron()); RenderingRegistry.registerEntityRenderingHandler(UtumnoSlaveTrader.class, new RenderUtumnoSlave()); + RenderingRegistry.registerEntityRenderingHandler(NexShadow.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexIce.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexFire.class, new RenderNexMiniboss()); + RenderingRegistry.registerEntityRenderingHandler(NexToxin.class, new RenderNexMiniboss()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMistBlock.class, (TileEntitySpecialRenderer)new LOTRRenderUtumnoPortal()); } } diff --git a/src/main/java/com/zivilon/cinder_loe/blocks/NexIceCrystal.java b/src/main/java/com/zivilon/cinder_loe/blocks/NexIceCrystal.java new file mode 100644 index 0000000..55662fc --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/blocks/NexIceCrystal.java @@ -0,0 +1,51 @@ +package com.zivilon.cinder_loe.blocks; + +import com.zivilon.cinder_loe.LoECreativeTabs; +import com.zivilon.cinder_loe.tileentity.TileEntityNexIceCrystal; +import com.zivilon.cinder_loe.util.Utilities; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class NexIceCrystal extends Block { + + public NexIceCrystal() { + super(Material.ice); // Choose the appropriate material + // Set other properties like hardness, resistance, name, etc. + setCreativeTab(LoECreativeTabs.tabDecoLoE); + setHardness(100.0F); + setResistance(100.0F); + setBlockTextureName(Utilities.toSnakeCase("lotr:nexIceCrystal")); + setBlockName("lotr:NexIceCrystal"); + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileEntityNexIceCrystal(); + } + + @Override + public int getRenderType() { + return -1; // Custom render ID + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceCrystal.java b/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceCrystal.java new file mode 100644 index 0000000..87a2445 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/model/ModelNexIceCrystal.java @@ -0,0 +1,71 @@ +package com.zivilon.cinder_loe.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +/** + * IceCrystal - cleric_red + * Created using Tabula 4.1.1 + */ +public class ModelNexIceCrystal extends ModelBase { + public ModelRenderer shape16; + public ModelRenderer back; + public ModelRenderer front; + public ModelRenderer left; + public ModelRenderer right; + public ModelRenderer bottomfront; + public ModelRenderer bottomback; + + public ModelNexIceCrystal() { + this.textureWidth = 64; + this.textureHeight = 32; + this.right = new ModelRenderer(this, 0, 2); + this.right.setRotationPoint(2.9F, 12.6F, 3.2F); + this.right.addBox(0.0F, 0.0F, 0.0F, 0, 9, 5, 0.0F); + this.setRotateAngle(right, 0.0F, 3.141592653589793F, 0.0F); + this.bottomfront = new ModelRenderer(this, 14, 0); + this.bottomfront.setRotationPoint(-3.0F, 17.3F, -2.66F); + this.bottomfront.addBox(0.0F, 0.0F, 0.0F, 6, 6, 1, 0.0F); + this.setRotateAngle(bottomfront, 0.5009094953223726F, 0.0F, 0.0F); + this.bottomback = new ModelRenderer(this, 14, 0); + this.bottomback.setRotationPoint(-3.0F, 16.3F, 3.1F); + this.bottomback.addBox(0.0F, 0.0F, 0.0F, 6, 6, 1, 0.0F); + this.setRotateAngle(bottomback, -0.5009094953223726F, 0.0F, 0.0F); + this.back = new ModelRenderer(this, 0, 0); + this.back.setRotationPoint(-3.0F, 12.0F, 0.2F); + this.back.addBox(0.0F, 0.0F, 0.0F, 6, 6, 1, 0.0F); + this.setRotateAngle(back, 0.5009094953223726F, 0.0F, 0.0F); + this.front = new ModelRenderer(this, 0, 0); + this.front.setRotationPoint(-3.0F, 12.0F, 0.2F); + this.front.addBox(0.0F, 0.0F, 0.0F, 6, 6, 1, 0.0F); + this.setRotateAngle(front, -0.5009094953223726F, 0.0F, 0.0F); + this.shape16 = new ModelRenderer(this, 31, 0); + this.shape16.setRotationPoint(0.0F, 7.0F, -8.0F); + this.shape16.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F); + this.setRotateAngle(shape16, 0.4553564018453205F, 0.0F, 0.0F); + this.left = new ModelRenderer(this, 0, 2); + this.left.setRotationPoint(-2.9F, 12.6F, -1.9F); + this.left.addBox(0.0F, 0.0F, 0.0F, 0, 9, 5, 0.0F); + this.shape16.addChild(this.right); + this.shape16.addChild(this.bottomfront); + this.shape16.addChild(this.bottomback); + this.shape16.addChild(this.back); + this.shape16.addChild(this.front); + this.shape16.addChild(this.left); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + this.shape16.render(f5); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderNexMiniboss.java b/src/main/java/com/zivilon/cinder_loe/client/render/RenderNexMiniboss.java new file mode 100644 index 0000000..3fb5b41 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/RenderNexMiniboss.java @@ -0,0 +1,52 @@ +package com.zivilon.cinder_loe.client.render; + +import com.zivilon.cinder_loe.entity.NexShadow; +import com.zivilon.cinder_loe.entity.NexIce; +import com.zivilon.cinder_loe.entity.NexFire; +import com.zivilon.cinder_loe.entity.NexToxin; + +import lotr.client.model.LOTRModelHuman; +import lotr.client.render.entity.LOTRRenderBiped; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class RenderNexMiniboss extends LOTRRenderBiped { + public static ResourceLocation SHADOW_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/shadow.png"); + public static ResourceLocation FIRE_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/fire.png"); + public static ResourceLocation ICE_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/ice.png"); + public static ResourceLocation TOXIN_TEXTURE = new ResourceLocation("cinder_loe:mob/nex/toxin.png"); + + public RenderNexMiniboss() { + super(new LOTRModelHuman(), 0.0F); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof NexToxin) { + return TOXIN_TEXTURE; + } else if (entity instanceof NexFire) { + return FIRE_TEXTURE; + } else if (entity instanceof NexIce) { + return ICE_TEXTURE; + } else { + return SHADOW_TEXTURE; + } + } + + @Override + protected void preRenderCallback(EntityLivingBase entity, float partialTickTime) { + super.preRenderCallback(entity, partialTickTime); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); // Apply 50% transparency + } + + @Override + protected void renderModel(EntityLivingBase entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { + super.renderModel(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor); + GL11.glDisable(GL11.GL_BLEND); + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderNexIceCrystal.java b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderNexIceCrystal.java new file mode 100644 index 0000000..1e66de9 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/block/RenderNexIceCrystal.java @@ -0,0 +1,69 @@ +package com.zivilon.cinder_loe.client.render.block; + +import com.zivilon.cinder_loe.client.model.ModelNexIceCrystal; +import com.zivilon.cinder_loe.tileentity.TileEntityNexIceCrystal; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +public class RenderNexIceCrystal extends TileEntitySpecialRenderer implements ISimpleBlockRenderingHandler { + public static final int renderID = RenderingRegistry.getNextAvailableRenderId(); + private static final ResourceLocation texture = new ResourceLocation("lotr:textures/blocks/nex_ice_crystal.png"); + private final ModelNexIceCrystal model = new ModelNexIceCrystal(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTicks) { + if (tileEntity instanceof TileEntityNexIceCrystal) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F); // Center the model + GL11.glScalef(0.5F, 0.5F, 0.5F); // Scale down the model + this.bindTexture(texture); + this.model.render(null, 0, 0, 0, 0, 0, 0.0625F); + GL11.glPopMatrix(); + } + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + if (modelId == renderID) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); // Center the model in inventory + GL11.glScalef(0.5F, 0.5F, 0.5F); // Scale down the model + this.bindTexture(texture); + this.model.render(null, 0, 0, 0, 0, 0, 0.0625F); + GL11.glPopMatrix(); + } + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + if (modelId == renderID) { + GL11.glPushMatrix(); + GL11.glTranslatef(x + 0.5F, y + 0.5F, z + 0.5F); // Center the model in the world + GL11.glScalef(0.5F, 0.5F, 0.5F); // Scale down the model + this.bindTexture(texture); + this.model.render(null, 0, 0, 0, 0, 0, 0.0625F); + GL11.glPopMatrix(); + return true; + } + return false; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return renderID; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/NexFire.java b/src/main/java/com/zivilon/cinder_loe/entity/NexFire.java new file mode 100644 index 0000000..124a280 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/NexFire.java @@ -0,0 +1,26 @@ +package com.zivilon.cinder_loe.entity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public class NexFire extends NexShadow { + public String entity_name = "§4Naira"; + + public NexFire(World world) { + super(world); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/fire"; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/NexIce.java b/src/main/java/com/zivilon/cinder_loe/entity/NexIce.java new file mode 100644 index 0000000..d6b8baa --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/NexIce.java @@ -0,0 +1,26 @@ +package com.zivilon.cinder_loe.entity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public class NexIce extends NexShadow { + public String entity_name = "§bNinquë"; + + public NexIce(World world) { + super(world); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/ice"; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/entity/NexShadow.java b/src/main/java/com/zivilon/cinder_loe/entity/NexShadow.java index 30a0615..f11fb8a 100644 --- a/src/main/java/com/zivilon/cinder_loe/entity/NexShadow.java +++ b/src/main/java/com/zivilon/cinder_loe/entity/NexShadow.java @@ -1,97 +1,80 @@ package com.zivilon.cinder_loe.entity; import com.zivilon.cinder_loe.CinderLoE; +import com.zivilon.cinder_loe.util.Utilities; +import com.zivilon.cinder_loe.entity.Nex; +import net.minecraft.block.Block; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IRangedAttackMob; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIOpenDoor; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.EntityAIWatchClosest2; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import lotr.common.LOTRFoods; -import lotr.common.LOTRMod; import lotr.common.entity.ai.LOTREntityAIAttackOnCollide; -import lotr.common.entity.ai.LOTREntityAIDrink; -import lotr.common.entity.ai.LOTREntityAIEat; -import lotr.common.entity.ai.LOTREntityAIFollowHiringPlayer; -import lotr.common.entity.ai.LOTREntityAIHiredRemainStill; -import lotr.common.entity.animal.LOTREntityHorse; import lotr.common.entity.npc.LOTREntityMan; -import lotr.common.entity.npc.LOTREntityNPC; -import lotr.common.entity.npc.LOTRNPCMount; -import lotr.common.entity.npc.LOTRNames; import lotr.common.fac.LOTRFaction; -import java.lang.reflect.Field; -import java.util.Arrays; import java.util.List; -import java.util.Map; public class NexShadow extends LOTREntityMan { - String entity_name = "§7Fuinë"; + public String entity_name = "§7Fuinë"; public NexShadow(World world) { super(world); setSize(0.6F, 1.8F); ((EntityLiving) this).tasks.addTask(2, (EntityAIBase) new LOTREntityAIAttackOnCollide(this, 1.3D, false)); - ((EntityLiving) this).tasks.addTask(7, (EntityAIBase) new EntityAIWatchClosest2((EntityLiving) this, EntityPlayer.class, 8.0F, 0.02F)); - ((EntityLiving) this).tasks.addTask(7, (EntityAIBase) new EntityAIWatchClosest2((EntityLiving) this, LOTREntityNPC.class, 5.0F, 0.02F)); - ((EntityLiving) this).tasks.addTask(8, (EntityAIBase) new EntityAIWatchClosest((EntityLiving) this, EntityLiving.class, 8.0F, 0.02F)); - ((EntityLiving) this).tasks.addTask(9, (EntityAIBase) new EntityAILookIdle((EntityLiving) this)); + ((EntityLiving) this).tasks.addTask(8, (EntityAIBase) new EntityAIWatchClosest((EntityLiving) this, Nex.class, 8.0F, 0.02F)); addTargetTasks(true); } + @Override public void attackEntityWithRangedAttack(EntityLivingBase target, float distanceFactor) { } - public void setupNPCGender() { - this.familyInfo.setMale(true); - } - + @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(200.0D); getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2D); } + @Override public LOTRFaction getFaction() { return LOTRFaction.UTUMNO; } + @Override public String getNPCName() { return entity_name; } - + @Override public String getNPCFormattedName(String npcName, String entityName) { return entity_name; } - protected void onAttackModeChange(LOTREntityNPC.AttackMode mode, boolean mounted) { - } - + @Override protected void dropFewItems(boolean flag, int i) { } + @Override public boolean getCanSpawnHere() { return false; } + @Override public String getSpeechBank(EntityPlayer entityplayer) { return "nex/shadow"; } + @Override public void setupNPCName() { } @@ -99,4 +82,49 @@ public class NexShadow extends LOTREntityMan { public ItemStack getPickedResult(MovingObjectPosition target) { return null; } + + @Override + public void onUpdate() { + super.onUpdate(); + checkInsideIceCage(); + } + + public void checkInsideIceCage() { + int x = MathHelper.floor_double(this.posX); + int y = MathHelper.floor_double(this.posY); + int z = MathHelper.floor_double(this.posZ); + + Block blockAtFeet = this.worldObj.getBlock(x, y, z); + Block blockAtHead = this.worldObj.getBlock(x, y + 1, z); + + if (blockAtFeet == CinderLoE.iceCage || blockAtHead == CinderLoE.iceCage) { + onBoundUpdate(x, y, z); + Utilities.setEntityInvulnerable(this, true); + System.out.println("Nex Shadow vulnerable: " + this.isEntityInvulnerable()); + } else { + onUnboundUpdate(); + Utilities.setEntityInvulnerable(this, false); + System.out.println("Nex Shadow vulnerable: " + this.isEntityInvulnerable()); + } + } + + public void onBoundUpdate(int x, int y, int z) { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.setPosition(x + 0.5, y, z + 0.5); + } + + public void onUnboundUpdate() { + List players = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(100.0D, 100.0D, 100.0D)); + + for (EntityPlayer player : players) { + int playerLightLevel = this.worldObj.getBlockLightValue(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)); + double playerDistanceY = player.posY - this.posY; + + if (playerLightLevel < 4 && Math.abs(playerDistanceY) <= 4.0D) { + player.addPotionEffect(new PotionEffect(Potion.blindness.id, 100)); // 5 seconds of blindness + } + } + } } diff --git a/src/main/java/com/zivilon/cinder_loe/entity/NexToxin.java b/src/main/java/com/zivilon/cinder_loe/entity/NexToxin.java new file mode 100644 index 0000000..80e3e03 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/NexToxin.java @@ -0,0 +1,26 @@ +package com.zivilon.cinder_loe.entity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public class NexToxin extends NexShadow { + public String entity_name = "§2Hloirë"; + + public NexToxin(World world) { + super(world); + } + + @Override + public String getNPCName() { + return entity_name; + } + @Override + public String getNPCFormattedName(String npcName, String entityName) { + return entity_name; + } + + @Override + public String getSpeechBank(EntityPlayer entityplayer) { + return "nex/toxin"; + } +} diff --git a/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java b/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java index 6022ae8..0f5247b 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java +++ b/src/main/java/com/zivilon/cinder_loe/items/CinderLoESpawnEgg.java @@ -92,6 +92,11 @@ public class CinderLoESpawnEgg extends Item { ENTITY_CLASSES.add(CorruptHobbit.class); ENTITY_CLASSES.add(CorruptMan.class); ENTITY_CLASSES.add(CorruptOrc.class); + ENTITY_CLASSES.add(NexShadow.class); + ENTITY_CLASSES.add(NexIce.class); + ENTITY_CLASSES.add(NexFire.class); + ENTITY_CLASSES.add(NexToxin.class); + ENTITY_CLASSES.add(Nex.class); } @Override diff --git a/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java b/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java index 74bdebf..8c5df91 100644 --- a/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java +++ b/src/main/java/com/zivilon/cinder_loe/items/ToxicCore.java @@ -10,7 +10,7 @@ public class ToxicCore extends Item { this.setUnlocalizedName("lotr:toxicCore"); this.setTextureName("lotr:toxic_core"); setCreativeTab(LoECreativeTabs.tabMiscLoE); - this.setMaxDamage(100); + this.setMaxDamage(10000); this.setNoRepair(); this.setMaxStackSize(1); } diff --git a/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityNexIceCrystal.java b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityNexIceCrystal.java new file mode 100644 index 0000000..20fcbc9 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/tileentity/TileEntityNexIceCrystal.java @@ -0,0 +1,7 @@ +package com.zivilon.cinder_loe.tileentity; + +import net.minecraft.tileentity.TileEntity; + +public class TileEntityNexIceCrystal extends TileEntity { + // Add any data or logic specific to the tile entity here +} diff --git a/src/main/java/com/zivilon/cinder_loe/util/Utilities.java b/src/main/java/com/zivilon/cinder_loe/util/Utilities.java index 613f923..85c9fcb 100644 --- a/src/main/java/com/zivilon/cinder_loe/util/Utilities.java +++ b/src/main/java/com/zivilon/cinder_loe/util/Utilities.java @@ -21,11 +21,13 @@ import lotr.common.item.LOTRItemArmor; import lotr.common.item.LOTRMaterial; import lotr.common.enchant.LOTREnchantment; import lotr.common.enchant.LOTREnchantmentHelper; -import net.minecraft.item.ItemStack; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; public class Utilities { @@ -199,4 +201,10 @@ public class Utilities { return true; } + public static void setEntityInvulnerable(EntityLiving entity, boolean invulnerable) { + NBTTagCompound nbt = new NBTTagCompound(); + entity.writeToNBT(nbt); + nbt.setBoolean("Invulnerable", invulnerable); + entity.readFromNBT(nbt); + } } diff --git a/src/main/resources/assets/cinder_loe/mob/nex/fire.png b/src/main/resources/assets/cinder_loe/mob/nex/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..f3837fc8bef4de6edc31db3cfc156439b8da8763 GIT binary patch literal 6362 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 b*Mb`Y?UMecx-YIyg?&rz6!VS=vlsps(K0hx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cinder_loe/mob/nex/toxin.png b/src/main/resources/assets/cinder_loe/mob/nex/toxin.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf70d83bc36c01d91138e4d8a31462b1c6a342a GIT binary patch literal 6353 zcmeHMdsGuw8lOBM51`7+2SteS1>z(#lT2O`1qqLcSQHesyJwvw6P!vOB!L81TYS}m z9;>T;Eb5lxy0z+YtJYd|Td`_U>-N-kT~YT?s@rOBUA$V z3D9nX%B%>k^&#{>gDU2JKIJ1wJUoTld~;E;j8Nd1LZt(Lj8GdeodHwHFv6h14Fm@3 z^BTJ&0#`(W+(&}gY>Z(}Y@lIIY(LCt67&V3cv)p4d-M}~@Zj--m<6nFsNcvsKncd) z+1lBT44j;2&Vz+mf#9R_0+NG>BO^tT5n_=@B$0@v(FrlpQBl!DB9z{|i&Ile?f>hv{FAzpVio_CW6d3Fs$SNh^3k4AoLLtm9f_X$3 z8xc1g&yI|rMv3H=3B=;HZ;D4u+I2W_`so`ZRTj?@iFDB5Aw!c!jUJPhK2}X?v^u>Z z$CR6wUtpeGQaWR1*{s=ftTx(SK970M>#M5v2Wl29UAFwi6))A*|7zX(S6+SX^-{1P-_MIQ^{*&d!@(hNv&SR0tx3LmuQYe-z~`3F95zMKv1D|Nxqjv5_Brkw)?HWIFYegBbh}La ze64Q0F8x43U1y;bwHS4OZ#nqOmk;`Di9iT?@}gw*p^!}^RoAa)f32aym?Gq%j?wnqfZ}IZFui+%^SK?^}8o8oSI2} z9#NONe`ny{$NSrNH>-}=4dgS)qX$JfcD##cG$h?rSDMcFP7Wqgwr||0oB#FL`EBbC zVe7vrdv*U*Z-Qi;MG|L9+uF2@s4y{S%)8b!bp%A6FMapg@hxk%3-eY-ls0BpceKB7 z@w&Bz*@)aPZ=dYCn^86Q_PSeh3Rfoc1Q(i* zRTY-puKi@#+#gS@DLVJcJ@xX1DS?TbT_^cV_hnsgIQy(O^{oL}4F@K-A)*z{fyKMe zj{n2>*0u|W${RX5kn|5cb?1k!`v^gvDq~7#`DPVOF<4y=1!Z$tXhp!`=6+{oP7Jsy z>wMZLv(V*?(w@`Ky-hxGf;2N=000N= zqhtX`h0|*Y808$U0s8E)QZD06eDjU+S@8WT$K|1AYK2;Xp}7I3nvhSB$}&ARyJ5O1 zF9ZQkM)^FS&uvgD{eHi~uTr=?^b7>tyKo<{4s+*>!K$dpU~*Zj*zn9IqnuseU~^d+n}O>R z7->~mv=mB{Ito>jvW^^wjNMsr`Jb0tuzY-;0gwCv=%*yYgKBL z(&z|OZPV&dJ%(FQwO*wsHFliBDRmEsXFLpKB~{TgDi+EHP$U#RWwD@y9-{$DL!f%n zW<#~KomOcy8eFZ>b5J&`AwZ!izMo`ZDgzb_pM@)O*%*6G zZ`SO~Bg+JP*zy9#3+vZ#L%}zygsu!e1s^LI?p2b>xR=5}S%Vb3R5cykZ@>ypS?5vC zavDyLP`ZZ4nMb4oPOAvJiY8IDRS)}z6IxV9Xh~E{S}Yn8E-3a8t1fh}%kJ}29y+@m zbOfy+J-M5kEUk=j+FX8bI;UEfy?-9f?gL1MVgyQ%r37KXNrM`bE1x_)TB9a`q8_!8 zqz2McuSF>p0j~|NgT%4vHKa9|o?YSoXL?*7{scK4imAf+fQRxSL@`sz9*N-%%~U?L zakv{3$FIT@@eNv!L#{JpVFIS%w z=#z1OcKy%fl6Kz~X(xQi^TSi_ zUW;q14F*L%b5XA7ikLq*H8HXD`f?cZn@!oJf%AWBJuRulqO%U0+=+MIXqj>Ev)Fne zgZtyx=NE3UM_eO$@WcZW(K+Xj|U_Gupf0cJ)cAT+w@m=xl8^9 DU~oi_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png b/src/main/resources/assets/lotr/textures/blocks/nex_ice_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..571d58d1ffdc69f665195bac49ed2c942b69a297 GIT binary patch literal 6683 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 literal 0 HcmV?d00001