// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.workthreads; import engine.Enum; import engine.gameManager.*; 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; import static engine.server.MBServerStatics.MINE_LATE_WINDOW; public class HourlyJobThread implements Runnable { public HourlyJobThread() { } public static void decayShrines() { ArrayList shrineList = new ArrayList<>(); for (Shrine shrine : Shrine.shrinesByBuildingUUID.values()) { try { Building shrineBuilding = (Building) DbManager.getObject(Enum.GameObjectType.Building, shrine.getBuildingID()); if (shrineBuilding == null) continue; if (shrineBuilding.getOwner().equals(shrineBuilding.getCity().getOwner()) == false) shrineBuilding.claim(shrineBuilding.getCity().getOwner()); } catch (Exception e) { Logger.info("Shrine " + shrine.getBuildingID() + " Error " + e); } } // Grab list of top two shrines of each type for (Shrine shrine : Shrine.shrinesByBuildingUUID.values()) { if (shrine.getRank() == 0 || shrine.getRank() == 1) shrineList.add(shrine); } Logger.info("Decaying " + shrineList.size() + " shrines..."); // Top 2 shrines decay by 10% a day for (Shrine shrine : shrineList) { try { shrine.decay(); } catch (Exception e) { Logger.info("Shrine " + shrine.getBuildingID() + " Error " + e); } } } public void run() { // *** REFACTOR: TRY TRY TRY TRY {{{{{{{{{{{ OMG //Logger.info("Hourly job is now running."); //processMineWindow(); // Reset time-gated access to WOO slider. // *** Do this after the mines open/close! if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW) { Guild guild; for (AbstractGameObject dbObject : DbManager.getList(Enum.GameObjectType.Guild)) { guild = (Guild) dbObject; if (guild != null) guild.wooWasModified = false; } } // Mines can only be claimed once per cycle. // This will reset at 1am after the last mine // window closes. if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW + 1) { for (Mine mine : Mine.getMines()) { if (mine.wasClaimed == true) mine.wasClaimed = false; } } // Decay Shrines at midnight every day //if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW) // decayShrines(); // 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"); } }