From 8b86bb1b31f6d4218f5543b02caa0bfcdd94cca4 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Fri, 16 Oct 2020 19:42:56 +0100 Subject: [PATCH] Add Lokenzen's ring --- .../entity/construct/EntityStormcloud.java | 48 +++++++++++++----- .../wizardry/registry/WizardryItems.java | 2 + .../assets/ebwizardry/lang/en_gb.lang | 2 + .../assets/ebwizardry/lang/en_us.lang | 2 + .../models/item/ring_stormcloud.json | 6 +++ .../textures/items/ring_stormcloud.png | Bin 0 -> 6469 bytes 6 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/assets/ebwizardry/models/item/ring_stormcloud.json create mode 100644 src/main/resources/assets/ebwizardry/textures/items/ring_stormcloud.png diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java b/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java index e36512de..4e5f7b6f 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java @@ -1,6 +1,8 @@ package electroblob.wizardry.entity.construct; +import electroblob.wizardry.item.ItemArtefact; import electroblob.wizardry.registry.Spells; +import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.EntityUtils; @@ -8,8 +10,12 @@ import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.ParticleBuilder; import electroblob.wizardry.util.ParticleBuilder.Type; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import java.util.Comparator; import java.util.List; public class EntityStormcloud extends EntityScaledConstruct { @@ -28,6 +34,8 @@ public class EntityStormcloud extends EntityScaledConstruct { super.onUpdate(); + this.move(MoverType.SELF, motionX, 0, motionZ); + if(this.world.isRemote){ float areaFactor = (width * width) / 36; // Ensures cloud/raindrop density stays the same for different sizes @@ -36,32 +44,44 @@ public class EntityStormcloud extends EntityScaledConstruct { .clr(0.3f, 0.3f, 0.3f).shaded(true).spawn(world); } + boolean stormcloudRingActive = getCaster() instanceof EntityPlayer && ItemArtefact.isArtefactActive((EntityPlayer)getCaster(), WizardryItems.ring_stormcloud); + List targets = world.getEntitiesWithinAABB(EntityLivingBase.class, this.getEntityBoundingBox().expand(0, -10, 0)); + targets.removeIf(t -> !this.isValidTarget(t)); + float damage = Spells.stormcloud.getProperty(Spell.DAMAGE).floatValue() * this.damageMultiplier; for(EntityLivingBase target : targets){ - if(this.isValidTarget(target)){ + if(target.ticksExisted % 150 == 0){ // Use target's lifetime so they don't all get hit at once, looks better - if(target.ticksExisted % 150 == 0){ // Use target's lifetime so they don't all get hit at once, looks better - - if(!this.world.isRemote){ - EntityUtils.attackEntityWithoutKnockback(target, MagicDamage.causeIndirectMagicDamage( - this, this.getCaster(), MagicDamage.DamageType.SHOCK), damage); - }else{ - ParticleBuilder.create(Type.LIGHTNING).pos(target.posX, posY + height/2, target.posZ) - .target(target).scale(2).spawn(world); - ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height, target.posZ); - } - - target.playSound(WizardrySounds.ENTITY_STORMCLOUD_THUNDER, 1, 1.6f); - target.playSound(WizardrySounds.ENTITY_STORMCLOUD_ATTACK, 1, 1); + if(!this.world.isRemote){ + EntityUtils.attackEntityWithoutKnockback(target, MagicDamage.causeIndirectMagicDamage( + this, this.getCaster(), MagicDamage.DamageType.SHOCK), damage); + }else{ + ParticleBuilder.create(Type.LIGHTNING).pos(target.posX, posY + height/2, target.posZ) + .target(target).scale(2).spawn(world); + ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height, target.posZ); } + + target.playSound(WizardrySounds.ENTITY_STORMCLOUD_THUNDER, 1, 1.6f); + target.playSound(WizardrySounds.ENTITY_STORMCLOUD_ATTACK, 1, 1); + + if(stormcloudRingActive) this.lifetime -= 40; // Each strike prolongs the lifetime by 2 seconds with the ring } } + if(stormcloudRingActive){ + EntityUtils.getLivingWithinRadius(width * 3, posX, posY, posZ, world).stream() + .filter(this::isValidTarget).min(Comparator.comparingDouble(this::getDistanceSq)).ifPresent(e -> { + Vec3d vel = e.getPositionVector().subtract(this.getPositionVector()).normalize().scale(0.2); + this.motionX = vel.x; + this.motionZ = vel.z; + }); + } + } } diff --git a/src/main/java/electroblob/wizardry/registry/WizardryItems.java b/src/main/java/electroblob/wizardry/registry/WizardryItems.java index 827c69e9..440c1d84 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryItems.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryItems.java @@ -229,6 +229,7 @@ public final class WizardryItems { public static final Item ring_storm = placeholder(); public static final Item ring_seeking = placeholder(); public static final Item ring_hammer = placeholder(); + public static final Item ring_stormcloud = placeholder(); public static final Item ring_soulbinding = placeholder(); public static final Item ring_leeching = placeholder(); public static final Item ring_necromancy_melee = placeholder(); @@ -599,6 +600,7 @@ public final class WizardryItems { registerItem(registry, "ring_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); registerItem(registry, "ring_seeking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING)); registerItem(registry, "ring_hammer", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING)); + registerItem(registry, "ring_stormcloud", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); registerItem(registry, "ring_soulbinding", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING)); registerItem(registry, "ring_leeching", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); registerItem(registry, "ring_necromancy_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index ea03f69f..aef87af2 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -299,6 +299,8 @@ item.ebwizardry\:ring_seeking.name=Ring of Attraction item.ebwizardry\:ring_seeking.desc=All projectile spells seek their targets item.ebwizardry\:ring_hammer.name=Ring of Thalek the Almighty item.ebwizardry\:ring_hammer.desc=Lightning hammers can be picked up and thrown +item.ebwizardry\:ring_stormcloud.name=Lokenzen's Ring +item.ebwizardry\:ring_stormcloud.desc=Stormcloud moves towards targets and lasts longer with every strike item.ebwizardry\:ring_soulbinding.name=Soulwalker's Ring item.ebwizardry\:ring_soulbinding.desc=Creatures damaged by necromancy spells become soulbound to you item.ebwizardry\:ring_leeching.name=Ring of Leeching diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index 010a52fb..27722758 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -299,6 +299,8 @@ item.ebwizardry\:ring_seeking.name=Ring of Attraction item.ebwizardry\:ring_seeking.desc=All projectile spells seek their targets item.ebwizardry\:ring_hammer.name=Ring of Thalek the Almighty item.ebwizardry\:ring_hammer.desc=Lightning hammers can be picked up and thrown +item.ebwizardry\:ring_stormcloud.name=Lokenzen's Ring +item.ebwizardry\:ring_stormcloud.desc=Stormcloud moves towards targets and lasts longer with every strike item.ebwizardry\:ring_soulbinding.name=Soulwalker's Ring item.ebwizardry\:ring_soulbinding.desc=Creatures damaged by necromancy spells become soulbound to you item.ebwizardry\:ring_leeching.name=Ring of Leeching diff --git a/src/main/resources/assets/ebwizardry/models/item/ring_stormcloud.json b/src/main/resources/assets/ebwizardry/models/item/ring_stormcloud.json new file mode 100644 index 00000000..781dd2ae --- /dev/null +++ b/src/main/resources/assets/ebwizardry/models/item/ring_stormcloud.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "ebwizardry:items/ring_stormcloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/textures/items/ring_stormcloud.png b/src/main/resources/assets/ebwizardry/textures/items/ring_stormcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d8de0520b3c710d9016999fd7527e718fc584f GIT binary patch literal 6469 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-ovT73N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsHU}k1SKs2DDa#gqv0~0MoA`51{`a3rojPzN)-F>S6K7ff2K;k)d3TZillL>sPA>>= zw=ooX_bb@)r}@rG|Cf*6-aV&y$J+ixqE+pMpGmp@j%5_~?Av-;&*5polwBc_x;@&L zqq4&s0{`sky?kS{%9M@?D?Th{Q`gp*DrBf3{bWVpGRNAhQ?(SV-mO_NQ=2=KIgv%O zbG1*=T^*AMRnN&B>?;b`8>i&!Y}w|Uz1vGr+PsVHo^wQx!PDrYdyF!ABm-Q`?rmez zn>Ue7WU{4FGUwp~9KFdQ`*~`nK2QIom2g4d*j-~r?o925e~(_C-I*e&EAb-mJ%d_q zI^zru4x0lL8W^QLY*;s)%9+B^)}x@oY}NgkDe6RZ9>YmLfuvI%OmBKEy|Oi`?h*xF$7W^a z-C3g87oBk{$y>MlRl(ACyWTI%?zjDF^B~K)O}egSp>kh}+rCKaEp;082c%@LRT!GG zzd9?mWYu*clgpj+=QJ9Yu^cKja!8t?o^Cd&*k!)F!AbJk#v+t#KRubci_F4})H^6?Il z2bOCOgr}c-HYrxv?aW`3YRk1H`bAsQZZ@yGWyAe%+dlEC+i?X!Ys2<6#&9iLuQ)T` z*^=YTa)EiT#T91mZ#Sxm&YqTJJ^5zBoC`1c85y70{FJ)7{K}m_hhoC>Flcen+1QGX3w&kv6AJ` zg?F6a%1yskC~{X#NxhTz%t=5=Irnga@xr(-g8nt1HEx;lS~MO{6WZQlnW+0@^3@r) z0uOywQ@(c3V9)vuD4xY~6kc$&q;%QLonN?yIUWY(>`-01tq z4!+cSyMSTaD(NU!rMsupZkQ~6yuC6wFYfW4DR0f^J@~NnPQ{~XyG71a&k%pF$D8tS z-SO82ADc`Mw|QT3zjHzSUR{O3%!w)AXM{xmJvA-<`Xv*c;Q60YVGJ!@&zG=zwC|q4DO5hfN_+aCUOH%Yb3rdnrDsl^4D@yc@ z3=AxE4UBY+EcKD~SL7D>`oeYR6+=TYIX_pwBC$ZksA(10d0O;p#EXQYDCkb$A4 zE-3MugcuoFnVMLc8Y)3zTY;9|Gqp%GOExn!)HO;mG1E0MwlLJSFi5q~O-f2JH%m%Q zOfgAGLv=2N-ZKv|G_o=_w=%M%hxbwqQjCp^%?x!DlPuD7O_I%%bS+X+4RjMzjZDnU zEsfGlji}^3BLiJS16@P25JPh-Q)4R=1DN-0^g;C+EUnsrN`7BoE9BH{1F9LUJVC`p zaA`q7PG)KmBwd4ZeQ;_aBpul3<4}jBA6#hU6V#5Z45HgPzo4=xGd-ikzdR4G^;i@_ zOz_D}PR%REYd5kINU$JP|8`so5V0T^H#;sHeQ+BD)ETqK16Ns32P7uAA`3o+121sKj9J(Fx9xgRcgk-z#v)T z8d2h$p9|{hGJxAdsVNHOnI#ztppIF1BcC_}1LGA>7sn8b(@Q7s%??hKI9h++cY!1K z&MxO2S*1dYBxhN97$ih(eU!97w2#L1+5x6qWeAU zS!G$KFE{?BF#F(w*4I-i{;gU0@c!&m7bkN6D*HFFmA-Dc zg|#8LC~`w_%-+h`$NlFCt*RHkz3sN>6)CynYYvB$2FRxwhs-H`mX^-o;qOye_eEyi z=jMiASETOAvmQH_xOKy!s*{Qh{jYNj%&iY^3!j?1UTf!fZi!dHg{K>~{Y-pw?|DT{ zi1E$e4NM93JKAe?IXPypJH32qzsWVOOP5{ZS(b0{T>7RcHHqu4lMOhtzg@J0H4harUJ7tK