mirror of
https://github.com/amalthea-mc/ShopChest.git
synced 2024-11-08 19:51:05 +00:00
Outsource external checks for shop creation
Every supported plugin has its own listener for ShopCreateEvent and ShopExtendEvent. I also tried to clean up a bit, there can be done more though.
This commit is contained in:
parent
63e1b263c2
commit
1c8cdb0639
@ -8,6 +8,12 @@ import de.epiceric.shopchest.config.HologramFormat;
|
|||||||
import de.epiceric.shopchest.event.ShopInitializedEvent;
|
import de.epiceric.shopchest.event.ShopInitializedEvent;
|
||||||
import de.epiceric.shopchest.external.PlotSquaredShopFlag;
|
import de.epiceric.shopchest.external.PlotSquaredShopFlag;
|
||||||
import de.epiceric.shopchest.external.WorldGuardShopFlag;
|
import de.epiceric.shopchest.external.WorldGuardShopFlag;
|
||||||
|
import de.epiceric.shopchest.external.listeners.ASkyBlockListener;
|
||||||
|
import de.epiceric.shopchest.external.listeners.GriefPreventionListener;
|
||||||
|
import de.epiceric.shopchest.external.listeners.IslandWorldListener;
|
||||||
|
import de.epiceric.shopchest.external.listeners.PlotSquaredListener;
|
||||||
|
import de.epiceric.shopchest.external.listeners.TownyListener;
|
||||||
|
import de.epiceric.shopchest.external.listeners.USkyBlockListener;
|
||||||
import de.epiceric.shopchest.language.LanguageUtils;
|
import de.epiceric.shopchest.language.LanguageUtils;
|
||||||
import de.epiceric.shopchest.listeners.AreaShopListener;
|
import de.epiceric.shopchest.listeners.AreaShopListener;
|
||||||
import de.epiceric.shopchest.listeners.BlockExplodeListener;
|
import de.epiceric.shopchest.listeners.BlockExplodeListener;
|
||||||
@ -196,6 +202,7 @@ public class ShopChest extends JavaPlugin {
|
|||||||
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
|
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
|
||||||
|
|
||||||
registerListeners();
|
registerListeners();
|
||||||
|
registerExternalListeners();
|
||||||
initializeShops();
|
initializeShops();
|
||||||
|
|
||||||
updater = new ShopUpdater(this);
|
updater = new ShopUpdater(this);
|
||||||
@ -393,6 +400,23 @@ public class ShopChest extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerExternalListeners() {
|
||||||
|
if (hasASkyBlock())
|
||||||
|
getServer().getPluginManager().registerEvents(new ASkyBlockListener(this), this);
|
||||||
|
if (hasGriefPrevention())
|
||||||
|
getServer().getPluginManager().registerEvents(new GriefPreventionListener(this), this);
|
||||||
|
if (hasIslandWorld())
|
||||||
|
getServer().getPluginManager().registerEvents(new IslandWorldListener(this), this);
|
||||||
|
if (hasPlotSquared())
|
||||||
|
getServer().getPluginManager().registerEvents(new PlotSquaredListener(this), this);
|
||||||
|
if (hasTowny())
|
||||||
|
getServer().getPluginManager().registerEvents(new TownyListener(this), this);
|
||||||
|
if (hasUSkyBlock())
|
||||||
|
getServer().getPluginManager().registerEvents(new USkyBlockListener(this), this);
|
||||||
|
if (hasWorldGuard())
|
||||||
|
getServer().getPluginManager().registerEvents(new de.epiceric.shopchest.external.listeners.WorldGuardListener(this), this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the shops
|
* Initializes the shops
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package de.epiceric.shopchest.event;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.shop.Shop;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a player extends a shop (making a chest a double chest)
|
||||||
|
*/
|
||||||
|
public class ShopExtendEvent extends ShopEvent implements Cancellable {
|
||||||
|
private boolean cancelled;
|
||||||
|
private Location newChestLocation;
|
||||||
|
|
||||||
|
public ShopExtendEvent(Player player, Shop shop, Location newChest) {
|
||||||
|
super(player, shop);
|
||||||
|
this.newChestLocation = newChest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Location of the placed chest
|
||||||
|
*/
|
||||||
|
public Location getNewChestLocation() {
|
||||||
|
return newChestLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean cancel) {
|
||||||
|
cancelled = cancel;
|
||||||
|
}
|
||||||
|
}
|
62
src/main/java/de/epiceric/shopchest/external/listeners/ASkyBlockListener.java
vendored
Normal file
62
src/main/java/de/epiceric/shopchest/external/listeners/ASkyBlockListener.java
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.wasteofplastic.askyblock.ASkyBlockAPI;
|
||||||
|
import com.wasteofplastic.askyblock.Island;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
|
||||||
|
public class ASkyBlockListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
|
||||||
|
public ASkyBlockListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableASkyblockIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enableASkyblockIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e) {
|
||||||
|
Island island = ASkyBlockAPI.getInstance().getIslandAt(loc);
|
||||||
|
if (island == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!player.getUniqueId().equals(island.getOwner()) && !island.getMembers().contains(player.getUniqueId())) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: ASkyBlock");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
62
src/main/java/de/epiceric/shopchest/external/listeners/GriefPreventionListener.java
vendored
Normal file
62
src/main/java/de/epiceric/shopchest/external/listeners/GriefPreventionListener.java
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
import me.ryanhamshire.GriefPrevention.Claim;
|
||||||
|
import me.ryanhamshire.GriefPrevention.GriefPrevention;
|
||||||
|
|
||||||
|
public class GriefPreventionListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
private final GriefPrevention griefPrevention;
|
||||||
|
|
||||||
|
public GriefPreventionListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.griefPrevention = plugin.getGriefPrevention();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableGriefPreventionIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enableASkyblockIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e) {
|
||||||
|
Claim claim = griefPrevention.dataStore.getClaimAt(loc, false, null);
|
||||||
|
if (claim == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (claim.allowContainers(player) != null) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: GriefPrevention");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
59
src/main/java/de/epiceric/shopchest/external/listeners/IslandWorldListener.java
vendored
Normal file
59
src/main/java/de/epiceric/shopchest/external/listeners/IslandWorldListener.java
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
import pl.islandworld.api.IslandWorldApi;
|
||||||
|
|
||||||
|
public class IslandWorldListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
|
||||||
|
public IslandWorldListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableIslandWorldIntegration || !IslandWorldApi.isInitialized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enableIslandWorldIntegration || !IslandWorldApi.isInitialized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e) {
|
||||||
|
if (!loc.getWorld().getName().equals(IslandWorldApi.getIslandWorld().getName()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!IslandWorldApi.canBuildOnLocation(player, loc, true)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: IslandWorld");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
80
src/main/java/de/epiceric/shopchest/external/listeners/PlotSquaredListener.java
vendored
Normal file
80
src/main/java/de/epiceric/shopchest/external/listeners/PlotSquaredListener.java
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.github.intellectualsites.plotsquared.plot.object.Location;
|
||||||
|
import com.github.intellectualsites.plotsquared.plot.object.Plot;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.external.PlotSquaredShopFlag;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
|
||||||
|
public class PlotSquaredListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
|
||||||
|
public PlotSquaredListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enablePlotsquaredIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<org.bukkit.Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (org.bukkit.Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enablePlotsquaredIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Outsource shop use external permission
|
||||||
|
|
||||||
|
// @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
// public void onBuySell(ShopBuySellEvent e) {
|
||||||
|
// if (!Config.enablePlotsquaredIntegration)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// ShopType shopType = e.getShop().getShopType();
|
||||||
|
// GroupFlag flag = shopType == ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP;
|
||||||
|
|
||||||
|
// Set<org.bukkit.Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
// for (org.bukkit.Location loc : chestLocations) {
|
||||||
|
// Location plotLocation = new Location(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
||||||
|
// Plot plot = plotLocation.getOwnedPlot();
|
||||||
|
// if (!isFlagAllowed(plot, flag, e.getPlayer())) {
|
||||||
|
// e.setCancelled(true);
|
||||||
|
// plugin.debug("Cancel Reason: PlotSquared");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, org.bukkit.Location loc, Cancellable e) {
|
||||||
|
Location plotLocation = new Location(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
||||||
|
Plot plot = plotLocation.getOwnedPlot();
|
||||||
|
if (!PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, PlotSquaredShopFlag.CREATE_SHOP, player)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: PlotSquared");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
84
src/main/java/de/epiceric/shopchest/external/listeners/TownyListener.java
vendored
Normal file
84
src/main/java/de/epiceric/shopchest/external/listeners/TownyListener.java
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
|
||||||
|
import com.palmergames.bukkit.towny.object.Resident;
|
||||||
|
import com.palmergames.bukkit.towny.object.Town;
|
||||||
|
import com.palmergames.bukkit.towny.object.TownBlock;
|
||||||
|
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
|
||||||
|
public class TownyListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
|
||||||
|
public TownyListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableTownyIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enablePlotsquaredIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e) {
|
||||||
|
TownBlock townBlock = TownyUniverse.getTownBlock(loc);
|
||||||
|
if (townBlock == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Town town = townBlock.getTown();
|
||||||
|
Optional<Resident> playerResident = town.getResidents().stream()
|
||||||
|
.filter(r -> r.getName().equals(player.getName()))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
if (!playerResident.isPresent()) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: Towny (no resident)");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Resident resident = playerResident.get();
|
||||||
|
String plotType = townBlock.getType().name();
|
||||||
|
boolean cancel = (resident.isMayor() && !Config.townyShopPlotsMayor.contains(plotType))
|
||||||
|
|| (resident.isKing() && !Config.townyShopPlotsKing.contains(plotType))
|
||||||
|
|| (!resident.isKing() && !resident.isMayor() && !Config.townyShopPlotsResidents.contains(plotType));
|
||||||
|
|
||||||
|
if (cancel) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: Towny (no permission)");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (NotRegisteredException ignored) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
61
src/main/java/de/epiceric/shopchest/external/listeners/USkyBlockListener.java
vendored
Normal file
61
src/main/java/de/epiceric/shopchest/external/listeners/USkyBlockListener.java
vendored
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
import us.talabrek.ultimateskyblock.api.IslandInfo;
|
||||||
|
import us.talabrek.ultimateskyblock.api.uSkyBlockAPI;
|
||||||
|
|
||||||
|
public class USkyBlockListener implements Listener {
|
||||||
|
private final ShopChest plugin;
|
||||||
|
private final uSkyBlockAPI uSkyBlockAPI;
|
||||||
|
|
||||||
|
public USkyBlockListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.uSkyBlockAPI = plugin.getUSkyBlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableUSkyblockIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enablePlotsquaredIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e) {
|
||||||
|
IslandInfo islandInfo = uSkyBlockAPI.getIslandInfo(loc);
|
||||||
|
if (islandInfo == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!player.getName().equals(islandInfo.getLeader()) && !islandInfo.getMembers().contains(player.getName())) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: uSkyBlock");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
92
src/main/java/de/epiceric/shopchest/external/listeners/WorldGuardListener.java
vendored
Normal file
92
src/main/java/de/epiceric/shopchest/external/listeners/WorldGuardListener.java
vendored
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package de.epiceric.shopchest.external.listeners;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.codemc.worldguardwrapper.WorldGuardWrapper;
|
||||||
|
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
||||||
|
import org.codemc.worldguardwrapper.flag.WrappedState;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.event.ShopCreateEvent;
|
||||||
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
|
|
||||||
|
public class WorldGuardListener implements Listener {
|
||||||
|
|
||||||
|
private final ShopChest plugin;
|
||||||
|
private final WorldGuardWrapper wgWrapper;
|
||||||
|
|
||||||
|
public WorldGuardListener(ShopChest plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.wgWrapper = WorldGuardWrapper.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onCreateShop(ShopCreateEvent e) {
|
||||||
|
if (!Config.enableWorldGuardIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
IWrappedFlag<WrappedState> flag = getStateFlag("create-shop");
|
||||||
|
for (Location loc : chestLocations) {
|
||||||
|
if (handleForLocation(e.getPlayer(), loc, e, flag))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
public void onExtendShop(ShopExtendEvent e) {
|
||||||
|
if (!Config.enableWorldGuardIntegration)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handleForLocation(e.getPlayer(), e.getNewChestLocation(), e, getStateFlag("create-shop"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Outsource shop use external permission
|
||||||
|
|
||||||
|
// @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
|
// public void onBuySell(ShopBuySellEvent e) {
|
||||||
|
// if (!Config.enableWorldGuardIntegration)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// Set<Location> chestLocations = Utils.getChestLocations(e.getShop());
|
||||||
|
// String flagName = e.getShop().getShopType() == ShopType.ADMIN ? "use-admin-shop" : "use-shop";
|
||||||
|
// IWrappedFlag<WrappedState> flag = getStateFlag(flagName);
|
||||||
|
// for (Location loc : chestLocations) {
|
||||||
|
// WrappedState state = wgWrapper.queryFlag(e.getPlayer(), loc, flag).orElse(WrappedState.DENY);
|
||||||
|
// if (state == WrappedState.DENY) {
|
||||||
|
// e.setCancelled(true);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
private boolean handleForLocation(Player player, Location loc, Cancellable e, IWrappedFlag<WrappedState> flag) {
|
||||||
|
WrappedState state = wgWrapper.queryFlag(player, loc, flag).orElse(WrappedState.DENY);
|
||||||
|
if (state == WrappedState.DENY) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
plugin.debug("Cancel Reason: WorldGuard");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IWrappedFlag<WrappedState> getStateFlag(String flagName) {
|
||||||
|
Optional<IWrappedFlag<WrappedState>> flagOptional = wgWrapper.getFlag(flagName, WrappedState.class);
|
||||||
|
if (!flagOptional.isPresent()) {
|
||||||
|
plugin.getLogger().severe("Failed to get WorldGuard flag '" + flagName + "'.");
|
||||||
|
plugin.debug("WorldGuard flag '" + flagName + "' is not present!");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return flagOptional.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -7,9 +7,9 @@ public class Replacement {
|
|||||||
private Placeholder placeholder;
|
private Placeholder placeholder;
|
||||||
private String replacement;
|
private String replacement;
|
||||||
|
|
||||||
public Replacement(Placeholder placeholder, String replacement) {
|
public Replacement(Placeholder placeholder, Object replacement) {
|
||||||
this.placeholder = placeholder;
|
this.placeholder = placeholder;
|
||||||
this.replacement = replacement;
|
this.replacement = String.valueOf(replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,19 +1,12 @@
|
|||||||
package de.epiceric.shopchest.listeners;
|
package de.epiceric.shopchest.listeners;
|
||||||
|
|
||||||
import com.palmergames.bukkit.towny.object.Resident;
|
|
||||||
import com.palmergames.bukkit.towny.object.Town;
|
|
||||||
import com.palmergames.bukkit.towny.object.TownBlock;
|
|
||||||
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
|
||||||
import com.wasteofplastic.askyblock.ASkyBlockAPI;
|
|
||||||
import com.wasteofplastic.askyblock.Island;
|
|
||||||
import de.epiceric.shopchest.ShopChest;
|
import de.epiceric.shopchest.ShopChest;
|
||||||
import de.epiceric.shopchest.config.Config;
|
import de.epiceric.shopchest.config.Config;
|
||||||
import de.epiceric.shopchest.config.Placeholder;
|
import de.epiceric.shopchest.config.Placeholder;
|
||||||
import de.epiceric.shopchest.external.PlotSquaredShopFlag;
|
import de.epiceric.shopchest.event.ShopExtendEvent;
|
||||||
import de.epiceric.shopchest.language.LanguageUtils;
|
import de.epiceric.shopchest.language.LanguageUtils;
|
||||||
import de.epiceric.shopchest.language.Message;
|
import de.epiceric.shopchest.language.Message;
|
||||||
import de.epiceric.shopchest.language.Replacement;
|
import de.epiceric.shopchest.language.Replacement;
|
||||||
import de.epiceric.shopchest.nms.Hologram;
|
|
||||||
import de.epiceric.shopchest.shop.Shop;
|
import de.epiceric.shopchest.shop.Shop;
|
||||||
import de.epiceric.shopchest.shop.Shop.ShopType;
|
import de.epiceric.shopchest.shop.Shop.ShopType;
|
||||||
import de.epiceric.shopchest.utils.Callback;
|
import de.epiceric.shopchest.utils.Callback;
|
||||||
@ -21,9 +14,9 @@ import de.epiceric.shopchest.utils.ItemUtils;
|
|||||||
import de.epiceric.shopchest.utils.Permissions;
|
import de.epiceric.shopchest.utils.Permissions;
|
||||||
import de.epiceric.shopchest.utils.ShopUtils;
|
import de.epiceric.shopchest.utils.ShopUtils;
|
||||||
import de.epiceric.shopchest.utils.Utils;
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
import me.ryanhamshire.GriefPrevention.Claim;
|
|
||||||
import net.milkbowl.vault.economy.EconomyResponse;
|
import net.milkbowl.vault.economy.EconomyResponse;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@ -31,27 +24,18 @@ import org.bukkit.block.BlockFace;
|
|||||||
import org.bukkit.block.Chest;
|
import org.bukkit.block.Chest;
|
||||||
import org.bukkit.block.DoubleChest;
|
import org.bukkit.block.DoubleChest;
|
||||||
import org.bukkit.block.data.type.Chest.Type;
|
import org.bukkit.block.data.type.Chest.Type;
|
||||||
import org.bukkit.entity.ArmorStand;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
import org.codemc.worldguardwrapper.WorldGuardWrapper;
|
|
||||||
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
|
||||||
import org.codemc.worldguardwrapper.flag.WrappedState;
|
|
||||||
|
|
||||||
import pl.islandworld.api.IslandWorldApi;
|
|
||||||
import us.talabrek.ultimateskyblock.api.IslandInfo;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class ChestProtectListener implements Listener {
|
public class ChestProtectListener implements Listener {
|
||||||
|
|
||||||
@ -153,6 +137,9 @@ public class ChestProtectListener implements Listener {
|
|||||||
Chest c = (Chest) b.getState();
|
Chest c = (Chest) b.getState();
|
||||||
Block b2;
|
Block b2;
|
||||||
|
|
||||||
|
// Can't use Utils::getChestLocations since inventory holder
|
||||||
|
// has not been updated yet in this event (for 1.13+)
|
||||||
|
|
||||||
if (Utils.getMajorVersion() < 13) {
|
if (Utils.getMajorVersion() < 13) {
|
||||||
InventoryHolder ih = c.getInventory().getHolder();
|
InventoryHolder ih = c.getInventory().getHolder();
|
||||||
if (!(ih instanceof DoubleChest)) {
|
if (!(ih instanceof DoubleChest)) {
|
||||||
@ -197,117 +184,42 @@ public class ChestProtectListener implements Listener {
|
|||||||
b2 = b.getRelative(neighborFacing);
|
b2 = b.getRelative(neighborFacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shopUtils.isShop(b.getLocation()) || shopUtils.isShop(b2.getLocation())) {
|
final Shop shop = shopUtils.getShop(b2.getLocation());
|
||||||
final Shop shop = shopUtils.getShop(b2.getLocation());
|
if (shop == null)
|
||||||
|
return;
|
||||||
|
|
||||||
plugin.debug(String.format("%s tries to extend %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
|
plugin.debug(String.format("%s tries to extend %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
|
||||||
|
|
||||||
boolean externalPluginsAllowed = true;
|
ShopExtendEvent event = new ShopExtendEvent(p, shop, b.getLocation());
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
if (plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
if (event.isCancelled() && !p.hasPermission(Permissions.EXTEND_PROTECTED)) {
|
||||||
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
e.setCancelled(true);
|
||||||
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag("create-shop", WrappedState.class);
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_EXTEND_PROTECTED));
|
||||||
if (!flag.isPresent()) plugin.debug("WorldGuard flag 'create-shop' is not present!");
|
return;
|
||||||
WrappedState state = flag.map(f -> wgWrapper.queryFlag(p, b.getLocation(), f).orElse(WrappedState.DENY)).orElse(WrappedState.DENY);
|
|
||||||
externalPluginsAllowed = state == WrappedState.ALLOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasTowny() && Config.enableTownyIntegration) {
|
|
||||||
TownBlock townBlock = TownyUniverse.getTownBlock(b.getLocation());
|
|
||||||
if (townBlock != null) {
|
|
||||||
try {
|
|
||||||
Town town = townBlock.getTown();
|
|
||||||
for (Resident resident : town.getResidents()) {
|
|
||||||
if (resident.getName().equals(p.getName())) {
|
|
||||||
if (resident.isMayor()) {
|
|
||||||
externalPluginsAllowed = (Config.townyShopPlotsMayor.contains(townBlock.getType().name()));
|
|
||||||
} else if (resident.isKing()) {
|
|
||||||
externalPluginsAllowed = (Config.townyShopPlotsKing.contains(townBlock.getType().name()));
|
|
||||||
} else {
|
|
||||||
externalPluginsAllowed = (Config.townyShopPlotsResidents.contains(townBlock.getType().name()));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
plugin.debug(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
|
||||||
com.github.intellectualsites.plotsquared.plot.object.Location loc =
|
|
||||||
new com.github.intellectualsites.plotsquared.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
|
|
||||||
|
|
||||||
externalPluginsAllowed = PlotSquaredShopFlag.isFlagAllowedOnPlot(loc.getOwnedPlot(), PlotSquaredShopFlag.CREATE_SHOP, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasUSkyBlock() && Config.enableUSkyblockIntegration) {
|
|
||||||
IslandInfo islandInfo = plugin.getUSkyBlock().getIslandInfo(b.getLocation());
|
|
||||||
if (islandInfo != null) {
|
|
||||||
externalPluginsAllowed = islandInfo.getMembers().contains(p.getName()) || islandInfo.getLeader().equals(p.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasASkyBlock() && Config.enableASkyblockIntegration) {
|
|
||||||
Island island = ASkyBlockAPI.getInstance().getIslandAt(b.getLocation());
|
|
||||||
if (island != null) {
|
|
||||||
if (island.getOwner() == null) {
|
|
||||||
externalPluginsAllowed = island.getMembers().contains(p.getUniqueId());
|
|
||||||
} else {
|
|
||||||
externalPluginsAllowed = island.getMembers().contains(p.getUniqueId()) || island.getOwner().equals(p.getUniqueId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasIslandWorld() && Config.enableIslandWorldIntegration && IslandWorldApi.isInitialized()) {
|
|
||||||
if (b.getWorld().getName().equals(IslandWorldApi.getIslandWorld().getName())) {
|
|
||||||
externalPluginsAllowed = IslandWorldApi.canBuildOnLocation(p, b.getLocation(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasGriefPrevention() && Config.enableGriefPreventionIntegration) {
|
|
||||||
Claim claim = plugin.getGriefPrevention().dataStore.getClaimAt(b.getLocation(), false, null);
|
|
||||||
if (claim != null) {
|
|
||||||
externalPluginsAllowed = claim.allowContainers(p) == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed || p.hasPermission(Permissions.EXTEND_PROTECTED)) {
|
|
||||||
if (shop.getVendor().getUniqueId().equals(p.getUniqueId()) || p.hasPermission(Permissions.EXTEND_OTHER)) {
|
|
||||||
if (ItemUtils.isAir(b.getRelative(BlockFace.UP).getType())) {
|
|
||||||
final Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
|
|
||||||
|
|
||||||
shopUtils.removeShop(shop, true, new Callback<Void>(plugin) {
|
|
||||||
@Override
|
|
||||||
public void onResult(Void result) {
|
|
||||||
newShop.create(true);
|
|
||||||
shopUtils.addShop(newShop, true);
|
|
||||||
plugin.debug(String.format("%s extended %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
e.setCancelled(true);
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_BLOCKED));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
e.setCancelled(true);
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_EXTEND_OTHERS));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
e.setCancelled(true);
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_EXTEND_PROTECTED));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
if (!p.getUniqueId().equals(shop.getVendor().getUniqueId()) && !p.hasPermission(Permissions.EXTEND_OTHER)) {
|
||||||
public void onHologramDamage(EntityDamageEvent e) {
|
e.setCancelled(true);
|
||||||
if (e.getEntity() instanceof ArmorStand) {
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_EXTEND_OTHERS));
|
||||||
if (Hologram.isPartOfHologram((ArmorStand) e.getEntity())) {
|
return;
|
||||||
e.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ItemUtils.isAir(b.getRelative(BlockFace.UP).getType())) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_BLOCKED));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
|
||||||
|
|
||||||
|
shopUtils.removeShop(shop, true, new Callback<Void>(plugin) {
|
||||||
|
@Override
|
||||||
|
public void onResult(Void result) {
|
||||||
|
newShop.create(true);
|
||||||
|
shopUtils.addShop(newShop, true);
|
||||||
|
plugin.debug(String.format("%s extended %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||||
|
@ -1,13 +1,7 @@
|
|||||||
package de.epiceric.shopchest.listeners;
|
package de.epiceric.shopchest.listeners;
|
||||||
|
|
||||||
import com.google.gson.JsonPrimitive;
|
|
||||||
import com.github.intellectualsites.plotsquared.plot.object.Plot;
|
import com.github.intellectualsites.plotsquared.plot.object.Plot;
|
||||||
import com.palmergames.bukkit.towny.object.Resident;
|
import com.google.gson.JsonPrimitive;
|
||||||
import com.palmergames.bukkit.towny.object.Town;
|
|
||||||
import com.palmergames.bukkit.towny.object.TownBlock;
|
|
||||||
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
|
||||||
import com.wasteofplastic.askyblock.ASkyBlockAPI;
|
|
||||||
import com.wasteofplastic.askyblock.Island;
|
|
||||||
import de.epiceric.shopchest.ShopChest;
|
import de.epiceric.shopchest.ShopChest;
|
||||||
import de.epiceric.shopchest.config.Config;
|
import de.epiceric.shopchest.config.Config;
|
||||||
import de.epiceric.shopchest.config.Placeholder;
|
import de.epiceric.shopchest.config.Placeholder;
|
||||||
@ -33,7 +27,6 @@ import de.epiceric.shopchest.utils.Permissions;
|
|||||||
import de.epiceric.shopchest.utils.ShopUtils;
|
import de.epiceric.shopchest.utils.ShopUtils;
|
||||||
import de.epiceric.shopchest.utils.Utils;
|
import de.epiceric.shopchest.utils.Utils;
|
||||||
import fr.xephi.authme.api.v3.AuthMeApi;
|
import fr.xephi.authme.api.v3.AuthMeApi;
|
||||||
import me.ryanhamshire.GriefPrevention.Claim;
|
|
||||||
import net.milkbowl.vault.economy.Economy;
|
import net.milkbowl.vault.economy.Economy;
|
||||||
import net.milkbowl.vault.economy.EconomyResponse;
|
import net.milkbowl.vault.economy.EconomyResponse;
|
||||||
|
|
||||||
@ -54,12 +47,10 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
import org.bukkit.event.player.PlayerArmorStandManipulateEvent;
|
|
||||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
@ -67,9 +58,6 @@ import org.codemc.worldguardwrapper.WorldGuardWrapper;
|
|||||||
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
||||||
import org.codemc.worldguardwrapper.flag.WrappedState;
|
import org.codemc.worldguardwrapper.flag.WrappedState;
|
||||||
|
|
||||||
import pl.islandworld.api.IslandWorldApi;
|
|
||||||
import us.talabrek.ultimateskyblock.api.IslandInfo;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -124,216 +112,47 @@ public class ShopInteractListener implements Listener {
|
|||||||
}.runTaskLater(plugin, 1L);
|
}.runTaskLater(plugin, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
|
||||||
public void onPlayerManipulateArmorStand(PlayerArmorStandManipulateEvent e) {
|
|
||||||
// When clicking an armor stand with an armor item, the armor stand will take it.
|
|
||||||
// As a hologram consists of armor stands, they would also take the item.
|
|
||||||
ArmorStand armorStand = e.getRightClicked();
|
|
||||||
if (Hologram.isPartOfHologram(armorStand)) {
|
|
||||||
e.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onPlayerInteractCreate(PlayerInteractEvent e) {
|
public void onPlayerInteractCreate(PlayerInteractEvent e) {
|
||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
Block b = e.getClickedBlock();
|
Block b = e.getClickedBlock();
|
||||||
|
|
||||||
if (Config.enableAuthMeIntegration && plugin.hasAuthMe() && !AuthMeApi.getInstance().isAuthenticated(p)) return;
|
if (e.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
|
return;
|
||||||
|
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
if (ClickType.getPlayerClickType(p) == null)
|
||||||
if (b.getType().equals(Material.CHEST) || b.getType().equals(Material.TRAPPED_CHEST)) {
|
return;
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
|
||||||
if (ClickType.getPlayerClickType(p) != null) {
|
|
||||||
if (ClickType.getPlayerClickType(p).getClickType() == ClickType.EnumClickType.CREATE) {
|
|
||||||
if (!shopUtils.isShop(b.getLocation())) {
|
|
||||||
|
|
||||||
boolean externalPluginsAllowed = true;
|
if (b.getType() != Material.CHEST && b.getType() != Material.TRAPPED_CHEST)
|
||||||
|
return;
|
||||||
|
|
||||||
Location[] chestLocations = {b.getLocation(), null};
|
if (ClickType.getPlayerClickType(p).getClickType() != ClickType.EnumClickType.CREATE)
|
||||||
|
return;
|
||||||
|
|
||||||
InventoryHolder ih = ((Chest) b.getState()).getInventory().getHolder();
|
if (Config.enableAuthMeIntegration && plugin.hasAuthMe() && !AuthMeApi.getInstance().isAuthenticated(p))
|
||||||
if (ih instanceof DoubleChest) {
|
return;
|
||||||
DoubleChest dc = (DoubleChest) ih;
|
|
||||||
chestLocations[0] = ((Chest) dc.getLeftSide()).getLocation();
|
|
||||||
chestLocations[1] = ((Chest) dc.getRightSide()).getLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
String denyReason = "Event Cancelled";
|
if (shopUtils.isShop(b.getLocation())) {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_ALREADY_SHOP));
|
||||||
if (plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
plugin.debug("Chest is already a shop");
|
||||||
plugin.debug("Checking if WorldGuard allows shop creation...");
|
} else if (e.isCancelled() && !p.hasPermission(Permissions.CREATE_PROTECTED)) {
|
||||||
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_CREATE_PROTECTED));
|
||||||
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag("create-shop", WrappedState.class);
|
plugin.debug(p.getName() + " is not allowed to create a shop on the selected chest");
|
||||||
if (flag.isPresent()) {
|
} else if (!ItemUtils.isAir(b.getRelative(BlockFace.UP).getType())) {
|
||||||
for (Location loc : chestLocations) {
|
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_BLOCKED));
|
||||||
if (loc != null) {
|
plugin.debug("Chest is blocked");
|
||||||
WrappedState state = wgWrapper.queryFlag(p, loc, flag.get()).orElse(WrappedState.DENY);
|
} else {
|
||||||
externalPluginsAllowed = state == WrappedState.ALLOW;
|
ClickType clickType = ClickType.getPlayerClickType(p);
|
||||||
}
|
ShopProduct product = clickType.getProduct();
|
||||||
}
|
double buyPrice = clickType.getBuyPrice();
|
||||||
} else {
|
double sellPrice = clickType.getSellPrice();
|
||||||
plugin.debug("WorldGuard flag 'create-shop' is not present!");
|
ShopType shopType = clickType.getShopType();
|
||||||
}
|
|
||||||
|
create(p, b.getLocation(), product, buyPrice, sellPrice, shopType);
|
||||||
if (!externalPluginsAllowed) denyReason = "WorldGuard";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasTowny() && Config.enableTownyIntegration) {
|
|
||||||
plugin.debug("Checking if Towny allows shop creation...");
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
TownBlock townBlock = TownyUniverse.getTownBlock(loc);
|
|
||||||
if (townBlock != null) {
|
|
||||||
plugin.debug("Plot Type is " + townBlock.getType().name());
|
|
||||||
try {
|
|
||||||
Town town = townBlock.getTown();
|
|
||||||
boolean residentFound = false;
|
|
||||||
for (Resident resident : town.getResidents()) {
|
|
||||||
if (resident.getName().equals(p.getName())) {
|
|
||||||
residentFound = true;
|
|
||||||
if (resident.isMayor()) {
|
|
||||||
plugin.debug(p.getName() + " is mayor of town");
|
|
||||||
externalPluginsAllowed &= (Config.townyShopPlotsMayor.contains(townBlock.getType().name()));
|
|
||||||
} else if (resident.isKing()) {
|
|
||||||
plugin.debug(p.getName() + " is king of town");
|
|
||||||
externalPluginsAllowed &= (Config.townyShopPlotsKing.contains(townBlock.getType().name()));
|
|
||||||
} else {
|
|
||||||
plugin.debug(p.getName() + " is resident in town");
|
|
||||||
externalPluginsAllowed &= (Config.townyShopPlotsResidents.contains(townBlock.getType().name()));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!residentFound) {
|
|
||||||
plugin.debug(p.getName() + " is not resident in town");
|
|
||||||
externalPluginsAllowed = false;
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
plugin.debug(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "Towny";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
|
||||||
plugin.debug("Checking if PlotSquared allows shop creation...");
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
com.github.intellectualsites.plotsquared.plot.object.Location plotLocation = new com.github.intellectualsites.plotsquared.plot.object.Location(
|
|
||||||
loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
|
||||||
|
|
||||||
Plot plot = plotLocation.getOwnedPlot();
|
|
||||||
externalPluginsAllowed &= PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, PlotSquaredShopFlag.CREATE_SHOP, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "PlotSquared";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasUSkyBlock() && Config.enableUSkyblockIntegration) {
|
|
||||||
plugin.debug("Checking if uSkyBlock allows shop creation...");
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
IslandInfo islandInfo = plugin.getUSkyBlock().getIslandInfo(loc);
|
|
||||||
if (islandInfo != null) {
|
|
||||||
plugin.debug("Chest is on island of " + islandInfo.getLeader());
|
|
||||||
externalPluginsAllowed &= islandInfo.getMembers().contains(p.getName()) || islandInfo.getLeader().equals(p.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "uSkyBlock";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasASkyBlock() && Config.enableASkyblockIntegration) {
|
|
||||||
plugin.debug("Checking if ASkyBlock allows shop creation...");
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
Island island = ASkyBlockAPI.getInstance().getIslandAt(loc);
|
|
||||||
if (island != null) {
|
|
||||||
if (island.getOwner() == null) {
|
|
||||||
plugin.debug("Chest is on an unowned island.");
|
|
||||||
externalPluginsAllowed &= island.getMembers().contains(p.getUniqueId());
|
|
||||||
} else {
|
|
||||||
plugin.debug("Chest is on island of " + Bukkit.getOfflinePlayer(island.getOwner()).getName());
|
|
||||||
externalPluginsAllowed &= island.getMembers().contains(p.getUniqueId()) || island.getOwner().equals(p.getUniqueId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "ASkyBlock";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasIslandWorld() && Config.enableIslandWorldIntegration && IslandWorldApi.isInitialized()) {
|
|
||||||
plugin.debug("Checking if IslandWorld allows shop creation...");
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
if (loc.getWorld().getName().equals(IslandWorldApi.getIslandWorld().getName())) {
|
|
||||||
plugin.debug("Chest is in island world");
|
|
||||||
externalPluginsAllowed &= IslandWorldApi.canBuildOnLocation(p, loc, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "IslandWorld";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasGriefPrevention() && Config.enableGriefPreventionIntegration) {
|
|
||||||
plugin.debug("Checking if GriefPrevention allows shop creation...");
|
|
||||||
String gpDenyReason = null;
|
|
||||||
for (Location loc : chestLocations) {
|
|
||||||
if (loc != null) {
|
|
||||||
Claim claim = plugin.getGriefPrevention().dataStore.getClaimAt(loc, false, null);
|
|
||||||
if (claim != null) {
|
|
||||||
plugin.debug("Checking if claim allows container access");
|
|
||||||
gpDenyReason = claim.allowContainers(p);
|
|
||||||
externalPluginsAllowed &= gpDenyReason == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!externalPluginsAllowed) denyReason = "GriefPrevention (" + gpDenyReason + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((e.isCancelled() || !externalPluginsAllowed) && !p.hasPermission(Permissions.CREATE_PROTECTED)) {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_CREATE_PROTECTED));
|
|
||||||
ClickType.removePlayerClickType(p);
|
|
||||||
plugin.debug(p.getName() + " is not allowed to create a shop on the selected chest because " + denyReason);
|
|
||||||
e.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.setCancelled(true);
|
|
||||||
|
|
||||||
if (ItemUtils.isAir(b.getRelative(BlockFace.UP).getType())) {
|
|
||||||
ClickType clickType = ClickType.getPlayerClickType(p);
|
|
||||||
ShopProduct product = clickType.getProduct();
|
|
||||||
double buyPrice = clickType.getBuyPrice();
|
|
||||||
double sellPrice = clickType.getSellPrice();
|
|
||||||
ShopType shopType = clickType.getShopType();
|
|
||||||
|
|
||||||
create(p, b.getLocation(), product, buyPrice, sellPrice, shopType);
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_BLOCKED));
|
|
||||||
plugin.debug("Chest is blocked");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
e.setCancelled(true);
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_ALREADY_SHOP));
|
|
||||||
plugin.debug("Chest is already a shop");
|
|
||||||
}
|
|
||||||
|
|
||||||
ClickType.removePlayerClickType(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.setCancelled(true);
|
||||||
|
ClickType.removePlayerClickType(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<UUID, Set<Integer>> needsConfirmation = new HashMap<>();
|
private Map<UUID, Set<Integer>> needsConfirmation = new HashMap<>();
|
||||||
@ -343,314 +162,292 @@ public class ShopInteractListener implements Listener {
|
|||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
boolean inverted = Config.invertMouseButtons;
|
boolean inverted = Config.invertMouseButtons;
|
||||||
|
|
||||||
if (Utils.getMajorVersion() >= 9) {
|
if (Utils.getMajorVersion() >= 9 && e.getHand() == EquipmentSlot.OFF_HAND)
|
||||||
if (e.getHand() == EquipmentSlot.OFF_HAND) return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) {
|
if (e.getAction() != Action.RIGHT_CLICK_BLOCK && e.getAction() != Action.LEFT_CLICK_BLOCK)
|
||||||
if (b.getType().equals(Material.CHEST) || b.getType().equals(Material.TRAPPED_CHEST)) {
|
return;
|
||||||
if (ClickType.getPlayerClickType(p) != null) {
|
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
if (b.getType() != Material.CHEST && b.getType() != Material.TRAPPED_CHEST)
|
||||||
Shop shop = shopUtils.getShop(b.getLocation());
|
return;
|
||||||
if (shop != null || ClickType.getPlayerClickType(p).getClickType() == ClickType.EnumClickType.CREATE) {
|
|
||||||
switch (ClickType.getPlayerClickType(p).getClickType()) {
|
if (ClickType.getPlayerClickType(p) != null) {
|
||||||
case CREATE:
|
if (e.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
break;
|
return;
|
||||||
|
|
||||||
case INFO:
|
|
||||||
e.setCancelled(true);
|
|
||||||
|
|
||||||
info(p, shop);
|
Shop shop = shopUtils.getShop(b.getLocation());
|
||||||
|
if (shop == null && ClickType.getPlayerClickType(p).getClickType() != ClickType.EnumClickType.CREATE) {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_NO_SHOP));
|
||||||
|
plugin.debug("Chest is not a shop");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ClickType.removePlayerClickType(p);
|
switch (ClickType.getPlayerClickType(p).getClickType()) {
|
||||||
break;
|
case CREATE:
|
||||||
|
return;
|
||||||
|
|
||||||
|
case INFO:
|
||||||
|
info(p, shop);
|
||||||
|
break;
|
||||||
|
|
||||||
case REMOVE:
|
case REMOVE:
|
||||||
e.setCancelled(true);
|
remove(p, shop);
|
||||||
|
break;
|
||||||
|
|
||||||
if (shop.getShopType() == ShopType.ADMIN) {
|
case OPEN:
|
||||||
if (p.hasPermission(Permissions.REMOVE_ADMIN)) {
|
open(p, shop, true);
|
||||||
remove(p, shop);
|
break;
|
||||||
} else {
|
}
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_REMOVE_ADMIN));
|
|
||||||
plugin.debug(p.getName() + " is not permitted to remove an admin shop");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (shop.getVendor().getUniqueId().equals(p.getUniqueId()) || p.hasPermission(Permissions.REMOVE_OTHER)) {
|
|
||||||
remove(p, shop);
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_REMOVE_OTHERS));
|
|
||||||
plugin.debug(p.getName() + " is not permitted to remove another player's shop");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ClickType.removePlayerClickType(p);
|
e.setCancelled(true);
|
||||||
break;
|
ClickType.removePlayerClickType(p);
|
||||||
|
} else {
|
||||||
|
Shop shop = shopUtils.getShop(b.getLocation());
|
||||||
|
|
||||||
case OPEN:
|
if (shop == null)
|
||||||
e.setCancelled(true);
|
return;
|
||||||
|
|
||||||
if (p.getUniqueId().equals(shop.getVendor().getUniqueId()) || p.hasPermission(Permissions.OPEN_OTHER)) {
|
boolean confirmed = needsConfirmation.containsKey(p.getUniqueId()) && needsConfirmation.get(p.getUniqueId()).contains(shop.getID());
|
||||||
open(p, shop, true);
|
|
||||||
} else {
|
if (e.getAction() == Action.LEFT_CLICK_BLOCK && p.isSneaking() && Utils.hasAxeInHand(p)) {
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_OPEN_OTHERS));
|
return;
|
||||||
plugin.debug(p.getName() + " is not permitted to open another player's shop");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ClickType.removePlayerClickType(p);
|
ItemStack infoItem = Config.shopInfoItem;
|
||||||
break;
|
if (infoItem != null) {
|
||||||
}
|
if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||||
} else {
|
ItemStack item = Utils.getItemInMainHand(p);
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CHEST_NO_SHOP));
|
|
||||||
plugin.debug("Chest is not a shop");
|
if (item == null || !(infoItem.getType() == item.getType() && infoItem.getDurability() == item.getDurability())) {
|
||||||
|
item = Utils.getItemInOffHand(p);
|
||||||
|
|
||||||
|
if (item != null && infoItem.getType() == item.getType() && infoItem.getDurability() == item.getDurability()) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
info(p, shop);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
e.setCancelled(true);
|
||||||
|
info(p, shop);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
Shop shop = shopUtils.getShop(b.getLocation());
|
}
|
||||||
|
|
||||||
if (shop != null) {
|
if (e.getAction() == Action.RIGHT_CLICK_BLOCK && p.getUniqueId().equals(shop.getVendor().getUniqueId()) && shop.getShopType() != ShopType.ADMIN) {
|
||||||
boolean confirmed = needsConfirmation.containsKey(p.getUniqueId()) && needsConfirmation.get(p.getUniqueId()).contains(shop.getID());
|
return;
|
||||||
|
}
|
||||||
if (e.getAction() == Action.LEFT_CLICK_BLOCK && p.isSneaking() && Utils.hasAxeInHand(p)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack infoItem = Config.shopInfoItem;
|
if (p.getGameMode() == GameMode.CREATIVE) {
|
||||||
if (infoItem != null) {
|
e.setCancelled(true);
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) {
|
p.sendMessage(LanguageUtils.getMessage(Message.USE_IN_CREATIVE));
|
||||||
ItemStack item = Utils.getItemInMainHand(p);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (item == null || !(infoItem.getType() == item.getType() && infoItem.getDurability() == item.getDurability())) {
|
if ((e.getAction() == Action.RIGHT_CLICK_BLOCK && !inverted) || (e.getAction() == Action.LEFT_CLICK_BLOCK && inverted)) {
|
||||||
item = Utils.getItemInOffHand(p);
|
e.setCancelled(true);
|
||||||
|
|
||||||
if (item != null && infoItem.getType() == item.getType() && infoItem.getDurability() == item.getDurability()) {
|
if (shop.getShopType() == ShopType.ADMIN || !shop.getVendor().getUniqueId().equals(p.getUniqueId())) {
|
||||||
e.setCancelled(true);
|
plugin.debug(p.getName() + " wants to buy");
|
||||||
info(p, shop);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
e.setCancelled(true);
|
|
||||||
info(p, shop);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.getAction() == Action.RIGHT_CLICK_BLOCK && p.getUniqueId().equals(shop.getVendor().getUniqueId()) && shop.getShopType() != ShopType.ADMIN) {
|
if (shop.getBuyPrice() > 0) {
|
||||||
return;
|
if (p.hasPermission(Permissions.BUY)) {
|
||||||
}
|
// TODO: Outsource shop use external permission
|
||||||
|
boolean externalPluginsAllowed = true;
|
||||||
|
|
||||||
if (p.getGameMode() == GameMode.CREATIVE) {
|
if (plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
||||||
e.setCancelled(true);
|
com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.USE_IN_CREATIVE));
|
new com.github.intellectualsites.plotsquared.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((e.getAction() == Action.RIGHT_CLICK_BLOCK && !inverted) || (e.getAction() == Action.LEFT_CLICK_BLOCK && inverted)) {
|
Plot plot = plotLocation.getOwnedPlot();
|
||||||
e.setCancelled(true);
|
GroupFlag flag = shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP;
|
||||||
|
|
||||||
if (shop.getShopType() == ShopType.ADMIN || !shop.getVendor().getUniqueId().equals(p.getUniqueId())) {
|
externalPluginsAllowed = PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, flag, p);
|
||||||
plugin.debug(p.getName() + " wants to buy");
|
|
||||||
|
|
||||||
if (shop.getBuyPrice() > 0) {
|
|
||||||
if (p.hasPermission(Permissions.BUY)) {
|
|
||||||
boolean externalPluginsAllowed = true;
|
|
||||||
|
|
||||||
if (plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
|
||||||
com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
|
|
||||||
new com.github.intellectualsites.plotsquared.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
|
|
||||||
|
|
||||||
Plot plot = plotLocation.getOwnedPlot();
|
|
||||||
GroupFlag flag = shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP;
|
|
||||||
|
|
||||||
externalPluginsAllowed = PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, flag, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
|
||||||
String flagName = (shop.getShopType() == ShopType.ADMIN ? "use-admin-shop" : "use-shop");
|
|
||||||
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
|
||||||
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag(flagName, WrappedState.class);
|
|
||||||
if (!flag.isPresent()) plugin.debug("WorldGuard flag '" + flagName + "' is not present!");
|
|
||||||
WrappedState state = flag.map(f -> wgWrapper.queryFlag(p, b.getLocation(), f).orElse(WrappedState.DENY)).orElse(WrappedState.DENY);
|
|
||||||
externalPluginsAllowed = state == WrappedState.ALLOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shop.getShopType() == ShopType.ADMIN) {
|
|
||||||
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
|
||||||
if (confirmed || !Config.confirmShopping) {
|
|
||||||
buy(p, shop, p.isSneaking());
|
|
||||||
if (Config.confirmShopping) {
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.remove(shop.getID());
|
|
||||||
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
|
||||||
else needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug("Needs confirmation");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.add(shop.getID());
|
|
||||||
needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY_HERE));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
|
||||||
Chest c = (Chest) b.getState();
|
|
||||||
ItemStack itemStack = shop.getProduct().getItemStack();
|
|
||||||
int amount = (p.isSneaking() ? itemStack.getMaxStackSize() : shop.getProduct().getAmount());
|
|
||||||
|
|
||||||
if (Utils.getAmount(c.getInventory(), itemStack) >= amount) {
|
|
||||||
if (confirmed || !Config.confirmShopping) {
|
|
||||||
buy(p, shop, p.isSneaking());
|
|
||||||
if (Config.confirmShopping) {
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.remove(shop.getID());
|
|
||||||
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
|
||||||
else needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug("Needs confirmation");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.add(shop.getID());
|
|
||||||
needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Config.autoCalculateItemAmount && Utils.getAmount(c.getInventory(), itemStack) > 0) {
|
|
||||||
if (confirmed || !Config.confirmShopping) {
|
|
||||||
buy(p, shop, p.isSneaking());
|
|
||||||
if (Config.confirmShopping) {
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.remove(shop.getID());
|
|
||||||
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
|
||||||
else needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug("Needs confirmation");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.add(shop.getID());
|
|
||||||
needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.OUT_OF_STOCK));
|
|
||||||
if (shop.getVendor().isOnline() && Config.enableVendorMessages) {
|
|
||||||
shop.getVendor().getPlayer().sendMessage(LanguageUtils.getMessage(Message.VENDOR_OUT_OF_STOCK,
|
|
||||||
new Replacement(Placeholder.AMOUNT, String.valueOf(shop.getProduct().getAmount())),
|
|
||||||
new Replacement(Placeholder.ITEM_NAME, LanguageUtils.getItemName(itemStack))));
|
|
||||||
}
|
|
||||||
plugin.debug("Shop is out of stock");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY_HERE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY));
|
|
||||||
plugin.debug(p.getName() + " is not permitted to buy");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.BUYING_DISABLED));
|
|
||||||
plugin.debug("Buying is disabled");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ((e.getAction() == Action.LEFT_CLICK_BLOCK && !inverted) || (e.getAction() == Action.RIGHT_CLICK_BLOCK && inverted)) {
|
if (externalPluginsAllowed && plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
||||||
e.setCancelled(true);
|
String flagName = (shop.getShopType() == ShopType.ADMIN ? "use-admin-shop" : "use-shop");
|
||||||
|
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
||||||
if ((shop.getShopType() == ShopType.ADMIN) || (!shop.getVendor().getUniqueId().equals(p.getUniqueId()))) {
|
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag(flagName, WrappedState.class);
|
||||||
plugin.debug(p.getName() + " wants to sell");
|
if (!flag.isPresent()) plugin.debug("WorldGuard flag '" + flagName + "' is not present!");
|
||||||
|
WrappedState state = flag.map(f -> wgWrapper.queryFlag(p, b.getLocation(), f).orElse(WrappedState.DENY)).orElse(WrappedState.DENY);
|
||||||
if (shop.getSellPrice() > 0) {
|
externalPluginsAllowed = state == WrappedState.ALLOW;
|
||||||
if (p.hasPermission(Permissions.SELL)) {
|
}
|
||||||
boolean externalPluginsAllowed = true;
|
|
||||||
|
if (shop.getShopType() == ShopType.ADMIN) {
|
||||||
if (plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
||||||
com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
|
if (confirmed || !Config.confirmShopping) {
|
||||||
new com.github.intellectualsites.plotsquared.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
|
buy(p, shop, p.isSneaking());
|
||||||
|
if (Config.confirmShopping) {
|
||||||
Plot plot = plotLocation.getOwnedPlot();
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
GroupFlag flag = shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP;
|
ids.remove(shop.getID());
|
||||||
|
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
||||||
externalPluginsAllowed = PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, flag, p);
|
else needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
}
|
|
||||||
|
|
||||||
if (externalPluginsAllowed && plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
|
||||||
String flagName = (shop.getShopType() == ShopType.ADMIN ? "use-admin-shop" : "use-shop");
|
|
||||||
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
|
||||||
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag(flagName, WrappedState.class);
|
|
||||||
if (!flag.isPresent()) plugin.debug("WorldGuard flag '" + flagName + "' is not present!");
|
|
||||||
WrappedState state = flag.map(f -> wgWrapper.queryFlag(p, b.getLocation(), f).orElse(WrappedState.DENY)).orElse(WrappedState.DENY);
|
|
||||||
externalPluginsAllowed = state == WrappedState.ALLOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack itemStack = shop.getProduct().getItemStack();
|
|
||||||
|
|
||||||
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
|
||||||
boolean stack = p.isSneaking() && !Utils.hasAxeInHand(p);
|
|
||||||
int amount = stack ? itemStack.getMaxStackSize() : shop.getProduct().getAmount();
|
|
||||||
|
|
||||||
if (Utils.getAmount(p.getInventory(), itemStack) >= amount) {
|
|
||||||
if (confirmed || !Config.confirmShopping) {
|
|
||||||
sell(p, shop, stack);
|
|
||||||
if (Config.confirmShopping) {
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.remove(shop.getID());
|
|
||||||
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
|
||||||
else needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug("Needs confirmation");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.add(shop.getID());
|
|
||||||
needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Config.autoCalculateItemAmount && Utils.getAmount(p.getInventory(), itemStack) > 0) {
|
|
||||||
if (confirmed || !Config.confirmShopping) {
|
|
||||||
sell(p, shop, stack);
|
|
||||||
if (Config.confirmShopping) {
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.remove(shop.getID());
|
|
||||||
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
|
||||||
else needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug("Needs confirmation");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
|
||||||
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
|
||||||
ids.add(shop.getID());
|
|
||||||
needsConfirmation.put(p.getUniqueId(), ids);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NOT_ENOUGH_ITEMS));
|
|
||||||
plugin.debug(p.getName() + " doesn't have enough items");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_SELL_HERE));
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_SELL));
|
plugin.debug("Needs confirmation");
|
||||||
plugin.debug(p.getName() + " is not permitted to sell");
|
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.add(shop.getID());
|
||||||
|
needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p.sendMessage(LanguageUtils.getMessage(Message.SELLING_DISABLED));
|
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
||||||
plugin.debug("Selling is disabled");
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY_HERE));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
e.setCancelled(false);
|
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
||||||
|
Chest c = (Chest) b.getState();
|
||||||
|
ItemStack itemStack = shop.getProduct().getItemStack();
|
||||||
|
int amount = (p.isSneaking() ? itemStack.getMaxStackSize() : shop.getProduct().getAmount());
|
||||||
|
|
||||||
|
if (Utils.getAmount(c.getInventory(), itemStack) >= amount) {
|
||||||
|
if (confirmed || !Config.confirmShopping) {
|
||||||
|
buy(p, shop, p.isSneaking());
|
||||||
|
if (Config.confirmShopping) {
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.remove(shop.getID());
|
||||||
|
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
||||||
|
else needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug("Needs confirmation");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.add(shop.getID());
|
||||||
|
needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (Config.autoCalculateItemAmount && Utils.getAmount(c.getInventory(), itemStack) > 0) {
|
||||||
|
if (confirmed || !Config.confirmShopping) {
|
||||||
|
buy(p, shop, p.isSneaking());
|
||||||
|
if (Config.confirmShopping) {
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.remove(shop.getID());
|
||||||
|
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
||||||
|
else needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug("Needs confirmation");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.add(shop.getID());
|
||||||
|
needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.OUT_OF_STOCK));
|
||||||
|
if (shop.getVendor().isOnline() && Config.enableVendorMessages) {
|
||||||
|
shop.getVendor().getPlayer().sendMessage(LanguageUtils.getMessage(Message.VENDOR_OUT_OF_STOCK,
|
||||||
|
new Replacement(Placeholder.AMOUNT, String.valueOf(shop.getProduct().getAmount())),
|
||||||
|
new Replacement(Placeholder.ITEM_NAME, LanguageUtils.getItemName(itemStack))));
|
||||||
|
}
|
||||||
|
plugin.debug("Shop is out of stock");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY_HERE));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_BUY));
|
||||||
|
plugin.debug(p.getName() + " is not permitted to buy");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.BUYING_DISABLED));
|
||||||
|
plugin.debug("Buying is disabled");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if ((e.getAction() == Action.LEFT_CLICK_BLOCK && !inverted) || (e.getAction() == Action.RIGHT_CLICK_BLOCK && inverted)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
|
||||||
|
if ((shop.getShopType() == ShopType.ADMIN) || (!shop.getVendor().getUniqueId().equals(p.getUniqueId()))) {
|
||||||
|
plugin.debug(p.getName() + " wants to sell");
|
||||||
|
|
||||||
|
if (shop.getSellPrice() > 0) {
|
||||||
|
if (p.hasPermission(Permissions.SELL)) {
|
||||||
|
// TODO: Outsource shop use external permission
|
||||||
|
boolean externalPluginsAllowed = true;
|
||||||
|
|
||||||
|
if (plugin.hasPlotSquared() && Config.enablePlotsquaredIntegration) {
|
||||||
|
com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
|
||||||
|
new com.github.intellectualsites.plotsquared.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
|
||||||
|
|
||||||
|
Plot plot = plotLocation.getOwnedPlot();
|
||||||
|
GroupFlag flag = shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP;
|
||||||
|
|
||||||
|
externalPluginsAllowed = PlotSquaredShopFlag.isFlagAllowedOnPlot(plot, flag, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (externalPluginsAllowed && plugin.hasWorldGuard() && Config.enableWorldGuardIntegration) {
|
||||||
|
String flagName = (shop.getShopType() == ShopType.ADMIN ? "use-admin-shop" : "use-shop");
|
||||||
|
WorldGuardWrapper wgWrapper = WorldGuardWrapper.getInstance();
|
||||||
|
Optional<IWrappedFlag<WrappedState>> flag = wgWrapper.getFlag(flagName, WrappedState.class);
|
||||||
|
if (!flag.isPresent()) plugin.debug("WorldGuard flag '" + flagName + "' is not present!");
|
||||||
|
WrappedState state = flag.map(f -> wgWrapper.queryFlag(p, b.getLocation(), f).orElse(WrappedState.DENY)).orElse(WrappedState.DENY);
|
||||||
|
externalPluginsAllowed = state == WrappedState.ALLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack itemStack = shop.getProduct().getItemStack();
|
||||||
|
|
||||||
|
if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) {
|
||||||
|
boolean stack = p.isSneaking() && !Utils.hasAxeInHand(p);
|
||||||
|
int amount = stack ? itemStack.getMaxStackSize() : shop.getProduct().getAmount();
|
||||||
|
|
||||||
|
if (Utils.getAmount(p.getInventory(), itemStack) >= amount) {
|
||||||
|
if (confirmed || !Config.confirmShopping) {
|
||||||
|
sell(p, shop, stack);
|
||||||
|
if (Config.confirmShopping) {
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.remove(shop.getID());
|
||||||
|
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
||||||
|
else needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug("Needs confirmation");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.add(shop.getID());
|
||||||
|
needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (Config.autoCalculateItemAmount && Utils.getAmount(p.getInventory(), itemStack) > 0) {
|
||||||
|
if (confirmed || !Config.confirmShopping) {
|
||||||
|
sell(p, shop, stack);
|
||||||
|
if (Config.confirmShopping) {
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.remove(shop.getID());
|
||||||
|
if (ids.isEmpty()) needsConfirmation.remove(p.getUniqueId());
|
||||||
|
else needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug("Needs confirmation");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.CLICK_TO_CONFIRM));
|
||||||
|
Set<Integer> ids = needsConfirmation.containsKey(p.getUniqueId()) ? needsConfirmation.get(p.getUniqueId()) : new HashSet<Integer>();
|
||||||
|
ids.add(shop.getID());
|
||||||
|
needsConfirmation.put(p.getUniqueId(), ids);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.NOT_ENOUGH_ITEMS));
|
||||||
|
plugin.debug(p.getName() + " doesn't have enough items");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.debug(p.getName() + " doesn't have external plugin's permission");
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_SELL_HERE));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_SELL));
|
||||||
|
plugin.debug(p.getName() + " is not permitted to sell");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(LanguageUtils.getMessage(Message.SELLING_DISABLED));
|
||||||
|
plugin.debug("Selling is disabled");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
e.setCancelled(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -752,17 +549,16 @@ public class ShopInteractListener implements Listener {
|
|||||||
|
|
||||||
ShopCreateEvent event = new ShopCreateEvent(executor, shop, creationPrice);
|
ShopCreateEvent event = new ShopCreateEvent(executor, shop, creationPrice);
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
if (event.isCancelled() && !executor.hasPermission(Permissions.CREATE_PROTECTED)) {
|
||||||
if (event.isCancelled()) {
|
|
||||||
plugin.debug("Create event cancelled");
|
plugin.debug("Create event cancelled");
|
||||||
|
executor.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_CREATE_PROTECTED));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EconomyResponse r = plugin.getEconomy().withdrawPlayer(executor, location.getWorld().getName(), creationPrice);
|
EconomyResponse r = plugin.getEconomy().withdrawPlayer(executor, location.getWorld().getName(), creationPrice);
|
||||||
if (!r.transactionSuccess()) {
|
if (!r.transactionSuccess()) {
|
||||||
plugin.debug("Economy transaction failed: " + r.errorMessage);
|
plugin.debug("Economy transaction failed: " + r.errorMessage);
|
||||||
executor.sendMessage(LanguageUtils.getMessage(Message.ERROR_OCCURRED,
|
executor.sendMessage(LanguageUtils.getMessage(Message.ERROR_OCCURRED, new Replacement(Placeholder.ERROR, r.errorMessage)));
|
||||||
new Replacement(Placeholder.ERROR, r.errorMessage)));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,14 +567,8 @@ public class ShopInteractListener implements Listener {
|
|||||||
plugin.debug("Shop created");
|
plugin.debug("Shop created");
|
||||||
shopUtils.addShop(shop, true);
|
shopUtils.addShop(shop, true);
|
||||||
|
|
||||||
Replacement placeholder = new Replacement(
|
Message message = shopType == ShopType.ADMIN ? Message.ADMIN_SHOP_CREATED : Message.SHOP_CREATED;
|
||||||
Placeholder.CREATION_PRICE, String.valueOf(creationPrice));
|
executor.sendMessage(LanguageUtils.getMessage(message, new Replacement(Placeholder.CREATION_PRICE, creationPrice)));
|
||||||
|
|
||||||
if (shopType == ShopType.ADMIN) {
|
|
||||||
executor.sendMessage(LanguageUtils.getMessage(Message.ADMIN_SHOP_CREATED, placeholder));
|
|
||||||
} else {
|
|
||||||
executor.sendMessage(LanguageUtils.getMessage(Message.SHOP_CREATED, placeholder));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -787,6 +577,17 @@ public class ShopInteractListener implements Listener {
|
|||||||
* @param shop Shop to be removed
|
* @param shop Shop to be removed
|
||||||
*/
|
*/
|
||||||
private void remove(Player executor, Shop shop) {
|
private void remove(Player executor, Shop shop) {
|
||||||
|
if (shop.getShopType() == ShopType.ADMIN && !executor.hasPermission(Permissions.REMOVE_ADMIN)) {
|
||||||
|
executor.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_REMOVE_ADMIN));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shop.getShopType() == ShopType.NORMAL && !executor.getUniqueId().equals(shop.getVendor().getUniqueId())
|
||||||
|
&& !executor.hasPermission(Permissions.REMOVE_OTHER)) {
|
||||||
|
executor.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_REMOVE_OTHERS));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
plugin.debug(executor.getName() + " is removing " + shop.getVendor().getName() + "'s shop (#" + shop.getID() + ")");
|
plugin.debug(executor.getName() + " is removing " + shop.getVendor().getName() + "'s shop (#" + shop.getID() + ")");
|
||||||
ShopRemoveEvent event = new ShopRemoveEvent(executor, shop);
|
ShopRemoveEvent event = new ShopRemoveEvent(executor, shop);
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
@ -817,6 +618,11 @@ public class ShopInteractListener implements Listener {
|
|||||||
* @param message Whether the player should receive the {@link Message#OPENED_SHOP} message
|
* @param message Whether the player should receive the {@link Message#OPENED_SHOP} message
|
||||||
*/
|
*/
|
||||||
private void open(Player executor, Shop shop, boolean message) {
|
private void open(Player executor, Shop shop, boolean message) {
|
||||||
|
if (!executor.getUniqueId().equals(shop.getVendor().getUniqueId()) && !executor.hasPermission(Permissions.OPEN_OTHER)) {
|
||||||
|
executor.sendMessage(LanguageUtils.getMessage(Message.NO_PERMISSION_OPEN_OTHERS));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
plugin.debug(executor.getName() + " is opening " + shop.getVendor().getName() + "'s shop (#" + shop.getID() + ")");
|
plugin.debug(executor.getName() + " is opening " + shop.getVendor().getName() + "'s shop (#" + shop.getID() + ")");
|
||||||
ShopOpenEvent event = new ShopOpenEvent(executor, shop);
|
ShopOpenEvent event = new ShopOpenEvent(executor, shop);
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
@ -1,37 +1,28 @@
|
|||||||
package de.epiceric.shopchest.listeners;
|
package de.epiceric.shopchest.listeners;
|
||||||
|
|
||||||
import de.epiceric.shopchest.ShopChest;
|
import java.util.Optional;
|
||||||
import de.epiceric.shopchest.config.Config;
|
|
||||||
import de.epiceric.shopchest.nms.Hologram;
|
|
||||||
import de.epiceric.shopchest.shop.Shop;
|
|
||||||
import de.epiceric.shopchest.utils.ClickType;
|
|
||||||
import de.epiceric.shopchest.utils.ClickType.EnumClickType;
|
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.Chest;
|
import org.bukkit.block.Chest;
|
||||||
import org.bukkit.entity.ArmorStand;
|
|
||||||
import org.bukkit.entity.Entity;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event.Result;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.Event.Result;
|
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
||||||
import org.bukkit.event.inventory.InventoryOpenEvent;
|
import org.bukkit.event.inventory.InventoryOpenEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.codemc.worldguardwrapper.WorldGuardWrapper;
|
import org.codemc.worldguardwrapper.WorldGuardWrapper;
|
||||||
import org.codemc.worldguardwrapper.event.AbstractWrappedEvent;
|
|
||||||
import org.codemc.worldguardwrapper.event.WrappedDamageEntityEvent;
|
|
||||||
import org.codemc.worldguardwrapper.event.WrappedUseBlockEvent;
|
import org.codemc.worldguardwrapper.event.WrappedUseBlockEvent;
|
||||||
import org.codemc.worldguardwrapper.event.WrappedUseEntityEvent;
|
|
||||||
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
import org.codemc.worldguardwrapper.flag.IWrappedFlag;
|
||||||
import org.codemc.worldguardwrapper.flag.WrappedState;
|
import org.codemc.worldguardwrapper.flag.WrappedState;
|
||||||
|
|
||||||
import java.util.Optional;
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Config;
|
||||||
|
import de.epiceric.shopchest.shop.Shop;
|
||||||
|
import de.epiceric.shopchest.utils.ClickType;
|
||||||
|
import de.epiceric.shopchest.utils.ClickType.EnumClickType;
|
||||||
|
|
||||||
public class WorldGuardListener implements Listener {
|
public class WorldGuardListener implements Listener {
|
||||||
|
|
||||||
@ -61,7 +52,7 @@ public class WorldGuardListener implements Listener {
|
|||||||
|
|
||||||
if (shop != null) {
|
if (shop != null) {
|
||||||
// Don't show 'permission denied' messages for any kind of
|
// Don't show 'permission denied' messages for any kind of
|
||||||
// shop interaction even if entity/block interaction is not
|
// shop interaction even if block interaction is not
|
||||||
// allowed in the region.
|
// allowed in the region.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -69,44 +60,6 @@ public class WorldGuardListener implements Listener {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleEntityInteraction(Player player, Entity entity, AbstractWrappedEvent event) {
|
|
||||||
if (entity.getType() == EntityType.ARMOR_STAND) {
|
|
||||||
if (!Hologram.isPartOfHologram((ArmorStand) entity))
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (Shop shop : plugin.getShopUtils().getShops()) {
|
|
||||||
if (shop.getHologram() != null && shop.getHologram().contains((ArmorStand) entity)) {
|
|
||||||
if (isAllowed(player, shop.getLocation())) {
|
|
||||||
event.setResult(Result.ALLOW);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
|
||||||
public void onUseEntity(WrappedUseEntityEvent event) {
|
|
||||||
if (Config.enableWorldGuardIntegration) {
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
|
|
||||||
if (event.getOriginalEvent() instanceof PlayerInteractAtEntityEvent) {
|
|
||||||
handleEntityInteraction(player, event.getEntity(), event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
|
||||||
public void onDamageEntity(WrappedDamageEntityEvent event) {
|
|
||||||
if (Config.enableWorldGuardIntegration) {
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
|
|
||||||
if (event.getOriginalEvent() instanceof EntityDamageByEntityEvent) {
|
|
||||||
handleEntityInteraction(player, event.getEntity(), event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
public void onUseBlock(WrappedUseBlockEvent event) {
|
public void onUseBlock(WrappedUseBlockEvent event) {
|
||||||
if (Config.enableWorldGuardIntegration) {
|
if (Config.enableWorldGuardIntegration) {
|
||||||
|
@ -1,26 +1,5 @@
|
|||||||
package de.epiceric.shopchest.utils;
|
package de.epiceric.shopchest.utils;
|
||||||
|
|
||||||
import de.epiceric.shopchest.ShopChest;
|
|
||||||
import de.epiceric.shopchest.config.Placeholder;
|
|
||||||
import de.epiceric.shopchest.language.LanguageUtils;
|
|
||||||
import de.epiceric.shopchest.language.Message;
|
|
||||||
import de.epiceric.shopchest.language.Replacement;
|
|
||||||
import de.epiceric.shopchest.nms.CustomBookMeta;
|
|
||||||
import de.epiceric.shopchest.nms.JsonBuilder;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.configuration.InvalidConfigurationException;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
|
||||||
import org.bukkit.inventory.meta.*;
|
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -29,12 +8,40 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Chest;
|
||||||
|
import org.bukkit.block.DoubleChest;
|
||||||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import de.epiceric.shopchest.ShopChest;
|
||||||
|
import de.epiceric.shopchest.config.Placeholder;
|
||||||
|
import de.epiceric.shopchest.language.LanguageUtils;
|
||||||
|
import de.epiceric.shopchest.language.Message;
|
||||||
|
import de.epiceric.shopchest.language.Replacement;
|
||||||
|
import de.epiceric.shopchest.nms.CustomBookMeta;
|
||||||
|
import de.epiceric.shopchest.nms.JsonBuilder;
|
||||||
|
import de.epiceric.shopchest.shop.Shop;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -285,6 +292,24 @@ public class Utils {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a set for the location(s) of the shop's chest(s)
|
||||||
|
* @param shop The shop
|
||||||
|
* @return A set of 1 or 2 locations
|
||||||
|
*/
|
||||||
|
public static Set<Location> getChestLocations(Shop shop) {
|
||||||
|
Set<Location> chestLocations = new HashSet<>();
|
||||||
|
InventoryHolder ih = shop.getInventoryHolder();
|
||||||
|
if (ih instanceof DoubleChest) {
|
||||||
|
DoubleChest dc = (DoubleChest) ih;
|
||||||
|
chestLocations.add(((Chest) dc.getLeftSide()).getLocation());
|
||||||
|
chestLocations.add(((Chest) dc.getRightSide()).getLocation());
|
||||||
|
} else {
|
||||||
|
chestLocations.add(shop.getLocation());
|
||||||
|
}
|
||||||
|
return chestLocations;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a clickable update notification to the given player.
|
* Send a clickable update notification to the given player.
|
||||||
* @param plugin An instance of the {@link ShopChest} plugin
|
* @param plugin An instance of the {@link ShopChest} plugin
|
||||||
|
Loading…
Reference in New Issue
Block a user