Implement getNameUnsafe method to allow an unloaded world's name to be accessed (#1712)

* Implement getNameUnsafe method to allow an unloaded world's name to be accessed
 - Fixes #1671 and #504

* Add javadoc since tag

Co-authored-by: Alexander Brandes <mc.cache@web.de>

Co-authored-by: Alexander Brandes <mc.cache@web.de>
This commit is contained in:
Jordan
2022-05-05 20:39:45 +01:00
committed by GitHub
parent c1b5f8c84a
commit 210ee9f2ef
8 changed files with 63 additions and 7 deletions

View File

@ -15,4 +15,11 @@ public class WorldUnloadedException extends WorldEditException {
super(Caption.of("worldedit.error.world-unloaded"));
}
/**
* Create a new instance.
*/
public WorldUnloadedException(String name) {
super(Caption.of("worldedit.error.named-world-unloaded", name));
}
}

View File

@ -193,19 +193,34 @@ public class BukkitWorld extends AbstractWorld {
* @return the world
*/
protected World getWorldChecked() throws WorldEditException {
World world = worldRef.get();
if (world == null) {
throw new WorldUnloadedException();
World tmp = worldRef.get();
if (tmp == null) {
tmp = Bukkit.getWorld(worldNameRef);
if (tmp != null) {
worldRef = new WeakReference<>(tmp);
}
}
return world;
if (tmp == null) {
throw new WorldUnloadedException(worldNameRef);
}
return tmp;
}
//FAWE end
@Override
public String getName() {
return getWorld().getName();
//FAWE start - Throw WorldUnloadedException rather than NPE when world unloaded and attempted to be accessed
return getWorldChecked().getName();
//FAWE end
}
//FAWE start - allow history to read an unloaded world's name
@Override
public String getNameUnsafe() {
return worldNameRef;
}
//FAWE end
@Override
public String getId() {
return getWorld().getName().replace(" ", "_").toLowerCase(Locale.ROOT);