Compare commits
12 Commits
51c9ee0716
...
8485e34756
Author | SHA1 | Date | |
---|---|---|---|
|
8485e34756 | ||
|
7e6601d56d | ||
|
982190b730 | ||
|
4626646292 | ||
|
e82de277ef | ||
|
28658329a8 | ||
|
ac810349ac | ||
|
2a713d269e | ||
|
b20e0a03fd | ||
|
5a1c809d89 | ||
|
ef9643c2ae | ||
|
c732aa31b1 |
@ -35,19 +35,20 @@ public class Main extends JavaPlugin {
|
|||||||
pluginManager.registerEvents(new OnBlockPlace(), this);
|
pluginManager.registerEvents(new OnBlockPlace(), this);
|
||||||
pluginManager.registerEvents(new OnCraftItemEvent(), this);
|
pluginManager.registerEvents(new OnCraftItemEvent(), this);
|
||||||
|
|
||||||
CustomPlayerMoveEventHandler cpmHandler = new CustomPlayerMoveEventHandler(this, true);
|
|
||||||
cpmHandler.registerListener(new OnCustomPlayerMove());
|
|
||||||
|
|
||||||
loadConfigs();
|
loadConfigs();
|
||||||
|
|
||||||
|
CustomPlayerMoveEventHandler cpmHandler = new CustomPlayerMoveEventHandler(this, config.getInt("locationCheck.interval"), true);
|
||||||
|
cpmHandler.registerListener(new OnCustomPlayerMove());
|
||||||
|
|
||||||
LinkedBeaconTeleporterManager.init();
|
LinkedBeaconTeleporterManager.init();
|
||||||
|
|
||||||
|
initAutoSave();
|
||||||
|
|
||||||
log.info("Plugin activated");
|
log.info("Plugin activated");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
|
saveData();
|
||||||
LinkedBeaconTeleporterManager.saveData();
|
|
||||||
|
|
||||||
log.info("Plugin deactivated");
|
log.info("Plugin deactivated");
|
||||||
}
|
}
|
||||||
@ -72,6 +73,14 @@ public class Main extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void saveData(){
|
public static void saveData(){
|
||||||
|
boolean lbtDataChanged = LinkedBeaconTeleporterManager.writeData();
|
||||||
|
|
||||||
|
// Only run save, when data changed
|
||||||
|
if(lbtDataChanged)
|
||||||
|
saveFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveFiles() {
|
||||||
// data.yml
|
// data.yml
|
||||||
try{
|
try{
|
||||||
File dataFile = new File("plugins/"+ plugin.getName() +"/data.yml");
|
File dataFile = new File("plugins/"+ plugin.getName() +"/data.yml");
|
||||||
@ -81,4 +90,12 @@ public class Main extends JavaPlugin {
|
|||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void initAutoSave(){
|
||||||
|
int autosaveInterval = config.getInt("config.interval")*20;
|
||||||
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
|
||||||
|
saveData();
|
||||||
|
|
||||||
|
}, autosaveInterval, autosaveInterval);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,16 +17,16 @@ public class CustomPlayerMoveEventHandler {
|
|||||||
HashMap<UUID, Location> oldPlayerLoc = new HashMap<>();
|
HashMap<UUID, Location> oldPlayerLoc = new HashMap<>();
|
||||||
|
|
||||||
boolean locationChangeOnBlockChange;
|
boolean locationChangeOnBlockChange;
|
||||||
public CustomPlayerMoveEventHandler(Plugin plugin, boolean locationChangeOnBlockChange){
|
public CustomPlayerMoveEventHandler(Plugin plugin, int interval, boolean locationChangeOnBlockChange){
|
||||||
this.locationChangeOnBlockChange = locationChangeOnBlockChange;
|
this.locationChangeOnBlockChange = locationChangeOnBlockChange;
|
||||||
|
|
||||||
startRunnable(plugin);
|
startRunnable(plugin, interval);
|
||||||
}
|
}
|
||||||
public CustomPlayerMoveEventHandler(Plugin plugin){
|
public CustomPlayerMoveEventHandler(Plugin plugin){
|
||||||
this(plugin, false);
|
this(plugin, 5, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void startRunnable(Plugin plugin){
|
void startRunnable(Plugin plugin, int interval){
|
||||||
|
|
||||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
|
||||||
// Dont do anything without listeners
|
// Dont do anything without listeners
|
||||||
@ -64,7 +64,7 @@ public class CustomPlayerMoveEventHandler {
|
|||||||
oldPlayerLoc.put(uuid, loc);
|
oldPlayerLoc.put(uuid, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
}, 20, 10);
|
}, interval, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean blockLocationChanged(Location loc, Location oldLoc){
|
boolean blockLocationChanged(Location loc, Location oldLoc){
|
||||||
|
@ -11,6 +11,8 @@ import java.util.List;
|
|||||||
* Describes a placed-beacon-teleporter in the world
|
* Describes a placed-beacon-teleporter in the world
|
||||||
*/
|
*/
|
||||||
public abstract class LinkedBeaconTeleporter {
|
public abstract class LinkedBeaconTeleporter {
|
||||||
|
static String id_alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
static int id_length = 10;
|
||||||
|
|
||||||
// Persistent id for linked-beacons
|
// Persistent id for linked-beacons
|
||||||
public String teleporterId;
|
public String teleporterId;
|
||||||
@ -19,7 +21,7 @@ public abstract class LinkedBeaconTeleporter {
|
|||||||
protected List<LinkedBeaconTeleporter> linkedBeaconTeleporters = new ArrayList<>();
|
protected List<LinkedBeaconTeleporter> linkedBeaconTeleporters = new ArrayList<>();
|
||||||
|
|
||||||
LinkedBeaconTeleporter(){
|
LinkedBeaconTeleporter(){
|
||||||
this.teleporterId = Function.randomString("abcdefghijklmnopqrstuvwxyz0123456789", 10);
|
this.teleporterId = Function.randomString(id_alphabet, id_length);
|
||||||
|
|
||||||
linkedBeaconTeleporters = new ArrayList<>();
|
linkedBeaconTeleporters = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,13 @@ public class LinkedBeaconTeleporterBlock extends LinkedBeaconTeleporter {
|
|||||||
|
|
||||||
// Remove from list
|
// Remove from list
|
||||||
this.linkedBeaconTeleporters.remove(this);
|
this.linkedBeaconTeleporters.remove(this);
|
||||||
// TODO: Remove from placedLBTsById when empty?
|
|
||||||
|
if(this.linkedBeaconTeleporters.size() == 0){
|
||||||
|
// List empty, delete from placedLBTsById
|
||||||
|
LinkedBeaconTeleporterManager.placedLBTsById.remove(
|
||||||
|
this.teleporterId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Remove from loc
|
// Remove from loc
|
||||||
LinkedBeaconTeleporterManager.placedLBTByLoc.remove(
|
LinkedBeaconTeleporterManager.placedLBTByLoc.remove(
|
||||||
|
@ -34,6 +34,10 @@ public class LinkedBeaconTeleporterManager {
|
|||||||
Main.config.getStringList("item.lore")
|
Main.config.getStringList("item.lore")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Load settings
|
||||||
|
LinkedBeaconTeleporter.id_alphabet = Main.config.getString("id.alphabet");
|
||||||
|
LinkedBeaconTeleporter.id_length = Main.config.getInt("id.length");
|
||||||
|
|
||||||
// Construct & add crafting-receipes
|
// Construct & add crafting-receipes
|
||||||
constructAndAddRecipes();
|
constructAndAddRecipes();
|
||||||
|
|
||||||
@ -68,6 +72,8 @@ public class LinkedBeaconTeleporterManager {
|
|||||||
// Write reference of list
|
// Write reference of list
|
||||||
lbtBlock.linkedBeaconTeleporters = linkedBeaconTeleporters;
|
lbtBlock.linkedBeaconTeleporters = linkedBeaconTeleporters;
|
||||||
|
|
||||||
|
// Write block to list
|
||||||
|
linkedBeaconTeleporters.add(lbtBlock);
|
||||||
// Save to loc-list
|
// Save to loc-list
|
||||||
placedLBTByLoc.put(serializedLoc, lbtBlock);
|
placedLBTByLoc.put(serializedLoc, lbtBlock);
|
||||||
}
|
}
|
||||||
@ -76,11 +82,21 @@ public class LinkedBeaconTeleporterManager {
|
|||||||
placedLBTsById.put(teleporterId, linkedBeaconTeleporters);
|
placedLBTsById.put(teleporterId, linkedBeaconTeleporters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Main.saveData();
|
||||||
|
|
||||||
Main.log.info("All done!");
|
Main.log.info("All done!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveData(){
|
static int oldDataHashCode;
|
||||||
Main.log.info("Saving data..");
|
public static boolean writeData(){
|
||||||
|
// Check if data changed
|
||||||
|
int dataHashCode = placedLBTsById.hashCode();
|
||||||
|
if(oldDataHashCode != dataHashCode){
|
||||||
|
// Changed
|
||||||
|
oldDataHashCode = dataHashCode;
|
||||||
|
}
|
||||||
|
else // Did not change
|
||||||
|
return false;
|
||||||
|
|
||||||
Main.data = new YamlConfiguration();
|
Main.data = new YamlConfiguration();
|
||||||
for(String teleporterId : placedLBTsById.keySet()){
|
for(String teleporterId : placedLBTsById.keySet()){
|
||||||
@ -98,10 +114,7 @@ public class LinkedBeaconTeleporterManager {
|
|||||||
|
|
||||||
Main.data.set(teleporterId, dataList);
|
Main.data.set(teleporterId, dataList);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
Main.saveData();
|
|
||||||
|
|
||||||
Main.log.info("done");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constructAndAddRecipes(){
|
static void constructAndAddRecipes(){
|
||||||
|
@ -95,6 +95,7 @@ public class OnCustomPlayerMove implements CustomPlayerMoveEventListener {
|
|||||||
if(safeBlock == null){
|
if(safeBlock == null){
|
||||||
// No safe location found
|
// No safe location found
|
||||||
p.sendMessage("§cNo safe-location found at target teleporter");
|
p.sendMessage("§cNo safe-location found at target teleporter");
|
||||||
|
playerBeaconLocation.put(uuid, lbtBlock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Check if there is enough space for a player
|
// TODO: Check if there is enough space for a player
|
||||||
|
@ -1,7 +1,28 @@
|
|||||||
|
|
||||||
item: # TODO
|
item:
|
||||||
# Name & Lore for linked-beacon-blocks
|
# Name & Lore for linked-beacon-blocks
|
||||||
# - Has to include %id% somewhere for identification!
|
# - Has to include %id% somewhere for identification!
|
||||||
name: '§9BeaconTeleporter'
|
name: '§9BeaconTeleporter'
|
||||||
lore:
|
lore:
|
||||||
- '§8§o%id%'
|
- '§8§o%id%'
|
||||||
|
|
||||||
|
beacon:
|
||||||
|
# Checks that have to succeed for a teleporter to be active (source and target)
|
||||||
|
checks: # TODO
|
||||||
|
active: true
|
||||||
|
|
||||||
|
id:
|
||||||
|
# Alphabet to use for random-generation
|
||||||
|
alphabet: 'abcdefghijklmnopqrstuvwxyz0123456789'
|
||||||
|
# Length of id
|
||||||
|
# If its too short, ids will "collide" more often (e.g. 2 players generating same linked-teleporters independently), but maybe thats a gameplay-feature for you :)
|
||||||
|
length: 10
|
||||||
|
|
||||||
|
locationCheck:
|
||||||
|
# Interval [in ticks] to check if a player is on a beacon
|
||||||
|
# 5 (= 4 times/s) is usually responsive enough for most interactions
|
||||||
|
interval: 5
|
||||||
|
|
||||||
|
autosave:
|
||||||
|
# Interval [in seconds] for autosave
|
||||||
|
interval: 600
|
Loading…
x
Reference in New Issue
Block a user