From 9e2ddeb55321b09086a5a27254197d783847e6e3 Mon Sep 17 00:00:00 2001 From: Leonard Kugis <leonard@kug.is> Date: Mon, 25 Apr 2022 18:50:36 +0200 Subject: Initial commit --- .classpath | 36 +++ .gitignore | 171 ++++++++++++ .project | 23 ++ dependency-reduced-pom.xml | 90 +++++++ pom.xml | 102 +++++++ src/main/java/com/encrox/zombie/Commander.java | 56 ++++ src/main/java/com/encrox/zombie/Constants.java | 59 +++++ src/main/java/com/encrox/zombie/Game.java | 294 +++++++++++++++++++++ src/main/java/com/encrox/zombie/GameListener.java | 159 +++++++++++ src/main/java/com/encrox/zombie/Lobby.java | 72 +++++ src/main/java/com/encrox/zombie/Map.java | 118 +++++++++ src/main/java/com/encrox/zombie/Misc.java | 12 + src/main/java/com/encrox/zombie/Mob.java | 41 +++ src/main/java/com/encrox/zombie/Schematic.java | 117 ++++++++ src/main/java/com/encrox/zombie/Zombie.java | 245 +++++++++++++++++ src/main/java/com/encrox/zombie/ZombieWorld.java | 79 ++++++ .../java/com/encrox/zombie/interactable/Chest.java | 27 ++ .../encrox/zombie/interactable/Interactable.java | 23 ++ .../java/com/encrox/zombie/interactable/Lever.java | 38 +++ .../com/encrox/zombie/interactable/Powerup.java | 22 ++ src/main/resources/config.json | 4 + src/main/resources/descriptor.json | 59 +++++ src/main/resources/lang/de-DE.properties | 2 + src/main/resources/lang/en-GB.properties | 28 ++ src/main/resources/plugin.yml | 9 + src/main/resources/schematics/test.schematic | Bin 0 -> 187 bytes target/classes/config.json | 4 + target/classes/descriptor.json | 59 +++++ target/classes/lang/de-DE.properties | 2 + target/classes/lang/en-GB.properties | 28 ++ target/classes/plugin.yml | 9 + target/classes/schematics/test.schematic | Bin 0 -> 187 bytes target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 15 ++ .../testCompile/default-testCompile/inputFiles.lst | 0 36 files changed, 2008 insertions(+) create mode 100755 .classpath create mode 100644 .gitignore create mode 100755 .project create mode 100755 dependency-reduced-pom.xml create mode 100755 pom.xml create mode 100755 src/main/java/com/encrox/zombie/Commander.java create mode 100755 src/main/java/com/encrox/zombie/Constants.java create mode 100755 src/main/java/com/encrox/zombie/Game.java create mode 100755 src/main/java/com/encrox/zombie/GameListener.java create mode 100755 src/main/java/com/encrox/zombie/Lobby.java create mode 100755 src/main/java/com/encrox/zombie/Map.java create mode 100755 src/main/java/com/encrox/zombie/Misc.java create mode 100755 src/main/java/com/encrox/zombie/Mob.java create mode 100755 src/main/java/com/encrox/zombie/Schematic.java create mode 100755 src/main/java/com/encrox/zombie/Zombie.java create mode 100755 src/main/java/com/encrox/zombie/ZombieWorld.java create mode 100755 src/main/java/com/encrox/zombie/interactable/Chest.java create mode 100755 src/main/java/com/encrox/zombie/interactable/Interactable.java create mode 100755 src/main/java/com/encrox/zombie/interactable/Lever.java create mode 100755 src/main/java/com/encrox/zombie/interactable/Powerup.java create mode 100755 src/main/resources/config.json create mode 100755 src/main/resources/descriptor.json create mode 100755 src/main/resources/lang/de-DE.properties create mode 100755 src/main/resources/lang/en-GB.properties create mode 100755 src/main/resources/plugin.yml create mode 100755 src/main/resources/schematics/test.schematic create mode 100755 target/classes/config.json create mode 100755 target/classes/descriptor.json create mode 100755 target/classes/lang/de-DE.properties create mode 100755 target/classes/lang/en-GB.properties create mode 100755 target/classes/plugin.yml create mode 100755 target/classes/schematics/test.schematic create mode 100755 target/maven-archiver/pom.properties create mode 100755 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100755 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100755 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/.classpath b/.classpath new file mode 100755 index 0000000..16c89cc --- /dev/null +++ b/.classpath @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" output="target/classes" path="src/main/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" output="target/test-classes" path="src/test/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="target/classes"/> +</classpath> diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d02df8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,171 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/eclipse,java,windows,linux,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=eclipse,java,windows,linux,macos + +### Eclipse ### +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ +.apt_generated_test/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +# Uncomment this line if you wish to ignore the project description file. +# Typically, this file would be tracked if it contains build/dependency configurations: +#.project + +### Eclipse Patch ### +# Spring Boot Tooling +.sts4-cache/ + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/eclipse,java,windows,linux,macos diff --git a/.project b/.project new file mode 100755 index 0000000..ff9fa73 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>zombie</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + </natures> +</projectDescription> diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100755 index 0000000..c1adb1e --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.encrox</groupId> + <artifactId>zombie</artifactId> + <name>Zombie</name> + <version>0.0.1-SNAPSHOT</version> + <build> + <resources> + <resource> + <directory>src/main/resources</directory> + <includes> + <include>plugin.yml</include> + <include>config.json</include> + <include>descriptor.json</include> + </includes> + </resource> + <resource> + <targetPath>schematics</targetPath> + <directory>src/main/resources/schematics</directory> + <includes> + <include>test.schematic</include> + </includes> + </resource> + <resource> + <targetPath>lang</targetPath> + <directory>src/main/resources/lang</directory> + <includes> + <include>de-DE.properties</include> + <include>en-GB.properties</include> + </includes> + </resource> + </resources> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.6.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <artifactId>maven-shade-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + </execution> + </executions> + <configuration /> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>org.bukkit</groupId> + <artifactId>craftbukkit</artifactId> + <version>1.8</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sk89q</groupId> + <artifactId>worldedit</artifactId> + <version>6.1.5</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sk89q</groupId> + <artifactId>worldguard</artifactId> + <version>6.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.comphenix</groupId> + <artifactId>protocollib</artifactId> + <version>4.2.1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.encrox</groupId> + <artifactId>instancedregions</artifactId> + <version>0.0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + </dependencies> +</project> + diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..27724f8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,102 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.encrox</groupId> + <artifactId>zombie</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>Zombie</name> + <dependencies> + <dependency> + <groupId>org.bukkit</groupId> + <artifactId>craftbukkit</artifactId> + <version>1.8</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sk89q</groupId> + <artifactId>worldedit</artifactId> + <version>6.1.5</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sk89q</groupId> + <artifactId>worldguard</artifactId> + <version>6.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.comphenix</groupId> + <artifactId>protocollib</artifactId> + <version>4.2.1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.encrox</groupId> + <artifactId>instancedregions</artifactId> + <version>0.0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + <version>20160810</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.jnbt</groupId> + <artifactId>jnbt</artifactId> + <version>1.1</version> + <scope>compile</scope> + </dependency> + </dependencies> + <build> + <resources> + <resource> + <directory>src/main/resources</directory> + <includes> + <include>plugin.yml</include> + <include>config.json</include> + <include>descriptor.json</include> + </includes> + </resource> + <resource> + <directory>src/main/resources/schematics</directory> + <targetPath>schematics</targetPath> + <includes> + <include>test.schematic</include> + </includes> + </resource> + <resource> + <directory>src/main/resources/lang</directory> + <targetPath>lang</targetPath> + <includes> + <include>de-DE.properties</include> + <include>en-GB.properties</include> + </includes> + </resource> + </resources> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.6.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + </execution> + </executions> + <configuration></configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/src/main/java/com/encrox/zombie/Commander.java b/src/main/java/com/encrox/zombie/Commander.java new file mode 100755 index 0000000..40e77eb --- /dev/null +++ b/src/main/java/com/encrox/zombie/Commander.java @@ -0,0 +1,56 @@ +package com.encrox.zombie; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class Commander implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) { + try { + if(sender instanceof Player) { + Player player = (Player)sender; + switch(args[0]) { + case "lobby": + switch(args[1]) { + case "create": + if(player.hasPermission("zombie.create")) { + player.sendMessage(Zombie.createLobby(player, args[2], args[3])); + } else { + player.sendMessage(ChatColor.RED + Zombie.lang.getProperty("no_permission")); + } + break; + case "join": + if(player.hasPermission("zombie.join")) { + if(args.length == 3) { + player.sendMessage(Zombie.joinLobby(player, args[2])); + } else { + player.sendMessage(Zombie.listLobbies()); + } + } else { + player.sendMessage(ChatColor.RED + Zombie.lang.getProperty("no_permission")); + } + break; + case "leave": + player.sendMessage(Zombie.removePlayer(player)); + break; + case "start": + player.sendMessage(Zombie.start(player)); + break; + } + break; + } + } else { + sender.sendMessage(Zombie.lang.getProperty("no_player")); + } + } catch(Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + +} diff --git a/src/main/java/com/encrox/zombie/Constants.java b/src/main/java/com/encrox/zombie/Constants.java new file mode 100755 index 0000000..50e7491 --- /dev/null +++ b/src/main/java/com/encrox/zombie/Constants.java @@ -0,0 +1,59 @@ +package com.encrox.zombie; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; + +import com.sk89q.worldedit.blocks.ItemType; + +public class Constants { + + public static class Game { + + public static final Material[] ITEMSET = new Material[] { + Material.WOOD_HOE, + Material.WOOD_PICKAXE, + Material.WOOD_SPADE, + Material.WOOD_SWORD, + Material.STONE_AXE, + Material.STONE_HOE, + Material.STONE_PICKAXE, + Material.STONE_SPADE, + Material.STONE_SWORD, + Material.IRON_AXE, + Material.IRON_HOE, + Material.IRON_PICKAXE, + Material.IRON_SPADE, + Material.IRON_SWORD, + Material.GOLD_AXE, + Material.GOLD_HOE, + Material.GOLD_PICKAXE, + Material.GOLD_SPADE, + Material.GOLD_SWORD, + Material.DIAMOND_AXE, + Material.DIAMOND_HOE, + Material.DIAMOND_PICKAXE, + Material.DIAMOND_SPADE, + Material.DIAMOND_SWORD, + Material.BOW, + Material.ARROW, + Material.LEATHER_HELMET, + Material.LEATHER_CHESTPLATE, + Material.LEATHER_LEGGINGS, + Material.LEATHER_BOOTS, + Material.GOLD_HELMET, + Material.GOLD_CHESTPLATE, + Material.GOLD_LEGGINGS, + Material.GOLD_BOOTS, + Material.IRON_HELMET, + Material.IRON_CHESTPLATE, + Material.IRON_LEGGINGS, + Material.IRON_BOOTS, + Material.CHAINMAIL_HELMET, + Material.CHAINMAIL_CHESTPLATE, + Material.CHAINMAIL_LEGGINGS, + Material.CHAINMAIL_BOOTS + }; + + } + +} diff --git a/src/main/java/com/encrox/zombie/Game.java b/src/main/java/com/encrox/zombie/Game.java new file mode 100755 index 0000000..ae6ff4a --- /dev/null +++ b/src/main/java/com/encrox/zombie/Game.java @@ -0,0 +1,294 @@ +package com.encrox.zombie; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.material.MaterialData; +import org.bukkit.util.BlockVector; + +import com.encrox.instancedregions.InstancedProtectedCuboidRegion; +import com.encrox.zombie.interactable.Chest; +import com.encrox.zombie.interactable.Interactable; +import com.encrox.zombie.interactable.Lever; +import com.encrox.zombie.interactable.Powerup; + +public class Game { + + private volatile ArrayList<Player> players, frozen; + private volatile Map map; + private volatile HashMap<Player,Integer> stats; + private volatile InstancedProtectedCuboidRegion region; + private volatile Mob[] mobs; + private volatile ArrayList<Mob> mobsRound; + public volatile ArrayList<Integer> watchdog; + private volatile int round; + private volatile boolean done; + private volatile Interactable[] inters; + private volatile com.sk89q.worldedit.BlockVector min; + + public Game(ArrayList<Player> players, Map map) { + this.players = players; + this.map = map; + stats = new HashMap<Player,Integer>(); + region = Zombie.zombieWorld.allocate(map.getSchematic()); + mobs = map.getMobs(); + mobsRound = new ArrayList<Mob>(); + watchdog = new ArrayList<Integer>(); + frozen = new ArrayList<Player>(); + BlockVector spawn = map.getSpawn(); + min = region.getMinimumPoint(); + Powerup[] powerups = map.getPowerups(); + Lever[] levers = map.getLevers(); + inters = new Interactable[powerups.length+levers.length+1]; + for(int i = 0; i<levers.length; i++) { + inters[i] = levers[i]; + } + for(int i = 0; i<powerups.length; i++) { + BlockVector bv = powerups[i].getBlockVector(); + Block block = Zombie.zombieWorld.getWorld().getBlockAt(min.getBlockX()+bv.getBlockX(), 64+bv.getBlockY(), min.getBlockZ()+bv.getBlockZ()); + inters[powerups.length+i] = powerups[i]; + block.setType(Material.SIGN_POST); + Sign sign = (Sign)block.getState(); + //sign.setData(new MaterialData(Material.WALL_SIGN)); + sign.setLine(0, "[ZombieItem]"); + String itemStr = powerups[i].getItem().toString(); + sign.setLine(1, itemStr); + int len1 = itemStr.length(), len2 = sign.getLine(1).length(); + if(len2 < len1) + sign.setLine(2, itemStr.substring(len2)); + if((len2 += sign.getLine(2).length()) < len1) + sign.setLine(3, itemStr.substring(len2)); + sign.update(); + } + Chest relChest = (Chest)Misc.random(map.getChests()); + inters[inters.length-1] = relChest; + BlockVector bv = relChest.getBlockVector(); + Block block = Zombie.zombieWorld.getWorld().getBlockAt(min.getBlockX()+bv.getBlockX(), 64+bv.getBlockY(), min.getBlockZ()+bv.getBlockZ()); + block.setType(Material.CHEST); + org.bukkit.material.Chest c = new org.bukkit.material.Chest(); + c.setFacingDirection(relChest.getFacing()); + block.setData(c.getData()); + block.getState().update(); + region.apply(); + Player player; + for(int i = 0, size = players.size(); i<size; i++) { + player = players.get(i); + stats.put(player, 1000000); + region.addPlayer(player); + player.teleport(new Location(Zombie.zombieWorld.getWorld(), -1000, 64, -1000)); + Bukkit.getScheduler().runTaskLater(Zombie.plugin, new Runnable() { + Player player; + @Override + public void run() { + player.teleport(new Location(Zombie.zombieWorld.getWorld(), min.getBlockX()+spawn.getBlockX()+.5, 64+spawn.getBlockY(), min.getBlockZ()+spawn.getBlockZ()+.5)); + } + public Runnable setPlayer(Player player) { + this.player = player; + return this; + } + }.setPlayer(player), 120L); + } + /* + Bukkit.getScheduler().runTask(Zombie.plugin, new Runnable() { + @Override + public void run() { + Mob current; + int amount = 1; + com.sk89q.worldedit.BlockVector min = region.getMinimumPoint(); + LivingEntity entity; + for(int round = 1; round < Integer.MAX_VALUE; round++) { + announce(ChatColor.YELLOW + Zombie.lang.getProperty("game_round").replace("%round%", ""+round)); + for(int i = 0, size = mobs.size(); i<size; i++) { + current = mobs.get(i); + if(current.spawn(round)) { + mobsRound.add(current); + } + } + for(int i = 0; i<amount; i++) { + for(int x = 0, size = mobsRound.size(); x<size; x++) { + current = mobsRound.get(x); + entity = Zombie.zombieWorld.getWorld().spawnCreature(new Location(Zombie.zombieWorld.getWorld(), min.getBlockX()+current.bv.getBlockX(), 64+current.bv.getBlockY(), min.getBlockZ()+current.bv.getBlockZ()), current.type); + entity.setMaxHealth(entity.getMaxHealth() + round); + entity.setHealth(entity.getMaxHealth()); + watchdog.add(entity.getEntityId()); + } + } + while(!watchdog.isEmpty()); + } + } + }); + */ + + new Thread(new Runnable() { + @Override + public void run() { + Mob current; + com.sk89q.worldedit.BlockVector min = region.getMinimumPoint(); + for(round = 1; round < Integer.MAX_VALUE; round++) { + announce(ChatColor.YELLOW + Zombie.lang.getProperty("game_round").replace("%round%", ""+round)); + mobsRound.clear(); + for(int i = 0; i<mobs.length; i++) { + if(mobs[i].spawn(round)) { + mobsRound.add(mobs[i]); + } + } + done = false; + Bukkit.getScheduler().runTask(Zombie.plugin, new Runnable() { + @Override + public void run() { + LivingEntity entity; + Mob current; + for(int i = 0, amount = 10 + round; i<amount; i++) { + for(int x = 0, size = mobsRound.size(); x<size; x++) { + current = mobsRound.get(x); + entity = Zombie.zombieWorld.getWorld().spawnCreature(new Location(Zombie.zombieWorld.getWorld(), min.getBlockX()+current.bv.getBlockX(), 64+current.bv.getBlockY(), min.getBlockZ()+current.bv.getBlockZ()), current.type); + entity.setMaxHealth(entity.getMaxHealth() + round); + entity.setHealth(entity.getMaxHealth()); + watchdog.add(entity.getEntityId()); + } + } + done = true; + } + }); + while(!done); + while(!watchdog.isEmpty()); + } + } + }).start(); + + } + + public ArrayList<Player> getPlayers() { + return players; + } + + public void playerDeath(Player player) { + if(!frozen.contains(player)) { + announce(ChatColor.RED + Zombie.lang.getProperty("game_player_fell").replace("%player%", player.getName())); + player.teleport(player.getLocation().add(0, -1, 0)); + player.setHealth(.5); + frozen.add(player); + Bukkit.getScheduler().runTaskTimer(Zombie.plugin, new Runnable() { + int t = 30; + @Override + public void run() { + if(frozen.contains(player)) { + if(t == 0) { + announce(ChatColor.RED + Zombie.lang.getProperty("game_player_died").replace("%player%", player.getName())); + frozen.remove(player); + players.remove(player); + player.setHealth(player.getMaxHealth()); + //TODO: Teleport back outta dungeon + } else { + announce(ChatColor.YELLOW + Zombie.lang.getProperty("game_revive_countdown").replace("%player%", player.getName()).replace("%seconds%", ""+t)); + t-=5; + } + } + } + }, 0, 100); + } + } + + public boolean isFrozen(Player player) { + return frozen.contains(player); + } + + public void revive(Player from, Player to) { + if(frozen.contains(to)) { + frozen.remove(to); + to.teleport(to.getLocation().add(0, -1, 0)); + to.setHealth(to.getMaxHealth()); + } + } + + public void randomizeChest() { + Block block = Zombie.zombieWorld.getWorld().getBlockAt(getAbsoluteLocation(inters[inters.length-1].getBlockVector())); + block.setType(Material.AIR); + block.getState().update(); + Chest relChest = (Chest)Misc.random(map.getChests()); + inters[inters.length-1] = relChest; + block = Zombie.zombieWorld.getWorld().getBlockAt(getAbsoluteLocation(relChest.getBlockVector())); + block.setType(Material.CHEST); + org.bukkit.material.Chest c = new org.bukkit.material.Chest(); + c.setFacingDirection(relChest.getFacing()); + block.setData(c.getData()); + block.getState().update(); + } + + public void announce(String text) { + for(int i = 0, size = players.size(); i<size; i++) { + players.get(i).sendMessage(text); + } + } + + public void addPoints(Player player, int amount) { + int newPoints = stats.get(player)+amount; + stats.put(player, newPoints); + player.sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("game_points").replace("%points%", ""+newPoints)); + } + + public void substractPoints(Player player, int amount) { + int newPoints = stats.get(player)-amount; + stats.put(player, newPoints); + player.sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("game_points").replace("%points%", ""+newPoints)); + } + + public void addPoints(int amount) { + stats.forEach((k,v) -> stats.put(k, v+amount)); + } + + public int getPoints(Player player) { + if(stats.containsKey(player)) + return stats.get(player); + return -1; + } + + public Location getAbsoluteLocation(BlockVector relative) { + return new Location(Zombie.zombieWorld.getWorld(), min.getX()+relative.getBlockX(), 64+relative.getBlockY(), min.getBlockZ()+relative.getBlockZ()); + } + + /* + public Powerup getPowerup(Block block) { + for(int i = 0; i<powerups.length; i++) { + if(Zombie.zombieWorld.getWorld().getBlockAt(min.getBlockX()+powerups[i].bv.getBlockX(), 64+powerups[i].bv.getBlockY(), min.getBlockZ()+powerups[i].bv.getBlockZ()).equals(block)) { + return powerups[i]; + } + } + return null; + } + + public Lever getLever(Block block) { + for(int i = 0; i<levers.length; i++) { + if(Zombie.zombieWorld.getWorld().getBlockAt(min.getBlockX()+levers[i].bv.getBlockX(), 64+levers[i].bv.getBlockY(), min.getBlockZ()+levers[i].bv.getBlockZ()).equals(block)) { + return levers[i]; + } + } + return null; + } + */ + + public Interactable getInteractable(Block block) { + BlockVector bv; + for(int i = 0; i<inters.length; i++) { + bv = inters[i].getBlockVector(); + if(Zombie.zombieWorld.getWorld().getBlockAt(min.getBlockX()+bv.getBlockX(), 64+bv.getBlockY(), min.getBlockZ()+bv.getBlockZ()).equals(block)) { + return inters[i]; + } + } + return null; + } + +} diff --git a/src/main/java/com/encrox/zombie/GameListener.java b/src/main/java/com/encrox/zombie/GameListener.java new file mode 100755 index 0000000..4d88aba --- /dev/null +++ b/src/main/java/com/encrox/zombie/GameListener.java @@ -0,0 +1,159 @@ +package com.encrox.zombie; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; + +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.ItemStack; + +import com.encrox.zombie.interactable.Chest; +import com.encrox.zombie.interactable.Interactable; +import com.encrox.zombie.interactable.Lever; +import com.encrox.zombie.interactable.Powerup; + +public class GameListener implements Listener { + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if(e.getEntity() instanceof Player) { + Player player = (Player)e.getEntity(); + if(player.getHealth() <= e.getDamage()) { + Game current; + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + current = Zombie.games.get(i); + if(current.getPlayers().contains(player)) { + current.playerDeath(player); + e.setCancelled(true); + } + } + } + } else { + if(e.getDamager() instanceof Player) { + int id = e.getEntity().getEntityId(); + Player player = (Player)e.getDamager(); + Game current; + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + current = Zombie.games.get(i); + if(current.watchdog.contains(id)) { + if(current.getPlayers().contains(player)) { + int amount = (int)Math.round(e.getFinalDamage()); + current.addPoints(player, amount); + player.sendMessage(ChatColor.GREEN + Zombie.lang.getProperty("game_points_gained").replace("%points%", ""+amount)); + } + } + } + } + } + } + + @EventHandler + public void onPlayerMove(PlayerMoveEvent e) { + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + if(Zombie.games.get(i).isFrozen(e.getPlayer())) { + e.setCancelled(true); + } + } + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent e) { + try { + Player player = e.getPlayer(); + Game current; + if(e.getAction() == Action.RIGHT_CLICK_BLOCK) { + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + current = Zombie.games.get(i); + if(current.getPlayers().contains(player)) { + Block block = e.getClickedBlock(); + Interactable inter = current.getInteractable(block); + if(inter != null) { + int cost = inter.getCost(); + if(current.getPoints(player) >= cost) { + player.sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("game_paid").replace("%amount%", ""+cost)); + current.substractPoints(player, cost); + if(inter instanceof Chest) { + if(Math.random() > 0.25) { + ItemStack item = new ItemStack((Material)Misc.random(Constants.Game.ITEMSET)); + Enchantment ench; + while(!(ench = (Enchantment)Misc.random(Enchantment.values())).canEnchantItem(item)); + item.addEnchantment(ench, 1+(new Random().nextInt(Integer.MAX_VALUE)%(ench.getMaxLevel()-1))); + player.getInventory().addItem(item); + } else { + player.getInventory().addItem(new ItemStack(Material.SKULL_ITEM)); + current.randomizeChest(); + } + e.setCancelled(true); + } else if(inter instanceof Powerup) { + Powerup powerup = (Powerup)inter; + player.getInventory().addItem(powerup.getItem()); + } else if(inter instanceof Lever) { + Lever lever = (Lever)inter; + if(lever.isToggled()) { + player.sendMessage(ChatColor.RED + Zombie.lang.getProperty("game_impossible")); + current.addPoints(player, cost); + e.setCancelled(true); + } else { + lever.toggle(); + } + } + } else { + player.sendMessage(ChatColor.RED + Zombie.lang.getProperty("game_no_points").replace("%amount%", ""+cost)); + e.setCancelled(true); + } + } + } + } + } + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { + Game current; + Player from = e.getPlayer(); + if(e.getRightClicked() instanceof Player) { + Player to = (Player)e.getRightClicked(); + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + current = Zombie.games.get(i); + if(current.getPlayers().contains(from) && current.getPlayers().contains(to)) { + if(current.isFrozen(to)) { + current.revive(from, to); + } + } + } + } + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent e) { + int id = e.getEntity().getEntityId(); + Game current; + for(int i = 0, size = Zombie.games.size(); i<size; i++) { + current = Zombie.games.get(i); + if(current.watchdog.contains(id)) { + current.addPoints(1000); + current.watchdog.remove((Integer)id); + } + } + } + +} diff --git a/src/main/java/com/encrox/zombie/Lobby.java b/src/main/java/com/encrox/zombie/Lobby.java new file mode 100755 index 0000000..c33c3c3 --- /dev/null +++ b/src/main/java/com/encrox/zombie/Lobby.java @@ -0,0 +1,72 @@ +package com.encrox.zombie; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class Lobby { + + private ArrayList<Player> players; + private Player creator; + private String identifier; + private Map map; + + public Lobby(Player creator, String identifier, Map map) { + this.creator = creator; + this.identifier = identifier; + this.map = map; + players = new ArrayList<Player>(); + players.add(creator); + } + + public String getIdentifier() { + return identifier; + } + + public Player getCreator() { + return creator; + } + + public boolean containsPlayer(Player player) { + if(creator.equals(player)) return true; + return players.contains(player); + } + + public void removePlayer(Player player) { + if(creator.equals(player)) { + for(int i = 0, size = players.size(); i<size; i++) { + players.get(i).sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("lobby_disbanded")); + } + Zombie.lobbies.remove(this); + return; + } + if(players.contains(player)) { + for(int i = 0, size = players.size(); i<size; i++) { + players.get(i).sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("lobby_left").replace("%player%", player.getName())); + } + players.remove(player); + } + } + + public void addPlayer(Player player) { + players.add(player); + for(int i = 0, size = players.size(); i<size; i++) { + players.get(i).sendMessage(ChatColor.YELLOW + Zombie.lang.getProperty("lobby_joined").replace("%player%", player.getName())); + } + } + + public int getMax() { + return map.getPlayers(); + } + + public int getCurrent() { + return players.size(); + } + + public void start() { + Zombie.games.add(new Game(players, map)); + Zombie.lobbies.remove(this); + } + +} diff --git a/src/main/java/com/encrox/zombie/Map.java b/src/main/java/com/encrox/zombie/Map.java new file mode 100755 index 0000000..8262ba7 --- /dev/null +++ b/src/main/java/com/encrox/zombie/Map.java @@ -0,0 +1,118 @@ +package com.encrox.zombie; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BlockVector; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.encrox.zombie.interactable.Chest; +import com.encrox.zombie.interactable.Lever; +import com.encrox.zombie.interactable.Powerup; + +public class Map { + + private Schematic schematic; + private String name; + private int players; + private BlockVector spawn; + private Chest[] chests; + private Mob[] mobs; + private Powerup[] powerups; + private Lever[] levers; + + public Map(JSONObject descriptor) { + this.schematic = new Schematic(new File(Zombie.schematicsDirectory, descriptor.getString("file"))); + this.name = descriptor.getString("name"); + this.players = descriptor.getInt("players"); + JSONArray spawnArray = descriptor.getJSONArray("spawn"); + this.spawn = new BlockVector(spawnArray.getInt(0), spawnArray.getInt(1), spawnArray.getInt(2)); + JSONArray leversArray = descriptor.getJSONArray("levers"); + levers = new Lever[leversArray.length()]; + for(int i = 0; i<levers.length; i++) { + JSONObject lever = leversArray.getJSONObject(i); + JSONArray position = lever.getJSONArray("position"); + JSONArray othersLever = lever.getJSONArray("toggle"); + Lever[] others = new Lever[othersLever.length()]; + for(int x = 0; x<others.length; x++) + others[x] = levers[othersLever.getInt(x)]; + levers[i] = new Lever(new BlockVector(position.getInt(0), position.getInt(1), position.getInt(2)), lever.getInt("cost"), others); + } + JSONArray mobsArray = descriptor.getJSONArray("mobs"); + mobs = new Mob[mobsArray.length()]; + for(int i = 0; i<mobs.length; i++) { + JSONObject mob = mobsArray.getJSONObject(i); + JSONArray position = mob.getJSONArray("position"); + JSONArray leversMob = mob.getJSONArray("levers"); + Lever[] levers = new Lever[leversMob.length()]; + for(int x = 0; x<levers.length; x++) + levers[x] = this.levers[leversMob.getInt(x)]; + mobs[i] = new Mob(EntityType.fromId(mob.getInt("type")), new BlockVector(position.getInt(0), position.getInt(1), position.getInt(2)), mob.getString("rounds"), levers); + } + JSONArray chestsArray = descriptor.getJSONArray("chests"); + chests = new Chest[chestsArray.length()]; + for(int i = 0; i<chests.length; i++) { + JSONObject chest = chestsArray.getJSONObject(i); + JSONArray position = chest.getJSONArray("position"); + chests[i] = new Chest(new BlockVector(position.getInt(0), position.getInt(1), position.getInt(2)), chest.getInt("cost"), chest.getString("facing")); + } + JSONArray powerupsArray = descriptor.getJSONArray("powerups"); + powerups = new Powerup[powerupsArray.length()]; + for(int i = 0; i<powerups.length; i++) { + JSONObject powerup = powerupsArray.getJSONObject(i); + JSONArray position = powerup.getJSONArray("position"); + JSONObject enchantment = powerup.getJSONObject("enchantment"); + ItemStack item = new ItemStack(Material.getMaterial(powerup.getString("item"))); + String enchStr = enchantment.getString("type"); + if(!enchStr.equals("")) { + Enchantment ench = Enchantment.getByName(enchStr); + if(ench.canEnchantItem(item)) { + item.addEnchantment(ench, enchantment.getInt("level")); + } else { + Zombie.logger.warning(Zombie.lang.getProperty("plugin_enchantment")); + } + } + powerups[i] = new Powerup(new BlockVector(position.getInt(0), position.getInt(1), position.getInt(2)), item, powerup.getInt("cost")); + } + } + + public int getPlayers() { + return players; + } + + public String getName() { + return name; + } + + public Schematic getSchematic() { + return schematic; + } + + public BlockVector getSpawn() { + return spawn; + } + + public Mob[] getMobs() { + return mobs; + } + + public Chest[] getChests() { + return chests; + } + + public Powerup[] getPowerups() { + return powerups; + } + + public Lever[] getLevers() { + return levers; + } + +} diff --git a/src/main/java/com/encrox/zombie/Misc.java b/src/main/java/com/encrox/zombie/Misc.java new file mode 100755 index 0000000..feeab8b --- /dev/null +++ b/src/main/java/com/encrox/zombie/Misc.java @@ -0,0 +1,12 @@ +package com.encrox.zombie; + +import java.util.Random; + +public class Misc { + + public static Object random(Object[] arr) { + int rnd = new Random().nextInt(arr.length); + return arr[rnd]; + } + +} diff --git a/src/main/java/com/encrox/zombie/Mob.java b/src/main/java/com/encrox/zombie/Mob.java new file mode 100755 index 0000000..82958a3 --- /dev/null +++ b/src/main/java/com/encrox/zombie/Mob.java @@ -0,0 +1,41 @@ +package com.encrox.zombie; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.bukkit.entity.EntityType; +import org.bukkit.util.BlockVector; + +import com.encrox.zombie.interactable.Lever; + +public class Mob { + + public EntityType type; + public BlockVector bv; + public String rounds; + public Lever[] levers; + + public Mob(EntityType type, BlockVector bv, String rounds, Lever[] levers) { + this.type = type; + this.bv = bv; + this.rounds = rounds; + this.levers = levers; + } + + public boolean spawn(int round) { + for(int i = 0; i<levers.length; i++) { + if(!levers[i].isToggled()) + return false; + } + ScriptEngineManager factory = new ScriptEngineManager(); + ScriptEngine engine = factory.getEngineByName("JavaScript"); + try { + return (boolean)engine.eval(rounds.replace("%round%", ""+round)); + } catch (ScriptException e) { + e.printStackTrace(); + } + return false; + } + +} diff --git a/src/main/java/com/encrox/zombie/Schematic.java b/src/main/java/com/encrox/zombie/Schematic.java new file mode 100755 index 0000000..16d4f5b --- /dev/null +++ b/src/main/java/com/encrox/zombie/Schematic.java @@ -0,0 +1,117 @@ +/* + * Dynamic Schematic object + * + * Currently not supporting entities. + */ + +package com.encrox.zombie; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; +import org.jnbt.ByteArrayTag; +import org.jnbt.CompoundTag; +import org.jnbt.ListTag; +import org.jnbt.NBTInputStream; +import org.jnbt.ShortTag; +import org.jnbt.StringTag; +import org.jnbt.Tag; + +public class Schematic { + + public int width, height, length, dataReadIndex, dataWriteIndex, blockReadIndex, blockWriteIndex; + public String materials; + public byte[] blocks, data; + public List<Tag> entities, tileEntities; + public File file; + + public Schematic(int width, int height, int length, String materials, byte[] blocks, byte[] data, List<Tag> entities, List<Tag> tileEntities) { + this.width = width; + this.height = height; + this.length = length; + this.materials = materials; + this.blocks = blocks; + this.data = data; + this.entities = entities; + this.tileEntities = tileEntities; + blockReadIndex = 0; + blockWriteIndex = 0; + dataReadIndex = 0; + dataWriteIndex = 0; + } + + public Schematic(File file) { + this.file = file; + CompoundTag schematicTag = null; + try { + NBTInputStream in = new NBTInputStream(new FileInputStream(file)); + schematicTag = (CompoundTag)in.readTag(); + in.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Map<String,Tag> schematic = schematicTag.getValue(); + width = ((ShortTag)schematic.get("Width")).getValue(); + height = ((ShortTag)schematic.get("Height")).getValue(); + length = ((ShortTag)schematic.get("Length")).getValue(); + materials = ((StringTag)schematic.get("Materials")).getValue(); + blocks = ((ByteArrayTag)schematic.get("Blocks")).getValue(); + data = ((ByteArrayTag)schematic.get("Data")).getValue(); + entities = ((ListTag)schematic.get("Entities")).getValue(); + tileEntities = ((ListTag)schematic.get("TileEntities")).getValue(); + blockReadIndex = 0; + blockWriteIndex = 0; + dataReadIndex = 0; + dataWriteIndex = 0; + } + + public byte getBlockIdAt(int x, int y, int z) { + return blocks[(y*length + z)*width + x]; + } + + public byte getNextBlock() { + return blocks[blockReadIndex++]; + } + + public byte getDataAt(int x, int y, int z) { + return data[(y*length + z)*width + x]; + } + + public byte getNextData() { + return data[dataReadIndex++]; + } + + public void setBlockIdAt(int x, int y, int z, byte blockId) { + blocks[(y*length + z)*width + x] = blockId; + } + + public void setNextBlock(byte blockId) { + blocks[blockWriteIndex++] = blockId; + } + + public void setDataAt(int x, int y, int z, byte newData) { + data[(y*length + z)*width + x] = newData; + } + + public void setNextData(byte newData) { + data[dataWriteIndex++] = newData; + } + + public void write(File file) { + + } + + public void reset() { + blockReadIndex = 0; + blockWriteIndex = 0; + dataReadIndex = 0; + dataWriteIndex = 0; + } + +} diff --git a/src/main/java/com/encrox/zombie/Zombie.java b/src/main/java/com/encrox/zombie/Zombie.java new file mode 100755 index 0000000..d687f6e --- /dev/null +++ b/src/main/java/com/encrox/zombie/Zombie.java @@ -0,0 +1,245 @@ +package com.encrox.zombie; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Properties; +import java.util.logging.Logger; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; + +public class Zombie extends JavaPlugin { + + public static Plugin plugin; + public static Logger logger; + public static PluginDescriptionFile pdf; + public static Properties lang; + public static JSONObject config; + public static JSONArray schematicDescriptors; + public static File schematicsDirectory; + public static WorldEditPlugin we; + public static ArrayList<Map> maps; + public static ArrayList<Lobby> lobbies; + public static ArrayList<Game> games; + public static ZombieWorld zombieWorld; + public static Commander commander; + + public void onEnable() { + pdf = getDescription(); + logger = Logger.getLogger("Minecraft"); + if(setupMyself() && setupWorldEdit()) { + plugin = this; + commander = new Commander(); + getCommand("zombie").setExecutor(commander); + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been enabled."); + } else { + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been disabled."); + } + } + + public boolean setupWorldEdit() { + we = (WorldEditPlugin)Bukkit.getPluginManager().getPlugin("WorldEdit"); + return (we != null); + } + + public boolean setupMyself() { + if(!this.getDataFolder().exists()) + this.getDataFolder().mkdirs(); + schematicsDirectory = new File(this.getDataFolder(), "schematics"); + if(!schematicsDirectory.exists()) + schematicsDirectory.mkdirs(); + File configFile = new File(this.getDataFolder(), "config.json"); + if(!configFile.exists()) { + BufferedInputStream bis; + FileOutputStream out; + try { + bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("config.json")); + out = new FileOutputStream(configFile); + int current; + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + BufferedReader br; + StringBuilder sb = new StringBuilder(); + String line; + try { + br = new BufferedReader(new FileReader(configFile)); + while((line = br.readLine()) != null) + sb.append(line); + br.close(); + } catch (Exception e1) { + e1.printStackTrace(); + return false; + } + config = new JSONObject(sb.toString()); + zombieWorld = new ZombieWorld(this, Bukkit.getWorld(config.getString("world"))); + File schematicDescriptorFile = new File(schematicsDirectory, "descriptor.json"); + if(!schematicDescriptorFile.exists()) { + int current; + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("descriptor.json")); + FileOutputStream out = new FileOutputStream(schematicDescriptorFile); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/test.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "test.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + } + sb = new StringBuilder(); + try { + br = new BufferedReader(new FileReader(schematicDescriptorFile)); + while((line = br.readLine()) != null) + sb.append(line); + br.close(); + } catch (Exception e1) { + e1.printStackTrace(); + return false; + } + schematicDescriptors = new JSONArray(sb.toString()); + lang = new Properties(); + try { + //TODO + lang.load(getClass().getClassLoader().getResourceAsStream("lang/" + config.getString("locale") + ".properties")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + maps = new ArrayList<Map>(); + lobbies = new ArrayList<Lobby>(); + games = new ArrayList<Game>(); + for(int i = 0, len = schematicDescriptors.length(); i<len; i++) { + maps.add(new Map(schematicDescriptors.getJSONObject(i))); + } + Bukkit.getPluginManager().registerEvents(new GameListener(), this); + return true; + } + + public void onDisable() { + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been disabled."); + } + + public static String createLobby(Player creator, String identifier, String map) { + for(int i = 0, size = lobbies.size(); i<size; i++) { + if(lobbies.get(i).getIdentifier().equals(identifier)) { + return (ChatColor.RED + Zombie.lang.getProperty("lobby_create_identifier")); + } + if(lobbies.get(i).containsPlayer(creator)) { + return (ChatColor.RED + Zombie.lang.getProperty("lobby_create_membership")); + } + } + for(int i = 0, size = maps.size(); i<size; i++) { + if(maps.get(i).getName().equals(map)) { + lobbies.add(new Lobby(creator, identifier, maps.get(i))); + return (ChatColor.GREEN + Zombie.lang.getProperty("lobby_create_success")); + } + } + return (ChatColor.RED + Zombie.lang.getProperty("lobby_create_map")); + } + + public static String removePlayer(Player player) { + for(int i = 0, size = lobbies.size(); i<size; i++) { + if(lobbies.get(i).containsPlayer(player)) { + lobbies.get(i).removePlayer(player); + return (ChatColor.GREEN + Zombie.lang.getProperty("lobby_leave_success")); + } + } + return (ChatColor.RED + Zombie.lang.getProperty("lobby_leave_membership")); + } + + public static String joinLobby(Player player, String identifier) { + int size = lobbies.size(); + Lobby current; + for(int i = 0; i<size; i++) { + current = lobbies.get(i); + if(current.containsPlayer(player)) { + current.removePlayer(player); + } + } + for(int i = 0; i<size; i++) { + current = lobbies.get(i); + if(current.getIdentifier().equals(identifier)) { + if(current.getCurrent() < current.getMax()) { + current.addPlayer(player); + return (ChatColor.GREEN + Zombie.lang.getProperty("lobby_join_success")); + } + return (ChatColor.RED + Zombie.lang.getProperty("lobby_join_full")); + } + } + return (ChatColor.RED + Zombie.lang.getProperty("lobby_join_identifier")); + } + + public static String listLobbies() { + String out = ChatColor.WHITE + lang.getProperty("lobby_list") + "\n"; + Lobby current; + for(int i = 0, size = lobbies.size(); i<size; i++) { + current = lobbies.get(i); + if(current.getCurrent() < current.getMax()) { + out += ChatColor.GREEN; + } else { + out += ChatColor.RED; + } + out += current.getIdentifier() + ChatColor.WHITE + ", "; + } + return out; + } + + public static String start(Player player) { + Lobby current; + for(int i = 0, size = lobbies.size(); i<size; i++) { + current = lobbies.get(i); + if(current.getCreator().equals(player)) { + current.start(); + return (ChatColor.GREEN + lang.getProperty("lobby_start_success")); + } + } + return (ChatColor.GREEN + lang.getProperty("lobby_start_failed")); + } + +} \ No newline at end of file diff --git a/src/main/java/com/encrox/zombie/ZombieWorld.java b/src/main/java/com/encrox/zombie/ZombieWorld.java new file mode 100755 index 0000000..52ddea8 --- /dev/null +++ b/src/main/java/com/encrox/zombie/ZombieWorld.java @@ -0,0 +1,79 @@ +package com.encrox.zombie; + +import java.util.ArrayList; + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.plugin.Plugin; + +import com.encrox.instancedregions.InstancedProtectedCuboidRegion; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; + +public class ZombieWorld { + + private Plugin plugin; + private World world; + private ArrayList<ProtectedRegion> regions; + private int lastX; + + public ZombieWorld(Plugin plugin, World world) { + this.world = world; + this.plugin = plugin; + regions = new ArrayList<ProtectedRegion>(); + lastX = 0; + } + + public InstancedProtectedCuboidRegion allocate(int width, int length) { + BlockVector min, max; + InstancedProtectedCuboidRegion region; + for(int i = 0; true; i+=16) { + if(new ProtectedCuboidRegion("current", (min = new BlockVector(lastX+i, 0, 0)), (max = new BlockVector(lastX+i+width, 255, length))).getIntersectingRegions(regions).isEmpty()) { + region = new InstancedProtectedCuboidRegion(plugin, world, ""+min.getBlockX(), min, max); + regions.add(region); + return region; + } + } + } + + public InstancedProtectedCuboidRegion allocate(Schematic schematic) { + BlockVector min, max; + InstancedProtectedCuboidRegion region; + for(int i = 0; true; i+=16) { + if(new ProtectedCuboidRegion("current", (min = new BlockVector(lastX+i, 0, 0)), (max = new BlockVector(lastX+i+schematic.width, 255, schematic.length))).getIntersectingRegions(regions).isEmpty()) { + region = new InstancedProtectedCuboidRegion(plugin, world, ""+min.getBlockX(), min, max); + schematic.reset(); + for(int y = 0; y<schematic.height; y++) { + for(int z = 0; z<schematic.length; z++) { + for(int x = 0; x<schematic.width; x++) { + //System.out.println("block set at: (" + (min.getBlockX()+x) + ", " + (64+y) + ", " + (min.getBlockZ()+z) + ")"); + world.getBlockAt(min.getBlockX()+x, 64+y, min.getBlockZ()+z).setType(Material.getMaterial(schematic.getBlockIdAt(x, y, z))); + world.getBlockAt(min.getBlockX()+x, 64+y, min.getBlockZ()+z).setData(schematic.getDataAt(x, y, z));; + } + } + } + regions.add(region); + return region; + } + } + } + + //YOU STILL HAVE TO DISPOSE THE INSTANCED REGION MANUALLY! + public void deallocate(InstancedProtectedCuboidRegion region) { + BlockVector min = region.getMinimumPoint(), max = region.getMaximumPoint(); + for(int y = min.getBlockY(), ymax = max.getBlockY(); y<ymax; y++) { + for(int z = min.getBlockZ(), zmax = max.getBlockZ(); z<zmax; z++) { + for(int x = min.getBlockX(), xmax = max.getBlockX(); x<xmax; x++) { + world.getBlockAt(x, y, z).setType(Material.AIR); + } + } + } + regions.remove(region); + } + + public World getWorld() { + return world; + } + +} diff --git a/src/main/java/com/encrox/zombie/interactable/Chest.java b/src/main/java/com/encrox/zombie/interactable/Chest.java new file mode 100755 index 0000000..10045a2 --- /dev/null +++ b/src/main/java/com/encrox/zombie/interactable/Chest.java @@ -0,0 +1,27 @@ +package com.encrox.zombie.interactable; + +import org.bukkit.block.BlockFace; +import org.bukkit.util.BlockVector; + +public class Chest extends Interactable { + + private BlockFace facing; + + public Chest(BlockVector bv, int cost, BlockFace facing) { + super(bv, cost); + this.facing = facing; + } + + public Chest(BlockVector bv, int cost, String facing) { + this(bv, cost, BlockFace.valueOf(facing)); + } + + public Chest(BlockVector bv, int cost) { + this(bv, cost, BlockFace.NORTH); + } + + public BlockFace getFacing() { + return facing; + } + +} diff --git a/src/main/java/com/encrox/zombie/interactable/Interactable.java b/src/main/java/com/encrox/zombie/interactable/Interactable.java new file mode 100755 index 0000000..9bc4dc3 --- /dev/null +++ b/src/main/java/com/encrox/zombie/interactable/Interactable.java @@ -0,0 +1,23 @@ +package com.encrox.zombie.interactable; + +import org.bukkit.util.BlockVector; + +public abstract class Interactable { + + private BlockVector bv; + private int cost; + + public Interactable(BlockVector bv, int cost) { + this.bv = bv; + this.cost = cost; + } + + public int getCost() { + return cost; + } + + public BlockVector getBlockVector() { + return bv; + } + +} diff --git a/src/main/java/com/encrox/zombie/interactable/Lever.java b/src/main/java/com/encrox/zombie/interactable/Lever.java new file mode 100755 index 0000000..4776f39 --- /dev/null +++ b/src/main/java/com/encrox/zombie/interactable/Lever.java @@ -0,0 +1,38 @@ +package com.encrox.zombie.interactable; + +import org.bukkit.util.BlockVector; + +public class Lever extends Interactable { + + private boolean toggle; + private Lever[] others; + + public Lever(BlockVector bv, int cost, boolean toggle, Lever[] others) { + super(bv, cost); + this.toggle = toggle; + this.others = others; + } + + public Lever(BlockVector bv, int cost, Lever[] others) { + this(bv, cost, false, others); + } + + public Lever(BlockVector bv, int cost, boolean toggle) { + this(bv, cost, toggle, new Lever[0]); + } + + public Lever(BlockVector bv, int cost) { + this(bv, cost, false); + } + + public void toggle() { + toggle = !toggle; + for(int i = 0; i<others.length; i++) + others[i].toggle(); + } + + public boolean isToggled() { + return toggle; + } + +} \ No newline at end of file diff --git a/src/main/java/com/encrox/zombie/interactable/Powerup.java b/src/main/java/com/encrox/zombie/interactable/Powerup.java new file mode 100755 index 0000000..e1ca0d2 --- /dev/null +++ b/src/main/java/com/encrox/zombie/interactable/Powerup.java @@ -0,0 +1,22 @@ +package com.encrox.zombie.interactable; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BlockVector; + +public class Powerup extends Interactable { + + private ItemStack item; + + public Powerup(BlockVector bv, ItemStack item, int cost) { + super(bv, cost); + this.item = item; + } + + public ItemStack getItem() { + return item; + } + +} diff --git a/src/main/resources/config.json b/src/main/resources/config.json new file mode 100755 index 0000000..d074011 --- /dev/null +++ b/src/main/resources/config.json @@ -0,0 +1,4 @@ +{ + "locale": "en-GB", + "world": "instance" +} \ No newline at end of file diff --git a/src/main/resources/descriptor.json b/src/main/resources/descriptor.json new file mode 100755 index 0000000..1852c2c --- /dev/null +++ b/src/main/resources/descriptor.json @@ -0,0 +1,59 @@ +[ + { + "file": "test.schematic", + "name": "testmap", + "players": 4, + "spawn": [ 2, 1, 2 ], + "pointMultiplier": 1.0, + "mobs": [ + { + "position": [ 2, 1, 2 ], + "type": 54, + "rounds": "%round% == 1 || %round% == 2", + "levers": [ ] + }, + { + "position": [ 2, 1, 2 ], + "type": 51, + "rounds": "%round% > 2", + "levers": [ 0 ] + } + ], + "chests": [ + { + "position": [ 2, 1, 1 ], + "cost": 1000, + "facing": "SOUTH" + }, + { + "position": [ 3, 1, 2 ], + "cost": 1000, + "facing": "WEST" + }, + { + "position": [ 2, 1, 3 ], + "cost": 1000, + "facing": "NORTH" + } + ], + "powerups": [ + { + "position": [ 3, 2, 2 ], + "item": "DIAMOND_SWORD", + "enchantment": + { + "type": "DAMAGE_ALL", + "level": 1 + }, + "cost": 100 + } + ], + "levers": [ + { + "position": [ 0, 0, 0 ], + "cost": 100, + "toggle": [ ] + } + ] + } +] \ No newline at end of file diff --git a/src/main/resources/lang/de-DE.properties b/src/main/resources/lang/de-DE.properties new file mode 100755 index 0000000..fcce013 --- /dev/null +++ b/src/main/resources/lang/de-DE.properties @@ -0,0 +1,2 @@ +no_player=Dieser Befehl kann nur durch einen Spieler aufgefuehrt werden. +no_permission=Du hast keine Rechte fuer diesen Befehl. diff --git a/src/main/resources/lang/en-GB.properties b/src/main/resources/lang/en-GB.properties new file mode 100755 index 0000000..c382408 --- /dev/null +++ b/src/main/resources/lang/en-GB.properties @@ -0,0 +1,28 @@ +no_player=This command can only be issued by a player. +no_permission=You dont have permission for this command. +lobby_create_success=Lobby has been created. +lobby_create_identifier=A lobby with that identifier already exists. +lobby_create_membership=You are already in a lobby. +lobby_create_map=A map with that name does not exist. +lobby_disbanded=Your lobby has been disbanded. +lobby_leave_success=You have left the lobby. +lobby_leave_membership=You are in no lobby. +lobby_left=%player% left your lobby. +lobby_joined=%player% joined your lobby. +lobby_join_full=The specified lobby is full. +lobby_join_identifier=A lobby with that identifier does not exist. +lobby_join_success=You joined the lobby. +lobby_list=List of lobbies: +lobby_start_success=Game has been started. +lobby_start_failed=You need to be the creator of a lobby to start a game. +game_player_fell=%player% fell. +game_revive_countdown=You got %seconds% seconds left to revive %player%. +game_player_died=%player% died. +game_player_revived=%player1% revived %player2%. +game_round=Round %round% is starting. +game_points_gained=You gained %points% points. +game_points=You have %points% points. +game_paid=You paid %amount% points for this. +game_no_points=You dont have enough points for this. You need at least %amount%. +game_impossible=That action is impossible. Youve been refunded. +plugin_enchantment=The enchantment "%type%" is not applicable on the item "%item%". Ignoring. \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100755 index 0000000..3d187bd --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,9 @@ +main: com.encrox.zombie.Zombie +name: Zombie +version: 1.0 +depend: [InstancedRegions] + +commands: + zombie: + description: Generic zombie command. + usage: /zombie help \ No newline at end of file diff --git a/src/main/resources/schematics/test.schematic b/src/main/resources/schematics/test.schematic new file mode 100755 index 0000000..1b32d4f Binary files /dev/null and b/src/main/resources/schematics/test.schematic differ diff --git a/target/classes/config.json b/target/classes/config.json new file mode 100755 index 0000000..d074011 --- /dev/null +++ b/target/classes/config.json @@ -0,0 +1,4 @@ +{ + "locale": "en-GB", + "world": "instance" +} \ No newline at end of file diff --git a/target/classes/descriptor.json b/target/classes/descriptor.json new file mode 100755 index 0000000..1852c2c --- /dev/null +++ b/target/classes/descriptor.json @@ -0,0 +1,59 @@ +[ + { + "file": "test.schematic", + "name": "testmap", + "players": 4, + "spawn": [ 2, 1, 2 ], + "pointMultiplier": 1.0, + "mobs": [ + { + "position": [ 2, 1, 2 ], + "type": 54, + "rounds": "%round% == 1 || %round% == 2", + "levers": [ ] + }, + { + "position": [ 2, 1, 2 ], + "type": 51, + "rounds": "%round% > 2", + "levers": [ 0 ] + } + ], + "chests": [ + { + "position": [ 2, 1, 1 ], + "cost": 1000, + "facing": "SOUTH" + }, + { + "position": [ 3, 1, 2 ], + "cost": 1000, + "facing": "WEST" + }, + { + "position": [ 2, 1, 3 ], + "cost": 1000, + "facing": "NORTH" + } + ], + "powerups": [ + { + "position": [ 3, 2, 2 ], + "item": "DIAMOND_SWORD", + "enchantment": + { + "type": "DAMAGE_ALL", + "level": 1 + }, + "cost": 100 + } + ], + "levers": [ + { + "position": [ 0, 0, 0 ], + "cost": 100, + "toggle": [ ] + } + ] + } +] \ No newline at end of file diff --git a/target/classes/lang/de-DE.properties b/target/classes/lang/de-DE.properties new file mode 100755 index 0000000..fcce013 --- /dev/null +++ b/target/classes/lang/de-DE.properties @@ -0,0 +1,2 @@ +no_player=Dieser Befehl kann nur durch einen Spieler aufgefuehrt werden. +no_permission=Du hast keine Rechte fuer diesen Befehl. diff --git a/target/classes/lang/en-GB.properties b/target/classes/lang/en-GB.properties new file mode 100755 index 0000000..c382408 --- /dev/null +++ b/target/classes/lang/en-GB.properties @@ -0,0 +1,28 @@ +no_player=This command can only be issued by a player. +no_permission=You dont have permission for this command. +lobby_create_success=Lobby has been created. +lobby_create_identifier=A lobby with that identifier already exists. +lobby_create_membership=You are already in a lobby. +lobby_create_map=A map with that name does not exist. +lobby_disbanded=Your lobby has been disbanded. +lobby_leave_success=You have left the lobby. +lobby_leave_membership=You are in no lobby. +lobby_left=%player% left your lobby. +lobby_joined=%player% joined your lobby. +lobby_join_full=The specified lobby is full. +lobby_join_identifier=A lobby with that identifier does not exist. +lobby_join_success=You joined the lobby. +lobby_list=List of lobbies: +lobby_start_success=Game has been started. +lobby_start_failed=You need to be the creator of a lobby to start a game. +game_player_fell=%player% fell. +game_revive_countdown=You got %seconds% seconds left to revive %player%. +game_player_died=%player% died. +game_player_revived=%player1% revived %player2%. +game_round=Round %round% is starting. +game_points_gained=You gained %points% points. +game_points=You have %points% points. +game_paid=You paid %amount% points for this. +game_no_points=You dont have enough points for this. You need at least %amount%. +game_impossible=That action is impossible. Youve been refunded. +plugin_enchantment=The enchantment "%type%" is not applicable on the item "%item%". Ignoring. \ No newline at end of file diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100755 index 0000000..3d187bd --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,9 @@ +main: com.encrox.zombie.Zombie +name: Zombie +version: 1.0 +depend: [InstancedRegions] + +commands: + zombie: + description: Generic zombie command. + usage: /zombie help \ No newline at end of file diff --git a/target/classes/schematics/test.schematic b/target/classes/schematics/test.schematic new file mode 100755 index 0000000..1b32d4f Binary files /dev/null and b/target/classes/schematics/test.schematic differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100755 index 0000000..820b62c --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Fri May 19 23:00:51 CEST 2017 +version=0.0.1-SNAPSHOT +groupId=com.encrox +artifactId=zombie diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100755 index 0000000..e69de29 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100755 index 0000000..af3adfa --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,15 @@ +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Misc.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Mob.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Lobby.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Zombie.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Map.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\interactable\Chest.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Commander.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\GameListener.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\ZombieWorld.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\interactable\Powerup.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Constants.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\interactable\Interactable.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Schematic.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\Game.java +C:\Users\Superleo1810\workspace\zombie\src\main\java\com\encrox\zombie\interactable\Lever.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100755 index 0000000..e69de29 -- cgit v1.2.3