ProjectAres/PGM/src/main/java/tc/oc/pgm/PGM.java

219 lines
7.7 KiB
Java

package tc.oc.pgm;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.inject.Provider;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import tc.oc.api.util.Permissions;
import tc.oc.commons.bukkit.inject.BukkitPluginManifest;
import tc.oc.commons.bukkit.inventory.Slot;
import tc.oc.commons.bukkit.logging.MapdevLogger;
import tc.oc.commons.bukkit.teleport.NavigatorInterface;
import tc.oc.commons.core.commands.CommandRegistry;
import tc.oc.inject.ProtectedBinder;
import tc.oc.minecraft.logging.BetterRaven;
import tc.oc.pgm.antigrief.CraftingProtect;
import tc.oc.pgm.commands.MapCommands;
import tc.oc.pgm.commands.PollCommands;
import tc.oc.pgm.commands.RotationControlCommands;
import tc.oc.pgm.commands.RotationEditCommands;
import tc.oc.pgm.events.ConfigLoadEvent;
import tc.oc.pgm.ffa.FreeForAllCommands;
import tc.oc.pgm.fireworks.ObjectivesFireworkListener;
import tc.oc.pgm.goals.GoalCommands;
import tc.oc.pgm.listeners.FormattingListener;
import tc.oc.pgm.listeners.ItemTransferListener;
import tc.oc.pgm.logging.MapTagger;
import tc.oc.pgm.map.MapLibrary;
import tc.oc.pgm.map.MapNotFoundException;
import tc.oc.pgm.mapratings.MapRatingsCommands;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchLoader;
import tc.oc.pgm.match.MatchManager;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.menu.gui.SettingMenuHelper;
import tc.oc.pgm.pollablemaps.PollableMaps;
import tc.oc.pgm.polls.PollListener;
import tc.oc.pgm.polls.PollManager;
import tc.oc.pgm.start.StartCommands;
import tc.oc.pgm.tablist.MatchTabManager;
import tc.oc.pgm.timelimit.TimeLimitCommands;
import tc.oc.pgm.tokens.gui.MainTokenButton;
import static com.google.common.base.Preconditions.checkState;
public final class PGM extends JavaPlugin {
private static PGM pgm;
public PGM() {
checkState(pgm == null);
pgm = this;
}
public static PGM get() { return pgm; }
@Override
public void configure(ProtectedBinder binder) {
binder.install(new BukkitPluginManifest());
binder.install(new PGMManifest());
}
@Inject private CommandRegistry commands;
@Inject private MapLibrary mapLibrary;
@Inject private Optional<BetterRaven> raven;
@Inject private MapdevLogger mapdevLogger;
@Inject private NavigatorInterface navigatorInterface;
@Inject private Provider<MatchLoader> matchLoader;
private MatchManager matchManager;
public static MatchManager getMatchManager() {
return pgm == null ? null : pgm.matchManager;
}
public static MatchManager needMatchManager() {
MatchManager mm = getMatchManager();
if(mm == null) {
throw new IllegalStateException("PGMMatchManager is not available");
}
return mm;
}
public Logger getRootMapLogger() {
return mapdevLogger;
}
private PollManager pollManager;
public static PollManager getPollManager() {
return pgm == null ? null : pgm.pollManager;
}
private PollableMaps pollableMaps;
public static PollableMaps getPollableMaps() {
return pgm == null ? null : pgm.pollableMaps;
}
public MapLibrary getMapLibrary() {
return mapLibrary;
}
private MatchTabManager matchTabManager;
private void setupSentry() {
// Tag Sentry events with the current map
raven.ifPresent(raven -> raven.addHelper(new MapTagger(matchManager)));
}
@Override
public void onEnable() {
matchManager = injector().getInstance(MatchManager.class);
getServer().getConsoleSender().addAttachment(this, Permissions.MAPDEV, true);
getServer().getConsoleSender().addAttachment(this, Permissions.MAPERRORS, true);
// Create objects that listen for config changes
Config.PlayerList.register();
// Copy the default configuration
this.getConfig().options().copyDefaults(true);
this.saveConfig();
this.reloadConfig();
this.setupSentry();
this.setupCommands();
try {
matchManager.loadNewMaps();
} catch(MapNotFoundException e) {
this.getLogger().log(Level.SEVERE, "PGM could not load any maps, server will shut down", e);
this.getServer().shutdown();
return;
}
this.pollManager = new PollManager(this);
this.pollableMaps = new PollableMaps();
this.registerListeners();
// cycle match in 0 ticks so it loads after other plugins are done
this.getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
if(PGM.this.matchManager.cycleToNext(null, true, true) == null) {
getLogger().severe("Failed to load an initial match, shutting down");
getServer().shutdown();
}
}, 0);
if(Config.Broadcast.periodic()) {
// periodically notify people of what map they're playing
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
@Override
public void run() {
Match match = matchLoader.get().getCurrentMatch();
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_PURPLE + PGMTranslations.get().t("broadcast.currentlyPlaying", Bukkit.getConsoleSender(), match.getMap().getInfo().getShortDescription(Bukkit.getConsoleSender()) + ChatColor.DARK_PURPLE));
for (MatchPlayer player : match.getPlayers()) {
player.sendMessage(ChatColor.DARK_PURPLE + PGMTranslations.t("broadcast.currentlyPlaying", player, match.getMap().getInfo().getShortDescription(player.getBukkit()) + ChatColor.DARK_PURPLE));
}
}
}, 20, Config.Broadcast.frequency() * 20);
}
if(Config.PlayerList.enabled()) {
this.matchTabManager = new MatchTabManager(this);
this.matchTabManager.enable();
}
// Would rather configure this with a Guice binding, but we can't as long as
// PGM modules are installed on lobby servers, because the bindings will conflict.
navigatorInterface.setOpenButtonSlot(Slot.Hotbar.forPosition(7));
new MainTokenButton();
SettingMenuHelper.initializeSettings();
}
@Override
public void onDisable() {
if(this.matchTabManager != null) {
this.matchTabManager.disable();
this.matchTabManager = null;
}
matchLoader.get().unloadAllMatches();
}
@Override
public void reloadConfig() {
super.reloadConfig();
this.getServer().getPluginManager().callEvent(new ConfigLoadEvent(this.getConfig()));
}
private void setupCommands() {
commands.register(MapCommands.class);
commands.register(PollCommands.class);
commands.register(RotationEditCommands.RotationEditParent.class);
commands.register(RotationControlCommands.RotationControlParent.class);
commands.register(TimeLimitCommands.class);
commands.register(MapRatingsCommands.class);
commands.register(GoalCommands.class);
commands.register(StartCommands.class);
commands.register(FreeForAllCommands.Parent.class);
}
private void registerListeners() {
this.registerEvents(new PollListener(this.pollManager, this.matchManager));
this.registerEvents(new FormattingListener());
this.registerEvents(new CraftingProtect());
this.registerEvents(new ObjectivesFireworkListener());
this.registerEvents(new ItemTransferListener());
}
public void registerEvents(Listener listener) {
this.getServer().getPluginManager().registerEvents(listener, this);
}
}