Improve
EnergonRelics/pipeline/head This commit looks good Details

This commit is contained in:
TheBrokenRail 2020-07-28 17:45:42 -04:00
parent 1740c58262
commit 6fcb8f675d
4 changed files with 58 additions and 13 deletions

View File

@ -35,6 +35,8 @@ public class FieldProjectorBlockEntity extends EnergyReceiverBlockEntity {
if (getCachedState().get(FieldProjectorBlock.POWERED)) {
Direction facing = getCachedState().get(FieldProjectorBlock.FACING);
BlockState state = block.apply(getCachedState()).getDefaultState().with(AbstractFieldBlock.FACING, facing);
boolean valid = false;
for (int i = 1; i < HardcodedConfig.FIELD_MAX_SIZE + 1; i++) {
BlockPos targetPos = getPos().offset(facing, i);
BlockState targetState = getWorld().getBlockState(targetPos);
@ -42,9 +44,13 @@ public class FieldProjectorBlockEntity extends EnergyReceiverBlockEntity {
getWorld().setBlockState(targetPos, state);
} else if (targetState != state) {
setLastBlock(targetPos, targetState);
valid = true;
break;
}
}
if (!valid) {
setLastBlock(null, null);
}
}
}
}

View File

@ -6,6 +6,8 @@ import com.thebrokenrail.energonrelics.block.forcefield.laser.IndustrialLaserPro
import com.thebrokenrail.energonrelics.config.HardcodedConfig;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.TntBlock;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.particle.ParticleTypes;
@ -14,6 +16,8 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.explosion.Explosion;
import java.util.Objects;
public class IndustrialLaserBlockEntity extends FieldProjectorBlockEntity {
private BlockPos targetPos;
private BlockState targetState;
@ -26,7 +30,7 @@ public class IndustrialLaserBlockEntity extends FieldProjectorBlockEntity {
@Override
protected void setLastBlock(BlockPos newPos, BlockState newState) {
if (!newPos.equals(targetPos) || targetState != newState) {
if (!Objects.equals(newPos, targetPos) || targetState != newState) {
targetPos = newPos;
targetState = newState;
progress = 0;
@ -42,24 +46,33 @@ public class IndustrialLaserBlockEntity extends FieldProjectorBlockEntity {
protected void energyTick() {
super.energyTick();
if (getCachedState().get(IndustrialLaserProjectorBlock.POWERED) && targetState != null && targetPos != null && IndustrialLaserRegistry.has(targetState.getBlock())) {
if (getCachedState().get(IndustrialLaserProjectorBlock.POWERED) && targetState != null && targetPos != null) {
assert getWorld() != null;
if (progress >= HardcodedConfig.INDUSTRIAL_LASER_BEAM_TIME) {
getWorld().createExplosion(null, targetPos.getX() + 0.5d, targetPos.getY() + 0.5d, targetPos.getZ() + 0.5d, 0.5f, Explosion.DestructionType.NONE);
Block.dropStack(getWorld(), targetPos, IndustrialLaserRegistry.get(targetState.getBlock(), getWorld().random));
getWorld().breakBlock(targetPos, false);
if (targetState.getBlock() == Blocks.TNT) {
TntBlock.primeTnt(getWorld(), targetPos);
getWorld().setBlockState(targetPos, Blocks.AIR.getDefaultState());
progress = 0;
} else {
Vec3d vec = Vec3d.ofCenter(targetPos);
((ServerWorld) getWorld()).spawnParticles(ParticleTypes.FLAME, vec.getX(), vec.getY(), vec.getZ(), 1, 0.3f, 0.3f, 0.3f, 0f);
markDirty();
} else if (IndustrialLaserRegistry.has(targetState.getBlock())) {
if (progress >= HardcodedConfig.INDUSTRIAL_LASER_BEAM_TIME) {
getWorld().createExplosion(null, targetPos.getX() + 0.5d, targetPos.getY() + 0.5d, targetPos.getZ() + 0.5d, 0.5f, Explosion.DestructionType.NONE);
Block.dropStack(getWorld(), targetPos, IndustrialLaserRegistry.get(targetState.getBlock(), getWorld().random));
getWorld().breakBlock(targetPos, false);
progress++;
progress = 0;
} else {
Vec3d vec = Vec3d.ofCenter(targetPos);
((ServerWorld) getWorld()).spawnParticles(ParticleTypes.SMOKE, vec.getX(), vec.getY(), vec.getZ(), 1, 0.31f, 0.31f, 0.31f, 0f);
progress++;
}
markDirty();
}
markDirty();
} else if (progress != 0) {
progress = 0;
markDirty();

View File

@ -6,13 +6,18 @@ import com.thebrokenrail.energonrelics.config.HardcodedConfig;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import net.minecraft.world.explosion.Explosion;
public class IndustrialLaserBlock extends AbstractFieldBlock {
public IndustrialLaserBlock() {
@ -29,8 +34,18 @@ public class IndustrialLaserBlock extends AbstractFieldBlock {
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
super.onEntityCollision(state, world, pos, entity);
if (entity instanceof LivingEntity) {
if (entity instanceof CreeperEntity) {
((CreeperEntity) entity).setIgnited();
} else if (entity instanceof LivingEntity) {
entity.damage(DamageSource.IN_FIRE, HardcodedConfig.INDUSTRIAL_LASER_BEAM_DAMAGE);
} else if (entity instanceof ItemEntity) {
ItemStack stack = ((ItemEntity) entity).getStack();
if (stack.getItem() == Items.GUNPOWDER) {
entity.remove();
for (int i = 0; i < stack.getCount(); i++) {
world.createExplosion(entity, entity.getX(), entity.getY(), entity.getZ(), 1.5f, Explosion.DestructionType.NONE);
}
}
}
}

View File

@ -1,11 +1,15 @@
package com.thebrokenrail.energonrelics.mixin;
import com.thebrokenrail.energonrelics.block.forcefield.util.AbstractFieldBlock;
import com.thebrokenrail.energonrelics.energy.core.util.EnergyTicker;
import net.minecraft.block.Block;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(World.class)
@ -19,4 +23,11 @@ public abstract class MixinWorld {
EnergyTicker.tick((World) (Object) this);
}
}
@Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;syncWorldEvent(ILnet/minecraft/util/math/BlockPos;I)V"), method = "breakBlock")
public void breakBlock(World world, int eventId, BlockPos pos, int data) {
if (!(Block.getStateFromRawId(data).getBlock() instanceof AbstractFieldBlock)) {
world.syncWorldEvent(eventId, pos, data);
}
}
}