Custom Explosion "ZExplosion", called via TraitInstable, works, but does not destroy anything... still needs to be reworked.

This commit is contained in:
Robert Sosnitzka
2016-06-12 14:02:37 +02:00
parent 78e091a0c9
commit bd09ee6a1c
3 changed files with 21 additions and 51 deletions

View File

@@ -1,4 +1,4 @@
package com.sosnitzka.ztic_addon.util.traits; package com.sosnitzka.ztic_addon.util;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@@ -16,15 +16,14 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.Explosion; import net.minecraft.world.Explosion;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
/**
* Created by Robert on 11.06.2016.
*/
public class ZExplosion extends Explosion { public class ZExplosion extends Explosion {
/** /**
@@ -46,12 +45,14 @@ public class ZExplosion extends Explosion {
private final Map<EntityPlayer, Vec3d> playerKnockbackMap; private final Map<EntityPlayer, Vec3d> playerKnockbackMap;
private final Vec3d position; private final Vec3d position;
@SideOnly(Side.CLIENT)
public ZExplosion(World worldIn, Entity entityIn, double x, double y, double z, float size, boolean flaming, boolean smoking) { public ZExplosion(World worldIn, Entity entityIn, double x, double y, double z, float size, boolean flaming, boolean smoking) {
super(worldIn, entityIn, x, y, z, size, flaming, smoking); super(worldIn, entityIn, x, y, z, size, flaming, smoking);
this.explosionRNG = new Random(); this.explosionRNG = new Random();
this.affectedBlockPositions = Lists.<BlockPos>newArrayList(); this.affectedBlockPositions = Lists.<BlockPos>newArrayList();
this.playerKnockbackMap = Maps.<EntityPlayer, Vec3d>newHashMap(); this.playerKnockbackMap = Maps.<EntityPlayer, Vec3d>newHashMap();
this.worldObj = worldIn; this.worldObj = entityIn.getEntityWorld();
this.exploder = entityIn; this.exploder = entityIn;
this.explosionSize = size; this.explosionSize = size;
this.explosionX = x; this.explosionX = x;
@@ -135,8 +136,7 @@ public class ZExplosion extends Explosion {
d9 = d9 / d13; d9 = d9 / d13;
double d14 = (double) this.worldObj.getBlockDensity(vec3d, entity.getEntityBoundingBox()); double d14 = (double) this.worldObj.getBlockDensity(vec3d, entity.getEntityBoundingBox());
double d10 = (1.0D - d12) * d14; double d10 = (1.0D - d12) * d14;
if (!(entity instanceof EntityPlayer)) entity.attackEntityFrom(DamageSource.causeExplosionDamage(this), (float) ((int) ((d10 * d10 + d10) / 2.0D * 7.0D * (double) f3 + 1.0D)));
entity.attackEntityFrom(DamageSource.causeExplosionDamage(this), (float) ((int) ((d10 * d10 + d10) / 2.0D * 7.0D * (double) f3 + 1.0D)));
double d11 = 1.0D; double d11 = 1.0D;
if (entity instanceof EntityLivingBase) { if (entity instanceof EntityLivingBase) {
@@ -159,4 +159,5 @@ public class ZExplosion extends Explosion {
} }
} }
} }
}
}

View File

@@ -1,39 +0,0 @@
package com.sosnitzka.ztic_addon.util;
import com.sosnitzka.ztic_addon.util.traits.ZExplosion;
import net.minecraft.entity.Entity;
import net.minecraft.profiler.Profiler;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.WorldInfo;
/**
* Created by Robert on 11.06.2016.
*/
public class ZWorld extends World {
protected ZWorld(ISaveHandler saveHandlerIn, WorldInfo info, WorldProvider providerIn, Profiler profilerIn, boolean client) {
super(saveHandlerIn, info, providerIn, profilerIn, client);
}
@Override
protected IChunkProvider createChunkProvider() {
return null;
}
@Override
protected boolean isChunkLoaded(int x, int z, boolean allowEmpty) {
return false;
}
@Override
public Explosion newExplosion(Entity entityIn, double x, double y, double z, float strength, boolean isFlaming, boolean isSmoking) {
ZExplosion explosion = new ZExplosion(this, entityIn, x, y, z, strength, isFlaming, isSmoking);
if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this, explosion)) return explosion;
explosion.doExplosionA();
explosion.doExplosionB(true);
return explosion;
}
}

View File

@@ -1,7 +1,8 @@
package com.sosnitzka.ztic_addon.util.traits; package com.sosnitzka.ztic_addon.util.traits;
import com.sosnitzka.ztic_addon.util.ZWorld; import com.sosnitzka.ztic_addon.util.ZExplosion;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -24,11 +25,10 @@ public class TraitInstable extends AbstractTrait {
@Override @Override
public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) { public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
ZWorld world2 = (ZWorld) world;
if (MathHelper.getRandomIntegerInRange(random, 0, 100) > 2) { if (MathHelper.getRandomIntegerInRange(random, 0, 100) > 2) {
if (!world.isRemote) if (!world.isRemote)
world2.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), 2f, true, true); newZExplosion(player, pos.getX(), pos.getY(), pos.getZ(), 2f, true, true);
} }
} }
@@ -37,7 +37,7 @@ public class TraitInstable extends AbstractTrait {
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) { public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
BlockPos pos = target.getPosition(); BlockPos pos = target.getPosition();
if (MathHelper.getRandomIntegerInRange(random, 0, 100) < 2) { if (MathHelper.getRandomIntegerInRange(random, 0, 100) < 2) {
target.getEntityWorld().newExplosion(target, pos.getX(), pos.getY(), pos.getZ(), 1.5f, true, true); newZExplosion(target, pos.getX(), pos.getY(), pos.getZ(), 2f, true, true);
} }
} }
@@ -50,6 +50,14 @@ public class TraitInstable extends AbstractTrait {
} }
} */ } */
private ZExplosion newZExplosion(Entity entityIn, double x, double y, double z, float strength, boolean isFlaming, boolean isSmoking) {
ZExplosion explosion = new ZExplosion(entityIn.worldObj, entityIn, x, y, z, strength, isFlaming, isSmoking);
if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(entityIn.worldObj, explosion)) return explosion;
explosion.doExplosionA();
explosion.doExplosionB(true);
return explosion;
}
} }