From a5dd5ce9df453ace46362a9db45de82601c85d57 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Sun, 9 Aug 2020 23:23:12 +0100 Subject: [PATCH] Add evoker's ring --- .../wizardry/registry/WizardryItems.java | 2 + .../electroblob/wizardry/spell/Fangs.java | 49 +++++++++++++----- .../assets/ebwizardry/lang/en_gb.lang | 2 + .../assets/ebwizardry/lang/en_us.lang | 2 + .../ebwizardry/models/item/ring_evoker.json | 6 +++ .../ebwizardry/textures/items/ring_evoker.png | Bin 0 -> 6157 bytes 6 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/ebwizardry/models/item/ring_evoker.json create mode 100644 src/main/resources/assets/ebwizardry/textures/items/ring_evoker.png diff --git a/src/main/java/electroblob/wizardry/registry/WizardryItems.java b/src/main/java/electroblob/wizardry/registry/WizardryItems.java index a90df322..92a67362 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryItems.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryItems.java @@ -235,6 +235,7 @@ public final class WizardryItems { public static final Item ring_earth_melee = placeholder(); public static final Item ring_earth_biome = placeholder(); public static final Item ring_full_moon = placeholder(); + public static final Item ring_evoker = placeholder(); public static final Item ring_extraction = placeholder(); public static final Item ring_mana_return = placeholder(); public static final Item ring_blockwrangler = placeholder(); @@ -600,6 +601,7 @@ public final class WizardryItems { registerItem(registry, "ring_earth_melee", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); registerItem(registry, "ring_earth_biome", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); registerItem(registry, "ring_full_moon", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); + registerItem(registry, "ring_evoker", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); registerItem(registry, "ring_extraction", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.RING)); registerItem(registry, "ring_mana_return", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.RING)); registerItem(registry, "ring_blockwrangler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.RING)); diff --git a/src/main/java/electroblob/wizardry/spell/Fangs.java b/src/main/java/electroblob/wizardry/spell/Fangs.java index f9a84313..607ab398 100644 --- a/src/main/java/electroblob/wizardry/spell/Fangs.java +++ b/src/main/java/electroblob/wizardry/spell/Fangs.java @@ -1,5 +1,6 @@ package electroblob.wizardry.spell; +import electroblob.wizardry.item.ItemArtefact; import electroblob.wizardry.item.SpellActions; import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.util.*; @@ -63,7 +64,10 @@ public class Fangs extends Spell { protected boolean spawnFangs(World world, Vec3d origin, Vec3d direction, @Nullable EntityLivingBase caster, SpellModifiers modifiers){ - if(direction.lengthSquared() == 0) return false; // Prevent casting directly down/up + boolean defensiveCircle = caster instanceof EntityPlayer && caster.isSneaking() + && ItemArtefact.isArtefactActive((EntityPlayer)caster, WizardryItems.ring_evoker); + + if(!defensiveCircle && direction.lengthSquared() == 0) return false; // Prevent casting directly down/up boolean flag = false; @@ -80,20 +84,26 @@ public class Fangs extends Spell { }else{ - int count = (int)(getProperty(RANGE).doubleValue() * modifiers.get(WizardryItems.range_upgrade)); - float yaw = (float)MathHelper.atan2(direction.z, direction.x); // Yes, this is the right way round! + if(defensiveCircle){ - for(int i = 0; i < count; i++){ + for(int i = 0; i < 5; i++){ + float yaw = i * (float)Math.PI * 0.4f; + flag |= this.spawnFangsAt(world, caster, modifiers, yaw, 0, origin.add(MathHelper.cos(yaw) * 1.5, 0, MathHelper.sin(yaw) * 1.5)); + } - Vec3d vec = origin.add(direction.scale((i + 1) * FANG_SPACING)); - // Not exactly the same as evokers but it's how constructs work so it kinda fits - Integer y = BlockUtils.getNearestFloor(world, new BlockPos(vec), 5); + for(int k = 0; k < 8; k++){ + float yaw = k * (float)Math.PI * 2f / 8f + ((float)Math.PI * 2f / 5f); + flag |= this.spawnFangsAt(world, caster, modifiers, yaw, 3, origin.add(MathHelper.cos(yaw) * 2.5, 0, MathHelper.sin(yaw) * 2.5)); + } - if(y != null){ - EntityEvokerFangs fangs = new EntityEvokerFangs(world, vec.x, y, vec.z, yaw, i, caster); // null is fine here - fangs.getEntityData().setFloat(SpellThrowable.DAMAGE_MODIFIER_NBT_KEY, modifiers.get(SpellModifiers.POTENCY)); - world.spawnEntity(fangs); - flag = true; + }else{ + + int count = (int)(getProperty(RANGE).doubleValue() * modifiers.get(WizardryItems.range_upgrade)); + float yaw = (float)MathHelper.atan2(direction.z, direction.x); // Yes, this is the right way round! + + for(int i = 0; i < count; i++){ + Vec3d vec = origin.add(direction.scale((i + 1) * FANG_SPACING)); + flag |= spawnFangsAt(world, caster, modifiers, yaw, i, vec); } } } @@ -101,6 +111,21 @@ public class Fangs extends Spell { return flag; } + private boolean spawnFangsAt(World world, @Nullable EntityLivingBase caster, SpellModifiers modifiers, float yaw, int delay, Vec3d vec){ + + // Not exactly the same as evokers but it's how constructs work so it kinda fits + Integer y = BlockUtils.getNearestFloor(world, new BlockPos(vec), 5); + + if(y != null){ + EntityEvokerFangs fangs = new EntityEvokerFangs(world, vec.x, y, vec.z, yaw, delay, caster); // null is fine here + fangs.getEntityData().setFloat(SpellThrowable.DAMAGE_MODIFIER_NBT_KEY, modifiers.get(SpellModifiers.POTENCY)); + world.spawnEntity(fangs); + return true; + } + + return false; + } + @SubscribeEvent(priority = EventPriority.HIGH) public static void onLivingAttackEvent(LivingAttackEvent event){ if(event.getSource().getImmediateSource() instanceof EntityEvokerFangs){ diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index 320c3792..025b4d4d 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -310,6 +310,8 @@ item.ebwizardry\:ring_earth_biome.name=Dryad's Ring item.ebwizardry\:ring_earth_biome.desc=Earth spells are 30%% more potent in forests and roofed forests item.ebwizardry\:ring_full_moon.name=Ring of the Howling Wolf item.ebwizardry\:ring_full_moon.desc=Earth spells have dramatically reduced cooldowns under a full moon +item.ebwizardry\:ring_evoker.name=Evoker's Ring +item.ebwizardry\:ring_evoker.desc=Sneaking while casting fangs summons a defensive circle instead of a line item.ebwizardry\:ring_extraction.name=Ring of Extraction item.ebwizardry\:ring_extraction.desc=Kills with sorcery spells grant bonus mana item.ebwizardry\:ring_mana_return.name=Ring of the Perfectionist diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index d0e4242a..d06cd120 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -310,6 +310,8 @@ item.ebwizardry\:ring_earth_biome.name=Dryad's Ring item.ebwizardry\:ring_earth_biome.desc=Earth spells are 30%% more potent in forests and roofed forests item.ebwizardry\:ring_full_moon.name=Ring of the Howling Wolf item.ebwizardry\:ring_full_moon.desc=Earth spells have dramatically reduced cooldowns under a full moon +item.ebwizardry\:ring_evoker.name=Evoker's Ring +item.ebwizardry\:ring_evoker.desc=Sneaking while casting fangs summons a defensive circle instead of a line item.ebwizardry\:ring_extraction.name=Ring of Extraction item.ebwizardry\:ring_extraction.desc=Kills with sorcery spells grant bonus mana item.ebwizardry\:ring_mana_return.name=Ring of the Perfectionist diff --git a/src/main/resources/assets/ebwizardry/models/item/ring_evoker.json b/src/main/resources/assets/ebwizardry/models/item/ring_evoker.json new file mode 100644 index 00000000..f2f4ac53 --- /dev/null +++ b/src/main/resources/assets/ebwizardry/models/item/ring_evoker.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "ebwizardry:items/ring_evoker" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/textures/items/ring_evoker.png b/src/main/resources/assets/ebwizardry/textures/items/ring_evoker.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec9d27fa27367dd98888e415db704a28042c795 GIT binary patch literal 6157 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-wW>lQN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsHU}kDT;IgXhn4kz$q>fsV%;+|KYm`!QLkEIeF)eO$@y#OBlq zLQ7S0F8}{sKBKqzr1(id`fPoe+M3( zSbjqG*ly+Z?*45taw1FX;--Ap{}lM-i^L8cIcJ~S4Ypmrc3n4QPuJN`->V}%>DY1A zE5>zmzMtmZab{0tpPt8p7lq%?9g`6H^=eK3hv?Z3?xmUMCKrj=+Rn~i!K`+D=8Z>k zYEJjUk1c&Y@0rA$nXR_(jua}hMxTqY3E1`L*WZt_Ma7QxQ}!?Z^6sMeC-!A$i(Y(f znlHgs{(I$|C%$=dnz4IqBlsR}`{Va6#p=n!9TBsyOZXmtQC)hIUB_~cYpi#qZIAZl z=%>=kvH(j(8?tI|E>L__ZwmRH_yK@KIgmcF16Pk4za?f;bX|pPf z?s4K!YH5DRktdWs;ptw5x<%nf0>s4hl^hqXP&wIn_{;`@q#2^7?tOM%Jce$)nrVyI z#JM)Rh5F8#?A_C)&G~bN$ah>Jbp=wQ1`TuqS9qWUqiE2Y|QdC zHNU6*j zW&I~x3+z5EQEbrFZ&Nv#q>NHx%p-{SofUv0ry> zOU+Bix;z;LUAH*p3Gb!6?SI(Vxjy!kyu!3@+v^&c)|)DCHMl<;M(bHOZ@Ly$S$efH z=lkyE9+&SP-TtaLyR7~5j^|gil9*|{=B8m_ z)jHdlgKh7b_cOCppX`pzjngu-OWntPm#yR7R%=i3KbP(D18z*LwNg!7c6od1$55C1 zO1IfOX7$@X>o{Roozri6|LUgWWip=54iCawn= ztHU09E-&g>yPoM2laa8<(~VmHrZ6xF7-xn=ltlRYSS9D@>LsS+C#C9DBQBlHCStb$zJphgs>q}eKEl#~=$>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj8 z7Nw-=7FXt#Bv$C=6)S^`fSBQuTAW;zSx}OhpQivaGchT@w8U0PiAzC20ctoXWL+yt z;1+=RVB?ERQuI9wN|H?~atmB5O7x8k3@mgFjC74G^^x^g8X1az3 zi59vhCdOvENhubIx+W>+X68o8hQ>xlW=KYP<`tJD<|U_sjH<{j(96tBu`*3FH?=f2 zGSf9kGcwmTu}HSiO-eL2)-^UYFtspFO*S_)vOqGzzbG?3GcPd**;OE;QZiGlj15iG z(h?1gb<+$}O?6F7QWJG85>3){EmBi0EzAs!43d+Q!A5}s*2*!!(^kny&j2A3kds)F zmS2=>s}!D@my%yzjF1Y+%uNk0NdyI(p{b?0fuVtcsfB^1v8jPMLQz<1QE_H|9>`Qf z13iexQN0tJ{OQG!rA;#ALHXT~l*26HDXNG!rvul82jKoS#-wo>-LXn4X$fVyony znOgvkX9W#tGSftLO?gHtC=D4HTIw2@=o*=X7#Ufanpl}wC_!RdftKDgPEAWrHa9WT zwJd1TWS|Qwo-Lu?GlYB3Mjur0!y?lL zR5befS|LZb4XEg}@&x6l;L?JEoXpfBNW_D)MQ~~%B%o~cai~Mm56)Hj1hpe8gXnh7 zFQ_caOwTCsFVDkkJr;!!6MQn0Q}c@P+KsFP5-dpdqaBw5L@da~&5p}PA6!X;Dr`tt zfGSK{Vrb@~r4H=O z_9q;iqGm!lhGjPy7#Ji=Tq8=H^K(IcK?ZPpC^bc)JhLQ20n~E|Z{!naU|^i&>Eak- zaeC|Iv)+q9%+2P$_pd2L=X(IbsVvCg_<9c%eN=A{9*s~Tv;c&OxPjNni<-}XQiAKz`VX&Akf5pAD|XE>piFM2*2dGXz?$UX$h0*l%5UC7KKbby>N!s_Ump>58YYt=FcBbt