Compare commits

...

12 Commits

Author SHA1 Message Date
Ruakij
8485e34756 Added config-option beacon 2021-05-11 12:50:16 +02:00
Ruakij
7e6601d56d Implemented config-option id 2021-05-11 12:46:03 +02:00
Ruakij
982190b730 Implemented config-option locationCheck 2021-05-11 12:42:42 +02:00
Ruakij
4626646292 Implemented config-option autosave 2021-05-11 12:41:09 +02:00
Ruakij
e82de277ef Added config-options 2021-05-11 12:39:34 +02:00
Ruakij
28658329a8 Save on shutdown added 2021-05-11 12:08:00 +02:00
Ruakij
ac810349ac Fixed saving not working 2021-05-11 11:48:39 +02:00
Ruakij
2a713d269e Delete list when empty 2021-05-11 11:45:06 +02:00
Ruakij
b20e0a03fd Added Autosave 2021-05-11 11:42:46 +02:00
Ruakij
5a1c809d89 Changed save-system 2021-05-11 11:42:05 +02:00
Ruakij
ef9643c2ae Fixed loading not writing blocks to list 2021-05-11 11:30:01 +02:00
Ruakij
c732aa31b1 Set player to ignore-list if teleport didnt succeed 2021-05-11 11:10:24 +02:00
7 changed files with 81 additions and 21 deletions

View File

@ -35,19 +35,20 @@ public class Main extends JavaPlugin {
pluginManager.registerEvents(new OnBlockPlace(), this);
pluginManager.registerEvents(new OnCraftItemEvent(), this);
CustomPlayerMoveEventHandler cpmHandler = new CustomPlayerMoveEventHandler(this, true);
cpmHandler.registerListener(new OnCustomPlayerMove());
loadConfigs();
CustomPlayerMoveEventHandler cpmHandler = new CustomPlayerMoveEventHandler(this, config.getInt("locationCheck.interval"), true);
cpmHandler.registerListener(new OnCustomPlayerMove());
LinkedBeaconTeleporterManager.init();
initAutoSave();
log.info("Plugin activated");
}
public void onDisable() {
LinkedBeaconTeleporterManager.saveData();
saveData();
log.info("Plugin deactivated");
}
@ -72,6 +73,14 @@ public class Main extends JavaPlugin {
}
public static void saveData(){
boolean lbtDataChanged = LinkedBeaconTeleporterManager.writeData();
// Only run save, when data changed
if(lbtDataChanged)
saveFiles();
}
public static void saveFiles() {
// data.yml
try{
File dataFile = new File("plugins/"+ plugin.getName() +"/data.yml");
@ -81,4 +90,12 @@ public class Main extends JavaPlugin {
ex.printStackTrace();
}
}
static void initAutoSave(){
int autosaveInterval = config.getInt("config.interval")*20;
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
saveData();
}, autosaveInterval, autosaveInterval);
}
}

View File

@ -17,16 +17,16 @@ public class CustomPlayerMoveEventHandler {
HashMap<UUID, Location> oldPlayerLoc = new HashMap<>();
boolean locationChangeOnBlockChange;
public CustomPlayerMoveEventHandler(Plugin plugin, boolean locationChangeOnBlockChange){
public CustomPlayerMoveEventHandler(Plugin plugin, int interval, boolean locationChangeOnBlockChange){
this.locationChangeOnBlockChange = locationChangeOnBlockChange;
startRunnable(plugin);
startRunnable(plugin, interval);
}
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, () -> {
// Dont do anything without listeners
@ -64,7 +64,7 @@ public class CustomPlayerMoveEventHandler {
oldPlayerLoc.put(uuid, loc);
}
}, 20, 10);
}, interval, interval);
}
boolean blockLocationChanged(Location loc, Location oldLoc){

View File

@ -11,6 +11,8 @@ import java.util.List;
* Describes a placed-beacon-teleporter in the world
*/
public abstract class LinkedBeaconTeleporter {
static String id_alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
static int id_length = 10;
// Persistent id for linked-beacons
public String teleporterId;
@ -19,7 +21,7 @@ public abstract class LinkedBeaconTeleporter {
protected List<LinkedBeaconTeleporter> linkedBeaconTeleporters = new ArrayList<>();
LinkedBeaconTeleporter(){
this.teleporterId = Function.randomString("abcdefghijklmnopqrstuvwxyz0123456789", 10);
this.teleporterId = Function.randomString(id_alphabet, id_length);
linkedBeaconTeleporters = new ArrayList<>();
}

View File

@ -42,7 +42,13 @@ public class LinkedBeaconTeleporterBlock extends LinkedBeaconTeleporter {
// Remove from list
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
LinkedBeaconTeleporterManager.placedLBTByLoc.remove(

View File

@ -34,6 +34,10 @@ public class LinkedBeaconTeleporterManager {
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
constructAndAddRecipes();
@ -68,6 +72,8 @@ public class LinkedBeaconTeleporterManager {
// Write reference of list
lbtBlock.linkedBeaconTeleporters = linkedBeaconTeleporters;
// Write block to list
linkedBeaconTeleporters.add(lbtBlock);
// Save to loc-list
placedLBTByLoc.put(serializedLoc, lbtBlock);
}
@ -76,11 +82,21 @@ public class LinkedBeaconTeleporterManager {
placedLBTsById.put(teleporterId, linkedBeaconTeleporters);
}
Main.saveData();
Main.log.info("All done!");
}
public static void saveData(){
Main.log.info("Saving data..");
static int oldDataHashCode;
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();
for(String teleporterId : placedLBTsById.keySet()){
@ -98,10 +114,7 @@ public class LinkedBeaconTeleporterManager {
Main.data.set(teleporterId, dataList);
}
Main.saveData();
Main.log.info("done");
return true;
}
static void constructAndAddRecipes(){

View File

@ -95,6 +95,7 @@ public class OnCustomPlayerMove implements CustomPlayerMoveEventListener {
if(safeBlock == null){
// No safe location found
p.sendMessage("§cNo safe-location found at target teleporter");
playerBeaconLocation.put(uuid, lbtBlock);
return;
}
// TODO: Check if there is enough space for a player

View File

@ -1,7 +1,28 @@
item: # TODO
item:
# Name & Lore for linked-beacon-blocks
# - Has to include %id% somewhere for identification!
name: '§9BeaconTeleporter'
lore:
- '§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