diff --git a/src/main/java/electroblob/wizardry/client/ClientProxy.java b/src/main/java/electroblob/wizardry/client/ClientProxy.java index 63c5e1ad..589fb824 100644 --- a/src/main/java/electroblob/wizardry/client/ClientProxy.java +++ b/src/main/java/electroblob/wizardry/client/ClientProxy.java @@ -712,6 +712,7 @@ public class ClientProxy extends CommonProxy { public void initialiseLayers(){ LayerTiledOverlay.initialiseLayers(LayerStone::new); LayerTiledOverlay.initialiseLayers(LayerFrost::new); + LayerTiledOverlay.initialiseLayers(LayerMindControl::new); LayerTiledOverlay.initialiseLayers(LayerSummonAnimation::new); LayerTiledOverlay.initialiseLayers(LayerDisintegrateAnimation::new); } diff --git a/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerMindControl.java b/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerMindControl.java new file mode 100644 index 00000000..b651aabc --- /dev/null +++ b/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerMindControl.java @@ -0,0 +1,59 @@ +package electroblob.wizardry.client.renderer.entity.layers; + +import electroblob.wizardry.Wizardry; +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.minecraft.client.renderer.entity.RenderLivingBase; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ResourceLocation; + +/** + * Layer used to render the mind control overlay on creatures with the mind control effect. + * + * @author Electroblob + * @since Wizardry 4.3 + */ +public class LayerMindControl extends LayerTiledOverlay { + + private static final ResourceLocation TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/entity/mind_control_overlay.png"); + + public LayerMindControl(RenderLivingBase renderer){ + super(renderer); + } + + @Override + public boolean shouldRender(EntityLivingBase entity, float partialTicks){ + return !entity.isInvisible() && entity.isPotionActive(WizardryPotions.mind_control); + } + + @Override + public ResourceLocation getTexture(EntityLivingBase entity, float partialTicks){ + return TEXTURE; + } + + @Override + public void doRenderLayer(EntityLivingBase entity, float limbSwing, float limbSwingAmount, float partialTicks, + float ageInTicks, float netHeadYaw, float headPitch, float scale){ + + GlStateManager.enableBlend(); + GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE); + + PotionEffect effect = entity.getActivePotionEffect(WizardryPotions.mind_control); + if(effect != null){ + GlStateManager.color(1, 1, 1, Math.min(1, (effect.getDuration() - partialTicks) / 20)); + } + + super.doRenderLayer(entity, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); + + GlStateManager.disableBlend(); + } + + @Override + protected void applyTextureSpaceTransformations(EntityLivingBase entity, float partialTicks){ + float f = entity.ticksExisted + partialTicks; + GlStateManager.translate(f * 0.003f, f * 0.003f, 0); + } +} \ No newline at end of file diff --git a/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerTiledOverlay.java b/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerTiledOverlay.java index d609b4b6..04f848a7 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerTiledOverlay.java +++ b/src/main/java/electroblob/wizardry/client/renderer/entity/layers/LayerTiledOverlay.java @@ -82,6 +82,16 @@ public abstract class LayerTiledOverlay implements L return false; // Normally it looks kind of weird because second layers typically have holes in them } + /** + * Allows subclasses to perform additional transformations in the texture space before the model is rendered. This + * can be used for a creeper-charge-like effect. To do this, simply override this method and call the appropriate + * transformation method(s) (translate, rotate, scale) in {@link GlStateManager}. This method does nothing by + * default. + * @param entity The entity being rendered + * @param partialTicks The current partial tick time + */ + protected void applyTextureSpaceTransformations(T entity, float partialTicks){} + @Override public void doRenderLayer(T entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale){ @@ -143,6 +153,8 @@ public abstract class LayerTiledOverlay implements L GlStateManager.scale(scaleX, scaleY, 1); + applyTextureSpaceTransformations(entity, partialTicks); + GlStateManager.matrixMode(GL11.GL_MODELVIEW); // Switch back to the 3D model space boolean headWearHidden = false; diff --git a/src/main/java/electroblob/wizardry/registry/WizardryPotions.java b/src/main/java/electroblob/wizardry/registry/WizardryPotions.java index 9b66caa5..8501009f 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryPotions.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryPotions.java @@ -143,8 +143,11 @@ public final class WizardryPotions { registerPotion(registry, "mind_trick", new PotionMagicEffect(true, 0x601683, new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/mind_trick.png"))); - registerPotion(registry, "mind_control", new PotionMagicEffect(true, 0x320b44, - new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/mind_control.png"))); + registerPotion(registry, "mind_control", new PotionMagicEffectParticles(true, 0x320b44, + new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/mind_control.png")) { + @Override + public void spawnCustomParticle(World world, double x, double y, double z){} // We only want the syncing + }); registerPotion(registry, "font_of_mana", new PotionMagicEffect(false, 0xffe5bb, new ResourceLocation(Wizardry.MODID, "textures/gui/potion_icons/font_of_mana.png")).setBeneficial()); diff --git a/src/main/resources/assets/ebwizardry/textures/entity/mind_control_overlay.png b/src/main/resources/assets/ebwizardry/textures/entity/mind_control_overlay.png new file mode 100644 index 00000000..ca3be54c Binary files /dev/null and b/src/main/resources/assets/ebwizardry/textures/entity/mind_control_overlay.png differ