Created
March 20, 2024 10:59
-
-
Save Nishh/a79091a0974d7af2f479614488555a51 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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