Compare commits
7 Commits
2f64eb5ed0
...
6c2e06afaf
Author | SHA1 | Date | |
---|---|---|---|
|
6c2e06afaf | ||
|
b54af93d4b | ||
|
1168b8859a | ||
|
b8ed619b1c | ||
|
1ab17c1ab6 | ||
|
fdc17aad0f | ||
|
bf18c82d6d |
@ -7,10 +7,7 @@ import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.InvalidPropertiesFormatException;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.*;
|
||||
|
||||
public class Function {
|
||||
public static String serialiseBlockLocation(Location loc){
|
||||
@ -129,6 +126,9 @@ public class Function {
|
||||
Material.STONE_SLAB,
|
||||
Material.WARPED_SLAB
|
||||
);
|
||||
public static Block searchForMaterial(Location startLoc, Vector searchDirection, Material searchMaterial){
|
||||
return searchForMaterial(startLoc, searchDirection, searchMaterial, new ArrayList<>());
|
||||
}
|
||||
public static Block searchForMaterial(Location startLoc, Vector searchDirection, Material searchMaterial, List<Material> ignoreMaterials){
|
||||
Location loc = new Location(startLoc.getWorld(), startLoc.getBlockX(), startLoc.getBlockY(), startLoc.getBlockZ());
|
||||
for(int i=0; loc.getBlockY()>=0 && loc.getBlockY()<=255; loc.add(searchDirection)){
|
||||
|
@ -25,8 +25,6 @@ public class Main extends JavaPlugin {
|
||||
|
||||
public static Logger log;
|
||||
|
||||
public static LinkedBeaconTeleporterManager lbtManager;
|
||||
|
||||
public void onEnable() {
|
||||
log = getLogger();
|
||||
|
||||
@ -42,13 +40,15 @@ public class Main extends JavaPlugin {
|
||||
|
||||
loadConfigs();
|
||||
|
||||
lbtManager = new LinkedBeaconTeleporterManager();
|
||||
LinkedBeaconTeleporterManager.init();
|
||||
|
||||
log.info("Plugin activated");
|
||||
}
|
||||
|
||||
public void onDisable() {
|
||||
|
||||
LinkedBeaconTeleporterManager.saveData();
|
||||
|
||||
log.info("Plugin deactivated");
|
||||
}
|
||||
|
||||
@ -70,4 +70,15 @@ public class Main extends JavaPlugin {
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
}
|
||||
}
|
||||
|
||||
public static void saveData() {
|
||||
// data.yml
|
||||
try{
|
||||
File dataFile = new File("plugins/"+ plugin.getName() +"/data.yml");
|
||||
data.save(dataFile);
|
||||
}catch (Exception ex){
|
||||
log.severe("Could not save data.yml!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,6 @@ package eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.InvalidObjectException;
|
||||
|
||||
public class CustomPlayerMoveEvent {
|
||||
|
||||
Player p;
|
||||
|
@ -27,7 +27,7 @@ public abstract class LinkedBeaconTeleporter {
|
||||
this.teleporterId = teleporterId;
|
||||
|
||||
// Check if id exists
|
||||
linkedBeaconTeleporters = Main.lbtManager.placedLBTsById.get(this.teleporterId());
|
||||
linkedBeaconTeleporters = LinkedBeaconTeleporterManager.placedLBTsById.get(this.teleporterId());
|
||||
if(linkedBeaconTeleporters == null){
|
||||
// Create empty if not found
|
||||
linkedBeaconTeleporters = new ArrayList<>();
|
||||
|
@ -31,12 +31,21 @@ public class LinkedBeaconTeleporterBlock extends LinkedBeaconTeleporter {
|
||||
e.setDropItems(false);
|
||||
e.setExpToDrop(0);
|
||||
|
||||
// Notify Player when link was destroyed
|
||||
if(this.linkedBeaconTeleporters.size()-1 != 2){
|
||||
e.getPlayer().sendMessage("§cConnection to Teleporter with id §7"+ this.teleporterId +" §e("+
|
||||
(int)((LinkedBeaconTeleporterBlock)this.linkedBeaconTeleporters.get(0)).block.getLocation().distance(
|
||||
((LinkedBeaconTeleporterBlock)this.linkedBeaconTeleporters.get(1)).block().getLocation()
|
||||
)
|
||||
+" Blocks away) §cdestroyed");
|
||||
}
|
||||
|
||||
// Remove from list
|
||||
this.linkedBeaconTeleporters.remove(this);
|
||||
// TODO: Remove from placedLBTsById when empty?
|
||||
|
||||
// Remove from loc
|
||||
Main.lbtManager.placedLBTByLoc.remove(
|
||||
LinkedBeaconTeleporterManager.placedLBTByLoc.remove(
|
||||
Function.serialiseBlockLocation(loc)
|
||||
);
|
||||
|
||||
@ -50,24 +59,15 @@ public class LinkedBeaconTeleporterBlock extends LinkedBeaconTeleporter {
|
||||
lbtItem.item()
|
||||
);
|
||||
|
||||
// Notify Player when link was destroyed
|
||||
if(this.linkedBeaconTeleporters.size() < 2){
|
||||
e.getPlayer().sendMessage("§cConnection to Teleporter with id §7"+ this.teleporterId +" §e("+
|
||||
(int)((LinkedBeaconTeleporterBlock)this.linkedBeaconTeleporters.get(0)).block.getLocation().distance(
|
||||
((LinkedBeaconTeleporterBlock)this.linkedBeaconTeleporters.get(1)).block().getLocation()
|
||||
)
|
||||
+" Blocks away) §cdestroyed");
|
||||
}
|
||||
|
||||
return lbtItem;
|
||||
}
|
||||
|
||||
|
||||
// Conversion methods
|
||||
public static LinkedBeaconTeleporterBlock getFromLocation(Location loc){
|
||||
return Main.lbtManager.getLbtBlockFromLocation(loc);
|
||||
return LinkedBeaconTeleporterManager.getLbtBlockFromLocation(loc);
|
||||
}
|
||||
public static List<LinkedBeaconTeleporter> getListFromTeleportId(String teleportId){
|
||||
return Main.lbtManager.getLbtBlocksFromTeleportId(teleportId);
|
||||
return LinkedBeaconTeleporterManager.getLbtBlocksFromTeleportId(teleportId);
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ public class LinkedBeaconTeleporterItem extends LinkedBeaconTeleporter {
|
||||
// Create a new LinkedBeaconTeleporter
|
||||
super();
|
||||
|
||||
this.item = Main.lbtManager.getItemStackFromData(this.teleporterId);
|
||||
this.item = LinkedBeaconTeleporterManager.getItemStackFromData(this.teleporterId);
|
||||
}
|
||||
public LinkedBeaconTeleporterItem(String teleporterId, ItemStack item) {
|
||||
super(teleporterId);
|
||||
@ -34,7 +34,7 @@ public class LinkedBeaconTeleporterItem extends LinkedBeaconTeleporter {
|
||||
public LinkedBeaconTeleporterItem(String teleporterId){
|
||||
super(teleporterId);
|
||||
|
||||
this.item = Main.lbtManager.getItemStackFromData(teleporterId);
|
||||
this.item = LinkedBeaconTeleporterManager.getItemStackFromData(teleporterId);
|
||||
}
|
||||
|
||||
public ItemStack item(){
|
||||
@ -60,17 +60,17 @@ public class LinkedBeaconTeleporterItem extends LinkedBeaconTeleporter {
|
||||
this.linkedBeaconTeleporters.add(lbtBlock);
|
||||
|
||||
// Add to id if not exists
|
||||
if(!Main.lbtManager.placedLBTsById.containsKey(this.teleporterId))
|
||||
Main.lbtManager.placedLBTsById.put(this.teleporterId, this.linkedBeaconTeleporters);
|
||||
if(!LinkedBeaconTeleporterManager.placedLBTsById.containsKey(this.teleporterId))
|
||||
LinkedBeaconTeleporterManager.placedLBTsById.put(this.teleporterId, this.linkedBeaconTeleporters);
|
||||
|
||||
// Add to location
|
||||
Main.lbtManager.placedLBTByLoc.put(
|
||||
LinkedBeaconTeleporterManager.placedLBTByLoc.put(
|
||||
Function.serialiseBlockLocation(loc),
|
||||
lbtBlock
|
||||
);
|
||||
|
||||
// Notify Player when no other teleporter was found (yet?)
|
||||
if(this.linkedBeaconTeleporters.size() == 2){
|
||||
if(this.linkedBeaconTeleporters.size() == 1){
|
||||
e.getPlayer().sendMessage("§6No other Teleporter found with with id §7"+ this.teleporterId);
|
||||
}
|
||||
// Notify Player when we have a full link
|
||||
@ -88,6 +88,6 @@ public class LinkedBeaconTeleporterItem extends LinkedBeaconTeleporter {
|
||||
|
||||
// Conversion methods
|
||||
public static LinkedBeaconTeleporterItem getFromItemStack(ItemStack itemStack){
|
||||
return Main.lbtManager.getLbtItemFromItemStack(itemStack);
|
||||
return LinkedBeaconTeleporterManager.getLbtItemFromItemStack(itemStack);
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.ShapelessRecipe;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@ -19,13 +19,13 @@ import java.util.regex.Pattern;
|
||||
public class LinkedBeaconTeleporterManager {
|
||||
// Stores all placed Beacon-Teleporters for fast access
|
||||
// TODO: Evaluate necessity of 2 HashMaps with main reason of performance
|
||||
public HashMap<String, List<LinkedBeaconTeleporter>> placedLBTsById = new HashMap();
|
||||
public HashMap<String, LinkedBeaconTeleporterBlock> placedLBTByLoc = new HashMap();
|
||||
public static HashMap<String, List<LinkedBeaconTeleporter>> placedLBTsById = new HashMap();
|
||||
public static HashMap<String, LinkedBeaconTeleporterBlock> placedLBTByLoc = new HashMap();
|
||||
|
||||
// Regex to match item-name&lore and extract id (group 1)
|
||||
String regex;
|
||||
static String regex;
|
||||
|
||||
public LinkedBeaconTeleporterManager(){
|
||||
public static void init(){
|
||||
Main.log.info("Loading LinkedBeaconTeleporter from config..");
|
||||
|
||||
// Construct search item-regex
|
||||
@ -39,21 +39,19 @@ public class LinkedBeaconTeleporterManager {
|
||||
|
||||
// Load teleporters
|
||||
for(String teleporterId : Main.data.getKeys(false)){
|
||||
ConfigurationSection teleportersData = Main.data.getConfigurationSection(teleporterId);
|
||||
List<String> serialisedLocs = Main.data.getStringList(teleporterId);
|
||||
|
||||
// New list for this id
|
||||
List<LinkedBeaconTeleporter> linkedBeaconTeleporters = new ArrayList();
|
||||
|
||||
for(String blockId : teleportersData.getKeys(false)) {
|
||||
ConfigurationSection teleporterData = teleportersData.getConfigurationSection(blockId);
|
||||
for(String serializedLoc : serialisedLocs) {
|
||||
|
||||
// Load location
|
||||
String serializedLoc = teleporterData.getString("loc");
|
||||
Location loc;
|
||||
try {
|
||||
loc = Function.deserializeBlockLocation(teleporterData.getString("loc"));
|
||||
loc = Function.deserializeBlockLocation(serializedLoc);
|
||||
} catch (InvalidPropertiesFormatException e) {
|
||||
Main.log.severe("Could not load location='"+ serializedLoc +"' from "+ teleporterId +" > "+ blockId);
|
||||
Main.log.severe("Could not load location='"+ serializedLoc +"' from "+ teleporterId);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -61,7 +59,7 @@ public class LinkedBeaconTeleporterManager {
|
||||
Block block = loc.getBlock();
|
||||
if(block.getType() != Material.BEACON){
|
||||
// Data out of sync! Skipping
|
||||
Main.log.warning(teleporterId +" > "+ blockId +" at location "+ serializedLoc +" changed and is no longer LinkedBlockTeleporter! (Changed without the plugin running?)");
|
||||
Main.log.warning(teleporterId +" at location "+ serializedLoc +" changed and is no longer LinkedBlockTeleporter! (Changed without the plugin running?)");
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -81,7 +79,32 @@ public class LinkedBeaconTeleporterManager {
|
||||
Main.log.info("All done!");
|
||||
}
|
||||
|
||||
void constructAndAddRecipes(){
|
||||
public static void saveData(){
|
||||
Main.log.info("Saving data..");
|
||||
|
||||
Main.data = new YamlConfiguration();
|
||||
for(String teleporterId : placedLBTsById.keySet()){
|
||||
List<LinkedBeaconTeleporter> LBTs = placedLBTsById.get(teleporterId);
|
||||
|
||||
// Generate clean array with data we want
|
||||
List<String> dataList = new ArrayList<>();
|
||||
for(LinkedBeaconTeleporter lbt : LBTs){
|
||||
dataList.add(
|
||||
Function.serialiseBlockLocation(
|
||||
((LinkedBeaconTeleporterBlock)lbt).block().getLocation()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Main.data.set(teleporterId, dataList);
|
||||
}
|
||||
|
||||
Main.saveData();
|
||||
|
||||
Main.log.info("done");
|
||||
}
|
||||
|
||||
static void constructAndAddRecipes(){
|
||||
// Create result-item
|
||||
ItemStack item = getItemStackFromData("-");
|
||||
item.setAmount(2);
|
||||
@ -103,7 +126,7 @@ public class LinkedBeaconTeleporterManager {
|
||||
}
|
||||
|
||||
// Conversion-methods
|
||||
public ItemStack getItemStackFromData(String teleporterId){
|
||||
public static ItemStack getItemStackFromData(String teleporterId){
|
||||
ItemStack item = new ItemStack(Material.BEACON);
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
|
||||
@ -127,7 +150,7 @@ public class LinkedBeaconTeleporterManager {
|
||||
|
||||
return item;
|
||||
}
|
||||
public LinkedBeaconTeleporterItem getLbtItemFromItemStack(ItemStack itemStack){
|
||||
public static LinkedBeaconTeleporterItem getLbtItemFromItemStack(ItemStack itemStack){
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
|
||||
// Serialize
|
||||
@ -151,17 +174,17 @@ public class LinkedBeaconTeleporterManager {
|
||||
return lbtItem;
|
||||
}
|
||||
|
||||
public LinkedBeaconTeleporterBlock getLbtBlockFromLocation(Location loc){
|
||||
public static LinkedBeaconTeleporterBlock getLbtBlockFromLocation(Location loc){
|
||||
// Serialize
|
||||
String serializedLoc = Function.serialiseBlockLocation(loc);
|
||||
|
||||
return placedLBTByLoc.get(serializedLoc);
|
||||
}
|
||||
public List<LinkedBeaconTeleporter> getLbtBlocksFromTeleportId(String teleportId){
|
||||
public static List<LinkedBeaconTeleporter> getLbtBlocksFromTeleportId(String teleportId){
|
||||
return placedLBTsById.get(teleportId);
|
||||
}
|
||||
|
||||
String constructRegex(String name, List<String> lore){
|
||||
static String constructRegex(String name, List<String> lore){
|
||||
// Serialize
|
||||
String regex = serialiseBeaconItem(name, lore);
|
||||
|
||||
@ -175,7 +198,7 @@ public class LinkedBeaconTeleporterManager {
|
||||
|
||||
return regex;
|
||||
}
|
||||
String serialiseBeaconItem(String name, List<String> lore){
|
||||
static String serialiseBeaconItem(String name, List<String> lore){
|
||||
// get name and remove control-chars
|
||||
String str = name.replace("\\", "\\\\");
|
||||
if(lore != null){
|
||||
|
@ -2,6 +2,7 @@ package eu.ruekov.ruakij.LinkedBeaconTeleporters.listener;
|
||||
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.Main;
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.linkedBeaconTeleporter.LinkedBeaconTeleporterItem;
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.linkedBeaconTeleporter.LinkedBeaconTeleporterManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@ -21,7 +22,7 @@ public class OnCraftItemEvent implements Listener {
|
||||
ItemStack itemResult = recipe.getResult();
|
||||
|
||||
// Check if it has LinkedBeaconTeleporter-Data
|
||||
LinkedBeaconTeleporterItem lbtItem = Main.lbtManager.getLbtItemFromItemStack(itemResult);
|
||||
LinkedBeaconTeleporterItem lbtItem = LinkedBeaconTeleporterManager.getLbtItemFromItemStack(itemResult);
|
||||
|
||||
// Ignore if not found
|
||||
if(lbtItem == null) return;
|
||||
|
@ -6,6 +6,7 @@ import eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent.CustomPlay
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent.CustomPlayerMoveEventListener;
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.linkedBeaconTeleporter.LinkedBeaconTeleporter;
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.linkedBeaconTeleporter.LinkedBeaconTeleporterBlock;
|
||||
import eu.ruekov.ruakij.LinkedBeaconTeleporters.linkedBeaconTeleporter.LinkedBeaconTeleporterManager;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
@ -57,7 +58,7 @@ public class OnCustomPlayerMove implements CustomPlayerMoveEventListener {
|
||||
// TODO: Check if beacon is active
|
||||
|
||||
// Check if beacon is a LinkedBeaconTeleporter
|
||||
LinkedBeaconTeleporterBlock lbtBlock = Main.lbtManager.getLbtBlockFromLocation(block.getLocation());
|
||||
LinkedBeaconTeleporterBlock lbtBlock = LinkedBeaconTeleporterManager.getLbtBlockFromLocation(block.getLocation());
|
||||
|
||||
// Ignore if not found
|
||||
if(lbtBlock == null) return;
|
||||
@ -84,9 +85,16 @@ public class OnCustomPlayerMove implements CustomPlayerMoveEventListener {
|
||||
// Set player as ignored on target-LinkedBeaconTeleporter (so he wont trigger the teleport again)
|
||||
playerBeaconLocation.put(uuid, lbtBlockPartner);
|
||||
|
||||
// Get safe-location on top of other beacon
|
||||
Block safeBlock = Function.searchForMaterial(
|
||||
lbtBlockPartner.block().getLocation().add(0, 1, 0),
|
||||
new Vector(0, 1, 0),
|
||||
Material.AIR
|
||||
);
|
||||
|
||||
// Teleport
|
||||
e.player().teleport(
|
||||
lbtBlockPartner.block().getLocation().add(0.5, 1, 0.5)
|
||||
safeBlock.getLocation().add(0.5, 0, 0.5)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user