From c201beb87f2c7c6b37c0aa4ce370d0c169b60ade Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 14 Aug 2016 14:14:25 -0400 Subject: [PATCH] Added some baseline work for Sentient Specters, which are basically summons of the Sentient Weaponry. --- .../render/entity/RenderSentientSpecter.java | 173 ++++++++++++++++++ .../entity/SentientSpecterRenderFactory.java | 15 ++ .../entity/mob/EntitySentientSpecter.java | 100 ++++++++++ .../item/soul/ItemSentientSword.java | 13 +- .../bloodmagic/proxy/ClientProxy.java | 5 +- .../bloodmagic/registry/ModEntities.java | 2 + .../bloodmagic/textures/entities/specter.png | Bin 0 -> 213 bytes 7 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java create mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/specter.png diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java new file mode 100644 index 00000000..bae76231 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java @@ -0,0 +1,173 @@ +package WayofTime.bloodmagic.client.render.entity; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.RenderBiped; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.layers.LayerArrow; +import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; +import net.minecraft.client.renderer.entity.layers.LayerCustomHead; +import net.minecraft.client.renderer.entity.layers.LayerHeldItem; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHandSide; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; + +@SideOnly(Side.CLIENT) +public class RenderSentientSpecter extends RenderBiped +{ + public static final ResourceLocation texture = new ResourceLocation("bloodmagic", "textures/entities/specter.png"); + + public RenderSentientSpecter(RenderManager renderManager) + { + super(renderManager, new ModelBiped(0.0F), 0.5F); + this.addLayer(new LayerBipedArmor(this)); + this.addLayer(new LayerHeldItem(this)); + this.addLayer(new LayerArrow(this)); + this.addLayer(new LayerCustomHead(this.getMainModel().bipedHead)); + } + + public ModelBiped getMainModel() + { + return (ModelBiped) super.getMainModel(); + } + + /** + * Renders the desired {@code T} type Entity. + */ + public void doRender(EntitySentientSpecter entity, double x, double y, double z, float entityYaw, float partialTicks) + { +// if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderPlayerEvent.Pre(entity, this, partialTicks, x, y, z))) +// return; +// if (!entity.isUser() || this.renderManager.renderViewEntity == entity) + { + double d0 = y; + + this.setModelVisibilities(entity); +// GlStateManager.enableBlendProfile(GlStateManager.Profile.PLAYER_SKIN); + super.doRender(entity, x, d0, z, entityYaw, partialTicks); +// GlStateManager.disableBlendProfile(GlStateManager.Profile.PLAYER_SKIN); + } +// net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderPlayerEvent.Post(entity, this, partialTicks, x, y, z)); + } + + private void setModelVisibilities(EntitySentientSpecter clientPlayer) + { + ModelBiped modelplayer = this.getMainModel(); + + ItemStack itemstack = clientPlayer.getHeldItemMainhand(); + ItemStack itemstack1 = clientPlayer.getHeldItemOffhand(); + modelplayer.setInvisible(true); + + modelplayer.isSneak = clientPlayer.isSneaking(); + ModelBiped.ArmPose modelbiped$armpose = ModelBiped.ArmPose.EMPTY; + ModelBiped.ArmPose modelbiped$armpose1 = ModelBiped.ArmPose.EMPTY; + + if (itemstack != null) + { + modelbiped$armpose = ModelBiped.ArmPose.ITEM; + + if (clientPlayer.getItemInUseCount() > 0) + { + EnumAction enumaction = itemstack.getItemUseAction(); + + if (enumaction == EnumAction.BLOCK) + { + modelbiped$armpose = ModelBiped.ArmPose.BLOCK; + } else if (enumaction == EnumAction.BOW) + { + modelbiped$armpose = ModelBiped.ArmPose.BOW_AND_ARROW; + } + } + } + + if (itemstack1 != null) + { + modelbiped$armpose1 = ModelBiped.ArmPose.ITEM; + + if (clientPlayer.getItemInUseCount() > 0) + { + EnumAction enumaction1 = itemstack1.getItemUseAction(); + + if (enumaction1 == EnumAction.BLOCK) + { + modelbiped$armpose1 = ModelBiped.ArmPose.BLOCK; + } + } + } + + if (clientPlayer.getPrimaryHand() == EnumHandSide.RIGHT) + { + modelplayer.rightArmPose = modelbiped$armpose; + modelplayer.leftArmPose = modelbiped$armpose1; + } else + { + modelplayer.rightArmPose = modelbiped$armpose1; + modelplayer.leftArmPose = modelbiped$armpose; + } + + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called + * unless you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntitySentientSpecter entity) + { + return texture; + } + + public void transformHeldFull3DItemLayer() + { + GlStateManager.translate(0.0F, 0.1875F, 0.0F); + } + + /** + * Allows the render to do state modifications necessary before the model is + * rendered. + */ + protected void preRenderCallback(EntitySentientSpecter entitylivingbaseIn, float partialTickTime) + { + float f = 0.9375F; + GlStateManager.scale(0.9375F, 0.9375F, 0.9375F); + } + +// public void renderRightArm(EntitySentientSpecter clientPlayer) +// { +// float f = 1.0F; +// GlStateManager.color(1.0F, 1.0F, 1.0F); +// float f1 = 0.0625F; +// ModelBiped modelplayer = this.getMainModel(); +// this.setModelVisibilities(clientPlayer); +// GlStateManager.enableBlend(); +// modelplayer.swingProgress = 0.0F; +// modelplayer.isSneak = false; +// modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer); +// modelplayer.bipedRightArm.rotateAngleX = 0.0F; +// modelplayer.bipedRightArm.render(0.0625F); +// modelplayer.bipedRightArmwear.rotateAngleX = 0.0F; +// modelplayer.bipedRightArmwear.render(0.0625F); +// GlStateManager.disableBlend(); +// } +// +// public void renderLeftArm(EntitySentientSpecter clientPlayer) +// { +// float f = 1.0F; +// GlStateManager.color(1.0F, 1.0F, 1.0F); +// float f1 = 0.0625F; +// ModelBiped modelplayer = this.getMainModel(); +// this.setModelVisibilities(clientPlayer); +// GlStateManager.enableBlend(); +// modelplayer.isSneak = false; +// modelplayer.swingProgress = 0.0F; +// modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer); +// modelplayer.bipedLeftArm.rotateAngleX = 0.0F; +// modelplayer.bipedLeftArm.render(0.0625F); +// modelplayer.bipedLeftArmwear.rotateAngleX = 0.0F; +// modelplayer.bipedLeftArmwear.render(0.0625F); +// GlStateManager.disableBlend(); +// } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java new file mode 100644 index 00000000..e06af0c2 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java @@ -0,0 +1,15 @@ +package WayofTime.bloodmagic.client.render.entity; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraftforge.fml.client.registry.IRenderFactory; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; + +public class SentientSpecterRenderFactory implements IRenderFactory +{ + @Override + public Render createRenderFor(RenderManager manager) + { + return new RenderSentientSpecter(manager); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java new file mode 100644 index 00000000..2f2575ee --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java @@ -0,0 +1,100 @@ +package WayofTime.bloodmagic.entity.mob; + +import net.minecraft.block.Block; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIAttackMelee; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.item.EntityBoat; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathNavigateGround; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class EntitySentientSpecter extends EntityMob +{ + public EntitySentientSpecter(World worldIn) + { + super(worldIn); + this.setSize(0.6F, 1.95F); +// ((PathNavigateGround) getNavigator()).setCanSwim(false); + this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(2, new EntityAIAttackMelee(this, 1, false)); +// this.tasks.addTask(2, new AIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); +// this.tasks.addTask(3, new AIAttackOnCollide(this, EntityVillager.class, 1.0D, true)); + this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); + this.tasks.addTask(7, new EntityAILookIdle(this)); +// this.tasks.addTask(8, new AIAttackOnCollide(this, EntityAnimal.class, 1.0D, false)); + this.targetTasks.addTask(0, new EntityAIHurtByTarget(this, true, new Class[0])); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityVillager.class, false)); + this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityAnimal.class, false)); + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(40.0D); + getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(6.0D); + getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.27D); + } + + @Override + public void writeEntityToNBT(NBTTagCompound tag) + { + super.writeEntityToNBT(tag); + } + + @Override + public void readEntityFromNBT(NBTTagCompound tag) + { + super.readEntityFromNBT(tag); + } + + @Override + protected SoundEvent getAmbientSound() + { + return SoundEvents.ENTITY_COW_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound() + { + return SoundEvents.ENTITY_COW_HURT; + } + + @Override + protected SoundEvent getDeathSound() + { + return SoundEvents.ENTITY_COW_DEATH; + } + + @Override + protected void playStepSound(BlockPos pos, Block block) + { + this.playSound(SoundEvents.ENTITY_COW_STEP, 0.15F, 1.0F); + } + + /** + * Returns the volume for the sounds this mob makes. + */ + @Override + protected float getSoundVolume() + { + return 0.4F; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java index 73f5de59..33788ad4 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java @@ -39,6 +39,7 @@ import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.registry.ModItems; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -69,6 +70,8 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public static double[] movementSpeed = new double[] { 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4 }; + public static final boolean spawnSpecterOnClick = false; + public ItemSentientSword() { super(ModItems.soulToolMaterial); @@ -160,7 +163,7 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM } } - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityPlayer attacker) + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, EntityLivingBase target, EntityLivingBase attacker) { switch (type) { @@ -244,6 +247,14 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { recalculatePowers(stack, world, player); + if (!world.isRemote && spawnSpecterOnClick) + { + EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); + specterEntity.setPosition(player.posX, player.posY, player.posZ); + world.spawnEntityInWorld(specterEntity); + System.out.println("Spawning Specter..."); + specterEntity.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, new ItemStack(ModItems.sentientSword)); + } return super.onItemRightClick(stack, world, player, hand); } diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index a899795d..185b07e4 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,7 +1,6 @@ package WayofTime.bloodmagic.proxy; import java.awt.Color; -import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -11,7 +10,6 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionUtils; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; @@ -38,7 +36,9 @@ import WayofTime.bloodmagic.client.render.RenderItemRoutingNode; import WayofTime.bloodmagic.client.render.entity.BloodLightRenderFactory; import WayofTime.bloodmagic.client.render.entity.MeteorRenderFactory; import WayofTime.bloodmagic.client.render.entity.SentientArrowRenderFactory; +import WayofTime.bloodmagic.client.render.entity.SentientSpecterRenderFactory; import WayofTime.bloodmagic.client.render.entity.SoulSnareRenderFactory; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; @@ -97,6 +97,7 @@ public class ClientProxy extends CommonProxy RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); RenderingRegistry.registerEntityRenderingHandler(EntityMeteor.class, new MeteorRenderFactory()); + RenderingRegistry.registerEntityRenderingHandler(EntitySentientSpecter.class, new SentientSpecterRenderFactory()); ShaderHelper.init(); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java index 80acbffd..e0d9bba5 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModEntities.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.registry; import net.minecraftforge.fml.common.registry.EntityRegistry; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; import WayofTime.bloodmagic.entity.projectile.EntityMeteor; import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; @@ -17,5 +18,6 @@ public class ModEntities EntityRegistry.registerModEntity(EntitySoulSnare.class, "SoulSnare", id++, BloodMagic.instance, 64, 1, true); EntityRegistry.registerModEntity(EntitySentientArrow.class, "SoulArrow", id++, BloodMagic.instance, 64, 1, true); EntityRegistry.registerModEntity(EntityMeteor.class, "Meteor", id++, BloodMagic.instance, 64, 1, true); + EntityRegistry.registerModEntity(EntitySentientSpecter.class, "SentientSpecter", id++, BloodMagic.instance, 64, 1, true); } } diff --git a/src/main/resources/assets/bloodmagic/textures/entities/specter.png b/src/main/resources/assets/bloodmagic/textures/entities/specter.png new file mode 100644 index 0000000000000000000000000000000000000000..283ca15465e9ffbbd27db110e86734c38c21589d GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPN2cMv@s;$9AC!kQ0r;B4q#jUp&7#SHDSeOmIysxpn vp|oc5mGt2AoB|3C4GfG-EF9!B8o0$mw=vfy_TBjew2i^j)z4*}Q$iB}&sZ;? literal 0 HcmV?d00001