Fixed nether-portals flag on 1.14

This needs clean up later...
This commit is contained in:
isokissa3 2019-08-05 22:17:40 +03:00
parent be129516c7
commit 78add0a96f
19 changed files with 201 additions and 69 deletions

View file

@ -39,8 +39,29 @@
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sk89q-repo</id>
<url>https://maven.sk89q.com/repo/</url>
</repository>
<repository>
<id>ess-repo</id>
<url>http://repo.ess3.net/content/groups/essentials</url>
</repository>
<repository>
<id>empcraft</id>
<url>http://ci.athion.net/job/FastAsyncWorldEdit/ws/mvn/</url>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>http://repo.dmulloy2.net/nexus/repository/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
@ -67,5 +88,48 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.goldtreeservers.worldguardextraflags</groupId>
<artifactId>spigot-1_14</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
<version>7.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-legacy</artifactId>
<version>7.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>Essentials</artifactId>
<version>2.13-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.boydti</groupId>
<artifactId>fawe-api</artifactId>
<version>18.07.27-3ed2e57-1163-20.5.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib-API</artifactId>
<version>4.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,225 @@
package net.goldtreeservers.worldguardextraflags;
import java.lang.reflect.ParameterizedType;
import org.bukkit.World;
import org.bukkit.block.BlockState;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import org.bukkit.event.world.PortalCreateEvent;
import org.bukkit.plugin.Plugin;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import lombok.Getter;
import net.goldtreeservers.worldguardextraflags.essentials.EssentialsHelper;
import net.goldtreeservers.worldguardextraflags.fawe.FAWEHelper;
import net.goldtreeservers.worldguardextraflags.listeners.BlockListener;
import net.goldtreeservers.worldguardextraflags.listeners.EntityListener;
import net.goldtreeservers.worldguardextraflags.listeners.EntityListenerOnePointNine;
import net.goldtreeservers.worldguardextraflags.listeners.EntityPotionEffectEventListener;
import net.goldtreeservers.worldguardextraflags.listeners.PlayerListener;
import net.goldtreeservers.worldguardextraflags.listeners.WorldEditListener;
import net.goldtreeservers.worldguardextraflags.listeners.WorldListener;
import net.goldtreeservers.worldguardextraflags.protocollib.ProtocolLibHelper;
import net.goldtreeservers.worldguardextraflags.utils.SupportedFeatures;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.WorldGuardCommunicator;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.v6.WorldGuardSixCommunicator;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.v7.WorldGuardSevenCommunicator;
public class WorldGuardExtraFlagsPlugin extends AbstractWorldGuardExtraFlagsPlugin
{
@Getter private static WorldGuardExtraFlagsPlugin plugin;
@Getter private WorldGuardPlugin worldGuardPlugin;
@Getter private WorldEditPlugin worldEditPlugin;
@Getter private EssentialsHelper essentialsHelper;
@Getter private FAWEHelper faweHelper;
@Getter private ProtocolLibHelper protocolLibHelper;
public WorldGuardExtraFlagsPlugin()
{
WorldGuardExtraFlagsPlugin.plugin = this;
}
@Override
public void onLoad()
{
this.worldEditPlugin = (WorldEditPlugin)this.getServer().getPluginManager().getPlugin("WorldEdit");
this.worldGuardPlugin = (WorldGuardPlugin)this.getServer().getPluginManager().getPlugin("WorldGuard");
this.worldGuardCommunicator = WorldGuardExtraFlagsPlugin.createWorldGuardCommunicator();
if (this.worldGuardCommunicator == null)
{
throw new RuntimeException("Unsupported WorldGuard version: " + this.worldGuardPlugin.getDescription().getVersion());
}
WorldGuardUtils.setCommunicator(this.worldGuardCommunicator);
try
{
this.worldGuardCommunicator.onLoad(this);
}
catch (Exception e)
{
this.getServer().getPluginManager().disablePlugin(this);
throw new RuntimeException("Failed to load WorldGuard communicator", e);
}
//Soft dependencies, due to some compatibility issues or add flags related to a plugin
try
{
Plugin essentialsPlugin = WorldGuardExtraFlagsPlugin.getPlugin().getServer().getPluginManager().getPlugin("Essentials");
if (essentialsPlugin != null)
{
this.essentialsHelper = new EssentialsHelper(this, essentialsPlugin);
}
}
catch(Throwable ignore)
{
}
try
{
Plugin fastAsyncWorldEditPlugin = this.getServer().getPluginManager().getPlugin("FastAsyncWorldEdit");
if (fastAsyncWorldEditPlugin != null)
{
this.faweHelper = new FAWEHelper(this, fastAsyncWorldEditPlugin);
}
}
catch(Throwable ignore)
{
}
try
{
Plugin protocolLibPlugin = this.getServer().getPluginManager().getPlugin("ProtocolLib");
if (protocolLibPlugin != null)
{
this.protocolLibHelper = new ProtocolLibHelper(this, protocolLibPlugin);
}
}
catch(Throwable ignore)
{
}
}
@Override
public void onEnable()
{
if (this.worldGuardCommunicator == null)
{
this.getServer().getPluginManager().disablePlugin(this);
return;
}
try
{
this.worldGuardCommunicator.onEnable(this);
}
catch (Exception e)
{
this.getServer().getPluginManager().disablePlugin(this);
throw new RuntimeException("Failed to enable WorldGuard communicator", e);
}
this.getServer().getPluginManager().registerEvents(new PlayerListener(this), this);
this.getServer().getPluginManager().registerEvents(new BlockListener(this), this);
this.getServer().getPluginManager().registerEvents(new WorldListener(this), this);
try
{
if (EntityToggleGlideEvent.class != null) //LOL, Just making it look nice xD
{
this.getServer().getPluginManager().registerEvents(new EntityListenerOnePointNine(this), this);
}
}
catch(NoClassDefFoundError ignored)
{
}
try
{
ParameterizedType type = (ParameterizedType)PortalCreateEvent.class.getDeclaredField("blocks").getGenericType();
Class<?> clazz = (Class<?>)type.getActualTypeArguments()[0];
if (clazz == BlockState.class)
{
this.getServer().getPluginManager().registerEvents(new net.goldtreeservers.worldguardextraflags.spigot1_14.EntityListener(this), this);
}
else
{
this.getServer().getPluginManager().registerEvents(new EntityListener(this), this);
}
}
catch(Throwable ignored)
{
this.getServer().getPluginManager().registerEvents(new EntityListener(this), this);
}
if (this.faweHelper != null)
{
this.faweHelper.onEnable();
}
else
{
this.worldEditPlugin.getWorldEdit().getEventBus().register(new WorldEditListener(this));
}
if (this.essentialsHelper != null)
{
this.essentialsHelper.onEnable();
}
if (this.protocolLibHelper != null)
{
this.protocolLibHelper.onEnable();
}
else if (SupportedFeatures.isPotionEffectEventSupported())
{
this.getServer().getPluginManager().registerEvents(new EntityPotionEffectEventListener(this), this);
}
for(World world : this.getServer().getWorlds())
{
this.getWorldGuardCommunicator().doUnloadChunkFlagCheck(world);
}
}
public static WorldGuardCommunicator createWorldGuardCommunicator()
{
try
{
Class.forName("com.sk89q.worldguard.WorldGuard"); //Only exists in WG 7
return new WorldGuardSevenCommunicator();
}
catch (Throwable ignored)
{
}
try
{
Class<?> clazz = Class.forName("com.sk89q.worldguard.bukkit.WorldGuardPlugin");
if (clazz.getMethod("getFlagRegistry") != null)
{
return new WorldGuardSixCommunicator();
}
}
catch (Throwable ignored)
{
ignored.printStackTrace();
}
return null;
}
}

View file

@ -0,0 +1,27 @@
package net.goldtreeservers.worldguardextraflags.essentials;
import org.bukkit.plugin.Plugin;
import com.earth2me.essentials.Essentials;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.listeners.EssentialsListener;
@RequiredArgsConstructor
public class EssentialsHelper
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@Getter private final Essentials essentialsPlugin;
public EssentialsHelper(WorldGuardExtraFlagsPlugin plugin, Plugin essentialsPlugin)
{
this(plugin, (Essentials)essentialsPlugin);
}
public void onEnable()
{
this.plugin.getServer().getPluginManager().registerEvents(new EssentialsListener(this.plugin, this.essentialsPlugin), this.plugin);
}
}

View file

@ -0,0 +1,21 @@
package net.goldtreeservers.worldguardextraflags.fawe;
import org.bukkit.plugin.Plugin;
import com.boydti.fawe.FaweAPI;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
@RequiredArgsConstructor
public class FAWEHelper
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@Getter private final Plugin fawePlugin;
public void onEnable()
{
FaweAPI.addMaskManager(new FaweWorldEditFlagMaskManager(this.plugin));
}
}

View file

@ -0,0 +1,93 @@
package net.goldtreeservers.worldguardextraflags.fawe;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.FaweMaskManager;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.AbstractRegionManagerWrapper;
public class FaweWorldEditFlagMaskManager extends FaweMaskManager<Player>
{
private final WorldGuardExtraFlagsPlugin plugin;
public FaweWorldEditFlagMaskManager(WorldGuardExtraFlagsPlugin plugin)
{
super(plugin.getName());
this.plugin = plugin;
}
public ProtectedRegion getRegion(Player player, Location loc)
{
final com.sk89q.worldguard.LocalPlayer localplayer = this.plugin.getWorldGuardCommunicator().wrapPlayer(player);
AbstractRegionManagerWrapper manager = this.plugin.getWorldGuardCommunicator().getRegionContainer().get(player.getWorld());
final ProtectedRegion global = manager.getRegion("__global__");
if (global != null && !isDenied(localplayer, global))
{
return global;
}
final ApplicableRegionSet regions = manager.getApplicableRegions(player.getLocation());
for (final ProtectedRegion region : regions)
{
if (!isDenied(localplayer, region))
{
return region;
}
}
return null;
}
public boolean isDenied(LocalPlayer localplayer, ProtectedRegion region)
{
return region.getFlag(Flags.WORLDEDIT) == State.DENY;
}
@Override
public FaweMask getMask(FawePlayer<Player> fawePlayer)
{
return null; //Problems here due to FaweMask using LocalWorld
/*final Player player = fawePlayer.parent;
final Location location = player.getLocation();
final ProtectedRegion myregion = this.getRegion(player, location);
if (myregion != null)
{
final BlockVector pos1;
final BlockVector pos2;
if (myregion.getId().equals("__global__"))
{
pos1 = new BlockVector(Integer.MIN_VALUE, 0, Integer.MIN_VALUE);
pos2 = new BlockVector(Integer.MAX_VALUE, 255, Integer.MAX_VALUE);
}
else
{
pos1 = new BlockVector(myregion.getMinimumPoint().getBlockX(), myregion.getMinimumPoint().getBlockY(), myregion.getMinimumPoint().getBlockZ());
pos2 = new BlockVector(myregion.getMaximumPoint().getBlockX(), myregion.getMaximumPoint().getBlockY(), myregion.getMaximumPoint().getBlockZ());
}
return new FaweMask(pos1, pos2)
{
@Override
public String getName()
{
return myregion.getId();
}
};
}
else
{
return null;
}*/
}
}

View file

@ -0,0 +1,138 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import java.util.Set;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.EntityBlockFormEvent;
import com.sk89q.worldguard.bukkit.event.block.BreakBlockEvent;
import com.sk89q.worldguard.bukkit.event.block.PlaceBlockEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.utils.SupportedFeatures;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
@RequiredArgsConstructor
public class BlockListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(ignoreCancelled = true)
public void onEntityBlockFormEvent(EntityBlockFormEvent event)
{
if (SupportedFeatures.isFrostwalkerSupported())
{
BlockState newState = event.getNewState();
if (newState.getType() == Material.FROSTED_ICE)
{
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(newState.getLocation());
Entity entity = event.getEntity();
if (entity instanceof Player)
{
Player player = (Player)entity;
if (WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.FROSTWALKER) == State.DENY)
{
event.setCancelled(true);
}
}
else
{
if (regions.queryValue(null, Flags.FROSTWALKER) == State.DENY)
{
event.setCancelled(true);
}
}
}
}
}
//TODO: Figure out something better for this
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false)
public void onBlockPlaceEvent(PlaceBlockEvent event)
{
Result originalResult = event.getResult();
Object cause = event.getCause().getRootCause();
if (cause instanceof Player)
{
Player player = (Player)cause;
for(Block block : event.getBlocks())
{
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(block.getLocation());
Set<Material> state = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.ALLOW_BLOCK_PLACE);
if (state != null && state.contains(block.getType()))
{
event.setResult(Result.ALLOW);
}
else
{
Set<Material> state2 = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.DENY_BLOCK_PLACE);
if (state2 != null && state2.contains(block.getType()))
{
event.setResult(Result.DENY);
return;
}
else
{
event.setResult(originalResult);
return;
}
}
}
}
}
//TODO: Figure out something better for this
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false)
public void onBlockBreakEvent(BreakBlockEvent event)
{
Result originalResult = event.getResult();
Object cause = event.getCause().getRootCause();
if (cause instanceof Player)
{
Player player = (Player)cause;
for(Block block : event.getBlocks())
{
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(block.getLocation());
Set<Material> state = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.ALLOW_BLOCK_BREAK);
if (state != null && state.contains(block.getType()))
{
event.setResult(Result.ALLOW);
}
else
{
Set<Material> state2 = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.DENY_BLOCK_BREAK);
if (state2 != null && state2.contains(block.getType()))
{
event.setResult(Result.DENY);
return;
}
else
{
event.setResult(originalResult);
return;
}
}
}
}
}
}

View file

@ -0,0 +1,36 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.PortalCreateEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
@RequiredArgsConstructor
public class EntityListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(ignoreCancelled = true)
public void onPortalCreateEvent(PortalCreateEvent event)
{
for(Block block : event.getBlocks())
{
//Unable to get the player who created it....
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(block.getLocation());
if (regions.queryValue(null, Flags.NETHER_PORTALS) == State.DENY)
{
event.setCancelled(true);
break;
}
}
}
}

View file

@ -0,0 +1,41 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
@RequiredArgsConstructor
public class EntityListenerOnePointNine implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(ignoreCancelled = true)
public void onEntityToggleGlideEvent(EntityToggleGlideEvent event)
{
Entity entity = event.getEntity();
if (entity instanceof Player)
{
Player player = (Player)entity;
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
State state = WorldGuardUtils.queryState(player, player.getWorld(), regions.getRegions(), Flags.GLIDE);
if (state != null)
{
event.setCancelled(true);
player.setGliding(state == State.ALLOW);
}
}
}
}

View file

@ -0,0 +1,61 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPotionEffectEvent;
import com.sk89q.worldguard.session.Session;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GiveEffectsFlagHandler;
@RequiredArgsConstructor
public class EntityPotionEffectEventListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(ignoreCancelled = true)
public void onEntityPotionEffectEvent(EntityPotionEffectEvent event)
{
if (event.getAction() != EntityPotionEffectEvent.Action.REMOVED)
{
return;
}
if (event.getCause() != EntityPotionEffectEvent.Cause.PLUGIN)
{
return;
}
Entity entity = event.getEntity();
if (!(entity instanceof Player))
{
return;
}
Player player = (Player)entity;
if (!player.isValid()) //Work around, getIfPresent is broken inside WG due to using LocalPlayer as key instead of CacheKey
{
return;
}
try
{
Session session = WorldGuardExtraFlagsPlugin.getPlugin().getWorldGuardCommunicator().getSessionManager().get(player);
GiveEffectsFlagHandler giveEffectsHandler = session.getHandler(GiveEffectsFlagHandler.class);
if (giveEffectsHandler.isSupressRemovePotionPacket())
{
event.setCancelled(true);
}
}
catch(IllegalStateException wgBug)
{
}
}
}

View file

@ -0,0 +1,63 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import com.earth2me.essentials.Essentials;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.ess3.api.IUser;
import net.ess3.api.events.GodStatusChangeEvent;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
import net.goldtreeservers.worldguardextraflags.wg.handlers.FlyFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GodmodeFlagHandler;
@RequiredArgsConstructor
public class EssentialsListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@Getter private final Essentials essentialsPlugin;
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onGodStatusChangeEvent(GodStatusChangeEvent event)
{
IUser user = event.getAffected();
Player player = user.getBase();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
State state = WorldGuardUtils.queryState(player, player.getWorld(), regions.getRegions(), Flags.GODMODE);
if (state != null)
{
if (this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(GodmodeFlagHandler.class).getIsGodmodeEnabled() != null)
{
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerChangedWorldEvent(PlayerChangedWorldEvent event)
{
Player player = event.getPlayer();
if (player.getGameMode() != GameMode.CREATIVE && !this.essentialsPlugin.getUser(player).isAuthorized("essentials.fly"))
{
//Essentials now turns off flight, fuck him
Boolean value = this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue();
if (value != null)
{
player.setAllowFlight(value);
}
}
}
}

View file

@ -0,0 +1,213 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.event.player.PlayerItemDamageEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.Potion;
import org.bukkit.scheduler.BukkitRunnable;
import org.spigotmc.event.player.PlayerSpawnLocationEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import com.sk89q.worldguard.session.Session;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.we.WorldEditUtils;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
import net.goldtreeservers.worldguardextraflags.wg.handlers.FlyFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GiveEffectsFlagHandler;
@RequiredArgsConstructor
public class PlayerListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerTeleportEvent(PlayerTeleportEvent event)
{
Player player = event.getPlayer();
player.removeMetadata(WorldGuardUtils.PREVENT_TELEPORT_LOOP_META, WorldGuardExtraFlagsPlugin.getPlugin());
}
@EventHandler
public void onPlayerDeathEvent(PlayerDeathEvent event)
{
Player player = event.getEntity();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
Boolean keepInventory = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.KEEP_INVENTORY);
if (keepInventory != null)
{
event.setKeepInventory(keepInventory);
if (keepInventory)
{
event.getDrops().clear();
}
}
Boolean keepExp = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.KEEP_EXP);
if (keepExp != null)
{
event.setKeepLevel(keepExp);
if (keepExp)
{
event.setDroppedExp(0);
}
}
}
@EventHandler(ignoreCancelled = true)
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
{
Player player = event.getPlayer();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
String prefix = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.CHAT_PREFIX);
String suffix = WorldGuardUtils.queryValue(player, player.getWorld(), regions.getRegions(), Flags.CHAT_SUFFIX);
if (prefix != null)
{
event.setFormat(prefix + event.getFormat());
}
if (suffix != null)
{
event.setFormat(event.getFormat() + suffix);
}
}
@EventHandler(ignoreCancelled = true)
public void onPlayerRespawnEvent(PlayerRespawnEvent event)
{
Player player = event.getPlayer();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
Object respawnLocation = WorldGuardUtils.queryValueUnchecked(player, player.getWorld(), regions.getRegions(), Flags.RESPAWN_LOCATION);
if (respawnLocation != null)
{
event.setRespawnLocation(WorldEditUtils.toLocation(respawnLocation));
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerItemConsumeEvent(PlayerItemConsumeEvent event)
{
Player player = event.getPlayer();
ItemMeta itemMeta = event.getItem().getItemMeta();
if (itemMeta instanceof PotionMeta)
{
this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(GiveEffectsFlagHandler.class).drinkPotion(player, Potion.fromItemStack(event.getItem()).getEffects());
}
else
{
Material material = event.getItem().getType();
if (material == Material.MILK_BUCKET)
{
this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(GiveEffectsFlagHandler.class).drinkMilk(player);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerGameModeChangeEvent(PlayerGameModeChangeEvent event)
{
Player player = event.getPlayer();
Session wgSession = this.plugin.getWorldGuardCommunicator().getSessionManager().getIfPresent(player);
if (wgSession != null)
{
Boolean value = wgSession.getHandler(FlyFlagHandler.class).getCurrentValue();
if (value != null)
{
new BukkitRunnable()
{
@Override
public void run()
{
PlayerListener.this.checkFlyStatus(player);
}
}.runTask(WorldGuardExtraFlagsPlugin.getPlugin());
}
}
else
{
new BukkitRunnable()
{
@Override
public void run()
{
PlayerListener.this.checkFlyStatus(player);
}
}.runTask(WorldGuardExtraFlagsPlugin.getPlugin());
}
}
private void checkFlyStatus(Player player)
{
Boolean value = this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue();
if (value != null)
{
player.setAllowFlight(value);
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerItemDamageEvent(PlayerItemDamageEvent event)
{
Player player = event.getPlayer();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
if (WorldGuardUtils.queryState(player, player.getWorld(), regions.getRegions(), Flags.ITEM_DURABILITY) == State.DENY)
{
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerSpawnLocationEvent(PlayerSpawnLocationEvent event)
{
Player player = event.getPlayer();
ApplicableRegionSet regions = this.plugin.getWorldGuardCommunicator().getRegionContainer().createQuery().getApplicableRegions(player.getLocation());
Object location = WorldGuardUtils.queryValueUnchecked(player, player.getWorld(), regions.getRegions(), Flags.JOIN_LOCATION);
if (location != null)
{
event.setSpawnLocation(WorldEditUtils.toLocation(location));
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoinEvent(PlayerJoinEvent event)
{
Player player = event.getPlayer();
Boolean value = this.plugin.getWorldGuardCommunicator().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue();
if (value != null)
{
player.setAllowFlight(value);
}
}
}

View file

@ -0,0 +1,26 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.util.eventbus.EventHandler;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
@RequiredArgsConstructor
public class WorldEditListener
{
private final WorldGuardExtraFlagsPlugin plugin;
@Subscribe(priority = EventHandler.Priority.VERY_EARLY)
public void onEditSessionEvent(EditSessionEvent event)
{
Actor actor = event.getActor();
if (actor != null && actor.isPlayer())
{
event.setExtent(this.plugin.getWorldGuardCommunicator().getWorldEditFlag(event.getWorld(), event.getExtent(), (Player)actor));
}
}
}

View file

@ -0,0 +1,39 @@
package net.goldtreeservers.worldguardextraflags.listeners;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.event.world.WorldLoadEvent;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
@RequiredArgsConstructor
public class WorldListener implements Listener
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@EventHandler(priority = EventPriority.MONITOR)
public void onWorldLoadEvent(WorldLoadEvent event)
{
World world = event.getWorld();
this.plugin.getWorldGuardCommunicator().doUnloadChunkFlagCheck(world);
}
@EventHandler(ignoreCancelled = true)
public void onChunkUnloadEvent(ChunkUnloadEvent event)
{
World world = event.getWorld();
Chunk chunk = event.getChunk();
if (!this.plugin.getWorldGuardCommunicator().doUnloadChunkFlagCheck(world, chunk))
{
event.setCancelled(true);
}
}
}

View file

@ -0,0 +1,25 @@
package net.goldtreeservers.worldguardextraflags.protocollib;
import org.bukkit.plugin.Plugin;
import com.comphenix.protocol.ProtocolLibrary;
import lombok.Getter;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
public class ProtocolLibHelper
{
@Getter private final WorldGuardExtraFlagsPlugin plugin;
@Getter private final Plugin protocolLibPlugin;
public ProtocolLibHelper(WorldGuardExtraFlagsPlugin plugin, Plugin protocolLibPlugin)
{
this.plugin = plugin;
this.protocolLibPlugin = protocolLibPlugin;
}
public void onEnable()
{
ProtocolLibrary.getProtocolManager().addPacketListener(new RemoveEffectPacketListener());
}
}

View file

@ -0,0 +1,47 @@
package net.goldtreeservers.worldguardextraflags.protocollib;
import org.bukkit.entity.Player;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.sk89q.worldguard.session.Session;
import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GiveEffectsFlagHandler;
public class RemoveEffectPacketListener extends PacketAdapter
{
public RemoveEffectPacketListener()
{
super(WorldGuardExtraFlagsPlugin.getPlugin(), PacketType.Play.Server.REMOVE_ENTITY_EFFECT);
}
@Override
public void onPacketSending(PacketEvent event)
{
if (!event.isCancelled())
{
Player player = event.getPlayer();
if (!player.isValid()) //Work around, getIfPresent is broken inside WG due to using LocalPlayer as key instead of CacheKey
{
return;
}
try
{
Session session = WorldGuardExtraFlagsPlugin.getPlugin().getWorldGuardCommunicator().getSessionManager().get(player);
GiveEffectsFlagHandler giveEffectsHandler = session.getHandler(GiveEffectsFlagHandler.class);
if (giveEffectsHandler.isSupressRemovePotionPacket())
{
event.setCancelled(true);
}
}
catch(IllegalStateException wgBug)
{
}
}
}
}