From 93d263d063c5205e09b7f6727b42033cb40a5ca3 Mon Sep 17 00:00:00 2001 From: joethei Date: Tue, 11 Oct 2016 23:20:58 +0200 Subject: [PATCH] + added Debug Manager + added GameTimer + added Story Mission --- Core.iml | 22 ++++---- local-maven-repo/The5zigMod.jar | Bin 0 -> 55487 bytes pom.xml | 13 ++++- src/main/java/eu/univento/core/Core.java | 17 +++++- .../eu/univento/core/antihack/AntiHack.java | 2 +- .../core/antihack/modules/AutoSoup.java | 24 +++++++++ .../core/antihack/modules/Movement.java | 40 ++++++++++++++ .../core/antihack/modules/NoSlowDown.java | 36 ------------- .../core/antihack/modules/SelfHit.java | 26 +++++++++ .../univento/core/api/debug/DebugManager.java | 46 ++++++++++++++++ .../core/api/entity/EntityModifier.java | 33 ++++-------- .../eu/univento/core/api/game/GameTimer.java | 51 ++++++++++++++++++ .../univento/core/api/game/PlayerManager.java | 1 - .../univento/core/api/game/TeamManager.java | 2 +- .../core/api/items/InventoryManager.java | 8 +-- .../eu/univento/core/api/map/MapDatabase.java | 2 +- .../core/api/player/CustomPlayer.java | 19 +++---- .../core/api/player/SpectateManager.java | 4 +- .../univento/core/api/player/Spectator.java | 3 +- .../univento/core/api/server/ServerInfo.java | 2 + .../core/api/server/ServerSettings.java | 2 +- .../univento/core/api/shop/ShopCategory.java | 2 +- .../univento/core/api/story/StoryMission.java | 51 ++++++++++++++++++ .../core/api/story/StoryMissionStatus.java | 11 ++++ .../core/api/story/StoryMissions.java | 23 ++++++++ .../java/eu/univento/core/commands/Nick.java | 4 +- .../eu/univento/core/listeners/JoinQuit.java | 5 +- 27 files changed, 351 insertions(+), 98 deletions(-) create mode 100644 local-maven-repo/The5zigMod.jar create mode 100644 src/main/java/eu/univento/core/antihack/modules/AutoSoup.java delete mode 100644 src/main/java/eu/univento/core/antihack/modules/NoSlowDown.java create mode 100644 src/main/java/eu/univento/core/antihack/modules/SelfHit.java create mode 100644 src/main/java/eu/univento/core/api/debug/DebugManager.java create mode 100644 src/main/java/eu/univento/core/api/game/GameTimer.java create mode 100644 src/main/java/eu/univento/core/api/story/StoryMission.java create mode 100644 src/main/java/eu/univento/core/api/story/StoryMissionStatus.java create mode 100644 src/main/java/eu/univento/core/api/story/StoryMissions.java diff --git a/Core.iml b/Core.iml index b23cecb..c49390e 100644 --- a/Core.iml +++ b/Core.iml @@ -23,25 +23,29 @@ - + + - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/local-maven-repo/The5zigMod.jar b/local-maven-repo/The5zigMod.jar new file mode 100644 index 0000000000000000000000000000000000000000..78e34506395bf231a9b827277ac20c6a4731d95d GIT binary patch literal 55487 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 B`da`1 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 4deeaea..13beb7f 100644 --- a/pom.xml +++ b/pom.xml @@ -72,13 +72,24 @@ org.bukkit craftbukkit 1.10.2-R0.1-SNAPSHOT - provided eu.univento CloudCommons 1.0-SNAPSHOT + + eu.univento + Commons + 1.0-SNAPSHOT + + + eu.the5zig.mod + mod + 1.0 + system + ${project.basedir}/local-maven-repo/The5zigMod.jar + \ No newline at end of file diff --git a/src/main/java/eu/univento/core/Core.java b/src/main/java/eu/univento/core/Core.java index 76439cc..782af01 100644 --- a/src/main/java/eu/univento/core/Core.java +++ b/src/main/java/eu/univento/core/Core.java @@ -4,6 +4,7 @@ import eu.univento.commons.Commons; import eu.univento.commons.server.TPS; import eu.univento.core.antihack.AntiHack; import eu.univento.core.api.Config; +import eu.univento.core.api.debug.DebugManager; import eu.univento.core.api.effects.Blackscreen; import eu.univento.core.api.events.MoveEventFilter; import eu.univento.core.api.items.InventoryManager; @@ -13,6 +14,8 @@ import eu.univento.core.api.server.ServerSettings; import eu.univento.core.api.utils.NettyInjection; import eu.univento.core.commands.*; import eu.univento.core.listeners.*; +import io.netty.channel.Channel; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -20,7 +23,6 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; -import java.nio.channels.Channel; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; @@ -80,10 +82,13 @@ public class Core extends JavaPlugin implements NettyInjection.PacketHandler { public static void broadcast(String key) { for (CustomPlayer players : getOnlinePlayers()) { - players.sendMessage(players.getDatabasePlayer().getMessage(key)); + players.sendMessage(players.getDatabasePlayer().getLanguage().getWord(key)); } } + @Getter + private static DebugManager debugManager; + /* @Override public void onLoad() { @@ -205,10 +210,17 @@ public class Core extends JavaPlugin implements NettyInjection.PacketHandler { this.injection = new NettyInjection(this, this.getName()); this.injection.addHandler("TIMEOUT", new NettyInjection.PacketHandler() { public Object onPacketIn(Player sender, Channel channel, Object packet) { + getCommons().getLoggingHandler().getCore().info("PacketIN: " + sender.getName() + " | " + channel + " | " + packet); if (timeout.contains(CustomPlayer.getPlayer(sender))) return null; return packet; } + + @Override + public Object onPacketOut(Player target, Channel channel, Object packet) { + getCommons().getLoggingHandler().getCore().info("PacketOUT: " + target.getName() + " | " + channel + " | " + packet); + return packet; + } }); commons.getSecurityHandler().isValidServer(getServer().getIp(), aBoolean -> { if(!aBoolean) { @@ -216,6 +228,7 @@ public class Core extends JavaPlugin implements NettyInjection.PacketHandler { } }); Bukkit.getScheduler().runTask(this, new TPS()); + debugManager = new DebugManager(); } @Override diff --git a/src/main/java/eu/univento/core/antihack/AntiHack.java b/src/main/java/eu/univento/core/antihack/AntiHack.java index 646cf80..a0fe67b 100644 --- a/src/main/java/eu/univento/core/antihack/AntiHack.java +++ b/src/main/java/eu/univento/core/antihack/AntiHack.java @@ -17,6 +17,7 @@ public class AntiHack implements Listener{ private static final PacketInjector packetInjector = new PacketInjector(); + //TODO: add nofication system public static void registerListeners() { PluginManager pm = Bukkit.getPluginManager(); pm.registerEvents(new AntiHack(), Core.getInstance()); @@ -24,7 +25,6 @@ public class AntiHack implements Listener{ pm.registerEvents(new AutoClicker(), Core.getInstance()); pm.registerEvents(new Criticals(), Core.getInstance()); pm.registerEvents(new Reach(), Core.getInstance()); - pm.registerEvents(new NoSlowDown(), Core.getInstance()); pm.registerEvents(new Regen(), Core.getInstance()); pm.registerEvents(new AutoRespawn(), Core.getInstance()); pm.registerEvents(new FastPlace(), Core.getInstance()); diff --git a/src/main/java/eu/univento/core/antihack/modules/AutoSoup.java b/src/main/java/eu/univento/core/antihack/modules/AutoSoup.java new file mode 100644 index 0000000..bb95d37 --- /dev/null +++ b/src/main/java/eu/univento/core/antihack/modules/AutoSoup.java @@ -0,0 +1,24 @@ +package eu.univento.core.antihack.modules; + +import eu.univento.core.api.player.CustomPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +/** + * @author joethei + * @version 0.1 + */ +public class AutoSoup implements Listener{ + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if(e.getEntity() instanceof Player && e.getDamager() instanceof Player) { + CustomPlayer p = (CustomPlayer) e.getDamager(); + if(p.getInventory().getViewers().size() < 0) { + p.closeInventory(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/antihack/modules/Movement.java b/src/main/java/eu/univento/core/antihack/modules/Movement.java index eaf51a7..83fee61 100644 --- a/src/main/java/eu/univento/core/antihack/modules/Movement.java +++ b/src/main/java/eu/univento/core/antihack/modules/Movement.java @@ -1,11 +1,15 @@ package eu.univento.core.antihack.modules; +import eu.univento.core.api.events.MoveEventFilter; import eu.univento.core.api.player.CustomPlayer; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.player.PlayerMoveEvent; public class Movement implements Listener{ @@ -43,4 +47,40 @@ public class Movement implements Listener{ p.sendMessage("Du hast Glide an"); } } + + @EventHandler + public void onShootBow(EntityShootBowEvent e) { + if(e.getEntity() instanceof Player) { + CustomPlayer p = CustomPlayer.getPlayer((Player) e.getEntity()); + if(p.isSprinting()) { + e.setCancelled(true); + p.damage(2.0D); + p.setArrowsInBody(p.getArrowsInBody() + 50); + p.sendMessage("Du hast NoSlowDown an"); + } + } + } + + @EventHandler + public void onFoodChange(FoodLevelChangeEvent e) { + if(e.getEntity() instanceof Player) { + CustomPlayer p = CustomPlayer.getPlayer((Player) e.getEntity()); + if(e.getFoodLevel() > p.getFoodLevel() && p.isSprinting()) { + e.setCancelled(true); + e.setFoodLevel(0); + p.sendMessage("Du hast NoSlowDown an"); + } + } + } + + @EventHandler + public void onMoveByBlock(MoveEventFilter.PlayerBlockMoveEvent e) { + CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer()); + double distance = e.getTo().getY() - e.getFrom().getY(); + if(distance >= 0.9D) { + e.setCancelled(true); + p.teleport(e.getFrom()); + p.sendMessage("Du hast Step an"); + } + } } \ No newline at end of file diff --git a/src/main/java/eu/univento/core/antihack/modules/NoSlowDown.java b/src/main/java/eu/univento/core/antihack/modules/NoSlowDown.java deleted file mode 100644 index dc0c291..0000000 --- a/src/main/java/eu/univento/core/antihack/modules/NoSlowDown.java +++ /dev/null @@ -1,36 +0,0 @@ -package eu.univento.core.antihack.modules; - -import eu.univento.core.api.player.CustomPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityShootBowEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; - -public class NoSlowDown implements Listener{ - - @EventHandler - public void onShootBow(EntityShootBowEvent e) { - if(e.getEntity() instanceof Player) { - CustomPlayer p = CustomPlayer.getPlayer((Player) e.getEntity()); - if(p.isSprinting()) { - e.setCancelled(true); - p.damage(2.0D); - p.setArrowsInBody(p.getArrowsInBody() + 50); - p.sendMessage("Du hast NoSlowDown an"); - } - } - } - - @EventHandler - public void onFoodChange(FoodLevelChangeEvent e) { - if(e.getEntity() instanceof Player) { - CustomPlayer p = CustomPlayer.getPlayer((Player) e.getEntity()); - if(e.getFoodLevel() > p.getFoodLevel() && p.isSprinting()) { - e.setCancelled(true); - e.setFoodLevel(0); - p.sendMessage("Du hast NoSlowDown an"); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/antihack/modules/SelfHit.java b/src/main/java/eu/univento/core/antihack/modules/SelfHit.java new file mode 100644 index 0000000..cee43e5 --- /dev/null +++ b/src/main/java/eu/univento/core/antihack/modules/SelfHit.java @@ -0,0 +1,26 @@ +package eu.univento.core.antihack.modules; + +import eu.univento.core.api.player.CustomPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +/** + * @author joethei + * @version 0.1 + */ +public class SelfHit implements Listener { + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if(!e.isCancelled() && e.getEntity() instanceof Player && e.getDamager() instanceof Player) { + CustomPlayer p = (CustomPlayer) e.getEntity(); + CustomPlayer damager = (CustomPlayer) e.getDamager(); + if(damager.equals(p)) { + e.setCancelled(true); + e.setDamage(0.0D); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/debug/DebugManager.java b/src/main/java/eu/univento/core/api/debug/DebugManager.java new file mode 100644 index 0000000..533c702 --- /dev/null +++ b/src/main/java/eu/univento/core/api/debug/DebugManager.java @@ -0,0 +1,46 @@ +package eu.univento.core.api.debug; + +import eu.the5zig.mod.server.The5zigMod; +import eu.the5zig.mod.server.api.ModUser; +import eu.univento.commons.player.Rank; +import eu.univento.core.api.player.CustomPlayer; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author joethei + * @version 0.1 + */ +public class DebugManager { + + private boolean enabled; + + public DebugManager() { + Plugin plugin = Bukkit.getPluginManager().getPlugin("The5zigMod"); + if(plugin.isEnabled()) { + this.enabled = true; + } + } + + public void sendStat(String stat, String score) { + if(enabled) { + for(ModUser user : The5zigMod.getInstance().getUserManager().getOnlineModUsers()) { + CustomPlayer player = CustomPlayer.getPlayer(user.getPlayer()); + if(player.getDatabasePlayer().isAllowed(Rank.JrDeveloper)) { + user.getStatsManager().getStat(stat).setScore(score); + } + } + } + } + + public void sendOverlay(String overlay) { + if(enabled) { + for(ModUser user : The5zigMod.getInstance().getUserManager().getOnlineModUsers()) { + CustomPlayer player = CustomPlayer.getPlayer(user.getPlayer()); + if(player.getDatabasePlayer().isAllowed(Rank.JrDeveloper)) { + user.sendOverlay(overlay); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/entity/EntityModifier.java b/src/main/java/eu/univento/core/api/entity/EntityModifier.java index a8cca96..6547773 100644 --- a/src/main/java/eu/univento/core/api/entity/EntityModifier.java +++ b/src/main/java/eu/univento/core/api/entity/EntityModifier.java @@ -1,5 +1,6 @@ package eu.univento.core.api.entity; +import eu.univento.core.Core; import net.minecraft.server.v1_10_R1.EntityLiving; import net.minecraft.server.v1_10_R1.NBTTagCompound; import org.bukkit.Bukkit; @@ -21,18 +22,17 @@ public class EntityModifier { private static CraftEntity craftentity; private static net.minecraft.server.v1_10_R1.Entity entityS; private static int scheduler; - private static Plugin plugin; + private static Plugin plugin = Core.getInstance(); private static Player player = null; private static float Speed; - public EntityModifier(org.bukkit.entity.Entity entity, Plugin plugin) { + public EntityModifier(org.bukkit.entity.Entity entity) { EntityModifier.entity = entity; craftentity = (CraftEntity) entity; entityS = craftentity.getHandle(); - EntityModifier.plugin = plugin; } - public static Builder modify() { + public Builder modify() { return new Builder(); } @@ -48,7 +48,7 @@ public class EntityModifier { return this; } - public Builder playEffekt(EntityEffect entityeffect) { + public Builder playEffect(EntityEffect entityeffect) { EntityModifier.entity.playEffect(entityeffect); return this; } @@ -75,9 +75,7 @@ public class EntityModifier { public Builder setYawPitch(float yaw, float pitch) { Location loc = EntityModifier.entity.getLocation().clone(); - teleport( - new Location(loc.getWorld(), loc.getX(), loc.getY(), - loc.getZ(), yaw, pitch)); + teleport(new Location(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), yaw, pitch)); return this; } @@ -102,8 +100,7 @@ public class EntityModifier { public Builder setInvulnerable(boolean invulnerable) { try { - Field invulnerableField = net.minecraft.server.v1_10_R1.Entity.class - .getDeclaredField("invulnerable"); + Field invulnerableField = net.minecraft.server.v1_10_R1.Entity.class.getDeclaredField("invulnerable"); invulnerableField.setAccessible(true); invulnerableField.setBoolean(EntityModifier.entityS, invulnerable); } catch (Exception ex) { @@ -159,10 +156,7 @@ public class EntityModifier { } public Builder walkToLocation(Location location, float speed) { - ((CraftCreature) EntityModifier.entity) - .getHandle() - .getNavigation() - .a(location.getX(), location.getY(), location.getZ(), speed); + ((CraftCreature) EntityModifier.entity).getHandle().getNavigation().a(location.getX(), location.getY(), location.getZ(), speed); return this; } @@ -171,20 +165,13 @@ public class EntityModifier { EntityModifier.Speed = speed; EntityModifier.scheduler = Bukkit.getScheduler().scheduleSyncRepeatingTask(EntityModifier.plugin, () -> { - double distance = EntityModifier.entity.getLocation().distance( - EntityModifier.player.getLocation()); + double distance = EntityModifier.entity.getLocation().distance(EntityModifier.player.getLocation()); if (distance < 11.0D) { float speed1 = EntityModifier.Speed; if (distance < 3.0D) { speed1 = 0.0F; } - ((CraftCreature) EntityModifier.entity) - .getHandle() - .getNavigation() - .a(EntityModifier.player.getLocation().getX(), - EntityModifier.player.getLocation().getY(), - EntityModifier.player.getLocation().getZ(), - speed1); + ((CraftCreature) EntityModifier.entity).getHandle().getNavigation().a(EntityModifier.player.getLocation().getX(),EntityModifier.player.getLocation().getY(),EntityModifier.player.getLocation().getZ(), speed1); } else if (EntityModifier.player.isOnGround()) { EntityModifier.entity.teleport(EntityModifier.player); } diff --git a/src/main/java/eu/univento/core/api/game/GameTimer.java b/src/main/java/eu/univento/core/api/game/GameTimer.java new file mode 100644 index 0000000..677ce8c --- /dev/null +++ b/src/main/java/eu/univento/core/api/game/GameTimer.java @@ -0,0 +1,51 @@ +package eu.univento.core.api.game; + +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitRunnable; + +/** + * @author joethei + * @version 0.1 + */ +public class GameTimer extends BukkitRunnable{ + + private Plugin plugin; + private int time; + private int minPlayers; + private GameTimer following; + + public GameTimer(Plugin plugin, GameTimer following, int time, int minPlayers) { + this.plugin = plugin; + this.following = following; + this.time = time; + this.minPlayers = minPlayers; + runTaskTimer(plugin, 20L, 20L); + } + + @Override + public void run() { + if(PlayerManager.size() >= minPlayers) { + time--; + + } + if(time == 0) { + if(PlayerManager.size() > minPlayers) { + this.cancel(); + following.run(); + }else { + this.cancel(); + //TODO: reset timer + this.run(); + } + } + } + + public int getTime() { + return time; + } + + public int getMinPlayers() { + return minPlayers; + } + +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/game/PlayerManager.java b/src/main/java/eu/univento/core/api/game/PlayerManager.java index 51370e2..cb10e09 100644 --- a/src/main/java/eu/univento/core/api/game/PlayerManager.java +++ b/src/main/java/eu/univento/core/api/game/PlayerManager.java @@ -13,7 +13,6 @@ public class PlayerManager { private static final List players = new LinkedList<>(); - public static List getPlayers() { return players; } diff --git a/src/main/java/eu/univento/core/api/game/TeamManager.java b/src/main/java/eu/univento/core/api/game/TeamManager.java index 84a7a46..7601f54 100644 --- a/src/main/java/eu/univento/core/api/game/TeamManager.java +++ b/src/main/java/eu/univento/core/api/game/TeamManager.java @@ -8,7 +8,7 @@ import java.util.ArrayList; * @author joethei * @version 0.1 */ -class TeamManager { +public class TeamManager { private static final ArrayList teams = new ArrayList<>(); diff --git a/src/main/java/eu/univento/core/api/items/InventoryManager.java b/src/main/java/eu/univento/core/api/items/InventoryManager.java index 53eb08f..212d138 100644 --- a/src/main/java/eu/univento/core/api/items/InventoryManager.java +++ b/src/main/java/eu/univento/core/api/items/InventoryManager.java @@ -58,10 +58,12 @@ public class InventoryManager implements Listener{ public void onInventoryClick(InventoryClickEvent e) { int i = 0; CustomPlayer p = CustomPlayer.getPlayer((Player) e.getWhoClicked()); - for(ClickInventory inventory : inventoryList) { - if(inventory.getPlayer() == p) - inventory.onInventoryClick(e); + if(e.getInventory() instanceof ClickInventory) { + for(ClickInventory inventory : inventoryList) { + if(inventory.getPlayer() == p) + inventory.onInventoryClick(e); if(i++ == 1) break; + } } } diff --git a/src/main/java/eu/univento/core/api/map/MapDatabase.java b/src/main/java/eu/univento/core/api/map/MapDatabase.java index 992c4a9..fbeec43 100644 --- a/src/main/java/eu/univento/core/api/map/MapDatabase.java +++ b/src/main/java/eu/univento/core/api/map/MapDatabase.java @@ -1,6 +1,6 @@ package eu.univento.core.api.map; -import eu.univento.cloud.commons.server.ServerType; +import eu.univento.commons.server.ServerType; import eu.univento.core.Core; import org.bukkit.Material; diff --git a/src/main/java/eu/univento/core/api/player/CustomPlayer.java b/src/main/java/eu/univento/core/api/player/CustomPlayer.java index 6ba7b6c..0aeed3b 100644 --- a/src/main/java/eu/univento/core/api/player/CustomPlayer.java +++ b/src/main/java/eu/univento/core/api/player/CustomPlayer.java @@ -18,13 +18,11 @@ import eu.univento.core.api.utils.GameProfileBuilder; import eu.univento.core.api.utils.UUIDFetcher; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_10_R1.*; -import net.minecraft.server.v1_10_R1.World; import org.bson.Document; import org.bukkit.*; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeModifier; @@ -46,7 +44,7 @@ import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.util.*; -public class CustomPlayer extends CraftPlayer{ +public class CustomPlayer extends CraftPlayer { private static final HashMap PLAYERS = new HashMap<>(); @@ -180,7 +178,7 @@ public class CustomPlayer extends CraftPlayer{ */ public void sendActionBar(String text) { - spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(text)); + //spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(text)); } public void sendTitle(int fadeIn, int stay, int fadeOut, String title, String subtitle) { @@ -326,6 +324,8 @@ public class CustomPlayer extends CraftPlayer{ setDisplayName(name); Field nameField = getField(GameProfile.class, "name"); try { + assert nameField != null; + nameField.setAccessible(true); nameField.set(getProfile(), name); PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(getEntityId()); sendPacket(destroy); @@ -349,8 +349,8 @@ public class CustomPlayer extends CraftPlayer{ } public void strikeLightning(Location loc) { - World nmsWorld = ((CraftWorld) loc.getWorld()).getHandle(); - EntityLightning lightning = new EntityLightning(nmsWorld, loc.getX(), loc.getY(), loc.getZ(), true); + World nmsWorld = (World) ((CraftWorld) loc.getWorld()).getHandle(); + EntityLightning lightning = new EntityLightning((net.minecraft.server.v1_10_R1.World) nmsWorld, loc.getX(), loc.getY(), loc.getZ(), true); sendPacket(new PacketPlayOutSpawnEntityWeather(lightning)); playSound(loc, Sound.ENTITY_LIGHTNING_IMPACT, 20.0F, 1.0F); playSound(loc, Sound.ENTITY_LIGHTNING_THUNDER, 20.0F, 1.0F); @@ -360,11 +360,6 @@ public class CustomPlayer extends CraftPlayer{ Blackscreen.setBlack(PLAYER, seconds); } - @Override - public boolean isOnline() { - return DATABASE_PLAYER.isOnline(); - } - public void setStoryResourcePack() { setResourcePack("http://univento.eu/storyPack.zip"); } diff --git a/src/main/java/eu/univento/core/api/player/SpectateManager.java b/src/main/java/eu/univento/core/api/player/SpectateManager.java index a1713db..672df84 100644 --- a/src/main/java/eu/univento/core/api/player/SpectateManager.java +++ b/src/main/java/eu/univento/core/api/player/SpectateManager.java @@ -18,11 +18,11 @@ public class SpectateManager { return null; } - public static void add(Spectator spectator) { + static void add(Spectator spectator) { if(!spectators.contains(spectator)) spectators.add(spectator); } - public static void remove(Spectator spectator) { + static void remove(Spectator spectator) { if(spectators.contains(spectator)) spectators.remove(spectator); } diff --git a/src/main/java/eu/univento/core/api/player/Spectator.java b/src/main/java/eu/univento/core/api/player/Spectator.java index 62f4222..487b89a 100644 --- a/src/main/java/eu/univento/core/api/player/Spectator.java +++ b/src/main/java/eu/univento/core/api/player/Spectator.java @@ -1,5 +1,6 @@ package eu.univento.core.api.player; +import eu.univento.commons.player.language.MessageConstant; import eu.univento.core.Core; import eu.univento.core.api.game.PlayerManager; import eu.univento.core.api.items.ItemBuilder; @@ -51,7 +52,7 @@ public class Spectator { } public void openPlayerListInventory() { - ScrollingInventory inventory = new ScrollingInventory(player, player.getDatabasePlayer().getMessage("Game.Menu.SpectatorMenu")); + ScrollingInventory inventory = new ScrollingInventory(player, player.getDatabasePlayer().getLanguage().getMessage(MessageConstant.GAME_SPECTATE_MENU)); for(CustomPlayer players : PlayerManager.getPlayers()) { inventory.addItem(new ItemBuilder(Material.SKULL_ITEM).durability((short) 3).skullOwner(players.getDisplayName()).name(players.getDisplayName()).make()); } diff --git a/src/main/java/eu/univento/core/api/server/ServerInfo.java b/src/main/java/eu/univento/core/api/server/ServerInfo.java index a499b03..6f79d54 100644 --- a/src/main/java/eu/univento/core/api/server/ServerInfo.java +++ b/src/main/java/eu/univento/core/api/server/ServerInfo.java @@ -1,5 +1,7 @@ package eu.univento.core.api.server; +import eu.univento.commons.server.ServerType; + import java.util.regex.Pattern; /** diff --git a/src/main/java/eu/univento/core/api/server/ServerSettings.java b/src/main/java/eu/univento/core/api/server/ServerSettings.java index 7c42fe9..8e8c28c 100644 --- a/src/main/java/eu/univento/core/api/server/ServerSettings.java +++ b/src/main/java/eu/univento/core/api/server/ServerSettings.java @@ -1,6 +1,6 @@ package eu.univento.core.api.server; -import eu.univento.cloud.commons.server.ServerType; +import eu.univento.commons.server.ServerType; import eu.univento.core.Core; import eu.univento.core.commands.Build; import eu.univento.core.listeners.Blocks; diff --git a/src/main/java/eu/univento/core/api/shop/ShopCategory.java b/src/main/java/eu/univento/core/api/shop/ShopCategory.java index 12ec21b..fbc673a 100644 --- a/src/main/java/eu/univento/core/api/shop/ShopCategory.java +++ b/src/main/java/eu/univento/core/api/shop/ShopCategory.java @@ -1,6 +1,6 @@ package eu.univento.core.api.shop; -import eu.univento.cloud.commons.server.ServerType; +import eu.univento.commons.server.ServerType; /** * @author joethei diff --git a/src/main/java/eu/univento/core/api/story/StoryMission.java b/src/main/java/eu/univento/core/api/story/StoryMission.java new file mode 100644 index 0000000..a970225 --- /dev/null +++ b/src/main/java/eu/univento/core/api/story/StoryMission.java @@ -0,0 +1,51 @@ +package eu.univento.core.api.story; + +import eu.univento.core.Core; +import eu.univento.core.api.player.CustomPlayer; +import lombok.Data; +import org.bukkit.Bukkit; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.plugin.PluginManager; + +import java.util.List; + +/** + * @author joethei + * @version 0.1 + */ + +@Data +public class StoryMission{ + + private PluginManager pluginManager; + private List listeners; + private StoryMissions mission; + private CustomPlayer player; + + public StoryMission(StoryMissions mission, CustomPlayer player) { + this.mission = mission; + this.player = player; + this.pluginManager = Bukkit.getPluginManager(); + player.getDatabasePlayer().setInDatabase("mission", mission.getId()); + setStatus(StoryMissionStatus.RUNNING); + } + + public void registerEvent(Listener listener) { + listeners.add(listener); + pluginManager.registerEvents(listener, Core.getInstance()); + } + + public boolean unregisterEvent(Listener listener) { + HandlerList.unregisterAll(listener); + return listeners.contains(listener) && listeners.remove(listener); + } + + public void unregisterEvents() { + listeners.forEach(HandlerList::unregisterAll); + } + + public void setStatus(StoryMissionStatus status) { + player.getDatabasePlayer().setInDatabase("missionStatus", status.name()); + } +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/story/StoryMissionStatus.java b/src/main/java/eu/univento/core/api/story/StoryMissionStatus.java new file mode 100644 index 0000000..1997b97 --- /dev/null +++ b/src/main/java/eu/univento/core/api/story/StoryMissionStatus.java @@ -0,0 +1,11 @@ +package eu.univento.core.api.story; + +/** + * @author joethei + * @version 0.1 + */ +public enum StoryMissionStatus { + + RUNNING, + DONE, +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/story/StoryMissions.java b/src/main/java/eu/univento/core/api/story/StoryMissions.java new file mode 100644 index 0000000..16cc5eb --- /dev/null +++ b/src/main/java/eu/univento/core/api/story/StoryMissions.java @@ -0,0 +1,23 @@ +package eu.univento.core.api.story; + +import lombok.Getter; + +/** + * @author joethei + * @version 0.1 + */ + +public enum StoryMissions { + + START(1, "Story.Mission.Start"); + + @Getter + private int id; + @Getter + private String name; + + StoryMissions(int id, String name) { + this.id = id; + this.name = name; + } +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/commands/Nick.java b/src/main/java/eu/univento/core/commands/Nick.java index cf55a6e..9d77f73 100644 --- a/src/main/java/eu/univento/core/commands/Nick.java +++ b/src/main/java/eu/univento/core/commands/Nick.java @@ -46,7 +46,9 @@ public class Nick extends AutoCommand{ p.getDatabasePlayer().getSettings().setNickStatus(true); p.getScoreboard().getTeam(p.getDatabasePlayer().getRank().getTeam()).addEntry(p.getDisplayName()); p.sendMessage(msgs.PREFIX() + msgs.Core_NICK_ON()); - p.setNick(NickName.getRandomNick()); + String nick = NickName.getRandomNick(); + p.setNick(nick); + //Core.getDebugManager().sendOverlay("der Nick ist " + nick); } }else { p.sendMessage(msgs.NO_PERMS()); diff --git a/src/main/java/eu/univento/core/listeners/JoinQuit.java b/src/main/java/eu/univento/core/listeners/JoinQuit.java index d6e6837..1d5c536 100644 --- a/src/main/java/eu/univento/core/listeners/JoinQuit.java +++ b/src/main/java/eu/univento/core/listeners/JoinQuit.java @@ -1,5 +1,6 @@ package eu.univento.core.listeners; +import eu.univento.commons.player.language.MessageConstant; import eu.univento.core.Core; import eu.univento.core.api.Utils; import eu.univento.core.api.player.*; @@ -102,11 +103,11 @@ public class JoinQuit implements Listener { loading.remove(p); } if(e.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { - p.sendMessage(p.getDatabasePlayer().getMessage("Pack.failed_download")); + p.sendMessage(p.getDatabasePlayer().getLanguage().getMessage(MessageConstant.PACK_FAILED_DOWNLOAD)); Bukkit.getScheduler().runTaskLaterAsynchronously(Core.getInstance(), p::setStoryResourcePack, 10 * 20L); } if(e.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED) { - p.sendMessage(p.getDatabasePlayer().getMessage("Pack.declined")); + p.sendMessage(p.getDatabasePlayer().getLanguage().getMessage(MessageConstant.PACK_DECLINED)); Bukkit.getScheduler().runTaskLaterAsynchronously(Core.getInstance(), p::setStoryResourcePack, 10 * 20L); } }