Skip to content

Instantly share code, notes, and snippets.

@Nishh
Created March 20, 2024 10:59
Show Gist options
  • Save Nishh/a79091a0974d7af2f479614488555a51 to your computer and use it in GitHub Desktop.
Save Nishh/a79091a0974d7af2f479614488555a51 to your computer and use it in GitHub Desktop.
package levelsystem.init;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.BrewingStand;
import org.bukkit.block.Furnace;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.apache.commons.lang3.math.NumberUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockCookEvent;
import org.bukkit.event.inventory.BrewEvent;
import org.bukkit.event.inventory.FurnaceBurnEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import levelsystem.Data;
import levelsystem.utils.Util;
import liweth.Liweth;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
/*
* furnace, brewind stand sahipliği
*/
public class Owning implements Listener, CommandExecutor {
public static Map<Location,Data> owners = new HashMap<>();
{
Liweth.instance.getCommand("open").setExecutor(this);
}
public static Data getOwner(Location v) {
//Vector v = l.toVector();
return owners.get(v);
}
public static Data getOwner(Block b) {
return owners.get(b.getLocation(Util.temp));
}
public void setOwner(Location l, Data o) {
//Vector v = l.toVector();
World w = Bukkit.getWorlds().get(0);
w.getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()).getChunk().addPluginChunkTicket(Liweth.instance);
o.player.sendMessage(ChatColor.GREEN+"Ownership started. ");
owners.put(l,o);
}
public Vector getVector(Block b) {
return b.getLocation(Util.temp).toVector();
}
public Vector getVector(BlockState b) {
return b.getLocation(Util.temp).toVector();
}
public BlockState getBlock(Inventory inv) {
boolean furnace = inv.getType()==InventoryType.FURNACE;
boolean brew = inv.getType()==InventoryType.BREWING;
if(!furnace&&!brew) {
return null;
}
BlockState b = null;
if(inv.getHolder() instanceof BlockState) {
b = (BlockState) inv.getHolder();
}else {
return null;
}
return b;
}
@EventHandler
public void onInventoryOpen(InventoryOpenEvent e) {
if(e.getPlayer().isOp())
return;
BlockState b = getBlock(e.getInventory());
if(b==null)
return;
Player p = (Player) e.getPlayer();
Location loc = b.getLocation();
Data owner = getOwner(loc);
if(owner!=null) {
if(owner.player!=p) {
e.setCancelled(true);
p.sendMessage(ChatColor.RED+"This container already has a temporary owner.");
}
return;
}
setOwner(loc,Util.getData(p));
}
public boolean isEmpty(ItemStack is) {
return is == null || is.getType() == Material.AIR;
}
public boolean isBrewingUsed(BlockState brewing) {
return ((BrewingStand) brewing).getBrewingTime()!=0;
}
public boolean isFurnaceUsed(BlockState furnace) {
return ((Furnace) furnace).getCookTime()!=0;
}
/*public boolean isFurnaceUsed(Inventory inv) {
if(isEmpty(inv.getItem(3)) || isEmpty(inv.getItem(4)))
return false;
return true;
}*/
public static Inventory getInventory(Block b) {
return ((InventoryHolder)b.getState()).getInventory();
}
public int burnTimeNeeded = 20 * 10;
@EventHandler
public void onCook(FurnaceBurnEvent e) {
if(e.getFuel().getAmount()!=1) {
return;
}
int burnTime = e.getBurnTime();
if(burnTime>=burnTimeNeeded) {
return;
}
Location l = e.getBlock().getLocation();
Data d = getOwner(l);
if(d==null) {
return;
}
this.removeOwnerLaterAndNoticeFuel(l);
}
/**
* cooking complete
* @param e
*/
@EventHandler
public void onCook(BlockCookEvent e) {
//boolean last = e.getSource().getAmount()==1;
//boolean noFuel = getInventory(e.getBlock())==1;
if(e.getSource().getAmount()!=1) {
return;
}
Location l = e.getBlock().getLocation();
Data d = getOwner(l);
if(d==null) {
return;
}
removeOwnerLaterAndNotice(l);
}
/**
* on brewing complete
* @param e
*/
@EventHandler
public void onBrew(BrewEvent e) {
Location l = e.getBlock().getLocation();
Data d = getOwner(l);
if(d==null) {
return;
}
removeOwnerLaterAndNotice(l);
}
public Entry<Location, Data> getById(int id) {
for(Entry<Location, Data> e : owners.entrySet()) {
//Util.b("ownership check: "+e.getKey().hashCode()+" == "+id);
if(e.getKey().hashCode()==id)
return e;
}
return null;
}
public static String warn = ChatColor.RED+"Take your items! They will be deleted after 1 minute.";
public void removeOwnerLaterAndNotice(Location l) {
Data d = getOwner(l);
Material t = l.getBlock().getType();
int id = l.hashCode();
TextComponent brew = startEndCmd(ChatColor.YELLOW+"Brewing complete. ",
ChatColor.UNDERLINE+"Click here to open your brewing stand.",
"open "+id);
TextComponent furnace = startEndCmd(ChatColor.YELLOW+"Cooking complete. ",
ChatColor.UNDERLINE+"Click here to open your furnace.",
"open "+id);
d.player.sendMessage(t==Material.FURNACE?furnace:brew);
d.player.sendMessage(warn);
cancelTask(l);
d.addTask(new BukkitRunnable() {
@Override
public void run() {
removeOwner(l);
}
}.runTaskLater(Liweth.instance, 20*60), "owning", l.hashCode());
}
public void removeOwnerLaterAndNoticeFuel(Location l) {
Data d = getOwner(l);
int id = l.hashCode();
TextComponent furnace = startEndCmd(ChatColor.RED+"Furnace is out of fuel! ",
ChatColor.UNDERLINE+"Click here to open your furnace.",
"open "+id);
d.player.sendMessage(furnace);
d.player.sendMessage(warn);
cancelTask(l);
d.addTask(new BukkitRunnable() {
@Override
public void run() {
removeOwner(l);
}
}.runTaskLater(Liweth.instance, 20*60), "owning", id);
}
public TextComponent startEndCmd(String start, String end, String cmd) {
TextComponent m = new TextComponent(end);
m.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/"+cmd));
TextComponent b = new TextComponent(end);
b.addExtra(m);
return m;
}
public void removeOwner(Location l) {
Data d = owners.remove(l);
d.player.sendMessage(ChatColor.RED+"Ownership removed. ");
cancelTask(l);
if(isLastInChunk(l)) {
l.getChunk().removePluginChunkTicket(Liweth.instance);
}
}
//TODO implement to needed places
public void cancelTask(Location l){
Data d = getOwner(l);
if(d==null)
return;
d.cancelTask("owning", l.hashCode());
}
private boolean isLastInChunk(Location l) {
Chunk c = l.getChunk();
for(Location loc : Owning.owners.keySet()) {
if(loc.getChunk()==c)
return false;
}
return true;
}
@EventHandler
public void onClose(InventoryCloseEvent e) {
BlockState b = getBlock(e.getInventory());
if(b==null)
return;
Player p = (Player) e.getPlayer();
Data d = Util.getData(p);
InventoryType t = e.getInventory().getType();
if(getOwner(b.getLocation())==d) {
if((t==InventoryType.FURNACE&&!isFurnaceUsed(b))||
(t==InventoryType.BREWING&&!isBrewingUsed(b))) {
removeOwner(b.getLocation());
}
}
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("open")) {
if(args.length==0) {
sender.sendMessage(ChatColor.RED+"Usage: /open <id>");
return true;
}
if(!NumberUtils.isCreatable(args[0])) {
sender.sendMessage(ChatColor.RED+"<id> needs to be a number.");
return true;
}
int id = Integer.parseInt(args[0]);
Data d = Util.getData((Player)sender);
Entry<Location, Data> e = getById(id);
if(e==null) {
sender.sendMessage(ChatColor.RED+"Invalid ID. ");
return true;
}
if(e.getValue()!=d) {
sender.sendMessage(ChatColor.RED+"Wrong owner.");
return true;
}
Inventory inv = ((InventoryHolder)e.getKey().getBlock().getState()).getInventory();
d.player.openInventory(inv);
return true;
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment