mirror of
https://github.com/TotalFreedomMC/TF-PlotSquared.git
synced 2024-05-19 03:21:25 +00:00
280ced7904
Reason: " How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found."
206 lines
7.9 KiB
Java
206 lines
7.9 KiB
Java
/*
|
|
* _____ _ _ _____ _
|
|
* | __ \| | | | / ____| | |
|
|
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
|
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
|
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
|
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
|
* | |
|
|
* |_|
|
|
* PlotSquared plot management system for Minecraft
|
|
* Copyright (C) 2020 IntellectualSites
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package com.github.intellectualsites.plotsquared.bukkit.listeners;
|
|
|
|
import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil;
|
|
import com.github.intellectualsites.plotsquared.plot.PlotSquared;
|
|
import com.github.intellectualsites.plotsquared.plot.config.Settings;
|
|
import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag;
|
|
import com.github.intellectualsites.plotsquared.plot.object.Location;
|
|
import com.github.intellectualsites.plotsquared.plot.object.Plot;
|
|
import com.github.intellectualsites.plotsquared.plot.object.PlotArea;
|
|
import io.papermc.lib.PaperLib;
|
|
import org.bukkit.Chunk;
|
|
import org.bukkit.World;
|
|
import org.bukkit.entity.ArmorStand;
|
|
import org.bukkit.entity.Entity;
|
|
import org.bukkit.entity.EntityType;
|
|
import org.bukkit.entity.Vehicle;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
|
import org.bukkit.event.entity.EntitySpawnEvent;
|
|
import org.bukkit.event.entity.EntityTeleportEvent;
|
|
import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
|
|
import org.bukkit.event.vehicle.VehicleCreateEvent;
|
|
import org.bukkit.event.vehicle.VehicleMoveEvent;
|
|
import org.bukkit.event.vehicle.VehicleUpdateEvent;
|
|
import org.bukkit.event.world.ChunkLoadEvent;
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
|
import org.bukkit.metadata.MetadataValue;
|
|
import org.bukkit.plugin.Plugin;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.util.List;
|
|
|
|
public class EntitySpawnListener implements Listener {
|
|
|
|
private final static String KEY = "P2";
|
|
private static boolean ignoreTP = false;
|
|
private static boolean hasPlotArea = false;
|
|
private static String areaName = null;
|
|
|
|
public static void testNether(final Entity entity) {
|
|
@NotNull World world = entity.getWorld();
|
|
if (world.getEnvironment() != World.Environment.NETHER
|
|
&& world.getEnvironment() != World.Environment.THE_END) {
|
|
return;
|
|
}
|
|
test(entity);
|
|
}
|
|
|
|
public static void testCreate(final Entity entity) {
|
|
@NotNull World world = entity.getWorld();
|
|
if (areaName == world.getName()) {
|
|
} else {
|
|
areaName = world.getName();
|
|
hasPlotArea = PlotSquared.get().hasPlotArea(areaName);
|
|
}
|
|
if (!hasPlotArea) {
|
|
return;
|
|
}
|
|
test(entity);
|
|
}
|
|
|
|
public static void test(Entity entity) {
|
|
@NotNull World world = entity.getWorld();
|
|
List<MetadataValue> meta = entity.getMetadata(KEY);
|
|
if (meta.isEmpty()) {
|
|
if (PlotSquared.get().hasPlotArea(world.getName())) {
|
|
entity.setMetadata(KEY,
|
|
new FixedMetadataValue((Plugin) PlotSquared.get().IMP, entity.getLocation()));
|
|
}
|
|
} else {
|
|
org.bukkit.Location origin = (org.bukkit.Location) meta.get(0).value();
|
|
World originWorld = origin.getWorld();
|
|
if (!originWorld.equals(world)) {
|
|
if (!ignoreTP) {
|
|
if (!world.getName().equalsIgnoreCase(originWorld + "_the_end")) {
|
|
try {
|
|
ignoreTP = true;
|
|
PaperLib.teleportAsync(entity, origin);
|
|
} finally {
|
|
ignoreTP = false;
|
|
}
|
|
if (entity.getType() == EntityType.PLAYER) {
|
|
return;
|
|
}
|
|
if (entity.getLocation().getWorld().equals(world)) {
|
|
entity.remove();
|
|
}
|
|
}
|
|
} else {
|
|
if (entity.getType() == EntityType.PLAYER) {
|
|
return;
|
|
}
|
|
entity.remove();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
public void creatureSpawnEvent(EntitySpawnEvent event) {
|
|
Entity entity = event.getEntity();
|
|
Location location = BukkitUtil.getLocation(entity.getLocation());
|
|
PlotArea area = location.getPlotArea();
|
|
if (!location.isPlotArea()) {
|
|
return;
|
|
}
|
|
Plot plot = location.getOwnedPlotAbs();
|
|
if (plot == null) {
|
|
if (!area.isMobSpawning()) {
|
|
EntityType type = entity.getType();
|
|
switch (type) {
|
|
case DROPPED_ITEM:
|
|
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
|
|
event.setCancelled(true);
|
|
break;
|
|
}
|
|
case PLAYER:
|
|
return;
|
|
}
|
|
if (type.isAlive() || !area.isMiscSpawnUnowned()) {
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
|
|
event.setCancelled(true);
|
|
}
|
|
switch (entity.getType()) {
|
|
case ENDER_CRYSTAL:
|
|
if (PlayerEvents.checkEntity(entity, plot)) {
|
|
event.setCancelled(true);
|
|
}
|
|
case SHULKER:
|
|
if (!entity.hasMetadata("shulkerPlot")) {
|
|
entity.setMetadata("shulkerPlot",
|
|
new FixedMetadataValue((Plugin) PlotSquared.get().IMP, plot.getId()));
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler public void onChunkLoad(ChunkLoadEvent event) {
|
|
@NotNull Chunk chunk = event.getChunk();
|
|
for (final Entity entity : chunk.getEntities()) {
|
|
testCreate(entity);
|
|
}
|
|
}
|
|
|
|
@EventHandler public void onVehicle(VehicleUpdateEvent event) {
|
|
testNether(event.getVehicle());
|
|
}
|
|
|
|
@EventHandler public void onVehicle(VehicleCreateEvent event) {
|
|
testCreate(event.getVehicle());
|
|
}
|
|
|
|
@EventHandler public void onVehicle(VehicleBlockCollisionEvent event) {
|
|
testNether(event.getVehicle());
|
|
}
|
|
|
|
@EventHandler public void onTeleport(EntityTeleportEvent event) {
|
|
Entity ent = event.getEntity();
|
|
if (ent instanceof Vehicle || ent instanceof ArmorStand) {
|
|
testNether(event.getEntity());
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
public void vehicleMove(VehicleMoveEvent event) {
|
|
testNether(event.getVehicle());
|
|
}
|
|
|
|
@EventHandler public void spawn(CreatureSpawnEvent event) {
|
|
if (event.getEntityType() == EntityType.ARMOR_STAND) {
|
|
testCreate(event.getEntity());
|
|
}
|
|
}
|
|
}
|