mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-09-29 07:37:46 +02:00
Add workaround for spigot disable issue
This commit is contained in:
parent
65f5d870db
commit
c3a70e27ed
@ -76,8 +76,8 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
|||||||
private final List<NPCRegistry> anonymousRegistries = Lists.newArrayList();
|
private final List<NPCRegistry> anonymousRegistries = Lists.newArrayList();
|
||||||
private final List<NPCRegistry> citizensBackedRegistries = Lists.newArrayList();
|
private final List<NPCRegistry> citizensBackedRegistries = Lists.newArrayList();
|
||||||
private final CommandManager commands = new CommandManager();
|
private final CommandManager commands = new CommandManager();
|
||||||
private boolean compatible;
|
|
||||||
private Settings config;
|
private Settings config;
|
||||||
|
private boolean loaded;
|
||||||
private CitizensNPCRegistry npcRegistry;
|
private CitizensNPCRegistry npcRegistry;
|
||||||
private NPCDataStore saves;
|
private NPCDataStore saves;
|
||||||
private NPCSelector selector;
|
private NPCSelector selector;
|
||||||
@ -145,6 +145,19 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void disable() {
|
||||||
|
if (loaded) {
|
||||||
|
Bukkit.getPluginManager().callEvent(new CitizensDisableEvent());
|
||||||
|
Editor.leaveAll();
|
||||||
|
despawnNPCs(true);
|
||||||
|
npcRegistry = null;
|
||||||
|
NMS.shutdown();
|
||||||
|
loaded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CitizensAPI.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
private void enableSubPlugins() {
|
private void enableSubPlugins() {
|
||||||
File root = new File(getDataFolder(), Setting.SUBPLUGIN_FOLDER.asString());
|
File root = new File(getDataFolder(), Setting.SUBPLUGIN_FOLDER.asString());
|
||||||
if (!root.exists() || !root.isDirectory())
|
if (!root.exists() || !root.isDirectory())
|
||||||
@ -277,16 +290,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
Bukkit.getPluginManager().callEvent(new CitizensDisableEvent());
|
disable();
|
||||||
Editor.leaveAll();
|
|
||||||
|
|
||||||
if (compatible) {
|
|
||||||
despawnNPCs(true);
|
|
||||||
npcRegistry = null;
|
|
||||||
NMS.shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
CitizensAPI.shutdown();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -296,11 +300,11 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
|||||||
setupTranslator();
|
setupTranslator();
|
||||||
// Disable if the server is not using the compatible Minecraft version
|
// Disable if the server is not using the compatible Minecraft version
|
||||||
String mcVersion = Util.getMinecraftRevision();
|
String mcVersion = Util.getMinecraftRevision();
|
||||||
compatible = true;
|
loaded = true;
|
||||||
try {
|
try {
|
||||||
NMS.loadBridge(mcVersion);
|
NMS.loadBridge(mcVersion);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
compatible = false;
|
loaded = false;
|
||||||
if (Messaging.isDebugging()) {
|
if (Messaging.isDebugging()) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.citizensnpcs;
|
package net.citizensnpcs;
|
||||||
|
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -42,6 +43,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||||
|
import org.bukkit.event.server.PluginDisableEvent;
|
||||||
import org.bukkit.event.vehicle.VehicleDamageEvent;
|
import org.bukkit.event.vehicle.VehicleDamageEvent;
|
||||||
import org.bukkit.event.vehicle.VehicleDestroyEvent;
|
import org.bukkit.event.vehicle.VehicleDestroyEvent;
|
||||||
import org.bukkit.event.vehicle.VehicleEnterEvent;
|
import org.bukkit.event.vehicle.VehicleEnterEvent;
|
||||||
@ -51,6 +53,7 @@ import org.bukkit.event.world.WorldLoadEvent;
|
|||||||
import org.bukkit.event.world.WorldUnloadEvent;
|
import org.bukkit.event.world.WorldUnloadEvent;
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
import org.bukkit.metadata.FixedMetadataValue;
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
@ -228,6 +231,28 @@ public class EventListen implements Listener {
|
|||||||
checkCreationEvent(event);
|
checkCreationEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDisable(PluginDisableEvent event) {
|
||||||
|
// hack: Spigot now unloads plugin classes on disable in reverse order so prefer unloading at the start of
|
||||||
|
// plugin disable cycle
|
||||||
|
if (event.getPlugin() instanceof JavaPlugin) {
|
||||||
|
try {
|
||||||
|
MethodHandle field = CLASSES_FIELD == null
|
||||||
|
? CLASSES_FIELD = NMS.getGetter(event.getPlugin().getPluginLoader().getClass(), "classes")
|
||||||
|
: CLASSES_FIELD;
|
||||||
|
Map<String, Class<?>> classes = (Map<String, Class<?>>) field
|
||||||
|
.invoke(event.getPlugin().getPluginLoader());
|
||||||
|
if (classes.containsKey("net.citizensnpcs.api.CitizensAPI")) {
|
||||||
|
CitizensAPI.getPlugin().onDisable();
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
CitizensAPI.getPlugin().onDisable();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CitizensAPI.getPlugin().onDisable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Entity events
|
* Entity events
|
||||||
*/
|
*/
|
||||||
@ -717,4 +742,6 @@ public class EventListen implements Listener {
|
|||||||
}
|
}
|
||||||
return npc.spawn(spawn, SpawnReason.CHUNK_LOAD);
|
return npc.spawn(spawn, SpawnReason.CHUNK_LOAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static MethodHandle CLASSES_FIELD = null;
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,8 @@ import net.citizensnpcs.trait.RabbitType;
|
|||||||
import net.citizensnpcs.trait.ScoreboardTrait;
|
import net.citizensnpcs.trait.ScoreboardTrait;
|
||||||
import net.citizensnpcs.trait.ScriptTrait;
|
import net.citizensnpcs.trait.ScriptTrait;
|
||||||
import net.citizensnpcs.trait.SheepTrait;
|
import net.citizensnpcs.trait.SheepTrait;
|
||||||
|
import net.citizensnpcs.trait.ShopTrait;
|
||||||
|
import net.citizensnpcs.trait.ShopTrait.NPCShop;
|
||||||
import net.citizensnpcs.trait.SkinLayers;
|
import net.citizensnpcs.trait.SkinLayers;
|
||||||
import net.citizensnpcs.trait.SkinLayers.Layer;
|
import net.citizensnpcs.trait.SkinLayers.Layer;
|
||||||
import net.citizensnpcs.trait.SkinTrait;
|
import net.citizensnpcs.trait.SkinTrait;
|
||||||
@ -1919,6 +1921,29 @@ public class NPCCommands {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Command(
|
||||||
|
aliases = { "npc" },
|
||||||
|
usage = "shop (name) (editr)",
|
||||||
|
desc = "NPC shop edit/show",
|
||||||
|
modifiers = { "shop" },
|
||||||
|
min = 1,
|
||||||
|
max = 3,
|
||||||
|
permission = "citizens.npc.shop")
|
||||||
|
public void shop(CommandContext args, Player sender, NPC npc) throws CommandException {
|
||||||
|
ShopTrait trait = npc.getOrAddTrait(ShopTrait.class);
|
||||||
|
if (args.argsLength() > 1) {
|
||||||
|
NPCShop shop = trait.getShop(args.getString(1));
|
||||||
|
if (args.getString(1).equalsIgnoreCase("edit")) {
|
||||||
|
} else if (args.getString(1).equalsIgnoreCase("show") && args.argsLength() == 3) {
|
||||||
|
shop.display(sender);
|
||||||
|
} else {
|
||||||
|
throw new CommandUsageException();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trait.getDefaultShop().display(sender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
aliases = { "npc" },
|
aliases = { "npc" },
|
||||||
usage = "skin (-c -l(atest)) [name] (or --url [url] or -t [uuid/name] [data] [signature])",
|
usage = "skin (-c -l(atest)) [name] (or --url [url] or -t [uuid/name] [data] [signature])",
|
||||||
|
@ -46,6 +46,7 @@ import net.citizensnpcs.trait.Saddle;
|
|||||||
import net.citizensnpcs.trait.ScoreboardTrait;
|
import net.citizensnpcs.trait.ScoreboardTrait;
|
||||||
import net.citizensnpcs.trait.ScriptTrait;
|
import net.citizensnpcs.trait.ScriptTrait;
|
||||||
import net.citizensnpcs.trait.SheepTrait;
|
import net.citizensnpcs.trait.SheepTrait;
|
||||||
|
import net.citizensnpcs.trait.ShopTrait;
|
||||||
import net.citizensnpcs.trait.SkinLayers;
|
import net.citizensnpcs.trait.SkinLayers;
|
||||||
import net.citizensnpcs.trait.SkinTrait;
|
import net.citizensnpcs.trait.SkinTrait;
|
||||||
import net.citizensnpcs.trait.SlimeSize;
|
import net.citizensnpcs.trait.SlimeSize;
|
||||||
@ -92,6 +93,7 @@ public class CitizensTraitFactory implements TraitFactory {
|
|||||||
registerTrait(TraitInfo.create(SkinTrait.class));
|
registerTrait(TraitInfo.create(SkinTrait.class));
|
||||||
registerTrait(TraitInfo.create(MountTrait.class));
|
registerTrait(TraitInfo.create(MountTrait.class));
|
||||||
registerTrait(TraitInfo.create(SlimeSize.class));
|
registerTrait(TraitInfo.create(SlimeSize.class));
|
||||||
|
registerTrait(TraitInfo.create(ShopTrait.class));
|
||||||
registerTrait(TraitInfo.create(Spawned.class));
|
registerTrait(TraitInfo.create(Spawned.class));
|
||||||
registerTrait(TraitInfo.create(Speech.class));
|
registerTrait(TraitInfo.create(Speech.class));
|
||||||
registerTrait(TraitInfo.create(Text.class));
|
registerTrait(TraitInfo.create(Text.class));
|
||||||
|
46
main/src/main/java/net/citizensnpcs/trait/ShopTrait.java
Normal file
46
main/src/main/java/net/citizensnpcs/trait/ShopTrait.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package net.citizensnpcs.trait;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
import net.citizensnpcs.api.persistence.Persist;
|
||||||
|
import net.citizensnpcs.api.trait.Trait;
|
||||||
|
import net.citizensnpcs.api.trait.TraitName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shop trait for NPC GUI shops.
|
||||||
|
*/
|
||||||
|
@TraitName("shop")
|
||||||
|
public class ShopTrait extends Trait {
|
||||||
|
public ShopTrait() {
|
||||||
|
super("shop");
|
||||||
|
}
|
||||||
|
|
||||||
|
public NPCShop getDefaultShop() {
|
||||||
|
return NPC_SHOPS.get(npc.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public NPCShop getShop(String name) {
|
||||||
|
return SHOPS.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class NPCShop {
|
||||||
|
@Persist
|
||||||
|
String name;
|
||||||
|
|
||||||
|
private NPCShop(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void display(Player sender) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Persist(value = "npcShops", namespace = "shopstrait")
|
||||||
|
private static Map<String, NPCShop> NPC_SHOPS = Maps.newHashMap();
|
||||||
|
@Persist(value = "namedShops", namespace = "shopstrait")
|
||||||
|
private static Map<String, NPCShop> SHOPS = Maps.newHashMap();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user