change explosion injection to serverworld to prevent other mods modifying explosion

This commit is contained in:
Flemmli97 2020-08-25 19:27:44 +02:00
parent ba95c9a3d7
commit 2570e35ef5
4 changed files with 58 additions and 84 deletions

View File

@ -5,22 +5,18 @@ import com.flemmli97.flan.claim.ClaimStorage;
import com.flemmli97.flan.claim.EnumPermission;
import net.minecraft.block.BlockState;
import net.minecraft.block.piston.PistonBehavior;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import java.util.List;
import net.minecraft.world.explosion.Explosion;
public class WorldEvents {
public static void modifyExplosion(List<BlockPos> list, World world) {
if (world.isClient)
return;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
list.removeIf(pos -> {
public static void modifyExplosion(Explosion explosion, ServerWorld world) {
ClaimStorage storage = ClaimStorage.get(world);
explosion.getAffectedBlocks().removeIf(pos -> {
Claim claim = storage.getClaimAt(pos);
if (claim != null)
return !claim.canInteract(null, EnumPermission.EXPLOSIONS, pos);
@ -28,8 +24,8 @@ public class WorldEvents {
});
}
public static boolean pistonCanPush(BlockState state, World world, BlockPos blockPos, Direction direction, Direction pistonDir){
if(world.isClient||direction == Direction.UP || direction == Direction.DOWN)
public static boolean pistonCanPush(BlockState state, World world, BlockPos blockPos, Direction direction, Direction pistonDir) {
if (world.isClient || direction == Direction.UP || direction == Direction.DOWN)
return true;
boolean empty = state.isAir() || state.getPistonBehavior() == PistonBehavior.DESTROY;
BlockPos dirPos = blockPos.offset(direction);
@ -37,15 +33,15 @@ public class WorldEvents {
Claim from = storage.getClaimAt(blockPos);
Claim to = storage.getClaimAt(dirPos);
boolean flag = true;
if(!empty){
if((from!=null && !from.equals(to)) || (from==null && to!=null))
if (!empty) {
if ((from != null && !from.equals(to)) || (from == null && to != null))
flag = false;
}
if(from!=null && from.equals(to)){
if (from != null && from.equals(to)) {
Claim opp = storage.getClaimAt(blockPos.offset(direction.getOpposite()));
flag = from.equals(opp);
}
if(!flag) {
if (!flag) {
world.updateListeners(blockPos, state, state, 20);
BlockState toState = world.getBlockState(dirPos);
world.updateListeners(dirPos, toState, toState, 20);
@ -53,14 +49,14 @@ public class WorldEvents {
return flag;
}
public static boolean canFlow(BlockState fluidBlockState, BlockView world, BlockPos blockPos, Direction direction){
if(!(world instanceof ServerWorld)||direction == Direction.UP || direction == Direction.DOWN)
public static boolean canFlow(BlockState fluidBlockState, BlockView world, BlockPos blockPos, Direction direction) {
if (!(world instanceof ServerWorld) || direction == Direction.UP || direction == Direction.DOWN)
return true;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
Claim from = storage.getClaimAt(blockPos);
Claim to = storage.getClaimAt(blockPos.offset(direction));
boolean fl = from == null && to == null;
if(from!=null)
if (from != null)
fl = from.equals(to);
return fl;
}

View File

@ -1,27 +0,0 @@
package com.flemmli97.flan.mixin;
import com.flemmli97.flan.event.WorldEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.explosion.Explosion;
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.callback.CallbackInfo;
import java.util.List;
@Mixin(Explosion.class)
public abstract class ExplosionMixin {
@Shadow
private List<BlockPos> affectedBlocks;
@Shadow
private World world;
@Inject(method = "collectBlocksAndDamageEntities", at = @At(value = "RETURN"))
public void collision(CallbackInfo info) {
WorldEvents.modifyExplosion(this.affectedBlocks, this.world);
}
}

View File

@ -0,0 +1,45 @@
package com.flemmli97.flan.mixin;
import com.flemmli97.flan.IClaimData;
import com.flemmli97.flan.claim.ClaimStorage;
import com.flemmli97.flan.event.WorldEvents;
import net.minecraft.entity.Entity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.explosion.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(ServerWorld.class)
public abstract class ServerWorldMixin implements IClaimData {
@Unique
private ClaimStorage claimData;
@Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this);
this.claimData = new ClaimStorage(world.getServer(), world);
}
@Inject(method = "saveLevel()V", at = @At("RETURN"))
private void saveClaimData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this);
this.claimData.save(world.getServer(), world.getRegistryKey());
}
@Inject(method = "createExplosion", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/explosion/Explosion;collectBlocksAndDamageEntities()V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD)
private void explosionHook(Entity entity, DamageSource damageSource, ExplosionBehavior explosionBehavior, double d, double e, double f, float g, boolean bl, Explosion.DestructionType destructionType, CallbackInfoReturnable<Explosion> info, Explosion explosion) {
WorldEvents.modifyExplosion(explosion, (ServerWorld) (Object) this);
}
@Override
public ClaimStorage getClaimData() {
return this.claimData;
}
}

View File

@ -1,40 +0,0 @@
package com.flemmli97.flan.mixin;
import com.flemmli97.flan.IClaimData;
import com.flemmli97.flan.claim.ClaimStorage;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.MutableWorldProperties;
import net.minecraft.world.World;
import net.minecraft.world.dimension.DimensionType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.function.Supplier;
@Mixin(ServerWorld.class)
public abstract class WorldClaimMixin implements IClaimData {
@Unique
private ClaimStorage claimData;
@Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) {
ServerWorld world = ((ServerWorld)(Object)this);
this.claimData = new ClaimStorage(world.getServer(), world);
}
@Inject(method = "saveLevel()V", at = @At("RETURN"))
private void saveClaimData(CallbackInfo info) {
ServerWorld world = ((ServerWorld)(Object)this);
this.claimData.save(world.getServer(), world.getRegistryKey());
}
@Override
public ClaimStorage getClaimData() {
return this.claimData;
}
}