From 89345d4fbce0a532285001b0d2c5713d553396b7 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Sun, 18 Oct 2020 22:12:14 +0100 Subject: [PATCH] Add mirage spell --- .../wizardry/WizardryEventHandler.java | 6 +++ .../client/renderer/effect/RenderMirage.java | 45 ++++++++++++++++++ .../electroblob/wizardry/registry/Spells.java | 1 + .../wizardry/registry/WizardryPotions.java | 7 +++ .../assets/ebwizardry/lang/en_gb.lang | 3 ++ .../assets/ebwizardry/lang/en_us.lang | 3 ++ .../assets/ebwizardry/spells/mirage.json | 23 +++++++++ .../textures/gui/potion_icons/mirage.png | Bin 0 -> 11710 bytes .../ebwizardry/textures/spells/mirage.png | Bin 0 -> 5202 bytes 9 files changed, 88 insertions(+) create mode 100644 src/main/java/electroblob/wizardry/client/renderer/effect/RenderMirage.java create mode 100644 src/main/resources/assets/ebwizardry/spells/mirage.json create mode 100644 src/main/resources/assets/ebwizardry/textures/gui/potion_icons/mirage.png create mode 100644 src/main/resources/assets/ebwizardry/textures/spells/mirage.png diff --git a/src/main/java/electroblob/wizardry/WizardryEventHandler.java b/src/main/java/electroblob/wizardry/WizardryEventHandler.java index de9f9521..5e0d21b6 100644 --- a/src/main/java/electroblob/wizardry/WizardryEventHandler.java +++ b/src/main/java/electroblob/wizardry/WizardryEventHandler.java @@ -210,6 +210,12 @@ public final class WizardryEventHandler { } } + // Mirage + if(event.getTarget().isPotionActive(WizardryPotions.mirage)){ + // Can't find players under mirage at all! (Pretty sure this excludes revenge-targeting) + ((EntityLiving)event.getEntityLiving()).setAttackTarget(null); + } + // Blindness tweak // I'm not going as far as potion core's implementation, this is just so it does *something* to mobs if(event.getEntityLiving().isPotionActive(MobEffects.BLINDNESS) && !Loader.isModLoaded("potioncore") diff --git a/src/main/java/electroblob/wizardry/client/renderer/effect/RenderMirage.java b/src/main/java/electroblob/wizardry/client/renderer/effect/RenderMirage.java new file mode 100644 index 00000000..3e8337d4 --- /dev/null +++ b/src/main/java/electroblob/wizardry/client/renderer/effect/RenderMirage.java @@ -0,0 +1,45 @@ +package electroblob.wizardry.client.renderer.effect; + +import electroblob.wizardry.registry.WizardryPotions; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.DestFactor; +import net.minecraft.client.renderer.GlStateManager.SourceFactor; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; + +import java.util.Random; + +@EventBusSubscriber(Side.CLIENT) +public class RenderMirage { + + private static final int BLINK_PERIOD_1 = 47; // Use two prime numbers to make it look as chaotic as possible + private static final int BLINK_PERIOD_2 = 71; + + private static final double MAX_OFFSET = 3; + + private static final Random random = new Random(); // Seed will be set later + + @SubscribeEvent + public static void onRenderLivingEvent(RenderLivingEvent.Pre event){ + if(event.getEntity().isPotionActive(WizardryPotions.mirage)){ + random.setSeed(event.getEntity().ticksExisted / BLINK_PERIOD_1 + + event.getEntity().ticksExisted / BLINK_PERIOD_2); + GlStateManager.pushMatrix(); + GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE); // GhoOOoOostly OooOOOo00oOOo + GlStateManager.color(1, 1, 1, 0.5f); + GlStateManager.translate((random.nextDouble() * 2 - 1) * MAX_OFFSET, + (random.nextDouble() * 2 - 1) * MAX_OFFSET, (random.nextDouble() * 2 - 1) * MAX_OFFSET); + } + } + + @SubscribeEvent + public static void onRenderLivingEvent(RenderLivingEvent.Post event){ + if(event.getEntity().isPotionActive(WizardryPotions.mirage)){ + GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); + GlStateManager.popMatrix(); + } + } + +} diff --git a/src/main/java/electroblob/wizardry/registry/Spells.java b/src/main/java/electroblob/wizardry/registry/Spells.java index 632a0852..bbc15c90 100644 --- a/src/main/java/electroblob/wizardry/registry/Spells.java +++ b/src/main/java/electroblob/wizardry/registry/Spells.java @@ -468,6 +468,7 @@ public final class Spells { registry.register(new WitheringTotem()); registry.register(new Fangs()); registry.register(new GuardianBeam()); + registry.register(new SpellBuff("mirage", 0.64f, 0.47f, 0.9f, () -> WizardryPotions.mirage)); registry.register(new RadiantTotem()); registry.register(new Firestorm()); diff --git a/src/main/java/electroblob/wizardry/registry/WizardryPotions.java b/src/main/java/electroblob/wizardry/registry/WizardryPotions.java index 9f5f7338..75535e1a 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryPotions.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryPotions.java @@ -56,6 +56,7 @@ public final class WizardryPotions { public static final Potion containment = placeholder(); public static final Potion frost_step = placeholder(); public static final Potion mark_of_sacrifice = placeholder(); + public static final Potion mirage = placeholder(); /** * Sets both the registry and unlocalised names of the given potion, then registers it with the given registry. Use @@ -194,6 +195,12 @@ public final class WizardryPotions { registerPotion(registry, "mark_of_sacrifice", new PotionMagicEffect(true, 0xe90e48, new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/mark_of_sacrifice.png"))); + registerPotion(registry, "mirage", new PotionMagicEffectParticles(false, 0, // No particles or we'll see the player's actual position! + new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/mirage.png")){ + @Override + public void spawnCustomParticle(World world, double x, double y, double z){} // We only want the syncing + }.setBeneficial()); + } } \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index 2d28f970..c973a627 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -891,6 +891,7 @@ spell.ebwizardry\:meteor=Meteor spell.ebwizardry\:mind_control=Mind Control spell.ebwizardry\:mind_trick=Mind Trick spell.ebwizardry\:mine=Mine +spell.ebwizardry\:mirage=Mirage spell.ebwizardry\:muffle=Muffle spell.ebwizardry\:none=[Empty Slot] spell.ebwizardry\:oakflesh=Oakflesh @@ -1078,6 +1079,7 @@ spell.ebwizardry\:meteor.desc=Some wizards just want to see the world burn... spell.ebwizardry\:mind_control.desc=Takes control of the target's mind for 30 seconds, causing it switch sides and fight for the caster instead. Will not work on creatures that are too strong-willed. spell.ebwizardry\:mind_trick.desc=Confuses and disorients the target for 15 seconds, rendering it unable to attack effectively. The effect will be dispelled if the target takes damage. spell.ebwizardry\:mine.desc=Breaks the block the caster is looking at. Potency will allow harder blocks to be broken. +spell.ebwizardry\:mirage.desc=Creates an illusion where the caster appears to be a few blocks away from their actual position, blinking around every few seconds. The illusion lasts for 20 seconds. spell.ebwizardry\:muffle.desc=Silences any sounds made by the caster for 30 seconds. When muffled, mobs can only detect you when looking towards you. spell.ebwizardry\:none.desc=To get a spell book with the /give command, use id\: /give [player] ebwizardry\:spell_book 1 [spell id] (if you found this book in a chest, some other mod has messed things up). spell.ebwizardry\:oakflesh.desc=Improves the caster's damage resistance for 30 seconds. @@ -1251,6 +1253,7 @@ potion.ebwizardry\:curse_of_enfeeblement=Curse of Enfeeblement potion.ebwizardry\:curse_of_undeath=Curse of Undeath potion.ebwizardry\:containment=Containment potion.ebwizardry\:frost_step=Frost Step +potion.ebwizardry\:mirage=Mirage enchantment.ebwizardry\:magic_sword=Imbuement enchantment.ebwizardry\:magic_bow=Imbuement diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index 244eeb15..aefcd0ba 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -891,6 +891,7 @@ spell.ebwizardry\:meteor=Meteor spell.ebwizardry\:mind_control=Mind Control spell.ebwizardry\:mind_trick=Mind Trick spell.ebwizardry\:mine=Mine +spell.ebwizardry\:mirage=Mirage spell.ebwizardry\:muffle=Muffle spell.ebwizardry\:none=[Empty Slot] spell.ebwizardry\:oakflesh=Oakflesh @@ -1078,6 +1079,7 @@ spell.ebwizardry\:meteor.desc=Some wizards just want to see the world burn... spell.ebwizardry\:mind_control.desc=Takes control of the target's mind for 30 seconds, causing it switch sides and fight for the caster instead. Will not work on creatures that are too strong-willed. spell.ebwizardry\:mind_trick.desc=Confuses and disorients the target for 15 seconds, rendering it unable to attack effectively. The effect will be dispelled if the target takes damage. spell.ebwizardry\:mine.desc=Breaks the block the caster is looking at. Potency will allow harder blocks to be broken. +spell.ebwizardry\:mirage.desc=Creates an illusion where the caster appears to be a few blocks away from their actual position, blinking around every few seconds. The illusion lasts for 20 seconds. spell.ebwizardry\:muffle.desc=Silences any sounds made by the caster for 30 seconds. When muffled, mobs can only detect you when looking towards you. spell.ebwizardry\:none.desc=To get a spell book with the /give command, use id\: /give [player] ebwizardry\:spell_book 1 [spell id] (if you found this book in a chest, some other mod has messed things up). spell.ebwizardry\:oakflesh.desc=Improves the caster's damage resistance for 30 seconds. @@ -1251,6 +1253,7 @@ potion.ebwizardry\:curse_of_enfeeblement=Curse of Enfeeblement potion.ebwizardry\:curse_of_undeath=Curse of Undeath potion.ebwizardry\:containment=Containment potion.ebwizardry\:frost_step=Frost Step +potion.ebwizardry\:mirage=Mirage enchantment.ebwizardry\:magic_sword=Imbuement enchantment.ebwizardry\:magic_bow=Imbuement diff --git a/src/main/resources/assets/ebwizardry/spells/mirage.json b/src/main/resources/assets/ebwizardry/spells/mirage.json new file mode 100644 index 00000000..50aedefa --- /dev/null +++ b/src/main/resources/assets/ebwizardry/spells/mirage.json @@ -0,0 +1,23 @@ +{ + "enabled": { + "book": true, + "scroll": true, + "wands": true, + "npcs": true, + "dispensers": true, + "commands": true, + "treasure": true, + "trades": true, + "looting": true + }, + "tier": "advanced", + "element": "sorcery", + "type": "alteration", + "cost": 40, + "chargeup": 10, + "cooldown": 200, + "base_properties": { + "mirage_duration": 400, + "mirage_strength": 0 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/textures/gui/potion_icons/mirage.png b/src/main/resources/assets/ebwizardry/textures/gui/potion_icons/mirage.png new file mode 100644 index 0000000000000000000000000000000000000000..edebc0874a4a17ce5ccfe642a66cb0faf8e617d2 GIT binary patch literal 11710 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 T!`zyegOZV_tDnm{r-UW|>i3&Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/spells/mirage.png b/src/main/resources/assets/ebwizardry/textures/spells/mirage.png new file mode 100644 index 0000000000000000000000000000000000000000..e4743e913026870d4dde801f934f21745e0a212f GIT binary patch literal 5202 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