Skip to content

Commit

Permalink
Change map saving (untested for now)
Browse files Browse the repository at this point in the history
Add longrifle and throwingjuice
  • Loading branch information
StephenMiner committed Sep 20, 2023
1 parent 9cf1e9b commit d49afba
Show file tree
Hide file tree
Showing 5 changed files with 393 additions and 10 deletions.
9 changes: 5 additions & 4 deletions src/main/java/me/stephenminer/redvblue/Items.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package me.stephenminer.redvblue;

import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.*;
import org.bukkit.block.Banner;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
Expand All @@ -16,6 +13,8 @@
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.units.qual.A;


Expand All @@ -24,6 +23,7 @@
import java.util.concurrent.ThreadLocalRandom;

public class Items {
public static NamespacedKey USES = new NamespacedKey(JavaPlugin.getPlugin(RedBlue.class),"rb:uses");

public ItemStack arenaWand(){
ItemStack item = new ItemStack(Material.WOODEN_SHOVEL);
Expand Down Expand Up @@ -111,6 +111,7 @@ public ItemStack throwingJuice(int uses){
lore.add(ChatColor.YELLOW + "Uses: " + uses);
lore.add(ChatColor.BLACK + "throwingjuice");
meta.setLore(lore);
meta.getPersistentDataContainer().set(Items.USES, PersistentDataType.INTEGER,uses);
meta.addEnchant(Enchantment.THORNS, ThreadLocalRandom.current().nextInt(4) + 1, true);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
item.setItemMeta(meta);
Expand Down
44 changes: 38 additions & 6 deletions src/main/java/me/stephenminer/redvblue/arena/Arena.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public class Arena {
private Set<GameChest> chests;
private HashMap<UUID, Team> offline;

private ArenaSaver saver;

public HashMap<Location, DataPair> blockMap;

private Scoreboard board;
Expand Down Expand Up @@ -75,6 +77,8 @@ public Arena(String id, String name, Location loc1, Location loc2, Location redS
players = new ArrayList<>();
blockMap = new HashMap<>();
chests = new HashSet<>();
saver = new ArenaSaver(this);
saver.saveMap();
updateBoard();
}

Expand Down Expand Up @@ -181,6 +185,10 @@ public void checkStart(){
int count = 0;
@Override
public void run(){
if (saver.isSaving()) {
if (count % 20 == 0)
return;
}
if (count % 20 == 0){
broadcast(Sound.ENTITY_CAT_AMBIENT,2,1);
broadcast(ChatColor.GOLD + "" + ((max - count) / 20) + " seconds until game start!");
Expand All @@ -193,6 +201,8 @@ public void run(){
return;
}
if (count >= max){
if (saver.isSaving())broadcast(ChatColor.YELLOW + "Map is saving" );
count-=20;
start();
this.cancel();
return;
Expand Down Expand Up @@ -266,17 +276,29 @@ public void end(){
new BukkitRunnable(){
@Override
public void run(){
Arena.arenas.remove(arena);
board.clearSlot(DisplaySlot.SIDEBAR);

offline.clear();
players.clear();
wall.destroyWall();
for (int i = players.size()-1; i >= 0; i--){
UUID uuid = players.get(i);
Player p = Bukkit.getPlayer(uuid);
removePlayer(p);
}
offline.clear();
players.clear();
wall.destroyWall();
saver.loadMap();
new BukkitRunnable(){
@Override
public void run() {
if (!saver.isLoading()){
Arena.arenas.remove(arena);
}
}
}.runTaskTimer(plugin,1,1);





reset();
}
}.runTaskLater(plugin, 100);
Expand Down Expand Up @@ -376,7 +398,7 @@ public void run(){
}
if (time % 20 == 0 && (fallTime-time) / 20 == 60) {
broadcast(Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 2, 2);
broadcast(ChatColor.YELLOW + "1 Minute Until the Wall Breaks BAD");
broadcast(ChatColor.YELLOW + "1 Minute Until the Wall Drops");
}
if (time % 20 == 0 & (fallTime-time) / 20 == 30){
broadcast(Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 2, 2);
Expand Down Expand Up @@ -591,6 +613,9 @@ public void addChests(Collection<GameChest> chests){
}
public Set<GameChest> getGameChests(){ return chests; }

public Location getLoc1(){ return loc1; }
public Location getLoc2(){ return loc2; }

/**
*
* @return the players in the arena;
Expand Down Expand Up @@ -681,6 +706,13 @@ private String timeString(){
return str;
}

public Team red(){
return board.getTeam("red");
}
public Team blue(){
return board.getTeam("blue");
}



}
96 changes: 96 additions & 0 deletions src/main/java/me/stephenminer/redvblue/arena/ArenaSaver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package me.stephenminer.redvblue.arena;

import me.stephenminer.redvblue.RedBlue;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ArenaSaver {
private final RedBlue plugin;
private final Arena arena;
private List<BlockState> states;

private final Location loc1,loc2;
private boolean saving;
private boolean loading;

public ArenaSaver(Arena arena){
this.plugin = RedBlue.getPlugin(RedBlue.class);
this.arena = arena;
this.loc1 = arena.getLoc1();
this.loc2 = arena.getLoc2();
states = new ArrayList<>();
loading = false;
}




public void saveMap(){
saving = true;
int maxX = maxX();
int maxY = maxY();
int maxZ = maxZ();
int minX = minX();
int minY = minY();
int minZ = minZ();
World world = loc1.getWorld();
for (int x = minX; x<= maxX; x++){
for (int y = minY; y<= maxY; y++){
for (int z = minZ; z <= maxZ; z++){
Block block = world.getBlockAt(x,y,z);
states.add(block.getState());
}
}
}
saving = false;
}

public void loadMap(){
int rate = 3000;
loading = true;
new BukkitRunnable(){
private int index = 0;
private int countTo = getCountTo(index, rate);
@Override
public void run(){
for (int i = index; i <= countTo; i++){
BlockState state = states.get(index);
state.update(true, false);
}
if (index >= states.size()-1){
arena.broadcast(ChatColor.GOLD + "" + ChatColor.BOLD + "Arena Finished Loading");
loading = false;
this.cancel();
return;
}
index = countTo;
countTo = Math.min(countTo+ rate, states.size()-1);
}
}.runTaskTimer(plugin, 1,1);
}

private int getCountTo(int index, int rate){
return Math.min(index + rate, states.size()-1);
}

public boolean isLoading(){ return loading; }
public boolean isSaving(){ return saving; }


public int maxX(){ return Math.max(loc1.getBlockX(), loc2.getBlockX()); }
public int maxY(){ return Math.max(loc1.getBlockY(),loc2.getBlockY()); }
public int maxZ(){ return Math.max(loc1.getBlockZ(), loc2.getBlockZ()); }

public int minX(){ return Math.min(loc1.getBlockX(), loc2.getBlockX()); }
public int minY(){ return Math.min(loc1.getBlockY(),loc2.getBlockY()); }
public int minZ(){ return Math.min(loc1.getBlockZ(), loc2.getBlockZ()); }
}
124 changes: 124 additions & 0 deletions src/main/java/me/stephenminer/redvblue/events/LongRifleUse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package me.stephenminer.redvblue.events;

import me.stephenminer.redvblue.RedBlue;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.*;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

public class LongRifleUse implements Listener {
private final RedBlue plugin;
private final Set<UUID> cooldown;

public LongRifleUse(RedBlue plugin){
this.plugin = plugin;
cooldown = new HashSet<>();
}


@EventHandler
public void shootRifle(PlayerInteractEvent event){
if (!event.hasItem()) return;
ItemStack item = event.getItem();
Player player = event.getPlayer();
if (cooldown.contains(player.getUniqueId())) {
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(net.md_5.bungee.api.ChatColor.AQUA + "Ability on Cooldown!"));
return;
}
if (plugin.checkLore(item,"longrifle")){
boolean shoot = checkAndTakeAmmo(player);
if (shoot) {
fire(player);

}else {
player.sendMessage(ChatColor.RED + "You are missing mana-powder or arrows!");
}
}
}

@EventHandler
public void onQuit(PlayerQuitEvent event){
cooldown.remove(event.getPlayer().getUniqueId());
}
@EventHandler
public void onWorldChange(PlayerChangedWorldEvent event){
cooldown.remove(event.getPlayer().getUniqueId());
}





private boolean checkAndTakeAmmo(Player player){
ItemStack powder = null;
ItemStack arrow = null;
ItemStack[] items = player.getInventory().getContents();
for (ItemStack item : items){
if (plugin.checkLore(item,"manapowder")) {
powder = item;
continue;
}
Material mat = item.getType();
if (mat == Material.ARROW || mat == Material.TIPPED_ARROW || mat == Material.SPECTRAL_ARROW){
arrow = item;
continue;
}
}
if (powder == null || arrow == null) return false;
powder.setAmount(powder.getAmount()-1);
arrow.setAmount(arrow.getAmount()-1);
return true;
}

private void fire(Player shooter){
Vector dir = shooter.getLocation().getDirection();
Arrow arrow = shooter.launchProjectile(Arrow.class,dir.clone().multiply(4));
arrow.setKnockbackStrength(3);
World world = shooter.getWorld();
world.spawnParticle(Particle.ASH,shooter.getLocation().clone().add(dir),10);
world.playSound(shooter.getLocation(), Sound.ENTITY_GENERIC_EXPLODE,2,1);
}

/**
*
* @param player
* @param duration - time in ticks
*/
private void runCooldown(Player player, int duration){
cooldown.add(player.getUniqueId());
float exp = player.getExp();
new BukkitRunnable(){
int count;
@Override
public void run(){
if (!player.isOnline() || player.isDead()){
this.cancel();
return;
}
if (count >= duration){
player.playSound(player,Sound.BLOCK_IRON_TRAPDOOR_CLOSE,1,1);
player.setExp(exp);
cooldown.remove(player.getUniqueId());
this.cancel();
return;
}
float ratio = ((float) count) / duration;
player.setExp(ratio);
count++;
}
}.runTaskTimer(plugin, 0, 1);
}
}
Loading

0 comments on commit d49afba

Please sign in to comment.