flan/common/src/main/java/io/github/flemmli97/flan/event/ItemInteractEvents.java

286 lines
16 KiB
Java
Raw Normal View History

package io.github.flemmli97.flan.event;
2020-08-23 12:52:36 +00:00
2021-06-08 21:06:01 +00:00
import com.google.common.collect.Sets;
import com.mojang.authlib.GameProfile;
import io.github.flemmli97.flan.api.data.IPermissionContainer;
import io.github.flemmli97.flan.api.permission.ClaimPermission;
import io.github.flemmli97.flan.api.permission.ObjectToPermissionMap;
import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import io.github.flemmli97.flan.claim.Claim;
import io.github.flemmli97.flan.claim.ClaimStorage;
import io.github.flemmli97.flan.claim.PermHelper;
import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.platform.integration.permissions.PermissionNodeHandler;
import io.github.flemmli97.flan.player.EnumEditMode;
import io.github.flemmli97.flan.player.PlayerClaimData;
import io.github.flemmli97.flan.player.display.EnumDisplayType;
2021-12-03 21:37:35 +00:00
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
2021-12-03 21:37:35 +00:00
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
2020-08-23 12:52:36 +00:00
2020-08-24 20:32:29 +00:00
import java.util.Set;
2020-08-23 12:52:36 +00:00
public class ItemInteractEvents {
2021-12-03 21:37:35 +00:00
public static InteractionResultHolder<ItemStack> useItem(Player p, Level world, InteractionHand hand) {
if (!(p instanceof ServerPlayer player) || p.isSpectator())
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(p.getItemInHand(hand));
ItemStack stack = player.getItemInHand(hand);
2020-08-23 12:52:36 +00:00
if (stack.getItem() == ConfigHandler.config.claimingItem) {
2021-12-03 21:37:35 +00:00
HitResult ray = player.pick(64, 0, false);
2020-08-23 12:52:36 +00:00
if (ray != null && ray.getType() == HitResult.Type.BLOCK) {
2020-08-24 19:03:06 +00:00
claimLandHandling(player, ((BlockHitResult) ray).getBlockPos());
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.success(stack);
2020-08-23 12:52:36 +00:00
}
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(stack);
2020-08-23 12:52:36 +00:00
}
if (stack.getItem() == ConfigHandler.config.inspectionItem) {
2021-12-03 21:37:35 +00:00
HitResult ray = player.pick(32, 0, false);
2020-08-23 12:52:36 +00:00
if (ray != null && ray.getType() == HitResult.Type.BLOCK) {
2020-08-24 19:03:06 +00:00
inspect(player, ((BlockHitResult) ray).getBlockPos());
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.success(stack);
2020-08-23 12:52:36 +00:00
}
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(stack);
2020-08-23 12:52:36 +00:00
}
2021-12-03 21:37:35 +00:00
ClaimStorage storage = ClaimStorage.get((ServerLevel) world);
BlockPos pos = player.blockPosition();
BlockHitResult hitResult = getPlayerHitResult(world, player, ClipContext.Fluid.SOURCE_ONLY);
if (hitResult.getType() == HitResult.Type.BLOCK) {
2021-12-03 21:37:35 +00:00
pos = new BlockPlaceContext(player, hand, stack, hitResult).getClickedPos();
}
2020-10-30 14:09:57 +00:00
IPermissionContainer claim = storage.getForPermissionCheck(pos);
2020-08-23 12:52:36 +00:00
if (claim == null)
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(stack);
ClaimPermission perm = ObjectToPermissionMap.getFromItem(stack.getItem());
2021-06-29 16:07:39 +00:00
if (perm != null) {
boolean success = claim.canInteract(player, perm, pos, true);
if (success)
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(stack);
2021-06-29 16:07:39 +00:00
if (perm == PermissionRegistry.PLACE) {
BlockPos update = pos;
if (stack.getItem() == Items.LILY_PAD) {
2021-12-03 21:37:35 +00:00
BlockHitResult upResult = hitResult.withPosition(hitResult.getBlockPos().above());
update = new BlockPlaceContext(new UseOnContext(player, hand, upResult)).getClickedPos();
2021-06-29 16:07:39 +00:00
}
2021-12-03 21:37:35 +00:00
player.connection.send(new ClientboundBlockUpdatePacket(update, world.getBlockState(update)));
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2021-06-29 16:07:39 +00:00
updateHeldItem(player);
}
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.fail(stack);
2021-06-29 16:07:39 +00:00
}
2021-12-03 21:37:35 +00:00
return InteractionResultHolder.pass(stack);
2020-08-23 12:52:36 +00:00
}
2020-08-24 19:03:06 +00:00
2021-05-02 16:24:46 +00:00
private static final Set<Item> blackListedItems = Sets.newHashSet(Items.COMPASS, Items.FILLED_MAP, Items.FIREWORK_ROCKET);
2020-08-25 17:43:52 +00:00
2021-12-03 21:37:35 +00:00
public static InteractionResult onItemUseBlock(UseOnContext context) {
if (!(context.getPlayer() instanceof ServerPlayer player) || context.getItemInHand().isEmpty())
2021-12-03 21:37:35 +00:00
return InteractionResult.PASS;
ClaimStorage storage = ClaimStorage.get((ServerLevel) context.getLevel());
BlockPos placePos = new BlockPlaceContext(context).getClickedPos();
IPermissionContainer claim = storage.getForPermissionCheck(placePos.offset(0, 255, 0));
2020-08-25 17:43:52 +00:00
if (claim == null)
2021-12-03 21:37:35 +00:00
return InteractionResult.PASS;
if (blackListedItems.contains(context.getItemInHand().getItem()))
return InteractionResult.PASS;
2020-10-30 14:09:57 +00:00
boolean actualInClaim = !(claim instanceof Claim) || placePos.getY() >= ((Claim) claim).getDimensions()[4];
2021-12-03 21:37:35 +00:00
ClaimPermission perm = ObjectToPermissionMap.getFromItem(context.getItemInHand().getItem());
if (perm != null) {
if (claim.canInteract(player, perm, placePos, false))
2021-12-03 21:37:35 +00:00
return InteractionResult.PASS;
2020-09-02 13:36:58 +00:00
else if (actualInClaim) {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noPermissionSimple"), ChatFormatting.DARK_RED), true);
2021-12-03 21:37:35 +00:00
return InteractionResult.FAIL;
}
}
if (claim.canInteract(player, PermissionRegistry.PLACE, placePos, false)) {
2021-12-03 21:37:35 +00:00
if (!actualInClaim && context.getItemInHand().getItem() instanceof BlockItem) {
2020-10-30 14:09:57 +00:00
((Claim) claim).extendDownwards(placePos);
}
2021-12-03 21:37:35 +00:00
return InteractionResult.PASS;
2020-09-02 13:36:58 +00:00
} else if (actualInClaim) {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noPermissionSimple"), ChatFormatting.DARK_RED), true);
2021-12-03 21:37:35 +00:00
BlockState other = context.getLevel().getBlockState(placePos.above());
player.connection.send(new ClientboundBlockUpdatePacket(placePos.above(), other));
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
updateHeldItem(player);
2021-12-03 21:37:35 +00:00
return InteractionResult.FAIL;
}
2021-12-03 21:37:35 +00:00
return InteractionResult.PASS;
}
/**
* -2 == Main inventory update
*/
2021-12-03 21:37:35 +00:00
private static void updateHeldItem(ServerPlayer player) {
player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, player.getInventory().selected, player.getInventory().getSelected()));
player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, 40, player.getInventory().getItem(40)));
}
2021-12-03 21:37:35 +00:00
private static boolean cantClaimInWorld(ServerLevel world) {
2020-08-25 17:43:52 +00:00
for (String s : ConfigHandler.config.blacklistedWorlds) {
2021-12-03 21:37:35 +00:00
if (s.equals(world.dimension().location().toString())) {
2020-08-24 19:46:25 +00:00
return true;
}
}
return false;
}
public static boolean canClaimWorld(ServerLevel world, ServerPlayer player) {
PlayerClaimData data = PlayerClaimData.get(player);
if (data.isAdminIgnoreClaim())
return true;
2020-08-25 17:43:52 +00:00
if (ConfigHandler.config.worldWhitelist) {
2023-06-11 19:47:12 +00:00
if (!cantClaimInWorld(player.serverLevel())) {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("landClaimDisabledWorld"), ChatFormatting.DARK_RED), false);
return false;
2020-08-24 19:03:06 +00:00
}
2023-06-11 19:47:12 +00:00
} else if (cantClaimInWorld(player.serverLevel())) {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("landClaimDisabledWorld"), ChatFormatting.DARK_RED), false);
return false;
}
return true;
}
public static void claimLandHandling(ServerPlayer player, BlockPos target) {
if (!PermissionNodeHandler.INSTANCE.perm(player, PermissionNodeHandler.claimCreate, false)) {
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noPermission"), ChatFormatting.DARK_RED), true);
2020-08-24 19:46:25 +00:00
return;
}
2023-06-11 19:47:12 +00:00
if (!canClaimWorld(player.serverLevel(), player))
return;
2023-06-11 19:47:12 +00:00
ClaimStorage storage = ClaimStorage.get(player.serverLevel());
2021-12-03 21:37:35 +00:00
Claim claim = storage.getClaimAt(target.offset(0, 255, 0));
2020-08-24 19:03:06 +00:00
PlayerClaimData data = PlayerClaimData.get(player);
2020-09-02 13:36:58 +00:00
if (data.claimCooldown())
return;
data.setClaimActionCooldown();
2020-08-24 19:03:06 +00:00
if (claim != null) {
if (claim.canInteract(player, PermissionRegistry.EDITCLAIM, target)) {
2020-08-24 19:03:06 +00:00
if (data.getEditMode() == EnumEditMode.SUBCLAIM) {
Claim subClaim = claim.getSubClaim(target);
2020-08-25 17:43:52 +00:00
if (subClaim != null && data.currentEdit() == null) {
2020-08-24 19:03:06 +00:00
if (subClaim.isCorner(target)) {
2021-12-03 21:37:35 +00:00
data.setEditClaim(subClaim, player.blockPosition().getY());
2020-08-24 19:03:06 +00:00
data.setEditingCorner(target);
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("resizeClaim"), ChatFormatting.GOLD), false);
2020-08-25 17:43:52 +00:00
} else {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("cantClaimHere"), ChatFormatting.RED), false);
2020-08-24 19:03:06 +00:00
}
2021-12-03 21:37:35 +00:00
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2020-08-24 19:03:06 +00:00
} else {
2020-08-25 17:43:52 +00:00
if (data.currentEdit() != null) {
2020-09-02 13:36:58 +00:00
if (!data.editingCorner().equals(target)) {
2020-08-25 19:50:41 +00:00
Set<Claim> fl = claim.resizeSubclaim(data.currentEdit(), data.editingCorner(), target);
if (!fl.isEmpty()) {
2021-12-03 21:37:35 +00:00
fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.MAIN, player.blockPosition().getY()));
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("conflictOther"), ChatFormatting.RED), false);
2020-08-25 19:50:41 +00:00
}
data.setEditClaim(null, 0);
data.setEditingCorner(null);
2020-08-24 20:32:29 +00:00
}
2020-08-25 17:43:52 +00:00
} else if (data.editingCorner() != null) {
2020-09-02 13:36:58 +00:00
if (!data.editingCorner().equals(target)) {
2020-08-25 19:50:41 +00:00
Set<Claim> fl = claim.tryCreateSubClaim(data.editingCorner(), target);
2021-12-03 21:37:35 +00:00
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2020-08-25 19:50:41 +00:00
if (!fl.isEmpty()) {
2021-12-03 21:37:35 +00:00
fl.forEach(confl -> data.addDisplayClaim(confl, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("conflictOther"), ChatFormatting.RED), false);
2020-08-25 19:50:41 +00:00
} else {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("subClaimCreateSuccess"), ChatFormatting.GOLD), false);
2020-08-25 19:50:41 +00:00
}
data.setEditingCorner(null);
2020-08-24 19:03:06 +00:00
}
} else
data.setEditingCorner(target);
}
} else {
if (claim.isCorner(target)) {
2021-12-03 21:37:35 +00:00
data.setEditClaim(claim, player.blockPosition().getY());
2020-08-24 19:03:06 +00:00
data.setEditingCorner(target);
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("resizeClaim"), ChatFormatting.GOLD), false);
2020-08-25 17:43:52 +00:00
} else if (data.currentEdit() != null) {
2020-08-24 19:03:06 +00:00
storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player);
2020-08-24 20:19:09 +00:00
data.setEditClaim(null, 0);
2020-08-24 19:03:06 +00:00
data.setEditingCorner(null);
2020-08-25 17:43:52 +00:00
} else {
2021-12-03 21:37:35 +00:00
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("cantClaimHere"), ChatFormatting.RED), false);
2020-08-24 19:03:06 +00:00
}
}
} else {
2021-12-03 21:37:35 +00:00
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("cantClaimHere"), ChatFormatting.RED), false);
2020-08-24 19:03:06 +00:00
}
2020-08-25 17:43:52 +00:00
} else if (data.getEditMode() == EnumEditMode.SUBCLAIM) {
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("wrongMode"), data.getEditMode()), ChatFormatting.RED), false);
2020-08-25 17:43:52 +00:00
} else {
if (data.currentEdit() != null) {
2020-08-24 19:03:06 +00:00
storage.resizeClaim(data.currentEdit(), data.editingCorner(), target, player);
2020-08-24 20:19:09 +00:00
data.setEditClaim(null, 0);
2020-08-24 19:03:06 +00:00
data.setEditingCorner(null);
2020-08-25 17:43:52 +00:00
} else if (data.editingCorner() != null) {
2020-08-24 19:03:06 +00:00
storage.createClaim(data.editingCorner(), target, player);
data.setEditingCorner(null);
2020-08-25 17:43:52 +00:00
} else
2020-08-24 19:03:06 +00:00
data.setEditingCorner(target);
}
}
2021-12-03 21:37:35 +00:00
public static void inspect(ServerPlayer player, BlockPos target) {
2023-06-11 19:47:12 +00:00
Claim claim = ClaimStorage.get(player.serverLevel()).getClaimAt(target);
PlayerClaimData data = PlayerClaimData.get(player);
if (data.claimCooldown())
return;
data.setClaimActionCooldown();
2020-08-24 19:03:06 +00:00
if (claim != null) {
2021-12-03 21:37:35 +00:00
String owner = claim.isAdminClaim() ? "<Admin>" : player.getServer().getProfileCache().get(claim.getOwner()).map(GameProfile::getName).orElse("<UNKOWN>");
2022-01-30 17:31:45 +00:00
Component text = PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("inspectBlockOwner"),
2020-08-24 19:03:06 +00:00
owner,
2021-12-03 21:37:35 +00:00
target.getX(), target.getY(), target.getZ()), ChatFormatting.GREEN);
player.displayClientMessage(text, false);
data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
2020-08-24 19:03:06 +00:00
} else
2022-01-30 17:31:45 +00:00
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("inspectNoClaim"), ChatFormatting.RED), false);
2020-08-24 19:03:06 +00:00
}
/**
* From {@link Item#getPlayerPOVHitResult}
*/
protected static BlockHitResult getPlayerHitResult(Level level, Player player, ClipContext.Fluid fluidMode) {
float xRot = player.getXRot();
float yRot = player.getYRot();
Vec3 eye = player.getEyePosition();
float h = Mth.cos(-yRot * Mth.DEG_TO_RAD - Mth.PI);
float i = Mth.sin(-yRot * Mth.DEG_TO_RAD - Mth.PI);
float j = -Mth.cos(-xRot * Mth.DEG_TO_RAD);
float k = Mth.sin(-xRot * Mth.DEG_TO_RAD);
float l = i * j;
float n = h * j;
Vec3 vec32 = eye.add(l * 5.0D, k * 5.0D, n * 5.0D);
return level.clip(new ClipContext(eye, vec32, net.minecraft.world.level.ClipContext.Block.OUTLINE, fluidMode, player));
}
2020-08-23 12:52:36 +00:00
}