116 lines
4.2 KiB
Java
116 lines
4.2 KiB
Java
package games.dmg.spigottyrant;
|
|
|
|
import java.io.IOException;
|
|
import java.time.Clock;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.logging.Level;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
|
|
public final class SpigotTyrantPlugin extends JavaPlugin {
|
|
private PluginSettings settings;
|
|
private TyrantStateManager stateManager;
|
|
private TyrantPresentation tyrantPresentation;
|
|
|
|
@Override
|
|
public void onEnable() {
|
|
saveDefaultConfig();
|
|
try {
|
|
Map<String, Object> values = getConfig().getValues(false);
|
|
settings = PluginSettingsValidator.validate(PluginSettings.from(values));
|
|
stateManager = new TyrantStateManager(
|
|
new YamlTyrantStateRepository(getDataFolder().toPath().resolve("state.yml")),
|
|
getLogger()
|
|
);
|
|
} catch (IllegalArgumentException | IOException exception) {
|
|
getLogger().log(Level.SEVERE, "Could not initialize Spigot Tyrant", exception);
|
|
getServer().getPluginManager().disablePlugin(this);
|
|
return;
|
|
}
|
|
|
|
Clock clock = Clock.systemUTC();
|
|
RoleCandidateSelector candidateSelector = new RoleCandidateSelector();
|
|
java.util.random.RandomGenerator random = java.util.random.RandomGenerator.getDefault();
|
|
TyrantSuccessionService succession = new TyrantSuccessionService(
|
|
candidateSelector,
|
|
settings.candidateActivityWindow(),
|
|
settings.pendingSelectionTimeout(),
|
|
random
|
|
);
|
|
tyrantPresentation = new BukkitTyrantPresentation(getServer());
|
|
ManagedRoleEffects managedEffects = new BukkitManagedRoleEffects(
|
|
stateManager, tyrantPresentation
|
|
);
|
|
managedEffects.restoreAll();
|
|
Objects.requireNonNull(getCommand("tyrant"), "Missing tyrant command metadata")
|
|
.setExecutor(new TyrantCommand(stateManager, new TyrantProgressionService()));
|
|
Objects.requireNonNull(getCommand("tyrantadmin"), "Missing tyrantadmin metadata")
|
|
.setExecutor(new TyrantAdminCommand(
|
|
stateManager,
|
|
new GameLifecycleService(),
|
|
new BukkitOnlinePlayerDirectory(),
|
|
managedEffects,
|
|
clock,
|
|
candidateSelector,
|
|
settings.candidateActivityWindow(),
|
|
settings.pendingSelectionTimeout(),
|
|
random
|
|
));
|
|
getServer().getPluginManager().registerEvents(
|
|
new PlayerJoinListener(stateManager, clock, tyrantPresentation),
|
|
this
|
|
);
|
|
getServer().getPluginManager().registerEvents(
|
|
new TyrantDeathListener(
|
|
stateManager, succession, tyrantPresentation, getServer(), clock
|
|
),
|
|
this
|
|
);
|
|
RoleMaintenanceService maintenance = new RoleMaintenanceService(
|
|
candidateSelector,
|
|
succession,
|
|
settings.roleInactivity(),
|
|
settings.candidateActivityWindow(),
|
|
settings.pendingSelectionTimeout(),
|
|
random
|
|
);
|
|
long maintenanceTicks = Math.max(
|
|
1L, Math.multiplyExact(settings.selectionRetryInterval().toSeconds(), 20L)
|
|
);
|
|
getServer().getScheduler().runTaskTimer(
|
|
this,
|
|
new RoleMaintenanceTask(
|
|
stateManager, maintenance, tyrantPresentation, getServer(), clock
|
|
),
|
|
maintenanceTicks,
|
|
maintenanceTicks
|
|
);
|
|
getServer().getScheduler().runTaskTimer(this, stateManager::saveIfDirty, 600L, 600L);
|
|
getLogger().info("Spigot Tyrant enabled.");
|
|
}
|
|
|
|
@Override
|
|
public void onDisable() {
|
|
if (tyrantPresentation != null) {
|
|
tyrantPresentation.clear();
|
|
}
|
|
if (stateManager != null) {
|
|
stateManager.saveIfDirty();
|
|
}
|
|
}
|
|
|
|
PluginSettings settings() {
|
|
if (settings == null) {
|
|
throw new IllegalStateException("Plugin settings are unavailable");
|
|
}
|
|
return settings;
|
|
}
|
|
|
|
TyrantStateManager stateManager() {
|
|
if (stateManager == null) {
|
|
throw new IllegalStateException("State manager is unavailable");
|
|
}
|
|
return stateManager;
|
|
}
|
|
}
|