Move screen shaking effect into a proper method in the client proxy, fix earthquake's version not working and add screen shake to meteor, lightning hammer and shockwave
This commit is contained in:
@@ -241,6 +241,13 @@ public class CommonProxy {
|
|||||||
/** Starts the first-person blink overlay effect for the specified player. */
|
/** Starts the first-person blink overlay effect for the specified player. */
|
||||||
public void playBlinkEffect(EntityPlayer player){}
|
public void playBlinkEffect(EntityPlayer player){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the client-side screen shake effect for the specified player.
|
||||||
|
* @param player The player whose screen is to be shaken
|
||||||
|
* @param intensity The amplitude of the shaking (around 10 looks about right)
|
||||||
|
*/
|
||||||
|
public void shakeScreen(EntityPlayer player, float intensity){}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the client side world using Minecraft.getMinecraft().world. <b>Only to be called client side!</b> Returns
|
* Gets the client side world using Minecraft.getMinecraft().world. <b>Only to be called client side!</b> Returns
|
||||||
* null on the server side.
|
* null on the server side.
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import electroblob.wizardry.item.ItemScroll;
|
|||||||
import electroblob.wizardry.item.ItemSpellBook;
|
import electroblob.wizardry.item.ItemSpellBook;
|
||||||
import electroblob.wizardry.item.ItemWand;
|
import electroblob.wizardry.item.ItemWand;
|
||||||
import electroblob.wizardry.packet.*;
|
import electroblob.wizardry.packet.*;
|
||||||
import electroblob.wizardry.potion.PotionSlowTime;
|
|
||||||
import electroblob.wizardry.registry.Spells;
|
import electroblob.wizardry.registry.Spells;
|
||||||
import electroblob.wizardry.registry.WizardrySounds;
|
import electroblob.wizardry.registry.WizardrySounds;
|
||||||
import electroblob.wizardry.spell.*;
|
import electroblob.wizardry.spell.*;
|
||||||
@@ -195,6 +194,11 @@ public class ClientProxy extends CommonProxy {
|
|||||||
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.playBlinkEffect();
|
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.playBlinkEffect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shakeScreen(EntityPlayer player, float intensity){
|
||||||
|
if(Minecraft.getMinecraft().player == player) WizardryClientEventHandler.shakeScreen(intensity);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> getSpellHUDSkins(){
|
public Set<String> getSpellHUDSkins(){
|
||||||
return GuiSpellDisplay.getSkinKeys();
|
return GuiSpellDisplay.getSkinKeys();
|
||||||
|
|||||||
@@ -69,11 +69,21 @@ public final class WizardryClientEventHandler {
|
|||||||
/** The number of ticks the blink effect lasts for. */
|
/** The number of ticks the blink effect lasts for. */
|
||||||
private static final int BLINK_EFFECT_DURATION = 8;
|
private static final int BLINK_EFFECT_DURATION = 8;
|
||||||
|
|
||||||
/** Starts the first person blink overlay effect. */
|
/** The remaining time for which the screen shake effect will be active. */
|
||||||
|
private static int screenShakeCounter = 0;
|
||||||
|
private static final float SHAKINESS = 0.5f;
|
||||||
|
|
||||||
|
/** Starts the first-person blink overlay effect. */
|
||||||
public static void playBlinkEffect(){
|
public static void playBlinkEffect(){
|
||||||
blinkEffectTimer = BLINK_EFFECT_DURATION;
|
blinkEffectTimer = BLINK_EFFECT_DURATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Starts the client-side screen shake effect. */
|
||||||
|
public static void shakeScreen(float intensity){
|
||||||
|
screenShakeCounter = (int)(intensity / SHAKINESS);
|
||||||
|
Minecraft.getMinecraft().player.rotationPitch -= intensity * 0.5f; // Start halfway down
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onPlayerTickEvent(TickEvent.PlayerTickEvent event){
|
public static void onPlayerTickEvent(TickEvent.PlayerTickEvent event){
|
||||||
|
|
||||||
@@ -81,6 +91,12 @@ public final class WizardryClientEventHandler {
|
|||||||
|
|
||||||
if(blinkEffectTimer > 0) blinkEffectTimer--;
|
if(blinkEffectTimer > 0) blinkEffectTimer--;
|
||||||
|
|
||||||
|
if(screenShakeCounter > 0){
|
||||||
|
float magnitude = screenShakeCounter * SHAKINESS;
|
||||||
|
Minecraft.getMinecraft().player.rotationPitch += screenShakeCounter % 2 == 0 ? magnitude : -magnitude;
|
||||||
|
screenShakeCounter--;
|
||||||
|
}
|
||||||
|
|
||||||
// Only seems to work here...
|
// Only seems to work here...
|
||||||
// EntityLiving victim = Possession.getPossessee(Minecraft.getMinecraft().player);
|
// EntityLiving victim = Possession.getPossessee(Minecraft.getMinecraft().player);
|
||||||
// if(victim != null && victim.getHeldItemMainhand().isEmpty()){
|
// if(victim != null && victim.getHeldItemMainhand().isEmpty()){
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import electroblob.wizardry.registry.Spells;
|
|||||||
import electroblob.wizardry.registry.WizardryBlocks;
|
import electroblob.wizardry.registry.WizardryBlocks;
|
||||||
import electroblob.wizardry.registry.WizardrySounds;
|
import electroblob.wizardry.registry.WizardrySounds;
|
||||||
import electroblob.wizardry.spell.Meteor;
|
import electroblob.wizardry.spell.Meteor;
|
||||||
|
import electroblob.wizardry.util.WizardryUtilities;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.MoverType;
|
import net.minecraft.entity.MoverType;
|
||||||
import net.minecraft.entity.item.EntityFallingBlock;
|
import net.minecraft.entity.item.EntityFallingBlock;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.util.SoundCategory;
|
import net.minecraft.util.SoundCategory;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
@@ -61,9 +63,9 @@ public class EntityMeteor extends EntityFallingBlock {
|
|||||||
this.motionY *= 0.9800000190734863D;
|
this.motionY *= 0.9800000190734863D;
|
||||||
this.motionZ *= 0.9800000190734863D;
|
this.motionZ *= 0.9800000190734863D;
|
||||||
|
|
||||||
if(!this.world.isRemote){
|
if(this.onGround){
|
||||||
|
|
||||||
if(this.onGround){
|
if(!this.world.isRemote){
|
||||||
|
|
||||||
this.motionX *= 0.699999988079071D;
|
this.motionX *= 0.699999988079071D;
|
||||||
this.motionZ *= 0.699999988079071D;
|
this.motionZ *= 0.699999988079071D;
|
||||||
@@ -72,8 +74,13 @@ public class EntityMeteor extends EntityFallingBlock {
|
|||||||
Spells.meteor.getProperty(Meteor.BLAST_STRENGTH).floatValue() * blastMultiplier,
|
Spells.meteor.getProperty(Meteor.BLAST_STRENGTH).floatValue() * blastMultiplier,
|
||||||
damageBlocks, damageBlocks);
|
damageBlocks, damageBlocks);
|
||||||
this.setDead();
|
this.setDead();
|
||||||
|
|
||||||
|
}else{
|
||||||
|
WizardryUtilities.getEntitiesWithinRadius(15, posX, posY, posZ, world, EntityPlayer.class)
|
||||||
|
.forEach(p -> Wizardry.proxy.shakeScreen(p, 10));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import electroblob.wizardry.util.MagicDamage.DamageType;
|
|||||||
import electroblob.wizardry.util.WizardryUtilities;
|
import electroblob.wizardry.util.WizardryUtilities;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.entity.item.EntityFallingBlock;
|
import net.minecraft.entity.item.EntityFallingBlock;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.init.MobEffects;
|
import net.minecraft.init.MobEffects;
|
||||||
import net.minecraft.network.play.server.SPacketEntityVelocity;
|
import net.minecraft.network.play.server.SPacketEntityVelocity;
|
||||||
@@ -97,18 +96,6 @@ public class EntityEarthquake extends EntityMagicConstruct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!world.isRemote){
|
|
||||||
// Constant 15 blocks for now
|
|
||||||
List<EntityPlayer> targets2 = WizardryUtilities.getEntitiesWithinRadius(15, posX, posY, posZ, world, EntityPlayer.class);
|
|
||||||
|
|
||||||
float magnitude = 10f * ((float)(this.lifetime - this.ticksExisted))/(float)this.lifetime;
|
|
||||||
|
|
||||||
// Makes the screen shake
|
|
||||||
for(EntityPlayer target : targets2){
|
|
||||||
target.rotationPitch += this.ticksExisted % 2 == 0 ? magnitude : -magnitude;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ public class EntityHammer extends EntityMagicConstruct {
|
|||||||
public void fall(float distance, float damageMultiplier){
|
public void fall(float distance, float damageMultiplier){
|
||||||
|
|
||||||
if(world.isRemote){
|
if(world.isRemote){
|
||||||
|
|
||||||
for(int i = 0; i < 40; i++){
|
for(int i = 0; i < 40; i++){
|
||||||
double particleX = this.posX - 1.0d + 2 * rand.nextDouble();
|
double particleX = this.posX - 1.0d + 2 * rand.nextDouble();
|
||||||
double particleZ = this.posZ - 1.0d + 2 * rand.nextDouble();
|
double particleZ = this.posZ - 1.0d + 2 * rand.nextDouble();
|
||||||
@@ -180,6 +181,12 @@ public class EntityHammer extends EntityMagicConstruct {
|
|||||||
particleX - this.posX, 0, particleZ - this.posZ, Block.getStateId(block));
|
particleX - this.posX, 0, particleZ - this.posZ, Block.getStateId(block));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.fallDistance > 10){
|
||||||
|
WizardryUtilities.getEntitiesWithinRadius(10, posX, posY, posZ, world, EntityPlayer.class)
|
||||||
|
.forEach(p -> Wizardry.proxy.shakeScreen(p, 6));
|
||||||
|
}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
// Just to check the hammer has actually fallen from the sky, rather than the block under it being broken.
|
// Just to check the hammer has actually fallen from the sky, rather than the block under it being broken.
|
||||||
if(this.fallDistance > 10){
|
if(this.fallDistance > 10){
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package electroblob.wizardry.spell;
|
package electroblob.wizardry.spell;
|
||||||
|
|
||||||
|
import electroblob.wizardry.Wizardry;
|
||||||
import electroblob.wizardry.entity.construct.EntityEarthquake;
|
import electroblob.wizardry.entity.construct.EntityEarthquake;
|
||||||
import electroblob.wizardry.registry.WizardryItems;
|
import electroblob.wizardry.registry.WizardryItems;
|
||||||
import electroblob.wizardry.util.SpellModifiers;
|
import electroblob.wizardry.util.SpellModifiers;
|
||||||
@@ -7,6 +8,7 @@
|
|||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.EnumAction;
|
import net.minecraft.item.EnumAction;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumParticleTypes;
|
import net.minecraft.util.EnumParticleTypes;
|
||||||
@@ -53,6 +55,10 @@
|
|||||||
world.spawnParticle(EnumParticleTypes.BLOCK_DUST, particleX, y,
|
world.spawnParticle(EnumParticleTypes.BLOCK_DUST, particleX, y,
|
||||||
particleZ, particleX - x, 0, particleZ - z, Block.getStateId(block));
|
particleZ, particleX - x, 0, particleZ - z, Block.getStateId(block));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WizardryUtilities.getEntitiesWithinRadius(15, x, y, z, world, EntityPlayer.class)
|
||||||
|
.forEach(p -> Wizardry.proxy.shakeScreen(p, 12));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.spawnConstruct(world, x, y, z, side, caster, modifiers);
|
return super.spawnConstruct(world, x, y, z, side, caster, modifiers);
|
||||||
|
|||||||
@@ -41,12 +41,17 @@ public class Shockwave extends Spell {
|
|||||||
|
|
||||||
for(EntityLivingBase target : targets){
|
for(EntityLivingBase target : targets){
|
||||||
|
|
||||||
if(target instanceof EntityPlayer && (!Wizardry.settings.playersMoveEachOther
|
if(target instanceof EntityPlayer){
|
||||||
|| ItemArtefact.isArtefactActive((EntityPlayer)target, WizardryItems.amulet_anchoring))){
|
|
||||||
|
|
||||||
if(!world.isRemote) caster.sendStatusMessage(new TextComponentTranslation("spell.resist",
|
Wizardry.proxy.shakeScreen((EntityPlayer)target, 10);
|
||||||
target.getName(), this.getNameForTranslationFormatted()), true);
|
|
||||||
return false;
|
if(!Wizardry.settings.playersMoveEachOther) continue;
|
||||||
|
|
||||||
|
if(ItemArtefact.isArtefactActive((EntityPlayer)target, WizardryItems.amulet_anchoring)){
|
||||||
|
if(!world.isRemote) caster.sendStatusMessage(new TextComponentTranslation("spell.resist",
|
||||||
|
target.getName(), this.getNameForTranslationFormatted()), true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(AllyDesignationSystem.isValidTarget(caster, target)){
|
if(AllyDesignationSystem.isValidTarget(caster, target)){
|
||||||
|
|||||||
Reference in New Issue
Block a user