001/*
002 * PlotSquared, a land and world management plugin for Minecraft.
003 * Copyright (C) IntellectualSites <https://intellectualsites.com>
004 * Copyright (C) IntellectualSites team and contributors
005 *
006 * This program is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
018 */
019package com.plotsquared.core.util.task;
020
021import com.plotsquared.core.configuration.caption.TranslatableCaption;
022import com.plotsquared.core.events.PlotMergeEvent;
023import com.plotsquared.core.events.Result;
024import com.plotsquared.core.location.Direction;
025import com.plotsquared.core.player.MetaDataAccess;
026import com.plotsquared.core.player.PlayerMetaDataKeys;
027import com.plotsquared.core.player.PlotPlayer;
028import com.plotsquared.core.plot.Plot;
029import com.plotsquared.core.plot.PlotArea;
030import com.plotsquared.core.util.EventDispatcher;
031import net.kyori.adventure.text.Component;
032import net.kyori.adventure.text.minimessage.tag.Tag;
033import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
034
035import java.util.concurrent.Callable;
036
037public final class AutoClaimFinishTask implements Callable<Boolean> {
038
039    private final PlotPlayer<?> player;
040    private final Plot plot;
041    private final PlotArea area;
042    private final String schematic;
043    private final EventDispatcher eventDispatcher;
044
045    public AutoClaimFinishTask(
046            final PlotPlayer<?> player, final Plot plot, final PlotArea area,
047            final String schematic, final EventDispatcher eventDispatcher
048    ) {
049        this.player = player;
050        this.plot = plot;
051        this.area = area;
052        this.schematic = schematic;
053        this.eventDispatcher = eventDispatcher;
054    }
055
056    @Override
057    public Boolean call() {
058        try (final MetaDataAccess<Boolean> autoAccess
059                     = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_AUTO)) {
060            autoAccess.remove();
061        }
062        if (plot == null) {
063            player.sendMessage(TranslatableCaption.of("errors.no_free_plots"));
064            return false;
065        }
066        plot.claim(player, true, schematic, false, true);
067        eventDispatcher.callPostAuto(player, plot);
068        if (area.isAutoMerge()) {
069            PlotMergeEvent event = this.eventDispatcher.callMerge(plot, Direction.ALL, Integer.MAX_VALUE, player);
070            if (event.getEventResult() == Result.DENY) {
071                player.sendMessage(
072                        TranslatableCaption.of("events.event_denied"),
073                        TagResolver.resolver("value", Tag.inserting(Component.text("Auto Merge")))
074                );
075            } else {
076                if (plot.getPlotModificationManager().autoMerge(event.getDir(), event.getMax(), player.getUUID(), player, true)) {
077                    eventDispatcher.callPostMerge(player, plot);
078                }
079            }
080        }
081        return true;
082    }
083
084}