package tc.oc.pgm.tnt.license;
import javax.inject.Inject;
import org.bukkit.Material;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.PlayerInventory;
import tc.oc.api.docs.User;
import tc.oc.commons.bukkit.chat.WarningComponent;
import tc.oc.commons.bukkit.event.targeted.TargetedEventHandler;
import tc.oc.pgm.events.ListenerScope;
import tc.oc.pgm.events.PlayerBlockTransformEvent;
import tc.oc.pgm.events.PlayerItemTransferEvent;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.match.MatchPlayerFacet;
import tc.oc.pgm.match.MatchScope;
import tc.oc.pgm.tnt.TNTProperties;
import static org.bukkit.Material.FLINT_AND_STEEL;
import static tc.oc.pgm.events.ItemTransferEvent.Type.PICKUP;
import static tc.oc.pgm.events.ItemTransferEvent.Type.PLUGIN;
/**
* Restricts access to TNT related items if the {@link MatchPlayer} has no license.
*/
@ListenerScope(MatchScope.LOADED)
public class LicenseAccessPlayerFacet implements MatchPlayerFacet, Listener {
private final User user;
private final MatchPlayer self;
private final TNTProperties tntProperties;
private final LicenseConfiguration licenseConfiguration;
@Inject LicenseAccessPlayerFacet(User user, MatchPlayer self, TNTProperties tntProperties, LicenseConfiguration licenseConfiguration) {
this.user = user;
this.self = self;
this.tntProperties = tntProperties;
this.licenseConfiguration = licenseConfiguration;
}
private boolean restrictAccess() {
return licenseConfiguration.controlAccess() &&
tntProperties.licensing &&
user.granted_tnt_license_at() == null;
}
@TargetedEventHandler(ignoreCancelled = true)
public void onItemAcquire(PlayerItemTransferEvent event) {
if(restrictAccess() && event.isAcquiring() && isRestricted(event.getItemStack().getType())) {
event.setCancelled(true);
if(event.getType() != PLUGIN && event.getType() != PICKUP) {
sendWarning();
}
}
}
@TargetedEventHandler(ignoreCancelled = true)
public void onBlockTransform(PlayerBlockTransformEvent event) {
if(restrictAccess() && isRestricted(event.getBlock().getType())) {
event.setCancelled(true);
if(event.isManual()) {
sendWarning();
}
}
}
@TargetedEventHandler(ignoreCancelled = true)
public void onInteract(PlayerInteractEvent event) {
if(!restrictAccess()) return;
if(event.getAction() == Action.RIGHT_CLICK_BLOCK) {
switch(event.getClickedBlock().getType()) {
case STONE_BUTTON:
case WOOD_BUTTON:
case LEVER:
case DIODE_BLOCK_OFF:
case DIODE_BLOCK_ON:
case REDSTONE_COMPARATOR_OFF:
case REDSTONE_COMPARATOR_ON:
event.setCancelled(true);
sendWarning();
break;
case TNT:
if(event.getItem() != null && event.getItem().getType() == FLINT_AND_STEEL) {
event.setCancelled(true);
sendWarning();
}
break;
}
} else if(event.getAction() == Action.PHYSICAL) {
switch(event.getClickedBlock().getType()) {
case STONE_PLATE:
case WOOD_PLATE:
case GOLD_PLATE:
case IRON_PLATE:
case TRIPWIRE:
event.setCancelled(true);
break;
}
}
}
@TargetedEventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onRevoke(LicenseRevokeEvent event) {
if(event.hadLicense()) {
final PlayerInventory inventory = self.getInventory();
inventory.contents().stream()
.filter(item -> item != null && isRestricted(item.getType()))
.forEach(inventory::remove);
}
}
private void sendWarning() {
self.sendMessage(new WarningComponent("tnt.license.use.restricted", "/tnt request"));
}
private boolean isRestricted(Material material) {
switch(material) {
case REDSTONE:
case REDSTONE_WIRE:
case REDSTONE_BLOCK:
case REDSTONE_TORCH_OFF:
case REDSTONE_TORCH_ON:
case TNT:
return true;
default:
return false;
}
}
}