port to 1.18

This commit is contained in:
Flemmli97 2021-12-03 22:37:35 +01:00
parent 0f895b7f56
commit a8d1737e53
119 changed files with 2362 additions and 2382 deletions

View File

@ -5,8 +5,8 @@ buildscript {
} }
plugins { plugins {
id "architectury-plugin" version "3.1-SNAPSHOT" id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "0.7.2-SNAPSHOT" apply false id "dev.architectury.loom" version "0.10.0-SNAPSHOT" apply false
id 'com.matthewprenger.cursegradle' version '1.4.0' id 'com.matthewprenger.cursegradle' version '1.4.0'
} }
@ -27,7 +27,7 @@ subprojects {
dependencies { dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" mappings loom.officialMojangMappings()
} }
} }
@ -42,10 +42,7 @@ allprojects {
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
options.encoding = "UTF-8" options.encoding = "UTF-8"
def targetVersion = 8 options.release = 17
if (JavaVersion.current().isJava9Compatible()) {
options.release = targetVersion
}
} }
java { java {
@ -119,7 +116,7 @@ curseforge {
addGameVersion "Fabric" addGameVersion "Fabric"
mainArtifact(project(":fabric").tasks.getByName('remapJar')) { mainArtifact(project(":fabric").tasks.getByName('remapJar')) {
def txt = changelog(1).replace("\n-", "\n\n- ") def txt = changelog(1).replace("\n-", "\n\n- ")
txt = txt + "\n\n" + "For past versions see: https://github.com/Flemmli97/Flan/blob/1.16/Changelog.md" txt = txt + "\n\n" + "For past versions see: ${project.full_changelog}"
changelog = txt changelog = txt
changelogType = "markdown" changelogType = "markdown"
releaseType = 'release' releaseType = 'release'
@ -138,7 +135,7 @@ curseforge {
addGameVersion "Forge" addGameVersion "Forge"
mainArtifact(project(":forge").tasks.getByName('remapJar')) { mainArtifact(project(":forge").tasks.getByName('remapJar')) {
def txt = changelog(1).replace("\n-", "\n\n- ") def txt = changelog(1).replace("\n-", "\n\n- ")
txt = txt + "\n\n" + "For past versions see: https://github.com/Flemmli97/Flan/blob/1.16/Changelog.md" txt = txt + "\n\n" + "For past versions see: ${project.full_changelog}"
changelog = txt changelog = txt
changelogType = "markdown" changelogType = "markdown"
releaseType = 'release' releaseType = 'release'
@ -161,7 +158,7 @@ tasks.getByName("curseforge").doLast {
def message = new Message() def message = new Message()
def version = project.curse_versions.split(', ')[0] def version = project.curse_versions.split(', ')[0]
message.setUsername("Curseforge Release") message.setUsername("Curseforge Release")
message.setContent("<@&852113509243682817> ${project.project_name} ${project.mod_version} for Minecraft ${version} has been released!") message.setContent("${project.discord_role} ${project.project_name} ${project.mod_version} for Minecraft ${version} has been released!")
message.setAvatarUrl("https://cdn.discordapp.com/avatars/680540027255652407/e4b7a058b24843ae13389a9a3cc3ae8c.png?size=128") message.setAvatarUrl("https://cdn.discordapp.com/avatars/680540027255652407/e4b7a058b24843ae13389a9a3cc3ae8c.png?size=128")
def embed = new Embed() def embed = new Embed()

View File

@ -1,5 +1,5 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "5.0.0" id "com.github.johnrengelman.shadow" version "7.1.0"
} }
configurations { configurations {
@ -34,10 +34,6 @@ transformProductionForge {
input.set shadowJar.archiveFile input.set shadowJar.archiveFile
} }
java {
withSourcesJar()
}
publishing { publishing {
publications { publications {
mavenCommon(MavenPublication) { mavenCommon(MavenPublication) {

View File

@ -1,12 +1,12 @@
package io.github.flemmli97.flan; package io.github.flemmli97.flan;
import me.shedaniel.architectury.annotations.ExpectPlatform; import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.block.Block;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.item.Item;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.nio.file.Path; import java.nio.file.Path;
@ -18,7 +18,7 @@ public class CrossPlatformStuff {
} }
@ExpectPlatform @ExpectPlatform
public static SimpleRegistryWrapper<StatusEffect> registryStatusEffects() { public static SimpleRegistryWrapper<MobEffect> registryStatusEffects() {
throw new AssertionError(); throw new AssertionError();
} }

View File

@ -1,15 +1,15 @@
package io.github.flemmli97.flan; package io.github.flemmli97.flan;
import net.minecraft.util.Identifier; import net.minecraft.resources.ResourceLocation;
/** /**
* Simple structure to get stuff from registries * Simple structure to get stuff from registries
*/ */
public interface SimpleRegistryWrapper<T> { public interface SimpleRegistryWrapper<T> {
T getFromId(Identifier id); T getFromId(ResourceLocation id);
Identifier getIDFrom(T entry); ResourceLocation getIDFrom(T entry);
Iterable<T> getIterator(); Iterable<T> getIterator();
} }

View File

@ -7,8 +7,8 @@ import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.player.OfflinePlayerData; import io.github.flemmli97.flan.player.OfflinePlayerData;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerPlayer;
import java.util.UUID; import java.util.UUID;
@ -19,14 +19,14 @@ public class ClaimHandler {
* You can then use IPermissionContainer#getForPermissionCheck * You can then use IPermissionContainer#getForPermissionCheck
* to return an {@link IPermissionContainer} for which you can then check permissions against * to return an {@link IPermissionContainer} for which you can then check permissions against
*/ */
public static IPermissionStorage getPermissionStorage(ServerWorld world) { public static IPermissionStorage getPermissionStorage(ServerLevel world) {
return ClaimStorage.get(world); return ClaimStorage.get(world);
} }
/** /**
* Gets the claim data for the given player * Gets the claim data for the given player
*/ */
public static IPlayerData getPlayerData(ServerPlayerEntity player) { public static IPlayerData getPlayerData(ServerPlayer player) {
return PlayerClaimData.get(player); return PlayerClaimData.get(player);
} }
@ -34,7 +34,7 @@ public class ClaimHandler {
* Same as the above but with an uuid. Use this if the player is not online. * Same as the above but with an uuid. Use this if the player is not online.
*/ */
public static IPlayerData getPlayerData(MinecraftServer server, UUID uuid) { public static IPlayerData getPlayerData(MinecraftServer server, UUID uuid) {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayer player = server.getPlayerList().getPlayer(uuid);
if (player != null) if (player != null)
return getPlayerData(player); return getPlayerData(player);
return new OfflinePlayerData(server, uuid); return new OfflinePlayerData(server, uuid);

View File

@ -1,12 +1,12 @@
package io.github.flemmli97.flan.api.data; package io.github.flemmli97.flan.api.data;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.util.math.BlockPos; import net.minecraft.server.level.ServerPlayer;
public interface IPermissionContainer { public interface IPermissionContainer {
default boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos) { default boolean canInteract(ServerPlayer player, ClaimPermission perm, BlockPos pos) {
return this.canInteract(player, perm, pos, false); return this.canInteract(player, perm, pos, false);
} }
@ -15,6 +15,6 @@ public interface IPermissionContainer {
* *
* @param player The player doing the action. Can be null * @param player The player doing the action. Can be null
*/ */
boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos, boolean message); boolean canInteract(ServerPlayer player, ClaimPermission perm, BlockPos pos, boolean message);
} }

View File

@ -1,6 +1,6 @@
package io.github.flemmli97.flan.api.data; package io.github.flemmli97.flan.api.data;
import net.minecraft.util.math.BlockPos; import net.minecraft.core.BlockPos;
public interface IPermissionStorage { public interface IPermissionStorage {

View File

@ -1,9 +1,9 @@
package io.github.flemmli97.flan.api.permission; package io.github.flemmli97.flan.api.permission;
import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.Claim;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.item.ItemStack; import net.minecraft.world.entity.player.Player;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.item.ItemStack;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -56,7 +56,7 @@ public class ClaimPermission {
} }
public interface ClaimTest { public interface ClaimTest {
PermissionFlag test(Claim claim, PlayerEntity player, BlockPos pos); PermissionFlag test(Claim claim, Player player, BlockPos pos);
} }
private static final ClaimTest pass = (claim, player, pos) -> PermissionFlag.PASS; private static final ClaimTest pass = (claim, player, pos) -> PermissionFlag.PASS;

View File

@ -1,36 +1,36 @@
package io.github.flemmli97.flan.api.permission; package io.github.flemmli97.flan.api.permission;
import io.github.flemmli97.flan.CrossPlatformStuff; import io.github.flemmli97.flan.CrossPlatformStuff;
import net.minecraft.block.AbstractButtonBlock;
import net.minecraft.block.AbstractPressurePlateBlock;
import net.minecraft.block.AbstractRedstoneGateBlock;
import net.minecraft.block.AnvilBlock;
import net.minecraft.block.BeaconBlock;
import net.minecraft.block.BedBlock;
import net.minecraft.block.BellBlock;
import net.minecraft.block.Block;
import net.minecraft.block.CampfireBlock;
import net.minecraft.block.ChorusFlowerBlock;
import net.minecraft.block.DaylightDetectorBlock;
import net.minecraft.block.DoorBlock;
import net.minecraft.block.EnchantingTableBlock;
import net.minecraft.block.EnderChestBlock;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.block.FenceGateBlock;
import net.minecraft.block.JukeboxBlock;
import net.minecraft.block.LeverBlock;
import net.minecraft.block.NetherPortalBlock;
import net.minecraft.block.NoteBlock;
import net.minecraft.block.RedstoneWireBlock;
import net.minecraft.block.TargetBlock;
import net.minecraft.block.TntBlock;
import net.minecraft.block.TrapdoorBlock;
import net.minecraft.block.TurtleEggBlock;
import net.minecraft.item.BucketItem;
import net.minecraft.item.EnderPearlItem;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.BucketItem;
import net.minecraft.world.item.EnderpearlItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.AnvilBlock;
import net.minecraft.world.level.block.BasePressurePlateBlock;
import net.minecraft.world.level.block.BeaconBlock;
import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.BellBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.ButtonBlock;
import net.minecraft.world.level.block.CampfireBlock;
import net.minecraft.world.level.block.ChorusFlowerBlock;
import net.minecraft.world.level.block.DaylightDetectorBlock;
import net.minecraft.world.level.block.DiodeBlock;
import net.minecraft.world.level.block.DoorBlock;
import net.minecraft.world.level.block.EnchantmentTableBlock;
import net.minecraft.world.level.block.EnderChestBlock;
import net.minecraft.world.level.block.FarmBlock;
import net.minecraft.world.level.block.FenceGateBlock;
import net.minecraft.world.level.block.JukeboxBlock;
import net.minecraft.world.level.block.LeverBlock;
import net.minecraft.world.level.block.NetherPortalBlock;
import net.minecraft.world.level.block.NoteBlock;
import net.minecraft.world.level.block.RedStoneWireBlock;
import net.minecraft.world.level.block.TargetBlock;
import net.minecraft.world.level.block.TntBlock;
import net.minecraft.world.level.block.TrapDoorBlock;
import net.minecraft.world.level.block.TurtleEggBlock;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -95,21 +95,21 @@ public class ObjectToPermissionMap {
registerBlockPredicateMap((block) -> block instanceof BeaconBlock, () -> PermissionRegistry.BEACON); registerBlockPredicateMap((block) -> block instanceof BeaconBlock, () -> PermissionRegistry.BEACON);
registerBlockPredicateMap((block) -> block instanceof DoorBlock, () -> PermissionRegistry.DOOR); registerBlockPredicateMap((block) -> block instanceof DoorBlock, () -> PermissionRegistry.DOOR);
registerBlockPredicateMap((block) -> block instanceof FenceGateBlock, () -> PermissionRegistry.FENCEGATE); registerBlockPredicateMap((block) -> block instanceof FenceGateBlock, () -> PermissionRegistry.FENCEGATE);
registerBlockPredicateMap((block) -> block instanceof TrapdoorBlock, () -> PermissionRegistry.TRAPDOOR); registerBlockPredicateMap((block) -> block instanceof TrapDoorBlock, () -> PermissionRegistry.TRAPDOOR);
registerBlockPredicateMap((block) -> block instanceof LeverBlock || block instanceof AbstractButtonBlock, () -> PermissionRegistry.BUTTONLEVER); registerBlockPredicateMap((block) -> block instanceof LeverBlock || block instanceof ButtonBlock, () -> PermissionRegistry.BUTTONLEVER);
registerBlockPredicateMap((block) -> block instanceof NoteBlock, () -> PermissionRegistry.NOTEBLOCK); registerBlockPredicateMap((block) -> block instanceof NoteBlock, () -> PermissionRegistry.NOTEBLOCK);
registerBlockPredicateMap((block) -> block instanceof AbstractRedstoneGateBlock || block instanceof RedstoneWireBlock || block instanceof DaylightDetectorBlock, () -> PermissionRegistry.REDSTONE); registerBlockPredicateMap((block) -> block instanceof DiodeBlock || block instanceof RedStoneWireBlock || block instanceof DaylightDetectorBlock, () -> PermissionRegistry.REDSTONE);
registerBlockPredicateMap((block) -> block instanceof JukeboxBlock, () -> PermissionRegistry.JUKEBOX); registerBlockPredicateMap((block) -> block instanceof JukeboxBlock, () -> PermissionRegistry.JUKEBOX);
registerBlockPredicateMap((block) -> block instanceof AbstractPressurePlateBlock, () -> PermissionRegistry.PRESSUREPLATE); registerBlockPredicateMap((block) -> block instanceof BasePressurePlateBlock, () -> PermissionRegistry.PRESSUREPLATE);
registerBlockPredicateMap((block) -> block instanceof NetherPortalBlock, () -> PermissionRegistry.PORTAL); registerBlockPredicateMap((block) -> block instanceof NetherPortalBlock, () -> PermissionRegistry.PORTAL);
registerBlockPredicateMap((block) -> block instanceof TurtleEggBlock || block instanceof FarmlandBlock, () -> PermissionRegistry.TRAMPLE); registerBlockPredicateMap((block) -> block instanceof TurtleEggBlock || block instanceof FarmBlock, () -> PermissionRegistry.TRAMPLE);
registerBlockPredicateMap((block) -> block instanceof TargetBlock, () -> PermissionRegistry.TARGETBLOCK); registerBlockPredicateMap((block) -> block instanceof TargetBlock, () -> PermissionRegistry.TARGETBLOCK);
registerBlockPredicateMap((block) -> block instanceof BellBlock || block instanceof CampfireBlock registerBlockPredicateMap((block) -> block instanceof BellBlock || block instanceof CampfireBlock
|| block instanceof TntBlock || block instanceof ChorusFlowerBlock, () -> PermissionRegistry.PROJECTILES); || block instanceof TntBlock || block instanceof ChorusFlowerBlock, () -> PermissionRegistry.PROJECTILES);
registerBlockPredicateMap((block) -> block instanceof EnderChestBlock, () -> PermissionRegistry.ENDERCHEST); registerBlockPredicateMap((block) -> block instanceof EnderChestBlock, () -> PermissionRegistry.ENDERCHEST);
registerBlockPredicateMap((block) -> block instanceof EnchantingTableBlock, () -> PermissionRegistry.ENCHANTMENTTABLE); registerBlockPredicateMap((block) -> block instanceof EnchantmentTableBlock, () -> PermissionRegistry.ENCHANTMENTTABLE);
registerItemPredicateMap(item -> item instanceof EnderPearlItem, () -> PermissionRegistry.ENDERPEARL); registerItemPredicateMap(item -> item instanceof EnderpearlItem, () -> PermissionRegistry.ENDERPEARL);
registerItemPredicateMap(item -> item instanceof BucketItem, () -> PermissionRegistry.BUCKET); registerItemPredicateMap(item -> item instanceof BucketItem, () -> PermissionRegistry.BUCKET);
registerItemPredicateMap(item -> item == Items.END_CRYSTAL, () -> PermissionRegistry.ENDCRYSTALPLACE); registerItemPredicateMap(item -> item == Items.END_CRYSTAL, () -> PermissionRegistry.ENDCRYSTALPLACE);
registerItemPredicateMap(item -> item == Items.CHORUS_FRUIT, () -> PermissionRegistry.CHORUSFRUIT); registerItemPredicateMap(item -> item == Items.CHORUS_FRUIT, () -> PermissionRegistry.CHORUSFRUIT);

View File

@ -1,10 +1,10 @@
package io.github.flemmli97.flan.api.permission; package io.github.flemmli97.flan.api.permission;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.item.ItemStack; import net.minecraft.resources.ResourceLocation;
import net.minecraft.item.Items; import net.minecraft.world.entity.raid.Raid;
import net.minecraft.util.Identifier; import net.minecraft.world.item.ItemStack;
import net.minecraft.village.raid.Raid; import net.minecraft.world.item.Items;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -21,9 +21,9 @@ public class PermissionRegistry {
private static final Map<String, ClaimPermission> permissions = new LinkedHashMap<>(); private static final Map<String, ClaimPermission> permissions = new LinkedHashMap<>();
private static final Map<String, ClaimPermission> globalPermissions = new LinkedHashMap<>(); private static final Map<String, ClaimPermission> globalPermissions = new LinkedHashMap<>();
private static final Map<Identifier, ClaimPermission> interactBlocks = new HashMap<>(); private static final Map<ResourceLocation, ClaimPermission> interactBlocks = new HashMap<>();
private static final Map<Identifier, ClaimPermission> breakBlocks = new HashMap<>(); private static final Map<ResourceLocation, ClaimPermission> breakBlocks = new HashMap<>();
private static final Map<Identifier, ClaimPermission> items = new HashMap<>(); private static final Map<ResourceLocation, ClaimPermission> items = new HashMap<>();
private static boolean locked; private static boolean locked;
@ -55,7 +55,7 @@ public class PermissionRegistry {
public static ClaimPermission TRAMPLE = register(new ClaimPermission("TRAMPLE", () -> new ItemStack(Items.FARMLAND), "Permission to enable block trampling", "(farmland, turtle eggs)")); public static ClaimPermission TRAMPLE = register(new ClaimPermission("TRAMPLE", () -> new ItemStack(Items.FARMLAND), "Permission to enable block trampling", "(farmland, turtle eggs)"));
public static ClaimPermission FROSTWALKER = register(new ClaimPermission("FROSTWALKER", () -> new ItemStack(Items.LEATHER_BOOTS), "Permission for frostwalker to activate")); public static ClaimPermission FROSTWALKER = register(new ClaimPermission("FROSTWALKER", () -> new ItemStack(Items.LEATHER_BOOTS), "Permission for frostwalker to activate"));
public static ClaimPermission PORTAL = register(new ClaimPermission("PORTAL", () -> new ItemStack(Items.OBSIDIAN), true, "Permission to use nether portals")); public static ClaimPermission PORTAL = register(new ClaimPermission("PORTAL", () -> new ItemStack(Items.OBSIDIAN), true, "Permission to use nether portals"));
public static ClaimPermission RAID = register(new ClaimPermission("RAID", Raid::getOminousBanner, "Permission to trigger raids in claim.", "Wont prevent raids (just) outside")); public static ClaimPermission RAID = register(new ClaimPermission("RAID", Raid::getLeaderBannerInstance, "Permission to trigger raids in claim.", "Wont prevent raids (just) outside"));
public static ClaimPermission BOAT = register(new ClaimPermission("BOAT", () -> new ItemStack(Items.OAK_BOAT), "Permission to sit in boats")); public static ClaimPermission BOAT = register(new ClaimPermission("BOAT", () -> new ItemStack(Items.OAK_BOAT), "Permission to sit in boats"));
public static ClaimPermission MINECART = register(new ClaimPermission("MINECART", () -> new ItemStack(Items.MINECART), "Permission to sit in minecarts")); public static ClaimPermission MINECART = register(new ClaimPermission("MINECART", () -> new ItemStack(Items.MINECART), "Permission to sit in minecarts"));
public static ClaimPermission BUCKET = register(new ClaimPermission("BUCKET", () -> new ItemStack(Items.BUCKET), "Permission to take liquids with buckets")); public static ClaimPermission BUCKET = register(new ClaimPermission("BUCKET", () -> new ItemStack(Items.BUCKET), "Permission to take liquids with buckets"));
@ -121,23 +121,23 @@ public class PermissionRegistry {
return globalPermissions.values(); return globalPermissions.values();
} }
public static ClaimPermission registerBreakPerm(ClaimPermission perm, Identifier... affectedBlocks) { public static ClaimPermission registerBreakPerm(ClaimPermission perm, ResourceLocation... affectedBlocks) {
ClaimPermission reg = register(perm); ClaimPermission reg = register(perm);
for (Identifier blocks : affectedBlocks) for (ResourceLocation blocks : affectedBlocks)
breakBlocks.put(blocks, perm); breakBlocks.put(blocks, perm);
return reg; return reg;
} }
public static ClaimPermission registerBlockInteract(ClaimPermission perm, Identifier... affectedBlocks) { public static ClaimPermission registerBlockInteract(ClaimPermission perm, ResourceLocation... affectedBlocks) {
ClaimPermission reg = register(perm); ClaimPermission reg = register(perm);
for (Identifier blocks : affectedBlocks) for (ResourceLocation blocks : affectedBlocks)
interactBlocks.put(blocks, perm); interactBlocks.put(blocks, perm);
return reg; return reg;
} }
public static ClaimPermission registerItemUse(ClaimPermission perm, Identifier... affectedBlocks) { public static ClaimPermission registerItemUse(ClaimPermission perm, ResourceLocation... affectedBlocks) {
ClaimPermission reg = register(perm); ClaimPermission reg = register(perm);
for (Identifier blocks : affectedBlocks) for (ResourceLocation blocks : affectedBlocks)
items.put(blocks, perm); items.put(blocks, perm);
return reg; return reg;
} }

View File

@ -5,7 +5,6 @@ import com.google.common.collect.Lists;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.mojang.authlib.GameProfile;
import io.github.flemmli97.flan.CrossPlatformStuff; import io.github.flemmli97.flan.CrossPlatformStuff;
import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.api.data.IPermissionContainer; import io.github.flemmli97.flan.api.data.IPermissionContainer;
@ -15,20 +14,21 @@ import io.github.flemmli97.flan.config.Config;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.LogoutTracker;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.effect.StatusEffect; import net.minecraft.ChatFormatting;
import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.core.BlockPos;
import net.minecraft.network.packet.s2c.play.TitleS2CPacket; import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket;
import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.text.Text; import net.minecraft.world.InteractionResult;
import net.minecraft.util.ActionResult; import net.minecraft.world.effect.MobEffect;
import net.minecraft.util.Formatting; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.util.Identifier; import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.util.math.Box; import net.minecraft.world.phys.AABB;
import net.minecraft.world.Heightmap;
import net.minecraft.world.chunk.ChunkStatus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -65,30 +65,30 @@ public class Claim implements IPermissionContainer {
*/ */
private boolean removed; private boolean removed;
private final ServerWorld world; private final ServerLevel world;
private final Map<StatusEffect, Integer> potions = new HashMap<>(); private final Map<MobEffect, Integer> potions = new HashMap<>();
public Text enterTitle, enterSubtitle, leaveTitle, leaveSubtitle; public Component enterTitle, enterSubtitle, leaveTitle, leaveSubtitle;
private Claim(ServerWorld world) { private Claim(ServerLevel world) {
this.world = world; this.world = world;
} }
public Claim(BlockPos pos1, BlockPos pos2, ServerPlayerEntity creator) { public Claim(BlockPos pos1, BlockPos pos2, ServerPlayer creator) {
this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator.getUuid(), creator.getServerWorld(), PlayerClaimData.get(creator).playerDefaultGroups().isEmpty()); this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator.getUUID(), creator.getLevel(), PlayerClaimData.get(creator).playerDefaultGroups().isEmpty());
PlayerClaimData.get(creator).playerDefaultGroups().forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0, true))); PlayerClaimData.get(creator).playerDefaultGroups().forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0, true)));
} }
public Claim(BlockPos pos1, BlockPos pos2, UUID creator, ServerWorld world) { public Claim(BlockPos pos1, BlockPos pos2, UUID creator, ServerLevel world) {
this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator, world); this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator, world);
} }
public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerWorld world) { public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerLevel world) {
this(x1, x2, z1, z2, minY, creator, world, true); this(x1, x2, z1, z2, minY, creator, world, true);
} }
public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerWorld world, boolean setDefaultGroups) { public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerLevel world, boolean setDefaultGroups) {
this.minX = Math.min(x1, x2); this.minX = Math.min(x1, x2);
this.minZ = Math.min(z1, z2); this.minZ = Math.min(z1, z2);
this.maxX = Math.max(x1, x2); this.maxX = Math.max(x1, x2);
@ -103,7 +103,7 @@ public class Claim implements IPermissionContainer {
ConfigHandler.config.defaultGroups.forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0, true))); ConfigHandler.config.defaultGroups.forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0, true)));
} }
public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) { public static Claim fromJson(JsonObject obj, UUID owner, ServerLevel world) {
Claim claim = new Claim(world); Claim claim = new Claim(world);
claim.readJson(obj, owner); claim.readJson(obj, owner);
ClaimUpdater.updateClaim(claim); ClaimUpdater.updateClaim(claim);
@ -112,7 +112,7 @@ public class Claim implements IPermissionContainer {
private BlockPos getInitCenterPos() { private BlockPos getInitCenterPos() {
BlockPos center = new BlockPos(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5); BlockPos center = new BlockPos(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5);
int y = this.world.getChunk(center.getX() >> 4, center.getZ() >> 4, ChunkStatus.HEIGHTMAPS).sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, center.getX() & 15, center.getZ() & 15); int y = this.world.getChunk(center.getX() >> 4, center.getZ() >> 4, ChunkStatus.HEIGHTMAPS).getHeight(Heightmap.Types.MOTION_BLOCKING, center.getX() & 15, center.getZ() & 15);
return new BlockPos(center.getX(), y + 1, center.getZ()); return new BlockPos(center.getX(), y + 1, center.getZ());
} }
@ -148,13 +148,13 @@ public class Claim implements IPermissionContainer {
return this.owner; return this.owner;
} }
public Optional<ServerPlayerEntity> getOwnerPlayer() { public Optional<ServerPlayer> getOwnerPlayer() {
if (this.getOwner() != null) if (this.getOwner() != null)
return Optional.ofNullable(this.world.getServer().getPlayerManager().getPlayer(this.getOwner())); return Optional.ofNullable(this.world.getServer().getPlayerList().getPlayer(this.getOwner()));
return Optional.empty(); return Optional.empty();
} }
public ServerWorld getWorld() { public ServerLevel getWorld() {
return this.world; return this.world;
} }
@ -178,9 +178,9 @@ public class Claim implements IPermissionContainer {
this.setDirty(true); this.setDirty(true);
} }
public void toggleAdminClaim(ServerPlayerEntity player, boolean flag) { public void toggleAdminClaim(ServerPlayer player, boolean flag) {
if (!flag) if (!flag)
this.transferOwner(player.getUuid()); this.transferOwner(player.getUUID());
else { else {
this.owner = null; this.owner = null;
this.subClaims.forEach(claim -> claim.owner = null); this.subClaims.forEach(claim -> claim.owner = null);
@ -217,7 +217,7 @@ public class Claim implements IPermissionContainer {
return this.minX <= other.maxX && this.maxX >= other.minX && this.minZ <= other.maxZ && this.maxZ >= other.minZ; return this.minX <= other.maxX && this.maxX >= other.minX && this.minZ <= other.maxZ && this.maxZ >= other.minZ;
} }
public boolean intersects(Box box) { public boolean intersects(AABB box) {
return this.minX < box.maxX && this.maxX + 1 > box.minX && this.minZ < box.maxZ && this.maxZ + 1 > box.minZ && box.maxY >= this.minY; return this.minX < box.maxX && this.maxX + 1 > box.minX && this.minZ < box.maxZ && this.maxZ + 1 > box.minZ && box.maxY >= this.minY;
} }
@ -235,16 +235,16 @@ public class Claim implements IPermissionContainer {
} }
@Override @Override
public boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos, boolean message) { public boolean canInteract(ServerPlayer player, ClaimPermission perm, BlockPos pos, boolean message) {
ActionResult res = ClaimPermissionCheck.check(player, perm, pos); InteractionResult res = ClaimPermissionCheck.check(player, perm, pos);
if (res != ActionResult.PASS) if (res != InteractionResult.PASS)
return res != ActionResult.FAIL; return res != InteractionResult.FAIL;
if (perm != null) { if (perm != null) {
ClaimPermission.PermissionFlag flag = perm.test.test(this, player, pos); ClaimPermission.PermissionFlag flag = perm.test.test(this, player, pos);
if (flag != ClaimPermission.PermissionFlag.PASS) { if (flag != ClaimPermission.PermissionFlag.PASS) {
if (flag == ClaimPermission.PermissionFlag.NO) { if (flag == ClaimPermission.PermissionFlag.NO) {
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
return true; return true;
@ -256,7 +256,7 @@ public class Claim implements IPermissionContainer {
if (global.getValue() || (player != null && this.isAdminIgnore(player))) if (global.getValue() || (player != null && this.isAdminIgnore(player)))
return true; return true;
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
if (ConfigHandler.config.offlineProtectActivation != -1 && (LogoutTracker.getInstance(this.world.getServer()).justLoggedOut(this.getOwner()) || this.getOwnerPlayer().isPresent())) { if (ConfigHandler.config.offlineProtectActivation != -1 && (LogoutTracker.getInstance(this.world.getServer()).justLoggedOut(this.getOwner()) || this.getOwnerPlayer().isPresent())) {
@ -272,10 +272,10 @@ public class Claim implements IPermissionContainer {
if (this.hasPerm(perm)) if (this.hasPerm(perm))
return true; return true;
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
if (this.isAdminIgnore(player) || player.getUuid().equals(this.owner)) if (this.isAdminIgnore(player) || player.getUUID().equals(this.owner))
return true; return true;
if (perm != PermissionRegistry.EDITCLAIM && perm != PermissionRegistry.EDITPERMS) if (perm != PermissionRegistry.EDITCLAIM && perm != PermissionRegistry.EDITPERMS)
for (Claim claim : this.subClaims) { for (Claim claim : this.subClaims) {
@ -283,25 +283,25 @@ public class Claim implements IPermissionContainer {
return claim.canInteract(player, perm, pos, message); return claim.canInteract(player, perm, pos, message);
} }
} }
if (this.playersGroups.containsKey(player.getUuid())) { if (this.playersGroups.containsKey(player.getUUID())) {
Map<ClaimPermission, Boolean> map = this.permissions.get(this.playersGroups.get(player.getUuid())); Map<ClaimPermission, Boolean> map = this.permissions.get(this.playersGroups.get(player.getUUID()));
if (map != null && map.containsKey(perm)) { if (map != null && map.containsKey(perm)) {
if (map.get(perm)) if (map.get(perm))
return true; return true;
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
} }
if (this.hasPerm(perm)) if (this.hasPerm(perm))
return true; return true;
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
private boolean isAdminIgnore(ServerPlayerEntity player) { private boolean isAdminIgnore(ServerPlayer player) {
return player == null || ((this.isAdminClaim() && player.hasPermissionLevel(2)) || PlayerClaimData.get(player).isAdminIgnoreClaim()); return player == null || ((this.isAdminClaim() && player.hasPermissions(2)) || PlayerClaimData.get(player).isAdminIgnoreClaim());
} }
/** /**
@ -408,17 +408,13 @@ public class Claim implements IPermissionContainer {
l.add(uuid); l.add(uuid);
}); });
List<String> names = new ArrayList<>(); List<String> names = new ArrayList<>();
l.forEach(uuid -> { l.forEach(uuid -> server.getProfileCache().get(uuid).ifPresent(prof -> names.add(prof.getName())));
GameProfile prof = server.getUserCache().getByUuid(uuid);
if (prof != null)
names.add(prof.getName());
});
names.sort(null); names.sort(null);
return names; return names;
} }
public boolean editGlobalPerms(ServerPlayerEntity player, ClaimPermission toggle, int mode) { public boolean editGlobalPerms(ServerPlayer player, ClaimPermission toggle, int mode) {
if ((player != null && !this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) || (!this.isAdminClaim() && ConfigHandler.config.globallyDefined(this.world, toggle))) if ((player != null && !this.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition())) || (!this.isAdminClaim() && ConfigHandler.config.globallyDefined(this.world, toggle)))
return false; return false;
if (mode > 1) if (mode > 1)
mode = -1; mode = -1;
@ -430,7 +426,7 @@ public class Claim implements IPermissionContainer {
return true; return true;
} }
public boolean editPerms(ServerPlayerEntity player, String group, ClaimPermission perm, int mode) { public boolean editPerms(ServerPlayer player, String group, ClaimPermission perm, int mode) {
return this.editPerms(player, group, perm, mode, false); return this.editPerms(player, group, perm, mode, false);
} }
@ -440,10 +436,10 @@ public class Claim implements IPermissionContainer {
* @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm * @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm
* @return If editing was successful or not * @return If editing was successful or not
*/ */
public boolean editPerms(ServerPlayerEntity player, String group, ClaimPermission perm, int mode, boolean alwaysCan) { public boolean editPerms(ServerPlayer player, String group, ClaimPermission perm, int mode, boolean alwaysCan) {
if (PermissionRegistry.globalPerms().contains(perm) || (!this.isAdminClaim() && ConfigHandler.config.globallyDefined(this.world, perm))) if (PermissionRegistry.globalPerms().contains(perm) || (!this.isAdminClaim() && ConfigHandler.config.globallyDefined(this.world, perm)))
return false; return false;
if (alwaysCan || this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) { if (alwaysCan || this.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition())) {
if (mode > 1) if (mode > 1)
mode = -1; mode = -1;
boolean has = this.permissions.containsKey(group); boolean has = this.permissions.containsKey(group);
@ -460,8 +456,8 @@ public class Claim implements IPermissionContainer {
return false; return false;
} }
public boolean removePermGroup(ServerPlayerEntity player, String group) { public boolean removePermGroup(ServerPlayer player, String group) {
if (this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) { if (this.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition())) {
this.permissions.remove(group); this.permissions.remove(group);
List<UUID> toRemove = new ArrayList<>(); List<UUID> toRemove = new ArrayList<>();
this.playersGroups.forEach((uuid, g) -> { this.playersGroups.forEach((uuid, g) -> {
@ -496,54 +492,54 @@ public class Claim implements IPermissionContainer {
return false; return false;
} }
public void addPotion(StatusEffect effect, int amplifier) { public void addPotion(MobEffect effect, int amplifier) {
this.potions.put(effect, amplifier); this.potions.put(effect, amplifier);
this.setDirty(true); this.setDirty(true);
} }
public void removePotion(StatusEffect effect) { public void removePotion(MobEffect effect) {
this.potions.remove(effect); this.potions.remove(effect);
this.setDirty(true); this.setDirty(true);
} }
public Map<StatusEffect, Integer> getPotions() { public Map<MobEffect, Integer> getPotions() {
return this.potions; return this.potions;
} }
public void applyEffects(ServerPlayerEntity player) { public void applyEffects(ServerPlayer player) {
if (player.world.getTime() % 80 == 0) if (player.level.getGameTime() % 80 == 0)
this.potions.forEach((effect, amp) -> player.applyStatusEffect(new StatusEffectInstance(effect, 200, amp - 1, true, false))); this.potions.forEach((effect, amp) -> player.forceAddEffect(new MobEffectInstance(effect, 200, amp - 1, true, false), null));
} }
public BlockPos getHomePos() { public BlockPos getHomePos() {
return this.homePos; return this.homePos;
} }
public void setEnterTitle(Text title, Text sub) { public void setEnterTitle(Component title, Component sub) {
this.enterTitle = title; this.enterTitle = title;
this.enterSubtitle = sub; this.enterSubtitle = sub;
this.setDirty(true); this.setDirty(true);
} }
public void setLeaveTitle(Text title, Text sub) { public void setLeaveTitle(Component title, Component sub) {
this.leaveTitle = title; this.leaveTitle = title;
this.leaveSubtitle = sub; this.leaveSubtitle = sub;
this.setDirty(true); this.setDirty(true);
} }
public void displayEnterTitle(ServerPlayerEntity player) { public void displayEnterTitle(ServerPlayer player) {
if (this.enterTitle != null) { if (this.enterTitle != null) {
player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.TITLE, this.enterTitle)); player.connection.send(new ClientboundSetTitleTextPacket(this.enterTitle));
if (this.enterSubtitle != null) if (this.enterSubtitle != null)
player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.SUBTITLE, this.enterSubtitle)); player.connection.send(new ClientboundSetSubtitleTextPacket(this.enterSubtitle));
} }
} }
public void displayLeaveTitle(ServerPlayerEntity player) { public void displayLeaveTitle(ServerPlayer player) {
if (this.leaveTitle != null) { if (this.leaveTitle != null) {
player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.TITLE, this.leaveTitle)); player.connection.send(new ClientboundSetTitleTextPacket(this.leaveTitle));
if (this.leaveSubtitle != null) if (this.leaveSubtitle != null)
player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.SUBTITLE, this.leaveSubtitle)); player.connection.send(new ClientboundSetSubtitleTextPacket(this.leaveSubtitle));
} }
} }
@ -579,18 +575,18 @@ public class Claim implements IPermissionContainer {
} }
String message = ConfigHandler.fromJson(obj, "EnterTitle", ""); String message = ConfigHandler.fromJson(obj, "EnterTitle", "");
if (!message.isEmpty()) if (!message.isEmpty())
this.enterTitle = Text.Serializer.fromJson(message); this.enterTitle = Component.Serializer.fromJson(message);
message = ConfigHandler.fromJson(obj, "EnterSubtitle", ""); message = ConfigHandler.fromJson(obj, "EnterSubtitle", "");
if (!message.isEmpty()) if (!message.isEmpty())
this.enterSubtitle = Text.Serializer.fromJson(message); this.enterSubtitle = Component.Serializer.fromJson(message);
message = ConfigHandler.fromJson(obj, "LeaveTitle", ""); message = ConfigHandler.fromJson(obj, "LeaveTitle", "");
if (!message.isEmpty()) if (!message.isEmpty())
this.leaveTitle = Text.Serializer.fromJson(message); this.leaveTitle = Component.Serializer.fromJson(message);
message = ConfigHandler.fromJson(obj, "LeaveSubtitle", ""); message = ConfigHandler.fromJson(obj, "LeaveSubtitle", "");
if (!message.isEmpty()) if (!message.isEmpty())
this.leaveSubtitle = Text.Serializer.fromJson(message); this.leaveSubtitle = Component.Serializer.fromJson(message);
JsonObject potion = ConfigHandler.fromJson(obj, "Potions"); JsonObject potion = ConfigHandler.fromJson(obj, "Potions");
potion.entrySet().forEach(e -> this.potions.put(CrossPlatformStuff.registryStatusEffects().getFromId(new Identifier(e.getKey())), e.getValue().getAsInt())); potion.entrySet().forEach(e -> this.potions.put(CrossPlatformStuff.registryStatusEffects().getFromId(new ResourceLocation(e.getKey())), e.getValue().getAsInt()));
if (ConfigHandler.fromJson(obj, "AdminClaim", false)) if (ConfigHandler.fromJson(obj, "AdminClaim", false))
this.owner = null; this.owner = null;
else else
@ -655,10 +651,10 @@ public class Claim implements IPermissionContainer {
home.add(this.homePos.getY()); home.add(this.homePos.getY());
home.add(this.homePos.getZ()); home.add(this.homePos.getZ());
obj.add("Home", home); obj.add("Home", home);
obj.addProperty("EnterTitle", this.enterTitle == null ? "" : Text.Serializer.toJson(this.enterTitle)); obj.addProperty("EnterTitle", this.enterTitle == null ? "" : Component.Serializer.toJson(this.enterTitle));
obj.addProperty("EnterSubtitle", this.enterSubtitle == null ? "" : Text.Serializer.toJson(this.enterSubtitle)); obj.addProperty("EnterSubtitle", this.enterSubtitle == null ? "" : Component.Serializer.toJson(this.enterSubtitle));
obj.addProperty("LeaveTitle", this.leaveTitle == null ? "" : Text.Serializer.toJson(this.leaveTitle)); obj.addProperty("LeaveTitle", this.leaveTitle == null ? "" : Component.Serializer.toJson(this.leaveTitle));
obj.addProperty("LeaveSubtitle", this.leaveSubtitle == null ? "" : Text.Serializer.toJson(this.leaveSubtitle)); obj.addProperty("LeaveSubtitle", this.leaveSubtitle == null ? "" : Component.Serializer.toJson(this.leaveSubtitle));
JsonObject potions = new JsonObject(); JsonObject potions = new JsonObject();
this.potions.forEach((effect, amp) -> potions.addProperty(CrossPlatformStuff.registryStatusEffects().getIDFrom(effect).toString(), amp)); this.potions.forEach((effect, amp) -> potions.addProperty(CrossPlatformStuff.registryStatusEffects().getIDFrom(effect).toString(), amp));
obj.add("Potions", potions); obj.add("Potions", potions);
@ -730,46 +726,45 @@ public class Claim implements IPermissionContainer {
return String.format("%s:[x=%d,z=%d] - [x=%d,z=%d]", this.claimName, this.minX, this.minZ, this.maxX, this.maxZ); return String.format("%s:[x=%d,z=%d] - [x=%d,z=%d]", this.claimName, this.minX, this.minZ, this.maxX, this.maxZ);
} }
public List<Text> infoString(ServerPlayerEntity player, InfoType infoType) { public List<Component> infoString(ServerPlayer player, InfoType infoType) {
boolean perms = this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos()); boolean perms = this.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition());
List<Text> l = new ArrayList<>(); List<Component> l = new ArrayList<>();
l.add(PermHelper.simpleColoredText("=============================================", Formatting.GREEN)); l.add(PermHelper.simpleColoredText("=============================================", ChatFormatting.GREEN));
GameProfile prof = this.owner != null ? player.getServer().getUserCache().getByUuid(this.owner) : null; String ownerName = this.isAdminClaim() ? "Admin" : player.getServer().getProfileCache().get(this.owner).map(prof -> prof.getName()).orElse("<UNKNOWN>");
String ownerName = this.isAdminClaim() ? "Admin" : prof != null ? prof.getName() : "<UNKNOWN>";
if (this.parent == null) { if (this.parent == null) {
if (this.claimName.isEmpty()) if (this.claimName.isEmpty())
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfo, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size()), Formatting.GOLD)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfo, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size()), ChatFormatting.GOLD));
else else
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoNamed, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size(), this.claimName), Formatting.GOLD)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoNamed, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size(), this.claimName), ChatFormatting.GOLD));
} else { } else {
if (this.claimName.isEmpty()) if (this.claimName.isEmpty())
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoSub, ownerName, this.minX, this.minZ, this.maxX, this.maxZ), Formatting.GOLD)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoSub, ownerName, this.minX, this.minZ, this.maxX, this.maxZ), ChatFormatting.GOLD));
else else
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoSubNamed, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.claimName), Formatting.GOLD)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfoSubNamed, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.claimName), ChatFormatting.GOLD));
} }
if (perms) { if (perms) {
if (infoType == InfoType.ALL || infoType == InfoType.GLOBAL) if (infoType == InfoType.ALL || infoType == InfoType.GLOBAL)
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimInfoPerms, this.globalPerm), Formatting.RED)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimInfoPerms, this.globalPerm), ChatFormatting.RED));
if (infoType == InfoType.ALL || infoType == InfoType.GROUP) { if (infoType == InfoType.ALL || infoType == InfoType.GROUP) {
l.add(PermHelper.simpleColoredText(ConfigHandler.lang.claimGroupInfoHeader, Formatting.RED)); l.add(PermHelper.simpleColoredText(ConfigHandler.lang.claimGroupInfoHeader, ChatFormatting.RED));
Map<String, List<String>> nameToGroup = new HashMap<>(); Map<String, List<String>> nameToGroup = new HashMap<>();
for (Map.Entry<UUID, String> e : this.playersGroups.entrySet()) { for (Map.Entry<UUID, String> e : this.playersGroups.entrySet()) {
GameProfile pgroup = player.getServer().getUserCache().getByUuid(e.getKey()); player.getServer().getProfileCache().get(e.getKey()).ifPresent(pgroup ->
if (prof != null) {
nameToGroup.merge(e.getValue(), Lists.newArrayList(pgroup.getName()), (old, val) -> { nameToGroup.merge(e.getValue(), Lists.newArrayList(pgroup.getName()), (old, val) -> {
old.add(pgroup.getName()); old.add(pgroup.getName());
return old; return old;
}); })
} );
} }
for (Map.Entry<String, Map<ClaimPermission, Boolean>> e : this.permissions.entrySet()) { for (Map.Entry<String, Map<ClaimPermission, Boolean>> e : this.permissions.entrySet()) {
l.add(PermHelper.simpleColoredText(String.format(" %s:", e.getKey()), Formatting.DARK_RED)); l.add(PermHelper.simpleColoredText(String.format(" %s:", e.getKey()), ChatFormatting.DARK_RED));
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimGroupPerms, e.getValue()), Formatting.RED)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimGroupPerms, e.getValue()), ChatFormatting.RED));
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimGroupPlayers, nameToGroup.getOrDefault(e.getKey(), new ArrayList<>())), Formatting.RED)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimGroupPlayers, nameToGroup.getOrDefault(e.getKey(), new ArrayList<>())), ChatFormatting.RED));
} }
} }
} }
l.add(PermHelper.simpleColoredText("=============================================", Formatting.GREEN)); l.add(PermHelper.simpleColoredText("=============================================", ChatFormatting.GREEN));
return l; return l;
} }

View File

@ -1,15 +1,15 @@
package io.github.flemmli97.flan.claim; package io.github.flemmli97.flan.claim;
import dev.architectury.injectables.annotations.ExpectPlatform;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import me.shedaniel.architectury.annotations.ExpectPlatform; import net.minecraft.core.BlockPos;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.ActionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.util.math.BlockPos;
public class ClaimPermissionCheck { public class ClaimPermissionCheck {
@ExpectPlatform @ExpectPlatform
public static ActionResult check(ServerPlayerEntity player, ClaimPermission permission, BlockPos pos) { public static InteractionResult check(ServerPlayer player, ClaimPermission permission, BlockPos pos) {
throw new AssertionError(); throw new AssertionError();
} }
} }

View File

@ -22,21 +22,21 @@ import io.github.flemmli97.flan.player.PlayerClaimData;
import io.github.flemmli97.flan.player.PlayerDataHandler; import io.github.flemmli97.flan.player.PlayerDataHandler;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Tuple;
import net.minecraft.text.ClickEvent; import net.minecraft.world.level.ChunkPos;
import net.minecraft.text.HoverEvent; import net.minecraft.world.level.Level;
import net.minecraft.text.MutableText; import net.minecraft.world.level.storage.LevelResource;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Pair;
import net.minecraft.util.WorldSavePath;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.World;
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.Yaml;
import java.io.File; import java.io.File;
@ -64,11 +64,11 @@ public class ClaimStorage implements IPermissionStorage {
private final Set<UUID> dirty = new HashSet<>(); private final Set<UUID> dirty = new HashSet<>();
private final GlobalClaim globalClaim; private final GlobalClaim globalClaim;
public static ClaimStorage get(ServerWorld world) { public static ClaimStorage get(ServerLevel world) {
return ((IClaimStorage) world).get(); return ((IClaimStorage) world).get();
} }
public ClaimStorage(MinecraftServer server, ServerWorld world) { public ClaimStorage(MinecraftServer server, ServerLevel world) {
this.globalClaim = new GlobalClaim(world); this.globalClaim = new GlobalClaim(world);
this.read(server, world); this.read(server, world);
PlayerDataHandler.deleteUnusedClaims(server, this, world); PlayerDataHandler.deleteUnusedClaims(server, this, world);
@ -81,36 +81,36 @@ public class ClaimStorage implements IPermissionStorage {
return uuid; return uuid;
} }
public boolean createClaim(BlockPos pos1, BlockPos pos2, ServerPlayerEntity player) { public boolean createClaim(BlockPos pos1, BlockPos pos2, ServerPlayer player) {
Claim claim = new Claim(pos1.down(ConfigHandler.config.defaultClaimDepth), pos2.down(ConfigHandler.config.defaultClaimDepth), player); Claim claim = new Claim(pos1.below(ConfigHandler.config.defaultClaimDepth), pos2.below(ConfigHandler.config.defaultClaimDepth), player);
Set<Claim> conflicts = this.conflicts(claim, null); Set<Claim> conflicts = this.conflicts(claim, null);
if (conflicts.isEmpty()) { if (conflicts.isEmpty()) {
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
if (claim.getPlane() < ConfigHandler.config.minClaimsize) { if (claim.getPlane() < ConfigHandler.config.minClaimsize) {
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.minClaimSize, ConfigHandler.config.minClaimsize), Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.minClaimSize, ConfigHandler.config.minClaimsize), ChatFormatting.RED), false);
return false; return false;
} }
if (!data.isAdminIgnoreClaim() && ConfigHandler.config.maxClaims != -1 && !PermissionNodeHandler.permBelowEqVal(player, PermissionNodeHandler.permMaxClaims, this.playerClaimMap.getOrDefault(player.getUuid(), Sets.newHashSet()).size() + 1, ConfigHandler.config.maxClaims)) { if (!data.isAdminIgnoreClaim() && ConfigHandler.config.maxClaims != -1 && !PermissionNodeHandler.permBelowEqVal(player, PermissionNodeHandler.permMaxClaims, this.playerClaimMap.getOrDefault(player.getUUID(), Sets.newHashSet()).size() + 1, ConfigHandler.config.maxClaims)) {
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.maxClaims), Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.maxClaims), ChatFormatting.RED), false);
return false; return false;
} }
if (!data.isAdminIgnoreClaim() && !data.canUseClaimBlocks(claim.getPlane())) { if (!data.isAdminIgnoreClaim() && !data.canUseClaimBlocks(claim.getPlane())) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.notEnoughBlocks, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.notEnoughBlocks, ChatFormatting.RED), false);
return false; return false;
} }
claim.setClaimID(this.generateUUID()); claim.setClaimID(this.generateUUID());
Flan.log("Creating new claim {}", claim); Flan.log("Creating new claim {}", claim);
this.addClaim(claim); this.addClaim(claim);
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
data.updateScoreboard(); data.updateScoreboard();
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.claimCreateSuccess, Formatting.GOLD), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.claimCreateSuccess, ChatFormatting.GOLD), false);
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat, player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
data.getClaimBlocks(), data.getAdditionalClaims(), data.usedClaimBlocks()), Formatting.GOLD), false); data.getClaimBlocks(), data.getAdditionalClaims(), data.usedClaimBlocks()), ChatFormatting.GOLD), false);
return true; return true;
} }
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
conflicts.forEach(conf -> data.addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.getBlockPos().getY())); conflicts.forEach(conf -> data.addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, ChatFormatting.RED), false);
return false; return false;
} }
@ -119,7 +119,7 @@ public class ClaimStorage implements IPermissionStorage {
int[] chunks = getChunkPos(claim); int[] chunks = getChunkPos(claim);
for (int x = chunks[0]; x <= chunks[1]; x++) for (int x = chunks[0]; x <= chunks[1]; x++)
for (int z = chunks[2]; z <= chunks[3]; z++) { for (int z = chunks[2]; z <= chunks[3]; z++) {
List<Claim> claims = this.claims.get(ChunkPos.toLong(x, z)); List<Claim> claims = this.claims.get(ChunkPos.asLong(x, z));
if (claims != null) if (claims != null)
for (Claim other : claims) { for (Claim other : claims) {
if (claim.intersects(other) && !other.equals(except)) { if (claim.intersects(other) && !other.equals(except)) {
@ -130,7 +130,7 @@ public class ClaimStorage implements IPermissionStorage {
return conflicted; return conflicted;
} }
public boolean deleteClaim(Claim claim, boolean updateClaim, EnumEditMode mode, ServerWorld world) { public boolean deleteClaim(Claim claim, boolean updateClaim, EnumEditMode mode, ServerLevel world) {
if (mode == EnumEditMode.SUBCLAIM) { if (mode == EnumEditMode.SUBCLAIM) {
if (claim.parentClaim() != null) if (claim.parentClaim() != null)
return claim.parentClaim().deleteSubClaim(claim); return claim.parentClaim().deleteSubClaim(claim);
@ -140,7 +140,7 @@ public class ClaimStorage implements IPermissionStorage {
int[] pos = getChunkPos(claim); int[] pos = getChunkPos(claim);
for (int x = pos[0]; x <= pos[1]; x++) for (int x = pos[0]; x <= pos[1]; x++)
for (int z = pos[2]; z <= pos[3]; z++) { for (int z = pos[2]; z <= pos[3]; z++) {
this.claims.compute(ChunkPos.toLong(x, z), (key, val) -> { this.claims.compute(ChunkPos.asLong(x, z), (key, val) -> {
if (val == null) if (val == null)
return null; return null;
val.remove(claim); val.remove(claim);
@ -156,9 +156,9 @@ public class ClaimStorage implements IPermissionStorage {
return this.claimUUIDMap.remove(claim.getClaimID()) != null; return this.claimUUIDMap.remove(claim.getClaimID()) != null;
} }
public void toggleAdminClaim(ServerPlayerEntity player, Claim claim, boolean toggle) { public void toggleAdminClaim(ServerPlayer player, Claim claim, boolean toggle) {
Flan.log("Set claim {} to an admin claim", claim); Flan.log("Set claim {} to an admin claim", claim);
this.deleteClaim(claim, false, EnumEditMode.DEFAULT, player.getServerWorld()); this.deleteClaim(claim, false, EnumEditMode.DEFAULT, player.getLevel());
if (toggle) if (toggle)
claim.getOwnerPlayer().ifPresent(o -> PlayerClaimData.get(o).updateScoreboard()); claim.getOwnerPlayer().ifPresent(o -> PlayerClaimData.get(o).updateScoreboard());
claim.toggleAdminClaim(player, toggle); claim.toggleAdminClaim(player, toggle);
@ -167,18 +167,18 @@ public class ClaimStorage implements IPermissionStorage {
this.addClaim(claim); this.addClaim(claim);
} }
public boolean resizeClaim(Claim claim, BlockPos from, BlockPos to, ServerPlayerEntity player) { public boolean resizeClaim(Claim claim, BlockPos from, BlockPos to, ServerPlayer player) {
int[] dims = claim.getDimensions(); int[] dims = claim.getDimensions();
BlockPos opposite = new BlockPos(dims[0] == from.getX() ? dims[1] : dims[0], dims[4], dims[2] == from.getZ() ? dims[3] : dims[2]); BlockPos opposite = new BlockPos(dims[0] == from.getX() ? dims[1] : dims[0], dims[4], dims[2] == from.getZ() ? dims[3] : dims[2]);
Claim newClaim = new Claim(opposite, to, player.getUuid(), player.getServerWorld()); Claim newClaim = new Claim(opposite, to, player.getUUID(), player.getLevel());
if (newClaim.getPlane() < ConfigHandler.config.minClaimsize) { if (newClaim.getPlane() < ConfigHandler.config.minClaimsize) {
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.minClaimSize, ConfigHandler.config.minClaimsize), Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.minClaimSize, ConfigHandler.config.minClaimsize), ChatFormatting.RED), false);
return false; return false;
} }
Set<Claim> conflicts = this.conflicts(newClaim, claim); Set<Claim> conflicts = this.conflicts(newClaim, claim);
if (!conflicts.isEmpty()) { if (!conflicts.isEmpty()) {
conflicts.forEach(conf -> PlayerClaimData.get(player).addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.getBlockPos().getY())); conflicts.forEach(conf -> PlayerClaimData.get(player).addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, ChatFormatting.RED), false);
return false; return false;
} }
int diff = newClaim.getPlane() - claim.getPlane(); int diff = newClaim.getPlane() - claim.getPlane();
@ -191,23 +191,23 @@ public class ClaimStorage implements IPermissionStorage {
boolean enoughBlocks = claim.isAdminClaim() || data.isAdminIgnoreClaim() || newData.canUseClaimBlocks(diff); boolean enoughBlocks = claim.isAdminClaim() || data.isAdminIgnoreClaim() || newData.canUseClaimBlocks(diff);
if (enoughBlocks) { if (enoughBlocks) {
Flan.log("Resizing claim {}", claim); Flan.log("Resizing claim {}", claim);
this.deleteClaim(claim, false, EnumEditMode.DEFAULT, player.getServerWorld()); this.deleteClaim(claim, false, EnumEditMode.DEFAULT, player.getLevel());
claim.copySizes(newClaim); claim.copySizes(newClaim);
this.addClaim(claim); this.addClaim(claim);
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
if (newData instanceof PlayerClaimData) if (newData instanceof PlayerClaimData)
((PlayerClaimData) newData).updateScoreboard(); ((PlayerClaimData) newData).updateScoreboard();
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeSuccess, Formatting.GOLD), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeSuccess, ChatFormatting.GOLD), false);
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat, player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
newData.getClaimBlocks(), newData.getAdditionalClaims(), newData.usedClaimBlocks()), Formatting.GOLD), false); newData.getClaimBlocks(), newData.getAdditionalClaims(), newData.usedClaimBlocks()), ChatFormatting.GOLD), false);
return true; return true;
} }
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.notEnoughBlocks, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.notEnoughBlocks, ChatFormatting.RED), false);
return false; return false;
} }
public Claim getClaimAt(BlockPos pos) { public Claim getClaimAt(BlockPos pos) {
long chunk = ChunkPos.toLong(pos.getX() >> 4, pos.getZ() >> 4); long chunk = ChunkPos.asLong(pos.getX() >> 4, pos.getZ() >> 4);
List<Claim> list = this.claims.get(chunk); List<Claim> list = this.claims.get(chunk);
if (list != null) if (list != null)
for (Claim claim : list) { for (Claim claim : list) {
@ -233,7 +233,7 @@ public class ClaimStorage implements IPermissionStorage {
int[] pos = getChunkPos(claim); int[] pos = getChunkPos(claim);
for (int x = pos[0]; x <= pos[1]; x++) for (int x = pos[0]; x <= pos[1]; x++)
for (int z = pos[2]; z <= pos[3]; z++) { for (int z = pos[2]; z <= pos[3]; z++) {
this.claims.merge(ChunkPos.toLong(x, z), Lists.newArrayList(claim), (old, val) -> { this.claims.merge(ChunkPos.asLong(x, z), Lists.newArrayList(claim), (old, val) -> {
old.add(claim); old.add(claim);
return old; return old;
}); });
@ -245,8 +245,8 @@ public class ClaimStorage implements IPermissionStorage {
}); });
} }
public boolean transferOwner(Claim claim, ServerPlayerEntity player, UUID newOwner) { public boolean transferOwner(Claim claim, ServerPlayer player, UUID newOwner) {
if (!player.getUuid().equals(claim.getOwner())) if (!player.getUUID().equals(claim.getOwner()))
return false; return false;
this.playerClaimMap.merge(claim.getOwner(), new HashSet<>(), (old, val) -> { this.playerClaimMap.merge(claim.getOwner(), new HashSet<>(), (old, val) -> {
old.remove(claim); old.remove(claim);
@ -281,9 +281,9 @@ public class ClaimStorage implements IPermissionStorage {
return pos; return pos;
} }
public void read(MinecraftServer server, ServerWorld world) { public void read(MinecraftServer server, ServerLevel world) {
Flan.log("Loading claim data for world {}", world.getRegistryKey()); Flan.log("Loading claim data for world {}", world.dimension());
Path dir = ConfigHandler.getClaimSavePath(server, world.getRegistryKey()); Path dir = ConfigHandler.getClaimSavePath(server, world.dimension());
if (Files.exists(dir)) { if (Files.exists(dir)) {
try { try {
for (Path file : Files.walk(dir).filter(Files::isRegularFile).collect(Collectors.toSet())) { for (Path file : Files.walk(dir).filter(Files::isRegularFile).collect(Collectors.toSet())) {
@ -310,7 +310,7 @@ public class ClaimStorage implements IPermissionStorage {
} }
} }
public void save(MinecraftServer server, RegistryKey<World> reg) { public void save(MinecraftServer server, ResourceKey<Level> reg) {
Flan.log("Saving claims for world {}", reg); Flan.log("Saving claims for world {}", reg);
Path dir = ConfigHandler.getClaimSavePath(server, reg); Path dir = ConfigHandler.getClaimSavePath(server, reg);
try { try {
@ -354,11 +354,11 @@ public class ClaimStorage implements IPermissionStorage {
} }
} }
public static boolean readGriefPreventionData(MinecraftServer server, ServerCommandSource src) { public static boolean readGriefPreventionData(MinecraftServer server, CommandSourceStack src) {
Yaml yml = new Yaml(); Yaml yml = new Yaml();
File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/ClaimData").toFile(); File griefPrevention = server.getWorldPath(LevelResource.ROOT).resolve("plugins/GriefPreventionData/ClaimData").toFile();
if (!griefPrevention.exists()) { if (!griefPrevention.exists()) {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.cantFindData, griefPrevention.getAbsolutePath()), Formatting.DARK_RED), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.cantFindData, griefPrevention.getAbsolutePath()), ChatFormatting.DARK_RED), false);
return false; return false;
} }
Map<File, List<File>> subClaimMap = new HashMap<>(); Map<File, List<File>> subClaimMap = new HashMap<>();
@ -392,7 +392,7 @@ public class ClaimStorage implements IPermissionStorage {
try { try {
intFileMap.put(Integer.valueOf(f.getName().replace(".yml", "")), f); intFileMap.put(Integer.valueOf(f.getName().replace(".yml", "")), f);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), Formatting.RED)), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), ChatFormatting.RED)), false);
} }
} }
} }
@ -413,28 +413,28 @@ public class ClaimStorage implements IPermissionStorage {
} }
for (File parent : intFileMap.values()) { for (File parent : intFileMap.values()) {
try { try {
Pair<ServerWorld, Claim> parentClaim = parseFromYaml(parent, yml, server, perms); Tuple<ServerLevel, Claim> parentClaim = parseFromYaml(parent, yml, server, perms);
List<File> childs = subClaimMap.get(parent); List<File> childs = subClaimMap.get(parent);
if (childs != null && !childs.isEmpty()) { if (childs != null && !childs.isEmpty()) {
for (File childF : childs) for (File childF : childs)
parentClaim.getRight().addSubClaimGriefprevention(parseFromYaml(childF, yml, server, perms).getRight()); parentClaim.getB().addSubClaimGriefprevention(parseFromYaml(childF, yml, server, perms).getB());
} }
ClaimStorage storage = ClaimStorage.get(parentClaim.getLeft()); ClaimStorage storage = ClaimStorage.get(parentClaim.getA());
Set<Claim> conflicts = storage.conflicts(parentClaim.getRight(), null); Set<Claim> conflicts = storage.conflicts(parentClaim.getB(), null);
if (conflicts.isEmpty()) { if (conflicts.isEmpty()) {
parentClaim.getRight().setClaimID(storage.generateUUID()); parentClaim.getB().setClaimID(storage.generateUUID());
storage.addClaim(parentClaim.getRight()); storage.addClaim(parentClaim.getB());
} else { } else {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.readConflict, parent.getName(), conflicts), Formatting.DARK_RED), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.readConflict, parent.getName(), conflicts), ChatFormatting.DARK_RED), false);
for (Claim claim : conflicts) { for (Claim claim : conflicts) {
int[] dim = claim.getDimensions(); int[] dim = claim.getDimensions();
MutableText text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim[0], dim[2]), Formatting.RED); MutableComponent text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim[0], dim[2]), ChatFormatting.RED);
text.setStyle(text.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tp @s " + dim[0] + " ~ " + dim[2])).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TranslatableText("chat.coordinates.tooltip")))); text.setStyle(text.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tp @s " + dim[0] + " ~ " + dim[2])).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TranslatableComponent("chat.coordinates.tooltip"))));
src.sendFeedback(text, false); src.sendSuccess(text, false);
} }
} }
} catch (Exception e) { } catch (Exception e) {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, parent.getName(), Formatting.RED)), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, parent.getName(), ChatFormatting.RED)), false);
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -451,7 +451,7 @@ public class ClaimStorage implements IPermissionStorage {
return set; return set;
} }
private static Pair<ServerWorld, Claim> parseFromYaml(File file, Yaml yml, MinecraftServer server, private static Tuple<ServerLevel, Claim> parseFromYaml(File file, Yaml yml, MinecraftServer server,
Map<String, Set<ClaimPermission>> perms) throws IOException { Map<String, Set<ClaimPermission>> perms) throws IOException {
FileReader reader = new FileReader(file); FileReader reader = new FileReader(file);
Map<String, Object> values = yml.load(reader); Map<String, Object> values = yml.load(reader);
@ -465,7 +465,7 @@ public class ClaimStorage implements IPermissionStorage {
List<String> accessors = readList(values, "Accessors"); List<String> accessors = readList(values, "Accessors");
String[] lesserCorner = values.get("Lesser Boundary Corner").toString().split(";"); String[] lesserCorner = values.get("Lesser Boundary Corner").toString().split(";");
String[] greaterCorner = values.get("Greater Boundary Corner").toString().split(";"); String[] greaterCorner = values.get("Greater Boundary Corner").toString().split(";");
ServerWorld world = server.getWorld(worldRegFromString(lesserCorner[0])); ServerLevel world = server.getLevel(worldRegFromString(lesserCorner[0]));
Claim claim = new Claim(Integer.parseInt(lesserCorner[1]), Integer.parseInt(greaterCorner[1]), Claim claim = new Claim(Integer.parseInt(lesserCorner[1]), Integer.parseInt(greaterCorner[1]),
Integer.parseInt(lesserCorner[3]), Integer.parseInt(greaterCorner[3]), ConfigHandler.config.defaultClaimDepth == 255 ? 0 : Integer.parseInt(lesserCorner[3]), Integer.parseInt(greaterCorner[3]), ConfigHandler.config.defaultClaimDepth == 255 ? 0 :
Integer.parseInt(lesserCorner[2]), owner, world); Integer.parseInt(lesserCorner[2]), owner, world);
@ -513,7 +513,7 @@ public class ClaimStorage implements IPermissionStorage {
accessors.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Accessors", true)); accessors.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Accessors", true));
} }
} }
return new Pair<>(world, claim); return new Tuple<>(world, claim);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -524,11 +524,11 @@ public class ClaimStorage implements IPermissionStorage {
return new ArrayList<>(); return new ArrayList<>();
} }
public static RegistryKey<World> worldRegFromString(String spigot) { public static ResourceKey<Level> worldRegFromString(String spigot) {
if (spigot.equals("world_the_end")) if (spigot.equals("world_the_end"))
return World.END; return Level.END;
if (spigot.equals("world_nether")) if (spigot.equals("world_nether"))
return World.NETHER; return Level.NETHER;
return World.OVERWORLD; return Level.OVERWORLD;
} }
} }

View File

@ -6,27 +6,27 @@ import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import io.github.flemmli97.flan.config.Config; import io.github.flemmli97.flan.config.Config;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.server.world.ServerWorld; import net.minecraft.core.BlockPos;
import net.minecraft.util.Formatting; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.math.BlockPos; import net.minecraft.server.level.ServerPlayer;
public class GlobalClaim implements IPermissionContainer { public class GlobalClaim implements IPermissionContainer {
private final ServerWorld world; private final ServerLevel world;
public GlobalClaim(ServerWorld world) { public GlobalClaim(ServerLevel world) {
this.world = world; this.world = world;
} }
@Override @Override
public boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos, boolean message) { public boolean canInteract(ServerPlayer player, ClaimPermission perm, BlockPos pos, boolean message) {
Config.GlobalType global = ConfigHandler.config.getGlobal(this.world, perm); Config.GlobalType global = ConfigHandler.config.getGlobal(this.world, perm);
if (global != Config.GlobalType.NONE && (player == null || !PlayerClaimData.get(player).isAdminIgnoreClaim())) { if (global != Config.GlobalType.NONE && (player == null || !PlayerClaimData.get(player).isAdminIgnoreClaim())) {
if (global.getValue()) if (global.getValue())
return true; return true;
if (message) if (message)
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return false; return false;
} }
return perm != PermissionRegistry.MOBSPAWN && perm != PermissionRegistry.ANIMALSPAWN; return perm != PermissionRegistry.MOBSPAWN && perm != PermissionRegistry.ANIMALSPAWN;

View File

@ -1,19 +1,20 @@
package io.github.flemmli97.flan.claim; package io.github.flemmli97.flan.claim;
import net.minecraft.particle.DustParticleEffect; import com.mojang.math.Vector3f;
import net.minecraft.core.particles.DustParticleOptions;
public class ParticleIndicators { public class ParticleIndicators {
public static final DustParticleEffect CLAIMCORNER = new DustParticleEffect(194 / 255f, 130 / 255f, 4 / 255f, 3); public static final DustParticleOptions CLAIMCORNER = new DustParticleOptions(new Vector3f(194 / 255f, 130 / 255f, 4 / 255f), 3);
public static final DustParticleEffect CLAIMMIDDLE = new DustParticleEffect(237 / 255f, 187 / 255f, 38 / 255f, 3); public static final DustParticleOptions CLAIMMIDDLE = new DustParticleOptions(new Vector3f(237 / 255f, 187 / 255f, 38 / 255f), 3);
public static final DustParticleEffect SUBCLAIMCORNER = new DustParticleEffect(125 / 255f, 125 / 255f, 125 / 255f, 3); public static final DustParticleOptions SUBCLAIMCORNER = new DustParticleOptions(new Vector3f(125 / 255f, 125 / 255f, 125 / 255f), 3);
public static final DustParticleEffect SUBCLAIMMIDDLE = new DustParticleEffect(194 / 255f, 194 / 255f, 194 / 255f, 3); public static final DustParticleOptions SUBCLAIMMIDDLE = new DustParticleOptions(new Vector3f(194 / 255f, 194 / 255f, 194 / 255f), 3);
public static final DustParticleEffect EDITCLAIMCORNER = new DustParticleEffect(12 / 255f, 110 / 255f, 103 / 255f, 3); public static final DustParticleOptions EDITCLAIMCORNER = new DustParticleOptions(new Vector3f(12 / 255f, 110 / 255f, 103 / 255f), 3);
public static final DustParticleEffect EDITCLAIMMIDDLE = new DustParticleEffect(20 / 255f, 186 / 255f, 175 / 255f, 3); public static final DustParticleOptions EDITCLAIMMIDDLE = new DustParticleOptions(new Vector3f(20 / 255f, 186 / 255f, 175 / 255f), 3);
public static final DustParticleEffect SETCORNER = new DustParticleEffect(18 / 255f, 38 / 255f, 150 / 255f, 3); public static final DustParticleOptions SETCORNER = new DustParticleOptions(new Vector3f(18 / 255f, 38 / 255f, 150 / 255f), 3);
public static final DustParticleEffect OVERLAPCLAIM = new DustParticleEffect(255 / 255f, 0 / 255f, 0 / 255f, 3); public static final DustParticleOptions OVERLAPCLAIM = new DustParticleOptions(new Vector3f(255 / 255f, 0 / 255f, 0 / 255f), 3);
} }

View File

@ -2,19 +2,19 @@ package io.github.flemmli97.flan.claim;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.text.LiteralText; import net.minecraft.core.BlockPos;
import net.minecraft.text.MutableText; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.text.Style; import net.minecraft.network.chat.Style;
import net.minecraft.util.Formatting; import net.minecraft.network.chat.TextComponent;
import net.minecraft.util.math.BlockPos; import net.minecraft.server.level.ServerPlayer;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
public class PermHelper { public class PermHelper {
public static boolean check(ServerPlayerEntity player, BlockPos pos, Claim claim, ClaimPermission perm, Consumer<Optional<Boolean>> cons) { public static boolean check(ServerPlayer player, BlockPos pos, Claim claim, ClaimPermission perm, Consumer<Optional<Boolean>> cons) {
if (claim == null) { if (claim == null) {
cons.accept(Optional.empty()); cons.accept(Optional.empty());
return false; return false;
@ -24,26 +24,26 @@ public class PermHelper {
return hasPerm; return hasPerm;
} }
public static Claim checkReturn(ServerPlayerEntity player, ClaimPermission perm, Consumer<Optional<Boolean>> cons) { public static Claim checkReturn(ServerPlayer player, ClaimPermission perm, Consumer<Optional<Boolean>> cons) {
BlockPos pos = player.getBlockPos(); BlockPos pos = player.blockPosition();
Claim claim = ClaimStorage.get(player.getServerWorld()).getClaimAt(pos); Claim claim = ClaimStorage.get(player.getLevel()).getClaimAt(pos);
return check(player, pos, claim, perm, cons) ? claim : null; return check(player, pos, claim, perm, cons) ? claim : null;
} }
public static void noClaimMessage(ServerPlayerEntity player) { public static void noClaimMessage(ServerPlayer player) {
player.sendMessage(new LiteralText(ConfigHandler.lang.noClaim).setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED)), false); player.displayClientMessage(new TextComponent(ConfigHandler.lang.noClaim).setStyle(Style.EMPTY.applyFormat(ChatFormatting.DARK_RED)), false);
} }
public static Consumer<Optional<Boolean>> genericNoPermMessage(ServerPlayerEntity player) { public static Consumer<Optional<Boolean>> genericNoPermMessage(ServerPlayer player) {
return (b -> { return (b -> {
if (!b.isPresent()) if (!b.isPresent())
PermHelper.noClaimMessage(player); PermHelper.noClaimMessage(player);
else if (!b.get()) else if (!b.get())
player.sendMessage(simpleColoredText(ConfigHandler.lang.noPermission, Formatting.DARK_RED), false); player.displayClientMessage(simpleColoredText(ConfigHandler.lang.noPermission, ChatFormatting.DARK_RED), false);
}); });
} }
public static MutableText simpleColoredText(String text, Formatting... formatting) { public static MutableComponent simpleColoredText(String text, ChatFormatting... formatting) {
return new LiteralText(text).setStyle(formatting != null ? Style.EMPTY.withFormatting(formatting) : Style.EMPTY); return new TextComponent(text).setStyle(formatting != null ? Style.EMPTY.applyFormats(formatting) : Style.EMPTY);
} }
} }

View File

@ -7,11 +7,11 @@ import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.CommandNode;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.ChatFormatting;
import net.minecraft.text.ClickEvent; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.text.MutableText; import net.minecraft.network.chat.ClickEvent;
import net.minecraft.text.Style; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.util.Formatting; import net.minecraft.network.chat.Style;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -19,64 +19,64 @@ import java.util.stream.Collectors;
public class CommandHelp { public class CommandHelp {
public static int helpMessage(CommandContext<ServerCommandSource> context, Collection<CommandNode<ServerCommandSource>> nodes) { public static int helpMessage(CommandContext<CommandSourceStack> context, Collection<CommandNode<CommandSourceStack>> nodes) {
int page = IntegerArgumentType.getInteger(context, "page"); int page = IntegerArgumentType.getInteger(context, "page");
return helpMessage(context, page, nodes); return helpMessage(context, page, nodes);
} }
public static int helpMessage(CommandContext<ServerCommandSource> context, int page, Collection<CommandNode<ServerCommandSource>> nodes) { public static int helpMessage(CommandContext<CommandSourceStack> context, int page, Collection<CommandNode<CommandSourceStack>> nodes) {
List<String> subCommands = registeredCommands(context, nodes); List<String> subCommands = registeredCommands(context, nodes);
subCommands.remove("?"); subCommands.remove("?");
int max = subCommands.size() / 8; int max = subCommands.size() / 8;
if (page > max) if (page > max)
page = max; page = max;
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.helpHeader, page), Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.helpHeader, page), ChatFormatting.GOLD), false);
for (int i = 8 * page; i < 8 * (page + 1); i++) for (int i = 8 * page; i < 8 * (page + 1); i++)
if (i < subCommands.size()) { if (i < subCommands.size()) {
MutableText cmdText = PermHelper.simpleColoredText("- " + subCommands.get(i), Formatting.GRAY); MutableComponent cmdText = PermHelper.simpleColoredText("- " + subCommands.get(i), ChatFormatting.GRAY);
context.getSource().sendFeedback(cmdText.fillStyle(cmdText.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help cmd " + subCommands.get(i)))), false); context.getSource().sendSuccess(cmdText.withStyle(cmdText.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help cmd " + subCommands.get(i)))), false);
} }
MutableText pageText = PermHelper.simpleColoredText((page > 0 ? " " : "") + " ", Formatting.DARK_GREEN); MutableComponent pageText = PermHelper.simpleColoredText((page > 0 ? " " : "") + " ", ChatFormatting.DARK_GREEN);
if (page > 0) { if (page > 0) {
MutableText pageTextBack = PermHelper.simpleColoredText("<<", Formatting.DARK_GREEN); MutableComponent pageTextBack = PermHelper.simpleColoredText("<<", ChatFormatting.DARK_GREEN);
pageTextBack.fillStyle(pageTextBack.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page - 1)))); pageTextBack.withStyle(pageTextBack.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page - 1))));
pageText = pageTextBack.append(pageText); pageText = pageTextBack.append(pageText);
} }
if (page < max) { if (page < max) {
MutableText pageTextNext = PermHelper.simpleColoredText(">>"); MutableComponent pageTextNext = PermHelper.simpleColoredText(">>");
pageTextNext.fillStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page + 1)))); pageTextNext.withStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page + 1))));
pageText = pageText.append(pageTextNext); pageText = pageText.append(pageTextNext);
} }
context.getSource().sendFeedback(pageText, false); context.getSource().sendSuccess(pageText, false);
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
public static int helpCmd(CommandContext<ServerCommandSource> context) { public static int helpCmd(CommandContext<CommandSourceStack> context) {
String command = StringArgumentType.getString(context, "command"); String command = StringArgumentType.getString(context, "command");
return helpCmd(context, command); return helpCmd(context, command);
} }
public static int helpCmd(CommandContext<ServerCommandSource> context, String command) { public static int helpCmd(CommandContext<CommandSourceStack> context, String command) {
String[] cmdHelp = ConfigHandler.lang.cmdLang.getCommandHelp(command); String[] cmdHelp = ConfigHandler.lang.cmdLang.getCommandHelp(command);
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.helpCmdHeader, Formatting.DARK_GREEN), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.helpCmdHeader, ChatFormatting.DARK_GREEN), false);
for (int i = 0; i < cmdHelp.length; i++) { for (int i = 0; i < cmdHelp.length; i++) {
if (i == 0) { if (i == 0) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.helpCmdSyntax, cmdHelp[i]), Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.helpCmdSyntax, cmdHelp[i]), ChatFormatting.GOLD), false);
context.getSource().sendFeedback(PermHelper.simpleColoredText(""), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(""), false);
} else { } else {
context.getSource().sendFeedback(PermHelper.simpleColoredText(cmdHelp[i], Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(cmdHelp[i], ChatFormatting.GOLD), false);
} }
} }
if (command.equals("help")) { if (command.equals("help")) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.wiki, Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.wiki, ChatFormatting.GOLD), false);
MutableText wiki = PermHelper.simpleColoredText("https://github.com/Flemmli97/Flan/wiki", Formatting.GREEN); MutableComponent wiki = PermHelper.simpleColoredText("https://github.com/Flemmli97/Flan/wiki", ChatFormatting.GREEN);
wiki.setStyle(wiki.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://github.com/Flemmli97/Flan/wiki"))); wiki.setStyle(wiki.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://github.com/Flemmli97/Flan/wiki")));
context.getSource().sendFeedback(wiki, false); context.getSource().sendSuccess(wiki, false);
} }
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
public static List<String> registeredCommands(CommandContext<ServerCommandSource> context, Collection<CommandNode<ServerCommandSource>> nodes) { public static List<String> registeredCommands(CommandContext<CommandSourceStack> context, Collection<CommandNode<CommandSourceStack>> nodes) {
return nodes.stream().filter(node -> node.canUse(context.getSource())).map(CommandNode::getName).collect(Collectors.toList()); return nodes.stream().filter(node -> node.canUse(context.getSource())).map(CommandNode::getName).collect(Collectors.toList());
} }
} }

View File

@ -12,12 +12,12 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.command.CommandSource; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.command.argument.GameProfileArgumentType; import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.commands.arguments.GameProfileArgument;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.math.BlockPos; import net.minecraft.server.level.ServerPlayer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -32,21 +32,21 @@ public class CommandHelpers {
private static final Pattern allowed = Pattern.compile("[a-zA-Z0-9_+.-]+"); private static final Pattern allowed = Pattern.compile("[a-zA-Z0-9_+.-]+");
public static CompletableFuture<Suggestions> claimSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder build, UUID owner) { public static CompletableFuture<Suggestions> claimSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder build, UUID owner) {
return CommandSource.suggestMatching(ClaimStorage.get(context.getSource().getWorld()).allClaimsFromPlayer(owner) return SharedSuggestionProvider.suggest(ClaimStorage.get(context.getSource().getLevel()).allClaimsFromPlayer(owner)
.stream().map(claim -> claim.getClaimName().isEmpty() ? claim.getClaimID().toString() : claim.getClaimName()).collect(Collectors.toList()), build); .stream().map(claim -> claim.getClaimName().isEmpty() ? claim.getClaimID().toString() : claim.getClaimName()).collect(Collectors.toList()), build);
} }
public static GameProfile singleProfile(CommandContext<ServerCommandSource> context, String arg) throws CommandSyntaxException { public static GameProfile singleProfile(CommandContext<CommandSourceStack> context, String arg) throws CommandSyntaxException {
Collection<GameProfile> profs = GameProfileArgumentType.getProfileArgument(context, arg); Collection<GameProfile> profs = GameProfileArgument.getGameProfiles(context, arg);
if (profs.size() != 1) { if (profs.size() != 1) {
throw new SimpleCommandExceptionType(() -> ConfigHandler.lang.onlyOnePlayer).create(); throw new SimpleCommandExceptionType(() -> ConfigHandler.lang.onlyOnePlayer).create();
} }
return profs.stream().findFirst().get(); return profs.stream().findFirst().get();
} }
public static CompletableFuture<Suggestions> permSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder build, boolean group) { public static CompletableFuture<Suggestions> permSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder build, boolean group) {
ServerWorld world = context.getSource().getWorld(); ServerLevel world = context.getSource().getLevel();
Claim claim = ClaimStorage.get(world).getClaimAt(new BlockPos(context.getSource().getPosition())); Claim claim = ClaimStorage.get(world).getClaimAt(new BlockPos(context.getSource().getPosition()));
boolean admin = claim != null && claim.isAdminClaim(); boolean admin = claim != null && claim.isAdminClaim();
List<String> allowedPerms = new ArrayList<>(); List<String> allowedPerms = new ArrayList<>();
@ -57,15 +57,15 @@ public class CommandHelpers {
if (!group || !PermissionRegistry.globalPerms().contains(perm)) if (!group || !PermissionRegistry.globalPerms().contains(perm))
allowedPerms.add(perm.id); allowedPerms.add(perm.id);
} }
return CommandSource.suggestMatching(allowedPerms, build); return SharedSuggestionProvider.suggest(allowedPerms, build);
} }
public static CompletableFuture<Suggestions> groupSuggestion(CommandContext<ServerCommandSource> context, SuggestionsBuilder build) throws CommandSyntaxException { public static CompletableFuture<Suggestions> groupSuggestion(CommandContext<CommandSourceStack> context, SuggestionsBuilder build) throws CommandSyntaxException {
ServerPlayerEntity player = context.getSource().getPlayer(); ServerPlayer player = context.getSource().getPlayerOrException();
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();
ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); ClaimStorage storage = ClaimStorage.get(player.getLevel());
Claim claim = storage.getClaimAt(player.getBlockPos()); Claim claim = storage.getClaimAt(player.blockPosition());
if (claim != null && claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) { if (claim != null && claim.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition())) {
list = claim.groups(); list = claim.groups();
} }
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
@ -73,11 +73,11 @@ public class CommandHelpers {
continue; continue;
list.set(i, '\"' + list.get(i) + '\"'); list.set(i, '\"' + list.get(i) + '\"');
} }
return CommandSource.suggestMatching(list, build); return SharedSuggestionProvider.suggest(list, build);
} }
public static CompletableFuture<Suggestions> personalGroupSuggestion(CommandContext<ServerCommandSource> context, SuggestionsBuilder build) throws CommandSyntaxException { public static CompletableFuture<Suggestions> personalGroupSuggestion(CommandContext<CommandSourceStack> context, SuggestionsBuilder build) throws CommandSyntaxException {
ServerPlayerEntity player = context.getSource().getPlayer(); ServerPlayer player = context.getSource().getPlayerOrException();
List<String> list = new ArrayList<>(PlayerClaimData.get(player).playerDefaultGroups().keySet()); List<String> list = new ArrayList<>(PlayerClaimData.get(player).playerDefaultGroups().keySet());
list.sort(null); list.sort(null);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
@ -85,7 +85,7 @@ public class CommandHelpers {
continue; continue;
list.set(i, '\"' + list.get(i) + '\"'); list.set(i, '\"' + list.get(i) + '\"');
} }
return CommandSource.suggestMatching(list, build); return SharedSuggestionProvider.suggest(list, build);
} }
public static <T extends Enum<T>> T parseEnum(Class<T> clss, String name, T fallback) { public static <T extends Enum<T>> T parseEnum(Class<T> clss, String name, T fallback) {
@ -97,6 +97,6 @@ public class CommandHelpers {
} }
public static <T extends Enum<T>> CompletableFuture<Suggestions> enumSuggestion(Class<T> clss, SuggestionsBuilder build) { public static <T extends Enum<T>> CompletableFuture<Suggestions> enumSuggestion(Class<T> clss, SuggestionsBuilder build) {
return CommandSource.suggestMatching(Stream.of(clss.getEnumConstants()).map(Object::toString), build); return SharedSuggestionProvider.suggest(Stream.of(clss.getEnumConstants()).map(Object::toString), build);
} }
} }

View File

@ -7,11 +7,11 @@ import io.github.flemmli97.flan.CrossPlatformStuff;
import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import net.minecraft.item.Item; import net.minecraft.resources.ResourceLocation;
import net.minecraft.item.Items;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Identifier; import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
@ -144,9 +144,9 @@ public class Config {
this.worldWhitelist = ConfigHandler.fromJson(obj, "worldWhitelist", this.worldWhitelist); this.worldWhitelist = ConfigHandler.fromJson(obj, "worldWhitelist", this.worldWhitelist);
if (obj.has("claimingItem")) if (obj.has("claimingItem"))
this.claimingItem = CrossPlatformStuff.registryItems().getFromId(new Identifier((obj.get("claimingItem").getAsString()))); this.claimingItem = CrossPlatformStuff.registryItems().getFromId(new ResourceLocation((obj.get("claimingItem").getAsString())));
if (obj.has("inspectionItem")) if (obj.has("inspectionItem"))
this.inspectionItem = CrossPlatformStuff.registryItems().getFromId(new Identifier((obj.get("inspectionItem").getAsString()))); this.inspectionItem = CrossPlatformStuff.registryItems().getFromId(new ResourceLocation((obj.get("inspectionItem").getAsString())));
this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime); this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime);
this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel); this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel);
@ -291,26 +291,26 @@ public class Config {
} }
} }
public boolean globallyDefined(ServerWorld world, ClaimPermission perm) { public boolean globallyDefined(ServerLevel world, ClaimPermission perm) {
return !this.getGlobal(world, perm).canModify(); return !this.getGlobal(world, perm).canModify();
} }
public GlobalType getGlobal(ServerWorld world, ClaimPermission perm) { public GlobalType getGlobal(ServerLevel world, ClaimPermission perm) {
//Update permission map if not done already //Update permission map if not done already
Map<ClaimPermission, GlobalType> allMap = ConfigHandler.config.globalDefaultPerms.get("*"); Map<ClaimPermission, GlobalType> allMap = ConfigHandler.config.globalDefaultPerms.get("*");
if (allMap != null) { if (allMap != null) {
world.getServer().getWorlds().forEach(w -> { world.getServer().getAllLevels().forEach(w -> {
Map<ClaimPermission, GlobalType> wMap = ConfigHandler.config.globalDefaultPerms.getOrDefault(w.getRegistryKey().getValue().toString(), new HashMap<>()); Map<ClaimPermission, GlobalType> wMap = ConfigHandler.config.globalDefaultPerms.getOrDefault(w.dimension().location().toString(), new HashMap<>());
allMap.forEach((key, value) -> { allMap.forEach((key, value) -> {
if (!wMap.containsKey(key)) if (!wMap.containsKey(key))
wMap.put(key, value); wMap.put(key, value);
}); });
ConfigHandler.config.globalDefaultPerms.put(w.getRegistryKey().getValue().toString(), wMap); ConfigHandler.config.globalDefaultPerms.put(w.dimension().location().toString(), wMap);
}); });
ConfigHandler.config.globalDefaultPerms.remove("*"); ConfigHandler.config.globalDefaultPerms.remove("*");
} }
Map<ClaimPermission, GlobalType> permMap = ConfigHandler.config.globalDefaultPerms.get(world.getRegistryKey().getValue().toString()); Map<ClaimPermission, GlobalType> permMap = ConfigHandler.config.globalDefaultPerms.get(world.dimension().location().toString());
return permMap == null ? GlobalType.NONE : permMap.getOrDefault(perm, GlobalType.NONE); return permMap == null ? GlobalType.NONE : permMap.getOrDefault(perm, GlobalType.NONE);
} }

View File

@ -4,11 +4,11 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.util.WorldSavePath; import net.minecraft.world.level.Level;
import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.World; import net.minecraft.world.level.storage.LevelResource;
import net.minecraft.world.dimension.DimensionType;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.HashMap; import java.util.HashMap;
@ -20,7 +20,7 @@ public class ConfigHandler {
public static Config config; public static Config config;
public static LangConfig lang; public static LangConfig lang;
private static Map<RegistryKey<World>, Path> claimSavePath = new HashMap<>(); private static Map<ResourceKey<Level>, Path> claimSavePath = new HashMap<>();
private static Path playerSavePath; private static Path playerSavePath;
public static void serverLoad(MinecraftServer server) { public static void serverLoad(MinecraftServer server) {
@ -34,13 +34,13 @@ public class ConfigHandler {
lang.load(); lang.load();
} }
public static Path getClaimSavePath(MinecraftServer server, RegistryKey<World> reg) { public static Path getClaimSavePath(MinecraftServer server, ResourceKey<Level> reg) {
return claimSavePath.computeIfAbsent(reg, r -> DimensionType.getSaveDirectory(r, server.getSavePath(WorldSavePath.ROOT).toFile()).toPath().resolve("data").resolve("claims")); return claimSavePath.computeIfAbsent(reg, r -> DimensionType.getStorageFolder(r, server.getWorldPath(LevelResource.ROOT)).resolve("data").resolve("claims"));
} }
public static Path getPlayerSavePath(MinecraftServer server) { public static Path getPlayerSavePath(MinecraftServer server) {
if (playerSavePath == null) if (playerSavePath == null)
playerSavePath = server.getSavePath(WorldSavePath.PLAYERDATA).resolve("claimData"); playerSavePath = server.getWorldPath(LevelResource.PLAYER_DATA_DIR).resolve("claimData");
return playerSavePath; return playerSavePath;
} }

View File

@ -10,49 +10,49 @@ import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.LockedLecternScreenHandler; import io.github.flemmli97.flan.gui.LockedLecternScreenHandler;
import io.github.flemmli97.flan.player.EnumDisplayType; import io.github.flemmli97.flan.player.EnumDisplayType;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.block.DoorBlock; import net.minecraft.core.Direction;
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.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.ActionResult; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Hand; import net.minecraft.world.InteractionHand;
import net.minecraft.util.Identifier; import net.minecraft.world.InteractionResult;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.util.math.Direction; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.World; import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.DoorBlock;
import net.minecraft.world.level.block.LecternBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.LecternBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import net.minecraft.world.phys.BlockHitResult;
import java.util.List; import java.util.List;
public class BlockInteractEvents { public class BlockInteractEvents {
public static ActionResult startBreakBlocks(PlayerEntity player, World world, Hand hand, BlockPos pos, Direction direction) { public static InteractionResult startBreakBlocks(Player player, Level world, InteractionHand hand, BlockPos pos, Direction direction) {
return breakBlocks(world, player, pos, world.getBlockState(pos), world.getBlockEntity(pos)) ? ActionResult.PASS : ActionResult.FAIL; return breakBlocks(world, player, pos, world.getBlockState(pos), world.getBlockEntity(pos)) ? InteractionResult.PASS : InteractionResult.FAIL;
} }
public static boolean breakBlocks(World world, PlayerEntity p, BlockPos pos, BlockState state, BlockEntity tile) { public static boolean breakBlocks(Level world, Player p, BlockPos pos, BlockState state, BlockEntity tile) {
if (world.isClient || p.isSpectator()) if (world.isClientSide || p.isSpectator())
return true; return true;
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayer player = (ServerPlayer) p;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) { if (claim != null) {
Identifier id = CrossPlatformStuff.registryBlocks().getIDFrom(state.getBlock()); ResourceLocation id = CrossPlatformStuff.registryBlocks().getIDFrom(state.getBlock());
if (contains(id, world.getBlockEntity(pos), ConfigHandler.config.breakBlockBlacklist, ConfigHandler.config.breakBETagBlacklist)) if (contains(id, world.getBlockEntity(pos), ConfigHandler.config.breakBlockBlacklist, ConfigHandler.config.breakBETagBlacklist))
return true; return true;
if (!claim.canInteract(player, PermissionRegistry.BREAK, pos, true)) { if (!claim.canInteract(player, PermissionRegistry.BREAK, pos, true)) {
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
return false; return false;
} }
} }
@ -60,92 +60,92 @@ public class BlockInteractEvents {
} }
//Right click block //Right click block
public static ActionResult useBlocks(PlayerEntity p, World world, Hand hand, BlockHitResult hitResult) { public static InteractionResult useBlocks(Player p, Level world, InteractionHand hand, BlockHitResult hitResult) {
if (world.isClient) if (world.isClientSide)
return ActionResult.PASS; return InteractionResult.PASS;
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayer player = (ServerPlayer) p;
ItemStack stack = player.getStackInHand(hand); ItemStack stack = player.getItemInHand(hand);
if (stack.getItem() == ConfigHandler.config.claimingItem) { if (stack.getItem() == ConfigHandler.config.claimingItem) {
ItemInteractEvents.claimLandHandling(player, hitResult.getBlockPos()); ItemInteractEvents.claimLandHandling(player, hitResult.getBlockPos());
return ActionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
if (stack.getItem() == ConfigHandler.config.inspectionItem) { if (stack.getItem() == ConfigHandler.config.inspectionItem) {
ItemInteractEvents.inspect(player, hitResult.getBlockPos()); ItemInteractEvents.inspect(player, hitResult.getBlockPos());
return ActionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
IPermissionContainer claim = storage.getForPermissionCheck(hitResult.getBlockPos()); IPermissionContainer claim = storage.getForPermissionCheck(hitResult.getBlockPos());
if (claim != null) { if (claim != null) {
BlockState state = world.getBlockState(hitResult.getBlockPos()); BlockState state = world.getBlockState(hitResult.getBlockPos());
Identifier id = CrossPlatformStuff.registryBlocks().getIDFrom(state.getBlock()); ResourceLocation id = CrossPlatformStuff.registryBlocks().getIDFrom(state.getBlock());
BlockEntity blockEntity = world.getBlockEntity(hitResult.getBlockPos()); BlockEntity blockEntity = world.getBlockEntity(hitResult.getBlockPos());
if (contains(id, blockEntity, ConfigHandler.config.interactBlockBlacklist, ConfigHandler.config.interactBETagBlacklist)) if (contains(id, blockEntity, ConfigHandler.config.interactBlockBlacklist, ConfigHandler.config.interactBETagBlacklist))
return ActionResult.PASS; return InteractionResult.PASS;
ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock());
if (perm == PermissionRegistry.PROJECTILES) if (perm == PermissionRegistry.PROJECTILES)
perm = PermissionRegistry.OPENCONTAINER; perm = PermissionRegistry.OPENCONTAINER;
//Pressureplate handled elsewhere //Pressureplate handled elsewhere
if (perm != null && perm != PermissionRegistry.PRESSUREPLATE) { if (perm != null && perm != PermissionRegistry.PRESSUREPLATE) {
if (claim.canInteract(player, perm, hitResult.getBlockPos(), true)) if (claim.canInteract(player, perm, hitResult.getBlockPos(), true))
return ActionResult.PASS; return InteractionResult.PASS;
if (state.getBlock() instanceof DoorBlock) { if (state.getBlock() instanceof DoorBlock) {
DoubleBlockHalf half = state.get(DoorBlock.HALF); DoubleBlockHalf half = state.getValue(DoorBlock.HALF);
if (half == DoubleBlockHalf.LOWER) { if (half == DoubleBlockHalf.LOWER) {
BlockState other = world.getBlockState(hitResult.getBlockPos().up()); BlockState other = world.getBlockState(hitResult.getBlockPos().above());
player.networkHandler.sendPacket(new BlockUpdateS2CPacket(hitResult.getBlockPos().up(), other)); player.connection.send(new ClientboundBlockUpdatePacket(hitResult.getBlockPos().above(), other));
} else { } else {
BlockState other = world.getBlockState(hitResult.getBlockPos().down()); BlockState other = world.getBlockState(hitResult.getBlockPos().below());
player.networkHandler.sendPacket(new BlockUpdateS2CPacket(hitResult.getBlockPos().down(), other)); player.connection.send(new ClientboundBlockUpdatePacket(hitResult.getBlockPos().below(), other));
} }
} }
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
if (blockEntity != null) { if (blockEntity != null) {
if (blockEntity instanceof LecternBlockEntity) { if (blockEntity instanceof LecternBlockEntity) {
if (claim.canInteract(player, PermissionRegistry.LECTERNTAKE, hitResult.getBlockPos(), false)) if (claim.canInteract(player, PermissionRegistry.LECTERNTAKE, hitResult.getBlockPos(), false))
return ActionResult.PASS; return InteractionResult.PASS;
if (state.get(LecternBlock.HAS_BOOK)) if (state.getValue(LecternBlock.HAS_BOOK))
LockedLecternScreenHandler.create(player, (LecternBlockEntity) blockEntity); LockedLecternScreenHandler.create(player, (LecternBlockEntity) blockEntity);
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
if (!ConfigHandler.config.lenientBlockEntityCheck || CrossPlatformStuff.isInventoryTile(blockEntity)) { if (!ConfigHandler.config.lenientBlockEntityCheck || CrossPlatformStuff.isInventoryTile(blockEntity)) {
if (claim.canInteract(player, PermissionRegistry.OPENCONTAINER, hitResult.getBlockPos(), true)) if (claim.canInteract(player, PermissionRegistry.OPENCONTAINER, hitResult.getBlockPos(), true))
return ActionResult.PASS; return InteractionResult.PASS;
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
} }
return claim.canInteract(player, PermissionRegistry.INTERACTBLOCK, hitResult.getBlockPos(), false) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.INTERACTBLOCK, hitResult.getBlockPos(), false) ? InteractionResult.PASS : InteractionResult.FAIL;
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
public static boolean contains(Identifier id, BlockEntity blockEntity, List<String> idList, List<String> tagList) { public static boolean contains(ResourceLocation id, BlockEntity blockEntity, List<String> idList, List<String> tagList) {
if (idList.contains(id.getNamespace()) if (idList.contains(id.getNamespace())
|| idList.contains(id.toString())) || idList.contains(id.toString()))
return true; return true;
if (blockEntity != null && !tagList.isEmpty()) { if (blockEntity != null && !tagList.isEmpty()) {
CompoundTag nbt = blockEntity.toTag(new CompoundTag()); CompoundTag nbt = blockEntity.saveWithoutMetadata();
return tagList.stream().anyMatch(tag -> CrossPlatformStuff.blockDataContains(nbt, tag)); return tagList.stream().anyMatch(tag -> CrossPlatformStuff.blockDataContains(nbt, tag));
} }
return false; return false;
} }
public static boolean cancelEntityBlockCollision(BlockState state, World world, BlockPos pos, Entity entity) { public static boolean cancelEntityBlockCollision(BlockState state, Level world, BlockPos pos, Entity entity) {
if (world.isClient) if (world.isClientSide)
return false; return false;
ServerPlayerEntity player = null; ServerPlayer player = null;
if (entity instanceof ServerPlayerEntity) if (entity instanceof ServerPlayer)
player = (ServerPlayerEntity) entity; player = (ServerPlayer) entity;
else if (entity instanceof ProjectileEntity) { else if (entity instanceof Projectile) {
Entity owner = ((ProjectileEntity) entity).getOwner(); Entity owner = ((Projectile) entity).getOwner();
if (owner instanceof ServerPlayerEntity) if (owner instanceof ServerPlayer)
player = (ServerPlayerEntity) owner; player = (ServerPlayer) owner;
} else if (entity instanceof ItemEntity) { } else if (entity instanceof ItemEntity) {
Entity owner = ((ServerWorld) world).getEntity(((ItemEntity) entity).getThrower()); Entity owner = ((ServerLevel) world).getEntity(((ItemEntity) entity).getThrower());
if (owner instanceof ServerPlayerEntity) if (owner instanceof ServerPlayer)
player = (ServerPlayerEntity) owner; player = (ServerPlayer) owner;
} }
if (player == null) if (player == null)
return false; return false;
@ -154,7 +154,7 @@ public class BlockInteractEvents {
return false; return false;
if (perm != PermissionRegistry.PRESSUREPLATE && perm != PermissionRegistry.PORTAL) if (perm != PermissionRegistry.PRESSUREPLATE && perm != PermissionRegistry.PORTAL)
return false; return false;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) if (claim != null)
return !claim.canInteract(player, perm, pos, false); return !claim.canInteract(player, perm, pos, false);
@ -162,58 +162,58 @@ public class BlockInteractEvents {
} }
public static boolean preventFallOn(Entity entity, double heightDifference, boolean onGround, BlockState landedState, BlockPos landedPosition) { public static boolean preventFallOn(Entity entity, double heightDifference, boolean onGround, BlockState landedState, BlockPos landedPosition) {
if (entity.world.isClient) if (entity.level.isClientSide)
return false; return false;
if (entity instanceof ServerPlayerEntity) { if (entity instanceof ServerPlayer) {
ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock()); ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock());
if (perm != PermissionRegistry.TRAMPLE) if (perm != PermissionRegistry.TRAMPLE)
return false; return false;
ClaimStorage storage = ClaimStorage.get((ServerWorld) entity.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) entity.level);
IPermissionContainer claim = storage.getForPermissionCheck(landedPosition); IPermissionContainer claim = storage.getForPermissionCheck(landedPosition);
if (claim == null) if (claim == null)
return false; return false;
return !claim.canInteract((ServerPlayerEntity) entity, perm, landedPosition, true); return !claim.canInteract((ServerPlayer) entity, perm, landedPosition, true);
} else if (entity instanceof ProjectileEntity) { } else if (entity instanceof Projectile) {
Entity owner = ((ProjectileEntity) entity).getOwner(); Entity owner = ((Projectile) entity).getOwner();
if (owner instanceof ServerPlayerEntity) { if (owner instanceof ServerPlayer) {
ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock()); ClaimPermission perm = ObjectToPermissionMap.getFromBlock(landedState.getBlock());
if (perm != PermissionRegistry.TRAMPLE) if (perm != PermissionRegistry.TRAMPLE)
return false; return false;
ClaimStorage storage = ClaimStorage.get((ServerWorld) entity.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) entity.level);
IPermissionContainer claim = storage.getForPermissionCheck(landedPosition); IPermissionContainer claim = storage.getForPermissionCheck(landedPosition);
return !claim.canInteract((ServerPlayerEntity) owner, perm, landedPosition, true); return !claim.canInteract((ServerPlayer) owner, perm, landedPosition, true);
} }
} }
return false; return false;
} }
public static boolean canBreakTurtleEgg(World world, BlockPos pos, Entity entity) { public static boolean canBreakTurtleEgg(Level world, BlockPos pos, Entity entity) {
if (world.isClient) if (world.isClientSide)
return false; return false;
ServerWorld serverWorld = (ServerWorld) world; ServerLevel serverWorld = (ServerLevel) world;
if (entity instanceof ServerPlayerEntity) { if (entity instanceof ServerPlayer) {
ClaimStorage storage = ClaimStorage.get(serverWorld); ClaimStorage storage = ClaimStorage.get(serverWorld);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim == null) if (claim == null)
return false; return false;
return !claim.canInteract((ServerPlayerEntity) entity, PermissionRegistry.TRAMPLE, pos, true); return !claim.canInteract((ServerPlayer) entity, PermissionRegistry.TRAMPLE, pos, true);
} else if (entity instanceof ProjectileEntity) { } else if (entity instanceof Projectile) {
Entity owner = ((ProjectileEntity) entity).getOwner(); Entity owner = ((Projectile) entity).getOwner();
if (owner instanceof ServerPlayerEntity) { if (owner instanceof ServerPlayer) {
ClaimStorage storage = ClaimStorage.get(serverWorld); ClaimStorage storage = ClaimStorage.get(serverWorld);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim == null) if (claim == null)
return false; return false;
return !claim.canInteract((ServerPlayerEntity) owner, PermissionRegistry.TRAMPLE, pos, true); return !claim.canInteract((ServerPlayer) owner, PermissionRegistry.TRAMPLE, pos, true);
} }
} else if (entity instanceof ItemEntity) { } else if (entity instanceof ItemEntity) {
Entity owner = serverWorld.getEntity(((ItemEntity) entity).getThrower()); Entity owner = serverWorld.getEntity(((ItemEntity) entity).getThrower());
if (owner instanceof ServerPlayerEntity) { if (owner instanceof ServerPlayer) {
ClaimStorage storage = ClaimStorage.get(serverWorld); ClaimStorage storage = ClaimStorage.get(serverWorld);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim == null) if (claim == null)
return false; return false;
return !claim.canInteract((ServerPlayerEntity) owner, PermissionRegistry.TRAMPLE, pos, true); return !claim.canInteract((ServerPlayer) owner, PermissionRegistry.TRAMPLE, pos, true);
} }
} }
return false; return false;

View File

@ -14,166 +14,166 @@ import io.github.flemmli97.flan.player.IOwnedItem;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import io.github.flemmli97.flan.player.TeleportUtils; import io.github.flemmli97.flan.player.TeleportUtils;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.entity.Entity; import net.minecraft.core.NonNullList;
import net.minecraft.entity.ItemEntity; import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
import net.minecraft.entity.LivingEntity; import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket;
import net.minecraft.entity.boss.WitherEntity; import net.minecraft.resources.ResourceLocation;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.level.ServerLevel;
import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.sounds.SoundEvents;
import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.util.Mth;
import net.minecraft.entity.mob.Monster; import net.minecraft.world.InteractionHand;
import net.minecraft.entity.passive.SnowGolemEntity; import net.minecraft.world.InteractionResult;
import net.minecraft.entity.passive.TameableEntity; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.world.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.entity.projectile.PersistentProjectileEntity; import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.world.entity.animal.SnowGolem;
import net.minecraft.entity.projectile.thrown.EggEntity; import net.minecraft.world.entity.boss.wither.WitherBoss;
import net.minecraft.entity.projectile.thrown.EnderPearlEntity; import net.minecraft.world.entity.decoration.ArmorStand;
import net.minecraft.entity.projectile.thrown.PotionEntity; import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.entity.vehicle.AbstractMinecartEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.world.entity.monster.EnderMan;
import net.minecraft.entity.vehicle.StorageMinecartEntity; import net.minecraft.world.entity.monster.Enemy;
import net.minecraft.item.ItemStack; import net.minecraft.world.entity.npc.Villager;
import net.minecraft.network.packet.s2c.play.InventoryS2CPacket; import net.minecraft.world.entity.player.Player;
import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.entity.projectile.ThrownEgg;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.entity.projectile.ThrownEnderpearl;
import net.minecraft.util.ActionResult; import net.minecraft.world.entity.projectile.ThrownPotion;
import net.minecraft.util.Hand; import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.util.Identifier; import net.minecraft.world.entity.vehicle.AbstractMinecartContainer;
import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.hit.EntityHitResult; import net.minecraft.world.level.Level;
import net.minecraft.util.hit.HitResult; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.util.math.MathHelper; import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.world.phys.HitResult;
import net.minecraft.world.World; import net.minecraft.world.phys.Vec3;
import java.util.function.Consumer; import java.util.function.Consumer;
public class EntityInteractEvents { public class EntityInteractEvents {
public static ActionResult attackEntity(PlayerEntity player, World world, Hand hand, Entity entity, EntityHitResult hitResult) { public static InteractionResult attackEntity(Player player, Level world, InteractionHand hand, Entity entity, EntityHitResult hitResult) {
return attackSimple(player, entity, true); return attackSimple(player, entity, true);
} }
public static ActionResult useAtEntity(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult) { public static InteractionResult useAtEntity(Player player, Level world, InteractionHand hand, Entity entity, /* Nullable */ EntityHitResult hitResult) {
if (player.world.isClient || player.isSpectator() || canInteract(entity)) if (player.level.isClientSide || player.isSpectator() || canInteract(entity))
return ActionResult.PASS; return InteractionResult.PASS;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
BlockPos pos = entity.getBlockPos(); BlockPos pos = entity.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) { if (claim != null) {
if (entity instanceof ArmorStandEntity) { if (entity instanceof ArmorStand) {
if (!claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.ARMORSTAND, pos, true)) if (!claim.canInteract((ServerPlayer) player, PermissionRegistry.ARMORSTAND, pos, true))
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
public static ActionResult useEntity(PlayerEntity p, World world, Hand hand, Entity entity) { public static InteractionResult useEntity(Player p, Level world, InteractionHand hand, Entity entity) {
if (p.world.isClient || p.isSpectator() || canInteract(entity)) if (p.level.isClientSide || p.isSpectator() || canInteract(entity))
return ActionResult.PASS; return InteractionResult.PASS;
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayer player = (ServerPlayer) p;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
BlockPos pos = entity.getBlockPos(); BlockPos pos = entity.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) { if (claim != null) {
if (entity instanceof BoatEntity) if (entity instanceof Boat)
return claim.canInteract(player, PermissionRegistry.BOAT, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.BOAT, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
if (entity instanceof AbstractMinecartEntity) { if (entity instanceof AbstractMinecart) {
if (entity instanceof StorageMinecartEntity) if (entity instanceof AbstractMinecartContainer)
return claim.canInteract(player, PermissionRegistry.OPENCONTAINER, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.OPENCONTAINER, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
return claim.canInteract(player, PermissionRegistry.MINECART, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.MINECART, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
} }
if (entity instanceof VillagerEntity) if (entity instanceof Villager)
return claim.canInteract(player, PermissionRegistry.TRADING, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.TRADING, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
if (entity instanceof ItemFrameEntity) if (entity instanceof ItemFrame)
return claim.canInteract(player, PermissionRegistry.ITEMFRAMEROTATE, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.ITEMFRAMEROTATE, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
if (entity instanceof TameableEntity) { if (entity instanceof TamableAnimal) {
TameableEntity tame = (TameableEntity) entity; TamableAnimal tame = (TamableAnimal) entity;
if (tame.isOwner(player)) if (tame.isOwnedBy(player))
return ActionResult.PASS; return InteractionResult.PASS;
} }
return claim.canInteract(player, PermissionRegistry.ANIMALINTERACT, pos, true) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.ANIMALINTERACT, pos, true) ? InteractionResult.PASS : InteractionResult.FAIL;
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
public static boolean canInteract(Entity entity) { public static boolean canInteract(Entity entity) {
Identifier id = CrossPlatformStuff.registryEntities().getIDFrom(entity.getType()); ResourceLocation id = CrossPlatformStuff.registryEntities().getIDFrom(entity.getType());
return ConfigHandler.config.ignoredEntityTypes.contains(id.getNamespace()) return ConfigHandler.config.ignoredEntityTypes.contains(id.getNamespace())
|| ConfigHandler.config.ignoredEntityTypes.contains(id.toString()) || ConfigHandler.config.ignoredEntityTypes.contains(id.toString())
|| entity.getScoreboardTags().stream().anyMatch(ConfigHandler.config.entityTagIgnore::contains); || entity.getTags().stream().anyMatch(ConfigHandler.config.entityTagIgnore::contains);
} }
public static boolean projectileHit(ProjectileEntity proj, HitResult res) { public static boolean projectileHit(Projectile proj, HitResult res) {
if (proj.world.isClient) if (proj.level.isClientSide)
return false; return false;
Entity owner = proj.getOwner(); Entity owner = proj.getOwner();
if (owner instanceof ServerPlayerEntity) { if (owner instanceof ServerPlayer) {
ServerPlayerEntity player = (ServerPlayerEntity) owner; ServerPlayer player = (ServerPlayer) owner;
if (res.getType() == HitResult.Type.BLOCK) { if (res.getType() == HitResult.Type.BLOCK) {
BlockHitResult blockRes = (BlockHitResult) res; BlockHitResult blockRes = (BlockHitResult) res;
BlockPos pos = blockRes.getBlockPos(); BlockPos pos = blockRes.getBlockPos();
BlockState state = proj.world.getBlockState(pos); BlockState state = proj.level.getBlockState(pos);
ClaimPermission perm; ClaimPermission perm;
if (proj instanceof EnderPearlEntity) if (proj instanceof ThrownEnderpearl)
perm = PermissionRegistry.ENDERPEARL; perm = PermissionRegistry.ENDERPEARL;
else if (proj instanceof EggEntity || proj instanceof PotionEntity) else if (proj instanceof ThrownEgg || proj instanceof ThrownPotion)
perm = PermissionRegistry.PROJECTILES; perm = PermissionRegistry.PROJECTILES;
else else
perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); perm = ObjectToPermissionMap.getFromBlock(state.getBlock());
if (perm != PermissionRegistry.ENDERPEARL && perm != PermissionRegistry.TARGETBLOCK && perm != PermissionRegistry.PROJECTILES) if (perm != PermissionRegistry.ENDERPEARL && perm != PermissionRegistry.TARGETBLOCK && perm != PermissionRegistry.PROJECTILES)
return false; return false;
ClaimStorage storage = ClaimStorage.get((ServerWorld) proj.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) proj.level);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim == null) if (claim == null)
return false; return false;
boolean flag = !claim.canInteract(player, perm, pos, true); boolean flag = !claim.canInteract(player, perm, pos, true);
if (flag) { if (flag) {
if (proj instanceof PersistentProjectileEntity) { if (proj instanceof AbstractArrow) {
PersistentProjectileEntity pers = (PersistentProjectileEntity) proj; AbstractArrow pers = (AbstractArrow) proj;
((IPersistentProjectileVars) pers).setInBlockState(pers.world.getBlockState(pos)); ((IPersistentProjectileVars) pers).setInBlockState(pers.level.getBlockState(pos));
Vec3d vec3d = blockRes.getPos().subtract(pers.getX(), pers.getY(), pers.getZ()); Vec3 vec3d = blockRes.getLocation().subtract(pers.getX(), pers.getY(), pers.getZ());
pers.setVelocity(vec3d); pers.setDeltaMovement(vec3d);
Vec3d vec3d2 = vec3d.normalize().multiply(0.05000000074505806D); Vec3 vec3d2 = vec3d.normalize().scale(0.05000000074505806D);
pers.setPos(pers.getX() - vec3d2.x, pers.getY() - vec3d2.y, pers.getZ() - vec3d2.z); pers.setPosRaw(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)); pers.playSound(((IPersistentProjectileVars) pers).getSoundEvent(), 1.0F, 1.2F / (pers.level.random.nextFloat() * 0.2F + 0.9F));
((IPersistentProjectileVars) pers).setInGround(true); ((IPersistentProjectileVars) pers).setInGround(true);
pers.shake = 7; pers.shakeTime = 7;
pers.setCritical(false); pers.setCritArrow(false);
pers.setPierceLevel((byte) 0); pers.setPierceLevel((byte) 0);
pers.setSound(SoundEvents.ENTITY_ARROW_HIT); pers.setSoundEvent(SoundEvents.ARROW_HIT);
pers.setShotFromCrossbow(false); pers.setShotFromCrossbow(false);
((IPersistentProjectileVars) pers).resetPiercingStatus(); ((IPersistentProjectileVars) pers).resetPiercingStatus();
} }
if (proj instanceof EnderPearlEntity) if (proj instanceof ThrownEnderpearl)
proj.remove(); proj.remove(Entity.RemovalReason.KILLED);
//TODO: find a way to properly update chorus fruit break on hit //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))); //player.getServer().send(new ServerTask(player.getServer().getTicks()+2, ()->player.world.updateListeners(pos, state, state, 2)));
} }
return flag; return flag;
} else if (res.getType() == HitResult.Type.ENTITY) { } else if (res.getType() == HitResult.Type.ENTITY) {
if (proj instanceof EnderPearlEntity) { if (proj instanceof ThrownEnderpearl) {
ClaimStorage storage = ClaimStorage.get((ServerWorld) proj.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) proj.level);
IPermissionContainer claim = storage.getForPermissionCheck(proj.getBlockPos()); IPermissionContainer claim = storage.getForPermissionCheck(proj.blockPosition());
return claim.canInteract(player, PermissionRegistry.ENDERPEARL, proj.getBlockPos(), true); return claim.canInteract(player, PermissionRegistry.ENDERPEARL, proj.blockPosition(), true);
} }
Entity hit = ((EntityHitResult) res).getEntity(); Entity hit = ((EntityHitResult) res).getEntity();
boolean fail = attackSimple(player, hit, true) != ActionResult.PASS; boolean fail = attackSimple(player, hit, true) != InteractionResult.PASS;
if (fail && proj instanceof PersistentProjectileEntity && ((PersistentProjectileEntity) proj).getPierceLevel() > 0) { if (fail && proj instanceof AbstractArrow && ((AbstractArrow) proj).getPierceLevel() > 0) {
PersistentProjectileEntity pers = (PersistentProjectileEntity) proj; AbstractArrow pers = (AbstractArrow) proj;
IntOpenHashSet pierced = ((IPersistentProjectileVars) pers).getPiercedEntities(); IntOpenHashSet pierced = ((IPersistentProjectileVars) pers).getPiercedEntities();
if (pierced == null) if (pierced == null)
pierced = new IntOpenHashSet(5); pierced = new IntOpenHashSet(5);
pierced.add(hit.getEntityId()); pierced.add(hit.getId());
((IPersistentProjectileVars) pers).setPiercedEntities(pierced); ((IPersistentProjectileVars) pers).setPiercedEntities(pierced);
pers.setPierceLevel((byte) (pers.getPierceLevel() + 1)); pers.setPierceLevel((byte) (pers.getPierceLevel() + 1));
} }
@ -184,60 +184,60 @@ public class EntityInteractEvents {
} }
public static boolean preventDamage(Entity entity, DamageSource source) { public static boolean preventDamage(Entity entity, DamageSource source) {
if (source.getAttacker() instanceof ServerPlayerEntity) if (source.getEntity() instanceof ServerPlayer)
return attackSimple((ServerPlayerEntity) source.getAttacker(), entity, true) != ActionResult.PASS; return attackSimple((ServerPlayer) source.getEntity(), entity, true) != InteractionResult.PASS;
else if (source.isExplosive() && !entity.world.isClient) { else if (source.isExplosion() && !entity.level.isClientSide) {
IPermissionContainer claim = ClaimStorage.get((ServerWorld) entity.world).getForPermissionCheck(entity.getBlockPos()); IPermissionContainer claim = ClaimStorage.get((ServerLevel) entity.level).getForPermissionCheck(entity.blockPosition());
return claim != null && !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, entity.getBlockPos()); return claim != null && !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, entity.blockPosition());
} }
return false; return false;
} }
public static ActionResult attackSimple(PlayerEntity p, Entity entity, boolean message) { public static InteractionResult attackSimple(Player p, Entity entity, boolean message) {
if (p.world.isClient || p.isSpectator() || canInteract(entity)) if (p.level.isClientSide || p.isSpectator() || canInteract(entity))
return ActionResult.PASS; return InteractionResult.PASS;
if (entity instanceof Monster) if (entity instanceof Enemy)
return ActionResult.PASS; return InteractionResult.PASS;
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayer player = (ServerPlayer) p;
ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); ClaimStorage storage = ClaimStorage.get(player.getLevel());
BlockPos pos = entity.getBlockPos(); BlockPos pos = entity.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) { if (claim != null) {
if (!(entity instanceof LivingEntity)) if (!(entity instanceof LivingEntity))
return claim.canInteract(player, PermissionRegistry.BREAKNONLIVING, pos, message) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.BREAKNONLIVING, pos, message) ? InteractionResult.PASS : InteractionResult.FAIL;
if (entity instanceof PlayerEntity) if (entity instanceof Player)
return claim.canInteract(player, PermissionRegistry.HURTPLAYER, pos, message) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.HURTPLAYER, pos, message) ? InteractionResult.PASS : InteractionResult.FAIL;
return claim.canInteract(player, PermissionRegistry.HURTANIMAL, pos, message) ? ActionResult.PASS : ActionResult.FAIL; return claim.canInteract(player, PermissionRegistry.HURTANIMAL, pos, message) ? InteractionResult.PASS : InteractionResult.FAIL;
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
public static boolean xpAbsorb(PlayerEntity player) { public static boolean xpAbsorb(Player player) {
if (player instanceof ServerPlayerEntity) { if (player instanceof ServerPlayer) {
ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) player.level);
BlockPos pos = player.getBlockPos(); BlockPos pos = player.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) if (claim != null)
return !claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.XP, pos, false); return !claim.canInteract((ServerPlayer) player, PermissionRegistry.XP, pos, false);
} }
return false; return false;
} }
public static boolean canCollideWith(PlayerEntity player, Entity entity) { public static boolean canCollideWith(Player player, Entity entity) {
if (player instanceof ServerPlayerEntity) { if (player instanceof ServerPlayer) {
ServerPlayerEntity sPlayer = (ServerPlayerEntity) player; ServerPlayer sPlayer = (ServerPlayer) player;
if (entity instanceof ItemEntity) { if (entity instanceof ItemEntity) {
IOwnedItem ownedItem = (IOwnedItem) entity; IOwnedItem ownedItem = (IOwnedItem) entity;
if (ownedItem.getDeathPlayer() != null) { if (ownedItem.getDeathPlayer() != null) {
ServerPlayerEntity other = sPlayer.getServer().getPlayerManager().getPlayer(ownedItem.getDeathPlayer()); ServerPlayer other = sPlayer.getServer().getPlayerList().getPlayer(ownedItem.getDeathPlayer());
if (other == null) if (other == null)
return false; return false;
return ownedItem.getDeathPlayer().equals(player.getUuid()) || PlayerClaimData.get(other).deathItemsUnlocked(); return ownedItem.getDeathPlayer().equals(player.getUUID()) || PlayerClaimData.get(other).deathItemsUnlocked();
} }
if (sPlayer.getUuid().equals(ownedItem.getPlayerOrigin())) if (sPlayer.getUUID().equals(ownedItem.getPlayerOrigin()))
return true; return true;
ClaimStorage storage = ClaimStorage.get(sPlayer.getServerWorld()); ClaimStorage storage = ClaimStorage.get(sPlayer.getLevel());
BlockPos pos = sPlayer.getBlockPos(); BlockPos pos = sPlayer.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) if (claim != null)
return claim.canInteract(sPlayer, PermissionRegistry.PICKUP, pos, false); return claim.canInteract(sPlayer, PermissionRegistry.PICKUP, pos, false);
@ -246,36 +246,36 @@ public class EntityInteractEvents {
return true; return true;
} }
public static boolean canDropItem(PlayerEntity player, ItemStack stack) { public static boolean canDropItem(Player player, ItemStack stack) {
if (!player.isDead() && player instanceof ServerPlayerEntity) { if (!player.isDeadOrDying() && player instanceof ServerPlayer) {
ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) player.level);
BlockPos pos = player.getBlockPos(); BlockPos pos = player.blockPosition();
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
boolean allow = true; boolean allow = true;
if (claim != null) if (claim != null)
allow = claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.DROP, pos, false); allow = claim.canInteract((ServerPlayer) player, PermissionRegistry.DROP, pos, false);
if (!allow) { if (!allow) {
player.inventory.insertStack(stack); player.getInventory().add(stack);
DefaultedList<ItemStack> stacks = DefaultedList.of(); NonNullList<ItemStack> stacks = NonNullList.create();
for (int j = 0; j < player.currentScreenHandler.slots.size(); ++j) { for (int j = 0; j < player.containerMenu.slots.size(); ++j) {
ItemStack itemStack2 = player.currentScreenHandler.slots.get(j).getStack(); ItemStack itemStack2 = player.containerMenu.slots.get(j).getItem();
stacks.add(itemStack2.isEmpty() ? ItemStack.EMPTY : itemStack2); stacks.add(itemStack2.isEmpty() ? ItemStack.EMPTY : itemStack2);
} }
((ServerPlayerEntity) player).networkHandler.sendPacket(new InventoryS2CPacket(player.currentScreenHandler.syncId, stacks)); ((ServerPlayer) player).connection.send(new ClientboundContainerSetContentPacket(player.containerMenu.containerId, 0, stacks, player.inventoryMenu.getCarried()));
} }
return allow; return allow;
} }
return true; return true;
} }
public static boolean witherCanDestroy(WitherEntity wither) { public static boolean witherCanDestroy(WitherBoss wither) {
if (wither.world.isClient) if (wither.level.isClientSide)
return true; return true;
ClaimStorage storage = ClaimStorage.get((ServerWorld) wither.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) wither.level);
BlockPos.Mutable pos = new BlockPos.Mutable(); BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
for (int x = -1; x <= 1; x++) for (int x = -1; x <= 1; x++)
for (int z = -1; z <= 1; z++) { for (int z = -1; z <= 1; z++) {
pos.set(wither.getBlockPos(), x, 3, z); pos.setWithOffset(wither.blockPosition(), x, 3, z);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (!claim.canInteract(null, PermissionRegistry.WITHER, pos, false)) if (!claim.canInteract(null, PermissionRegistry.WITHER, pos, false))
return false; return false;
@ -283,38 +283,38 @@ public class EntityInteractEvents {
return true; return true;
} }
public static boolean canEndermanInteract(EndermanEntity enderman, BlockPos pos) { public static boolean canEndermanInteract(EnderMan enderman, BlockPos pos) {
if (enderman.world.isClient) if (enderman.level.isClientSide)
return true; return true;
ClaimStorage storage = ClaimStorage.get((ServerWorld) enderman.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) enderman.level);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
return claim.canInteract(null, PermissionRegistry.ENDERMAN, pos, false); return claim.canInteract(null, PermissionRegistry.ENDERMAN, pos, false);
} }
public static boolean canSnowGolemInteract(SnowGolemEntity snowgolem) { public static boolean canSnowGolemInteract(SnowGolem snowgolem) {
if (snowgolem.world.isClient) if (snowgolem.level.isClientSide)
return true; return true;
int x, y, z; int x, y, z;
for (int l = 0; l < 4; ++l) { for (int l = 0; l < 4; ++l) {
x = MathHelper.floor(snowgolem.getX() + (l % 2 * 2 - 1) * 0.25F); x = Mth.floor(snowgolem.getX() + (l % 2 * 2 - 1) * 0.25F);
y = MathHelper.floor(snowgolem.getY()); y = Mth.floor(snowgolem.getY());
z = MathHelper.floor(snowgolem.getZ() + (l / 2 % 2 * 2 - 1) * 0.25F); z = Mth.floor(snowgolem.getZ() + (l / 2 % 2 * 2 - 1) * 0.25F);
BlockPos pos = new BlockPos(x, y, z); BlockPos pos = new BlockPos(x, y, z);
IPermissionContainer claim = ClaimStorage.get((ServerWorld) snowgolem.world).getForPermissionCheck(pos); IPermissionContainer claim = ClaimStorage.get((ServerLevel) snowgolem.level).getForPermissionCheck(pos);
if (!claim.canInteract(null, PermissionRegistry.SNOWGOLEM, pos, false)) if (!claim.canInteract(null, PermissionRegistry.SNOWGOLEM, pos, false))
return false; return false;
} }
return true; return true;
} }
public static void updateDroppedItem(PlayerEntity player, ItemEntity entity) { public static void updateDroppedItem(Player player, ItemEntity entity) {
((IOwnedItem) entity).setOriginPlayer((player)); ((IOwnedItem) entity).setOriginPlayer((player));
} }
public static void updateClaim(ServerPlayerEntity player, Claim currentClaim, Consumer<Claim> cons) { public static void updateClaim(ServerPlayer player, Claim currentClaim, Consumer<Claim> cons) {
Vec3d pos = player.getPos(); Vec3 pos = player.position();
BlockPos rounded = TeleportUtils.roundedBlockPos(pos.add(0, player.getActiveEyeHeight(player.getPose(), player.getDimensions(player.getPose())), 0)); BlockPos rounded = TeleportUtils.roundedBlockPos(pos.add(0, player.getStandingEyeHeight(player.getPose(), player.getDimensions(player.getPose())), 0));
ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); ClaimStorage storage = ClaimStorage.get(player.getLevel());
if (currentClaim != null) { if (currentClaim != null) {
if (!currentClaim.intersects(player.getBoundingBox())) { if (!currentClaim.intersects(player.getBoundingBox())) {
Claim claim = storage.getClaimAt(rounded); Claim claim = storage.getClaimAt(rounded);
@ -325,22 +325,22 @@ public class EntityInteractEvents {
claim.displayEnterTitle(player); claim.displayEnterTitle(player);
} else { } else {
if (!player.isSpectator()) { if (!player.isSpectator()) {
BlockPos.Mutable bPos = rounded.mutableCopy(); BlockPos.MutableBlockPos bPos = rounded.mutable();
if (!currentClaim.canInteract(player, PermissionRegistry.CANSTAY, bPos, true)) { 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)); Vec3 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()); player.teleportToWithTicket(tp.x(), tp.y(), tp.z());
} }
if (player.abilities.flying && !player.isCreative() && !currentClaim.canInteract(player, PermissionRegistry.FLIGHT, rounded, true)) { if (player.getAbilities().flying && !player.isCreative() && !currentClaim.canInteract(player, PermissionRegistry.FLIGHT, rounded, true)) {
player.abilities.flying = false; player.getAbilities().flying = false;
player.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); player.connection.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities()));
} }
if (player.getHungerManager().getSaturationLevel() < 2 && currentClaim.canInteract(player, PermissionRegistry.NOHUNGER, bPos, false)) { if (player.getFoodData().getSaturationLevel() < 2 && currentClaim.canInteract(player, PermissionRegistry.NOHUNGER, bPos, false)) {
((IHungerAccessor) player.getHungerManager()).setSaturation(2); ((IHungerAccessor) player.getFoodData()).setSaturation(2);
} }
currentClaim.applyEffects(player); currentClaim.applyEffects(player);
} }
} }
} else if (player.age % 3 == 0) { } else if (player.tickCount % 3 == 0) {
Claim claim = storage.getClaimAt(rounded); Claim claim = storage.getClaimAt(rounded);
cons.accept(claim); cons.accept(claim);
if (claim != null) if (claim != null)
@ -348,19 +348,19 @@ public class EntityInteractEvents {
} }
} }
public static boolean canFrostwalkerFreeze(ServerWorld world, BlockPos pos, LivingEntity entity) { public static boolean canFrostwalkerFreeze(ServerLevel world, BlockPos pos, LivingEntity entity) {
if (entity instanceof ServerPlayerEntity) { if (entity instanceof ServerPlayer) {
IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(pos); IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(pos);
return claim.canInteract((ServerPlayerEntity) entity, PermissionRegistry.FROSTWALKER, pos, false); return claim.canInteract((ServerPlayer) entity, PermissionRegistry.FROSTWALKER, pos, false);
} }
return true; return true;
} }
public static boolean preventLightningConvert(Entity entity) { public static boolean preventLightningConvert(Entity entity) {
if (entity.world.isClient || entity instanceof Monster) if (entity.level.isClientSide || entity instanceof Enemy)
return false; return false;
ClaimStorage storage = ClaimStorage.get((ServerWorld) entity.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) entity.level);
IPermissionContainer claim = storage.getForPermissionCheck(entity.getBlockPos()); IPermissionContainer claim = storage.getForPermissionCheck(entity.blockPosition());
return !claim.canInteract(null, PermissionRegistry.LIGHTNING, entity.getBlockPos(), false); return !claim.canInteract(null, PermissionRegistry.LIGHTNING, entity.blockPosition(), false);
} }
} }

View File

@ -15,157 +15,157 @@ import io.github.flemmli97.flan.mixin.IItemAccessor;
import io.github.flemmli97.flan.player.EnumDisplayType; import io.github.flemmli97.flan.player.EnumDisplayType;
import io.github.flemmli97.flan.player.EnumEditMode; import io.github.flemmli97.flan.player.EnumEditMode;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.block.BlockState; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.item.BlockItem; import net.minecraft.network.chat.Component;
import net.minecraft.item.Item; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerLevel;
import net.minecraft.item.ItemUsageContext; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.world.InteractionHand;
import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; import net.minecraft.world.InteractionResult;
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; import net.minecraft.world.InteractionResultHolder;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.item.BlockItem;
import net.minecraft.text.Text; import net.minecraft.world.item.Item;
import net.minecraft.util.ActionResult; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import net.minecraft.util.Hand; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.util.TypedActionResult; import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.level.ClipContext;
import net.minecraft.util.hit.HitResult; import net.minecraft.world.level.Level;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.RaycastContext; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.World; import net.minecraft.world.phys.HitResult;
import java.util.Set; import java.util.Set;
public class ItemInteractEvents { public class ItemInteractEvents {
public static TypedActionResult<ItemStack> useItem(PlayerEntity p, World world, Hand hand) { public static InteractionResultHolder<ItemStack> useItem(Player p, Level world, InteractionHand hand) {
if (world.isClient || p.isSpectator()) if (world.isClientSide || p.isSpectator())
return TypedActionResult.pass(p.getStackInHand(hand)); return InteractionResultHolder.pass(p.getItemInHand(hand));
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayer player = (ServerPlayer) p;
ItemStack stack = player.getStackInHand(hand); ItemStack stack = player.getItemInHand(hand);
if (stack.getItem() == ConfigHandler.config.claimingItem) { if (stack.getItem() == ConfigHandler.config.claimingItem) {
HitResult ray = player.raycast(64, 0, false); HitResult ray = player.pick(64, 0, false);
if (ray != null && ray.getType() == HitResult.Type.BLOCK) { if (ray != null && ray.getType() == HitResult.Type.BLOCK) {
claimLandHandling(player, ((BlockHitResult) ray).getBlockPos()); claimLandHandling(player, ((BlockHitResult) ray).getBlockPos());
return TypedActionResult.success(stack); return InteractionResultHolder.success(stack);
} }
return TypedActionResult.pass(stack); return InteractionResultHolder.pass(stack);
} }
if (stack.getItem() == ConfigHandler.config.inspectionItem) { if (stack.getItem() == ConfigHandler.config.inspectionItem) {
HitResult ray = player.raycast(32, 0, false); HitResult ray = player.pick(32, 0, false);
if (ray != null && ray.getType() == HitResult.Type.BLOCK) { if (ray != null && ray.getType() == HitResult.Type.BLOCK) {
inspect(player, ((BlockHitResult) ray).getBlockPos()); inspect(player, ((BlockHitResult) ray).getBlockPos());
return TypedActionResult.success(stack); return InteractionResultHolder.success(stack);
} }
return TypedActionResult.pass(stack); return InteractionResultHolder.pass(stack);
} }
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
BlockPos pos = player.getBlockPos(); BlockPos pos = player.blockPosition();
BlockHitResult hitResult = IItemAccessor.getRaycast(world, player, RaycastContext.FluidHandling.SOURCE_ONLY); BlockHitResult hitResult = IItemAccessor.getRaycast(world, player, ClipContext.Fluid.SOURCE_ONLY);
if (hitResult.getType() == HitResult.Type.BLOCK) { if (hitResult.getType() == HitResult.Type.BLOCK) {
pos = new ItemPlacementContext(player, hand, stack, hitResult).getBlockPos(); pos = new BlockPlaceContext(player, hand, stack, hitResult).getClickedPos();
} }
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim == null) if (claim == null)
return TypedActionResult.pass(stack); return InteractionResultHolder.pass(stack);
ClaimPermission perm = ObjectToPermissionMap.getFromItem(stack.getItem()); ClaimPermission perm = ObjectToPermissionMap.getFromItem(stack.getItem());
if (perm != null) { if (perm != null) {
boolean success = claim.canInteract(player, perm, pos, true); boolean success = claim.canInteract(player, perm, pos, true);
if (success) if (success)
return TypedActionResult.pass(stack); return InteractionResultHolder.pass(stack);
if (perm == PermissionRegistry.PLACE) { if (perm == PermissionRegistry.PLACE) {
BlockPos update = pos; BlockPos update = pos;
if (stack.getItem() == Items.LILY_PAD) { if (stack.getItem() == Items.LILY_PAD) {
BlockHitResult upResult = hitResult.withBlockPos(hitResult.getBlockPos().up()); BlockHitResult upResult = hitResult.withPosition(hitResult.getBlockPos().above());
update = new ItemPlacementContext(new ItemUsageContext(player, hand, upResult)).getBlockPos(); update = new BlockPlaceContext(new UseOnContext(player, hand, upResult)).getClickedPos();
} }
player.networkHandler.sendPacket(new BlockUpdateS2CPacket(update, world.getBlockState(update))); player.connection.send(new ClientboundBlockUpdatePacket(update, world.getBlockState(update)));
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
updateHeldItem(player); updateHeldItem(player);
} }
return TypedActionResult.fail(stack); return InteractionResultHolder.fail(stack);
} }
return TypedActionResult.pass(stack); return InteractionResultHolder.pass(stack);
} }
private static final Set<Item> blackListedItems = Sets.newHashSet(Items.COMPASS, Items.FILLED_MAP, Items.FIREWORK_ROCKET); private static final Set<Item> blackListedItems = Sets.newHashSet(Items.COMPASS, Items.FILLED_MAP, Items.FIREWORK_ROCKET);
public static ActionResult onItemUseBlock(ItemUsageContext context) { public static InteractionResult onItemUseBlock(UseOnContext context) {
//Check for Fakeplayer. Since there is no api for that directly check the class //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()) if (!(context.getPlayer() instanceof ServerPlayer) || !context.getPlayer().getClass().equals(ServerPlayer.class) || context.getItemInHand().isEmpty())
return ActionResult.PASS; return InteractionResult.PASS;
ClaimStorage storage = ClaimStorage.get((ServerWorld) context.getWorld()); ClaimStorage storage = ClaimStorage.get((ServerLevel) context.getLevel());
BlockPos placePos = new ItemPlacementContext(context).getBlockPos(); BlockPos placePos = new BlockPlaceContext(context).getClickedPos();
IPermissionContainer claim = storage.getForPermissionCheck(placePos.add(0, 255, 0)); IPermissionContainer claim = storage.getForPermissionCheck(placePos.offset(0, 255, 0));
if (claim == null) if (claim == null)
return ActionResult.PASS; return InteractionResult.PASS;
if (blackListedItems.contains(context.getStack().getItem())) if (blackListedItems.contains(context.getItemInHand().getItem()))
return ActionResult.PASS; return InteractionResult.PASS;
boolean actualInClaim = !(claim instanceof Claim) || placePos.getY() >= ((Claim) claim).getDimensions()[4]; boolean actualInClaim = !(claim instanceof Claim) || placePos.getY() >= ((Claim) claim).getDimensions()[4];
ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); ServerPlayer player = (ServerPlayer) context.getPlayer();
ClaimPermission perm = ObjectToPermissionMap.getFromItem(context.getStack().getItem()); ClaimPermission perm = ObjectToPermissionMap.getFromItem(context.getItemInHand().getItem());
if (perm != null) { if (perm != null) {
if (claim.canInteract(player, perm, placePos, false)) if (claim.canInteract(player, perm, placePos, false))
return ActionResult.PASS; return InteractionResult.PASS;
else if (actualInClaim) { else if (actualInClaim) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
} }
if (claim.canInteract(player, PermissionRegistry.PLACE, placePos, false)) { if (claim.canInteract(player, PermissionRegistry.PLACE, placePos, false)) {
if (!actualInClaim && context.getStack().getItem() instanceof BlockItem) { if (!actualInClaim && context.getItemInHand().getItem() instanceof BlockItem) {
((Claim) claim).extendDownwards(placePos); ((Claim) claim).extendDownwards(placePos);
} }
return ActionResult.PASS; return InteractionResult.PASS;
} else if (actualInClaim) { } else if (actualInClaim) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), true);
BlockState other = context.getWorld().getBlockState(placePos.up()); BlockState other = context.getLevel().getBlockState(placePos.above());
player.networkHandler.sendPacket(new BlockUpdateS2CPacket(placePos.up(), other)); player.connection.send(new ClientboundBlockUpdatePacket(placePos.above(), other));
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
updateHeldItem(player); updateHeldItem(player);
return ActionResult.FAIL; return InteractionResult.FAIL;
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
/** /**
* -2 == Main inventory update * -2 == Main inventory update
*/ */
private static void updateHeldItem(ServerPlayerEntity player) { private static void updateHeldItem(ServerPlayer player) {
player.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(-2, player.inventory.selectedSlot, player.inventory.getMainHandStack())); player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, player.getInventory().selected, player.getInventory().getSelected()));
player.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(-2, 40, player.inventory.getStack(40))); player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, 40, player.getInventory().getItem(40)));
} }
private static boolean cantClaimInWorld(ServerWorld world) { private static boolean cantClaimInWorld(ServerLevel world) {
for (String s : ConfigHandler.config.blacklistedWorlds) { for (String s : ConfigHandler.config.blacklistedWorlds) {
if (s.equals(world.getRegistryKey().getValue().toString())) { if (s.equals(world.dimension().location().toString())) {
return true; return true;
} }
} }
return false; return false;
} }
public static void claimLandHandling(ServerPlayerEntity player, BlockPos target) { public static void claimLandHandling(ServerPlayer player, BlockPos target) {
if (!PermissionNodeHandler.perm(player, PermissionNodeHandler.claimCreate, false)) { if (!PermissionNodeHandler.perm(player, PermissionNodeHandler.claimCreate, false)) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermission, Formatting.DARK_RED), true); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermission, ChatFormatting.DARK_RED), true);
return; return;
} }
if (ConfigHandler.config.worldWhitelist) { if (ConfigHandler.config.worldWhitelist) {
if (!cantClaimInWorld(player.getServerWorld())) { if (!cantClaimInWorld(player.getLevel())) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, Formatting.DARK_RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, ChatFormatting.DARK_RED), false);
return; return;
} }
} else if (cantClaimInWorld(player.getServerWorld())) { } else if (cantClaimInWorld(player.getLevel())) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, Formatting.DARK_RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, ChatFormatting.DARK_RED), false);
return; return;
} }
ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); ClaimStorage storage = ClaimStorage.get(player.getLevel());
Claim claim = storage.getClaimAt(target.add(0, 255, 0)); Claim claim = storage.getClaimAt(target.offset(0, 255, 0));
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
if (data.claimCooldown()) if (data.claimCooldown())
return; return;
@ -176,20 +176,20 @@ public class ItemInteractEvents {
Claim subClaim = claim.getSubClaim(target); Claim subClaim = claim.getSubClaim(target);
if (subClaim != null && data.currentEdit() == null) { if (subClaim != null && data.currentEdit() == null) {
if (subClaim.isCorner(target)) { if (subClaim.isCorner(target)) {
data.setEditClaim(subClaim, player.getBlockPos().getY()); data.setEditClaim(subClaim, player.blockPosition().getY());
data.setEditingCorner(target); data.setEditingCorner(target);
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeClaim, Formatting.GOLD), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeClaim, ChatFormatting.GOLD), false);
} else { } else {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, ChatFormatting.RED), false);
} }
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
} else { } else {
if (data.currentEdit() != null) { if (data.currentEdit() != null) {
if (!data.editingCorner().equals(target)) { if (!data.editingCorner().equals(target)) {
Set<Claim> fl = claim.resizeSubclaim(data.currentEdit(), data.editingCorner(), target); Set<Claim> fl = claim.resizeSubclaim(data.currentEdit(), data.editingCorner(), target);
if (!fl.isEmpty()) { if (!fl.isEmpty()) {
fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.MAIN, player.getBlockPos().getY())); fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.MAIN, player.blockPosition().getY()));
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, ChatFormatting.RED), false);
} }
data.setEditClaim(null, 0); data.setEditClaim(null, 0);
data.setEditingCorner(null); data.setEditingCorner(null);
@ -197,12 +197,12 @@ public class ItemInteractEvents {
} else if (data.editingCorner() != null) { } else if (data.editingCorner() != null) {
if (!data.editingCorner().equals(target)) { if (!data.editingCorner().equals(target)) {
Set<Claim> fl = claim.tryCreateSubClaim(data.editingCorner(), target); Set<Claim> fl = claim.tryCreateSubClaim(data.editingCorner(), target);
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
if (!fl.isEmpty()) { if (!fl.isEmpty()) {
fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.CONFLICT, player.getBlockPos().getY())); fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.conflictOther, ChatFormatting.RED), false);
} else { } else {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.subClaimCreateSuccess, Formatting.GOLD), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.subClaimCreateSuccess, ChatFormatting.GOLD), false);
} }
data.setEditingCorner(null); data.setEditingCorner(null);
} }
@ -211,24 +211,24 @@ public class ItemInteractEvents {
} }
} else { } else {
if (claim.isCorner(target)) { if (claim.isCorner(target)) {
data.setEditClaim(claim, player.getBlockPos().getY()); data.setEditClaim(claim, player.blockPosition().getY());
data.setEditingCorner(target); data.setEditingCorner(target);
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeClaim, Formatting.GOLD), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.resizeClaim, ChatFormatting.GOLD), false);
} else if (data.currentEdit() != null) { } else if (data.currentEdit() != null) {
storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player); storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player);
data.setEditClaim(null, 0); data.setEditClaim(null, 0);
data.setEditingCorner(null); data.setEditingCorner(null);
} else { } else {
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, ChatFormatting.RED), false);
} }
} }
} else { } else {
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.cantClaimHere, ChatFormatting.RED), false);
} }
} else if (data.getEditMode() == EnumEditMode.SUBCLAIM) { } else if (data.getEditMode() == EnumEditMode.SUBCLAIM) {
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.wrongMode, data.getEditMode()), Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.wrongMode, data.getEditMode()), ChatFormatting.RED), false);
} else { } else {
if (data.currentEdit() != null) { if (data.currentEdit() != null) {
storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player); storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player);
@ -242,25 +242,20 @@ public class ItemInteractEvents {
} }
} }
public static void inspect(ServerPlayerEntity player, BlockPos target) { public static void inspect(ServerPlayer player, BlockPos target) {
Claim claim = ClaimStorage.get(player.getServerWorld()).getClaimAt(target); Claim claim = ClaimStorage.get(player.getLevel()).getClaimAt(target);
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
if (data.claimCooldown()) if (data.claimCooldown())
return; return;
data.setClaimActionCooldown(); data.setClaimActionCooldown();
if (claim != null) { if (claim != null) {
String owner = claim.isAdminClaim() ? "<Admin>" : "<UNKOWN>"; String owner = claim.isAdminClaim() ? "<Admin>" : player.getServer().getProfileCache().get(claim.getOwner()).map(GameProfile::getName).orElse("<UNKOWN>");
if (!claim.isAdminClaim()) { Component text = PermHelper.simpleColoredText(String.format(ConfigHandler.lang.inspectBlockOwner,
GameProfile prof = player.getServer().getUserCache().getByUuid(claim.getOwner());
if (prof != null && prof.getName() != null)
owner = prof.getName();
}
Text text = PermHelper.simpleColoredText(String.format(ConfigHandler.lang.inspectBlockOwner,
owner, owner,
target.getX(), target.getY(), target.getZ()), Formatting.GREEN); target.getX(), target.getY(), target.getZ()), ChatFormatting.GREEN);
player.sendMessage(text, false); player.displayClientMessage(text, false);
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
} else } else
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.inspectNoClaim, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.inspectNoClaim, ChatFormatting.RED), false);
} }
} }

View File

@ -2,23 +2,23 @@ package io.github.flemmli97.flan.event;
import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.LogoutTracker;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.entity.player.Player;
public class PlayerEvents { public class PlayerEvents {
public static void saveClaimData(PlayerEntity player) { public static void saveClaimData(Player player) {
if (player instanceof ServerPlayerEntity) if (player instanceof ServerPlayer)
PlayerClaimData.get((ServerPlayerEntity) player).save(player.getServer()); PlayerClaimData.get((ServerPlayer) player).save(player.getServer());
} }
public static void readClaimData(PlayerEntity player) { public static void readClaimData(Player player) {
if (player instanceof ServerPlayerEntity) if (player instanceof ServerPlayer)
PlayerClaimData.get((ServerPlayerEntity) player).read(player.getServer()); PlayerClaimData.get((ServerPlayer) player).read(player.getServer());
} }
public static void onLogout(PlayerEntity player) { public static void onLogout(Player player) {
if (player.getServer() != null) if (player.getServer() != null)
LogoutTracker.getInstance(player.getServer()).track(player.getUuid()); LogoutTracker.getInstance(player.getServer()).track(player.getUUID());
} }
} }

View File

@ -4,24 +4,24 @@ import io.github.flemmli97.flan.api.data.IPermissionContainer;
import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.LogoutTracker;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.entity.LightningEntity; import net.minecraft.core.Direction;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.LightningBolt;
import net.minecraft.util.math.Direction; import net.minecraft.world.entity.Mob;
import net.minecraft.world.BlockView; import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.World; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.explosion.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
public class WorldEvents { public class WorldEvents {
public static void modifyExplosion(Explosion explosion, ServerWorld world) { public static void modifyExplosion(Explosion explosion, ServerLevel world) {
ClaimStorage storage = ClaimStorage.get(world); ClaimStorage storage = ClaimStorage.get(world);
explosion.getAffectedBlocks().removeIf(pos -> { explosion.getToBlow().removeIf(pos -> {
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) if (claim != null)
return !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, pos); return !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, pos);
@ -29,16 +29,16 @@ public class WorldEvents {
}); });
} }
public static boolean pistonCanPush(BlockState state, World world, BlockPos blockPos, Direction direction, Direction pistonDir) { public static boolean pistonCanPush(BlockState state, Level world, BlockPos blockPos, Direction direction, Direction pistonDir) {
if (world.isClient || state.isAir()) if (world.isClientSide || state.isAir())
return true; return true;
BlockPos dirPos = blockPos.offset(direction); BlockPos dirPos = blockPos.relative(direction);
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
IPermissionContainer from = storage.getForPermissionCheck(blockPos); IPermissionContainer from = storage.getForPermissionCheck(blockPos);
IPermissionContainer to = storage.getForPermissionCheck(dirPos); IPermissionContainer to = storage.getForPermissionCheck(dirPos);
boolean flag = true; boolean flag = true;
if (from.equals(to)) { if (from.equals(to)) {
BlockPos oppPoos = blockPos.offset(direction.getOpposite()); BlockPos oppPoos = blockPos.relative(direction.getOpposite());
IPermissionContainer opp = storage.getForPermissionCheck(oppPoos); IPermissionContainer opp = storage.getForPermissionCheck(oppPoos);
if (!from.equals(opp)) if (!from.equals(opp))
flag = from.canInteract(null, PermissionRegistry.PISTONBORDER, oppPoos); flag = from.canInteract(null, PermissionRegistry.PISTONBORDER, oppPoos);
@ -47,44 +47,44 @@ public class WorldEvents {
if (!flag) { if (!flag) {
//Idk enough about piston behaviour to update more blocks when slime is involved. //Idk enough about piston behaviour to update more blocks when slime is involved.
//Ghost blocks appear when trying to push slime contraptions across border //Ghost blocks appear when trying to push slime contraptions across border
world.updateListeners(blockPos, state, state, 20); world.sendBlockUpdated(blockPos, state, state, 20);
BlockState toState = world.getBlockState(dirPos); BlockState toState = world.getBlockState(dirPos);
world.updateListeners(dirPos, toState, toState, 20); world.sendBlockUpdated(dirPos, toState, toState, 20);
} }
return flag; return flag;
} }
public static boolean canFlow(BlockState fluidBlockState, BlockView world, BlockPos blockPos, Direction direction) { public static boolean canFlow(BlockState fluidBlockState, BlockGetter world, BlockPos blockPos, Direction direction) {
if (!(world instanceof ServerWorld) || direction == Direction.UP || direction == Direction.DOWN) if (!(world instanceof ServerLevel) || direction == Direction.UP || direction == Direction.DOWN)
return true; return true;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
IPermissionContainer from = storage.getForPermissionCheck(blockPos); IPermissionContainer from = storage.getForPermissionCheck(blockPos);
IPermissionContainer to = storage.getForPermissionCheck(blockPos.offset(direction)); IPermissionContainer to = storage.getForPermissionCheck(blockPos.relative(direction));
return from.equals(to) || to.canInteract(null, PermissionRegistry.WATERBORDER, blockPos); return from.equals(to) || to.canInteract(null, PermissionRegistry.WATERBORDER, blockPos);
} }
public static boolean canStartRaid(ServerPlayerEntity player) { public static boolean canStartRaid(ServerPlayer player) {
IPermissionContainer claim = ClaimStorage.get(player.getServerWorld()).getForPermissionCheck(player.getBlockPos()); IPermissionContainer claim = ClaimStorage.get(player.getLevel()).getForPermissionCheck(player.blockPosition());
return claim.canInteract(player, PermissionRegistry.RAID, player.getBlockPos()); return claim.canInteract(player, PermissionRegistry.RAID, player.blockPosition());
} }
public static boolean canFireSpread(ServerWorld world, BlockPos pos) { public static boolean canFireSpread(ServerLevel world, BlockPos pos) {
IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(pos); IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(pos);
return claim.canInteract(null, PermissionRegistry.FIRESPREAD, pos); return claim.canInteract(null, PermissionRegistry.FIRESPREAD, pos);
} }
public static boolean preventMobSpawn(ServerWorld world, MobEntity entity) { public static boolean preventMobSpawn(ServerLevel world, Mob entity) {
IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(entity.getBlockPos()); IPermissionContainer claim = ClaimStorage.get(world).getForPermissionCheck(entity.blockPosition());
if (entity.getType().getSpawnGroup() == SpawnGroup.MONSTER) if (entity.getType().getCategory() == MobCategory.MONSTER)
return claim.canInteract(null, PermissionRegistry.MOBSPAWN, entity.getBlockPos()); return claim.canInteract(null, PermissionRegistry.MOBSPAWN, entity.blockPosition());
return claim.canInteract(null, PermissionRegistry.ANIMALSPAWN, entity.getBlockPos()); return claim.canInteract(null, PermissionRegistry.ANIMALSPAWN, entity.blockPosition());
} }
public static boolean lightningFire(LightningEntity lightning) { public static boolean lightningFire(LightningBolt lightning) {
if (!(lightning.world instanceof ServerWorld)) if (!(lightning.level instanceof ServerLevel))
return true; return true;
BlockPos.Mutable mutable = lightning.getBlockPos().mutableCopy(); BlockPos.MutableBlockPos mutable = lightning.blockPosition().mutable();
ServerWorld world = (ServerWorld) lightning.world; ServerLevel world = (ServerLevel) lightning.level;
for (int x = -1; x <= 1; x++) for (int x = -1; x <= 1; x++)
for (int z = -1; z <= 1; z++) { for (int z = -1; z <= 1; z++) {
mutable.set(mutable.getX() + x, mutable.getY(), mutable.getZ() + z); mutable.set(mutable.getX() + x, mutable.getY(), mutable.getZ() + z);

View File

@ -8,84 +8,84 @@ import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.sounds.SoundEvents;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler<Claim> { public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler<Claim> {
private final Claim claim; private final Claim claim;
private ClaimMenuScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim) { private ClaimMenuScreenHandler(int syncId, Inventory playerInventory, Claim claim) {
super(syncId, playerInventory, 1, claim); super(syncId, playerInventory, 1, claim);
this.claim = claim; this.claim = claim;
} }
public static void openClaimMenu(ServerPlayerEntity player, Claim claim) { public static void openClaimMenu(ServerPlayer player, Claim claim) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new ClaimMenuScreenHandler(syncId, inv, claim); return new ClaimMenuScreenHandler(syncId, inv, claim);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(claim.parentClaim() != null ? ConfigHandler.lang.screenMenuSub : ConfigHandler.lang.screenMenu); return PermHelper.simpleColoredText(claim.parentClaim() != null ? ConfigHandler.lang.screenMenuSub : ConfigHandler.lang.screenMenu);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Claim claim) { protected void fillInventoryWith(Player player, SeparateInv inv, Claim claim) {
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
switch (i) { switch (i) {
case 0: case 0:
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenClose, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenClose, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
break; break;
case 2: case 2:
ItemStack perm = new ItemStack(Items.BEACON); ItemStack perm = new ItemStack(Items.BEACON);
perm.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGlobal, Formatting.GOLD)); perm.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGlobal, ChatFormatting.GOLD));
if (player instanceof ServerPlayerEntity && !this.hasEditPerm(claim, (ServerPlayerEntity) player)) if (player instanceof ServerPlayer && !this.hasEditPerm(claim, (ServerPlayer) player))
ServerScreenHelper.addLore(perm, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); ServerScreenHelper.addLore(perm, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, ChatFormatting.DARK_RED));
inv.updateStack(i, perm); inv.updateStack(i, perm);
break; break;
case 3: case 3:
ItemStack group = new ItemStack(Items.WRITABLE_BOOK); ItemStack group = new ItemStack(Items.WRITABLE_BOOK);
group.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGroup, Formatting.GOLD)); group.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGroup, ChatFormatting.GOLD));
if (player instanceof ServerPlayerEntity && !this.hasEditPerm(claim, (ServerPlayerEntity) player)) if (player instanceof ServerPlayer && !this.hasEditPerm(claim, (ServerPlayer) player))
ServerScreenHelper.addLore(group, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); ServerScreenHelper.addLore(group, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, ChatFormatting.DARK_RED));
inv.updateStack(i, group); inv.updateStack(i, group);
break; break;
case 4: case 4:
ItemStack potions = new ItemStack(Items.POTION); ItemStack potions = new ItemStack(Items.POTION);
potions.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuPotion, Formatting.GOLD)); potions.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuPotion, ChatFormatting.GOLD));
if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITPOTIONS)) if (player instanceof ServerPlayer && !this.hasPerm(claim, (ServerPlayer) player, PermissionRegistry.EDITPOTIONS))
ServerScreenHelper.addLore(potions, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); ServerScreenHelper.addLore(potions, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, ChatFormatting.DARK_RED));
inv.updateStack(i, potions); inv.updateStack(i, potions);
break; break;
case 5: case 5:
ItemStack sign = new ItemStack(Items.OAK_SIGN); ItemStack sign = new ItemStack(Items.OAK_SIGN);
sign.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuClaimText, Formatting.GOLD)); sign.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuClaimText, ChatFormatting.GOLD));
if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITCLAIM)) if (player instanceof ServerPlayer && !this.hasPerm(claim, (ServerPlayer) player, PermissionRegistry.EDITCLAIM))
ServerScreenHelper.addLore(sign, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); ServerScreenHelper.addLore(sign, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, ChatFormatting.DARK_RED));
inv.updateStack(i, sign); inv.updateStack(i, sign);
break; break;
case 8: case 8:
ItemStack delete = new ItemStack(Items.BARRIER); ItemStack delete = new ItemStack(Items.BARRIER);
delete.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuDelete, Formatting.RED)); delete.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuDelete, ChatFormatting.RED));
if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITCLAIM)) if (player instanceof ServerPlayer && !this.hasPerm(claim, (ServerPlayer) player, PermissionRegistry.EDITCLAIM))
ServerScreenHelper.addLore(delete, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); ServerScreenHelper.addLore(delete, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, ChatFormatting.DARK_RED));
inv.updateStack(i, delete); inv.updateStack(i, delete);
break; break;
default: default:
@ -100,75 +100,75 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler<Claim> {
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
switch (index) { switch (index) {
case 0: case 0:
player.closeHandledScreen(); player.closeContainer();
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
break; break;
case 2: case 2:
if (this.hasEditPerm(this.claim, player)) { if (this.hasEditPerm(this.claim, player)) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, null)); player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, null));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} else } else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
break; break;
case 3: case 3:
if (this.hasEditPerm(this.claim, player)) { if (this.hasEditPerm(this.claim, player)) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} else } else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
break; break;
case 4: case 4:
if (this.hasPerm(this.claim, player, PermissionRegistry.EDITPOTIONS)) { if (this.hasPerm(this.claim, player, PermissionRegistry.EDITPOTIONS)) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim)); player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} else } else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
break; break;
case 5: case 5:
if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) { if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} else } else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
break; break;
case 8: case 8:
if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) { if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ConfirmScreenHandler.openConfirmScreen(player, (bool) -> { player.getServer().execute(() -> ConfirmScreenHandler.openConfirmScreen(player, (bool) -> {
if (bool) { if (bool) {
ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); ClaimStorage storage = ClaimStorage.get(player.getLevel());
storage.deleteClaim(this.claim, true, PlayerClaimData.get(player).getEditMode(), player.getServerWorld()); storage.deleteClaim(this.claim, true, PlayerClaimData.get(player).getEditMode(), player.getLevel());
player.closeHandledScreen(); player.closeContainer();
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.deleteClaim, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.deleteClaim, ChatFormatting.RED), false);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_PLACE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_PLACE, 1, 1f);
} else { } else {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
} }
})); }));
} else } else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
break; break;
} }
return true; return true;
} }
private boolean hasEditPerm(Claim claim, ServerPlayerEntity player) { private boolean hasEditPerm(Claim claim, ServerPlayer player) {
return ((claim.parentClaim() != null && claim.parentClaim().canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) return ((claim.parentClaim() != null && claim.parentClaim().canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition()))
|| claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())); || claim.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition()));
} }
private boolean hasPerm(Claim claim, ServerPlayerEntity player, ClaimPermission perm) { private boolean hasPerm(Claim claim, ServerPlayer player, ClaimPermission perm) {
if (claim.parentClaim() != null) if (claim.parentClaim() != null)
return claim.parentClaim().canInteract(player, perm, player.getBlockPos()); return claim.parentClaim().canInteract(player, perm, player.blockPosition());
return claim.canInteract(player, perm, player.getBlockPos()); return claim.canInteract(player, perm, player.blockPosition());
} }
} }

View File

@ -6,20 +6,20 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.ClickEvent;
import net.minecraft.item.ItemStack; import net.minecraft.network.chat.Component;
import net.minecraft.item.Items; import net.minecraft.network.chat.Style;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.network.chat.TextComponent;
import net.minecraft.screen.ScreenHandler; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.screen.slot.Slot; import net.minecraft.sounds.SoundEvents;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.MenuProvider;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.text.ClickEvent; import net.minecraft.world.entity.player.Player;
import net.minecraft.text.LiteralText; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.text.Style; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -27,59 +27,59 @@ public class ClaimTextHandler extends ServerOnlyScreenHandler<Claim> {
private final Claim claim; private final Claim claim;
private ClaimTextHandler(int syncId, PlayerInventory playerInventory, Claim claim) { private ClaimTextHandler(int syncId, Inventory playerInventory, Claim claim) {
super(syncId, playerInventory, 1, claim); super(syncId, playerInventory, 1, claim);
this.claim = claim; this.claim = claim;
} }
public static void openClaimMenu(ServerPlayerEntity player, Claim claim) { public static void openClaimMenu(ServerPlayer player, Claim claim) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new ClaimTextHandler(syncId, inv, claim); return new ClaimTextHandler(syncId, inv, claim);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(claim.parentClaim() != null ? ConfigHandler.lang.screenTitleEditorSub : ConfigHandler.lang.screenTitleEditor); return PermHelper.simpleColoredText(claim.parentClaim() != null ? ConfigHandler.lang.screenTitleEditorSub : ConfigHandler.lang.screenTitleEditor);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Claim claim) { protected void fillInventoryWith(Player player, SeparateInv inv, Claim claim) {
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
switch (i) { switch (i) {
case 0: case 0:
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
break; break;
case 2: case 2:
ItemStack stack = new ItemStack(Items.OAK_SIGN); ItemStack stack = new ItemStack(Items.OAK_SIGN);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterText, Formatting.GOLD)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterText, ChatFormatting.GOLD));
if (claim.enterTitle != null) if (claim.enterTitle != null)
ServerScreenHelper.addLore(stack, claim.enterTitle); ServerScreenHelper.addLore(stack, claim.enterTitle);
inv.updateStack(i, stack); inv.updateStack(i, stack);
break; break;
case 3: case 3:
ItemStack stack2 = new ItemStack(Items.OAK_SIGN); ItemStack stack2 = new ItemStack(Items.OAK_SIGN);
stack2.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterSubText, Formatting.GOLD)); stack2.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterSubText, ChatFormatting.GOLD));
if (claim.enterSubtitle != null) if (claim.enterSubtitle != null)
ServerScreenHelper.addLore(stack2, claim.enterSubtitle); ServerScreenHelper.addLore(stack2, claim.enterSubtitle);
inv.updateStack(i, stack2); inv.updateStack(i, stack2);
break; break;
case 4: case 4:
ItemStack stack3 = new ItemStack(Items.OAK_SIGN); ItemStack stack3 = new ItemStack(Items.OAK_SIGN);
stack3.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveText, Formatting.GOLD)); stack3.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveText, ChatFormatting.GOLD));
if (claim.leaveTitle != null) if (claim.leaveTitle != null)
ServerScreenHelper.addLore(stack3, claim.leaveTitle); ServerScreenHelper.addLore(stack3, claim.leaveTitle);
inv.updateStack(i, stack3); inv.updateStack(i, stack3);
break; break;
case 5: case 5:
ItemStack stack4 = new ItemStack(Items.OAK_SIGN); ItemStack stack4 = new ItemStack(Items.OAK_SIGN);
stack4.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveSubText, Formatting.GOLD)); stack4.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveSubText, ChatFormatting.GOLD));
if (claim.leaveSubtitle != null) if (claim.leaveSubtitle != null)
ServerScreenHelper.addLore(stack4, claim.leaveSubtitle); ServerScreenHelper.addLore(stack4, claim.leaveSubtitle);
inv.updateStack(i, stack4); inv.updateStack(i, stack4);
@ -96,13 +96,13 @@ public class ClaimTextHandler extends ServerOnlyScreenHandler<Claim> {
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} else { } else {
Consumer<Text> cons = null; Consumer<Component> cons = null;
switch (index) { switch (index) {
case 2: case 2:
cons = text -> this.claim.setEnterTitle(text, this.claim.enterSubtitle); cons = text -> this.claim.setEnterTitle(text, this.claim.enterSubtitle);
@ -118,25 +118,25 @@ public class ClaimTextHandler extends ServerOnlyScreenHandler<Claim> {
break; break;
} }
if (cons != null) { if (cons != null) {
player.closeHandledScreen(); player.closeContainer();
Consumer<Text> finalCons = cons; Consumer<Component> finalCons = cons;
if (clickType == 0) { if (clickType == 0) {
player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> {
player.closeHandledScreen(); player.closeContainer();
finalCons.accept(new LiteralText(s).fillStyle(Style.EMPTY.withItalic(false).withFormatting(Formatting.WHITE))); finalCons.accept(new TextComponent(s).withStyle(Style.EMPTY.withItalic(false).applyFormat(ChatFormatting.WHITE)));
player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_USE, 1, 1f);
}, () -> { }, () -> {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
})); }));
} else { } else {
LiteralText text = new LiteralText(ConfigHandler.lang.chatClaimTextEdit); TextComponent text = new TextComponent(ConfigHandler.lang.chatClaimTextEdit);
String command = "/flan claimMessage" + (index == 2 || index == 3 ? " enter" : " leave") String command = "/flan claimMessage" + (index == 2 || index == 3 ? " enter" : " leave")
+ (index == 2 || index == 4 ? " title" : " subtitle") + " text "; + (index == 2 || index == 4 ? " title" : " subtitle") + " text ";
text.fillStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command))); text.withStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command)));
player.sendMessage(text, false); player.displayClientMessage(text, false);
} }
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} }
@ -144,14 +144,14 @@ public class ClaimTextHandler extends ServerOnlyScreenHandler<Claim> {
return true; return true;
} }
private boolean hasEditPerm(Claim claim, ServerPlayerEntity player) { private boolean hasEditPerm(Claim claim, ServerPlayer player) {
return ((claim.parentClaim() != null && claim.parentClaim().canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) return ((claim.parentClaim() != null && claim.parentClaim().canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition()))
|| claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())); || claim.canInteract(player, PermissionRegistry.EDITPERMS, player.blockPosition()));
} }
private boolean hasPerm(Claim claim, ServerPlayerEntity player, ClaimPermission perm) { private boolean hasPerm(Claim claim, ServerPlayer player, ClaimPermission perm) {
if (claim.parentClaim() != null) if (claim.parentClaim() != null)
return claim.parentClaim().canInteract(player, perm, player.getBlockPos()); return claim.parentClaim().canInteract(player, perm, player.blockPosition());
return claim.canInteract(player, perm, player.getBlockPos()); return claim.canInteract(player, perm, player.blockPosition());
} }
} }

View File

@ -3,16 +3,16 @@ package io.github.flemmli97.flan.gui;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Player;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -20,39 +20,39 @@ public class ConfirmScreenHandler extends ServerOnlyScreenHandler<Object> {
private final Consumer<Boolean> cons; private final Consumer<Boolean> cons;
private ConfirmScreenHandler(int syncId, PlayerInventory playerInventory, Consumer<Boolean> cons) { private ConfirmScreenHandler(int syncId, Inventory playerInventory, Consumer<Boolean> cons) {
super(syncId, playerInventory, 1, null); super(syncId, playerInventory, 1, null);
this.cons = cons; this.cons = cons;
} }
public static void openConfirmScreen(ServerPlayerEntity player, Consumer<Boolean> process) { public static void openConfirmScreen(ServerPlayer player, Consumer<Boolean> process) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new ConfirmScreenHandler(syncId, inv, process); return new ConfirmScreenHandler(syncId, inv, process);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(ConfigHandler.lang.screenConfirm); return PermHelper.simpleColoredText(ConfigHandler.lang.screenConfirm);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Object additionalData) { protected void fillInventoryWith(Player player, SeparateInv inv, Object additionalData) {
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
switch (i) { switch (i) {
case 3: case 3:
ItemStack yes = new ItemStack(Items.GREEN_WOOL); ItemStack yes = new ItemStack(Items.GREEN_WOOL);
yes.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenYes, Formatting.GREEN)); yes.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenYes, ChatFormatting.GREEN));
inv.updateStack(i, yes); inv.updateStack(i, yes);
break; break;
case 5: case 5:
ItemStack no = new ItemStack(Items.RED_WOOL); ItemStack no = new ItemStack(Items.RED_WOOL);
no.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNo, Formatting.RED)); no.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNo, ChatFormatting.RED));
inv.updateStack(i, no); inv.updateStack(i, no);
break; break;
default: default:
@ -67,7 +67,7 @@ public class ConfirmScreenHandler extends ServerOnlyScreenHandler<Object> {
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
switch (index) { switch (index) {
case 3: case 3:
this.cons.accept(true); this.cons.accept(true);

View File

@ -5,20 +5,20 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.block.entity.SkullBlockEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtHelper; import net.minecraft.nbt.NbtUtils;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.network.chat.Component;
import net.minecraft.screen.ScreenHandler; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.screen.slot.Slot; import net.minecraft.sounds.SoundEvents;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.MenuProvider;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.text.Text; import net.minecraft.world.entity.player.Player;
import net.minecraft.util.Formatting; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.entity.SkullBlockEntity;
import java.util.List; import java.util.List;
@ -28,7 +28,7 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler<ClaimGroup
private final String group; private final String group;
private boolean removeMode; private boolean removeMode;
private GroupPlayerScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim, String group) { private GroupPlayerScreenHandler(int syncId, Inventory playerInventory, Claim claim, String group) {
super(syncId, playerInventory, 6, new ClaimGroup() { super(syncId, playerInventory, 6, new ClaimGroup() {
@Override @Override
@ -45,37 +45,37 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler<ClaimGroup
this.group = group; this.group = group;
} }
public static void openPlayerGroupMenu(PlayerEntity player, Claim claim, String group) { public static void openPlayerGroupMenu(Player player, Claim claim, String group) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new GroupPlayerScreenHandler(syncId, inv, claim, group); return new GroupPlayerScreenHandler(syncId, inv, claim, group);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(String.format(ConfigHandler.lang.screenGroupPlayers, group)); return PermHelper.simpleColoredText(String.format(ConfigHandler.lang.screenGroupPlayers, group));
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, ClaimGroup additionalData) { protected void fillInventoryWith(Player player, SeparateInv inv, ClaimGroup additionalData) {
Claim claim = additionalData.getClaim(); Claim claim = additionalData.getClaim();
List<String> players = claim.playersFromGroup(player.getServer(), additionalData.getGroup()); List<String> players = claim.playersFromGroup(player.getServer(), additionalData.getGroup());
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i == 3) { } else if (i == 3) {
ItemStack stack = new ItemStack(Items.ANVIL); ItemStack stack = new ItemStack(Items.ANVIL);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, Formatting.DARK_GREEN)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, ChatFormatting.DARK_GREEN));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i == 4) { } else if (i == 4) {
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
@ -85,8 +85,7 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler<ClaimGroup
if (id < players.size()) { if (id < players.size()) {
ItemStack group = new ItemStack(Items.PLAYER_HEAD); ItemStack group = new ItemStack(Items.PLAYER_HEAD);
GameProfile gameProfile = new GameProfile(null, players.get(id)); GameProfile gameProfile = new GameProfile(null, players.get(id));
gameProfile = SkullBlockEntity.loadProperties(gameProfile); SkullBlockEntity.updateGameprofile(gameProfile, prof -> group.getOrCreateTag().put("SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), prof)));
group.getOrCreateTag().put("SkullOwner", NbtHelper.fromGameProfile(new CompoundTag(), gameProfile));
inv.updateStack(i, group); inv.updateStack(i, group);
} }
} }
@ -99,30 +98,29 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler<ClaimGroup
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
if (index == 3) { if (index == 3) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> {
GameProfile prof = player.getServer().getUserCache().findByName(s); boolean fl = player.getServer().getProfileCache().get(s).map(prof -> this.claim.setPlayerGroup(prof.getId(), this.group, false)).orElse(true);
boolean fl = prof == null || this.claim.setPlayerGroup(prof.getId(), this.group, false); player.closeContainer();
player.closeHandledScreen();
player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, this.group)); player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, this.group));
if (fl) if (fl)
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_USE, 1, 1f);
else { else {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.playerGroupAddFail, Formatting.RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.playerGroupAddFail, ChatFormatting.RED), false);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
} }
}, () -> { }, () -> {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, this.group)); player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, this.group));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
})); }));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
@ -130,18 +128,18 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler<ClaimGroup
if (index == 4) { if (index == 4) {
this.removeMode = !this.removeMode; this.removeMode = !this.removeMode;
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
slot.setStack(stack); slot.set(stack);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
CompoundTag tag = stack.getOrCreateSubTag("SkullOwner"); CompoundTag tag = stack.getOrCreateTagElement("SkullOwner");
if (this.removeMode && tag.contains("Id")) { if (this.removeMode && tag.contains("Id")) {
this.claim.setPlayerGroup(tag.getUuid("Id"), null, false); this.claim.setPlayerGroup(tag.getUUID("Id"), null, false);
slot.setStack(ItemStack.EMPTY); slot.set(ItemStack.EMPTY);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_BAT_DEATH, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.BAT_DEATH, 1, 1f);
} }
} }
return false; return false;

View File

@ -5,17 +5,17 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.sounds.SoundEvents;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.List; import java.util.List;
@ -25,40 +25,40 @@ public class GroupScreenHandler extends ServerOnlyScreenHandler<Claim> {
private boolean removeMode; private boolean removeMode;
private GroupScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim) { private GroupScreenHandler(int syncId, Inventory playerInventory, Claim claim) {
super(syncId, playerInventory, 6, claim); super(syncId, playerInventory, 6, claim);
this.claim = claim; this.claim = claim;
} }
public static void openGroupMenu(PlayerEntity player, Claim claim) { public static void openGroupMenu(Player player, Claim claim) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new GroupScreenHandler(syncId, inv, claim); return new GroupScreenHandler(syncId, inv, claim);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(ConfigHandler.lang.screenGroups); return PermHelper.simpleColoredText(ConfigHandler.lang.screenGroups);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Claim claim) { protected void fillInventoryWith(Player player, SeparateInv inv, Claim claim) {
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack stack = new ItemStack(Items.TNT); ItemStack stack = new ItemStack(Items.TNT);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i == 3) { } else if (i == 3) {
ItemStack stack = new ItemStack(Items.ANVIL); ItemStack stack = new ItemStack(Items.ANVIL);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, Formatting.DARK_GREEN)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, ChatFormatting.DARK_GREEN));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i == 4) { } else if (i == 4) {
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
@ -68,7 +68,7 @@ public class GroupScreenHandler extends ServerOnlyScreenHandler<Claim> {
int id = (i % 9) + row * 7 - 1; int id = (i % 9) + row * 7 - 1;
if (id < groups.size()) { if (id < groups.size()) {
ItemStack group = new ItemStack(Items.PAPER); ItemStack group = new ItemStack(Items.PAPER);
group.setCustomName(ServerScreenHelper.coloredGuiText(groups.get(id), Formatting.DARK_BLUE)); group.setHoverName(ServerScreenHelper.coloredGuiText(groups.get(id), ChatFormatting.DARK_BLUE));
inv.updateStack(i, group); inv.updateStack(i, group);
} }
} }
@ -81,24 +81,24 @@ public class GroupScreenHandler extends ServerOnlyScreenHandler<Claim> {
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
if (index == 3) { if (index == 3) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> {
this.claim.editPerms(player, s, PermissionRegistry.EDITPERMS, -1); this.claim.editPerms(player, s, PermissionRegistry.EDITPERMS, -1);
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_USE, 1, 1f);
}, () -> { }, () -> {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
})); }));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
@ -106,24 +106,24 @@ public class GroupScreenHandler extends ServerOnlyScreenHandler<Claim> {
if (index == 4) { if (index == 4) {
this.removeMode = !this.removeMode; this.removeMode = !this.removeMode;
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
slot.setStack(stack); slot.set(stack);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
String name = stack.getName().asString(); String name = stack.getHoverName().getContents();
if (this.removeMode) { if (this.removeMode) {
this.claim.removePermGroup(player, name); this.claim.removePermGroup(player, name);
slot.setStack(ItemStack.EMPTY); slot.set(ItemStack.EMPTY);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_BAT_DEATH, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.BAT_DEATH, 1, 1f);
} else { } else {
if (clickType == 1) { if (clickType == 1) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, name)); player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, name));
} else { } else {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, name)); player.getServer().execute(() -> GroupPlayerScreenHandler.openPlayerGroupMenu(player, this.claim, name));
} }
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);

View File

@ -3,45 +3,45 @@ package io.github.flemmli97.flan.gui;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.mixin.ILecternBlockValues; import io.github.flemmli97.flan.mixin.ILecternBlockValues;
import net.minecraft.block.entity.LecternBlockEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.chat.Component;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.inventory.Inventory; import net.minecraft.world.Container;
import net.minecraft.screen.LecternScreenHandler; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.PropertyDelegate; import net.minecraft.world.entity.player.Player;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.ContainerData;
import net.minecraft.text.Text; import net.minecraft.world.inventory.LecternMenu;
import net.minecraft.util.Formatting; import net.minecraft.world.level.block.entity.LecternBlockEntity;
public class LockedLecternScreenHandler extends LecternScreenHandler { public class LockedLecternScreenHandler extends LecternMenu {
public LockedLecternScreenHandler(int syncId, Inventory inventory, PropertyDelegate propertyDelegate) { public LockedLecternScreenHandler(int syncId, Container inventory, ContainerData propertyDelegate) {
super(syncId, inventory, propertyDelegate); super(syncId, inventory, propertyDelegate);
} }
public static void create(ServerPlayerEntity player, LecternBlockEntity lectern) { public static void create(ServerPlayer player, LecternBlockEntity lectern) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new LockedLecternScreenHandler(syncId, ((ILecternBlockValues) lectern).getInv(), ((ILecternBlockValues) lectern).getProp()); return new LockedLecternScreenHandler(syncId, ((ILecternBlockValues) lectern).getInv(), ((ILecternBlockValues) lectern).getProp());
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return lectern.getDisplayName(); return lectern.getDisplayName();
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
public boolean onButtonClick(PlayerEntity player, int id) { public boolean clickMenuButton(Player player, int id) {
if (id == 3) { if (id == 3) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), false); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, ChatFormatting.DARK_RED), false);
return false; return false;
} }
return super.onButtonClick(player, id); return super.clickMenuButton(player, id);
} }
} }

View File

@ -6,17 +6,17 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.sounds.SoundEvents;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -28,7 +28,7 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
private int page, maxPages; private int page, maxPages;
private List<ClaimPermission> perms; private List<ClaimPermission> perms;
private PermissionScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim, String group) { private PermissionScreenHandler(int syncId, Inventory playerInventory, Claim claim, String group) {
super(syncId, playerInventory, 6, new ClaimGroup() { super(syncId, playerInventory, 6, new ClaimGroup() {
@Override @Override
public Claim getClaim() { public Claim getClaim() {
@ -44,23 +44,23 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
this.group = group; this.group = group;
} }
public static void openClaimMenu(PlayerEntity player, Claim claim, String group) { public static void openClaimMenu(Player player, Claim claim, String group) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new PermissionScreenHandler(syncId, inv, claim, group); return new PermissionScreenHandler(syncId, inv, claim, group);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(group == null ? ConfigHandler.lang.screenGlobalPerms : String.format(ConfigHandler.lang.screenGroupPerms, group)); return PermHelper.simpleColoredText(group == null ? ConfigHandler.lang.screenGlobalPerms : String.format(ConfigHandler.lang.screenGroupPerms, group));
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, ClaimGroup additionalData) { protected void fillInventoryWith(Player player, SeparateInv inv, ClaimGroup additionalData) {
this.perms = new ArrayList<>(PermissionRegistry.getPerms()); this.perms = new ArrayList<>(PermissionRegistry.getPerms());
if (additionalData.getGroup() != null) if (additionalData.getGroup() != null)
this.perms.removeAll(PermissionRegistry.globalPerms()); this.perms.removeAll(PermissionRegistry.globalPerms());
@ -68,11 +68,11 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i == 51) { } else if (i == 51) {
ItemStack close = new ItemStack(Items.ARROW); ItemStack close = new ItemStack(Items.ARROW);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, Formatting.WHITE)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, ChatFormatting.WHITE));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
@ -89,44 +89,44 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
this.slots.get(i).setStack(close); this.slots.get(i).set(close);
} else if (i == 47) { } else if (i == 47) {
ItemStack stack = ServerScreenHelper.emptyFiller(); ItemStack stack = ServerScreenHelper.emptyFiller();
if (this.page >= 1) { if (this.page >= 1) {
stack = new ItemStack(Items.ARROW); stack = new ItemStack(Items.ARROW);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, Formatting.WHITE)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, ChatFormatting.WHITE));
} }
this.slots.get(i).setStack(stack); this.slots.get(i).set(stack);
} else if (i == 51) { } else if (i == 51) {
ItemStack stack = ServerScreenHelper.emptyFiller(); ItemStack stack = ServerScreenHelper.emptyFiller();
if (this.page < this.maxPages) { if (this.page < this.maxPages) {
stack = new ItemStack(Items.ARROW); stack = new ItemStack(Items.ARROW);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, Formatting.WHITE)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, ChatFormatting.WHITE));
} }
this.slots.get(i).setStack(stack); this.slots.get(i).set(stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
this.slots.get(i).setStack(ServerScreenHelper.emptyFiller()); this.slots.get(i).set(ServerScreenHelper.emptyFiller());
else { else {
int row = i / 9 - 1; int row = i / 9 - 1;
int id = (i % 9) + row * 7 - 1 + this.page * 28; int id = (i % 9) + row * 7 - 1 + this.page * 28;
if (id < this.perms.size()) { if (id < this.perms.size()) {
this.slots.get(i).setStack(ServerScreenHelper.fromPermission(this.claim, this.perms.get(id), this.group)); this.slots.get(i).set(ServerScreenHelper.fromPermission(this.claim, this.perms.get(id), this.group));
} else } else
this.slots.get(i).setStack(ItemStack.EMPTY); this.slots.get(i).set(ItemStack.EMPTY);
} }
} }
this.sendContentUpdates(); this.broadcastChanges();
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
if (this.group == null) { if (this.group == null) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim));
} else { } else {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim));
} }
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
@ -142,8 +142,8 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
this.flipPage(); this.flipPage();
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
String name = stack.getName().asString(); String name = stack.getHoverName().getContents();
ClaimPermission perm; ClaimPermission perm;
try { try {
perm = PermissionRegistry.get(name); perm = PermissionRegistry.get(name);
@ -160,11 +160,11 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler<ClaimGroup>
success = this.claim.editGlobalPerms(player, perm, mode); success = this.claim.editGlobalPerms(player, perm, mode);
} else } else
success = this.claim.editPerms(player, this.group, perm, this.claim.groupHasPerm(this.group, perm) + 1); success = this.claim.editPerms(player, this.group, perm, this.claim.groupHasPerm(this.group, perm) + 1);
slot.setStack(ServerScreenHelper.fromPermission(this.claim, perm, this.group)); slot.set(ServerScreenHelper.fromPermission(this.claim, perm, this.group));
if (success) if (success)
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_NOTE_BLOCK_PLING, 1, 1.2f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.NOTE_BLOCK_PLING, 1, 1.2f);
else else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
return true; return true;
} }

View File

@ -5,17 +5,17 @@ import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.sounds.SoundEvents;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -24,52 +24,52 @@ public class PersonalGroupScreenHandler extends ServerOnlyScreenHandler<Object>
private boolean removeMode; private boolean removeMode;
private PersonalGroupScreenHandler(int syncId, PlayerInventory playerInventory) { private PersonalGroupScreenHandler(int syncId, Inventory playerInventory) {
super(syncId, playerInventory, 6, null); super(syncId, playerInventory, 6, null);
} }
public static void openGroupMenu(PlayerEntity player) { public static void openGroupMenu(Player player) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new PersonalGroupScreenHandler(syncId, inv); return new PersonalGroupScreenHandler(syncId, inv);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(ConfigHandler.lang.screenPersonalGroups); return PermHelper.simpleColoredText(ConfigHandler.lang.screenPersonalGroups);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Object additionalData) { protected void fillInventoryWith(Player player, SeparateInv inv, Object additionalData) {
if (!(player instanceof ServerPlayerEntity)) if (!(player instanceof ServerPlayer))
return; return;
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i == 3) { } else if (i == 3) {
ItemStack stack = new ItemStack(Items.ANVIL); ItemStack stack = new ItemStack(Items.ANVIL);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, Formatting.DARK_GREEN)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, ChatFormatting.DARK_GREEN));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i == 4) { } else if (i == 4) {
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
else { else {
List<String> groups = new ArrayList<>(PlayerClaimData.get((ServerPlayerEntity) player).playerDefaultGroups().keySet()); List<String> groups = new ArrayList<>(PlayerClaimData.get((ServerPlayer) player).playerDefaultGroups().keySet());
groups.sort(null); groups.sort(null);
int row = i / 9 - 1; int row = i / 9 - 1;
int id = (i % 9) + row * 7 - 1; int id = (i % 9) + row * 7 - 1;
if (id < groups.size()) { if (id < groups.size()) {
ItemStack group = new ItemStack(Items.PAPER); ItemStack group = new ItemStack(Items.PAPER);
group.setCustomName(ServerScreenHelper.coloredGuiText(groups.get(id), Formatting.DARK_BLUE)); group.setHoverName(ServerScreenHelper.coloredGuiText(groups.get(id), ChatFormatting.DARK_BLUE));
inv.updateStack(i, group); inv.updateStack(i, group);
} }
} }
@ -82,23 +82,23 @@ public class PersonalGroupScreenHandler extends ServerOnlyScreenHandler<Object>
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
if (index == 3) { if (index == 3) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> {
PlayerClaimData.get(player).editDefaultPerms(s, PermissionRegistry.EDITPERMS, -1); PlayerClaimData.get(player).editDefaultPerms(s, PermissionRegistry.EDITPERMS, -1);
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_USE, 1, 1f);
}, () -> { }, () -> {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
})); }));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
@ -106,20 +106,20 @@ public class PersonalGroupScreenHandler extends ServerOnlyScreenHandler<Object>
if (index == 4) { if (index == 4) {
this.removeMode = !this.removeMode; this.removeMode = !this.removeMode;
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
slot.setStack(stack); slot.set(stack);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
String name = stack.getName().asString(); String name = stack.getHoverName().getContents();
if (this.removeMode) { if (this.removeMode) {
PlayerClaimData.get(player).playerDefaultGroups().remove(name); PlayerClaimData.get(player).playerDefaultGroups().remove(name);
slot.setStack(ItemStack.EMPTY); slot.set(ItemStack.EMPTY);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_BAT_DEATH, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.BAT_DEATH, 1, 1f);
} else { } else {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PersonalPermissionScreenHandler.openClaimMenu(player, name)); player.getServer().execute(() -> PersonalPermissionScreenHandler.openClaimMenu(player, name));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} }

View File

@ -6,17 +6,17 @@ import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.ChatFormatting;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.Items; import net.minecraft.sounds.SoundEvents;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Player;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -27,32 +27,32 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
private final String group; private final String group;
private int page; private int page;
private final PlayerEntity player; private final Player player;
private PersonalPermissionScreenHandler(int syncId, PlayerInventory playerInventory, String group) { private PersonalPermissionScreenHandler(int syncId, Inventory playerInventory, String group) {
super(syncId, playerInventory, 6, group); super(syncId, playerInventory, 6, group);
this.group = group; this.group = group;
this.player = playerInventory.player; this.player = playerInventory.player;
} }
public static void openClaimMenu(PlayerEntity player, String group) { public static void openClaimMenu(Player player, String group) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new PersonalPermissionScreenHandler(syncId, inv, group); return new PersonalPermissionScreenHandler(syncId, inv, group);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(String.format(ConfigHandler.lang.screenPersonalPermissions, group)); return PermHelper.simpleColoredText(String.format(ConfigHandler.lang.screenPersonalPermissions, group));
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, String group) { protected void fillInventoryWith(Player player, SeparateInv inv, String group) {
if (!(player instanceof ServerPlayerEntity)) if (!(player instanceof ServerPlayer))
return; return;
List<ClaimPermission> perms = new ArrayList<>(PermissionRegistry.getPerms()); List<ClaimPermission> perms = new ArrayList<>(PermissionRegistry.getPerms());
if (this.group != null) if (this.group != null)
@ -61,15 +61,15 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
int page = 0; int page = 0;
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (page == 1 && i == 47) { } else if (page == 1 && i == 47) {
ItemStack close = new ItemStack(Items.ARROW); ItemStack close = new ItemStack(Items.ARROW);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, Formatting.WHITE)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, ChatFormatting.WHITE));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (page == 0 && i == 51) { } else if (page == 0 && i == 51) {
ItemStack close = new ItemStack(Items.ARROW); ItemStack close = new ItemStack(Items.ARROW);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, Formatting.WHITE)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, ChatFormatting.WHITE));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
@ -77,13 +77,13 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
int row = i / 9 - 1; int row = i / 9 - 1;
int id = (i % 9) + row * 7 - 1 + page * 28; int id = (i % 9) + row * 7 - 1 + page * 28;
if (id < perms.size()) if (id < perms.size())
inv.updateStack(i, ServerScreenHelper.getFromPersonal((ServerPlayerEntity) player, perms.get(id), group)); inv.updateStack(i, ServerScreenHelper.getFromPersonal((ServerPlayer) player, perms.get(id), group));
} }
} }
} }
private void flipPage() { private void flipPage() {
if (!(this.player instanceof ServerPlayerEntity)) if (!(this.player instanceof ServerPlayer))
return; return;
List<ClaimPermission> perms = new ArrayList<>(PermissionRegistry.getPerms()); List<ClaimPermission> perms = new ArrayList<>(PermissionRegistry.getPerms());
if (this.group != null) if (this.group != null)
@ -92,40 +92,40 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
this.slots.get(i).setStack(close); this.slots.get(i).set(close);
} else if (i == 47) { } else if (i == 47) {
ItemStack stack = ServerScreenHelper.emptyFiller(); ItemStack stack = ServerScreenHelper.emptyFiller();
if (this.page >= 1) { if (this.page >= 1) {
stack = new ItemStack(Items.ARROW); stack = new ItemStack(Items.ARROW);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, Formatting.WHITE)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenPrevious, ChatFormatting.WHITE));
} }
this.slots.get(i).setStack(stack); this.slots.get(i).set(stack);
} else if (i == 51) { } else if (i == 51) {
ItemStack stack = ServerScreenHelper.emptyFiller(); ItemStack stack = ServerScreenHelper.emptyFiller();
if (this.page < maxPages) { if (this.page < maxPages) {
stack = new ItemStack(Items.ARROW); stack = new ItemStack(Items.ARROW);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, Formatting.WHITE)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNext, ChatFormatting.WHITE));
} }
this.slots.get(i).setStack(stack); this.slots.get(i).set(stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
this.slots.get(i).setStack(ServerScreenHelper.emptyFiller()); this.slots.get(i).set(ServerScreenHelper.emptyFiller());
else { else {
int row = i / 9 - 1; int row = i / 9 - 1;
int id = (i % 9) + row * 7 - 1 + this.page * 28; int id = (i % 9) + row * 7 - 1 + this.page * 28;
if (id < perms.size()) { if (id < perms.size()) {
this.slots.get(i).setStack(ServerScreenHelper.getFromPersonal((ServerPlayerEntity) this.player, perms.get(id), this.group)); this.slots.get(i).set(ServerScreenHelper.getFromPersonal((ServerPlayer) this.player, perms.get(id), this.group));
} else } else
this.slots.get(i).setStack(ItemStack.EMPTY); this.slots.get(i).set(ItemStack.EMPTY);
} }
} }
this.sendContentUpdates(); this.broadcastChanges();
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
@ -140,8 +140,8 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
this.flipPage(); this.flipPage();
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
String name = stack.getName().asString(); String name = stack.getHoverName().getContents();
ClaimPermission perm; ClaimPermission perm;
try { try {
perm = PermissionRegistry.get(name); perm = PermissionRegistry.get(name);
@ -151,11 +151,11 @@ public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler<Str
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
Map<ClaimPermission, Boolean> perms = data.playerDefaultGroups().getOrDefault(this.group, new HashMap<>()); Map<ClaimPermission, Boolean> perms = data.playerDefaultGroups().getOrDefault(this.group, new HashMap<>());
boolean success = data.editDefaultPerms(this.group, perm, (perms.containsKey(perm) ? perms.get(perm) ? 1 : 0 : -1) + 1); boolean success = data.editDefaultPerms(this.group, perm, (perms.containsKey(perm) ? perms.get(perm) ? 1 : 0 : -1) + 1);
slot.setStack(ServerScreenHelper.getFromPersonal(player, perm, this.group)); slot.set(ServerScreenHelper.getFromPersonal(player, perm, this.group));
if (success) if (success)
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_NOTE_BLOCK_PLING, 1, 1.2f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.NOTE_BLOCK_PLING, 1, 1.2f);
else else
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
return true; return true;
} }

View File

@ -6,23 +6,23 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import net.minecraft.entity.effect.StatusEffect; import net.minecraft.ChatFormatting;
import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.network.chat.Component;
import net.minecraft.entity.effect.StatusEffects; import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.resources.ResourceLocation;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.sounds.SoundEvents;
import net.minecraft.item.Items; import net.minecraft.world.MenuProvider;
import net.minecraft.potion.PotionUtil; import net.minecraft.world.effect.MobEffect;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.effect.MobEffects;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.entity.player.Player;
import net.minecraft.sound.SoundEvents; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.text.Text; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.TranslatableText; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.Formatting; import net.minecraft.world.item.Items;
import net.minecraft.util.Identifier; import net.minecraft.world.item.alchemy.PotionUtils;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -36,43 +36,43 @@ public class PotionEditScreenHandler extends ServerOnlyScreenHandler<Claim> {
private boolean removeMode; private boolean removeMode;
protected PotionEditScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim) { protected PotionEditScreenHandler(int syncId, Inventory playerInventory, Claim claim) {
super(syncId, playerInventory, 6, claim); super(syncId, playerInventory, 6, claim);
this.claim = claim; this.claim = claim;
} }
public static void openPotionMenu(PlayerEntity player, Claim claim) { public static void openPotionMenu(Player player, Claim claim) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new PotionEditScreenHandler(syncId, inv, claim); return new PotionEditScreenHandler(syncId, inv, claim);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(ConfigHandler.lang.screenPotions); return PermHelper.simpleColoredText(ConfigHandler.lang.screenPotions);
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Claim claim) { protected void fillInventoryWith(Player player, SeparateInv inv, Claim claim) {
Map<StatusEffect, Integer> potions = claim.getPotions(); Map<MobEffect, Integer> potions = claim.getPotions();
List<StatusEffect> key = Lists.newArrayList(potions.keySet()); List<MobEffect> key = Lists.newArrayList(potions.keySet());
key.sort(Comparator.comparing(eff -> CrossPlatformStuff.registryStatusEffects().getIDFrom(eff).toString())); key.sort(Comparator.comparing(eff -> CrossPlatformStuff.registryStatusEffects().getIDFrom(eff).toString()));
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
if (i == 0) { if (i == 0) {
ItemStack close = new ItemStack(Items.TNT); ItemStack close = new ItemStack(Items.TNT);
close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); close.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, ChatFormatting.DARK_RED));
inv.updateStack(i, close); inv.updateStack(i, close);
} else if (i == 3) { } else if (i == 3) {
ItemStack stack = new ItemStack(Items.ANVIL); ItemStack stack = new ItemStack(Items.ANVIL);
stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, Formatting.DARK_GREEN)); stack.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenAdd, ChatFormatting.DARK_GREEN));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i == 4) { } else if (i == 4) {
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
inv.updateStack(i, stack); inv.updateStack(i, stack);
} else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8)
inv.updateStack(i, ServerScreenHelper.emptyFiller()); inv.updateStack(i, ServerScreenHelper.emptyFiller());
@ -80,13 +80,13 @@ public class PotionEditScreenHandler extends ServerOnlyScreenHandler<Claim> {
int row = i / 9 - 1; int row = i / 9 - 1;
int id = (i % 9) + row * 7 - 1; int id = (i % 9) + row * 7 - 1;
if (id < potions.size()) { if (id < potions.size()) {
StatusEffect effect = key.get(id); MobEffect effect = key.get(id);
ItemStack effectStack = new ItemStack(Items.POTION); ItemStack effectStack = new ItemStack(Items.POTION);
TranslatableText txt = new TranslatableText(effect.getTranslationKey()); TranslatableComponent txt = new TranslatableComponent(effect.getDescriptionId());
Collection<StatusEffectInstance> inst = Collections.singleton(new StatusEffectInstance(effect, 0, potions.get(effect))); Collection<MobEffectInstance> inst = Collections.singleton(new MobEffectInstance(effect, 0, potions.get(effect)));
effectStack.getOrCreateTag().putString("FlanEffect", CrossPlatformStuff.registryStatusEffects().getIDFrom(effect).toString()); effectStack.getOrCreateTag().putString("FlanEffect", CrossPlatformStuff.registryStatusEffects().getIDFrom(effect).toString());
effectStack.getTag().putInt("CustomPotionColor", PotionUtil.getColor(inst)); effectStack.getTag().putInt("CustomPotionColor", PotionUtils.getColor(inst));
effectStack.setCustomName(txt.setStyle(txt.getStyle().withItalic(false).withFormatting(Formatting.DARK_BLUE)).append(ServerScreenHelper.coloredGuiText("-" + potions.get(effect), Formatting.DARK_BLUE))); effectStack.setHoverName(txt.setStyle(txt.getStyle().withItalic(false).applyFormat(ChatFormatting.DARK_BLUE)).append(ServerScreenHelper.coloredGuiText("-" + potions.get(effect), ChatFormatting.DARK_BLUE)));
inv.updateStack(i, effectStack); inv.updateStack(i, effectStack);
} }
} }
@ -99,21 +99,21 @@ public class PotionEditScreenHandler extends ServerOnlyScreenHandler<Claim> {
} }
@Override @Override
protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { protected boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType) {
if (index == 0) { if (index == 0) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
if (index == 3) { if (index == 3) {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> {
String[] potion = s.split(";"); String[] potion = s.split(";");
int amp = 1; int amp = 1;
StatusEffect effect = CrossPlatformStuff.registryStatusEffects().getFromId(new Identifier(potion[0])); MobEffect effect = CrossPlatformStuff.registryStatusEffects().getFromId(new ResourceLocation(potion[0]));
if (effect == null || (effect == StatusEffects.LUCK && !potion[0].equals("minecraft:luck"))) { if (effect == null || (effect == MobEffects.LUCK && !potion[0].equals("minecraft:luck"))) {
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
return; return;
} }
if (potion.length > 1) { if (potion.length > 1) {
@ -123,13 +123,13 @@ public class PotionEditScreenHandler extends ServerOnlyScreenHandler<Claim> {
} }
} }
this.claim.addPotion(effect, amp); this.claim.addPotion(effect, amp);
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim)); player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.ANVIL_USE, 1, 1f);
}, () -> { }, () -> {
player.closeHandledScreen(); player.closeContainer();
player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim)); player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.VILLAGER_NO, 1, 1f);
})); }));
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
@ -137,17 +137,17 @@ public class PotionEditScreenHandler extends ServerOnlyScreenHandler<Claim> {
if (index == 4) { if (index == 4) {
this.removeMode = !this.removeMode; this.removeMode = !this.removeMode;
ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK);
stack.setCustomName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), Formatting.DARK_RED)); stack.setHoverName(ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenRemoveMode, this.removeMode ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse), ChatFormatting.DARK_RED));
slot.setStack(stack); slot.set(stack);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f);
return true; return true;
} }
ItemStack stack = slot.getStack(); ItemStack stack = slot.getItem();
if (!stack.isEmpty() && this.removeMode) { if (!stack.isEmpty() && this.removeMode) {
String effect = stack.getOrCreateTag().getString("FlanEffect"); String effect = stack.getOrCreateTag().getString("FlanEffect");
this.claim.removePotion(CrossPlatformStuff.registryStatusEffects().getFromId(new Identifier(effect))); this.claim.removePotion(CrossPlatformStuff.registryStatusEffects().getFromId(new ResourceLocation(effect)));
slot.setStack(ItemStack.EMPTY); slot.set(ItemStack.EMPTY);
ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_BAT_DEATH, 1, 1f); ServerScreenHelper.playSongToPlayer(player, SoundEvents.BAT_DEATH, 1, 1f);
} }
return false; return false;
} }

View File

@ -3,27 +3,24 @@ package io.github.flemmli97.flan.gui;
import io.github.flemmli97.flan.gui.inv.SeparateInv; import io.github.flemmli97.flan.gui.inv.SeparateInv;
import io.github.flemmli97.flan.gui.inv.SeparateInvImpl; import io.github.flemmli97.flan.gui.inv.SeparateInvImpl;
import io.github.flemmli97.flan.gui.inv.SlotDelegate; import io.github.flemmli97.flan.gui.inv.SlotDelegate;
import net.minecraft.entity.player.PlayerEntity; import io.github.flemmli97.flan.mixin.AbstractContainerAccessor;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.world.entity.player.Player;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.screen.ScreenHandlerListener; import net.minecraft.world.inventory.ChestMenu;
import net.minecraft.screen.ScreenHandlerType; import net.minecraft.world.inventory.ClickType;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.inventory.ContainerListener;
import net.minecraft.screen.slot.SlotActionType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import java.util.ArrayList; public abstract class ServerOnlyScreenHandler<T> extends AbstractContainerMenu {
import java.util.List;
public abstract class ServerOnlyScreenHandler<T> extends ScreenHandler {
private final SeparateInvImpl inventory; private final SeparateInvImpl inventory;
private final List<ScreenHandlerListener> listeners = new ArrayList<>();
private boolean update = true; private boolean update = true;
protected ServerOnlyScreenHandler(int syncId, PlayerInventory playerInventory, int rows, T additionalData) { protected ServerOnlyScreenHandler(int syncId, Inventory playerInventory, int rows, T additionalData) {
super(fromRows(rows), syncId); super(fromRows(rows), syncId);
int i = (rows - 4) * 18; int i = (rows - 4) * 18;
this.inventory = new SeparateInvImpl(rows * 9); this.inventory = new SeparateInvImpl(rows * 9);
@ -40,12 +37,12 @@ public abstract class ServerOnlyScreenHandler<T> extends ScreenHandler {
for (m = 0; m < 9; ++m) { for (m = 0; m < 9; ++m) {
this.addSlot(new Slot(playerInventory, m + n * 9 + 9, 8 + m * 18, 103 + n * 18 + i) { this.addSlot(new Slot(playerInventory, m + n * 9 + 9, 8 + m * 18, 103 + n * 18 + i) {
@Override @Override
public boolean canInsert(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
return false; return false;
} }
@Override @Override
public boolean canTakeItems(PlayerEntity playerEntity) { public boolean mayPickup(Player playerEntity) {
return false; return false;
} }
}); });
@ -55,81 +52,82 @@ public abstract class ServerOnlyScreenHandler<T> extends ScreenHandler {
for (n = 0; n < 9; ++n) { for (n = 0; n < 9; ++n) {
this.addSlot(new Slot(playerInventory, n, 8 + n * 18, 161 + i) { this.addSlot(new Slot(playerInventory, n, 8 + n * 18, 161 + i) {
@Override @Override
public boolean canInsert(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
return false; return false;
} }
@Override @Override
public boolean canTakeItems(PlayerEntity playerEntity) { public boolean mayPickup(Player playerEntity) {
return false; return false;
} }
}); });
} }
} }
private static ScreenHandlerType<GenericContainerScreenHandler> fromRows(int rows) { private static MenuType<ChestMenu> fromRows(int rows) {
switch (rows) { switch (rows) {
case 2: case 2:
return ScreenHandlerType.GENERIC_9X2; return MenuType.GENERIC_9x2;
case 3: case 3:
return ScreenHandlerType.GENERIC_9X3; return MenuType.GENERIC_9x3;
case 4: case 4:
return ScreenHandlerType.GENERIC_9X4; return MenuType.GENERIC_9x4;
case 5: case 5:
return ScreenHandlerType.GENERIC_9X5; return MenuType.GENERIC_9x5;
case 6: case 6:
return ScreenHandlerType.GENERIC_9X6; return MenuType.GENERIC_9x6;
} }
return ScreenHandlerType.GENERIC_9X1; return MenuType.GENERIC_9x1;
} }
protected abstract void fillInventoryWith(PlayerEntity player, SeparateInv inv, T additionalData); protected abstract void fillInventoryWith(Player player, SeparateInv inv, T additionalData);
@Override @Override
public boolean canUse(PlayerEntity player) { public boolean stillValid(Player player) {
return true; return true;
} }
@Override @Override
public ItemStack onSlotClick(int i, int j, SlotActionType actionType, PlayerEntity playerEntity) { public void clicked(int i, int j, ClickType actionType, Player playerEntity) {
if (i < 0) if (i < 0)
return ItemStack.EMPTY; return;
Slot slot = this.slots.get(i); Slot slot = this.slots.get(i);
if (this.isRightSlot(i)) if (this.isRightSlot(i)) {
this.handleSlotClicked((ServerPlayerEntity) playerEntity, i, slot, j); if (((AbstractContainerAccessor) this).containerSync() != null)
ItemStack stack = slot.getStack().copy(); ((AbstractContainerAccessor) this).containerSync().sendCarriedChange(this, this.getCarried().copy());
for (ScreenHandlerListener listener : this.listeners) this.handleSlotClicked((ServerPlayer) playerEntity, i, slot, j);
listener.onSlotUpdate(this, i, stack); }
((ServerPlayerEntity) playerEntity).updateCursorStack(); ItemStack stack = slot.getItem().copy();
return stack; for (ContainerListener listener : ((AbstractContainerAccessor) this).listeners())
listener.slotChanged(this, i, stack);
} }
@Override @Override
public ItemStack transferSlot(PlayerEntity player, int index) { public ItemStack quickMoveStack(Player player, int index) {
if (index < 0) if (index < 0)
return ItemStack.EMPTY; return ItemStack.EMPTY;
Slot slot = this.slots.get(index); Slot slot = this.slots.get(index);
if (this.isRightSlot(index)) if (this.isRightSlot(index))
this.handleSlotClicked((ServerPlayerEntity) player, index, slot, 0); this.handleSlotClicked((ServerPlayer) player, index, slot, 0);
return slot.getStack().copy(); return slot.getItem().copy();
} }
@Override /*@Override
public void addListener(ScreenHandlerListener listener) { public void addSlotListener(ContainerListener listener) {
this.update = false; this.update = false;
super.addListener(listener); super.addSlotListener(listener);
if (!this.listeners.contains(listener)) { if (!this.listeners.contains(listener)) {
this.listeners.add(listener); this.listeners.add(listener);
listener.onHandlerRegistered(this, this.getStacks()); listener.refreshContainer(this, this.getItems());
this.update = true; this.update = true;
this.sendContentUpdates(); this.broadcastChanges();
}
} }
}*/
@Override @Override
public void sendContentUpdates() { public void broadcastChanges() {
if (this.update) //if (this.update)
super.sendContentUpdates(); super.broadcastChanges();
} }
protected abstract boolean isRightSlot(int slot); protected abstract boolean isRightSlot(int slot);
@ -137,5 +135,5 @@ public abstract class ServerOnlyScreenHandler<T> extends ScreenHandler {
/** /**
* @param clickType 0 for left click, 1 for right click * @param clickType 0 for left click, 1 for right click
*/ */
protected abstract boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType); protected abstract boolean handleSlotClicked(ServerPlayer player, int index, Slot slot, int clickType);
} }

View File

@ -6,18 +6,18 @@ import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.Config; import io.github.flemmli97.flan.config.Config;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.item.ItemStack; import net.minecraft.ChatFormatting;
import net.minecraft.item.Items;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag; import net.minecraft.nbt.StringTag;
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; import net.minecraft.network.chat.Component;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.network.chat.Style;
import net.minecraft.sound.SoundCategory; import net.minecraft.network.chat.TextComponent;
import net.minecraft.sound.SoundEvent; import net.minecraft.network.protocol.game.ClientboundSoundPacket;
import net.minecraft.text.LiteralText; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.text.Style; import net.minecraft.sounds.SoundEvent;
import net.minecraft.text.Text; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Formatting; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -28,24 +28,24 @@ public class ServerScreenHelper {
public static ItemStack emptyFiller() { public static ItemStack emptyFiller() {
ItemStack stack = new ItemStack(Items.GRAY_STAINED_GLASS_PANE); ItemStack stack = new ItemStack(Items.GRAY_STAINED_GLASS_PANE);
stack.setCustomName(PermHelper.simpleColoredText("")); stack.setHoverName(PermHelper.simpleColoredText(""));
return stack; return stack;
} }
public static ItemStack fromPermission(Claim claim, ClaimPermission perm, String group) { public static ItemStack fromPermission(Claim claim, ClaimPermission perm, String group) {
ItemStack stack = perm.getItem(); ItemStack stack = perm.getItem();
stack.setCustomName(ServerScreenHelper.coloredGuiText(perm.id, Formatting.GOLD)); stack.setHoverName(ServerScreenHelper.coloredGuiText(perm.id, ChatFormatting.GOLD));
List<Text> lore = new ArrayList<>(); List<Component> lore = new ArrayList<>();
for (String pdesc : perm.desc) { for (String pdesc : perm.desc) {
Text trans = ServerScreenHelper.coloredGuiText(pdesc, Formatting.YELLOW); Component trans = ServerScreenHelper.coloredGuiText(pdesc, ChatFormatting.YELLOW);
lore.add(trans); lore.add(trans);
} }
Config.GlobalType global = ConfigHandler.config.getGlobal(claim.getWorld(), perm); Config.GlobalType global = ConfigHandler.config.getGlobal(claim.getWorld(), perm);
if (!claim.isAdminClaim() && !global.canModify()) { if (!claim.isAdminClaim() && !global.canModify()) {
Text text = ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenUneditable, Formatting.DARK_RED); Component text = ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenUneditable, ChatFormatting.DARK_RED);
lore.add(text); lore.add(text);
String permFlag = global.getValue() ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse; String permFlag = global.getValue() ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse;
Text text2 = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? Formatting.GREEN : Formatting.RED); Component text2 = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? ChatFormatting.GREEN : ChatFormatting.RED);
lore.add(text2); lore.add(text2);
} else { } else {
String permFlag; String permFlag;
@ -78,28 +78,28 @@ public class ServerScreenHelper {
break; break;
} }
} }
Text text = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? Formatting.GREEN : Formatting.RED); Component text = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? ChatFormatting.GREEN : ChatFormatting.RED);
lore.add(text); lore.add(text);
} }
addLore(stack, lore); addLore(stack, lore);
return stack; return stack;
} }
public static ItemStack getFromPersonal(ServerPlayerEntity player, ClaimPermission perm, String group) { public static ItemStack getFromPersonal(ServerPlayer player, ClaimPermission perm, String group) {
ItemStack stack = perm.getItem(); ItemStack stack = perm.getItem();
stack.setCustomName(ServerScreenHelper.coloredGuiText(perm.id, Formatting.GOLD)); stack.setHoverName(ServerScreenHelper.coloredGuiText(perm.id, ChatFormatting.GOLD));
ListTag lore = new ListTag(); ListTag lore = new ListTag();
for (String pdesc : perm.desc) { for (String pdesc : perm.desc) {
Text trans = ServerScreenHelper.coloredGuiText(pdesc, Formatting.YELLOW); Component trans = ServerScreenHelper.coloredGuiText(pdesc, ChatFormatting.YELLOW);
lore.add(StringTag.of(Text.Serializer.toJson(trans))); lore.add(StringTag.valueOf(Component.Serializer.toJson(trans)));
} }
Config.GlobalType global = ConfigHandler.config.getGlobal(player.getServerWorld(), perm); Config.GlobalType global = ConfigHandler.config.getGlobal(player.getLevel(), perm);
if (!global.canModify()) { if (!global.canModify()) {
Text text = ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenUneditable, Formatting.DARK_RED); Component text = ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenUneditable, ChatFormatting.DARK_RED);
lore.add(StringTag.of(Text.Serializer.toJson(text))); lore.add(StringTag.valueOf(Component.Serializer.toJson(text)));
String permFlag = String.valueOf(global.getValue()); String permFlag = String.valueOf(global.getValue());
Text text2 = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? Formatting.GREEN : Formatting.RED); Component text2 = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? ChatFormatting.GREEN : ChatFormatting.RED);
lore.add(StringTag.of(Text.Serializer.toJson(text2))); lore.add(StringTag.valueOf(Component.Serializer.toJson(text2)));
} else { } else {
String permFlag; String permFlag;
Map<ClaimPermission, Boolean> map = PlayerClaimData.get(player).playerDefaultGroups().getOrDefault(group, new HashMap<>()); Map<ClaimPermission, Boolean> map = PlayerClaimData.get(player).playerDefaultGroups().getOrDefault(group, new HashMap<>());
@ -107,31 +107,31 @@ public class ServerScreenHelper {
permFlag = map.get(perm) ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse; permFlag = map.get(perm) ? ConfigHandler.lang.screenTrue : ConfigHandler.lang.screenFalse;
else else
permFlag = ConfigHandler.lang.screenDefault; permFlag = ConfigHandler.lang.screenDefault;
Text text = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? Formatting.GREEN : Formatting.RED); Component text = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals(ConfigHandler.lang.screenTrue) ? ChatFormatting.GREEN : ChatFormatting.RED);
lore.add(StringTag.of(Text.Serializer.toJson(text))); lore.add(StringTag.valueOf(Component.Serializer.toJson(text)));
} }
stack.getOrCreateSubTag("display").put("Lore", lore); stack.getOrCreateTagElement("display").put("Lore", lore);
return stack; return stack;
} }
public static void playSongToPlayer(ServerPlayerEntity player, SoundEvent event, float vol, float pitch) { public static void playSongToPlayer(ServerPlayer player, SoundEvent event, float vol, float pitch) {
player.networkHandler.sendPacket( player.connection.send(
new PlaySoundS2CPacket(event, SoundCategory.PLAYERS, player.getPos().x, player.getPos().y, player.getPos().z, vol, pitch)); new ClientboundSoundPacket(event, SoundSource.PLAYERS, player.position().x, player.position().y, player.position().z, vol, pitch));
} }
public static Text coloredGuiText(String text, Formatting... formattings) { public static Component coloredGuiText(String text, ChatFormatting... formattings) {
return new LiteralText(text).setStyle(Style.EMPTY.withItalic(false).withFormatting(formattings)); return new TextComponent(text).setStyle(Style.EMPTY.withItalic(false).applyFormats(formattings));
} }
public static void addLore(ItemStack stack, Text text) { public static void addLore(ItemStack stack, Component text) {
ListTag lore = new ListTag(); ListTag lore = new ListTag();
lore.add(StringTag.of(Text.Serializer.toJson(text))); lore.add(StringTag.valueOf(Component.Serializer.toJson(text)));
stack.getOrCreateSubTag("display").put("Lore", lore); stack.getOrCreateTagElement("display").put("Lore", lore);
} }
public static void addLore(ItemStack stack, List<Text> texts) { public static void addLore(ItemStack stack, List<Component> texts) {
ListTag lore = new ListTag(); ListTag lore = new ListTag();
texts.forEach(text -> lore.add(StringTag.of(Text.Serializer.toJson(text)))); texts.forEach(text -> lore.add(StringTag.valueOf(Component.Serializer.toJson(text))));
stack.getOrCreateSubTag("display").put("Lore", lore); stack.getOrCreateTagElement("display").put("Lore", lore);
} }
} }

View File

@ -2,28 +2,29 @@ package io.github.flemmli97.flan.gui;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.entity.player.PlayerEntity; import io.github.flemmli97.flan.mixin.AbstractContainerAccessor;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.network.chat.Component;
import net.minecraft.item.ItemStack; import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket;
import net.minecraft.item.Items; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.network.packet.s2c.play.ExperienceBarUpdateS2CPacket; import net.minecraft.world.MenuProvider;
import net.minecraft.screen.AnvilScreenHandler; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.world.entity.player.Player;
import net.minecraft.screen.ScreenHandler; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.screen.ScreenHandlerListener; import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.inventory.ClickType;
import net.minecraft.screen.slot.SlotActionType; import net.minecraft.world.inventory.ContainerListener;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.inventory.Slot;
import net.minecraft.text.Text; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
public class StringResultScreenHandler extends AnvilScreenHandler { public class StringResultScreenHandler extends AnvilMenu {
private final List<ScreenHandlerListener> listeners = new ArrayList<>(); private final List<ContainerListener> listeners = new ArrayList<>();
private final Consumer<String> cons; private final Consumer<String> cons;
private final Runnable ret; private final Runnable ret;
@ -31,119 +32,119 @@ public class StringResultScreenHandler extends AnvilScreenHandler {
private boolean init; private boolean init;
private String name; private String name;
private StringResultScreenHandler(int syncId, PlayerInventory playerInventory, Consumer<String> cons, Runnable ret) { private StringResultScreenHandler(int syncId, Inventory playerInventory, Consumer<String> cons, Runnable ret) {
super(syncId, playerInventory); super(syncId, playerInventory);
ItemStack stack = new ItemStack(Items.PAPER); ItemStack stack = new ItemStack(Items.PAPER);
stack.setCustomName(PermHelper.simpleColoredText("")); stack.setHoverName(PermHelper.simpleColoredText(""));
this.input.setStack(0, stack); this.inputSlots.setItem(0, stack);
ItemStack out = new ItemStack(Items.BOOK); ItemStack out = new ItemStack(Items.BOOK);
out.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.stringScreenReturn)); out.setHoverName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.stringScreenReturn));
this.output.setStack(0, out); this.resultSlots.setItem(0, out);
this.cons = cons; this.cons = cons;
this.ret = ret; this.ret = ret;
} }
public static void createNewStringResult(PlayerEntity player, Consumer<String> cons, Runnable ret) { public static void createNewStringResult(Player player, Consumer<String> cons, Runnable ret) {
NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { MenuProvider fac = new MenuProvider() {
@Override @Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player player) {
return new StringResultScreenHandler(syncId, inv, cons, ret); return new StringResultScreenHandler(syncId, inv, cons, ret);
} }
@Override @Override
public Text getDisplayName() { public Component getDisplayName() {
return PermHelper.simpleColoredText(""); return PermHelper.simpleColoredText("");
} }
}; };
player.openHandledScreen(fac); player.openMenu(fac);
} }
@Override @Override
public boolean canUse(PlayerEntity player) { public boolean stillValid(Player player) {
return true; return true;
} }
@Override @Override
protected boolean canTakeOutput(PlayerEntity player, boolean present) { protected boolean mayPickup(Player player, boolean present) {
return true; return true;
} }
@Override @Override
public ItemStack onSlotClick(int i, int j, SlotActionType actionType, PlayerEntity playerEntity) { public void clicked(int i, int j, ClickType actionType, Player playerEntity) {
if (i < 0 || !(playerEntity instanceof ServerPlayerEntity)) if (i < 0 || !(playerEntity instanceof ServerPlayer))
return ItemStack.EMPTY; return;
ServerPlayerEntity player = (ServerPlayerEntity) playerEntity; ServerPlayer player = (ServerPlayer) playerEntity;
Slot slot = this.slots.get(i); Slot slot = this.slots.get(i);
if (((AbstractContainerAccessor) this).containerSync() != null)
((AbstractContainerAccessor) this).containerSync().sendCarriedChange(this, this.getCarried().copy());
if (i == 0) if (i == 0)
this.ret.run(); this.ret.run();
else if (i == 2) { else if (i == 2) {
String s = slot.getStack().hasCustomName() ? slot.getStack().getName().asString() : ""; String s = slot.getItem().hasCustomHoverName() ? slot.getItem().getHoverName().getContents() : "";
if (!s.isEmpty() && !s.equals(ConfigHandler.lang.stringScreenReturn)) { if (!s.isEmpty() && !s.equals(ConfigHandler.lang.stringScreenReturn)) {
this.cons.accept(s); this.cons.accept(s);
} }
player.networkHandler.sendPacket(new ExperienceBarUpdateS2CPacket(player.experienceProgress, player.totalExperience, player.experienceLevel)); player.connection.send(new ClientboundSetExperiencePacket(player.experienceProgress, player.totalExperience, player.experienceLevel));
} }
this.sendContentUpdates(); this.broadcastChanges();
player.updateCursorStack();
return slot.getStack();
} }
@Override @Override
public ItemStack transferSlot(PlayerEntity player, int index) { public ItemStack quickMoveStack(Player player, int index) {
if (!(player instanceof ServerPlayerEntity)) if (!(player instanceof ServerPlayer))
return ItemStack.EMPTY; return ItemStack.EMPTY;
if (index == 0) if (index == 0)
this.ret.run(); this.ret.run();
else if (index == 2) { else if (index == 2) {
Slot slot = this.slots.get(index); Slot slot = this.slots.get(index);
String s = slot.getStack().hasCustomName() ? slot.getStack().getName().asString() : ""; String s = slot.getItem().hasCustomHoverName() ? slot.getItem().getHoverName().getContents() : "";
if (!s.isEmpty() && !s.equals(ConfigHandler.lang.stringScreenReturn)) if (!s.isEmpty() && !s.equals(ConfigHandler.lang.stringScreenReturn))
this.cons.accept(s); this.cons.accept(s);
((ServerPlayerEntity) player).networkHandler.sendPacket(new ExperienceBarUpdateS2CPacket(player.experienceProgress, player.totalExperience, player.experienceLevel)); ((ServerPlayer) player).connection.send(new ClientboundSetExperiencePacket(player.experienceProgress, player.totalExperience, player.experienceLevel));
} }
this.sendContentUpdates(); this.broadcastChanges();
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
/*
@Override @Override
public void addListener(ScreenHandlerListener listener) { public void addSlotListener(ContainerListener listener) {
if (!this.listeners.contains(listener)) { if (!this.listeners.contains(listener)) {
this.listeners.add(listener); this.listeners.add(listener);
listener.onHandlerRegistered(this, this.getStacks()); listener.refreshContainer(this, this.getItems());
this.sendContentUpdates(); this.broadcastChanges();
}
} }
}*/
@Override @Override
public void sendContentUpdates() { public void broadcastChanges() {
int j; int j;
for (j = 0; j < this.slots.size(); ++j) { for (j = 0; j < this.slots.size(); ++j) {
ItemStack itemStack = this.slots.get(j).getStack(); ItemStack itemStack = this.slots.get(j).getItem();
for (ScreenHandlerListener screenHandlerListener : this.listeners) { for (ContainerListener screenHandlerListener : this.listeners) {
screenHandlerListener.onSlotUpdate(this, j, itemStack.copy()); screenHandlerListener.slotChanged(this, j, itemStack.copy());
} }
} }
} }
@Override @Override
public void updateResult() { public void createResult() {
if (!this.init) if (!this.init)
this.init = true; this.init = true;
else { else {
ItemStack out = this.slots.get(2).getStack(); ItemStack out = this.slots.get(2).getItem();
if (StringUtils.isBlank(this.name)) if (StringUtils.isBlank(this.name))
out.removeCustomName(); out.resetHoverName();
else if (!this.name.equals(out.getName().getString())) { else if (!this.name.equals(out.getHoverName().getString())) {
out.setCustomName(ServerScreenHelper.coloredGuiText(this.name)); out.setHoverName(ServerScreenHelper.coloredGuiText(this.name));
} }
} }
this.sendContentUpdates(); this.broadcastChanges();
} }
@Override @Override
public void setNewItemName(String string) { public void setItemName(String string) {
this.name = string; this.name = string;
this.updateResult(); this.createResult();
} }
} }

View File

@ -1,6 +1,6 @@
package io.github.flemmli97.flan.gui.inv; package io.github.flemmli97.flan.gui.inv;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
/** /**
* This ensures that other mods will never be able to modify and get items from the inventory. * This ensures that other mods will never be able to modify and get items from the inventory.

View File

@ -1,71 +1,71 @@
package io.github.flemmli97.flan.gui.inv; package io.github.flemmli97.flan.gui.inv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.SimpleContainer;
import net.minecraft.inventory.SimpleInventory; import net.minecraft.world.entity.player.Player;
import net.minecraft.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class SeparateInvImpl extends SimpleInventory implements SeparateInv { public class SeparateInvImpl extends SimpleContainer implements SeparateInv {
public SeparateInvImpl(int size) { public SeparateInvImpl(int size) {
super(size); super(size);
} }
@Override @Override
public ItemStack getStack(int slot) { public ItemStack getItem(int slot) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
public List<ItemStack> clearToList() { public List<ItemStack> removeAllItems() {
return new ArrayList<>(); return new ArrayList<>();
} }
@Override @Override
public ItemStack removeStack(int slot, int amount) { public ItemStack removeItem(int slot, int amount) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
public ItemStack removeItem(Item item, int count) { public ItemStack removeItemType(Item item, int count) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
public ItemStack addStack(ItemStack stack) { public ItemStack addItem(ItemStack stack) {
return stack; return stack;
} }
@Override @Override
public boolean canInsert(ItemStack stack) { public boolean canAddItem(ItemStack stack) {
return false; return false;
} }
@Override @Override
public ItemStack removeStack(int slot) { public ItemStack removeItemNoUpdate(int slot) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
public void setStack(int slot, ItemStack stack) { public void setItem(int slot, ItemStack stack) {
} }
@Override @Override
public boolean canPlayerUse(PlayerEntity player) { public boolean stillValid(Player player) {
return false; return false;
} }
@Override @Override
public void updateStack(int slot, ItemStack stack) { public void updateStack(int slot, ItemStack stack) {
super.setStack(slot, stack); super.setItem(slot, stack);
} }
@Override @Override
public ItemStack getActualStack(int slot) { public ItemStack getActualStack(int slot) {
return super.getStack(slot); return super.getItem(slot);
} }
} }

View File

@ -1,8 +1,8 @@
package io.github.flemmli97.flan.gui.inv; package io.github.flemmli97.flan.gui.inv;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import net.minecraft.item.ItemStack; import net.minecraft.world.inventory.Slot;
import net.minecraft.screen.slot.Slot; import net.minecraft.world.item.ItemStack;
public class SlotDelegate extends Slot { public class SlotDelegate extends Slot {
@ -14,22 +14,22 @@ public class SlotDelegate extends Slot {
} }
@Override @Override
public void setStack(ItemStack stack) { public void set(ItemStack stack) {
((SeparateInvImpl) this.inventory).updateStack(this.index, stack); ((SeparateInvImpl) this.container).updateStack(this.index, stack);
} }
@Override @Override
public ItemStack getStack() { public ItemStack getItem() {
return ((SeparateInvImpl) this.inventory).getActualStack(this.index); return ((SeparateInvImpl) this.container).getActualStack(this.index);
} }
@Override @Override
public boolean canInsert(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
return false; return false;
} }
@Override @Override
public boolean canTakeItems(PlayerEntity playerEntity) { public boolean mayPickup(Player playerEntity) {
return false; return false;
} }
} }

View File

@ -2,18 +2,18 @@ package io.github.flemmli97.flan.integration.currency;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import me.shedaniel.architectury.annotations.ExpectPlatform; import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.commands.CommandSourceStack;
public class CommandCurrency { public class CommandCurrency {
@ExpectPlatform @ExpectPlatform
public static int sellClaimBlocks(CommandContext<ServerCommandSource> context) throws CommandSyntaxException { public static int sellClaimBlocks(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
throw new AssertionError(); throw new AssertionError();
} }
@ExpectPlatform @ExpectPlatform
public static int buyClaimBlocks(CommandContext<ServerCommandSource> context) throws CommandSyntaxException { public static int buyClaimBlocks(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
throw new AssertionError(); throw new AssertionError();
} }
} }

View File

@ -1,8 +1,8 @@
package io.github.flemmli97.flan.integration.permissions; package io.github.flemmli97.flan.integration.permissions;
import me.shedaniel.architectury.annotations.ExpectPlatform; import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
public class PermissionNodeHandler { public class PermissionNodeHandler {
@ -47,22 +47,22 @@ public class PermissionNodeHandler {
public static final String permClaimBlocks = "flan.claim.blocks.max"; public static final String permClaimBlocks = "flan.claim.blocks.max";
public static final String permMaxClaims = "flan.claims.amount"; public static final String permMaxClaims = "flan.claims.amount";
public static boolean perm(ServerCommandSource src, String perm) { public static boolean perm(CommandSourceStack src, String perm) {
return perm(src, perm, false); return perm(src, perm, false);
} }
@ExpectPlatform @ExpectPlatform
public static boolean perm(ServerCommandSource src, String perm, boolean adminCmd) { public static boolean perm(CommandSourceStack src, String perm, boolean adminCmd) {
throw new AssertionError(); throw new AssertionError();
} }
@ExpectPlatform @ExpectPlatform
public static boolean perm(ServerPlayerEntity src, String perm, boolean adminCmd) { public static boolean perm(ServerPlayer src, String perm, boolean adminCmd) {
throw new AssertionError(); throw new AssertionError();
} }
@ExpectPlatform @ExpectPlatform
public static boolean permBelowEqVal(ServerPlayerEntity src, String perm, int val, int fallback) { public static boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) {
throw new AssertionError(); throw new AssertionError();
} }
} }

View File

@ -1,15 +1,15 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.BlockInteractEvents; import io.github.flemmli97.flan.event.BlockInteractEvents;
import net.minecraft.block.AbstractBlock; import net.minecraft.core.BlockPos;
import net.minecraft.block.BlockState; import net.minecraft.world.InteractionHand;
import net.minecraft.entity.Entity; import net.minecraft.world.InteractionResult;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.Entity;
import net.minecraft.util.ActionResult; import net.minecraft.world.entity.player.Player;
import net.minecraft.util.Hand; import net.minecraft.world.level.Level;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.World; import net.minecraft.world.phys.BlockHitResult;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -17,12 +17,12 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(AbstractBlock.AbstractBlockState.class) @Mixin(BlockBehaviour.BlockStateBase.class)
public abstract class AbstractBlockStateMixin { public abstract class AbstractBlockStateMixin {
@Inject(method = "onEntityCollision", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "entityInside", at = @At(value = "HEAD"), cancellable = true)
private void collision(World world, BlockPos pos, Entity entity, CallbackInfo info) { private void collision(Level world, BlockPos pos, Entity entity, CallbackInfo info) {
if (BlockInteractEvents.cancelEntityBlockCollision(this.asBlockState(), world, pos, entity)) { if (BlockInteractEvents.cancelEntityBlockCollision(this.asState(), world, pos, entity)) {
info.cancel(); info.cancel();
} }
} }
@ -31,15 +31,15 @@ public abstract class AbstractBlockStateMixin {
* Can't use the hooks from both fabric or forge cause they are too generic. * Can't use the hooks from both fabric or forge cause they are too generic.
* Wouldn't be able to place blocks after cancelling them * Wouldn't be able to place blocks after cancelling them
*/ */
@Inject(method = "onUse", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "use", at = @At(value = "HEAD"), cancellable = true)
private void useBlock(World world, PlayerEntity player, Hand hand, BlockHitResult result, CallbackInfoReturnable<ActionResult> info) { private void useBlock(Level world, Player player, InteractionHand hand, BlockHitResult result, CallbackInfoReturnable<InteractionResult> info) {
ActionResult res = BlockInteractEvents.useBlocks(player, world, hand, result); InteractionResult res = BlockInteractEvents.useBlocks(player, world, hand, result);
if (res != ActionResult.PASS) { if (res != InteractionResult.PASS) {
info.setReturnValue(res); info.setReturnValue(res);
info.cancel(); info.cancel();
} }
} }
@Shadow @Shadow
protected abstract BlockState asBlockState(); protected abstract BlockState asState();
} }

View File

@ -0,0 +1,20 @@
package io.github.flemmli97.flan.mixin;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerListener;
import net.minecraft.world.inventory.ContainerSynchronizer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
@Mixin(AbstractContainerMenu.class)
public interface AbstractContainerAccessor {
@Accessor("containerListeners")
List<ContainerListener> listeners();
@Accessor("synchronizer")
ContainerSynchronizer containerSync();
}

View File

@ -1,14 +1,14 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import net.minecraft.server.BanEntry; import net.minecraft.server.players.BanListEntry;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Date; import java.util.Date;
@Mixin(BanEntry.class) @Mixin(BanListEntry.class)
public interface BannedEntryAccessor { public interface BannedEntryAccessor {
@Accessor("creationDate") @Accessor("created")
Date getCreationDate(); Date getCreationDate();
} }

View File

@ -1,23 +1,23 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.core.BlockPos;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.monster.EnderMan;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Mixin(targets = "net/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal") @Mixin(targets = "net/minecraft/world/entity/monster/EnderMan$EndermanTakeBlockGoal")
public abstract class EndermanPickupMixin { public abstract class EndermanPickupMixin {
@Shadow @Shadow
private EndermanEntity enderman; private EnderMan enderman;
@ModifyVariable(method = "Lnet/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal;tick()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;"), ordinal = 0) @ModifyVariable(method = "Lnet/minecraft/world/entity/monster/EnderMan$EndermanTakeBlockGoal;tick()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;"), ordinal = 0)
private BlockPos pickupCheck(BlockPos pos) { private BlockPos pickupCheck(BlockPos pos) {
if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) { if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) {
return BlockPos.ORIGIN; return BlockPos.ZERO;
} }
return pos; return pos;
} }

View File

@ -1,24 +1,24 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.world.entity.monster.EnderMan;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.Level;
import net.minecraft.world.World; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(targets = "net/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal") @Mixin(targets = "net/minecraft/world/entity/monster/EnderMan$EndermanLeaveBlockGoal")
public abstract class EndermanPlaceMixin { public abstract class EndermanPlaceMixin {
@Shadow @Shadow
private EndermanEntity enderman; private EnderMan enderman;
@Inject(method = "Lnet/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal;canPlaceOn(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)Z", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "Lnet/minecraft/world/entity/monster/EnderMan$EndermanLeaveBlockGoal;canPlaceBlock(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;)Z", at = @At(value = "HEAD"), cancellable = true)
private void placeCheck(World world, BlockPos posAbove, BlockState carriedState, BlockState stateAbove, BlockState state, BlockPos pos, CallbackInfoReturnable<Boolean> info) { private void placeCheck(Level world, BlockPos posAbove, BlockState carriedState, BlockState stateAbove, BlockState state, BlockPos pos, CallbackInfoReturnable<Boolean> info) {
if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) { if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) {
info.setReturnValue(false); info.setReturnValue(false);
info.cancel(); info.cancel();

View File

@ -1,9 +1,9 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.BlockInteractEvents; import io.github.flemmli97.flan.event.BlockInteractEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Entity.class) @Mixin(Entity.class)
public abstract class EntityMixin { public abstract class EntityMixin {
@Inject(method = "fall", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;onLandedUpon(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/Entity;F)V"), cancellable = true) @Inject(method = "checkFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/Block;fallOn(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/Entity;F)V"), cancellable = true)
private void fallOnBlock(double heightDifference, boolean onGround, BlockState landedState, BlockPos landedPosition, CallbackInfo info) { private void fallOnBlock(double heightDifference, boolean onGround, BlockState landedState, BlockPos landedPosition, CallbackInfo info) {
if (BlockInteractEvents.preventFallOn((Entity) (Object) this, heightDifference, onGround, landedState, landedPosition)) if (BlockInteractEvents.preventFallOn((Entity) (Object) this, heightDifference, onGround, landedState, landedPosition))
info.cancel(); info.cancel();

View File

@ -1,11 +1,11 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.block.FireBlock; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.level.LevelReader;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.block.FireBlock;
import net.minecraft.world.WorldView; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -17,16 +17,22 @@ import java.util.Random;
@Mixin(FireBlock.class) @Mixin(FireBlock.class)
public abstract class FireBlockMixin { public abstract class FireBlockMixin {
@Inject(method = "scheduledTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getGameRules()Lnet/minecraft/world/GameRules;"), cancellable = true) /**
private void tick(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo info) { * Stop ticking overall if fire is in claim
*/
@Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;getGameRules()Lnet/minecraft/world/level/GameRules;"), cancellable = true)
private void tick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) {
if (!WorldEvents.canFireSpread(world, pos)) { if (!WorldEvents.canFireSpread(world, pos)) {
info.cancel(); info.cancel();
} }
} }
@Inject(method = "getBurnChance(Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "HEAD"), cancellable = true) /**
private void burn(WorldView worldView, BlockPos pos, CallbackInfoReturnable<Integer> info) { * Check if fire can spread to this block
if (worldView instanceof ServerWorld && !WorldEvents.canFireSpread((ServerWorld) worldView, pos)) { */
@Inject(method = "getFireOdds", at = @At(value = "HEAD"), cancellable = true)
private void burn(LevelReader worldView, BlockPos pos, CallbackInfoReturnable<Integer> info) {
if (worldView instanceof ServerLevel && !WorldEvents.canFireSpread((ServerLevel) worldView, pos)) {
info.setReturnValue(0); info.setReturnValue(0);
info.cancel(); info.cancel();
} }

View File

@ -1,23 +1,23 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.fluid.FlowableFluid; import net.minecraft.core.Direction;
import net.minecraft.fluid.Fluid; import net.minecraft.world.level.BlockGetter;
import net.minecraft.fluid.FluidState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.util.math.Direction; import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.BlockView; import net.minecraft.world.level.material.FluidState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(FlowableFluid.class) @Mixin(FlowingFluid.class)
public abstract class FluidMixin { public abstract class FluidMixin {
@Inject(method = "canFlow", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "canSpreadTo", at = @At(value = "HEAD"), cancellable = true)
private void crossClaimFlow(BlockView world, BlockPos fluidPos, BlockState fluidBlockState, Direction flowDirection, BlockPos flowTo, private void crossClaimFlow(BlockGetter world, BlockPos fluidPos, BlockState fluidBlockState, Direction flowDirection, BlockPos flowTo,
BlockState flowToBlockState, FluidState fluidState, Fluid fluid, CallbackInfoReturnable<Boolean> info) { BlockState flowToBlockState, FluidState fluidState, Fluid fluid, CallbackInfoReturnable<Boolean> info) {
if (!WorldEvents.canFlow(fluidBlockState, world, fluidPos, flowDirection)) { if (!WorldEvents.canFlow(fluidBlockState, world, fluidPos, flowDirection)) {
info.setReturnValue(false); info.setReturnValue(false);

View File

@ -1,12 +1,12 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.enchantment.FrostWalkerEnchantment; import net.minecraft.server.level.ServerLevel;
import net.minecraft.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.item.enchantment.FrostWalkerEnchantment;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.WorldView; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
@ -14,10 +14,10 @@ import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(FrostWalkerEnchantment.class) @Mixin(FrostWalkerEnchantment.class)
public abstract class FrostWalkerMixin { public abstract class FrostWalkerMixin {
@Redirect(method = "freezeWater", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;canPlaceAt(Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;)Z")) @Redirect(method = "onEntityMoved", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;canSurvive(Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z"))
private static boolean freeze(BlockState state, WorldView world, BlockPos pos, LivingEntity entity) { private static boolean freeze(BlockState state, LevelReader world, BlockPos pos, LivingEntity entity) {
if (world instanceof ServerWorld && !EntityInteractEvents.canFrostwalkerFreeze((ServerWorld) world, pos, entity)) if (world instanceof ServerLevel && !EntityInteractEvents.canFrostwalkerFreeze((ServerLevel) world, pos, entity))
return false; return false;
return state.canPlaceAt(world, pos); return state.canSurvive(world, pos);
} }
} }

View File

@ -1,12 +1,12 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import net.minecraft.entity.player.HungerManager; import net.minecraft.world.food.FoodData;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(HungerManager.class) @Mixin(FoodData.class)
public interface IHungerAccessor { public interface IHungerAccessor {
@Accessor("foodSaturationLevel") @Accessor("saturationLevel")
void setSaturation(float saturation); void setSaturation(float saturation);
} }

View File

@ -1,18 +1,18 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import net.minecraft.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.level.ClipContext;
import net.minecraft.world.RaycastContext; import net.minecraft.world.level.Level;
import net.minecraft.world.World; import net.minecraft.world.phys.BlockHitResult;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(Item.class) @Mixin(Item.class)
public interface IItemAccessor { public interface IItemAccessor {
@Invoker("raycast") @Invoker("getPlayerPOVHitResult")
static BlockHitResult getRaycast(World world, PlayerEntity player, RaycastContext.FluidHandling fluidHandling) { static BlockHitResult getRaycast(Level world, Player player, ClipContext.Fluid fluidHandling) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
} }

View File

@ -1,17 +1,17 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import net.minecraft.block.entity.LecternBlockEntity; import net.minecraft.world.Container;
import net.minecraft.inventory.Inventory; import net.minecraft.world.inventory.ContainerData;
import net.minecraft.screen.PropertyDelegate; import net.minecraft.world.level.block.entity.LecternBlockEntity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(LecternBlockEntity.class) @Mixin(LecternBlockEntity.class)
public interface ILecternBlockValues { public interface ILecternBlockValues {
@Accessor("inventory") @Accessor("bookAccess")
Inventory getInv(); Container getInv();
@Accessor("propertyDelegate") @Accessor("dataAccess")
PropertyDelegate getProp(); ContainerData getProp();
} }

View File

@ -1,31 +1,31 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import net.minecraft.block.BlockState; import net.minecraft.sounds.SoundEvent;
import net.minecraft.entity.projectile.PersistentProjectileEntity; import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.sound.SoundEvent; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(PersistentProjectileEntity.class) @Mixin(AbstractArrow.class)
public interface IPersistentProjectileVars { public interface IPersistentProjectileVars {
@Accessor("inBlockState") @Accessor("lastState")
void setInBlockState(BlockState state); void setInBlockState(BlockState state);
@Accessor("inGround") @Accessor("inGround")
void setInGround(boolean flag); void setInGround(boolean flag);
@Invoker("getSound") @Invoker("getHitGroundSoundEvent")
SoundEvent getSoundEvent(); SoundEvent getSoundEvent();
@Invoker("clearPiercingStatus") @Invoker("resetPiercedEntities")
void resetPiercingStatus(); void resetPiercingStatus();
@Accessor("piercedEntities") @Accessor("piercingIgnoreEntityIds")
IntOpenHashSet getPiercedEntities(); IntOpenHashSet getPiercedEntities();
@Accessor("piercedEntities") @Accessor("piercingIgnoreEntityIds")
void setPiercedEntities(IntOpenHashSet set); void setPiercedEntities(IntOpenHashSet set);
} }

View File

@ -2,10 +2,10 @@ package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.player.IOwnedItem; import io.github.flemmli97.flan.player.IOwnedItem;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -22,22 +22,22 @@ public abstract class ItemEntityMixin implements IOwnedItem {
@Unique @Unique
private UUID flanDeathPlayerOrigin; private UUID flanDeathPlayerOrigin;
@Inject(method = "readCustomDataFromTag", at = @At("RETURN")) @Inject(method = "readAdditionalSaveData", at = @At("RETURN"))
private void readData(CompoundTag tag, CallbackInfo info) { private void readData(CompoundTag tag, CallbackInfo info) {
if (tag.contains("Flan:PlayerOrigin")) if (tag.contains("Flan:PlayerOrigin"))
this.flanPlayerOrigin = tag.getUuid("Flan:PlayerOrigin"); this.flanPlayerOrigin = tag.getUUID("Flan:PlayerOrigin");
} }
@Inject(method = "writeCustomDataToTag", at = @At("RETURN")) @Inject(method = "addAdditionalSaveData", at = @At("RETURN"))
private void writeData(CompoundTag tag, CallbackInfo info) { private void writeData(CompoundTag tag, CallbackInfo info) {
if (this.flanPlayerOrigin != null) if (this.flanPlayerOrigin != null)
tag.putUuid("Flan:PlayerOrigin", this.flanPlayerOrigin); tag.putUUID("Flan:PlayerOrigin", this.flanPlayerOrigin);
} }
@Override @Override
public void setOriginPlayer(PlayerEntity player) { public void setOriginPlayer(Player player) {
this.flanPlayerOrigin = player.getUuid(); this.flanPlayerOrigin = player.getUUID();
if (player instanceof ServerPlayerEntity && PlayerClaimData.get((ServerPlayerEntity) player).setDeathItemOwner()) if (player instanceof ServerPlayer && PlayerClaimData.get((ServerPlayer) player).setDeathItemOwner())
this.flanDeathPlayerOrigin = this.flanPlayerOrigin; this.flanDeathPlayerOrigin = this.flanPlayerOrigin;
} }

View File

@ -1,9 +1,9 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.ItemInteractEvents; import io.github.flemmli97.flan.event.ItemInteractEvents;
import net.minecraft.item.ItemStack; import net.minecraft.world.InteractionResult;
import net.minecraft.item.ItemUsageContext; import net.minecraft.world.item.ItemStack;
import net.minecraft.util.ActionResult; import net.minecraft.world.item.context.UseOnContext;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -12,10 +12,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ItemStack.class) @Mixin(ItemStack.class)
public abstract class ItemStackMixin { public abstract class ItemStackMixin {
@Inject(method = "useOnBlock", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "useOn", at = @At(value = "HEAD"), cancellable = true)
private void blockUse(ItemUsageContext context, CallbackInfoReturnable<ActionResult> info) { private void blockUse(UseOnContext context, CallbackInfoReturnable<InteractionResult> info) {
ActionResult result = ItemInteractEvents.onItemUseBlock(context); InteractionResult result = ItemInteractEvents.onItemUseBlock(context);
if (result != ActionResult.PASS) { if (result != InteractionResult.PASS) {
info.setReturnValue(result); info.setReturnValue(result);
info.cancel(); info.cancel();
} }

View File

@ -1,18 +1,18 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.entity.LightningEntity; import net.minecraft.world.entity.LightningBolt;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LightningEntity.class) @Mixin(LightningBolt.class)
public abstract class LightningFireEntityMixin { public abstract class LightningFireEntityMixin {
@Inject(method = "spawnFire", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "spawnFire", at = @At(value = "HEAD"), cancellable = true)
private void stopFire(int attempts, CallbackInfo info) { private void stopFire(int attempts, CallbackInfo info) {
if (!WorldEvents.lightningFire((LightningEntity) (Object) this)) if (!WorldEvents.lightningFire((LightningBolt) (Object) this))
info.cancel(); info.cancel();
} }
} }

View File

@ -4,7 +4,7 @@ import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.player.IPlayerClaimImpl; import io.github.flemmli97.flan.player.IPlayerClaimImpl;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerPlayerEntity.class) @Mixin(ServerPlayer.class)
public abstract class PlayerClaimMixin implements IPlayerClaimImpl { public abstract class PlayerClaimMixin implements IPlayerClaimImpl {
@Unique @Unique
@ -26,7 +26,7 @@ public abstract class PlayerClaimMixin implements IPlayerClaimImpl {
@Inject(method = "<init>*", at = @At("RETURN")) @Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) { private void initData(CallbackInfo info) {
this.flanClaimData = new PlayerClaimData((ServerPlayerEntity) (Object) this); this.flanClaimData = new PlayerClaimData((ServerPlayer) (Object) this);
} }
/*@Inject(method = "readCustomDataFromTag", at = @At("RETURN")) /*@Inject(method = "readCustomDataFromTag", at = @At("RETURN"))
@ -44,8 +44,8 @@ public abstract class PlayerClaimMixin implements IPlayerClaimImpl {
this.flanClaimData.tick(this.flanCurrentClaim, claim -> this.flanCurrentClaim = claim); this.flanClaimData.tick(this.flanCurrentClaim, claim -> this.flanCurrentClaim = claim);
} }
@Inject(method = "copyFrom", at = @At("RETURN")) @Inject(method = "restoreFrom", at = @At("RETURN"))
private void copyOld(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo info) { private void copyOld(ServerPlayer oldPlayer, boolean alive, CallbackInfo info) {
this.flanClaimData.clone(PlayerClaimData.get(oldPlayer)); this.flanClaimData.clone(PlayerClaimData.get(oldPlayer));
} }

View File

@ -1,27 +1,27 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.entity.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(PlayerEntity.class) @Mixin(Player.class)
public abstract class PlayerMixin { public abstract class PlayerMixin {
@ModifyVariable(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;setPickupDelay(I)V")) @ModifyVariable(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/item/ItemEntity;setPickUpDelay(I)V"))
private ItemEntity ownerDrop(ItemEntity entity) { private ItemEntity ownerDrop(ItemEntity entity) {
EntityInteractEvents.updateDroppedItem((PlayerEntity) (Object) this, entity); EntityInteractEvents.updateDroppedItem((Player) (Object) this, entity);
return entity; return entity;
} }
@Inject(method = "collideWithEntity", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "touch", at = @At(value = "HEAD"), cancellable = true)
private void entityCollide(Entity entity, CallbackInfo info) { private void entityCollide(Entity entity, CallbackInfo info) {
if (!EntityInteractEvents.canCollideWith((PlayerEntity) (Object) this, entity)) { if (!EntityInteractEvents.canCollideWith((Player) (Object) this, entity)) {
info.cancel(); info.cancel();
} }
} }

View File

@ -1,19 +1,19 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.village.raid.Raid; import net.minecraft.world.entity.raid.Raid;
import net.minecraft.village.raid.RaidManager; import net.minecraft.world.entity.raid.Raids;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(RaidManager.class) @Mixin(Raids.class)
public abstract class RaidManagerMixin { public abstract class RaidManagerMixin {
@Inject(method = "startRaid", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "createOrExtendRaid", at = @At(value = "HEAD"), cancellable = true)
private void checkRaid(ServerPlayerEntity player, CallbackInfoReturnable<Raid> info) { private void checkRaid(ServerPlayer player, CallbackInfoReturnable<Raid> info) {
if (!WorldEvents.canStartRaid(player)) { if (!WorldEvents.canStartRaid(player)) {
info.setReturnValue(null); info.setReturnValue(null);
info.cancel(); info.cancel();

View File

@ -2,28 +2,28 @@ package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.claim.IClaimStorage; import io.github.flemmli97.flan.claim.IClaimStorage;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerWorld.class) @Mixin(ServerLevel.class)
public abstract class ServerWorldMixin implements IClaimStorage { public abstract class ServerWorldMixin implements IClaimStorage {
@Unique @Unique
private ClaimStorage flanClaimData; private ClaimStorage flanClaimData;
@Inject(method = "<init>*", at = @At("RETURN")) @Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) { private void initData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this); ServerLevel world = ((ServerLevel) (Object) this);
this.flanClaimData = new ClaimStorage(world.getServer(), world); this.flanClaimData = new ClaimStorage(world.getServer(), world);
} }
@Inject(method = "saveLevel()V", at = @At("RETURN")) @Inject(method = "saveLevelData", at = @At("RETURN"))
private void saveClaimData(CallbackInfo info) { private void saveClaimData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this); ServerLevel world = ((ServerLevel) (Object) this);
this.flanClaimData.save(world.getServer(), world.getRegistryKey()); this.flanClaimData.save(world.getServer(), world.dimension());
} }
@Override @Override

View File

@ -1,10 +1,11 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.event.BlockInteractEvents; import io.github.flemmli97.flan.event.BlockInteractEvents;
import net.minecraft.block.TurtleEggBlock; import net.minecraft.core.BlockPos;
import net.minecraft.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.Level;
import net.minecraft.world.World; import net.minecraft.world.level.block.TurtleEggBlock;
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -13,8 +14,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(TurtleEggBlock.class) @Mixin(TurtleEggBlock.class)
public abstract class TurtleEggMixin { public abstract class TurtleEggMixin {
@Inject(method = "onSteppedOn", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "destroyEgg", at = @At(value = "HEAD"), cancellable = true)
private void collision(World world, BlockPos pos, Entity entity, CallbackInfo info) { private void collision(Level world, BlockState blockState, BlockPos pos, Entity entity, int chance, CallbackInfo info) {
if (BlockInteractEvents.canBreakTurtleEgg(world, pos, entity)) { if (BlockInteractEvents.canBreakTurtleEgg(world, pos, entity)) {
info.cancel(); info.cancel();
} }

View File

@ -3,13 +3,12 @@ package io.github.flemmli97.flan.player;
import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.ParticleIndicators; import io.github.flemmli97.flan.claim.ParticleIndicators;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.core.particles.DustParticleOptions;
import net.minecraft.particle.DustParticleEffect; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.World;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
@ -28,7 +27,7 @@ public class ClaimDisplay {
private int[] prevDims; private int[] prevDims;
private final DustParticleEffect corner, middle; private final DustParticleOptions corner, middle;
public ClaimDisplay(Claim claim, EnumDisplayType type, int y) { public ClaimDisplay(Claim claim, EnumDisplayType type, int y) {
this.toDisplay = claim; this.toDisplay = claim;
@ -56,29 +55,29 @@ public class ClaimDisplay {
} }
} }
public boolean display(ServerPlayerEntity player, boolean remove) { public boolean display(ServerPlayer player, boolean remove) {
if (--this.displayTime % 2 == 0) if (--this.displayTime % 2 == 0)
return this.toDisplay.isRemoved(); return this.toDisplay.isRemoved();
int[] dims = this.toDisplay.getDimensions(); int[] dims = this.toDisplay.getDimensions();
if (this.poss == null || this.changed(dims)) { if (this.poss == null || this.changed(dims)) {
this.middlePoss = calculateDisplayPos(player.getServerWorld(), dims, this.height); this.middlePoss = calculateDisplayPos(player.getLevel(), dims, this.height);
this.poss = new int[][]{ this.poss = new int[][]{
getPosFrom(player.getServerWorld(), dims[0], dims[2], this.height), getPosFrom(player.getLevel(), dims[0], dims[2], this.height),
getPosFrom(player.getServerWorld(), dims[1], dims[2], this.height), getPosFrom(player.getLevel(), dims[1], dims[2], this.height),
getPosFrom(player.getServerWorld(), dims[0], dims[3], this.height), getPosFrom(player.getLevel(), dims[0], dims[3], this.height),
getPosFrom(player.getServerWorld(), dims[1], dims[3], this.height), getPosFrom(player.getLevel(), dims[1], dims[3], this.height),
}; };
} }
for (int[] pos : this.poss) { for (int[] pos : this.poss) {
if (pos[1] != pos[2]) if (pos[1] != pos[2])
player.networkHandler.sendPacket(new ParticleS2CPacket(this.corner, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); player.connection.send(new ClientboundLevelParticlesPacket(this.corner, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
player.networkHandler.sendPacket(new ParticleS2CPacket(this.corner, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); player.connection.send(new ClientboundLevelParticlesPacket(this.corner, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
} }
if (this.middlePoss != null) if (this.middlePoss != null)
for (int[] pos : this.middlePoss) { for (int[] pos : this.middlePoss) {
if (pos[1] != pos[2]) if (pos[1] != pos[2])
player.networkHandler.sendPacket(new ParticleS2CPacket(this.middle, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); player.connection.send(new ClientboundLevelParticlesPacket(this.middle, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
player.networkHandler.sendPacket(new ParticleS2CPacket(this.middle, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); player.connection.send(new ClientboundLevelParticlesPacket(this.middle, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
} }
this.prevDims = dims; this.prevDims = dims;
return this.toDisplay.isRemoved() || (remove && this.displayTime < 0); return this.toDisplay.isRemoved() || (remove && this.displayTime < 0);
@ -91,7 +90,7 @@ public class ClaimDisplay {
return false; return false;
} }
public static int[][] calculateDisplayPos(ServerWorld world, int[] from, int height) { public static int[][] calculateDisplayPos(ServerLevel world, int[] from, int height) {
List<int[]> l = new ArrayList<>(); List<int[]> l = new ArrayList<>();
Set<Integer> xs = new HashSet<>(); Set<Integer> xs = new HashSet<>();
addEvenly(from[0], from[1], 10, xs); addEvenly(from[0], from[1], 10, xs);
@ -131,37 +130,37 @@ public class ClaimDisplay {
* Returns an array of of form [x,y1,y2,z] where y1 = height of the lowest replaceable block and y2 = height of the * Returns an array of of form [x,y1,y2,z] where y1 = height of the lowest replaceable block and y2 = height of the
* lowest air block above water (if possible) * lowest air block above water (if possible)
*/ */
public static int[] getPosFrom(ServerWorld world, int x, int z, int maxY) { public static int[] getPosFrom(ServerLevel world, int x, int z, int maxY) {
int[] y = nextAirAndWaterBlockFrom(world, x, maxY, z); int[] y = nextAirAndWaterBlockFrom(world, x, maxY, z);
return new int[]{x, y[0], y[1], z}; return new int[]{x, y[0], y[1], z};
} }
private static int[] nextAirAndWaterBlockFrom(ServerWorld world, int x, int y, int z) { private static int[] nextAirAndWaterBlockFrom(ServerLevel world, int x, int y, int z) {
BlockPos pos = new BlockPos(x, y, z); BlockPos pos = new BlockPos(x, y, z);
BlockState state = world.getBlockState(pos); BlockState state = world.getBlockState(pos);
if (state.getMaterial().isReplaceable()) { if (state.getMaterial().isReplaceable()) {
pos = pos.down(); pos = pos.below();
state = world.getBlockState(pos); state = world.getBlockState(pos);
while (state.getMaterial().isReplaceable() && !World.isOutOfBuildLimitVertically(pos)) { while (state.getMaterial().isReplaceable() && !world.isOutsideBuildHeight(pos)) {
pos = pos.down(); pos = pos.below();
state = world.getBlockState(pos); state = world.getBlockState(pos);
} }
pos = pos.up(); pos = pos.above();
state = world.getBlockState(pos); state = world.getBlockState(pos);
} else { } else {
pos = pos.up(); pos = pos.above();
state = world.getBlockState(pos); state = world.getBlockState(pos);
while (!state.getMaterial().isReplaceable()) { while (!state.getMaterial().isReplaceable()) {
pos = pos.up(); pos = pos.above();
state = world.getBlockState(pos); state = world.getBlockState(pos);
} }
} }
int[] yRet = {pos.getY(), pos.getY()}; int[] yRet = {pos.getY(), pos.getY()};
if (state.getMaterial().isLiquid()) { if (state.getMaterial().isLiquid()) {
pos = pos.up(); pos = pos.above();
state = world.getBlockState(pos); state = world.getBlockState(pos);
while (state.getMaterial().isLiquid()) { while (state.getMaterial().isLiquid()) {
pos = pos.up(); pos = pos.above();
state = world.getBlockState(pos); state = world.getBlockState(pos);
} }
if (state.getMaterial().isReplaceable()) if (state.getMaterial().isReplaceable())

View File

@ -1,12 +1,12 @@
package io.github.flemmli97.flan.player; package io.github.flemmli97.flan.player;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import java.util.UUID; import java.util.UUID;
public interface IOwnedItem { public interface IOwnedItem {
void setOriginPlayer(PlayerEntity player); void setOriginPlayer(Player player);
UUID getDeathPlayer(); UUID getDeathPlayer();

View File

@ -3,16 +3,15 @@ package io.github.flemmli97.flan.player;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; import com.google.gson.stream.JsonWriter;
import com.mojang.authlib.GameProfile;
import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.api.data.IPlayerData; import io.github.flemmli97.flan.api.data.IPlayerData;
import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.mixin.BannedEntryAccessor; import io.github.flemmli97.flan.mixin.BannedEntryAccessor;
import net.minecraft.server.BannedPlayerEntry;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.players.UserBanListEntry;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -76,7 +75,7 @@ public class OfflinePlayerData implements IPlayerData {
@Override @Override
public int usedClaimBlocks() { public int usedClaimBlocks() {
int usedClaimsBlocks = 0; int usedClaimsBlocks = 0;
for (ServerWorld world : this.server.getWorlds()) { for (ServerLevel world : this.server.getAllLevels()) {
Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.owner); Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.owner);
if (claims != null) if (claims != null)
usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum(); usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum();
@ -113,9 +112,8 @@ public class OfflinePlayerData implements IPlayerData {
} }
public boolean isExpired(LocalDateTime now) { public boolean isExpired(LocalDateTime now) {
GameProfile prof = this.server.getUserCache().getByUuid(this.owner); UserBanListEntry entry = this.server.getProfileCache().get(this.owner).map(this.server.getPlayerList().getBans()::get).orElse(null);
BannedPlayerEntry entry = prof != null ? this.server.getPlayerManager().getUserBanList().get(prof) : null; boolean banned = entry != null && entry.getExpires() == null;
boolean banned = entry != null && entry.getExpiryDate() == null;
if (banned) { if (banned) {
LocalDateTime bannedTime = LocalDateTime.ofInstant(((BannedEntryAccessor) entry).getCreationDate().toInstant(), ZoneId.systemDefault()); LocalDateTime bannedTime = LocalDateTime.ofInstant(((BannedEntryAccessor) entry).getCreationDate().toInstant(), ZoneId.systemDefault());
return ConfigHandler.config.bannedDeletionTime != -1 && now.isAfter(bannedTime.plusDays(ConfigHandler.config.bannedDeletionTime)); return ConfigHandler.config.bannedDeletionTime != -1 && now.isAfter(bannedTime.plusDays(ConfigHandler.config.bannedDeletionTime));

View File

@ -16,21 +16,20 @@ import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import io.github.flemmli97.flan.integration.permissions.PermissionNodeHandler; import io.github.flemmli97.flan.integration.permissions.PermissionNodeHandler;
import io.github.flemmli97.flan.scoreboard.ClaimCriterias; import io.github.flemmli97.flan.scoreboard.ClaimCriterias;
import net.minecraft.block.BlockState; import net.minecraft.ChatFormatting;
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.scoreboard.ScoreboardCriterion; import net.minecraft.core.BlockPos;
import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.util.Formatting; import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.util.WorldSavePath; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.storage.LevelResource;
import net.minecraft.util.math.Box; import net.minecraft.world.phys.AABB;
import net.minecraft.util.math.Vec3d; import net.minecraft.world.phys.Vec3;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.scores.criteria.ObjectiveCriteria;
import net.minecraft.world.Heightmap;
import net.minecraft.world.chunk.ChunkStatus;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
@ -57,7 +56,7 @@ public class PlayerClaimData implements IPlayerData {
private int usedBlocks; private int usedBlocks;
private int lastBlockTick, trappedTick = -1, deathPickupTick; private int lastBlockTick, trappedTick = -1, deathPickupTick;
private Vec3d trappedPos; private Vec3 trappedPos;
private BlockPos tpPos; private BlockPos tpPos;
private EnumEditMode mode = EnumEditMode.DEFAULT; private EnumEditMode mode = EnumEditMode.DEFAULT;
private Claim editingClaim; private Claim editingClaim;
@ -69,7 +68,7 @@ public class PlayerClaimData implements IPlayerData {
private final Set<ClaimDisplay> claimDisplayList = new HashSet<>(); private final Set<ClaimDisplay> claimDisplayList = new HashSet<>();
private final Set<ClaimDisplay> displayToAdd = new HashSet<>(); private final Set<ClaimDisplay> displayToAdd = new HashSet<>();
private final ServerPlayerEntity player; private final ServerPlayer player;
private boolean confirmDeleteAll, adminIgnoreClaim, claimBlockMessage; private boolean confirmDeleteAll, adminIgnoreClaim, claimBlockMessage;
@ -77,12 +76,12 @@ public class PlayerClaimData implements IPlayerData {
private boolean shouldProtectDrop, calculateShouldDrop = true; private boolean shouldProtectDrop, calculateShouldDrop = true;
public PlayerClaimData(ServerPlayerEntity player) { public PlayerClaimData(ServerPlayer player) {
this.player = player; this.player = player;
this.claimBlocks = ConfigHandler.config.startingBlocks; this.claimBlocks = ConfigHandler.config.startingBlocks;
} }
public static PlayerClaimData get(ServerPlayerEntity player) { public static PlayerClaimData get(ServerPlayer player) {
return ((IPlayerClaimImpl) player).get(); return ((IPlayerClaimImpl) player).get();
} }
@ -185,12 +184,12 @@ public class PlayerClaimData implements IPlayerData {
public void setEditingCorner(BlockPos pos) { public void setEditingCorner(BlockPos pos) {
if (pos != null) { if (pos != null) {
BlockState state = this.player.world.getBlockState(pos); BlockState state = this.player.level.getBlockState(pos);
while (state.isAir() || state.getMaterial().isReplaceable()) { while (state.isAir() || state.getMaterial().isReplaceable()) {
pos = pos.down(); pos = pos.below();
state = this.player.world.getBlockState(pos); state = this.player.level.getBlockState(pos);
} }
this.cornerRenderPos = ClaimDisplay.getPosFrom(this.player.getServerWorld(), pos.getX(), pos.getZ(), pos.getY()); this.cornerRenderPos = ClaimDisplay.getPosFrom(this.player.getLevel(), pos.getX(), pos.getZ(), pos.getY());
} else } else
this.cornerRenderPos = null; this.cornerRenderPos = null;
this.firstCorner = pos; this.firstCorner = pos;
@ -218,7 +217,7 @@ public class PlayerClaimData implements IPlayerData {
} }
public boolean editDefaultPerms(String group, ClaimPermission perm, int mode) { public boolean editDefaultPerms(String group, ClaimPermission perm, int mode) {
if (PermissionRegistry.globalPerms().contains(perm) || ConfigHandler.config.globallyDefined(this.player.getServerWorld(), perm)) if (PermissionRegistry.globalPerms().contains(perm) || ConfigHandler.config.globallyDefined(this.player.getLevel(), perm))
return false; return false;
if (mode > 1) if (mode > 1)
mode = -1; mode = -1;
@ -235,9 +234,9 @@ public class PlayerClaimData implements IPlayerData {
public boolean setTrappedRescue() { public boolean setTrappedRescue() {
Claim claim = ((IPlayerClaimImpl) this.player).getCurrentClaim(); Claim claim = ((IPlayerClaimImpl) this.player).getCurrentClaim();
if (this.trappedTick < 0 && claim != null && !this.player.getUuid().equals(claim.getOwner())) { if (this.trappedTick < 0 && claim != null && !this.player.getUUID().equals(claim.getOwner())) {
this.trappedTick = 101; this.trappedTick = 101;
this.trappedPos = this.player.getPos(); this.trappedPos = this.player.position();
return true; return true;
} }
return false; return false;
@ -246,7 +245,7 @@ public class PlayerClaimData implements IPlayerData {
public boolean setTeleportTo(BlockPos tp) { public boolean setTeleportTo(BlockPos tp) {
if (this.trappedTick < 0) { if (this.trappedTick < 0) {
this.trappedTick = 101; this.trappedTick = 101;
this.trappedPos = this.player.getPos(); this.trappedPos = this.player.position();
this.tpPos = tp; this.tpPos = tp;
return true; return true;
} }
@ -255,10 +254,10 @@ public class PlayerClaimData implements IPlayerData {
public void tick(Claim currentClaim, Consumer<Claim> cons) { public void tick(Claim currentClaim, Consumer<Claim> cons) {
EntityInteractEvents.updateClaim(this.player, currentClaim, cons); EntityInteractEvents.updateClaim(this.player, currentClaim, cons);
boolean tool = this.player.getMainHandStack().getItem() == ConfigHandler.config.claimingItem boolean tool = this.player.getMainHandItem().getItem() == ConfigHandler.config.claimingItem
|| this.player.getOffHandStack().getItem() == ConfigHandler.config.claimingItem; || this.player.getOffhandItem().getItem() == ConfigHandler.config.claimingItem;
boolean stick = this.player.getMainHandStack().getItem() == ConfigHandler.config.inspectionItem boolean stick = this.player.getMainHandItem().getItem() == ConfigHandler.config.inspectionItem
|| this.player.getOffHandStack().getItem() == ConfigHandler.config.inspectionItem; || this.player.getOffhandItem().getItem() == ConfigHandler.config.inspectionItem;
this.displayToAdd.forEach(add -> { this.displayToAdd.forEach(add -> {
if (!this.claimDisplayList.add(add)) { if (!this.claimDisplayList.add(add)) {
this.claimDisplayList.removeIf(c -> c.equals(add) && c.type != add.type); this.claimDisplayList.removeIf(c -> c.equals(add) && c.type != add.type);
@ -273,8 +272,8 @@ public class PlayerClaimData implements IPlayerData {
} }
if (this.cornerRenderPos != null) { if (this.cornerRenderPos != null) {
if (this.cornerRenderPos[1] != this.cornerRenderPos[2]) if (this.cornerRenderPos[1] != this.cornerRenderPos[2])
this.player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[2] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2)); this.player.connection.send(new ClientboundLevelParticlesPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[2] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2));
this.player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[1] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2)); this.player.connection.send(new ClientboundLevelParticlesPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[1] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2));
} }
if (--this.confirmTick < 0) if (--this.confirmTick < 0)
this.confirmDeleteAll = false; this.confirmDeleteAll = false;
@ -286,43 +285,43 @@ public class PlayerClaimData implements IPlayerData {
this.claimBlockMessage = false; this.claimBlockMessage = false;
} else if (!this.claimBlockMessage) { } else if (!this.claimBlockMessage) {
this.claimBlockMessage = true; this.claimBlockMessage = true;
this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat, this.player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
this.getClaimBlocks(), this.getAdditionalClaims(), this.usedClaimBlocks()), Formatting.GOLD), false); this.getClaimBlocks(), this.getAdditionalClaims(), this.usedClaimBlocks()), ChatFormatting.GOLD), false);
} }
this.actionCooldown--; this.actionCooldown--;
if (--this.trappedTick >= 0) { if (--this.trappedTick >= 0) {
if (this.trappedTick == 0) { if (this.trappedTick == 0) {
if (this.tpPos != null) { if (this.tpPos != null) {
BlockPos.Mutable tpTo = this.tpPos.mutableCopy(); BlockPos.MutableBlockPos tpTo = this.tpPos.mutable();
Vec3d offset = new Vec3d(this.tpPos.getX() + 0.5, this.tpPos.getY() + 0.01, this.tpPos.getZ() + 0.5).subtract(this.player.getPos()); Vec3 offset = new Vec3(this.tpPos.getX() + 0.5, this.tpPos.getY() + 0.01, this.tpPos.getZ() + 0.5).subtract(this.player.position());
int yHighest = this.player.world.getChunk(this.tpPos.getX() >> 4, this.tpPos.getZ() >> 4, ChunkStatus.HEIGHTMAPS).sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, this.tpPos.getX() & 15, this.tpPos.getZ() & 15); int yHighest = this.player.level.getChunk(this.tpPos.getX() >> 4, this.tpPos.getZ() >> 4, ChunkStatus.HEIGHTMAPS).getHeight(Heightmap.Types.MOTION_BLOCKING, this.tpPos.getX() & 15, this.tpPos.getZ() & 15);
Box box = this.player.getBoundingBox().offset(offset); AABB box = this.player.getBoundingBox().move(offset);
if (tpTo.getY() < yHighest) { if (tpTo.getY() < yHighest) {
while (tpTo.getY() < yHighest) { while (tpTo.getY() < yHighest) {
if (this.player.world.getBlockCollisions(this.player, box, (state, pos) -> true).allMatch(VoxelShape::isEmpty)) if (this.player.level.noCollision(this.player, box))
break; break;
tpTo.set(tpTo.getX(), tpTo.getY() + 1, tpTo.getZ()); tpTo.set(tpTo.getX(), tpTo.getY() + 1, tpTo.getZ());
box = box.offset(0, 1, 0); box = box.move(0, 1, 0);
} }
tpTo.set(tpTo.getX(), tpTo.getY() + 1, tpTo.getZ()); tpTo.set(tpTo.getX(), tpTo.getY() + 1, tpTo.getZ());
} else } else
tpTo.set(tpTo.getX(), yHighest, tpTo.getZ()); tpTo.set(tpTo.getX(), yHighest, tpTo.getZ());
this.player.teleport(tpTo.getX() + 0.5, tpTo.getY(), tpTo.getZ() + 0.5); this.player.teleportToWithTicket(tpTo.getX() + 0.5, tpTo.getY(), tpTo.getZ() + 0.5);
this.tpPos = null; this.tpPos = null;
} else { } else {
Vec3d tp = TeleportUtils.getTeleportPos(this.player, this.player.getPos(), ClaimStorage.get(this.player.getServerWorld()), Vec3 tp = TeleportUtils.getTeleportPos(this.player, this.player.position(), ClaimStorage.get(this.player.getLevel()),
((IPlayerClaimImpl) this.player).getCurrentClaim().getDimensions(), ((IPlayerClaimImpl) this.player).getCurrentClaim().getDimensions(),
TeleportUtils.roundedBlockPos(this.player.getPos()).mutableCopy(), (claim, nPos) -> false); TeleportUtils.roundedBlockPos(this.player.position()).mutable(), (claim, nPos) -> false);
this.player.teleport(tp.getX(), tp.getY(), tp.getZ()); this.player.teleportToWithTicket(tp.x(), tp.y(), tp.z());
} }
} else if (this.player.getPos().squaredDistanceTo(this.trappedPos) > 0.15) { } else if (this.player.position().distanceToSqr(this.trappedPos) > 0.15) {
this.trappedTick = -1; this.trappedTick = -1;
this.trappedPos = null; this.trappedPos = null;
this.player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.trappedMove, Formatting.RED), false); this.player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.lang.trappedMove, ChatFormatting.RED), false);
} }
} }
this.deathPickupTick--; this.deathPickupTick--;
if (!this.player.isDead()) if (!this.player.isDeadOrDying())
this.calculateShouldDrop = true; this.calculateShouldDrop = true;
} }
@ -340,7 +339,7 @@ public class PlayerClaimData implements IPlayerData {
this.defaultGroups.clear(); this.defaultGroups.clear();
this.defaultGroups.putAll(data.defaultGroups); this.defaultGroups.putAll(data.defaultGroups);
if (data.setDeathItemOwner()) if (data.setDeathItemOwner())
this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDropsCmd, "/flan unlockDrops"), Formatting.GOLD), false); this.player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDropsCmd, "/flan unlockDrops"), ChatFormatting.GOLD), false);
} }
public void updateScoreboard() { public void updateScoreboard() {
@ -353,8 +352,8 @@ public class PlayerClaimData implements IPlayerData {
private int updateClaimScores() { private int updateClaimScores() {
int usedClaimsBlocks = 0; int usedClaimsBlocks = 0;
int claimsAmount = 0; int claimsAmount = 0;
for (ServerWorld world : this.player.getServer().getWorlds()) { for (ServerLevel world : this.player.getServer().getAllLevels()) {
Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.player.getUuid()); Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.player.getUUID());
if (claims != null) { if (claims != null) {
usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum(); usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum();
claimsAmount += claims.size(); claimsAmount += claims.size();
@ -366,8 +365,8 @@ public class PlayerClaimData implements IPlayerData {
private int calculateUsedClaimBlocks() { private int calculateUsedClaimBlocks() {
int usedClaimsBlocks = 0; int usedClaimsBlocks = 0;
for (ServerWorld world : this.player.getServer().getWorlds()) { for (ServerLevel world : this.player.getServer().getAllLevels()) {
Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.player.getUuid()); Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.player.getUUID());
if (claims != null) { if (claims != null) {
usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum(); usedClaimsBlocks += claims.stream().filter(claim -> !claim.isAdminClaim()).mapToInt(Claim::getPlane).sum();
} }
@ -376,11 +375,11 @@ public class PlayerClaimData implements IPlayerData {
} }
public boolean setDeathItemOwner() { public boolean setDeathItemOwner() {
if (!this.player.isDead()) if (!this.player.isDeadOrDying())
return false; return false;
if (this.calculateShouldDrop) { if (this.calculateShouldDrop) {
BlockPos rounded = TeleportUtils.roundedBlockPos(this.player.getPos().add(0, this.player.getActiveEyeHeight(this.player.getPose(), this.player.getDimensions(this.player.getPose())), 0)); BlockPos rounded = TeleportUtils.roundedBlockPos(this.player.position().add(0, this.player.getStandingEyeHeight(this.player.getPose(), this.player.getDimensions(this.player.getPose())), 0));
this.shouldProtectDrop = ClaimStorage.get(this.player.getServerWorld()).getForPermissionCheck(rounded) this.shouldProtectDrop = ClaimStorage.get(this.player.getLevel()).getForPermissionCheck(rounded)
.canInteract(this.player, PermissionRegistry.LOCKITEMS, rounded); .canInteract(this.player, PermissionRegistry.LOCKITEMS, rounded);
this.calculateShouldDrop = false; this.calculateShouldDrop = false;
} }
@ -388,11 +387,11 @@ public class PlayerClaimData implements IPlayerData {
} }
public void save(MinecraftServer server) { public void save(MinecraftServer server) {
Flan.log("Saving player data for player {} with uuid {}", this.player.getName(), this.player.getUuid()); Flan.log("Saving player data for player {} with uuid {}", this.player.getName(), this.player.getUUID());
Path dir = ConfigHandler.getPlayerSavePath(server); Path dir = ConfigHandler.getPlayerSavePath(server);
try { try {
Files.createDirectories(dir); Files.createDirectories(dir);
Path file = dir.resolve(this.player.getUuid() + ".json"); Path file = dir.resolve(this.player.getUUID() + ".json");
try { try {
Files.createFile(file); Files.createFile(file);
} catch (FileAlreadyExistsException e) { } catch (FileAlreadyExistsException e) {
@ -418,11 +417,11 @@ public class PlayerClaimData implements IPlayerData {
} }
public void read(MinecraftServer server) { public void read(MinecraftServer server) {
Flan.log("Reading player data for player {} with uuid {}", this.player.getName(), this.player.getUuid()); Flan.log("Reading player data for player {} with uuid {}", this.player.getName(), this.player.getUUID());
try { try {
Path file = ConfigHandler.getPlayerSavePath(server).resolve(this.player.getUuid() + ".json"); Path file = ConfigHandler.getPlayerSavePath(server).resolve(this.player.getUUID() + ".json");
if (!Files.exists(file)) { if (!Files.exists(file)) {
Flan.log("No player data found for player {} with uuid {}", this.player.getName(), this.player.getUuid()); Flan.log("No player data found for player {} with uuid {}", this.player.getName(), this.player.getUUID());
return; return;
} }
JsonReader reader = ConfigHandler.GSON.newJsonReader(Files.newBufferedReader(file, StandardCharsets.UTF_8)); JsonReader reader = ConfigHandler.GSON.newJsonReader(Files.newBufferedReader(file, StandardCharsets.UTF_8));
@ -438,7 +437,7 @@ public class PlayerClaimData implements IPlayerData {
try { try {
this.editDefaultPerms(e.getKey(), PermissionRegistry.get(p.getKey()), p.getValue().getAsBoolean() ? 1 : 0); this.editDefaultPerms(e.getKey(), PermissionRegistry.get(p.getKey()), p.getValue().getAsBoolean() ? 1 : 0);
} catch (NullPointerException ex) { } catch (NullPointerException ex) {
Flan.logger.error("Error reading Permission {} for personal group {} for player {}. Permission doesnt exist", p.getKey(), e.getKey(), this.player.getName().asString()); Flan.logger.error("Error reading Permission {} for personal group {} for player {}. Permission doesnt exist", p.getKey(), e.getKey(), this.player.getName().getContents());
} }
}); });
} }
@ -450,8 +449,8 @@ public class PlayerClaimData implements IPlayerData {
} }
} }
public static void updateScoreFor(ServerPlayerEntity player, ScoreboardCriterion criterion, int val) { public static void updateScoreFor(ServerPlayer player, ObjectiveCriteria criterion, int val) {
player.getScoreboard().forEachScore(criterion, player.getEntityName(), (scoreboardPlayerScore) -> { player.getScoreboard().forAllObjectives(criterion, player.getScoreboardName(), (scoreboardPlayerScore) -> {
scoreboardPlayerScore.setScore(val); scoreboardPlayerScore.setScore(val);
}); });
} }
@ -482,11 +481,11 @@ public class PlayerClaimData implements IPlayerData {
} }
} }
public static boolean readGriefPreventionPlayerData(MinecraftServer server, ServerCommandSource src) { public static boolean readGriefPreventionPlayerData(MinecraftServer server, CommandSourceStack src) {
Flan.log("Reading grief prevention data"); Flan.log("Reading grief prevention data");
File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/PlayerData").toFile(); File griefPrevention = server.getWorldPath(LevelResource.ROOT).resolve("plugins/GriefPreventionData/PlayerData").toFile();
if (!griefPrevention.exists()) { if (!griefPrevention.exists()) {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.cantFindData, griefPrevention.getAbsolutePath()), Formatting.DARK_RED), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.cantFindData, griefPrevention.getAbsolutePath()), ChatFormatting.DARK_RED), false);
return false; return false;
} }
for (File f : griefPrevention.listFiles()) { for (File f : griefPrevention.listFiles()) {
@ -497,14 +496,14 @@ public class PlayerClaimData implements IPlayerData {
} else { } else {
BufferedReader reader = new BufferedReader(new FileReader(f)); BufferedReader reader = new BufferedReader(new FileReader(f));
ServerPlayerEntity player = server.getPlayerManager().getPlayer(UUID.fromString(f.getName())); ServerPlayer player = server.getPlayerList().getPlayer(UUID.fromString(f.getName()));
if (player != null) { if (player != null) {
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
reader.readLine(); reader.readLine();
data.claimBlocks = Integer.parseInt(reader.readLine()); data.claimBlocks = Integer.parseInt(reader.readLine());
data.additionalClaimBlocks = Integer.parseInt(reader.readLine()); data.additionalClaimBlocks = Integer.parseInt(reader.readLine());
} else { } else {
File dir = new File(server.getSavePath(WorldSavePath.PLAYERDATA).toFile(), "/claimData/"); File dir = new File(server.getWorldPath(LevelResource.PLAYER_DATA_DIR).toFile(), "/claimData/");
if (!dir.exists()) if (!dir.exists())
dir.mkdir(); dir.mkdir();
File file = new File(dir, f.getName() + ".json"); File file = new File(dir, f.getName() + ".json");
@ -521,7 +520,7 @@ public class PlayerClaimData implements IPlayerData {
reader.close(); reader.close();
} }
} catch (Exception e) { } catch (Exception e) {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), Formatting.RED)), false); src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), ChatFormatting.RED)), false);
} }
} }
return true; return true;

View File

@ -4,7 +4,7 @@ import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -40,11 +40,11 @@ public class PlayerDataHandler {
return playerDatas; return playerDatas;
} }
public static void deleteUnusedClaims(MinecraftServer server, ClaimStorage storage, ServerWorld world) { public static void deleteUnusedClaims(MinecraftServer server, ClaimStorage storage, ServerLevel world) {
if (inActivePlayerData == null) if (inActivePlayerData == null)
initInactivePlayers(server); initInactivePlayers(server);
inActivePlayerData.forEach((uuid, data) -> { inActivePlayerData.forEach((uuid, data) -> {
Flan.log("{} Deleting all claims for inactive player {} last seen {}", world.getRegistryKey(), data.owner, data.lastOnline); Flan.log("{} Deleting all claims for inactive player {} last seen {}", world.dimension(), data.owner, data.lastOnline);
storage.allClaimsFromPlayer(data.owner) storage.allClaimsFromPlayer(data.owner)
.forEach(claim -> storage.deleteClaim(claim, true, EnumEditMode.DEFAULT, world)); .forEach(claim -> storage.deleteClaim(claim, true, EnumEditMode.DEFAULT, world));
}); });

View File

@ -2,39 +2,38 @@ package io.github.flemmli97.flan.player;
import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.ClaimStorage;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.util.Pair; import net.minecraft.core.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.math.Direction; import net.minecraft.util.Tuple;
import net.minecraft.util.math.Vec3d; import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.Heightmap; import net.minecraft.world.phys.Vec3;
import net.minecraft.world.chunk.ChunkStatus;
import java.util.function.BiFunction; import java.util.function.BiFunction;
public class TeleportUtils { public class TeleportUtils {
public static BlockPos roundedBlockPos(Vec3d pos) { public static BlockPos roundedBlockPos(Vec3 pos) {
return new BlockPos(pos); return new BlockPos(pos);
} }
public static Vec3d getTeleportPos(ServerPlayerEntity player, Vec3d playerPos, ClaimStorage storage, int[] dim, BlockPos.Mutable bPos, BiFunction<Claim, BlockPos, Boolean> check) { public static Vec3 getTeleportPos(ServerPlayer player, Vec3 playerPos, ClaimStorage storage, int[] dim, BlockPos.MutableBlockPos bPos, BiFunction<Claim, BlockPos, Boolean> check) {
Pair<Direction, Vec3d> pos = nearestOutside(dim, playerPos); Tuple<Direction, Vec3> pos = nearestOutside(dim, playerPos);
bPos.set(pos.getRight().getX(), pos.getRight().getY(), pos.getRight().getZ()); bPos.set(pos.getB().x(), pos.getB().y(), pos.getB().z());
Claim claim = storage.getClaimAt(bPos); Claim claim = storage.getClaimAt(bPos);
if (claim == null || check.apply(claim, bPos)) { if (claim == null || check.apply(claim, bPos)) {
Vec3d ret = pos.getRight(); Vec3 ret = pos.getB();
BlockPos rounded = roundedBlockPos(ret); BlockPos rounded = roundedBlockPos(ret);
int y = player.getServerWorld().getChunk(rounded.getX() >> 4, rounded.getZ() >> 4, ChunkStatus.HEIGHTMAPS) int y = player.getLevel().getChunk(rounded.getX() >> 4, rounded.getZ() >> 4, ChunkStatus.HEIGHTMAPS)
.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, rounded.getX() & 15, rounded.getZ() & 15); .getHeight(Heightmap.Types.MOTION_BLOCKING, rounded.getX() & 15, rounded.getZ() & 15);
Vec3d dest = new Vec3d(ret.x, y + 1, ret.z); Vec3 dest = new Vec3(ret.x, y + 1, ret.z);
if (player.world.getBlockCollisions(player, player.getBoundingBox().offset(dest.subtract(player.getPos())), (state, p) -> true).allMatch(VoxelShape::isEmpty)) if (player.level.noCollision(player, player.getBoundingBox().move(dest.subtract(player.position()))))
return dest; return dest;
return new Vec3d(rounded.getX() + 0.5, y + 1, rounded.getZ() + 0.5); return new Vec3(rounded.getX() + 0.5, y + 1, rounded.getZ() + 0.5);
} }
int[] newDim = claim.getDimensions(); int[] newDim = claim.getDimensions();
switch (pos.getLeft()) { switch (pos.getA()) {
case NORTH: case NORTH:
dim[2] = newDim[2]; dim[2] = newDim[2];
break; break;
@ -51,28 +50,28 @@ public class TeleportUtils {
return getTeleportPos(player, playerPos, storage, dim, bPos, check); return getTeleportPos(player, playerPos, storage, dim, bPos, check);
} }
private static Pair<Direction, Vec3d> nearestOutside(int[] dim, Vec3d from) { private static Tuple<Direction, Vec3> nearestOutside(int[] dim, Vec3 from) {
double northDist = Math.abs(from.getZ() - dim[2]); double northDist = Math.abs(from.z() - dim[2]);
double southDist = Math.abs(dim[3] - from.getZ()); double southDist = Math.abs(dim[3] - from.z());
double westDist = Math.abs(from.getX() - dim[0]); double westDist = Math.abs(from.x() - dim[0]);
double eastDist = Math.abs(dim[1] - from.getX()); double eastDist = Math.abs(dim[1] - from.x());
if (northDist > southDist) { if (northDist > southDist) {
if (eastDist > westDist) { if (eastDist > westDist) {
if (southDist > westDist) if (southDist > westDist)
return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); return new Tuple<>(Direction.WEST, new Vec3(dim[0] - 1.5, from.y(), from.z()));
return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); return new Tuple<>(Direction.SOUTH, new Vec3(from.x(), from.y(), dim[3] + 1.5));
} }
if (southDist > eastDist) if (southDist > eastDist)
return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); return new Tuple<>(Direction.EAST, new Vec3(dim[1] + 1.5, from.y(), from.z()));
return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); return new Tuple<>(Direction.SOUTH, new Vec3(from.x(), from.y(), dim[3] + 1.5));
} }
if (eastDist > westDist) { if (eastDist > westDist) {
if (northDist > westDist) if (northDist > westDist)
return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); return new Tuple<>(Direction.WEST, new Vec3(dim[0] - 1.5, from.y(), from.z()));
return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); return new Tuple<>(Direction.NORTH, new Vec3(from.x(), from.y(), dim[2] - 1.5));
} }
if (northDist > eastDist) if (northDist > eastDist)
return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); return new Tuple<>(Direction.EAST, new Vec3(dim[1] + 1.5, from.y(), from.z()));
return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); return new Tuple<>(Direction.NORTH, new Vec3(from.x(), from.y(), dim[2] - 1.5));
} }
} }

View File

@ -1,16 +1,16 @@
package io.github.flemmli97.flan.scoreboard; package io.github.flemmli97.flan.scoreboard;
import net.minecraft.scoreboard.ScoreboardCriterion; import net.minecraft.world.scores.criteria.ObjectiveCriteria;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
public class ClaimCriterias { public class ClaimCriterias {
public static ScoreboardCriterion AMOUNT = create("flan:total_claimblocks", true, ScoreboardCriterion.RenderType.INTEGER); public static ObjectiveCriteria AMOUNT = create("flan:total_claimblocks", true, ObjectiveCriteria.RenderType.INTEGER);
public static ScoreboardCriterion USED = create("flan:used_claimblocks", true, ScoreboardCriterion.RenderType.INTEGER); public static ObjectiveCriteria USED = create("flan:used_claimblocks", true, ObjectiveCriteria.RenderType.INTEGER);
public static ScoreboardCriterion FREE = create("flan:free_claimblocks", true, ScoreboardCriterion.RenderType.INTEGER); public static ObjectiveCriteria FREE = create("flan:free_claimblocks", true, ObjectiveCriteria.RenderType.INTEGER);
public static ScoreboardCriterion CLAIMS = create("flan:claim_number", true, ScoreboardCriterion.RenderType.INTEGER); public static ObjectiveCriteria CLAIMS = create("flan:claim_number", true, ObjectiveCriteria.RenderType.INTEGER);
public static void init() { public static void init() {
@ -19,9 +19,9 @@ public class ClaimCriterias {
/** /**
* Just reflection cause its only called once during init * Just reflection cause its only called once during init
*/ */
private static ScoreboardCriterion create(String name, boolean readOnly, ScoreboardCriterion.RenderType renderType) { private static ObjectiveCriteria create(String name, boolean readOnly, ObjectiveCriteria.RenderType renderType) {
try { try {
Constructor<ScoreboardCriterion> cons = ScoreboardCriterion.class.getDeclaredConstructor(String.class, boolean.class, ScoreboardCriterion.RenderType.class); Constructor<ObjectiveCriteria> cons = ObjectiveCriteria.class.getDeclaredConstructor(String.class, boolean.class, ObjectiveCriteria.RenderType.class);
cons.setAccessible(true); cons.setAccessible(true);
return cons.newInstance(name, readOnly, renderType); return cons.newInstance(name, readOnly, renderType);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {

View File

@ -24,7 +24,8 @@
"FrostWalkerMixin", "FrostWalkerMixin",
"LightningFireEntityMixin", "LightningFireEntityMixin",
"BannedEntryAccessor", "BannedEntryAccessor",
"MinecraftServerMixin" "MinecraftServerMixin",
"AbstractContainerAccessor"
], ],
"server": [ "server": [
], ],

View File

@ -1,9 +1,5 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "5.0.0" id "com.github.johnrengelman.shadow" version "7.1.0"
}
configurations {
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
} }
architectury { architectury {
@ -11,6 +7,14 @@ architectury {
fabric() fabric()
} }
configurations {
common
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
developmentFabric.extendsFrom common
}
repositories { repositories {
mavenCentral() mavenCentral()
maven { maven {
@ -45,6 +49,9 @@ dependencies {
// Fabric API. This is technically optional, but you probably want it anyway. // Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_version}"
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
/*
modImplementation "me.lucko:fabric-permissions-api:${rootProject.fabric_permissions_api}" modImplementation "me.lucko:fabric-permissions-api:${rootProject.fabric_permissions_api}"
modCompileOnly "io.github.gunpowder:gunpowder-api:${rootProject.gunpowder_version}" modCompileOnly "io.github.gunpowder:gunpowder-api:${rootProject.gunpowder_version}"
modRuntime "io.github.gunpowder:gunpowder-base:${rootProject.gunpowder_version}" modRuntime "io.github.gunpowder:gunpowder-base:${rootProject.gunpowder_version}"
@ -52,17 +59,7 @@ dependencies {
modImplementation "io.github.ladysnake:PlayerAbilityLib:${rootProject.player_ability_lib}" modImplementation "io.github.ladysnake:PlayerAbilityLib:${rootProject.player_ability_lib}"
implementation(project(path: ":common")) { modImplementation("dev.ftb.mods:ftb-ranks-fabric:1605.1.2-build.17")*/
transitive = false
}
developmentFabric(project(path: ":common")) {
transitive = false
}
shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) {
transitive = false
}
modImplementation("dev.ftb.mods:ftb-ranks-fabric:1605.1.2-build.17")
} }
processResources { processResources {
@ -88,10 +85,6 @@ jar {
classifier "dev" classifier "dev"
} }
java {
withSourcesJar()
}
sourcesJar { sourcesJar {
def commonSources = project(":common").sourcesJar def commonSources = project(":common").sourcesJar
dependsOn commonSources dependsOn commonSources
@ -99,6 +92,12 @@ sourcesJar {
classifier "fabric-source" classifier "fabric-source"
} }
components.java {
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
skip()
}
}
task apiJar(type: Jar, dependsOn: classes) { task apiJar(type: Jar, dependsOn: classes) {
archiveClassifier.set "fabric-api-source" archiveClassifier.set "fabric-api-source"
from project(":common").sourceSets.main.output + sourceSets.main.output from project(":common").sourceSets.main.output + sourceSets.main.output

View File

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -1,7 +1,7 @@
package io.github.flemmli97.flan; package io.github.flemmli97.flan;
import net.minecraft.util.Identifier; import net.minecraft.core.Registry;
import net.minecraft.util.registry.Registry; import net.minecraft.resources.ResourceLocation;
public class FabricRegistryWrapper<T> implements SimpleRegistryWrapper<T> { public class FabricRegistryWrapper<T> implements SimpleRegistryWrapper<T> {
@ -12,13 +12,13 @@ public class FabricRegistryWrapper<T> implements SimpleRegistryWrapper<T> {
} }
@Override @Override
public T getFromId(Identifier id) { public T getFromId(ResourceLocation id) {
return this.delegate.get(id); return this.delegate.get(id);
} }
@Override @Override
public Identifier getIDFrom(T entry) { public ResourceLocation getIDFrom(T entry) {
return this.delegate.getId(entry); return this.delegate.getKey(entry);
} }
@Override @Override

View File

@ -3,9 +3,9 @@ package io.github.flemmli97.flan.api.fabric;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory; import net.fabricmc.fabric.api.event.EventFactory;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.util.ActionResult; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.InteractionResult;
public class PermissionCheckEvent { public class PermissionCheckEvent {
@ -19,21 +19,21 @@ public class PermissionCheckEvent {
* @param pos The block pos where the action is occuring * @param pos The block pos where the action is occuring
* @return ActionResult#PASS to do nothing. ActionResult#FAIL to prevent the action. Else to allow the action * @return ActionResult#PASS to do nothing. ActionResult#FAIL to prevent the action. Else to allow the action
*/ */
ActionResult check(ServerPlayerEntity player, ClaimPermission permission, BlockPos pos); InteractionResult check(ServerPlayer player, ClaimPermission permission, BlockPos pos);
} }
public static Event<PermissionCheck> CHECK = EventFactory.createArrayBacked(PermissionCheck.class, public static Event<PermissionCheck> CHECK = EventFactory.createArrayBacked(PermissionCheck.class,
(listeners) -> (player, permission, pos) -> { (listeners) -> (player, permission, pos) -> {
for (PermissionCheck event : listeners) { for (PermissionCheck event : listeners) {
ActionResult result = event.check(player, permission, pos); InteractionResult result = event.check(player, permission, pos);
if (result != ActionResult.PASS) { if (result != InteractionResult.PASS) {
return result; return result;
} }
} }
return ActionResult.PASS; return InteractionResult.PASS;
} }
); );
} }

View File

@ -2,13 +2,13 @@ package io.github.flemmli97.flan.claim.fabric;
import io.github.flemmli97.flan.api.fabric.PermissionCheckEvent; import io.github.flemmli97.flan.api.fabric.PermissionCheckEvent;
import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.ClaimPermission;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.core.BlockPos;
import net.minecraft.util.ActionResult; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.InteractionResult;
public class ClaimPermissionCheckImpl { public class ClaimPermissionCheckImpl {
public static ActionResult check(ServerPlayerEntity player, ClaimPermission permission, BlockPos pos) { public static InteractionResult check(ServerPlayer player, ClaimPermission permission, BlockPos pos) {
return PermissionCheckEvent.CHECK.invoker().check(player, permission, pos); return PermissionCheckEvent.CHECK.invoker().check(player, permission, pos);
} }
} }

View File

@ -3,16 +3,16 @@ package io.github.flemmli97.flan.fabric;
import io.github.flemmli97.flan.FabricRegistryWrapper; import io.github.flemmli97.flan.FabricRegistryWrapper;
import io.github.flemmli97.flan.SimpleRegistryWrapper; import io.github.flemmli97.flan.SimpleRegistryWrapper;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block; import net.minecraft.core.Registry;
import net.minecraft.block.InventoryProvider;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.Item;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Identifier; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.registry.Registry; import net.minecraft.world.Container;
import net.minecraft.world.WorldlyContainerHolder;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.nio.file.Path; import java.nio.file.Path;
@ -22,16 +22,16 @@ public class CrossPlatformStuffImpl {
return FabricLoader.getInstance().getConfigDir(); return FabricLoader.getInstance().getConfigDir();
} }
public static StatusEffect effectFromString(String s) { public static MobEffect effectFromString(String s) {
return Registry.STATUS_EFFECT.get(new Identifier(s)); return Registry.MOB_EFFECT.get(new ResourceLocation(s));
} }
public static String stringFromEffect(StatusEffect s) { public static String stringFromEffect(MobEffect s) {
return Registry.STATUS_EFFECT.getId(s).toString(); return Registry.MOB_EFFECT.getKey(s).toString();
} }
public static SimpleRegistryWrapper<StatusEffect> registryStatusEffects() { public static SimpleRegistryWrapper<MobEffect> registryStatusEffects() {
return new FabricRegistryWrapper<>(Registry.STATUS_EFFECT); return new FabricRegistryWrapper<>(Registry.MOB_EFFECT);
} }
public static SimpleRegistryWrapper<Block> registryBlocks() { public static SimpleRegistryWrapper<Block> registryBlocks() {
@ -47,7 +47,7 @@ public class CrossPlatformStuffImpl {
} }
public static boolean isInventoryTile(BlockEntity blockEntity) { public static boolean isInventoryTile(BlockEntity blockEntity) {
return blockEntity instanceof Inventory || blockEntity instanceof InventoryProvider; return blockEntity instanceof Container || blockEntity instanceof WorldlyContainerHolder;
} }
public static boolean blockDataContains(CompoundTag nbt, String tag) { public static boolean blockDataContains(CompoundTag nbt, String tag) {

View File

@ -1,25 +1,25 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.Entity; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.entity.ItemEntity; import net.minecraft.world.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
import net.minecraft.entity.decoration.AbstractDecorationEntity; import net.minecraft.world.entity.decoration.ArmorStand;
import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.world.entity.decoration.HangingEntity;
import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.entity.vehicle.AbstractMinecartEntity; import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.world.entity.vehicle.Boat;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin({LivingEntity.class, Entity.class, AbstractDecorationEntity.class, AbstractMinecartEntity.class, ArmorStandEntity.class, BoatEntity.class @Mixin({LivingEntity.class, Entity.class, HangingEntity.class, AbstractMinecart.class, ArmorStand.class, Boat.class
, EndCrystalEntity.class, ItemEntity.class}) , EndCrystal.class, ItemEntity.class})
public abstract class EntityDamageMixin { public abstract class EntityDamageMixin {
@Inject(method = "damage", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "hurt", at = @At(value = "HEAD"), cancellable = true)
private void onDamage(DamageSource source, float amount, CallbackInfoReturnable<Boolean> info) { private void onDamage(DamageSource source, float amount, CallbackInfoReturnable<Boolean> info) {
if (EntityInteractEvents.preventDamage((Entity) (Object) this, source)) { if (EntityInteractEvents.preventDamage((Entity) (Object) this, source)) {
info.setReturnValue(false); info.setReturnValue(false);

View File

@ -1,10 +1,10 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.block.FireBlock; import net.minecraft.core.BlockPos;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.Level;
import net.minecraft.world.World; import net.minecraft.world.level.block.FireBlock;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -15,9 +15,12 @@ import java.util.Random;
@Mixin(FireBlock.class) @Mixin(FireBlock.class)
public abstract class FabricFireMixin { public abstract class FabricFireMixin {
@Inject(method = "trySpreadingFire", at = @At(value = "HEAD"), cancellable = true) /**
private void spread(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo info) { * Check for blocks reacting to fire (e.g. tnt)
if (!world.isClient && !WorldEvents.canFireSpread((ServerWorld) world, pos)) { */
@Inject(method = "checkBurnOut", at = @At(value = "HEAD"), cancellable = true)
private void spread(Level world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo info) {
if (!world.isClientSide && !WorldEvents.canFireSpread((ServerLevel) world, pos)) {
info.cancel(); info.cancel();
} }
} }

View File

@ -1,15 +1,15 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.entity.LightningEntity; import net.minecraft.world.entity.LightningBolt;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.List; import java.util.List;
@Mixin(LightningEntity.class) @Mixin(LightningBolt.class)
public abstract class LightningHitMixin { public abstract class LightningHitMixin {
@ModifyVariable(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;"), require = 1) @ModifyVariable(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;"), require = 1)

View File

@ -1,21 +1,21 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.block.PistonBlock; import net.minecraft.core.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.Level;
import net.minecraft.util.math.Direction; import net.minecraft.world.level.block.piston.PistonBaseBlock;
import net.minecraft.world.World; import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(PistonBlock.class) @Mixin(PistonBaseBlock.class)
public abstract class PistonMixin { public abstract class PistonMixin {
@Inject(method = "isMovable", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "isPushable", at = @At(value = "HEAD"), cancellable = true)
private static void checkMovable(BlockState blockState, World world, BlockPos blockPos, Direction direction, boolean canBreak, Direction pistonDir, CallbackInfoReturnable<Boolean> info) { private static void checkMovable(BlockState blockState, Level world, BlockPos blockPos, Direction direction, boolean canBreak, Direction pistonDir, CallbackInfoReturnable<Boolean> info) {
if (!WorldEvents.pistonCanPush(blockState, world, blockPos, direction, pistonDir)) { if (!WorldEvents.pistonCanPush(blockState, world, blockPos, direction, pistonDir)) {
info.setReturnValue(false); info.setReturnValue(false);
info.cancel(); info.cancel();

View File

@ -1,20 +1,20 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(PlayerEntity.class) @Mixin(Player.class)
public abstract class PlayerDropMixin { public abstract class PlayerDropMixin {
@Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At(value = "HEAD"), cancellable = true)
private void drop(ItemStack stack, boolean throwRandomly, boolean retainOwnership, CallbackInfoReturnable<ItemEntity> info) { private void drop(ItemStack stack, boolean throwRandomly, boolean retainOwnership, CallbackInfoReturnable<ItemEntity> info) {
if (!EntityInteractEvents.canDropItem((PlayerEntity) (Object) this, stack)) { if (!EntityInteractEvents.canDropItem((Player) (Object) this, stack)) {
info.setReturnValue(null); info.setReturnValue(null);
info.cancel(); info.cancel();
} }

View File

@ -0,0 +1,30 @@
package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
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;
/**
* Fabric APIs UseEntityCallback is at Entity#interactAt and thats only used for armor stand. Why its only there idk...
*/
@Mixin(Player.class)
public abstract class PlayerInteractEntityMixin {
@Inject(method = "interactOn", at = @At(value = "HEAD"), cancellable = true)
private void interactOnEntity(Entity entity, InteractionHand interactionHand, CallbackInfoReturnable<InteractionResult> info) {
if (entity == null || !(entity.level instanceof ServerLevel))
return;
InteractionResult result = EntityInteractEvents.useEntity((Player) (Object) this, entity.level, interactionHand, entity);
if (result != InteractionResult.PASS) {
info.setReturnValue(InteractionResult.PASS);
info.cancel();
}
}
}

View File

@ -2,18 +2,18 @@ package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.PlayerEvents; import io.github.flemmli97.flan.event.PlayerEvents;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.PlayerManager; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.players.PlayerList;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(PlayerManager.class) @Mixin(PlayerList.class)
public abstract class PlayerManagerMixin { public abstract class PlayerManagerMixin {
@Inject(method = "loadPlayerData", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;fromTag(Lnet/minecraft/nbt/CompoundTag;)V")) @Inject(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;load(Lnet/minecraft/nbt/CompoundTag;)V"))
private void singlePlayerRead(ServerPlayerEntity player, CallbackInfoReturnable<CompoundTag> info) { private void singlePlayerRead(ServerPlayer player, CallbackInfoReturnable<CompoundTag> info) {
PlayerEvents.readClaimData(player); PlayerEvents.readClaimData(player);
} }
} }

View File

@ -1,24 +1,24 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.projectile.DragonFireballEntity; import net.minecraft.world.entity.projectile.DragonFireball;
import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.entity.projectile.thrown.EggEntity; import net.minecraft.world.entity.projectile.ThrownEgg;
import net.minecraft.entity.projectile.thrown.EnderPearlEntity; import net.minecraft.world.entity.projectile.ThrownEnderpearl;
import net.minecraft.entity.projectile.thrown.ExperienceBottleEntity; import net.minecraft.world.entity.projectile.ThrownExperienceBottle;
import net.minecraft.entity.projectile.thrown.PotionEntity; import net.minecraft.world.entity.projectile.ThrownPotion;
import net.minecraft.util.hit.HitResult; import net.minecraft.world.phys.HitResult;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = {ProjectileEntity.class, EggEntity.class, PotionEntity.class, ExperienceBottleEntity.class, DragonFireballEntity.class, EnderPearlEntity.class}) @Mixin(value = {Projectile.class, ThrownEgg.class, ThrownPotion.class, ThrownExperienceBottle.class, DragonFireball.class, ThrownEnderpearl.class})
public abstract class ProjectileMixin { public abstract class ProjectileMixin {
@Inject(method = "onCollision", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "onHit", at = @At(value = "HEAD"), cancellable = true)
private void collision(HitResult hitResult, CallbackInfo info) { private void collision(HitResult hitResult, CallbackInfo info) {
if (EntityInteractEvents.projectileHit((ProjectileEntity) (Object) this, hitResult)) { if (EntityInteractEvents.projectileHit((Projectile) (Object) this, hitResult)) {
info.cancel(); info.cancel();
} }
} }

View File

@ -1,36 +0,0 @@
package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.Entity;
import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/**
* Fabric APIs UseEntityCallback is at Entity#interactAt and thats only used for armor stand. Why its only there idk...
*/
@Mixin(ServerPlayNetworkHandler.class)
public abstract class ServerPlayNetworkHandlerMixin {
@Shadow
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)
private void onPlayerInteractEntity(PlayerInteractEntityC2SPacket packet, CallbackInfo info) {
World world = this.player.getEntityWorld();
Entity entity = packet.getEntity(world);
if (entity != null) {
ActionResult result = EntityInteractEvents.useEntity(this.player, world, packet.getHand(), entity);
if (result != ActionResult.PASS) {
info.cancel();
}
}
}
}

View File

@ -1,22 +1,22 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.entity.Entity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.entity.Entity;
import net.minecraft.world.explosion.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior; import net.minecraft.world.level.ExplosionDamageCalculator;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(ServerWorld.class) @Mixin(ServerLevel.class)
public abstract class ServerWorldMixin { 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) @Inject(method = "explode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Explosion;explode()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) { private void explosionHook(Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionBehavior, double d, double e, double f, float g, boolean bl, Explosion.BlockInteraction destructionType, CallbackInfoReturnable<Explosion> info, Explosion explosion) {
WorldEvents.modifyExplosion(explosion, (ServerWorld) (Object) this); WorldEvents.modifyExplosion(explosion, (ServerLevel) (Object) this);
} }
} }

View File

@ -1,18 +1,18 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.passive.SnowGolemEntity; import net.minecraft.world.entity.animal.SnowGolem;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(SnowGolemEntity.class) @Mixin(SnowGolem.class)
public abstract class SnowGolemMixin { public abstract class SnowGolemMixin {
@Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getGameRules()Lnet/minecraft/world/GameRules;"), cancellable = true) @Inject(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getGameRules()Lnet/minecraft/world/level/GameRules;"), cancellable = true)
private void checkSnow(CallbackInfo info) { private void checkSnow(CallbackInfo info) {
if (!EntityInteractEvents.canSnowGolemInteract((SnowGolemEntity) (Object) this)) { if (!EntityInteractEvents.canSnowGolemInteract((SnowGolem) (Object) this)) {
info.cancel(); info.cancel();
} }
} }

View File

@ -1,19 +1,19 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.event.WorldEvents;
import net.minecraft.entity.mob.MobEntity; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.world.ServerWorld; import net.minecraft.world.entity.Mob;
import net.minecraft.world.SpawnHelper; import net.minecraft.world.level.NaturalSpawner;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(SpawnHelper.class) @Mixin(NaturalSpawner.class)
public abstract class SpawnHelperMixin { public abstract class SpawnHelperMixin {
@Inject(method = "isValidSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/mob/MobEntity;canSpawn(Lnet/minecraft/world/WorldAccess;Lnet/minecraft/entity/SpawnReason;)Z"), cancellable = true) @Inject(method = "isValidPositionForMob", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Mob;checkSpawnRules(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/world/entity/MobSpawnType;)Z"), cancellable = true)
private static void isValidSpawn(ServerWorld world, MobEntity entity, double squaredDistance, CallbackInfoReturnable<Boolean> info) { private static void isValidSpawn(ServerLevel world, Mob entity, double squaredDistance, CallbackInfoReturnable<Boolean> info) {
if (WorldEvents.preventMobSpawn(world, entity)) { if (WorldEvents.preventMobSpawn(world, entity)) {
info.setReturnValue(false); info.setReturnValue(false);
info.cancel(); info.cancel();

View File

@ -1,22 +1,22 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.boss.WitherEntity; import net.minecraft.world.entity.boss.wither.WitherBoss;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(WitherEntity.class) @Mixin(WitherBoss.class)
public abstract class WitherMixin { public abstract class WitherMixin {
@Shadow @Shadow
private int field_7082; private int destroyBlocksTick;
@Inject(method = "mobTick", at = @At(value = "HEAD")) @Inject(method = "customServerAiStep", at = @At(value = "HEAD"))
private void preventClaimDmg(CallbackInfo info) { private void preventClaimDmg(CallbackInfo info) {
if (!EntityInteractEvents.witherCanDestroy((WitherEntity) (Object) this)) if (!EntityInteractEvents.witherCanDestroy((WitherBoss) (Object) this))
this.field_7082 = -1; this.destroyBlocksTick = -1;
} }
} }

View File

@ -1,25 +1,25 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.PlayerEvents; import io.github.flemmli97.flan.event.PlayerEvents;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.WorldSaveHandler; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.storage.PlayerDataStorage;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(WorldSaveHandler.class) @Mixin(PlayerDataStorage.class)
public abstract class WorldSaveHandlerMixin { public abstract class WorldSaveHandlerMixin {
@Inject(method = "savePlayerData", at = @At(value = "RETURN")) @Inject(method = "save", at = @At(value = "RETURN"))
private void save(PlayerEntity player, CallbackInfo info) { private void save(Player player, CallbackInfo info) {
PlayerEvents.saveClaimData(player); PlayerEvents.saveClaimData(player);
} }
@Inject(method = "loadPlayerData", at = @At(value = "RETURN")) @Inject(method = "load", at = @At(value = "RETURN"))
private void load(PlayerEntity player, CallbackInfoReturnable<CompoundTag> info) { private void load(Player player, CallbackInfoReturnable<CompoundTag> info) {
PlayerEvents.readClaimData(player); PlayerEvents.readClaimData(player);
} }
} }

View File

@ -1,18 +1,18 @@
package io.github.flemmli97.flan.fabric.mixin; package io.github.flemmli97.flan.fabric.mixin;
import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents;
import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ExperienceOrbEntity.class) @Mixin(ExperienceOrb.class)
public abstract class XpEntityMixin { public abstract class XpEntityMixin {
@Inject(method = "onPlayerCollision", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "playerTouch", at = @At(value = "HEAD"), cancellable = true)
private void collision(PlayerEntity player, CallbackInfo info) { private void collision(Player player, CallbackInfo info) {
if (EntityInteractEvents.xpAbsorb(player)) { if (EntityInteractEvents.xpAbsorb(player)) {
info.cancel(); info.cancel();
} }

View File

@ -1,66 +1,59 @@
package io.github.flemmli97.flan.integration.currency.fabric; package io.github.flemmli97.flan.integration.currency.fabric;
import com.mojang.brigadier.Command; import com.mojang.brigadier.Command;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.ChatFormatting;
import io.github.gunpowder.api.GunpowderMod; import net.minecraft.commands.CommandSourceStack;
import io.github.gunpowder.api.module.currency.dataholders.StoredBalance;
import io.github.gunpowder.api.module.currency.modelhandlers.BalanceHandler;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.util.Formatting;
import java.math.BigDecimal;
public class CommandCurrencyImpl { public class CommandCurrencyImpl {
public static int sellClaimBlocks(CommandContext<ServerCommandSource> context) throws CommandSyntaxException { public static int sellClaimBlocks(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
if (!Flan.gunpowder) { if (!Flan.gunpowder) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.currencyMissing, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.currencyMissing, ChatFormatting.DARK_RED), false);
return 0; return 0;
} }
if (ConfigHandler.config.sellPrice == -1) { /*if (ConfigHandler.config.sellPrice == -1) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.sellDisabled, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.sellDisabled, ChatFormatting.DARK_RED), false);
return 0; return 0;
} }
int amount = Math.max(0, IntegerArgumentType.getInteger(context, "amount")); int amount = Math.max(0, IntegerArgumentType.getInteger(context, "amount"));
PlayerClaimData data = PlayerClaimData.get(context.getSource().getPlayer()); PlayerClaimData data = PlayerClaimData.get(context.getSource().getPlayerOrException());
if (data.getAdditionalClaims() - Math.max(0, data.usedClaimBlocks() - data.getClaimBlocks()) < amount) { if (data.getAdditionalClaims() - Math.max(0, data.usedClaimBlocks() - data.getClaimBlocks()) < amount) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.sellFail, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.sellFail, ChatFormatting.DARK_RED), false);
return 0; return 0;
} }
StoredBalance bal = GunpowderMod.getInstance().getRegistry().getModelHandler(BalanceHandler.class).getUser(context.getSource().getPlayer().getUuid()); StoredBalance bal = GunpowderMod.getInstance().getRegistry().getModelHandler(BalanceHandler.class).getUser(context.getSource().getPlayerOrException().getUUID());
BigDecimal price = BigDecimal.valueOf(amount * ConfigHandler.config.sellPrice); BigDecimal price = BigDecimal.valueOf(amount * ConfigHandler.config.sellPrice);
bal.setBalance(bal.getBalance().add(price)); bal.setBalance(bal.getBalance().add(price));
data.setAdditionalClaims(data.getAdditionalClaims() - amount); data.setAdditionalClaims(data.getAdditionalClaims() - amount);
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.sellSuccess, amount, price), Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.sellSuccess, amount, price), ChatFormatting.GOLD), false);*/
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
public static int buyClaimBlocks(CommandContext<ServerCommandSource> context) throws CommandSyntaxException { public static int buyClaimBlocks(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
if (!Flan.gunpowder) { if (!Flan.gunpowder) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.currencyMissing, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.currencyMissing, ChatFormatting.DARK_RED), false);
return 0; return 0;
} }
if (ConfigHandler.config.buyPrice == -1) { /*if (ConfigHandler.config.buyPrice == -1) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.buyDisabled, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.buyDisabled, ChatFormatting.DARK_RED), false);
return 0; return 0;
} }
StoredBalance bal = GunpowderMod.getInstance().getRegistry().getModelHandler(BalanceHandler.class).getUser(context.getSource().getPlayer().getUuid()); StoredBalance bal = GunpowderMod.getInstance().getRegistry().getModelHandler(BalanceHandler.class).getUser(context.getSource().getPlayerOrException().getUUID());
int amount = Math.max(0, IntegerArgumentType.getInteger(context, "amount")); int amount = Math.max(0, IntegerArgumentType.getInteger(context, "amount"));
BigDecimal price = BigDecimal.valueOf(amount * ConfigHandler.config.buyPrice); BigDecimal price = BigDecimal.valueOf(amount * ConfigHandler.config.buyPrice);
if (bal.getBalance().compareTo(price) >= 0) { if (bal.getBalance().compareTo(price) >= 0) {
PlayerClaimData data = PlayerClaimData.get(context.getSource().getPlayer()); PlayerClaimData data = PlayerClaimData.get(context.getSource().getPlayerOrException());
data.setAdditionalClaims(data.getAdditionalClaims() + amount); data.setAdditionalClaims(data.getAdditionalClaims() + amount);
bal.setBalance(bal.getBalance().subtract(price)); bal.setBalance(bal.getBalance().subtract(price));
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.buySuccess, amount, price), Formatting.GOLD), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.buySuccess, amount, price), ChatFormatting.GOLD), false);
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.buyFail, Formatting.DARK_RED), false); context.getSource().sendSuccess(PermHelper.simpleColoredText(ConfigHandler.lang.buyFail, ChatFormatting.DARK_RED), false);*/
return 0; return 0;
} }
} }

View File

@ -1,44 +1,41 @@
package io.github.flemmli97.flan.integration.permissions.fabric; package io.github.flemmli97.flan.integration.permissions.fabric;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerEntity;
public class PermissionNodeHandlerImpl { public class PermissionNodeHandlerImpl {
public static boolean perm(ServerCommandSource src, String perm, boolean adminCmd) { public static boolean perm(CommandSourceStack src, String perm, boolean adminCmd) {
if (Flan.permissionAPI) { /*if (Flan.permissionAPI) {
if (adminCmd) if (adminCmd)
return Permissions.check(src, perm, ConfigHandler.config.permissionLevel); return Permissions.check(src, perm, ConfigHandler.config.permissionLevel);
return Permissions.check(src, perm, true); return Permissions.check(src, perm, true);
} }
if (Flan.ftbRanks && src.getEntity() instanceof ServerPlayerEntity) { if (Flan.ftbRanks && src.getEntity() instanceof ServerPlayer) {
ServerPlayerEntity player = (ServerPlayerEntity) src.getEntity(); ServerPlayer player = (ServerPlayer) src.getEntity();
return FTBRanksAPI.getPermissionValue(player, perm).asBoolean().orElse(!adminCmd || player.hasPermissionLevel(ConfigHandler.config.permissionLevel)); return FTBRanksAPI.getPermissionValue(player, perm).asBoolean().orElse(!adminCmd || player.hasPermissions(ConfigHandler.config.permissionLevel));
} }*/
return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel); return !adminCmd || src.hasPermission(ConfigHandler.config.permissionLevel);
} }
public static boolean perm(ServerPlayerEntity src, String perm, boolean adminCmd) { public static boolean perm(ServerPlayer src, String perm, boolean adminCmd) {
if (Flan.permissionAPI) { /*if (Flan.permissionAPI) {
if (adminCmd) if (adminCmd)
return Permissions.check(src, perm, ConfigHandler.config.permissionLevel); return Permissions.check(src, perm, ConfigHandler.config.permissionLevel);
return Permissions.check(src, perm, true); return Permissions.check(src, perm, true);
} }
if (Flan.ftbRanks) { if (Flan.ftbRanks) {
return FTBRanksAPI.getPermissionValue(src, perm).asBoolean().orElse(!adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel)); return FTBRanksAPI.getPermissionValue(src, perm).asBoolean().orElse(!adminCmd || src.hasPermissions(ConfigHandler.config.permissionLevel));
} }*/
return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel); return !adminCmd || src.hasPermissions(ConfigHandler.config.permissionLevel);
} }
public static boolean permBelowEqVal(ServerPlayerEntity src, String perm, int val, int fallback) { public static boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) {
if (Flan.ftbRanks) { /*if (Flan.ftbRanks) {
int max = FTBRanksAPI.getPermissionValue(src, perm).asInteger().orElse(fallback); int max = FTBRanksAPI.getPermissionValue(src, perm).asInteger().orElse(fallback);
return val <= max; return val <= max;
} }*/
return val <= fallback; return val <= fallback;
} }
} }

View File

@ -1,28 +1,17 @@
package io.github.flemmli97.flan.integration.playerability; package io.github.flemmli97.flan.integration.playerability;
import io.github.flemmli97.flan.api.data.IPermissionContainer;
import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.ladysnake.pal.AbilitySource;
import io.github.ladysnake.pal.PlayerAbility;
import io.github.ladysnake.pal.PlayerAbilityEnableCallback;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
public class PlayerAbilityEvents { public class PlayerAbilityEvents {
public static void register() { public static void register() {
PlayerAbilityEnableCallback.EVENT.register(PlayerAbilityEvents::checkAbility); //PlayerAbilityEnableCallback.EVENT.register(PlayerAbilityEvents::checkAbility);
} }
public static boolean checkAbility(PlayerEntity player, PlayerAbility ability, AbilitySource abilitySource) { /*public static boolean checkAbility(Player player, PlayerAbility ability, AbilitySource abilitySource) {
if (player.world.isClient) if (player.level.isClientSide)
return true; return true;
BlockPos pos = player.getBlockPos(); BlockPos pos = player.blockPosition();
ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); ClaimStorage storage = ClaimStorage.get((ServerLevel) player.level);
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
return claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.FLIGHT, pos, true); return claim.canInteract((ServerPlayer) player, PermissionRegistry.FLIGHT, pos, true);
} }*/
} }

View File

@ -2,12 +2,12 @@
"required": true, "required": true,
"minVersion": "0.8", "minVersion": "0.8",
"package": "io.github.flemmli97.flan.fabric.mixin", "package": "io.github.flemmli97.flan.fabric.mixin",
"compatibilityLevel": "JAVA_8", "compatibilityLevel": "JAVA_16",
"mixins": [ "mixins": [
"ServerWorldMixin", "ServerWorldMixin",
"PistonMixin", "PistonMixin",
"SpawnHelperMixin", "SpawnHelperMixin",
"ServerPlayNetworkHandlerMixin", "PlayerInteractEntityMixin",
"ProjectileMixin", "ProjectileMixin",
"EntityDamageMixin", "EntityDamageMixin",
"XpEntityMixin", "XpEntityMixin",

View File

@ -1,9 +1,5 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "5.0.0" id "com.github.johnrengelman.shadow" version "7.1.0"
}
configurations {
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
} }
architectury { architectury {
@ -11,9 +7,18 @@ architectury {
forge() forge()
} }
configurations {
common
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
developmentForge.extendsFrom common
}
loom { loom {
forge {
mixinConfigs = ["flan.mixins.json", "flan.forge.mixins.json"] mixinConfigs = ["flan.mixins.json", "flan.forge.mixins.json"]
useFabricMixin = true }
} }
repositories { repositories {
@ -31,18 +36,11 @@ repositories {
dependencies { dependencies {
forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}"
implementation(project(path: ":common")) { common(project(path: ":common", configuration: "namedElements")) { transitive false }
transitive = false shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
}
developmentForge(project(path: ":common")) {
transitive = false
}
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) {
transitive = false
}
modImplementation("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") //modImplementation("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}")
modImplementation(dicemcmm) //modImplementation(dicemcmm)
} }
processResources { processResources {
@ -70,10 +68,6 @@ jar {
classifier "dev" classifier "dev"
} }
java {
withSourcesJar()
}
sourcesJar { sourcesJar {
def commonSources = project(":common").sourcesJar def commonSources = project(":common").sourcesJar
dependsOn commonSources dependsOn commonSources
@ -81,6 +75,11 @@ sourcesJar {
classifier "forge-sources" classifier "forge-sources"
} }
components.java {
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
skip()
}
}
task apiJar(type: Jar, dependsOn: classes) { task apiJar(type: Jar, dependsOn: classes) {
archiveClassifier.set "forge-api-source" archiveClassifier.set "forge-api-source"

View File

@ -1,6 +1,7 @@
package io.github.flemmli97.flan; package io.github.flemmli97.flan;
import net.minecraft.util.Identifier; import io.github.flemmli97.flan.SimpleRegistryWrapper;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry;
@ -13,12 +14,12 @@ public class ForgeRegistryWrapper<T extends IForgeRegistryEntry<T>> implements S
} }
@Override @Override
public T getFromId(Identifier id) { public T getFromId(ResourceLocation id) {
return this.registry.getValue(id); return this.registry.getValue(id);
} }
@Override @Override
public Identifier getIDFrom(T entry) { public ResourceLocation getIDFrom(T entry) {
return entry.getRegistryName(); return entry.getRegistryName();
} }

Some files were not shown because too many files have changed in this diff Show More