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 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);
}
} }

View File

@ -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){

View File

@ -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<>();
} }

View File

@ -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(

View File

@ -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(){

View File

@ -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

View File

@ -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