// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.workthreads; import engine.Enum; import engine.gameManager.DbManager; import engine.gameManager.SimulationManager; import engine.gameManager.ZoneManager; import engine.net.MessageDispatcher; import engine.objects.*; import engine.server.world.WorldServer; import org.pmw.tinylog.Logger; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; public class HourlyJobThread implements Runnable { private static int hotzoneCount = 0; public HourlyJobThread() { } public void run() { // *** REFACTOR: TRY TRY TRY TRY {{{{{{{{{{{ OMG Logger.info("Hourly job is now running."); try { ZoneManager.generateAndSetRandomHotzone(); Zone hotzone = ZoneManager.getHotZone(); if (hotzone == null) { Logger.error( "Null hotzone returned from mapmanager"); } else { Logger.info( "new hotzone: " + hotzone.getName()); WorldServer.setLastHZChange(System.currentTimeMillis()); } } catch (Exception e) { Logger.error( e.toString()); } // Open or Close mines for the current mine window. processMineWindow(); for (Mine mine : Mine.getMines()) { try { mine.depositMineResources(); } catch (Exception e) { Logger.info(e.getMessage() + " for Mine " + mine.getObjectUUID()); } } // Update city population values ConcurrentHashMap map = DbManager.getMap(Enum.GameObjectType.City); if (map != null) { for (AbstractGameObject ago : map.values()){ City city = (City)ago; if (city != null) if (city.getGuild() != null) { ArrayList guildList = Guild.GuildRoster(city.getGuild()); city.setPopulation(guildList.size()); } } City.lastCityUpdate = System.currentTimeMillis(); } else { Logger.error("missing city map"); } // Log metrics to console Logger.info( WorldServer.getUptimeString()); Logger.info( SimulationManager.getPopulationString()); Logger.info( MessageDispatcher.getNetstatString()); Logger.info(PurgeOprhans.recordsDeleted.toString() + "orphaned items deleted"); } public static void processMineWindow() { try { ArrayList mines = Mine.getMines(); for (Mine mine : mines) { try { // Mines can only be claimed once a cycle. // The cycle resets at 01:00hrs after the // Last mine window closes. if (mine.wasClaimed == true) { if (LocalDateTime.now().getHour() == 01) mine.wasClaimed = false; continue; } // Open Errant Mines if (mine.getOwningGuild().isErrant()) { mine.handleStartMineWindow(); Mine.setLastChange(System.currentTimeMillis()); continue; } // Open Mines with a current guild hour if (mine.getOwningGuild().getNation().getMineTime() == LocalDateTime.now().getHour()) { mine.handleStartMineWindow(); Mine.setLastChange(System.currentTimeMillis()); continue; } // Close all other mines if (mine.handleEndMineWindow()) Mine.setLastChange(System.currentTimeMillis()); } catch (Exception e) { Logger.error ("mineID: " + mine.getObjectUUID(), e.toString()); } } } catch (Exception e) { Logger.error( e.toString()); } } }