Skip to content

Commit ae030eb

Browse files
authored
Merge branch 'master' into develop
2 parents 76e0bad + f87603d commit ae030eb

File tree

1 file changed

+391
-0
lines changed

1 file changed

+391
-0
lines changed

src/main/java/world/bentobox/level/Level.java

+391
Original file line numberDiff line numberDiff line change
@@ -447,4 +447,395 @@ public VisitAddon getVisitHook() {
447447
public Warp getWarpHook() {
448448
return this.warpHook;
449449
}
450+
=======
451+
// The 10 in top ten
452+
public static final int TEN = 10;
453+
454+
// Settings
455+
private ConfigSettings settings;
456+
private Config<ConfigSettings> configObject = new Config<>(this, ConfigSettings.class);
457+
private BlockConfig blockConfig;
458+
private Pipeliner pipeliner;
459+
private LevelsManager manager;
460+
private boolean stackersEnabled;
461+
private boolean advChestEnabled;
462+
private boolean roseStackersEnabled;
463+
private boolean ultimateStackerEnabled;
464+
private final List<GameModeAddon> registeredGameModes = new ArrayList<>();
465+
466+
/**
467+
* Local variable that stores if warpHook is present.
468+
*/
469+
private Warp warpHook;
470+
471+
/**
472+
* Local variable that stores if visitHook is present.
473+
*/
474+
private VisitAddon visitHook;
475+
476+
477+
@Override
478+
public void onLoad() {
479+
// Save the default config from config.yml
480+
saveDefaultConfig();
481+
if (loadSettings()) {
482+
// Disable
483+
logError("Level settings could not load! Addon disabled.");
484+
setState(State.DISABLED);
485+
} else {
486+
configObject.saveConfigObject(settings);
487+
}
488+
489+
// Save existing panels.
490+
this.saveResource("panels/top_panel.yml", false);
491+
this.saveResource("panels/detail_panel.yml", false);
492+
this.saveResource("panels/value_panel.yml", false);
493+
}
494+
495+
private boolean loadSettings() {
496+
// Load settings again to get worlds
497+
settings = configObject.loadConfigObject();
498+
499+
return settings == null;
500+
}
501+
502+
@Override
503+
public void onEnable() {
504+
loadBlockSettings();
505+
// Start pipeline
506+
pipeliner = new Pipeliner(this);
507+
// Start Manager
508+
manager = new LevelsManager(this);
509+
// Register listeners
510+
this.registerListener(new IslandActivitiesListeners(this));
511+
this.registerListener(new JoinLeaveListener(this));
512+
this.registerListener(new MigrationListener(this));
513+
514+
// Register commands for GameModes
515+
registeredGameModes.clear();
516+
getPlugin().getAddonsManager().getGameModeAddons().stream()
517+
.filter(gm -> !settings.getGameModes().contains(gm.getDescription().getName()))
518+
.forEach(gm -> {
519+
log("Level hooking into " + gm.getDescription().getName());
520+
registerCommands(gm);
521+
new PlaceholderManager(this).registerPlaceholders(gm);
522+
registeredGameModes.add(gm);
523+
});
524+
// Register request handlers
525+
registerRequestHandler(new LevelRequestHandler(this));
526+
registerRequestHandler(new TopTenRequestHandler(this));
527+
528+
// Check if WildStackers is enabled on the server
529+
// I only added support for counting blocks into the island level
530+
// Someone else can PR if they want spawners added to the Leveling system :)
531+
stackersEnabled = Bukkit.getPluginManager().isPluginEnabled("WildStacker");
532+
if (stackersEnabled) {
533+
log("Hooked into WildStackers.");
534+
}
535+
// Check if AdvancedChests is enabled on the server
536+
Plugin advChest = Bukkit.getPluginManager().getPlugin("AdvancedChests");
537+
advChestEnabled = advChest != null;
538+
if (advChestEnabled) {
539+
// Check version
540+
if (compareVersions(advChest.getDescription().getVersion(), "23.0") > 0) {
541+
log("Hooked into AdvancedChests.");
542+
} else {
543+
logError("Could not hook into AdvancedChests " + advChest.getDescription().getVersion() + " - requires version 23.0 or later");
544+
advChestEnabled = false;
545+
}
546+
}
547+
// Check if RoseStackers is enabled
548+
roseStackersEnabled = Bukkit.getPluginManager().isPluginEnabled("RoseStacker");
549+
if (roseStackersEnabled) {
550+
log("Hooked into RoseStackers.");
551+
}
552+
553+
// Check if UltimateStacker is enabled
554+
ultimateStackerEnabled = Bukkit.getPluginManager().isPluginEnabled("UltimateStacker");
555+
if (ultimateStackerEnabled) {
556+
log("Hooked into UltimateStacker.");
557+
}
558+
}
559+
560+
@Override
561+
public void allLoaded()
562+
{
563+
super.allLoaded();
564+
565+
if (this.isEnabled())
566+
{
567+
this.hookExtensions();
568+
}
569+
}
570+
571+
572+
/**
573+
* This method tries to hook into addons and plugins
574+
*/
575+
private void hookExtensions()
576+
{
577+
// Try to find Visit addon and if it does not exist, display a warning
578+
this.getAddonByName("Visit").ifPresentOrElse(addon ->
579+
{
580+
this.visitHook = (VisitAddon) addon;
581+
this.log("Level Addon hooked into Visit addon.");
582+
}, () -> this.visitHook = null);
583+
584+
// Try to find Warps addon and if it does not exist, display a warning
585+
this.getAddonByName("Warps").ifPresentOrElse(addon ->
586+
{
587+
this.warpHook = (Warp) addon;
588+
this.log("Level Addon hooked into Warps addon.");
589+
}, () -> this.warpHook = null);
590+
}
591+
592+
593+
/**
594+
* Compares versions
595+
* @param version1 version 1
596+
* @param version2 version 2
597+
* @return {@code <0 if version 1 is older than version 2, =0 if the same, >0 if version 1 is newer than version 2}
598+
*/
599+
public static int compareVersions(String version1, String version2) {
600+
int comparisonResult = 0;
601+
602+
String[] version1Splits = version1.split("\\.");
603+
String[] version2Splits = version2.split("\\.");
604+
int maxLengthOfVersionSplits = Math.max(version1Splits.length, version2Splits.length);
605+
606+
for (int i = 0; i < maxLengthOfVersionSplits; i++){
607+
Integer v1 = i < version1Splits.length ? Integer.parseInt(version1Splits[i]) : 0;
608+
Integer v2 = i < version2Splits.length ? Integer.parseInt(version2Splits[i]) : 0;
609+
int compare = v1.compareTo(v2);
610+
if (compare != 0) {
611+
comparisonResult = compare;
612+
break;
613+
}
614+
}
615+
return comparisonResult;
616+
}
617+
618+
private void registerCommands(GameModeAddon gm) {
619+
gm.getAdminCommand().ifPresent(adminCommand -> {
620+
new AdminLevelCommand(this, adminCommand);
621+
new AdminTopCommand(this, adminCommand);
622+
new AdminLevelStatusCommand(this, adminCommand);
623+
if (getSettings().isZeroNewIslandLevels()) {
624+
new AdminSetInitialLevelCommand(this, adminCommand);
625+
}
626+
});
627+
gm.getPlayerCommand().ifPresent(playerCmd -> {
628+
new IslandLevelCommand(this, playerCmd);
629+
new IslandTopCommand(this, playerCmd);
630+
new IslandValueCommand(this, playerCmd);
631+
});
632+
}
633+
634+
@Override
635+
public void onDisable() {
636+
// Stop the pipeline
637+
this.getPipeliner().stop();
638+
}
639+
640+
private void loadBlockSettings() {
641+
// Save the default blockconfig.yml
642+
this.saveResource("blockconfig.yml", false);
643+
644+
YamlConfiguration blockValues = new YamlConfiguration();
645+
try {
646+
File file = new File(this.getDataFolder(), "blockconfig.yml");
647+
blockValues.load(file);
648+
// Load the block config class
649+
blockConfig = new BlockConfig(this, blockValues, file);
650+
} catch (IOException | InvalidConfigurationException e) {
651+
// Disable
652+
logError("Level blockconfig.yml settings could not load! Addon disabled.");
653+
setState(State.DISABLED);
654+
}
655+
656+
}
657+
658+
659+
/**
660+
* @return the blockConfig
661+
*/
662+
public BlockConfig getBlockConfig() {
663+
return blockConfig;
664+
}
665+
666+
/**
667+
* @return the settings
668+
*/
669+
public ConfigSettings getSettings() {
670+
return settings;
671+
}
672+
673+
/**
674+
* @return the pipeliner
675+
*/
676+
public Pipeliner getPipeliner() {
677+
return pipeliner;
678+
}
679+
680+
/**
681+
* @return the manager
682+
*/
683+
public LevelsManager getManager() {
684+
return manager;
685+
}
686+
687+
/**
688+
* Set the config settings - used for tests only
689+
* @param configSettings - config settings
690+
*/
691+
void setSettings(ConfigSettings configSettings) {
692+
this.settings = configSettings;
693+
694+
}
695+
696+
/**
697+
* @return the stackersEnabled
698+
*/
699+
public boolean isStackersEnabled() {
700+
return stackersEnabled;
701+
}
702+
703+
/**
704+
* @return the advChestEnabled
705+
*/
706+
public boolean isAdvChestEnabled() {
707+
return advChestEnabled;
708+
}
709+
710+
/**
711+
* Get level from cache for a player.
712+
* @param targetPlayer - target player UUID
713+
* @return Level of player or zero if player is unknown or UUID is null
714+
*/
715+
public long getIslandLevel(World world, @Nullable UUID targetPlayer) {
716+
return getManager().getIslandLevel(world, targetPlayer);
717+
}
718+
719+
/**
720+
* Sets the player's level to a value
721+
* @param world - world
722+
* @param targetPlayer - target player
723+
* @param level - level
724+
*/
725+
public void setIslandLevel(World world, UUID targetPlayer, long level) {
726+
getManager().setIslandLevel(world, targetPlayer, level);
727+
}
728+
729+
/**
730+
* Zeros the initial island level
731+
* @param island - island
732+
* @param level - initial calculated island level
733+
*/
734+
public void setInitialIslandLevel(@NonNull Island island, long level) {
735+
getManager().setInitialIslandLevel(island, level);
736+
}
737+
738+
/**
739+
* Get the initial island level
740+
* @param island - island
741+
* @return level or 0 by default
742+
*/
743+
public long getInitialIslandLevel(@NonNull Island island) {
744+
return getManager().getInitialLevel(island);
745+
}
746+
747+
/**
748+
* Calculates a user's island
749+
* @param world - the world where this island is
750+
* @param user - not used! See depecration message
751+
* @param playerUUID - the target island member's UUID
752+
* @deprecated Do not use this anymore. Use getManager().calculateLevel(playerUUID, island)
753+
*/
754+
@Deprecated(since="2.3.0", forRemoval=true)
755+
public void calculateIslandLevel(World world, @Nullable User user, @NonNull UUID playerUUID) {
756+
Island island = getIslands().getIsland(world, playerUUID);
757+
if (island != null) getManager().calculateLevel(playerUUID, island);
758+
}
759+
760+
/**
761+
* Provide the levels data for the target player
762+
* @param targetPlayer - UUID of target player
763+
* @return LevelsData object or null if not found. Only island levels are set!
764+
* @deprecated Do not use this anymore. Use {@link #getIslandLevel(World, UUID)}
765+
*/
766+
@Deprecated(since="2.3.0", forRemoval=true)
767+
public LevelsData getLevelsData(UUID targetPlayer) {
768+
LevelsData ld = new LevelsData(targetPlayer);
769+
getPlugin().getAddonsManager().getGameModeAddons().stream()
770+
.filter(gm -> !settings.getGameModes().contains(gm.getDescription().getName()))
771+
.forEach(gm -> {
772+
if (getSettings().isZeroNewIslandLevels()) {
773+
Island island = getIslands().getIsland(gm.getOverWorld(), targetPlayer);
774+
if (island != null) {
775+
ld.setInitialLevel(gm.getOverWorld(), this.getInitialIslandLevel(island));
776+
}
777+
}
778+
ld.setLevel(gm.getOverWorld(), this.getIslandLevel(gm.getOverWorld(), targetPlayer));
779+
});
780+
return ld;
781+
}
782+
783+
/**
784+
* @return the registeredGameModes
785+
*/
786+
public List<GameModeAddon> getRegisteredGameModes() {
787+
return registeredGameModes;
788+
}
789+
790+
/**
791+
* Check if Level addon is active in game mode
792+
* @param gm Game Mode Addon
793+
* @return true if active, false if not
794+
*/
795+
public boolean isRegisteredGameMode(GameModeAddon gm) {
796+
return registeredGameModes.contains(gm);
797+
}
798+
799+
/**
800+
* Checks if Level addon is active in world
801+
* @param world world
802+
* @return true if active, false if not
803+
*/
804+
public boolean isRegisteredGameModeWorld(World world) {
805+
return registeredGameModes.stream().map(GameModeAddon::getOverWorld).anyMatch(w -> Util.sameWorld(world, w));
806+
}
807+
808+
/**
809+
* @return the roseStackersEnabled
810+
*/
811+
public boolean isRoseStackersEnabled() {
812+
return roseStackersEnabled;
813+
}
814+
815+
/**
816+
* @return the ultimateStackerEnabled
817+
*/
818+
public boolean isUltimateStackerEnabled() {
819+
return ultimateStackerEnabled;
820+
}
821+
822+
/**
823+
* Method Level#getVisitHook returns the visitHook of this object.
824+
*
825+
* @return {@code Visit} of this object, {@code null} otherwise.
826+
*/
827+
public VisitAddon getVisitHook()
828+
{
829+
return this.visitHook;
830+
}
831+
832+
/**
833+
* Method Level#getWarpHook returns the warpHook of this object.
834+
*
835+
* @return {@code Warp} of this object, {@code null} otherwise.
836+
*/
837+
public Warp getWarpHook()
838+
{
839+
return this.warpHook;
840+
}
450841
}

0 commit comments

Comments
 (0)