diff --git a/pom.xml b/pom.xml index b900b35a..9fafbfbd 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,12 @@ commandsxl 2.1.2 + + net.citizensnpcs + citizensapi + 2.0.17-SNAPSHOT + provided + @@ -88,5 +94,9 @@ dre2n-repo http://feuerstern.bplaced.net/repo/ + + citizens-repo + http://repo.citizensnpcs.co/ + diff --git a/src/main/java/io/github/dre2n/dungeonsxl/DungeonsXL.java b/src/main/java/io/github/dre2n/dungeonsxl/DungeonsXL.java index c11b9409..9b3fa007 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/DungeonsXL.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/DungeonsXL.java @@ -31,11 +31,7 @@ import io.github.dre2n.dungeonsxl.dungeon.Dungeons; import io.github.dre2n.dungeonsxl.game.Game; import io.github.dre2n.dungeonsxl.game.GameTypes; import io.github.dre2n.dungeonsxl.global.GlobalProtections; -import io.github.dre2n.dungeonsxl.listener.BlockListener; -import io.github.dre2n.dungeonsxl.listener.EntityListener; -import io.github.dre2n.dungeonsxl.listener.HangingListener; -import io.github.dre2n.dungeonsxl.listener.PlayerListener; -import io.github.dre2n.dungeonsxl.listener.WorldListener; +import io.github.dre2n.dungeonsxl.listener.*; import io.github.dre2n.dungeonsxl.mob.ExternalMobProviders; import io.github.dre2n.dungeonsxl.player.DGroup; import io.github.dre2n.dungeonsxl.player.DPermissions; @@ -143,6 +139,9 @@ public class DungeonsXL extends BRPlugin { manager.registerEvents(new BlockListener(), this); manager.registerEvents(new WorldListener(), this); manager.registerEvents(new HangingListener(), this); + if (manager.getPlugin("Citizens") != null) { + manager.registerEvents(new CitizensListener(), this); + } // Load All loadAll(); diff --git a/src/main/java/io/github/dre2n/dungeonsxl/game/GameTypes.java b/src/main/java/io/github/dre2n/dungeonsxl/game/GameTypes.java index 2b60fb1b..39684776 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/game/GameTypes.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/game/GameTypes.java @@ -16,7 +16,7 @@ */ package io.github.dre2n.dungeonsxl.game; -import io.github.dre2n.dungeonsxl.DungeonsXL; +import io.github.dre2n.commons.util.messageutil.MessageUtil; import java.util.ArrayList; import java.util.List; import org.bukkit.block.Sign; @@ -35,7 +35,7 @@ public class GameTypes { Class.forName("com.massivecraft.factions.Patch"); } catch (ClassNotFoundException exception) { - DungeonsXL.getInstance().getLogger().info("Could not find compatible Factions plugin. The game type PVP_FACTIONS_BATTLEFIELD will not get enabled..."); + MessageUtil.log("Could not find compatible Factions plugin. The game type PVP_FACTIONS_BATTLEFIELD will not get enabled..."); continue; } } diff --git a/src/main/java/io/github/dre2n/dungeonsxl/listener/CitizensListener.java b/src/main/java/io/github/dre2n/dungeonsxl/listener/CitizensListener.java new file mode 100644 index 00000000..95a55403 --- /dev/null +++ b/src/main/java/io/github/dre2n/dungeonsxl/listener/CitizensListener.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016 Daniel Saukel + * + * 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 . + */ +package io.github.dre2n.dungeonsxl.listener; + +import io.github.dre2n.dungeonsxl.DungeonsXL; +import io.github.dre2n.dungeonsxl.mob.CitizensMobProvider; +import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.event.NPCDeathEvent; +import net.citizensnpcs.api.npc.NPC; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +/** + * @author Daniel Saukel + */ +public class CitizensListener implements Listener { + + CitizensMobProvider provider = DungeonsXL.getInstance().getExternalMobProviders().getCitizensMobProvider(); + + @EventHandler + public void onNPCDeath(NPCDeathEvent event) { + NPC npc = event.getNPC(); + if (provider.getSpawnedNPCs().contains(npc)) { + CitizensAPI.getNPCRegistry().deregister(npc); + provider.removeSpawnedNPC(npc); + } + } + +} diff --git a/src/main/java/io/github/dre2n/dungeonsxl/listener/EntityListener.java b/src/main/java/io/github/dre2n/dungeonsxl/listener/EntityListener.java index 3c1f327a..9ac3505d 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/listener/EntityListener.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/listener/EntityListener.java @@ -31,7 +31,6 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -88,13 +87,10 @@ public class EntityListener implements Listener { GameWorld gameWorld = GameWorld.getByWorld(world); if (gameWorld != null) { if (gameWorld.isPlaying()) { - if (entity.getType() != EntityType.PLAYER) { + DMob dMob = DMob.getByEntity(entity); + if (dMob != null) { event.getDrops().clear(); - - DMob dMob = DMob.getByEntity(entity); - if (dMob != null) { - dMob.onDeath(event); - } + dMob.onDeath(event); } } } diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/CitizensMobProvider.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/CitizensMobProvider.java new file mode 100644 index 00000000..d22e7065 --- /dev/null +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/CitizensMobProvider.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2016 Daniel Saukel + * + * 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 . + */ +package io.github.dre2n.dungeonsxl.mob; + +import io.github.dre2n.commons.util.NumberUtil; +import io.github.dre2n.dungeonsxl.world.GameWorld; +import java.util.HashSet; +import java.util.Set; +import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.npc.NPC; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; + +/** + * @author Daniel Saukel + */ +public class CitizensMobProvider implements ExternalMobProvider { + + private String identifier = "CI"; + private Set spawnedNPCs = new HashSet<>(); + + /** + * @return the spawned Citizens NPCs + */ + public Set getSpawnedNPCs() { + return spawnedNPCs; + } + + /** + * @param npc + * the NPC to add + */ + public void addSpawnedNPC(NPC npc) { + spawnedNPCs.add(npc); + } + + /** + * @param npc + * the NPC to remove + */ + public void removeSpawnedNPC(NPC npc) { + spawnedNPCs.remove(npc); + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public String getRawCommand() { + return null; + } + + @Override + public String getCommand(String mob, String world, double x, double y, double z) { + return null; + } + + @Override + public void summon(String mob, Location location) { + NPC npc = CitizensAPI.getNPCRegistry().getById(NumberUtil.parseInt(mob)); + + if (npc != null) { + npc = npc.clone(); + if (npc.isSpawned()) { + npc.despawn(); + } + + npc.spawn(location); + spawnedNPCs.add(npc); + + GameWorld gameWorld = GameWorld.getByWorld(location.getWorld()); + new DMob((LivingEntity) npc.getEntity(), gameWorld, null, mob); + } + } + +} diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/CustomExternalMobProvider.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/CustomExternalMobProvider.java index 7f932819..8dcce8f9 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/mob/CustomExternalMobProvider.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/CustomExternalMobProvider.java @@ -17,6 +17,8 @@ package io.github.dre2n.dungeonsxl.mob; import java.util.Map.Entry; +import org.bukkit.Bukkit; +import org.bukkit.Location; /** * @author Daniel Saukel @@ -54,4 +56,9 @@ public class CustomExternalMobProvider implements ExternalMobProvider { return command.replaceAll("%mob%", mob).replaceAll("%world%", world).replaceAll("%x%", String.valueOf(x)).replaceAll("%y%", String.valueOf(y)).replaceAll("%z%", String.valueOf(z)); } + @Override + public void summon(String mob, Location location) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), getCommand(mob, location.getWorld().getName(), location.getX(), location.getY(), location.getZ())); + } + } diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/DMob.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/DMob.java index 12b36fbc..5afaeb17 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/mob/DMob.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/DMob.java @@ -46,11 +46,14 @@ public class DMob { this.type = type; /* Remove DropChance of equipment */ - this.entity.getEquipment().setHelmetDropChance(0); - this.entity.getEquipment().setChestplateDropChance(0); - this.entity.getEquipment().setLeggingsDropChance(0); - this.entity.getEquipment().setBootsDropChance(0); - this.entity.getEquipment().setItemInHandDropChance(0); + try { + this.entity.getEquipment().setHelmetDropChance(0); + this.entity.getEquipment().setChestplateDropChance(0); + this.entity.getEquipment().setLeggingsDropChance(0); + this.entity.getEquipment().setBootsDropChance(0); + this.entity.getEquipment().setItemInHandDropChance(0); + } catch (UnsupportedOperationException exception) { + } } public DMob(LivingEntity entity, GameWorld gameWorld, DMobType type, String trigger) { @@ -59,10 +62,6 @@ public class DMob { } public void onDeath(EntityDeathEvent event) { - if (!(event.getEntity() instanceof LivingEntity)) { - return; - } - LivingEntity victim = event.getEntity(); GameWorld gameWorld = GameWorld.getByWorld(victim.getWorld()); String name = null; @@ -95,9 +94,9 @@ public class DMob { name = victim.getType().getName(); } - MobTrigger mobTriger = MobTrigger.get(name, gameWorld); - if (mobTriger != null) { - mobTriger.onTrigger(); + MobTrigger mobTrigger = MobTrigger.get(name, gameWorld); + if (mobTrigger != null) { + mobTrigger.onTrigger(); } Set waveTriggers = WaveTrigger.getByGameWorld(gameWorld); diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobPlugin.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobPlugin.java index 2fcf43d3..0ccbfb4a 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobPlugin.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobPlugin.java @@ -16,6 +16,9 @@ */ package io.github.dre2n.dungeonsxl.mob; +import org.bukkit.Bukkit; +import org.bukkit.Location; + /** * @author Daniel Saukel */ @@ -48,4 +51,9 @@ public enum ExternalMobPlugin implements ExternalMobProvider { return command.replaceAll("%mob%", mob).replaceAll("%world%", world).replaceAll("%x%", String.valueOf(x)).replaceAll("%y%", String.valueOf(y)).replaceAll("%z%", String.valueOf(z)); } + @Override + public void summon(String mob, Location location) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), getCommand(mob, location.getWorld().getName(), location.getX(), location.getY(), location.getZ())); + } + } diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProvider.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProvider.java index cdf58bfb..50028e8a 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProvider.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProvider.java @@ -16,6 +16,8 @@ */ package io.github.dre2n.dungeonsxl.mob; +import org.bukkit.Location; + /** * @author Daniel Saukel */ @@ -46,4 +48,12 @@ public interface ExternalMobProvider { */ public String getCommand(String mob, String world, double x, double y, double z); + /** + * @param mob + * the mob identifier + * @param location + * the location where the mob will be spawned + */ + public void summon(String mob, Location location); + } diff --git a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProviders.java b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProviders.java index a17e184c..392bd3c4 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProviders.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/mob/ExternalMobProviders.java @@ -16,11 +16,13 @@ */ package io.github.dre2n.dungeonsxl.mob; +import io.github.dre2n.commons.util.messageutil.MessageUtil; import io.github.dre2n.dungeonsxl.DungeonsXL; import java.util.Arrays; import java.util.HashSet; import java.util.Map.Entry; import java.util.Set; +import org.bukkit.Bukkit; /** * @author Daniel Saukel @@ -32,6 +34,11 @@ public class ExternalMobProviders { public ExternalMobProviders() { // Supported providers providers.addAll(Arrays.asList(ExternalMobPlugin.values())); + if (Bukkit.getPluginManager().getPlugin("Citizens") != null) { + providers.add(new CitizensMobProvider()); + } else { + MessageUtil.log("Could not find compatible Citizens plugin. The mob provider Citizens (\"CI\") will not get enabled..."); + } // Custom providers for (Entry customExternalMobProvider : DungeonsXL.getInstance().getMainConfig().getExternalMobProviders().entrySet()) { @@ -60,6 +67,19 @@ public class ExternalMobProviders { return providers; } + /** + * @return the Citizens provider + */ + public CitizensMobProvider getCitizensMobProvider() { + for (ExternalMobProvider provider : providers) { + if (provider instanceof CitizensMobProvider) { + return (CitizensMobProvider) provider; + } + } + + return null; + } + /** * @param provider * the provider to register diff --git a/src/main/java/io/github/dre2n/dungeonsxl/player/DPlayer.java b/src/main/java/io/github/dre2n/dungeonsxl/player/DPlayer.java index 36afcdf9..a9538bc5 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/player/DPlayer.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/player/DPlayer.java @@ -33,6 +33,7 @@ import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerUpdateEvent; import io.github.dre2n.dungeonsxl.game.Game; import io.github.dre2n.dungeonsxl.game.GameType; import io.github.dre2n.dungeonsxl.game.GameTypeDefault; +import io.github.dre2n.dungeonsxl.mob.DMob; import io.github.dre2n.dungeonsxl.reward.DLootInventory; import io.github.dre2n.dungeonsxl.reward.Reward; import io.github.dre2n.dungeonsxl.trigger.DistanceTrigger; @@ -898,8 +899,7 @@ public class DPlayer extends DGlobalPlayer { } } - } else if (gameWorld - != null) { + } else if (gameWorld != null) { // Update Wolf if (getWolf() != null) { if (getWolf().isDead()) { @@ -911,6 +911,11 @@ public class DPlayer extends DGlobalPlayer { } wolfRespawnTime--; } + + DMob dMob = DMob.getByEntity(getWolf()); + if (dMob != null) { + gameWorld.removeDMob(dMob); + } } // Kick offline plugin.getDPlayers() diff --git a/src/main/java/io/github/dre2n/dungeonsxl/task/ExternalMobSpawnTask.java b/src/main/java/io/github/dre2n/dungeonsxl/task/ExternalMobSpawnTask.java index e00e88a5..6440223f 100644 --- a/src/main/java/io/github/dre2n/dungeonsxl/task/ExternalMobSpawnTask.java +++ b/src/main/java/io/github/dre2n/dungeonsxl/task/ExternalMobSpawnTask.java @@ -20,7 +20,6 @@ import io.github.dre2n.dungeonsxl.mob.DMob; import io.github.dre2n.dungeonsxl.mob.ExternalMobProvider; import io.github.dre2n.dungeonsxl.sign.ExternalMobSign; import io.github.dre2n.dungeonsxl.world.GameWorld; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.scheduler.BukkitRunnable; @@ -45,12 +44,8 @@ public class ExternalMobSpawnTask extends BukkitRunnable { if (gameWorld != null) { sign.setSpawnLocation(sign.getSign().getLocation().add(0.5, 0, 0.5)); - double x = sign.getSpawnLocation().getX(); - double y = sign.getSpawnLocation().getY(); - double z = sign.getSpawnLocation().getZ(); - String command = provider.getCommand(sign.getMob(), "DXL_Game_" + gameWorld.getId(), x, y, z); - Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), command); + provider.summon(sign.getMob(), sign.getSpawnLocation()); sign.setExternalMobs(); if (sign.getExternalMob() != null) {