summaryrefslogtreewikicommitdiff
path: root/src/main/java/net/tylermurphy/hideAndSeek/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/game')
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java62
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java14
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java8
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java46
-rw-r--r--src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java41
5 files changed, 169 insertions, 2 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java
new file mode 100644
index 0000000..b4f70ad
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java
@@ -0,0 +1,62 @@
+package net.tylermurphy.hideAndSeek.game;
+
+import org.bukkit.Material;
+import org.bukkit.entity.FallingBlock;
+import org.bukkit.entity.Player;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Disguiser {
+
+ private final Map<Player, FallingBlock> blocks;
+
+ public Disguiser(){
+ this.blocks = new HashMap<>();
+ }
+
+ public FallingBlock getBlock(Player player){
+ return blocks.get(player);
+ }
+
+ public boolean contains(FallingBlock block) { return blocks.containsValue(block); }
+
+ public boolean disguised(Player player) { return blocks.containsKey(player); }
+
+ public void check(){
+ for(Map.Entry<Player, FallingBlock> set : blocks.entrySet()){
+ Player player = set.getKey();
+ FallingBlock block = set.getValue();
+ if(block.isDead()){
+ block.remove();
+ FallingBlock replacement = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), block.getMaterial(), (byte)0);
+ replacement.setGravity(false);
+ replacement.setDropItem(false);
+ blocks.put(player, replacement);
+ }
+ }
+ }
+
+ public void disguise(Player player, Material material){
+ if(blocks.containsKey(player)){
+ FallingBlock block = blocks.get(player);
+ block.remove();
+ }
+ FallingBlock block = player.getLocation().getWorld().spawnFallingBlock(player.getLocation(), material, (byte)0);
+ block.setGravity(false);
+ block.setDropItem(false);
+ blocks.put(player, block);
+ player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0,false, false));
+ }
+
+ public void reveal(Player player){
+ if(!blocks.containsKey(player)) return;
+ FallingBlock block = blocks.get(player);
+ block.remove();
+ blocks.remove(player);
+ player.removePotionEffect(PotionEffectType.INVISIBILITY);
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
index bd2a965..2ddfeca 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java
@@ -27,9 +27,11 @@ import net.tylermurphy.hideAndSeek.configuration.Items;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
+import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
@@ -45,6 +47,9 @@ public class PlayerLoader {
loadPlayer(player);
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false));
Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString());
+ if(blockhuntEnabled){
+ openBlockHuntPicker(player);
+ }
}
public static void loadSeeker(Player player, String gameWorld){
@@ -141,4 +146,13 @@ public class PlayerLoader {
}
}
+ public static void openBlockHuntPicker(Player player){
+ int slots = ((blockhuntBlocks.size()-1)/9)*9+9;
+ Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block");
+ for(int i=0;i<blockhuntBlocks.size();i++){
+ inventory.setItem(i, new ItemStack(blockhuntBlocks.get(i)));
+ }
+ player.openInventory(inventory);
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
index 19ec83a..f09e112 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java
@@ -15,6 +15,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.PlayerDeathEvent;
import static net.tylermurphy.hideAndSeek.configuration.Config.*;
import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPosition;
@@ -94,6 +95,8 @@ public class DamageHandler implements Listener {
} else {
XSound.ENTITY_PLAYER_HURT.play(player, 1, 1);
}
+ // Reveal player if they are disguised
+ Main.getInstance().getDisguiser().reveal(player);
// Teleport player to seeker spawn
player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ()));
// Add leaderboard stats
@@ -115,4 +118,9 @@ public class DamageHandler implements Listener {
board.reloadBoardTeams();
}
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onPlayerDeath(PlayerDeathEvent event){
+ Main.getInstance().getDisguiser().reveal(event.getEntity());
+ }
+
}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java
new file mode 100644
index 0000000..9bc6504
--- /dev/null
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java
@@ -0,0 +1,46 @@
+package net.tylermurphy.hideAndSeek.game.listener;
+
+import com.comphenix.protocol.PacketType;
+import com.comphenix.protocol.ProtocolLibrary;
+import com.comphenix.protocol.ProtocolManager;
+import com.comphenix.protocol.events.PacketContainer;
+import net.tylermurphy.hideAndSeek.Main;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.entity.FallingBlock;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class DisguiseHandler implements Listener {
+
+ private static final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onMove(PlayerMoveEvent event) {
+ FallingBlock block = Main.getInstance().getDisguiser().getBlock(event.getPlayer());
+ if(block == null) return;
+ Bukkit.getOnlinePlayers().forEach(player -> {
+ teleportEntity(player, block, event.getPlayer().getLocation());
+ });
+ }
+
+ private void teleportEntity(Player player, FallingBlock block, Location location) {
+ PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_TELEPORT);
+ packet.getModifier().writeDefaults();
+ packet.getIntegers().write(0, block.getEntityId());
+ packet.getDoubles().write(0, location.getX());
+ packet.getDoubles().write(1, location.getY());
+ packet.getDoubles().write(2, location.getZ());
+ try {
+ protocolManager.sendServerPacket(player, packet);
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
index f0fb4f9..e72bea0 100644
--- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
+++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java
@@ -19,26 +19,29 @@
package net.tylermurphy.hideAndSeek.game.listener;
+import static net.tylermurphy.hideAndSeek.configuration.Config.*;
+
import com.cryptomorin.xseries.XMaterial;
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.command.Debug;
import net.tylermurphy.hideAndSeek.game.util.Status;
+import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryCloseEvent;
public class InventoryHandler implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player)) return;
-
- Player player = (Player) event.getWhoClicked();
checkForInventoryMove(event);
checkForSpectatorTeleportMenu(event);
checkForDebugMenu(event);
+ checkForBlockHuntMenu(event);
}
private void checkForInventoryMove(InventoryClickEvent event){
@@ -74,4 +77,38 @@ public class InventoryHandler implements Listener {
}
}
+ private void checkForBlockHuntMenu(InventoryClickEvent event){
+ boolean test;
+ if(Main.getInstance().supports(14)){
+ test = event.getView().getTitle().equals("Select a Block");
+ } else {
+ test = event.getInventory().getName().equals("Select a Block");
+ }
+ if(!test) return;
+ event.setCancelled(true);
+ Material mat = blockhuntBlocks.get(event.getRawSlot());
+ if(mat == null) return;
+ Player player = (Player) event.getWhoClicked();
+ Main.getInstance().getDisguiser().disguise(player, mat);
+ player.closeInventory();
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onInventoryClose(InventoryCloseEvent event){
+ if (!(event.getPlayer() instanceof Player)) return;
+ boolean test;
+ if(Main.getInstance().supports(14)){
+ test = event.getView().getTitle().equals("Select a Block");
+ } else {
+ test = event.getInventory().getName().equals("Select a Block");
+ }
+ if(!test) return;
+ Material mat = blockhuntBlocks.get(0);
+ if(mat == null) return;
+ Player player = (Player) event.getPlayer();
+ if(Main.getInstance().getDisguiser().disguised(player)) return;
+ Main.getInstance().getDisguiser().disguise(player, mat);
+ player.closeInventory();
+ }
+
}