diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d0a0ee3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,46 @@
+
+ 4.0.0
+
+ com.zivilon
+ FakePlayer
+ 1.0
+ jar
+
+ FakePlayer
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.bukkit
+ bukkit
+ 1.7.10-R0.1-SNAPSHOT
+ provided
+
+
+
+
+ package
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+
+
diff --git a/src/main/java/com/zivilon/fakeplayer/FakePlayer.java b/src/main/java/com/zivilon/fakeplayer/FakePlayer.java
new file mode 100644
index 0000000..591cd84
--- /dev/null
+++ b/src/main/java/com/zivilon/fakeplayer/FakePlayer.java
@@ -0,0 +1,1059 @@
+package com.zivilon.fakeplayer;
+
+import org.bukkit.scoreboard.Scoreboard;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.WeatherType;
+import org.bukkit.Statistic;
+import org.bukkit.Material;
+import org.bukkit.Achievement;
+import org.bukkit.Effect;
+import org.bukkit.Sound;
+import org.bukkit.Instrument;
+import org.bukkit.Note;
+import org.bukkit.GameMode;
+import org.bukkit.EntityEffect;
+import org.bukkit.Server;
+import org.bukkit.metadata.MetadataValue;
+import org.bukkit.block.Block;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.InventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.EntityEquipment;
+import org.bukkit.inventory.PlayerInventory;
+import org.bukkit.map.MapView;
+import org.bukkit.entity.Arrow;
+import org.bukkit.entity.Egg;
+import org.bukkit.entity.Snowball;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Projectile;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.util.Vector;
+import org.bukkit.permissions.PermissionAttachmentInfo;
+import org.bukkit.permissions.PermissionAttachment;
+import org.bukkit.permissions.Permission;
+import org.bukkit.conversations.ConversationAbandonedEvent;
+import org.bukkit.conversations.Conversation;
+
+
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+public class FakePlayer implements Player {
+ private Location location;
+ private Scoreboard scoreboard;
+ private ItemStack item;
+ private final UUID uuid;
+ private EntityDamageEvent lastDamageEvent;
+
+ public FakePlayer(Location location) {
+ this.location = location;
+ this.item = new ItemStack(Material.DIRT, 1);
+ this.uuid = UUID.fromString("00000000-0000-0000-0000-000000000000");
+ this.lastDamageEvent = new EntityDamageEvent(this, DamageCause.CUSTOM, 0);
+ }
+// The important method
+ @Override
+ public boolean performCommand(String command) {
+ return Bukkit.dispatchCommand(this, command);
+ }
+
+// Useless methods to successfully compile. Adding functionality to these may improve compatiblity with commands
+ @Override
+ public Location getLocation() {
+ return this.location;
+ }
+ @Override
+ public Location getLocation(Location loc) {
+ return this.location;
+ }
+
+ public void setLocation(Location loc) {
+ this.location = loc;
+ }
+
+ public void clearLocation() {
+ this.location = null;
+ }
+
+ @Override
+ public void setFoodLevel(int foodLevel) {
+ }
+
+ @Override
+ public int getFoodLevel() {
+ return 20;
+ }
+
+ @Override
+ public void setTotalExperience(int exp) {
+ }
+
+ @Override
+ public int getTotalExperience() {
+ return 20;
+ }
+
+ @Override
+ public void setLevel(int exp) {
+ }
+
+ @Override
+ public int getLevel() {
+ return 20;
+ }
+
+ @Override
+ public void giveExpLevels(int val) {
+ }
+
+ @Override
+ public void giveExp(int val) {
+ }
+
+ @Override
+ public int getExpToLevel() {
+ return 1;
+ }
+
+ @Override
+ public void resetPlayerWeather() {
+ }
+
+ @Override
+ public void resetPlayerTime() {
+ }
+
+ @Override
+ public boolean isPlayerTimeRelative() {
+ return false;
+ }
+
+ @Override
+ public long getPlayerTimeOffset() {
+ return 1;
+ }
+
+ @Override
+ public long getPlayerTime() {
+ return 1;
+ }
+
+ @Override
+ public void setPlayerTime(long val, boolean val2) {
+ }
+
+ @Override
+ public void setStatistic(Statistic stat, EntityType entity, int number) {
+ }
+ @Override
+ public void setStatistic(Statistic stat, Material material, int number) {
+ }
+ @Override
+ public void setStatistic(Statistic stat, int number) {
+ }
+
+ @Override
+ public void decrementStatistic(Statistic stat, EntityType entity, int number) {
+ }
+ @Override
+ public void decrementStatistic(Statistic stat, EntityType entity) {
+ }
+ @Override
+ public void decrementStatistic(Statistic stat, Material material, int number) {
+ }
+ @Override
+ public void decrementStatistic(Statistic stat, Material material) {
+ }
+ @Override
+ public void decrementStatistic(Statistic stat, int number) {
+ }
+ @Override
+ public void decrementStatistic(Statistic stat) {
+ }
+
+ @Override
+ public void incrementStatistic(Statistic stat, EntityType entity, int number) {
+ }
+ @Override
+ public void incrementStatistic(Statistic stat, EntityType entity) {
+ }
+ @Override
+ public void incrementStatistic(Statistic stat, Material material, int number) {
+ }
+ @Override
+ public void incrementStatistic(Statistic stat, Material material) {
+ }
+ @Override
+ public void incrementStatistic(Statistic stat, int number) {
+ }
+ @Override
+ public void incrementStatistic(Statistic stat) {
+ }
+
+ @Override
+ public boolean hasAchievement(Achievement achievement) {
+ return true;
+ }
+ @Override
+ public void removeAchievement(Achievement achievement) {
+ }
+ @Override
+ public void awardAchievement(Achievement achievement) {
+ }
+
+ @Override
+ public void updateInventory() {
+ }
+
+ @Override
+ public void sendMap(MapView map) {
+ }
+
+ @Override
+ public void sendSignChange(Location loc, String[] string) {
+ }
+
+ @Override
+ public void sendBlockChange(Location loc, int number, byte Byte) {
+ }
+
+ @Override
+ public boolean sendChunkChange(Location loc, int num, int num2, int num3, byte[] Byte) {
+ return true;
+ }
+
+ @Override
+ public void sendBlockChange(Location loc, Material material, byte Byte) {
+ }
+
+ @Override
+ public int getStatistic(Statistic stat, EntityType entity) {
+ return 1;
+ }
+ @Override
+ public int getStatistic(Statistic stat, Material material) {
+ return 1;
+ }
+ @Override
+ public int getStatistic(Statistic stat) {
+ return 1;
+ }
+
+ @Override
+ public void playEffect(Location loc, Effect effect, T data) {
+ }
+
+ @Override
+ public void playEffect(Location loc, Effect effect, int num) {
+ }
+
+ @Override
+ public void playSound(Location loc, String string, float Float, float Float2) {
+ }
+
+ @Override
+ public void playSound(Location loc, Sound sound, float Float, float Float2) {
+ }
+
+ @Override
+ public void playNote(Location loc, Instrument instrument, Note note) {
+ }
+
+ @Override
+ public void playNote(Location loc, byte Byte, byte Byte2) {
+ }
+
+ @Override
+ public boolean isSleepingIgnored() {
+ return false;
+ }
+ @Override
+ public void setSleepingIgnored(boolean Bool) {
+ }
+
+ @Override
+ public void loadData() {
+ }
+
+ @Override
+ public void saveData() {
+ }
+
+ @Override
+ public void setSprinting(boolean Bool) {
+ }
+
+ @Override
+ public boolean isSprinting() {
+ return true;
+ }
+
+ @Override
+ public void setSneaking(boolean Bool) {
+ }
+
+ @Override
+ public boolean isSneaking() {
+ return true;
+ }
+
+ @Override
+ public WeatherType getPlayerWeather() {
+ return WeatherType.CLEAR;
+ }
+
+ @Override
+ public void setPlayerWeather(WeatherType val) {
+ }
+
+ @Override
+ public void setExp(float saturation) {
+ }
+
+ @Override
+ public float getExp() {
+ return 20.0f;
+ }
+
+ @Override
+ public void setSaturation(float saturation) {
+ }
+
+ @Override
+ public float getSaturation() {
+ return 20.0f;
+ }
+
+ @Override
+ public void setExhaustion(float saturation) {
+ }
+
+ @Override
+ public float getExhaustion() {
+ return 20.0f;
+ }
+
+ @Override
+ public void setHealthScale(double scale) {
+ }
+
+ @Override
+ public double getHealthScale() {
+ return 20.0;
+ }
+
+ @Override
+ public void setHealthScaled(boolean scale) {
+ }
+
+ @Override
+ public boolean isHealthScaled() {
+ return true;
+ }
+
+ @Override
+ public void setFlying(boolean isflying) {
+ }
+
+ @Override
+ public boolean isFlying() {
+ return false;
+ }
+
+ @Override
+ public void setAllowFlight(boolean isflying) {
+ }
+
+ @Override
+ public boolean getAllowFlight() {
+ return false;
+ }
+
+ @Override
+ public boolean canSee(Player player) {
+ return false;
+ }
+
+ @Override
+ public void setBedSpawnLocation(Location location) {
+ }
+
+ @Override
+ public void setBedSpawnLocation(Location location, boolean force) {
+ }
+
+ @Override
+ public Location getBedSpawnLocation() {
+ return this.location;
+ }
+
+ @Override
+ public void showPlayer(Player player) {
+ }
+
+ @Override
+ public void hidePlayer(Player player) {
+ }
+
+ @Override
+ public boolean isOnGround() {
+ return true;
+ }
+
+ @Override
+ public void setWalkSpeed(float speed) {
+ }
+
+ @Override
+ public float getWalkSpeed() {
+ return 1.0f;
+ }
+
+ @Override
+ public void setFlySpeed(float speed) {
+ }
+
+ @Override
+ public float getFlySpeed() {
+ return 1.0f;
+ }
+
+ @Override
+ public boolean isOp() {
+ return true;
+ }
+
+ @Override
+ public void sendMessage(String message) {
+ }
+
+ @Override
+ public void setScoreboard(Scoreboard scoreboard) {
+ }
+
+ @Override
+ public Scoreboard getScoreboard() {
+ return this.scoreboard;
+ }
+
+ @Override
+ public void setResourcePack(String url) {
+ }
+
+ @Override
+ public void setTexturePack(String url) {
+ }
+
+ @Override
+ public void chat(String string) {
+ }
+
+ @Override
+ public void kickPlayer(String string) {
+ }
+
+ @Override
+ public void sendRawMessage(String string) {
+ }
+
+ @Override
+ public InetSocketAddress getAddress() {
+ return new InetSocketAddress("127.0.0.1", 0);
+ }
+
+ @Override
+ public Location getCompassTarget() {
+ return location;
+ }
+ @Override
+ public void setCompassTarget(Location loc) {
+ }
+ @Override
+ public void setPlayerListName(String string) {
+ }
+ @Override
+ public String getPlayerListName() {
+ return "ScriptBot";
+ }
+ @Override
+ public void setDisplayName(String string) {
+ }
+ @Override
+ public String getDisplayName() {
+ return "ScriptBot";
+ }
+ @Override
+ public void setGameMode(GameMode gamemode) {
+ }
+ @Override
+ public GameMode getGameMode() {
+ return GameMode.CREATIVE;
+ }
+ @Override
+ public int getSleepTicks() {
+ return 1;
+ }
+
+ @Override
+ public boolean isSleeping() {
+ return false;
+ }
+
+ @Override
+ public void setItemOnCursor(ItemStack item) {
+ }
+
+ @Override
+ public ItemStack getItemOnCursor() {
+ return this.item;
+ }
+
+ @Override
+ public void setItemInHand(ItemStack item) {
+ }
+
+ @Override
+ public ItemStack getItemInHand() {
+ return this.item;
+ }
+
+ @Override
+ public void closeInventory() {
+ }
+
+ @Override
+ public InventoryView openEnchanting(Location loc, boolean bool) {
+ return null;
+ }
+
+ @Override
+ public InventoryView openWorkbench(Location loc, boolean bool) {
+ return null;
+ }
+
+ @Override
+ public InventoryView openInventory(Inventory inv) {
+ return null;
+ }
+
+ @Override
+ public InventoryView getOpenInventory() {
+ return null;
+ }
+ @Override
+ public Inventory getEnderChest() {
+ return null;
+ }
+ @Override
+ public PlayerInventory getInventory() {
+ return null;
+ }
+
+ @Override
+ public boolean setWindowProperty(InventoryView.Property prop, int value) {
+ return false;
+ }
+
+ @Override
+ public void openInventory(InventoryView inv) {
+ }
+
+ @Override
+ public boolean isBlocking() {
+ return false;
+ }
+
+ @Override
+ public boolean setLeashHolder(Entity ent) {
+ return false;
+ }
+
+ @Override
+ public Entity getLeashHolder() {
+ return null;
+ }
+
+ @Override
+ public boolean isLeashed() {
+ return false;
+ }
+ @Override
+ public boolean isCustomNameVisible() {
+ return false;
+ }
+ @Override
+ public void setCustomNameVisible(boolean bool) {
+ }
+ @Override
+ public void setCustomName(String string) {
+ }
+ @Override
+ public boolean getCanPickupItems() {
+ return false;
+ }
+ @Override
+ public void setCanPickupItems(boolean bool) {
+ }
+ @Override
+ public EntityEquipment getEquipment() {
+ return null;
+ }
+ @Override
+ public void setRemoveWhenFarAway(boolean bool) {
+ }
+ @Override
+ public boolean getRemoveWhenFarAway() {
+ return false;
+ }
+ @Override
+ public boolean hasLineOfSight(Entity ent) {
+ return false;
+ }
+
+ @Override
+ public Collection getActivePotionEffects() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void removePotionEffect(PotionEffectType potion) {
+ }
+ @Override
+ public boolean addPotionEffects(Collection potion) {
+ return false;
+ }
+ @Override
+ public boolean addPotionEffect(PotionEffect potion, boolean bool) {
+ return false;
+ }
+ @Override
+ public boolean addPotionEffect(PotionEffect potion) {
+ return false;
+ }
+ @Override
+ public boolean hasPotionEffect(PotionEffectType potion) {
+ return false;
+ }
+
+ @Override
+ public Player getKiller() {
+ return null;
+ }
+
+ @Override
+ public void setNoDamageTicks(int num) {
+ }
+ @Override
+ public int getNoDamageTicks() {
+ return 1;
+ }
+ @Override
+ public void _INVALID_setLastDamage(int num) {
+ }
+ @Override
+ public int _INVALID_getLastDamage() {
+ return 1;
+ }
+ @Override
+ public void setLastDamage(double num) {
+ }
+ @Override
+ public double getLastDamage() {
+ return 1.0;
+ }
+ @Override
+ public void setMaximumNoDamageTicks(int num) {
+ }
+ @Override
+ public int getMaximumNoDamageTicks() {
+ return 1;
+ }
+ @Override
+ public void setMaximumAir(int num) {
+ }
+ @Override
+ public int getMaximumAir() {
+ return 1;
+ }
+ @Override
+ public void setRemainingAir(int num) {
+ }
+ @Override
+ public int getRemainingAir() {
+ return 1;
+ }
+ @Override
+ public Arrow shootArrow() {
+ return null;
+ }
+ @Override
+ public Snowball throwSnowball() {
+ return null;
+ }
+ @Override
+ public Egg throwEgg() {
+ return null;
+ }
+ @Override
+ public List getLastTwoTargetBlocks(HashSet hash, int num) {
+ return null;
+ }
+ @Override
+ public Block getTargetBlock(HashSet hash, int num) {
+ return null;
+ }
+ @Override
+ public List getLineOfSight(HashSet hash, int num) {
+ return null;
+ }
+ @Override
+ public Location getEyeLocation() {
+ return this.location;
+ }
+ @Override
+ public double getEyeHeight(boolean bool) {
+ return 1.0;
+ }
+ @Override
+ public double getEyeHeight() {
+ return 1.0;
+ }
+ @Override
+ public Entity getVehicle() {
+ return null;
+ }
+ @Override
+ public boolean leaveVehicle() {
+ return false;
+ }
+ @Override
+ public boolean isInsideVehicle() {
+ return false;
+ }
+ @Override
+ public EntityType getType() {
+ return EntityType.PLAYER;
+ }
+ @Override
+ public void playEffect(EntityEffect effect) {
+ }
+ @Override
+ public void setTicksLived(int num) {
+ }
+ @Override
+ public int getTicksLived() {
+ return 1;
+ }
+ @Override
+ public void setFireTicks(int num) {
+ }
+ @Override
+ public int getFireTicks() {
+ return 1;
+ }
+ @Override
+ public int getMaxFireTicks() {
+ return 20;
+ }
+ @Override
+ public UUID getUniqueId() {
+ return this.uuid;
+ }
+ @Override
+ public int getEntityId() {
+ return 666;
+ }
+ @Override
+ public boolean teleport(Entity ent, PlayerTeleportEvent.TeleportCause cause) {
+ return false;
+ }
+ @Override
+ public boolean teleport(Location loc, PlayerTeleportEvent.TeleportCause cause) {
+ return false;
+ }
+ @Override
+ public boolean teleport(Location loc) {
+ return false;
+ }
+ @Override
+ public boolean teleport(Entity ent) {
+ return false;
+ }
+ @Override
+ public World getWorld() {
+ return this.location.getWorld();
+ }
+ @Override
+ public Vector getVelocity() {
+ return new Vector(0,0,0);
+ }
+ @Override
+ public void setVelocity(Vector vec) {
+ }
+ @Override
+ public List getNearbyEntities(double num1, double num2, double num3) {
+ return null;
+ }
+ @Override
+ public EntityDamageEvent getLastDamageCause() {
+ return null;
+ }
+ @Override
+ public void setLastDamageCause(EntityDamageEvent event) {
+ }
+ @Override
+ public void setFallDistance(float num) {
+ }
+ @Override
+ public float getFallDistance() {
+ return 0.0f;
+ }
+ @Override
+ public boolean eject() {
+ return false;
+ }
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+ @Override
+ public boolean isDead() {
+ return false;
+ }
+ @Override
+ public void remove() {
+ }
+ @Override
+ public boolean setPassenger(Entity entity) {
+ return false;
+ }
+ @Override
+ public Entity getPassenger() {
+ return null;
+ }
+ @Override
+ public Server getServer() {
+ return null;
+ }
+ @Override
+ public void removeMetadata(String string, Plugin plugin) {
+ }
+ @Override
+ public boolean hasMetadata(String string) {
+ return false;
+ }
+ @Override
+ public List getMetadata(String string) {
+ return null;
+ }
+ @Override
+ public void setMetadata(String string, MetadataValue meta) {
+ }
+ @Override
+ public void resetMaxHealth() {
+ }
+ @Override
+ public void _INVALID_setMaxHealth(int num) {
+ }
+ @Override
+ public int _INVALID_getMaxHealth() {
+ return 1;
+ }
+ @Override
+ public void _INVALID_setHealth(int num) {
+ }
+ @Override
+ public int _INVALID_getHealth() {
+ return 1;
+ }
+ @Override
+ public void setMaxHealth(double num) {
+ }
+ @Override
+ public double getMaxHealth() {
+ return 1.0;
+ }
+ @Override
+ public void setHealth(double num) {
+ }
+ @Override
+ public double getHealth() {
+ return 1.0;
+ }
+ @Override
+ public void _INVALID_damage(int num, Entity ent) {
+ }
+ @Override
+ public void damage(double num, Entity ent) {
+ }
+ @Override
+ public void _INVALID_damage(int num) {
+ }
+ @Override
+ public void damage(double num) {
+ }
+ @Override
+ public T launchProjectile(Class extends T> projectileClass, Vector velocity) {
+ return null;
+ }
+ @Override
+ public T launchProjectile(Class extends T> projectileClass) {
+ return null;
+ }
+ @Override
+ public Set getEffectivePermissions() {
+ // Create a new HashSet to store PermissionAttachmentInfo objects.
+ Set permissions = new HashSet<>();
+
+ // Create a new PermissionAttachmentInfo.
+ // Note: You'll need to provide an actual instance of a Plugin and a PermissionAttachment, or mock these objects.
+ PermissionAttachmentInfo info = new PermissionAttachmentInfo(this, "*", null, true);
+
+ // Add the PermissionAttachmentInfo to the Set.
+ permissions.add(info);
+
+ // Return the Set of permissions.
+ return permissions;
+ }
+ @Override
+ public void recalculatePermissions() {
+ }
+ @Override
+ public void removeAttachment(PermissionAttachment attachment) {
+ }
+ @Override
+ public PermissionAttachment addAttachment(Plugin plugin, int num) {
+ return null;
+ }
+ @Override
+ public PermissionAttachment addAttachment(Plugin plugin) {
+ return null;
+ }
+ @Override
+ public PermissionAttachment addAttachment(Plugin plugin, String string, boolean bool) {
+ return null;
+ }
+ @Override
+ public PermissionAttachment addAttachment(Plugin plugin, String string, boolean bool, int num) {
+ return null;
+ }
+ @Override
+ public boolean hasPermission(Permission permission) {
+ return true;
+ }
+ @Override
+ public boolean hasPermission(String string) {
+ return true;
+ }
+ @Override
+ public boolean isPermissionSet(Permission permission) {
+ return true;
+ }
+ @Override
+ public boolean isPermissionSet(String string) {
+ return true;
+ }
+ @Override
+ public void setOp(boolean bool) {
+ }
+ @Override
+ public void abandonConversation(Conversation conversation) {
+ }
+ @Override
+ public void abandonConversation(Conversation conversation, ConversationAbandonedEvent event) {
+ }
+ @Override
+ public boolean beginConversation(Conversation conversation) {
+ return false;
+ }
+ @Override
+ public void acceptConversationInput(String string) {
+ }
+ @Override
+ public boolean isConversing() {
+ return false;
+ }
+ @Override
+ public boolean hasPlayedBefore() {
+ return true;
+ }
+ @Override
+ public long getLastPlayed() {
+ return 1;
+ }
+ @Override
+ public long getFirstPlayed() {
+ return 1;
+ }
+ @Override
+ public Player getPlayer() {
+ return null;
+ }
+ @Override
+ public void setWhitelisted(boolean bool) {
+ }
+ @Override
+ public boolean isWhitelisted() {
+ return true;
+ }
+ @Override
+ public boolean isOnline() {
+ return true;
+ }
+ @Override
+ public Map serialize() {
+ return new HashMap();
+ }
+ @Override
+ public boolean isBanned() {
+ return false;
+ }
+ @Override
+ public void setBanned(boolean bool) {
+ }
+ @Override
+ public void sendMessage(String[] strings) {
+ for(String string : strings) {
+ System.out.println("ScriptBot chat: " + string);
+ }
+ }
+ @Override
+ public Set getListeningPluginChannels() {
+ return null;
+ }
+ @Override
+ public void sendPluginMessage(Plugin source, String channel, byte[] message) {
+ System.out.println("PluginMessage from: " + source.getDescription().getName() + ", Channel: " + channel + ", Message: " + new String(message));
+ }
+
+ @Override
+ public String getName() {
+ return "ScriptBot";
+ }
+ @Override
+ public String getCustomName() {
+ return "ScriptBot";
+ }
+
+}
diff --git a/src/main/java/com/zivilon/fakeplayer/FakePlayerPlugin.java b/src/main/java/com/zivilon/fakeplayer/FakePlayerPlugin.java
new file mode 100644
index 0000000..3b0fe3f
--- /dev/null
+++ b/src/main/java/com/zivilon/fakeplayer/FakePlayerPlugin.java
@@ -0,0 +1,23 @@
+package com.zivilon.fakeplayer;
+
+import org.bukkit.plugin.java.JavaPlugin;
+
+import com.zivilon.fakeplayer.FakePlayer;
+import com.zivilon.fakeplayer.commands.run_command;
+import com.zivilon.fakeplayer.commands.area_command;
+
+public class FakePlayerPlugin extends JavaPlugin {
+
+ @Override
+ public void onEnable() {
+ // Fired when the server enables the plugin
+ getLogger().info("FakePlayer enabled!");
+ this.getCommand("fakeplayer_run").setExecutor(new run_command());
+ this.getCommand("area_command").setExecutor(new area_command());
+ }
+
+ @Override
+ public void onDisable() {
+ getLogger().info("FakePlayer disabled!");
+ }
+}
diff --git a/src/main/java/com/zivilon/fakeplayer/commands/area_command.java b/src/main/java/com/zivilon/fakeplayer/commands/area_command.java
new file mode 100644
index 0000000..19e3c85
--- /dev/null
+++ b/src/main/java/com/zivilon/fakeplayer/commands/area_command.java
@@ -0,0 +1,53 @@
+package com.zivilon.fakeplayer.commands;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+
+import java.util.Arrays;
+
+import com.zivilon.fakeplayer.FakePlayerPlugin;
+import com.zivilon.fakeplayer.FakePlayer;
+
+public class area_command implements CommandExecutor {
+
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ if (!sender.hasPermission("fakeplayer.area")) {
+ sender.sendMessage(ChatColor.RED + "You do not have permission to use this command.");
+ return true;
+ }
+ World world = Bukkit.getWorld("DIM100");
+ int x;
+ int y;
+ int z;
+
+ if (args.length < 4) {
+ sender.sendMessage(ChatColor.RED + "Usage: /area_command ");
+ return true;
+ }
+ try {
+ x = Integer.parseInt(args[0]);
+ y = Integer.parseInt(args[1]);
+ z = Integer.parseInt(args[2]);
+ } catch (NumberFormatException e) {
+ sender.sendMessage(ChatColor.RED + "Coordinates need to be numbers!");
+ return true;
+ }
+
+ Location location = new Location(world, x, y, z);
+ Player fakePlayer = new FakePlayer(location);
+
+ if(args.length > 2){
+ String cmdToExecute = String.join(" ", Arrays.copyOfRange(args, 3, args.length));
+ fakePlayer.performCommand(cmdToExecute);
+ } else {
+ sender.sendMessage(ChatColor.RED + "No command specified.");
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/com/zivilon/fakeplayer/commands/run_command.java b/src/main/java/com/zivilon/fakeplayer/commands/run_command.java
new file mode 100644
index 0000000..fa1dd8b
--- /dev/null
+++ b/src/main/java/com/zivilon/fakeplayer/commands/run_command.java
@@ -0,0 +1,42 @@
+package com.zivilon.fakeplayer.commands;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+
+
+import com.zivilon.fakeplayer.FakePlayerPlugin;
+import com.zivilon.fakeplayer.FakePlayer;
+
+public class run_command implements CommandExecutor {
+
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ Location location;
+ if (!sender.hasPermission("fakeplayer.use")) {
+ sender.sendMessage(ChatColor.RED + "You do not have permission to use this command.");
+ return true;
+ }
+ World world = Bukkit.getWorld("DIM100");
+ if(sender instanceof Player) {
+ Player player = (Player) sender;
+ location = player.getLocation();
+ } else {
+ location = new Location(world, 0, 64, 0);
+
+ }
+ Player fakePlayer = new FakePlayer(location);
+
+ if(args.length > 0){
+ String cmdToExecute = String.join(" ", args);
+ fakePlayer.performCommand(cmdToExecute);
+ } else {
+ sender.sendMessage(ChatColor.RED + "No command specified.");
+ }
+ return true;
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..fae401d
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,15 @@
+main: com.zivilon.fakeplayer.FakePlayerPlugin
+name: FakePlayer
+author: Shinare
+version: 1.0
+commands:
+ fakeplayer_run:
+ description: Run commands as fake player
+ Usage: /fakeplayer_run
+ # This command is probably not even necessary, might be deleted later
+ fakeplayer_create:
+ description: Create a fake player.
+ Usage: /fakeplayer_create
+ area_command:
+ description: Run a command through fake player in specific coordinates
+ Usage: /area_command