From 00080331dfefef324d5318b8f1a51eede962e2b8 Mon Sep 17 00:00:00 2001 From: WinDanesz <31292708+WinDanesz@users.noreply.github.com> Date: Fri, 8 Jul 2022 22:18:59 +0200 Subject: [PATCH] feat: Reworked the Summon Iron Golem spell, its new name is Summon Spectral Golem --- .../wizardry/client/ClientProxy.java | 2 + .../client/renderer/RenderSpectralGolem.java | 52 +++++ .../entity/living/EntitySpectralGolem.java | 192 ++++++++++++++++++ .../electroblob/wizardry/registry/Spells.java | 3 +- .../wizardry/registry/WizardryEntities.java | 1 + .../wizardry/spell/SummonIronGolem.java | 51 ----- .../assets/ebwizardry/lang/en_us.lang | 3 +- .../ebwizardry/spells/summon_iron_golem.json | 2 + .../textures/entity/spectral_golem.png | Bin 0 -> 9114 bytes .../textures/spells/summon_iron_golem.png | Bin 2597 -> 5215 bytes 10 files changed, 253 insertions(+), 53 deletions(-) create mode 100644 src/main/java/electroblob/wizardry/client/renderer/RenderSpectralGolem.java create mode 100644 src/main/java/electroblob/wizardry/entity/living/EntitySpectralGolem.java delete mode 100644 src/main/java/electroblob/wizardry/spell/SummonIronGolem.java create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/spectral_golem.png diff --git a/src/main/java/electroblob/wizardry/client/ClientProxy.java b/src/main/java/electroblob/wizardry/client/ClientProxy.java index 0ce0099f..7e9545dd 100644 --- a/src/main/java/electroblob/wizardry/client/ClientProxy.java +++ b/src/main/java/electroblob/wizardry/client/ClientProxy.java @@ -20,6 +20,7 @@ import electroblob.wizardry.client.model.ModelSageArmour; import electroblob.wizardry.client.model.ModelWizardArmour; import electroblob.wizardry.client.particle.*; import electroblob.wizardry.client.particle.ParticleWizardry.IWizardryParticleFactory; +import electroblob.wizardry.client.renderer.RenderSpectralGolem; import electroblob.wizardry.client.renderer.entity.*; import electroblob.wizardry.client.renderer.entity.layers.*; import electroblob.wizardry.client.renderer.overlay.RenderBlinkEffect; @@ -771,6 +772,7 @@ public class ClientProxy extends CommonProxy { RenderingRegistry.registerEntityRenderingHandler(EntityIceGiant.class, RenderIceGiant::new); RenderingRegistry.registerEntityRenderingHandler(EntityPhoenix.class, RenderPhoenix::new); + RenderingRegistry.registerEntityRenderingHandler(EntitySpectralGolem.class, RenderSpectralGolem::new); // Projectiles RenderingRegistry.registerEntityRenderingHandler(EntityMagicMissile.class, manager -> new RenderMagicArrow(manager, diff --git a/src/main/java/electroblob/wizardry/client/renderer/RenderSpectralGolem.java b/src/main/java/electroblob/wizardry/client/renderer/RenderSpectralGolem.java new file mode 100644 index 00000000..fabb514a --- /dev/null +++ b/src/main/java/electroblob/wizardry/client/renderer/RenderSpectralGolem.java @@ -0,0 +1,52 @@ +package electroblob.wizardry.client.renderer; + +import electroblob.wizardry.Wizardry; +import net.minecraft.client.model.ModelIronGolem; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderSpectralGolem extends RenderLiving +{ + private static final ResourceLocation SPECTRAL_GOLEM_TEXTURES = new ResourceLocation(Wizardry.MODID, "textures/entity/spectral_golem.png"); + + public RenderSpectralGolem(RenderManager renderManagerIn) + { + super(renderManagerIn, new ModelIronGolem(), 0.5F); + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityIronGolem entity) + { + return SPECTRAL_GOLEM_TEXTURES; + } + + @Override + protected void preRenderCallback(EntityIronGolem entity, float partialTickTime){ + super.preRenderCallback(entity, partialTickTime); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GlStateManager.color(1, 1, 1, 0.7f); + } + + protected void applyRotations(EntityIronGolem entityLiving, float ageInTicks, float rotationYaw, float partialTicks) + { + super.applyRotations(entityLiving, ageInTicks, rotationYaw, partialTicks); + + if ((double)entityLiving.limbSwingAmount >= 0.01D) + { + float f = 13.0F; + float f1 = entityLiving.limbSwing - entityLiving.limbSwingAmount * (1.0F - partialTicks) + 6.0F; + float f2 = (Math.abs(f1 % 13.0F - 6.5F) - 3.25F) / 3.25F; + GlStateManager.rotate(6.5F * f2, 0.0F, 0.0F, 1.0F); + } + } +} \ No newline at end of file diff --git a/src/main/java/electroblob/wizardry/entity/living/EntitySpectralGolem.java b/src/main/java/electroblob/wizardry/entity/living/EntitySpectralGolem.java new file mode 100644 index 00000000..0176e1ad --- /dev/null +++ b/src/main/java/electroblob/wizardry/entity/living/EntitySpectralGolem.java @@ -0,0 +1,192 @@ +package electroblob.wizardry.entity.living; + +import electroblob.wizardry.Wizardry; +import electroblob.wizardry.util.ParticleBuilder; +import net.minecraft.entity.EntityFlying; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIAttackMelee; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookAtVillager; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIMoveThroughVillage; +import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; +import net.minecraft.entity.ai.EntityAIMoveTowardsTarget; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAIWanderAvoidWater; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataParameter; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; + +import java.util.UUID; + +public class EntitySpectralGolem extends EntityIronGolem implements ISummonedCreature { + + private static final DataParameter SPAWN_PARTICLES = EntityDataManager.createKey(EntitySpectralGolem.class, DataSerializers.BOOLEAN); + + // Field implementations + private int lifetime = -1; + private UUID casterUUID; + + // Setter + getter implementations + @Override public int getLifetime(){ return lifetime; } + @Override public void setLifetime(int lifetime){ this.lifetime = lifetime; } + @Override public UUID getOwnerId(){ return casterUUID; } + @Override public void setOwnerId(UUID uuid){ this.casterUUID = uuid; } + + /** Creates a new golem minion in the given world. */ + public EntitySpectralGolem(World world){ + super(world); + this.experienceValue = 0; + } + + @Override + protected void entityInit(){ + super.entityInit(); + this.dataManager.register(SPAWN_PARTICLES, true); + } + + @Override + protected void initEntityAI() { + this.tasks.addTask(1, new EntityAIAttackMelee(this, 1.0D, true)); + this.tasks.addTask(2, new EntityAIMoveTowardsTarget(this, 0.9D, 32.0F)); + this.tasks.addTask(3, new EntityAIMoveThroughVillage(this, 0.6D, true)); + this.tasks.addTask(4, new EntityAIMoveTowardsRestriction(this, 1.0D)); + this.tasks.addTask(5, new EntityAILookAtVillager(this)); + this.tasks.addTask(6, new EntityAIWanderAvoidWater(this, 0.6D)); + this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); + this.tasks.addTask(8, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityLivingBase.class, + 0, false, true, this.getTargetSelector())); + } + + @Override protected void setEquipmentBasedOnDifficulty(DifficultyInstance difficulty){} // They don't have equipment! + + // Implementations + + @Override + public void setRevengeTarget(EntityLivingBase entity){ + if(this.shouldRevengeTarget(entity)) super.setRevengeTarget(entity); + } + + @Override + public void onUpdate(){ + super.onUpdate(); + this.updateDelegate(); + + // Adds a dust particle effect + if(this.world.isRemote){ + double x = this.posX - this.width / 2 + this.rand.nextFloat() * width; + double y = this.posY + this.height * this.rand.nextFloat() + 0.2f; + double z = this.posZ - this.width / 2 + this.rand.nextFloat() * width; + ParticleBuilder.create(ParticleBuilder.Type.DUST).pos(x, y, z).clr(0.7f, 0.9f, 1).shaded(true).spawn(world); + } + + } + + @Override + public void onSpawn(){ + if(this.dataManager.get(SPAWN_PARTICLES)) this.spawnParticleEffect(); + } + + @Override + public void onDespawn(){ + this.spawnParticleEffect(); + } + + private void spawnParticleEffect(){ + if(this.world.isRemote){ + for(int i = 0; i < 15; i++){ + this.world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, this.posX + this.rand.nextFloat() - 0.5f, + this.posY + this.rand.nextFloat() * 2, this.posZ + this.rand.nextFloat() - 0.5f, 0, 0, 0); + } + } + } + + @Override + public boolean hasParticleEffect(){ + return true; + } + + @Override + public boolean hasAnimation(){ + return this.dataManager.get(SPAWN_PARTICLES) || this.ticksExisted > 20; + } + + public void hideParticles(){ + this.dataManager.set(SPAWN_PARTICLES, false); + } + + @Override + protected boolean processInteract(EntityPlayer player, EnumHand hand){ + // In this case, the delegate method determines whether super is called. + // Rather handily, we can make use of Java's short-circuiting method of evaluating OR statements. + return this.interactDelegate(player, hand) || super.processInteract(player, hand); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbttagcompound){ + super.writeEntityToNBT(nbttagcompound); + this.writeNBTDelegate(nbttagcompound); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbttagcompound){ + super.readEntityFromNBT(nbttagcompound); + this.readNBTDelegate(nbttagcompound); + } + + // Recommended overrides + + @Override protected int getExperiencePoints(EntityPlayer player){ return 0; } + @Override protected boolean canDropLoot(){ return false; } + @Override protected Item getDropItem(){ return null; } + @Override protected ResourceLocation getLootTable(){ return null; } + @Override public boolean canPickUpLoot(){ return false; } + + // This vanilla method has nothing to do with the custom despawn() method. + @Override protected boolean canDespawn(){ + return getCaster() == null && getOwnerId() == null; + } + + @Override + public boolean getCanSpawnHere(){ + return this.world.getDifficulty() != EnumDifficulty.PEACEFUL; + } + + @Override + public boolean canAttackClass(Class entityType){ + // Returns true unless the given entity type is a flying entity. + return !EntityFlying.class.isAssignableFrom(entityType); + } + + @Override + public ITextComponent getDisplayName(){ + if(getCaster() != null){ + return new TextComponentTranslation(NAMEPLATE_TRANSLATION_KEY, getCaster().getName(), + new TextComponentTranslation("entity." + this.getEntityString() + ".name")); + }else{ + return super.getDisplayName(); + } + } + + @Override + public boolean hasCustomName(){ + // If this returns true, the renderer will show the nameplate when looking directly at the entity + return Wizardry.settings.summonedCreatureNames && getCaster() != null; + } + +} \ No newline at end of file diff --git a/src/main/java/electroblob/wizardry/registry/Spells.java b/src/main/java/electroblob/wizardry/registry/Spells.java index 2e7a544b..69043db9 100644 --- a/src/main/java/electroblob/wizardry/registry/Spells.java +++ b/src/main/java/electroblob/wizardry/registry/Spells.java @@ -378,7 +378,8 @@ public final class Spells { registry.register(new SpellMinion<>("silverfish_swarm", EntitySilverfishMinion::new).soundValues(1, 1.1f, 0.1f)); registry.register(new SpellConstructRanged<>("black_hole", EntityBlackHole::new, false).addProperties(Spell.EFFECT_RADIUS).soundValues(2, 0.7f, 0)); registry.register(new Shockwave()); - registry.register(new SummonIronGolem()); + registry.register(new SpellMinion<>("summon_iron_golem", EntitySpectralGolem::new).soundValues(1, 1.1f, 0.1f)); + registry.register(new ArrowRain()); registry.register(new SpellBuff("diamondflesh", 0.1f, 0.7f, 1, () -> WizardryPotions.diamondflesh).soundValues(0.7f, 1.2f, 0.4f)); registry.register(new SpellBuff("font_of_vitality", 1, 0.8f, 0.3f, () -> MobEffects.ABSORPTION, () -> MobEffects.REGENERATION).soundValues(0.7f, 1.2f, 0.4f)); diff --git a/src/main/java/electroblob/wizardry/registry/WizardryEntities.java b/src/main/java/electroblob/wizardry/registry/WizardryEntities.java index 25e7d9e6..eac1b5ea 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryEntities.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryEntities.java @@ -88,6 +88,7 @@ public class WizardryEntities { registry.register(createEntry(EntitySpiritHorse.class, "spirit_horse", TrackingType.LIVING).egg(0x5464c6, 0xbcc2e8).build()); registry.register(createEntry(EntityPhoenix.class, "phoenix", TrackingType.LIVING).egg(0xff4900, 0xfde535).build()); registry.register(createEntry(EntityIceGiant.class, "ice_giant", TrackingType.LIVING).egg(0x5bacd9, 0xeffaff).build()); + registry.register(createEntry(EntitySpectralGolem.class, "spectral_golem", TrackingType.LIVING).egg(0x5bacd9, 0xeffaff).build()); registry.register(createEntry(EntityMagicSlime.class, "magic_slime", TrackingType.LIVING).build()); registry.register(createEntry(EntityDecoy.class, "decoy", TrackingType.LIVING).build()); diff --git a/src/main/java/electroblob/wizardry/spell/SummonIronGolem.java b/src/main/java/electroblob/wizardry/spell/SummonIronGolem.java deleted file mode 100644 index a93c57b8..00000000 --- a/src/main/java/electroblob/wizardry/spell/SummonIronGolem.java +++ /dev/null @@ -1,51 +0,0 @@ -package electroblob.wizardry.spell; - -import electroblob.wizardry.item.SpellActions; -import electroblob.wizardry.util.BlockUtils; -import electroblob.wizardry.util.ParticleBuilder; -import electroblob.wizardry.util.ParticleBuilder.Type; -import electroblob.wizardry.util.SpellModifiers; -import net.minecraft.entity.monster.EntityIronGolem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class SummonIronGolem extends Spell { - - public SummonIronGolem(){ - super("summon_iron_golem", SpellActions.SUMMON, false); - addProperties(SpellMinion.SUMMON_RADIUS); - soundValues(1, 1.1f, 0.2f); - } - - @Override - public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){ - - BlockPos pos = BlockUtils.findNearbyFloorSpace(caster, getProperty(SpellMinion.SUMMON_RADIUS).intValue(), - getProperty(SpellMinion.SUMMON_RADIUS).intValue()); - - if(pos == null) return false; - - if(!world.isRemote){ - - EntityIronGolem golem = new EntityIronGolem(world); - golem.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - golem.setPlayerCreated(true); - world.spawnEntity(golem); - - }else{ - - for(int i=0; i<10; i++){ - double x = pos.getX() + world.rand.nextDouble() * 2 - 1; - double y = pos.getY() + 0.5 + world.rand.nextDouble(); - double z = pos.getZ() + world.rand.nextDouble() * 2 - 1; - ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).clr(0.6f, 0.6f, 1).spawn(world); - } - } - - this.playSound(world, caster, ticksInUse, -1, modifiers); - return true; - } - -} diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index 6e8c8eeb..d356dd20 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -733,6 +733,7 @@ entity.ebwizardry\:evil_wizard.name=Wizard entity.ebwizardry\:decoy.name=Decoy entity.ebwizardry\:vex_minion.name=Vex entity.ebwizardry\:remnant.name=Remnant +entity.ebwizardry\:spectral_golem.name=Spectral Golem entity.ebwizardry\:magic_missile.name=Magic entity.ebwizardry\:arc.name=Magic @@ -1077,7 +1078,7 @@ spell.ebwizardry\:stormcloud=Stormcloud spell.ebwizardry\:summon_blaze=Summon Blaze spell.ebwizardry\:summon_ice_giant=Summon Ice Giant spell.ebwizardry\:summon_ice_wraith=Summon Ice Wraith -spell.ebwizardry\:summon_iron_golem=Summon Iron Golem +spell.ebwizardry\:summon_iron_golem=Summon Spectral Golem spell.ebwizardry\:summon_lightning_wraith=Summon Lightning Wraith spell.ebwizardry\:summon_phoenix=Summon Phoenix spell.ebwizardry\:summon_shadow_wraith=Summon Shadow Wraith diff --git a/src/main/resources/assets/ebwizardry/spells/summon_iron_golem.json b/src/main/resources/assets/ebwizardry/spells/summon_iron_golem.json index fca50afc..06645e1a 100644 --- a/src/main/resources/assets/ebwizardry/spells/summon_iron_golem.json +++ b/src/main/resources/assets/ebwizardry/spells/summon_iron_golem.json @@ -17,6 +17,8 @@ "chargeup": 20, "cooldown": 400, "base_properties": { + "minion_lifetime": 600, + "minion_count": 1, "summon_radius": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/textures/entity/spectral_golem.png b/src/main/resources/assets/ebwizardry/textures/entity/spectral_golem.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1ea9d3b7381fec052d3eb29e93cc1d81e22920 GIT binary patch literal 9114 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 W`J}r$H=Tijfx*+&&t;ucLK6V!V%o_7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/spells/summon_iron_golem.png b/src/main/resources/assets/ebwizardry/textures/spells/summon_iron_golem.png index bcebc77d797570ba0a4d48967fb1db9cd88ce85c..ada6358375846c9f2653dc31621b72efb7af3b6a 100644 GIT binary patch literal 5215 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9GG!XV7ZFl&wk z0|S?Trn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st+~PJA;B-jY`@?8;^f`YFvUAR zNR&e%$f>(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D 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 delta 2568 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 G2~7Z&r0A9a