2020-08-23 08:52:36 -04:00
|
|
|
package com.flemmli97.flan.event;
|
|
|
|
|
|
|
|
import com.flemmli97.flan.claim.ClaimStorage;
|
|
|
|
import com.flemmli97.flan.claim.EnumPermission;
|
2020-10-30 10:09:57 -04:00
|
|
|
import com.flemmli97.flan.claim.IPermissionContainer;
|
2020-08-24 23:29:45 -04:00
|
|
|
import net.minecraft.block.BlockState;
|
|
|
|
import net.minecraft.block.piston.PistonBehavior;
|
2020-08-26 14:15:46 -04:00
|
|
|
import net.minecraft.server.network.ServerPlayerEntity;
|
2020-08-23 08:52:36 -04:00
|
|
|
import net.minecraft.server.world.ServerWorld;
|
|
|
|
import net.minecraft.util.math.BlockPos;
|
2020-08-24 23:29:45 -04:00
|
|
|
import net.minecraft.util.math.Direction;
|
|
|
|
import net.minecraft.world.BlockView;
|
2020-08-23 08:52:36 -04:00
|
|
|
import net.minecraft.world.World;
|
2020-08-25 13:27:44 -04:00
|
|
|
import net.minecraft.world.explosion.Explosion;
|
2020-08-23 08:52:36 -04:00
|
|
|
|
|
|
|
public class WorldEvents {
|
|
|
|
|
2020-08-25 13:27:44 -04:00
|
|
|
public static void modifyExplosion(Explosion explosion, ServerWorld world) {
|
|
|
|
ClaimStorage storage = ClaimStorage.get(world);
|
|
|
|
explosion.getAffectedBlocks().removeIf(pos -> {
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer claim = storage.getForPermissionCheck(pos);
|
2020-08-23 08:52:36 -04:00
|
|
|
if (claim != null)
|
|
|
|
return !claim.canInteract(null, EnumPermission.EXPLOSIONS, pos);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
}
|
2020-08-24 23:29:45 -04:00
|
|
|
|
2020-08-25 13:27:44 -04:00
|
|
|
public static boolean pistonCanPush(BlockState state, World world, BlockPos blockPos, Direction direction, Direction pistonDir) {
|
|
|
|
if (world.isClient || direction == Direction.UP || direction == Direction.DOWN)
|
2020-08-24 23:29:45 -04:00
|
|
|
return true;
|
|
|
|
boolean empty = state.isAir() || state.getPistonBehavior() == PistonBehavior.DESTROY;
|
|
|
|
BlockPos dirPos = blockPos.offset(direction);
|
|
|
|
ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer from = storage.getForPermissionCheck(blockPos);
|
|
|
|
IPermissionContainer to = storage.getForPermissionCheck(dirPos);
|
2020-08-24 23:29:45 -04:00
|
|
|
boolean flag = true;
|
2020-08-25 13:27:44 -04:00
|
|
|
if (!empty) {
|
|
|
|
if ((from != null && !from.equals(to)) || (from == null && to != null))
|
2020-08-24 23:29:45 -04:00
|
|
|
flag = false;
|
|
|
|
}
|
2020-08-25 13:27:44 -04:00
|
|
|
if (from != null && from.equals(to)) {
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer opp = storage.getForPermissionCheck(blockPos.offset(direction.getOpposite()));
|
2020-08-24 23:29:45 -04:00
|
|
|
flag = from.equals(opp);
|
|
|
|
}
|
2020-08-25 13:27:44 -04:00
|
|
|
if (!flag) {
|
2020-08-24 23:29:45 -04:00
|
|
|
world.updateListeners(blockPos, state, state, 20);
|
|
|
|
BlockState toState = world.getBlockState(dirPos);
|
|
|
|
world.updateListeners(dirPos, toState, toState, 20);
|
|
|
|
}
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
|
2020-08-25 13:27:44 -04:00
|
|
|
public static boolean canFlow(BlockState fluidBlockState, BlockView world, BlockPos blockPos, Direction direction) {
|
|
|
|
if (!(world instanceof ServerWorld) || direction == Direction.UP || direction == Direction.DOWN)
|
2020-08-24 23:29:45 -04:00
|
|
|
return true;
|
|
|
|
ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer from = storage.getForPermissionCheck(blockPos);
|
|
|
|
IPermissionContainer to = storage.getForPermissionCheck(blockPos.offset(direction));
|
2020-08-24 23:29:45 -04:00
|
|
|
boolean fl = from == null && to == null;
|
2020-08-25 13:27:44 -04:00
|
|
|
if (from != null)
|
2020-08-24 23:29:45 -04:00
|
|
|
fl = from.equals(to);
|
|
|
|
return fl;
|
|
|
|
}
|
2020-08-26 14:15:46 -04:00
|
|
|
|
2020-09-02 09:36:58 -04:00
|
|
|
public static boolean canStartRaid(ServerPlayerEntity player) {
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer claim = ClaimStorage.get(player.getServerWorld()).getForPermissionCheck(player.getBlockPos());
|
2020-09-03 12:00:37 -04:00
|
|
|
return claim == null || claim.canInteract(player, EnumPermission.RAID, player.getBlockPos());
|
2020-08-26 14:15:46 -04:00
|
|
|
}
|
2020-09-01 16:59:12 -04:00
|
|
|
|
2020-09-02 09:36:58 -04:00
|
|
|
public static boolean canFireSpread(ServerWorld world, BlockPos pos) {
|
2020-10-30 10:09:57 -04:00
|
|
|
IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(pos);
|
2020-09-03 12:00:37 -04:00
|
|
|
return claim == null || claim.canInteract(null, EnumPermission.FIRESPREAD, pos);
|
2020-09-01 16:59:12 -04:00
|
|
|
}
|
2020-08-23 08:52:36 -04:00
|
|
|
}
|