change explosion injection to serverworld to prevent other mods modifying explosion
This commit is contained in:
parent
ba95c9a3d7
commit
2570e35ef5
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
45
src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java
Normal file
45
src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user