From fbed8b8785327606cf6f7083ffbd2ca02733b4f6 Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Sat, 12 Jun 2021 00:15:14 +0200 Subject: [PATCH] finishing architectury version mostly --- build.gradle | 13 +- common/build.gradle | 18 + .../io/github/flemmli97/flan/ConfigPath.java | 13 + .../flemmli97/flan/commands/CommandClaim.java | 2 +- .../github/flemmli97/flan/config/Config.java | 4 +- .../flemmli97/flan/config/LangConfig.java | 4 +- .../flan/event/ItemInteractEvents.java | 5 +- .../permissionapi/CommandPermission.java | 2 +- .../flemmli97/flan/mixin/FireBlockMixin.java | 8 - .../flan/mixin/PlayerClaimMixin.java | 10 +- .../flemmli97/flan/mixin/PlayerMixin.java | 10 - .../flan/mixin/ServerWorldMixin.java | 12 - .../flemmli97/flan/player/ClaimDisplay.java | 2 +- .../flan/player/PlayerClaimData.java | 5 +- .../src/main/resources/assets}/flan/icon.png | Bin common/src/main/resources/flan.mixins.json | 10 +- .../flemmli97/flan/fabric/ConfigPathImpl.java | 12 + .../flan/fabric}/mixin/EntityDamageMixin.java | 2 +- .../flan/fabric/mixin/FabricFireMixin.java | 24 ++ .../flan/fabric}/mixin/PistonMixin.java | 2 +- .../flan/fabric/mixin/PlayerDropMixin.java | 22 ++ .../flan/fabric}/mixin/ProjectileMixin.java | 2 +- .../mixin/ServerPlayNetworkHandlerMixin.java | 4 +- .../flan/fabric/mixin/ServerWorldMixin.java | 22 ++ .../flan/fabric}/mixin/SnowGolemMixin.java | 2 +- .../flan/fabric}/mixin/SpawnHelperMixin.java | 2 +- .../flan/fabric}/mixin/WitherMixin.java | 2 +- .../flan/fabric}/mixin/XpEntityMixin.java | 2 +- .../fabric/CommandPermissionImpl.java | 2 +- fabric/src/main/resources/fabric.mod.json | 3 +- .../main/resources/flan.fabric.mixins.json | 24 ++ forge/build.gradle | 2 +- .../io/github/flemmli97/flan/FlanForge.java | 21 +- .../flemmli97/flan/forge/ConfigPathImpl.java | 12 + .../flan/forge/mixin/ForgeFireMixin.java | 25 ++ .../flan/forgeevent/BlockInteractEvents.java | 214 ------------ .../forgeevent/BlockInteractEventsForge.java | 26 ++ .../flan/forgeevent/EntityInteractEvents.java | 330 ------------------ .../forgeevent/EntityInteractEventsForge.java | 84 +++++ .../forgeevent/ItemInteractEventsForge.java | 113 +----- .../flan/forgeevent/ServerEvents.java | 21 ++ .../flan/forgeevent/WorldEventsForge.java | 12 +- .../forge/CommandPermissionImpl.java | 2 +- forge/src/main/resources/META-INF/mods.toml | 6 +- .../src/main/resources/flan.forge.mixins.json | 14 + forge/src/main/resources/flan/icon.png | Bin 2924 -> 0 bytes forge/src/main/resources/pack.mcmeta | 6 + 47 files changed, 384 insertions(+), 749 deletions(-) create mode 100644 common/src/main/java/io/github/flemmli97/flan/ConfigPath.java rename {fabric/src/main/resources => common/src/main/resources/assets}/flan/icon.png (100%) create mode 100644 fabric/src/main/java/io/github/flemmli97/flan/fabric/ConfigPathImpl.java rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/EntityDamageMixin.java (96%) create mode 100644 fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/FabricFireMixin.java rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/PistonMixin.java (95%) create mode 100644 fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PlayerDropMixin.java rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/ProjectileMixin.java (96%) rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/ServerPlayNetworkHandlerMixin.java (94%) create mode 100644 fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerWorldMixin.java rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/SnowGolemMixin.java (94%) rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/SpawnHelperMixin.java (95%) rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/WitherMixin.java (93%) rename {common/src/main/java/io/github/flemmli97/flan => fabric/src/main/java/io/github/flemmli97/flan/fabric}/mixin/XpEntityMixin.java (93%) create mode 100644 fabric/src/main/resources/flan.fabric.mixins.json create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forge/ConfigPathImpl.java create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forge/mixin/ForgeFireMixin.java delete mode 100644 forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEvents.java create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEventsForge.java delete mode 100644 forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEvents.java create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEventsForge.java create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java create mode 100644 forge/src/main/resources/flan.forge.mixins.json delete mode 100644 forge/src/main/resources/flan/icon.png create mode 100644 forge/src/main/resources/pack.mcmeta diff --git a/build.gradle b/build.gradle index 4c0c279..0a40e96 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,6 @@ subprojects { loom { silentMojangMappingsLicense() - useFabricMixin = true } dependencies { @@ -27,19 +26,9 @@ allprojects { apply plugin: "maven-publish" archivesBaseName = rootProject.archives_base_name - version = project.minecraft_version + "-"+ rootProject.mod_version + version = project.minecraft_version + "-" + rootProject.mod_version group = rootProject.maven_group - configurations { - modOptional - modCompileOnly.extendsFrom(modOptional) - modRuntime.extendsFrom(modOptional) - - optional - compileOnly.extendsFrom(optional) - runtime.extendsFrom(optional) - } - tasks.withType(JavaCompile) { options.encoding = "UTF-8" def targetVersion = 8 diff --git a/common/build.gradle b/common/build.gradle index 8f681ed..13d766b 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -12,4 +12,22 @@ architectury { java { withSourcesJar() +} + +publishing { + publications { + mavenCommon(MavenPublication) { + artifactId = rootProject.archives_base_name + // add all the jars that should be included when publishing to maven + artifact remapJar + artifact(sourcesJar) { + builtBy remapSourcesJar + } + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } } \ No newline at end of file diff --git a/common/src/main/java/io/github/flemmli97/flan/ConfigPath.java b/common/src/main/java/io/github/flemmli97/flan/ConfigPath.java new file mode 100644 index 0000000..96f9f7b --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/ConfigPath.java @@ -0,0 +1,13 @@ +package io.github.flemmli97.flan; + +import me.shedaniel.architectury.annotations.ExpectPlatform; + +import java.nio.file.Path; + +public class ConfigPath { + + @ExpectPlatform + public static Path configPath() { + throw new AssertionError(); + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java b/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java index 9d98b24..449726b 100644 --- a/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java +++ b/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java @@ -25,11 +25,11 @@ import io.github.flemmli97.flan.player.EnumDisplayType; import io.github.flemmli97.flan.player.EnumEditMode; import io.github.flemmli97.flan.player.OfflinePlayerData; import io.github.flemmli97.flan.player.PlayerClaimData; +import net.minecraft.command.CommandSource; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.command.argument.GameProfileArgumentType; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.CommandSource; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; diff --git a/common/src/main/java/io/github/flemmli97/flan/config/Config.java b/common/src/main/java/io/github/flemmli97/flan/config/Config.java index bb43592..2d80bf5 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/Config.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/Config.java @@ -3,10 +3,10 @@ package io.github.flemmli97.flan.config; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import io.github.flemmli97.flan.ConfigPath; import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.api.ClaimPermission; import io.github.flemmli97.flan.api.PermissionRegistry; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.server.MinecraftServer; @@ -83,7 +83,7 @@ public class Config { }))); public Config(MinecraftServer server) { - File configDir = FabricLoader.getInstance().getConfigDir().resolve("flan").toFile(); + File configDir = ConfigPath.configPath().resolve("flan").toFile(); try { if (!configDir.exists()) configDir.mkdirs(); diff --git a/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java b/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java index e20bdcd..3ce4bb7 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java @@ -4,9 +4,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; +import io.github.flemmli97.flan.ConfigPath; import io.github.flemmli97.flan.api.ClaimPermission; import io.github.flemmli97.flan.api.PermissionRegistry; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; import java.io.File; @@ -137,7 +137,7 @@ public class LangConfig { public LangCommands cmdLang = new LangCommands(); public LangConfig(MinecraftServer server) { - File configDir = FabricLoader.getInstance().getConfigDir().resolve("flan").toFile(); + File configDir = ConfigPath.configPath().resolve("flan").toFile(); //server.getSavePath(WorldSavePath.ROOT).resolve("config/claimConfigs").toFile(); try { if (!configDir.exists()) diff --git a/common/src/main/java/io/github/flemmli97/flan/event/ItemInteractEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/ItemInteractEvents.java index 480341c..910b064 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/ItemInteractEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/ItemInteractEvents.java @@ -34,6 +34,7 @@ import net.minecraft.util.TypedActionResult; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.RaycastContext; import net.minecraft.world.World; import java.util.Set; @@ -46,7 +47,7 @@ public class ItemInteractEvents { ServerPlayerEntity player = (ServerPlayerEntity) p; ItemStack stack = player.getStackInHand(hand); if (stack.getItem() == ConfigHandler.config.claimingItem) { - HitResult ray = player.rayTrace(64, 0, false); + HitResult ray = player.raycast(64, 0, false); if (ray != null && ray.getType() == HitResult.Type.BLOCK) { claimLandHandling(player, ((BlockHitResult) ray).getBlockPos()); return TypedActionResult.success(stack); @@ -54,7 +55,7 @@ public class ItemInteractEvents { return TypedActionResult.pass(stack); } if (stack.getItem() == ConfigHandler.config.inspectionItem) { - HitResult ray = player.rayTrace(32, 0, false); + HitResult ray = player.raycast(32, 0, false); if (ray != null && ray.getType() == HitResult.Type.BLOCK) { inspect(player, ((BlockHitResult) ray).getBlockPos()); return TypedActionResult.success(stack); diff --git a/common/src/main/java/io/github/flemmli97/flan/integration/permissionapi/CommandPermission.java b/common/src/main/java/io/github/flemmli97/flan/integration/permissionapi/CommandPermission.java index f79be4e..771e203 100644 --- a/common/src/main/java/io/github/flemmli97/flan/integration/permissionapi/CommandPermission.java +++ b/common/src/main/java/io/github/flemmli97/flan/integration/permissionapi/CommandPermission.java @@ -1,7 +1,7 @@ package io.github.flemmli97.flan.integration.permissionapi; import me.shedaniel.architectury.annotations.ExpectPlatform; -import net.minecraft.server.command.CommandSource; +import net.minecraft.command.CommandSource; import net.minecraft.server.network.ServerPlayerEntity; public class CommandPermission { diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/FireBlockMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/FireBlockMixin.java index 3fef1b2..c10bbb2 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/FireBlockMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/FireBlockMixin.java @@ -5,7 +5,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.FireBlock; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import net.minecraft.world.WorldView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -32,11 +31,4 @@ public abstract class FireBlockMixin { info.cancel(); } } - - @Inject(method = "trySpreadingFire", at = @At(value = "HEAD"), cancellable = true) - public void spread(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo info) { - if (!world.isClient && !WorldEvents.canFireSpread((ServerWorld) world, pos)) { - info.cancel(); - } - } } diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerClaimMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerClaimMixin.java index 047c533..f634729 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerClaimMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerClaimMixin.java @@ -1,7 +1,6 @@ package io.github.flemmli97.flan.mixin; import io.github.flemmli97.flan.claim.Claim; -import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.player.IPlayerClaimImpl; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.nbt.CompoundTag; @@ -41,9 +40,9 @@ public abstract class PlayerClaimMixin implements IPlayerClaimImpl { this.claimData.save(this.server); } - @Inject(method = "tick", at = @At("RETURN")) + @Inject(method = "tick", at = @At("HEAD")) private void tickData(CallbackInfo info) { - this.claimData.tick(); + this.claimData.tick(this.currentClaim, claim -> this.currentClaim = claim); } @Inject(method = "copyFrom", at = @At("RETURN")) @@ -51,11 +50,6 @@ public abstract class PlayerClaimMixin implements IPlayerClaimImpl { this.claimData.clone(PlayerClaimData.get(oldPlayer)); } - @Inject(method = "tick", at = @At("HEAD")) - private void claimupdate(CallbackInfo info) { - EntityInteractEvents.updateClaim((ServerPlayerEntity) (Object) this, this.currentClaim, claim -> this.currentClaim = claim); - } - @Override public PlayerClaimData get() { return this.claimData; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java index 0718151..d91685b 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java @@ -4,25 +4,15 @@ import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PlayerEntity.class) public abstract class PlayerMixin { - @Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "HEAD"), cancellable = true) - public void drop(ItemStack stack, boolean throwRandomly, boolean retainOwnership, CallbackInfoReturnable info) { - if (!EntityInteractEvents.canDropItem((PlayerEntity) (Object) this, stack)) { - info.setReturnValue(null); - info.cancel(); - } - } - @ModifyVariable(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;setPickupDelay(I)V")) private ItemEntity ownerDrop(ItemEntity entity) { EntityInteractEvents.updateDroppedItem((PlayerEntity) (Object) this, entity); diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/ServerWorldMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/ServerWorldMixin.java index f96e09f..907ea06 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/ServerWorldMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/ServerWorldMixin.java @@ -2,19 +2,12 @@ package io.github.flemmli97.flan.mixin; import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.IClaimStorage; -import io.github.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 IClaimStorage { @@ -33,11 +26,6 @@ public abstract class ServerWorldMixin implements IClaimStorage { 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 info, Explosion explosion) { - WorldEvents.modifyExplosion(explosion, (ServerWorld) (Object) this); - } - @Override public ClaimStorage get() { return this.claimData; diff --git a/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java b/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java index d0851dd..092c5f0 100644 --- a/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java +++ b/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java @@ -142,7 +142,7 @@ public class ClaimDisplay { if (state.getMaterial().isReplaceable()) { pos = pos.down(); state = world.getBlockState(pos); - while (state.getMaterial().isReplaceable() && !World.isHeightInvalid(pos)) { + while (state.getMaterial().isReplaceable() && !World.isOutOfBuildLimitVertically(pos)) { pos = pos.down(); state = world.getBlockState(pos); } diff --git a/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java b/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java index c91bac2..1594431 100644 --- a/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java +++ b/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java @@ -10,6 +10,7 @@ import io.github.flemmli97.flan.claim.IPermissionContainer; import io.github.flemmli97.flan.claim.ParticleIndicators; import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.block.BlockState; import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.server.MinecraftServer; @@ -32,6 +33,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; public class PlayerClaimData { @@ -212,7 +214,8 @@ public class PlayerClaimData { return false; } - public void tick() { + public void tick(Claim currentClaim, Consumer cons) { + EntityInteractEvents.updateClaim(this.player, currentClaim, cons); boolean tool = this.player.getMainHandStack().getItem() == ConfigHandler.config.claimingItem || this.player.getOffHandStack().getItem() == ConfigHandler.config.claimingItem; boolean stick = this.player.getMainHandStack().getItem() == ConfigHandler.config.inspectionItem diff --git a/fabric/src/main/resources/flan/icon.png b/common/src/main/resources/assets/flan/icon.png similarity index 100% rename from fabric/src/main/resources/flan/icon.png rename to common/src/main/resources/assets/flan/icon.png diff --git a/common/src/main/resources/flan.mixins.json b/common/src/main/resources/flan.mixins.json index ad260c7..941e3ec 100644 --- a/common/src/main/resources/flan.mixins.json +++ b/common/src/main/resources/flan.mixins.json @@ -6,27 +6,19 @@ "mixins": [ "PlayerClaimMixin", "ServerWorldMixin", - "ServerPlayNetworkHandlerMixin", "AbstractBlockStateMixin", "EntityMixin", - "ProjectileMixin", "TurtleEggMixin", - "XpEntityMixin", - "WitherMixin", "IPersistentProjectileVars", - "EntityDamageMixin", "ItemStackMixin", "ILecternBlockValues", "FluidMixin", - "PistonMixin", "RaidManagerMixin", "FireBlockMixin", - "SpawnHelperMixin", "PlayerMixin", "ItemEntityMixin", "EndermanPickupMixin", - "EndermanPlaceMixin", - "SnowGolemMixin" + "EndermanPlaceMixin" ], "server": [ ], diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/ConfigPathImpl.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/ConfigPathImpl.java new file mode 100644 index 0000000..7c256d1 --- /dev/null +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/ConfigPathImpl.java @@ -0,0 +1,12 @@ +package io.github.flemmli97.flan.fabric; + +import net.fabricmc.loader.api.FabricLoader; + +import java.nio.file.Path; + +public class ConfigPathImpl { + + public static Path configPath() { + return FabricLoader.getInstance().getConfigDir(); + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/EntityDamageMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/EntityDamageMixin.java similarity index 96% rename from common/src/main/java/io/github/flemmli97/flan/mixin/EntityDamageMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/EntityDamageMixin.java index 6786dce..f632b88 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/EntityDamageMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/EntityDamageMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.Entity; diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/FabricFireMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/FabricFireMixin.java new file mode 100644 index 0000000..9a6cabe --- /dev/null +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/FabricFireMixin.java @@ -0,0 +1,24 @@ +package io.github.flemmli97.flan.fabric.mixin; + +import io.github.flemmli97.flan.event.WorldEvents; +import net.minecraft.block.FireBlock; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +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.Random; + +@Mixin(FireBlock.class) +public class FabricFireMixin { + + @Inject(method = "trySpreadingFire", at = @At(value = "HEAD"), cancellable = true) + public void spread(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo info) { + if (!world.isClient && !WorldEvents.canFireSpread((ServerWorld) world, pos)) { + info.cancel(); + } + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java similarity index 95% rename from common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java index a2d5beb..ebec7f1 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.WorldEvents; import net.minecraft.block.BlockState; diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PlayerDropMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PlayerDropMixin.java new file mode 100644 index 0000000..176c179 --- /dev/null +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PlayerDropMixin.java @@ -0,0 +1,22 @@ +package io.github.flemmli97.flan.fabric.mixin; + +import io.github.flemmli97.flan.event.EntityInteractEvents; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PlayerEntity.class) +public abstract class PlayerDropMixin { + + @Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "HEAD"), cancellable = true) + public void drop(ItemStack stack, boolean throwRandomly, boolean retainOwnership, CallbackInfoReturnable info) { + if (!EntityInteractEvents.canDropItem((PlayerEntity) (Object) this, stack)) { + info.setReturnValue(null); + info.cancel(); + } + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/ProjectileMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ProjectileMixin.java similarity index 96% rename from common/src/main/java/io/github/flemmli97/flan/mixin/ProjectileMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ProjectileMixin.java index c4e82c5..87dab84 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/ProjectileMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ProjectileMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.projectile.DragonFireballEntity; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/ServerPlayNetworkHandlerMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerPlayNetworkHandlerMixin.java similarity index 94% rename from common/src/main/java/io/github/flemmli97/flan/mixin/ServerPlayNetworkHandlerMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerPlayNetworkHandlerMixin.java index 96ff6f7..6745706 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/ServerPlayNetworkHandlerMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerPlayNetworkHandlerMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.Entity; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public abstract class ServerPlayNetworkHandlerMixin { @Shadow - public ServerPlayerEntity player; + private ServerPlayerEntity player; @Inject(method = "onPlayerInteractEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;interact(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;"), cancellable = true) public void onPlayerInteractEntity(PlayerInteractEntityC2SPacket packet, CallbackInfo info) { diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerWorldMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerWorldMixin.java new file mode 100644 index 0000000..bd3d2f4 --- /dev/null +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/ServerWorldMixin.java @@ -0,0 +1,22 @@ +package io.github.flemmli97.flan.fabric.mixin; + +import io.github.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.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(ServerWorld.class) +public abstract class ServerWorldMixin { + + @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 info, Explosion explosion) { + WorldEvents.modifyExplosion(explosion, (ServerWorld) (Object) this); + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/SnowGolemMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SnowGolemMixin.java similarity index 94% rename from common/src/main/java/io/github/flemmli97/flan/mixin/SnowGolemMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SnowGolemMixin.java index 0fdca07..f9d953f 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/SnowGolemMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SnowGolemMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.passive.SnowGolemEntity; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/SpawnHelperMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SpawnHelperMixin.java similarity index 95% rename from common/src/main/java/io/github/flemmli97/flan/mixin/SpawnHelperMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SpawnHelperMixin.java index 9b93312..b4f2741 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/SpawnHelperMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/SpawnHelperMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.WorldEvents; import net.minecraft.entity.mob.MobEntity; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/WitherMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/WitherMixin.java similarity index 93% rename from common/src/main/java/io/github/flemmli97/flan/mixin/WitherMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/WitherMixin.java index 11627f6..286b53b 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/WitherMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/WitherMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.boss.WitherEntity; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/XpEntityMixin.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/XpEntityMixin.java similarity index 93% rename from common/src/main/java/io/github/flemmli97/flan/mixin/XpEntityMixin.java rename to fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/XpEntityMixin.java index 390fcf4..6e243ed 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/XpEntityMixin.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/XpEntityMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.mixin; +package io.github.flemmli97.flan.fabric.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; import net.minecraft.entity.ExperienceOrbEntity; diff --git a/fabric/src/main/java/io/github/flemmli97/flan/integration/permissionapi/fabric/CommandPermissionImpl.java b/fabric/src/main/java/io/github/flemmli97/flan/integration/permissionapi/fabric/CommandPermissionImpl.java index 074d8d3..b6a1245 100644 --- a/fabric/src/main/java/io/github/flemmli97/flan/integration/permissionapi/fabric/CommandPermissionImpl.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/integration/permissionapi/fabric/CommandPermissionImpl.java @@ -3,7 +3,7 @@ package io.github.flemmli97.flan.integration.permissionapi.fabric; import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.config.ConfigHandler; import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.server.command.CommandSource; +import net.minecraft.command.CommandSource; import net.minecraft.server.network.ServerPlayerEntity; public class CommandPermissionImpl { diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 9165bc1..3b0714f 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,7 +20,8 @@ ] }, "mixins": [ - "flan.mixins.json" + "flan.mixins.json", + "flan.fabric.mixins.json" ], "depends": { "fabricloader": ">=0.7.4", diff --git a/fabric/src/main/resources/flan.fabric.mixins.json b/fabric/src/main/resources/flan.fabric.mixins.json new file mode 100644 index 0000000..c0542d1 --- /dev/null +++ b/fabric/src/main/resources/flan.fabric.mixins.json @@ -0,0 +1,24 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.flemmli97.flan.fabric.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ServerWorldMixin", + "PistonMixin", + "SpawnHelperMixin", + "ServerPlayNetworkHandlerMixin", + "ProjectileMixin", + "EntityDamageMixin", + "XpEntityMixin", + "PlayerDropMixin", + "WitherMixin", + "SnowGolemMixin", + "FabricFireMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/build.gradle b/forge/build.gradle index e07ea1e..1e397a3 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -23,7 +23,7 @@ architectury { } loom { - //mixinConfigs = ["flan.mixins.json"] + mixinConfigs = ["flan.mixins.json", "flan.forge.mixins.json"] useFabricMixin = true } diff --git a/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java b/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java index 266c121..952e55f 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java @@ -1,10 +1,11 @@ package io.github.flemmli97.flan; +import io.github.flemmli97.flan.forgeevent.BlockInteractEventsForge; +import io.github.flemmli97.flan.forgeevent.EntityInteractEventsForge; +import io.github.flemmli97.flan.forgeevent.ItemInteractEventsForge; +import io.github.flemmli97.flan.forgeevent.ServerEvents; import io.github.flemmli97.flan.forgeevent.WorldEventsForge; -import net.minecraft.world.explosion.Explosion; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; @@ -18,5 +19,19 @@ public class FlanForge { forge.addListener(WorldEventsForge::modifyExplosion); forge.addListener(WorldEventsForge::pistonCanPush); forge.addListener(WorldEventsForge::preventMobSpawn); + forge.addListener(ItemInteractEventsForge::useItem); + forge.addListener(BlockInteractEventsForge::breakBlocks); + forge.addListener(BlockInteractEventsForge::useBlocks); + forge.addListener(EntityInteractEventsForge::attackEntity); + forge.addListener(EntityInteractEventsForge::useAtEntity); + forge.addListener(EntityInteractEventsForge::useEntity); + forge.addListener(EntityInteractEventsForge::projectileHit); + forge.addListener(EntityInteractEventsForge::preventDamage); + forge.addListener(EntityInteractEventsForge::xpAbsorb); + forge.addListener(EntityInteractEventsForge::canDropItem); + forge.addListener(EntityInteractEventsForge::mobGriefing); + + forge.addListener(ServerEvents::serverStart); + forge.addListener(ServerEvents::commands); } } diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/ConfigPathImpl.java b/forge/src/main/java/io/github/flemmli97/flan/forge/ConfigPathImpl.java new file mode 100644 index 0000000..71f9d1b --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/ConfigPathImpl.java @@ -0,0 +1,12 @@ +package io.github.flemmli97.flan.forge; + +import net.minecraftforge.fml.loading.FMLPaths; + +import java.nio.file.Path; + +public class ConfigPathImpl { + + public static Path configPath() { + return FMLPaths.CONFIGDIR.get(); + } +} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/mixin/ForgeFireMixin.java b/forge/src/main/java/io/github/flemmli97/flan/forge/mixin/ForgeFireMixin.java new file mode 100644 index 0000000..100a808 --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/mixin/ForgeFireMixin.java @@ -0,0 +1,25 @@ +package io.github.flemmli97.flan.forge.mixin; + +import io.github.flemmli97.flan.event.WorldEvents; +import net.minecraft.block.FireBlock; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +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.Random; + +@Mixin(FireBlock.class) +public class ForgeFireMixin { + + @Inject(method = "tryCatchFire", at = @At(value = "HEAD"), cancellable = true) + public void spread(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, Direction dir, CallbackInfo info) { + if (!world.isClient && !WorldEvents.canFireSpread((ServerWorld) world, pos)) { + info.cancel(); + } + } +} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEvents.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEvents.java deleted file mode 100644 index c568e3c..0000000 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEvents.java +++ /dev/null @@ -1,214 +0,0 @@ -package io.github.flemmli97.flan.forgeevent; - -import io.github.flemmli97.flan.api.ClaimPermission; -import io.github.flemmli97.flan.api.PermissionRegistry; -import io.github.flemmli97.flan.claim.ClaimStorage; -import io.github.flemmli97.flan.claim.IPermissionContainer; -import io.github.flemmli97.flan.claim.ObjectToPermissionMap; -import io.github.flemmli97.flan.config.ConfigHandler; -import io.github.flemmli97.flan.gui.LockedLecternScreenHandler; -import io.github.flemmli97.flan.player.EnumDisplayType; -import io.github.flemmli97.flan.player.PlayerClaimData; -import net.minecraft.block.BlockState; -import net.minecraft.block.DoorBlock; -import net.minecraft.block.InventoryProvider; -import net.minecraft.block.LecternBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.LecternBlockEntity; -import net.minecraft.block.enums.DoubleBlockHalf; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; - -public class BlockInteractEvents { - - public static boolean breakBlocks(World world, PlayerEntity p, BlockPos pos, BlockState state, BlockEntity tile) { - if (world.isClient || p.isSpectator()) - return true; - ServerPlayerEntity player = (ServerPlayerEntity) p; - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) { - Identifier id = Registry.BLOCK.getId(state.getBlock()); - if (alwaysAllowBlock(id, world.getBlockEntity(pos))) - return true; - if (!claim.canInteract(player, PermissionRegistry.BREAK, pos, true)) { - PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); - return false; - } - } - return true; - } - - //Right click block - public static ActionResult useBlocks(PlayerEntity p, World world, Hand hand, BlockHitResult hitResult) { - if (world.isClient) - return ActionResult.PASS; - ServerPlayerEntity player = (ServerPlayerEntity) p; - ItemStack stack = player.getStackInHand(hand); - if (stack.getItem() == ConfigHandler.config.claimingItem) { - ItemInteractEventsForge.claimLandHandling(player, hitResult.getBlockPos()); - return ActionResult.SUCCESS; - } - if (stack.getItem() == ConfigHandler.config.inspectionItem) { - ItemInteractEventsForge.inspect(player, hitResult.getBlockPos()); - return ActionResult.SUCCESS; - } - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - IPermissionContainer claim = storage.getForPermissionCheck(hitResult.getBlockPos()); - if (claim != null) { - boolean emptyHand = !player.getMainHandStack().isEmpty() || !player.getOffHandStack().isEmpty(); - boolean cancelBlockInteract = player.shouldCancelInteraction() && emptyHand; - if (!cancelBlockInteract) { - BlockState state = world.getBlockState(hitResult.getBlockPos()); - Identifier id = Registry.BLOCK.getId(state.getBlock()); - BlockEntity blockEntity = world.getBlockEntity(hitResult.getBlockPos()); - if (alwaysAllowBlock(id, blockEntity)) - return ActionResult.PASS; - ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); - if (perm == PermissionRegistry.PROJECTILES) - perm = PermissionRegistry.OPENCONTAINER; - //Pressureplate handled elsewhere - if (perm != null && perm != PermissionRegistry.PRESSUREPLATE) { - if (claim.canInteract(player, perm, hitResult.getBlockPos(), true)) - return ActionResult.PASS; - if (state.getBlock() instanceof DoorBlock) { - DoubleBlockHalf half = state.get(DoorBlock.HALF); - if (half == DoubleBlockHalf.LOWER) { - BlockState other = world.getBlockState(hitResult.getBlockPos().up()); - player.networkHandler.sendPacket(new BlockUpdateS2CPacket(hitResult.getBlockPos().up(), other)); - } else { - BlockState other = world.getBlockState(hitResult.getBlockPos().down()); - player.networkHandler.sendPacket(new BlockUpdateS2CPacket(hitResult.getBlockPos().down(), other)); - } - } - PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); - return ActionResult.FAIL; - } - if (blockEntity != null) { - if (blockEntity instanceof LecternBlockEntity) { - if (claim.canInteract(player, PermissionRegistry.LECTERNTAKE, hitResult.getBlockPos(), false)) - return ActionResult.PASS; - if (state.get(LecternBlock.HAS_BOOK)) - LockedLecternScreenHandler.create(player, (LecternBlockEntity) blockEntity); - return ActionResult.FAIL; - } - if (!ConfigHandler.config.lenientBlockEntityCheck || blockEntity instanceof Inventory || blockEntity instanceof InventoryProvider) { - if (claim.canInteract(player, PermissionRegistry.OPENCONTAINER, hitResult.getBlockPos(), true)) - return ActionResult.PASS; - PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); - return ActionResult.FAIL; - } - } - } - } - return ActionResult.PASS; - } - - public static boolean alwaysAllowBlock(Identifier id, BlockEntity blockEntity) { - return ConfigHandler.config.ignoredBlocks.contains(id.toString()) - || (blockEntity != null - && ConfigHandler.config.blockEntityTagIgnore.stream().anyMatch(blockEntity.toTag(new CompoundTag())::contains)); - } - - public static boolean cancelEntityBlockCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (world.isClient) - return false; - ServerPlayerEntity player = null; - if (entity instanceof ServerPlayerEntity) - player = (ServerPlayerEntity) entity; - else if (entity instanceof ProjectileEntity) { - Entity owner = ((ProjectileEntity) entity).getOwner(); - if (owner instanceof ServerPlayerEntity) - player = (ServerPlayerEntity) owner; - } else if (entity instanceof ItemEntity) { - Entity owner = ((ServerWorld) world).getEntity(((ItemEntity) entity).getThrower()); - if (owner instanceof ServerPlayerEntity) - player = (ServerPlayerEntity) owner; - } - if (player == null) - return false; - ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); - if (perm == null) - return false; - if (perm != PermissionRegistry.PRESSUREPLATE && perm != PermissionRegistry.PORTAL) - return false; - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) - return !claim.canInteract(player, perm, pos, false); - return false; - } - - public static boolean preventFallOn(Entity entity, double heightDifference, boolean onGround, BlockState landedState, BlockPos landedPosition) { - if (entity.world.isClient) - return false; - if (entity instanceof ServerPlayerEntity) { - ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock()); - if (perm != PermissionRegistry.TRAMPLE) - return false; - ClaimStorage storage = ClaimStorage.get((ServerWorld) entity.world); - IPermissionContainer claim = storage.getForPermissionCheck(landedPosition); - if (claim == null) - return false; - return !claim.canInteract((ServerPlayerEntity) entity, perm, landedPosition, true); - } else if (entity instanceof ProjectileEntity) { - Entity owner = ((ProjectileEntity) entity).getOwner(); - if (owner instanceof ServerPlayerEntity) { - ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock()); - if (perm != PermissionRegistry.TRAMPLE) - return false; - ClaimStorage storage = ClaimStorage.get((ServerWorld) entity.world); - IPermissionContainer claim = storage.getForPermissionCheck(landedPosition); - return !claim.canInteract((ServerPlayerEntity) owner, perm, landedPosition, true); - } - } - return false; - } - - public static boolean canBreakTurtleEgg(World world, BlockPos pos, Entity entity) { - if (world.isClient) - return false; - ServerWorld serverWorld = (ServerWorld) world; - if (entity instanceof ServerPlayerEntity) { - ClaimStorage storage = ClaimStorage.get(serverWorld); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim == null) - return false; - return !claim.canInteract((ServerPlayerEntity) entity, PermissionRegistry.TRAMPLE, pos, true); - } else if (entity instanceof ProjectileEntity) { - Entity owner = ((ProjectileEntity) entity).getOwner(); - if (owner instanceof ServerPlayerEntity) { - ClaimStorage storage = ClaimStorage.get(serverWorld); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim == null) - return false; - return !claim.canInteract((ServerPlayerEntity) owner, PermissionRegistry.TRAMPLE, pos, true); - } - } else if (entity instanceof ItemEntity) { - Entity owner = serverWorld.getEntity(((ItemEntity) entity).getThrower()); - if (owner instanceof ServerPlayerEntity) { - ClaimStorage storage = ClaimStorage.get(serverWorld); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim == null) - return false; - return !claim.canInteract((ServerPlayerEntity) owner, PermissionRegistry.TRAMPLE, pos, true); - } - } - return false; - } -} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEventsForge.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEventsForge.java new file mode 100644 index 0000000..df5236b --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/BlockInteractEventsForge.java @@ -0,0 +1,26 @@ +package io.github.flemmli97.flan.forgeevent; + +import io.github.flemmli97.flan.event.BlockInteractEvents; +import net.minecraft.util.ActionResult; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.BlockEvent; + +public class BlockInteractEventsForge { + + public static void breakBlocks(BlockEvent.BreakEvent event) { + if (!(event.getWorld() instanceof World)) + return; + if (BlockInteractEvents.breakBlocks((World) event.getWorld(), event.getPlayer(), event.getPos(), event.getState(), event.getWorld().getBlockEntity(event.getPos()))) + event.setCanceled(true); + } + + //Right click block + public static void useBlocks(PlayerInteractEvent.RightClickBlock event) { + ActionResult result = BlockInteractEvents.useBlocks(event.getPlayer(), event.getWorld(), event.getHand(), event.getHitVec()); + if (result != ActionResult.PASS) { + event.setCancellationResult(result); + event.setCanceled(true); + } + } +} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEvents.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEvents.java deleted file mode 100644 index 2e1f0fc..0000000 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEvents.java +++ /dev/null @@ -1,330 +0,0 @@ -package io.github.flemmli97.flan.forgeevent; - -import io.github.flemmli97.flan.api.ClaimPermission; -import io.github.flemmli97.flan.api.PermissionRegistry; -import io.github.flemmli97.flan.claim.Claim; -import io.github.flemmli97.flan.claim.ClaimStorage; -import io.github.flemmli97.flan.claim.IPermissionContainer; -import io.github.flemmli97.flan.claim.ObjectToPermissionMap; -import io.github.flemmli97.flan.config.ConfigHandler; -import io.github.flemmli97.flan.mixin.IPersistentProjectileVars; -import io.github.flemmli97.flan.player.IOwnedItem; -import io.github.flemmli97.flan.player.PlayerClaimData; -import io.github.flemmli97.flan.player.TeleportUtils; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.mob.Monster; -import net.minecraft.entity.passive.SnowGolemEntity; -import net.minecraft.entity.passive.TameableEntity; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.entity.projectile.thrown.EggEntity; -import net.minecraft.entity.projectile.thrown.EnderPearlEntity; -import net.minecraft.entity.projectile.thrown.PotionEntity; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.StorageMinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.s2c.play.InventoryS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -public class EntityInteractEvents { - - public static ActionResult attackEntity(PlayerEntity player, World world, Hand hand, Entity entity, EntityHitResult hitResult) { - return attackSimple(player, entity, true); - } - - public static ActionResult useAtEntity(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult) { - if (player.world.isClient || player.isSpectator() || canInteract(entity)) - return ActionResult.PASS; - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - BlockPos pos = entity.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) { - if (entity instanceof ArmorStandEntity) { - if (!claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.ARMORSTAND, pos, true)) - return ActionResult.FAIL; - } - } - return ActionResult.PASS; - } - - public static ActionResult useEntity(PlayerEntity p, World world, Hand hand, Entity entity) { - if (p.world.isClient || p.isSpectator() || canInteract(entity)) - return ActionResult.PASS; - ServerPlayerEntity player = (ServerPlayerEntity) p; - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - BlockPos pos = entity.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) { - if (entity instanceof BoatEntity) - return claim.canInteract(player, PermissionRegistry.BOAT, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - if (entity instanceof AbstractMinecartEntity) { - if (entity instanceof StorageMinecartEntity) - return claim.canInteract(player, PermissionRegistry.OPENCONTAINER, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - return claim.canInteract(player, PermissionRegistry.MINECART, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - } - if (entity instanceof VillagerEntity) - return claim.canInteract(player, PermissionRegistry.TRADING, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - if (entity instanceof ItemFrameEntity) - return claim.canInteract(player, PermissionRegistry.ITEMFRAMEROTATE, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - if (entity instanceof TameableEntity) { - TameableEntity tame = (TameableEntity) entity; - if (tame.isOwner(player)) - return ActionResult.PASS; - } - return claim.canInteract(player, PermissionRegistry.ANIMALINTERACT, pos, true) ? ActionResult.PASS : ActionResult.FAIL; - } - return ActionResult.PASS; - } - - public static boolean canInteract(Entity entity) { - return entity.getScoreboardTags().stream().anyMatch(ConfigHandler.config.entityTagIgnore::contains); - } - - public static boolean projectileHit(ProjectileEntity proj, HitResult res) { - if (proj.world.isClient) - return false; - Entity owner = proj.getOwner(); - if (owner instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) owner; - if (res.getType() == HitResult.Type.BLOCK) { - BlockHitResult blockRes = (BlockHitResult) res; - BlockPos pos = blockRes.getBlockPos(); - BlockState state = proj.world.getBlockState(pos); - ClaimPermission perm; - if (proj instanceof EnderPearlEntity) - perm = PermissionRegistry.ENDERPEARL; - else if (proj instanceof EggEntity || proj instanceof PotionEntity) - perm = PermissionRegistry.PROJECTILES; - else - perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); - if (perm != PermissionRegistry.ENDERPEARL && perm != PermissionRegistry.TARGETBLOCK && perm != PermissionRegistry.PROJECTILES) - return false; - ClaimStorage storage = ClaimStorage.get((ServerWorld) proj.world); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim == null) - return false; - boolean flag = !claim.canInteract(player, perm, pos, true); - if (flag) { - if (proj instanceof PersistentProjectileEntity) { - PersistentProjectileEntity pers = (PersistentProjectileEntity) proj; - ((IPersistentProjectileVars) pers).setInBlockState(pers.world.getBlockState(pos)); - Vec3d vec3d = blockRes.getPos().subtract(pers.getX(), pers.getY(), pers.getZ()); - pers.setVelocity(vec3d); - Vec3d vec3d2 = vec3d.normalize().multiply(0.05000000074505806D); - pers.setPos(pers.getX() - vec3d2.x, pers.getY() - vec3d2.y, pers.getZ() - vec3d2.z); - pers.playSound(((IPersistentProjectileVars) pers).getSoundEvent(), 1.0F, 1.2F / (pers.world.random.nextFloat() * 0.2F + 0.9F)); - ((IPersistentProjectileVars) pers).setInGround(true); - pers.shake = 7; - pers.setCritical(false); - pers.setPierceLevel((byte) 0); - pers.setSound(SoundEvents.ENTITY_ARROW_HIT); - pers.setShotFromCrossbow(false); - ((IPersistentProjectileVars) pers).resetPiercingStatus(); - } - //TODO: find a way to properly update chorus fruit break on hit - //player.getServer().send(new ServerTask(player.getServer().getTicks()+2, ()->player.world.updateListeners(pos, state, state, 2))); - } - return flag; - } else if (res.getType() == HitResult.Type.ENTITY) { - if (proj instanceof EnderPearlEntity) { - ClaimStorage storage = ClaimStorage.get((ServerWorld) proj.world); - IPermissionContainer claim = storage.getForPermissionCheck(proj.getBlockPos()); - return claim.canInteract(player, PermissionRegistry.ENDERPEARL, proj.getBlockPos(), true); - } - Entity hit = ((EntityHitResult) res).getEntity(); - boolean fail = attackSimple(player, hit, true) != ActionResult.PASS; - if (fail && proj instanceof PersistentProjectileEntity && ((PersistentProjectileEntity) proj).getPierceLevel() > 0) { - PersistentProjectileEntity pers = (PersistentProjectileEntity) proj; - IntOpenHashSet pierced = ((IPersistentProjectileVars) pers).getPiercedEntities(); - if (pierced == null) - pierced = new IntOpenHashSet(5); - pierced.add(hit.getEntityId()); - ((IPersistentProjectileVars) pers).setPiercedEntities(pierced); - pers.setPierceLevel((byte) (pers.getPierceLevel() + 1)); - } - return fail; - } - } - return false; - } - - public static boolean preventDamage(Entity entity, DamageSource source) { - if (source.getAttacker() instanceof ServerPlayerEntity) - return attackSimple((ServerPlayerEntity) source.getAttacker(), entity, true) != ActionResult.PASS; - else if (source.isExplosive() && !entity.world.isClient) { - IPermissionContainer claim = ClaimStorage.get((ServerWorld) entity.world).getForPermissionCheck(entity.getBlockPos()); - return claim != null && !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, entity.getBlockPos()); - } - return false; - } - - public static ActionResult attackSimple(PlayerEntity p, Entity entity, boolean message) { - if (p.world.isClient || p.isSpectator() || canInteract(entity)) - return ActionResult.PASS; - if (entity instanceof Monster) - return ActionResult.PASS; - ServerPlayerEntity player = (ServerPlayerEntity) p; - ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); - BlockPos pos = entity.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) { - if (!(entity instanceof LivingEntity)) - return claim.canInteract(player, PermissionRegistry.BREAKNONLIVING, pos, message) ? ActionResult.PASS : ActionResult.FAIL; - if (entity instanceof PlayerEntity) - return claim.canInteract(player, PermissionRegistry.HURTPLAYER, pos, message) ? ActionResult.PASS : ActionResult.FAIL; - return claim.canInteract(player, PermissionRegistry.HURTANIMAL, pos, message) ? ActionResult.PASS : ActionResult.FAIL; - } - return ActionResult.PASS; - } - - public static boolean xpAbsorb(PlayerEntity player) { - if (player instanceof ServerPlayerEntity) { - ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); - BlockPos pos = player.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) - return !claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.XP, pos, false); - } - return false; - } - - public static boolean canCollideWith(PlayerEntity player, Entity entity) { - if (player instanceof ServerPlayerEntity) { - ServerPlayerEntity sPlayer = (ServerPlayerEntity) player; - if (entity instanceof ItemEntity) { - IOwnedItem ownedItem = (IOwnedItem) entity; - if (ownedItem.getDeathPlayer() != null && ConfigHandler.config.lockDrops) { - ServerPlayerEntity other = sPlayer.getServer().getPlayerManager().getPlayer(ownedItem.getDeathPlayer()); - if (other == null) - return false; - return ownedItem.getDeathPlayer().equals(player.getUuid()) || PlayerClaimData.get(other).deathItemsUnlocked(); - } - if (sPlayer.getUuid().equals(ownedItem.getPlayerOrigin())) - return true; - ClaimStorage storage = ClaimStorage.get(sPlayer.getServerWorld()); - BlockPos pos = sPlayer.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim != null) - return claim.canInteract(sPlayer, PermissionRegistry.PICKUP, pos, false); - } - } - return true; - } - - public static boolean canDropItem(PlayerEntity player, ItemStack stack) { - if (!player.isDead() && player instanceof ServerPlayerEntity) { - ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); - BlockPos pos = player.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - boolean allow = true; - if (claim != null) - allow = claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.DROP, pos, false); - if (!allow) { - player.inventory.insertStack(stack); - DefaultedList stacks = DefaultedList.of(); - for (int j = 0; j < player.currentScreenHandler.slots.size(); ++j) { - ItemStack itemStack2 = player.currentScreenHandler.slots.get(j).getStack(); - stacks.add(itemStack2.isEmpty() ? ItemStack.EMPTY : itemStack2); - } - ((ServerPlayerEntity) player).networkHandler.sendPacket(new InventoryS2CPacket(player.currentScreenHandler.syncId, stacks)); - } - return allow; - } - return true; - } - - public static boolean witherCanDestroy(WitherEntity wither) { - if (wither.world.isClient) - return true; - ClaimStorage storage = ClaimStorage.get((ServerWorld) wither.world); - BlockPos.Mutable pos = wither.getBlockPos().mutableCopy(); - for (int x = -1; x <= 1; x++) - for (int z = -1; z <= 1; z++) { - IPermissionContainer claim = storage.getForPermissionCheck(wither.getBlockPos().add(x, 0, z)); - if (!claim.canInteract(null, PermissionRegistry.WITHER, pos.set(pos.getX() + x, pos.getY() + 3, pos.getZ() + z), false)) - return false; - } - return true; - } - - public static boolean canEndermanInteract(EndermanEntity enderman, BlockPos pos) { - if (enderman.world.isClient) - return true; - ClaimStorage storage = ClaimStorage.get((ServerWorld) enderman.world); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - return claim.canInteract(null, PermissionRegistry.ENDERMAN, pos, false); - } - - public static boolean canSnowGolemInteract(SnowGolemEntity snowgolem) { - if (snowgolem.world.isClient) - return true; - int x, y, z; - for (int l = 0; l < 4; ++l) { - x = MathHelper.floor(snowgolem.getX() + (l % 2 * 2 - 1) * 0.25F); - y = MathHelper.floor(snowgolem.getY()); - z = MathHelper.floor(snowgolem.getZ() + (l / 2 % 2 * 2 - 1) * 0.25F); - BlockPos pos = new BlockPos(x, y, z); - IPermissionContainer claim = ClaimStorage.get((ServerWorld) snowgolem.world).getForPermissionCheck(pos); - if (!claim.canInteract(null, PermissionRegistry.SNOWGOLEM, pos, false)) - return false; - } - return true; - } - - public static void updateDroppedItem(PlayerEntity player, ItemEntity entity) { - ((IOwnedItem) entity).setOriginPlayer((player)); - } - - public static void updateClaim(ServerPlayerEntity player, Claim currentClaim, Consumer cons) { - Vec3d pos = player.getPos(); - BlockPos rounded = TeleportUtils.roundedBlockPos(pos.add(0, player.getActiveEyeHeight(player.getPose(), player.getDimensions(player.getPose())), 0)); - ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); - if (currentClaim != null) { - if (!currentClaim.insideClaim(rounded)) { - cons.accept(null); - } else { - if (!player.isSpectator()) { - BlockPos.Mutable bPos = rounded.mutableCopy(); - if (!currentClaim.canInteract(player, PermissionRegistry.CANSTAY, bPos, true)) { - Vec3d tp = TeleportUtils.getTeleportPos(player, pos, storage, currentClaim.getDimensions(), bPos, (claim, nPos) -> claim.canInteract(player, PermissionRegistry.CANSTAY, nPos, false)); - player.teleport(tp.getX(), tp.getY(), tp.getZ()); - } - if (player.abilities.flying && !player.isCreative() && !currentClaim.canInteract(player, PermissionRegistry.FLIGHT, rounded, true)) { - player.abilities.flying = false; - player.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); - } - } - } - } else if (player.age % 3 == 0) { - Claim claim = storage.getClaimAt(rounded); - cons.accept(claim); - } - } -} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEventsForge.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEventsForge.java new file mode 100644 index 0000000..1165a64 --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/EntityInteractEventsForge.java @@ -0,0 +1,84 @@ +package io.github.flemmli97.flan.forgeevent; + +import io.github.flemmli97.flan.event.EntityInteractEvents; +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.WitherEntity; +import net.minecraft.entity.passive.SnowGolemEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraftforge.event.entity.EntityMobGriefingEvent; +import net.minecraftforge.event.entity.ProjectileImpactEvent; +import net.minecraftforge.event.entity.item.ItemTossEvent; +import net.minecraftforge.event.entity.living.LivingDamageEvent; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.entity.player.PlayerXpEvent; +import net.minecraftforge.eventbus.api.Event; + +public class EntityInteractEventsForge { + + public static ActionResult attackEntity(AttackEntityEvent event) { + return EntityInteractEvents.attackSimple(event.getPlayer(), event.getTarget(), true); + } + + public static void useAtEntity(PlayerInteractEvent.EntityInteractSpecific event) { + Entity target = event.getTarget(); + ActionResult result = EntityInteractEvents.useAtEntity(event.getPlayer(), event.getWorld(), event.getHand(), target, + new EntityHitResult(target, event.getLocalPos().add(target.getX(), target.getY(), target.getZ()))); + if (result != ActionResult.PASS) { + event.setCancellationResult(result); + event.setCanceled(true); + } + } + + public static void useEntity(PlayerInteractEvent.EntityInteract event) { + ActionResult result = EntityInteractEvents.useEntity(event.getPlayer(), event.getWorld(), event.getHand(), event.getTarget()); + if (result != ActionResult.PASS) { + event.setCancellationResult(result); + event.setCanceled(true); + } + } + + public static void projectileHit(ProjectileImpactEvent event) { + if (!(event.getEntity() instanceof ProjectileEntity)) + return; + boolean stop = EntityInteractEvents.projectileHit((ProjectileEntity) event.getEntity(), event.getRayTraceResult()); + if (stop) { + event.setCanceled(true); + } + } + + public static void preventDamage(LivingDamageEvent event) { + boolean prevent = EntityInteractEvents.preventDamage(event.getEntity(), event.getSource()); + if (prevent) { + event.setCanceled(true); + } + } + + public static void xpAbsorb(PlayerXpEvent.PickupXp event) { + boolean prevent = EntityInteractEvents.xpAbsorb(event.getPlayer()); + if (prevent) + event.setCanceled(true); + } + + public static void canDropItem(ItemTossEvent event) { + boolean canDrop = EntityInteractEvents.canDropItem(event.getPlayer(), event.getEntityItem().getStack()); + if (!canDrop) { + event.setCanceled(true); + } + } + + /** + * EntityInteractEvents.witherCanDestroy + * EntityInteractEvents.canSnowGolemInteract + */ + public static void mobGriefing(EntityMobGriefingEvent event) { + if (event.getEntity() instanceof WitherEntity && EntityInteractEvents.witherCanDestroy((WitherEntity) event.getEntity())) { + event.setResult(Event.Result.DENY); + } + if (event.getEntity() instanceof SnowGolemEntity && !EntityInteractEvents.canSnowGolemInteract((SnowGolemEntity) event.getEntity())) { + event.setResult(Event.Result.DENY); + } + } +} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ItemInteractEventsForge.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ItemInteractEventsForge.java index 6153b72..c90ac5c 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ItemInteractEventsForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ItemInteractEventsForge.java @@ -1,119 +1,18 @@ package io.github.flemmli97.flan.forgeevent; -import com.google.common.collect.Sets; -import com.mojang.authlib.GameProfile; -import io.github.flemmli97.flan.api.ClaimPermission; -import io.github.flemmli97.flan.api.PermissionRegistry; -import io.github.flemmli97.flan.claim.Claim; -import io.github.flemmli97.flan.claim.ClaimStorage; -import io.github.flemmli97.flan.claim.IPermissionContainer; -import io.github.flemmli97.flan.claim.ObjectToPermissionMap; -import io.github.flemmli97.flan.claim.PermHelper; -import io.github.flemmli97.flan.config.ConfigHandler; -import io.github.flemmli97.flan.integration.permissionapi.CommandPermission; -import io.github.flemmli97.flan.player.EnumDisplayType; -import io.github.flemmli97.flan.player.EnumEditMode; -import io.github.flemmli97.flan.player.PlayerClaimData; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPlacementContext; +import io.github.flemmli97.flan.event.ItemInteractEvents; import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.item.Items; -import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.Text; import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import java.util.Set; - public class ItemInteractEventsForge { - public static TypedActionResult useItem(PlayerInteractEvent.RightClickItem event) { - - event.set - PlayerInteractEvent.RightClickItem event - if (world.isClient || p.isSpectator()) - return TypedActionResult.pass(p.getStackInHand(hand)); - ServerPlayerEntity player = (ServerPlayerEntity) p; - ItemStack stack = player.getStackInHand(hand); - if (stack.getItem() == ConfigHandler.config.claimingItem) { - HitResult ray = player.rayTrace(64, 0, false); - if (ray != null && ray.getType() == HitResult.Type.BLOCK) { - claimLandHandling(player, ((BlockHitResult) ray).getBlockPos()); - return TypedActionResult.success(stack); - } - return TypedActionResult.pass(stack); + public static void useItem(PlayerInteractEvent.RightClickItem event) { + TypedActionResult result = ItemInteractEvents.useItem(event.getPlayer(), event.getWorld(), event.getHand()); + if (result.getResult() != ActionResult.PASS) { + event.setCanceled(true); + event.setCancellationResult(result.getResult()); } - if (stack.getItem() == ConfigHandler.config.inspectionItem) { - HitResult ray = player.rayTrace(32, 0, false); - if (ray != null && ray.getType() == HitResult.Type.BLOCK) { - inspect(player, ((BlockHitResult) ray).getBlockPos()); - return TypedActionResult.success(stack); - } - return TypedActionResult.pass(stack); - } - - ClaimStorage storage = ClaimStorage.get((ServerWorld) world); - BlockPos pos = player.getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(pos); - if (claim == null) - return TypedActionResult.pass(stack); - ClaimPermission perm = ObjectToPermissionMap.getFromItem(stack.getItem()); - if (perm != null) - return claim.canInteract(player, perm, pos, true) ? TypedActionResult.pass(stack) : TypedActionResult.fail(stack); - return TypedActionResult.pass(stack); - } - - private static final Set blackListedItems = Sets.newHashSet(Items.COMPASS, Items.FILLED_MAP, Items.FIREWORK_ROCKET); - - public static ActionResult onItemUseBlock(ItemUsageContext context) { - //Check for Fakeplayer. Since there is no api for that directly check the class - if (!(context.getPlayer() instanceof ServerPlayerEntity) || !context.getPlayer().getClass().equals(ServerPlayerEntity.class) || context.getStack().isEmpty()) - return ActionResult.PASS; - ClaimStorage storage = ClaimStorage.get((ServerWorld) context.getWorld()); - BlockPos placePos = new ItemPlacementContext(context).getBlockPos(); - IPermissionContainer claim = storage.getForPermissionCheck(placePos.add(0, 255, 0)); - if (claim == null) - return ActionResult.PASS; - if (blackListedItems.contains(context.getStack().getItem())) - return ActionResult.PASS; - boolean actualInClaim = !(claim instanceof Claim) || placePos.getY() >= ((Claim) claim).getDimensions()[4]; - ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); - ClaimPermission perm = ObjectToPermissionMap.getFromItem(context.getStack().getItem()); - if (perm != null) { - if (claim.canInteract(player, perm, placePos, false)) - return ActionResult.PASS; - else if (actualInClaim) { - player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); - return ActionResult.FAIL; - } - } - if (claim.canInteract(player, PermissionRegistry.PLACE, placePos, false)) { - if (!actualInClaim && context.getStack().getItem() instanceof BlockItem) { - ((Claim) claim).extendDownwards(placePos); - } - return ActionResult.PASS; - } else if (actualInClaim) { - player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); - BlockState other = context.getWorld().getBlockState(placePos.up()); - player.networkHandler.sendPacket(new BlockUpdateS2CPacket(placePos.up(), other)); - PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); - updateHeldItem(player); - return ActionResult.FAIL; - } - return ActionResult.PASS; } } diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java new file mode 100644 index 0000000..381ff15 --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java @@ -0,0 +1,21 @@ +package io.github.flemmli97.flan.forgeevent; + +import io.github.flemmli97.flan.Flan; +import io.github.flemmli97.flan.claim.ObjectToPermissionMap; +import io.github.flemmli97.flan.commands.CommandClaim; +import io.github.flemmli97.flan.config.ConfigHandler; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent; + +public class ServerEvents { + + public static void serverStart(FMLServerAboutToStartEvent event) { + ConfigHandler.serverLoad(event.getServer()); + ObjectToPermissionMap.reload(event.getServer()); + Flan.lockRegistry(event.getServer()); + } + + public static void commands(RegisterCommandsEvent event) { + CommandClaim.register(event.getDispatcher(), false); + } +} diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java index 87b1019..0be8bbc 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java @@ -1,21 +1,13 @@ package io.github.flemmli97.flan.forgeevent; -import io.github.flemmli97.flan.api.PermissionRegistry; -import io.github.flemmli97.flan.claim.ClaimStorage; -import io.github.flemmli97.flan.claim.IPermissionContainer; import io.github.flemmli97.flan.event.WorldEvents; -import net.minecraft.block.BlockState; -import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.mob.MobEntity; -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 net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.event.world.PistonEvent; +import net.minecraftforge.eventbus.api.Event; public class WorldEventsForge { @@ -35,6 +27,6 @@ public class WorldEventsForge { if (!(event.getWorld() instanceof ServerWorld) || !(event.getEntityLiving() instanceof MobEntity)) return; if (WorldEvents.preventMobSpawn((ServerWorld) event.getWorld(), (MobEntity) event.getEntityLiving())) - event.setCanceled(true); + event.setResult(Event.Result.DENY); } } diff --git a/forge/src/main/java/io/github/flemmli97/flan/integration/permissionapi/forge/CommandPermissionImpl.java b/forge/src/main/java/io/github/flemmli97/flan/integration/permissionapi/forge/CommandPermissionImpl.java index d5431ab..e0152f5 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/integration/permissionapi/forge/CommandPermissionImpl.java +++ b/forge/src/main/java/io/github/flemmli97/flan/integration/permissionapi/forge/CommandPermissionImpl.java @@ -1,7 +1,7 @@ package io.github.flemmli97.flan.integration.permissionapi.forge; import io.github.flemmli97.flan.config.ConfigHandler; -import net.minecraft.server.command.CommandSource; +import net.minecraft.command.CommandSource; import net.minecraft.server.network.ServerPlayerEntity; public class CommandPermissionImpl { diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index e50edf1..df243f8 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -3,13 +3,13 @@ loaderVersion="[35,)" license="All rights reserved" issueTrackerURL="https://github.com/Flemmli97/Flan/issues" displayURL="https://github.com/Flemmli97/Flan" -# logoFile="flan/icon.png" +# logoFile="assets/flan/icon.png" credits="" authors="Flemmli97" [[mods]] modId="flan" - version="${file.jarVersion}" + version="${version}" displayName="Flan" # updateJSONURL="" authors="Flemmli97" - description='''Land claiming mod''' + description='''Flan (Forge version): A serverside claiming mod''' diff --git a/forge/src/main/resources/flan.forge.mixins.json b/forge/src/main/resources/flan.forge.mixins.json new file mode 100644 index 0000000..6bbe6b3 --- /dev/null +++ b/forge/src/main/resources/flan.forge.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.flemmli97.flan.forge.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ForgeFireMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/src/main/resources/flan/icon.png b/forge/src/main/resources/flan/icon.png deleted file mode 100644 index 4ccbd9b8511d059e0c1c8dab0ea1c0e5c10ef361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2924 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL0&GB$3;M76ft;31XXgM_iqWrYXoKyw| zjfu4rZ9NVpIqs1tu2`LDFTFHSezSV2MXywT;N4)c!X=CYGN z+ig72)#X;>XOni3wNrlQx~f0Nc3wznOz#S_GWFLH@^0k|vz{TUJGY|CV%1Bwr`(eL zrstyPd@Y)~_1(#MiIbArr(>3z_OOU;WRVmK2?=zPTT$X?><>&pIwLsCRq-MjeeUZ9XX)sVS+Xe@SU?YtAPn-E)&Xx0ePyc%ggkQqH~Au93SkKP^#YJp7gS zhVz4*cmFEqm4Em@kN4My>~izJ_iVIJi!m@9Q2u?8g@K`gfsuiMg##Ny!2#%GkQ6F| zkqIh-!r%}9Dh7$5FdQ0yq973kj)|NM^RDgt@#XcKeCvR<@t3CmU-NGRb3nbG0yewh z&O)^t?iv)k!D=wuqTYp^Z?~mX6~xLvZN_(>^ZtE%{j>Yo z{>RTA<=LFCIZxkc?C=TDKWQg<)Y_Wit2rdzu0}2IKKLP}{nj77Ox3jpb<^*ZMY-SK ztQX?|%*aG!F&rrdo^(JA0bq`2z+ixLJV?qxLP?mxW^LxiGuweF{+d-RPn$Z>fzO$s zg$t?`puz<#f?@?+gn(UeOX1}Wm~lv8=7P9&;oIk)-1zgo#eCb}pZ@K9@3|G6j>;B9 zy)H47nD>T3@xR`}I64Q6!w)n^9N1n+&z#@k!@v(oy^UGm?6rxR;l8>!Eg}J>Qi7Li z0&OQ)Y}(KhNBQ1eZ+-g88h-C+z?Qb)sSP#0L5Tx3;<4Kaw;arXRXq&`E@~^L_uJS1 z(EfXpFC=@e9^2u`vJJm>$K5ScbGLRlLFc4#;BcJmy*+w%>>nnCt~UN?nfxZetk7Jy=V)tx}a-Xfz}eFVdQ&MBb@02)J|Pyhe` diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..e0d120b --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Flan resources", + "pack_format": 6 + } +} \ No newline at end of file