CubeTP/src/main/java/ovh/mxg/cubetp/CubeTP.java
2023-11-27 18:45:18 -05:00

354 lines
14 KiB
Java

package ovh.mxg.cubetp;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.sign.Side;
import org.bukkit.block.sign.SignSide;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerEggThrowEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MainHand;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public final class CubeTP extends JavaPlugin implements Listener {
public static String host;
public static String port;
public static String database;
public static String username;
public static String password;
public static Material cubeTP;
public static Material tomePortalReagent;
Inventory inv = null;
Location clickedCubeLoc;
Block clickedBlock;
String curCubeName = "";
boolean curCubePrivate = false;
boolean inCubeTPInventory = false;
double curCubeX = 0;
double curCubeY = 0;
double curCubeZ = 0;
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this,this);
//Config
File f = new File("plugins/CubeTP/config.yml");
if(!f.exists())
{
saveDefaultConfig();
}
getLogger().info("Loading config...");
host = getConfig().getString("CubeTP.sqlHost");
port = getConfig().getString("CubeTP.sqlPort");
database = getConfig().getString("CubeTP.sqlDB");
username = getConfig().getString("CubeTP.sqlUser");
password = getConfig().getString("CubeTP.sqlPass");
cubeTP = Material.valueOf(getConfig().getString("CubeTP.cubeMaterial"));
tomePortalReagent = Material.valueOf(getConfig().getString("CubeTP.tomePortalReagent"));
getLogger().info("Enabled!");
}
@EventHandler
public void PlayerInteractEvent(PlayerInteractEvent event) throws SQLException {
clickedBlock = event.getClickedBlock();
Player player = event.getPlayer();
Action action = event.getAction();
if(event.getHand() == EquipmentSlot.HAND){
if (clickedBlock == null) return;
World world = player.getWorld();
Block block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ());
if(action == Action.RIGHT_CLICK_BLOCK && clickedBlock.getType() == cubeTP && block.getState() instanceof Sign){
clickedCubeLoc = clickedBlock.getLocation();
world = getServer().getWorld("world");
block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ());
BlockState state = block.getState();
Sign sign = (Sign) state;
SignSide sside = sign.getSide(Side.FRONT);
curCubeName = sside.getLine(0);
if(!sside.getLine(1).isEmpty()){
curCubePrivate = true;
} else {
curCubePrivate = false;
}
curCubeX = clickedBlock.getLocation().getBlockX();
curCubeY = clickedBlock.getLocation().getBlockY();
curCubeZ = clickedBlock.getLocation().getBlockZ();
inCubeTPInventory = true;
ShowUI(player);
}
if(action == Action.RIGHT_CLICK_BLOCK){
ItemStack mhi = player.getInventory().getItemInMainHand();
if(mhi.getItemMeta() != null){
String mainhand = mhi.getItemMeta().getDisplayName();
if(mainhand.equals("Tome de portail")){
inCubeTPInventory = true;
ShowUIPortal(player);
mhi.setAmount(0);
}
}
}
}
}
@EventHandler
public void onInventoryClick(final InventoryClickEvent e) throws SQLException {
if(inCubeTPInventory){
e.setCancelled(true);
if (!e.isLeftClick()) return;
final ItemStack clickedItem = e.getCurrentItem();
// verify current item is not null
if (clickedItem == null || clickedItem.getType().isAir()) return;
final Player p = (Player) e.getWhoClicked();
// register the cube
if (e.getRawSlot() == 3){
if(SQL.CheckCubeNameExists(curCubeName)){
p.sendMessage(MessageFormat.format("§bLe cube {0} existe déjà. Changez le nom.", curCubeName));
} else {
if(curCubePrivate){
SQL.AddCube(curCubeName, curCubeX, curCubeY, curCubeZ, p.getUniqueId().toString());
} else {
SQL.AddCube(curCubeName, curCubeX, curCubeY, curCubeZ, null);
}
p.sendMessage(MessageFormat.format("§bLe cube {0} a été ajouté.", curCubeName));
ShowUI(p);
}
inCubeTPInventory = false;
}
// create a tome of portal from a book
if (e.getRawSlot() == 4){
Inventory pinv = p.getInventory();
if(HaveBook(p)){
TakeBook(p);
pinv.addItem(createGuiItem(Material.ENCHANTED_BOOK, "Tome de portail", "Permets d'aller vers un cube, pas de revenir."));
} else {
p.sendMessage("§bVous devez posséder un livre pour créer cet objet.");
}
inCubeTPInventory = false;
}
// unregister a cube
if (e.getRawSlot() == 5){
if(SQL.CheckCubeNameExists(curCubeName)){
SQL.DeleteCubeByName(curCubeName);
p.sendMessage(MessageFormat.format("§bLe cube {0} a été supprimé.", curCubeName));
ShowUI(p);
} else {
p.sendMessage(MessageFormat.format("§bLe cube {0} n'existe pas.", curCubeName));
}
inCubeTPInventory = false;
}
// tp to a remote cube
if (e.getRawSlot() >= 9){
String name = e.getCurrentItem().getItemMeta().getDisplayName();
CubeTP(p,name);
inCubeTPInventory = false;
}
}
}
@EventHandler
public void InventoryCloseEvent(final InventoryCloseEvent e) throws SQLException {
inCubeTPInventory = false;
}
@EventHandler
public void onBlockBreakWithSignOnIt(BlockBreakEvent event){
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) throws SQLException {
final Player p = event.getPlayer();
Block block = event.getBlock();
if(block.getState() instanceof Sign){
BlockState state = block.getState();
Sign sign = (Sign) state;
SignSide sside = sign.getSide(Side.FRONT);
double x = block.getX();
double y = block.getY()-1;
double z = block.getZ();
if(SQL.CheckCubeByLocation(x, y, z)){
String st = sside.getLine(0);
SQL.DeleteCubeByName(st);
Block cb = p.getWorld().getBlockAt(block.getX(),block.getY()-1, block.getZ());
cb.setType(Material.AIR);
ItemStack item = new ItemStack(cubeTP, 1);
p.getWorld().dropItem(p.getLocation(), item);
}
}
if(block.getType() == Material.GOLD_BLOCK){
double x = block.getX();
double y = block.getY();
double z = block.getZ();
if(SQL.CheckCubeByLocation(x, y, z)){
Block sb = p.getWorld().getBlockAt(block.getX(),block.getY()+1, block.getZ());
BlockState state = sb.getState();
Sign sign = (Sign) state;
SignSide sside = sign.getSide(Side.FRONT);
String st = sside.getLine(0);
SQL.DeleteCubeByName(st);
sb.setType(Material.AIR);
ItemStack item = new ItemStack(Material.OAK_SIGN, 1);
p.getWorld().dropItem(p.getLocation(), item);
}
}
}
@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event){
}
public boolean HaveBook(Player player){
boolean hb = false;
Inventory pinv = player.getInventory();
for(ItemStack i: pinv){
if(i != null){
if(i.getType() == tomePortalReagent){
hb = true;
}
}
}
return hb;
}
public void TakeBook(Player player){
int ba = 0;
Inventory pinv = player.getInventory();
for(ItemStack i: pinv){
if(i != null){
if(i.getType() == tomePortalReagent){
ba = i.getAmount();
i.setAmount(ba-1);
}
}
}
}
public void ShowUI(Player player) throws SQLException {
inv = Bukkit.createInventory(null, 45, "CubeTP");
World world = getServer().getWorld("world");
Block block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ());
BlockState state = block.getState();
Sign sign = (Sign) state;
SignSide sside = sign.getSide(Side.FRONT);
String lore01 = MessageFormat.format("{0}", sside.getLine(0));
String lore02 = MessageFormat.format("x{0} y{1} z{2}", clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY(), clickedBlock.getLocation().getBlockZ());
inv.setItem(0,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(1,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(2,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(3,createGuiItem(Material.CYAN_WOOL, "§bEnregistrer", lore01, lore02));
inv.setItem(4,createGuiItem(Material.CYAN_WOOL, "§bTome de portail"));
inv.setItem(5,createGuiItem(Material.CYAN_WOOL, "§bRetirer"));
inv.setItem(6,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(7,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(8,createGuiItem(Material.BLACK_WOOL, " "));
AddAllCubes(player);
player.openInventory(inv);
}
public void ShowUIPortal(Player player) throws SQLException {
inv = Bukkit.createInventory(null, 45, "CubeTP");
inv.setItem(0,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(1,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(2,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(3,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(4,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(5,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(6,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(7,createGuiItem(Material.BLACK_WOOL, " "));
inv.setItem(8,createGuiItem(Material.BLACK_WOOL, " "));
AddAllCubes(player);
player.openInventory(inv);
}
public void AddAllCubes(Player player) throws SQLException {
String uuid = player.getUniqueId().toString();
SQL.connect();
PreparedStatement ps = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE uuid IS NULL");
ResultSet rs = ps.executeQuery();
int slot = 9;
while(rs != null && rs.next()) {
String lore01 = MessageFormat.format("x{0} y{1} z{2}", rs.getDouble("x"), rs.getDouble("y"), rs.getDouble("z"));
inv.setItem(slot,createGuiItem(Material.GREEN_WOOL, rs.getString("name"), lore01));
slot++;
}
PreparedStatement psp = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE uuid IS NOT NULL AND uuid = ?");
psp.setString(1, uuid);
ResultSet rsp = psp.executeQuery();
while(rsp != null && rsp.next()) {
String lore01 = MessageFormat.format("x{0} y{1} z{2}", rsp.getDouble("x"), rsp.getDouble("y"), rsp.getDouble("z"));
inv.setItem(slot,createGuiItem(Material.ORANGE_WOOL, rsp.getString("name"), lore01));
slot++;
}
}
public void CubeTP(Player player, String name) throws SQLException {
SQL.connect();
PreparedStatement ps = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE name = ?");
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
int slot = 9;
if(rs.next()) {
Location loc = new Location(player.getWorld(), rs.getDouble("x"),rs.getDouble("y"),rs.getDouble("z"), 0, 0);
player.teleport(loc);
}
}
protected ItemStack createGuiItem(final Material material, final String name, final String... lore) {
final ItemStack item = new ItemStack(material, 1);
final ItemMeta meta = item.getItemMeta();
// Set the name of the item
meta.setDisplayName(name);
// Set the lore of the item
meta.setLore(Arrays.asList(lore));
item.setItemMeta(meta);
return item;
}
@Override
public void onDisable() {
}
}