|
|
|
@ -7,7 +7,6 @@
@@ -7,7 +7,6 @@
|
|
|
|
|
// www.magicbane.com
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package engine.server.world; |
|
|
|
|
|
|
|
|
|
import engine.Enum; |
|
|
|
@ -69,6 +68,8 @@ import static java.lang.System.exit;
@@ -69,6 +68,8 @@ import static java.lang.System.exit;
|
|
|
|
|
public class WorldServer { |
|
|
|
|
|
|
|
|
|
public static int worldMapID = Integer.parseInt(ConfigManager.MB_WORLD_MAPID.getValue()); |
|
|
|
|
public static int worldRealmMap = Integer.parseInt(ConfigManager.MB_WORLD_REALMMAP.getValue()); |
|
|
|
|
|
|
|
|
|
public static int worldUUID = 1; // Root object in database
|
|
|
|
|
public static Enum.AccountStatus worldAccessLevel = Enum.AccountStatus.valueOf(ConfigManager.MB_WORLD_ACCESS_LVL.getValue()); |
|
|
|
|
private static LocalDateTime bootTime = LocalDateTime.now(); |
|
|
|
@ -125,7 +126,7 @@ public class WorldServer {
@@ -125,7 +126,7 @@ public class WorldServer {
|
|
|
|
|
NPC npc = NPC.getFromCache(msg.getObjectID()); |
|
|
|
|
float sellPercent = 1; |
|
|
|
|
|
|
|
|
|
if (npc != null){ |
|
|
|
|
if (npc != null) { |
|
|
|
|
|
|
|
|
|
if (origin.getPlayerCharacter() != null) |
|
|
|
|
sellPercent = npc.getSellPercent(origin.getPlayerCharacter()); |
|
|
|
@ -152,11 +153,8 @@ public class WorldServer {
@@ -152,11 +153,8 @@ public class WorldServer {
|
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void shutdown() { |
|
|
|
|
exit(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static String getUptimeString() { |
|
|
|
|
|
|
|
|
|
String outString = null; |
|
|
|
|
java.time.Duration uptimeDuration; |
|
|
|
|
String newLine = System.getProperty("line.separator"); |
|
|
|
@ -165,7 +163,7 @@ public class WorldServer {
@@ -165,7 +163,7 @@ public class WorldServer {
|
|
|
|
|
outString = "[LUA_UPTIME()]" + newLine; |
|
|
|
|
uptimeDuration = java.time.Duration.between(LocalDateTime.now(), WorldServer.bootTime); |
|
|
|
|
long uptimeSeconds = Math.abs(uptimeDuration.getSeconds()); |
|
|
|
|
String uptime = String.format("%d hours %02d minutes %02d seconds", uptimeSeconds / 3600, (uptimeSeconds % 3600) / 60, (uptimeSeconds % 60)); |
|
|
|
|
String uptime = String.format("%d hours %02d minutes %02d seconds", uptimeSeconds / 3600, (uptimeSeconds % 3600) / 60, (uptimeSeconds % 60)); |
|
|
|
|
outString += "uptime: " + uptime; |
|
|
|
|
outString += " pop: " + SessionManager.getActivePlayerCharacterCount() + " max pop: " + SessionManager._maxPopulation; |
|
|
|
|
} catch (Exception e) { |
|
|
|
@ -174,13 +172,35 @@ public class WorldServer {
@@ -174,13 +172,35 @@ public class WorldServer {
|
|
|
|
|
return outString; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void writePopulationFile() { |
|
|
|
|
|
|
|
|
|
int population = SessionManager.getActivePlayerCharacterCount(); |
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File populationFile = new File(MBServerStatics.DEFAULT_DATA_DIR + ConfigManager.MB_WORLD_NAME.getValue().replaceAll("'", "") + ".pop"); |
|
|
|
|
FileWriter fileWriter; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
fileWriter = new FileWriter(populationFile, false); |
|
|
|
|
fileWriter.write(Integer.toString(population)); |
|
|
|
|
fileWriter.close(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Logger.error(e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int exec() { |
|
|
|
|
|
|
|
|
|
LocalDateTime nextHeartbeatTime = LocalDateTime.now(); |
|
|
|
|
LocalDateTime nextPopulationFileTime = LocalDateTime.now(); |
|
|
|
|
LocalDateTime nextFlashTrashCheckTime = LocalDateTime.now(); |
|
|
|
|
LocalDateTime nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1); |
|
|
|
|
LocalDateTime nextWareHousePushTime = LocalDateTime.now();; |
|
|
|
|
LocalDateTime nextWareHousePushTime = LocalDateTime.now(); |
|
|
|
|
|
|
|
|
|
// Begin execution of main game loop
|
|
|
|
|
|
|
|
|
@ -233,7 +253,7 @@ public class WorldServer {
@@ -233,7 +253,7 @@ public class WorldServer {
|
|
|
|
|
InetAddress addy = InetAddress.getByName(ConfigManager.MB_BIND_ADDR.getValue()); |
|
|
|
|
int port = Integer.parseInt(ConfigManager.MB_WORLD_PORT.getValue()); |
|
|
|
|
|
|
|
|
|
ClientConnectionManager connectionManager = new ClientConnectionManager(name + ".ClientConnMan", addy, |
|
|
|
|
ClientConnectionManager connectionManager = new ClientConnectionManager(name + ".ClientConnMan", addy, |
|
|
|
|
port); |
|
|
|
|
connectionManager.startup(); |
|
|
|
|
|
|
|
|
@ -263,7 +283,6 @@ public class WorldServer {
@@ -263,7 +283,6 @@ public class WorldServer {
|
|
|
|
|
Guild.getErrantGuild(); |
|
|
|
|
|
|
|
|
|
Logger.info("Initializing PowersManager."); |
|
|
|
|
// activate powers manager
|
|
|
|
|
PowersManager.initPowersManager(true); |
|
|
|
|
|
|
|
|
|
Logger.info("Initializing granted Skills for Runes"); |
|
|
|
@ -278,7 +297,6 @@ public class WorldServer {
@@ -278,7 +297,6 @@ public class WorldServer {
|
|
|
|
|
Logger.info("Initializing MeshBounds"); |
|
|
|
|
MeshBounds.InitializeBuildingBounds(); |
|
|
|
|
|
|
|
|
|
// Load ItemBases
|
|
|
|
|
Logger.info("Loading ItemBases"); |
|
|
|
|
ItemBase.loadAllItemBases(); |
|
|
|
|
|
|
|
|
@ -294,6 +312,7 @@ public class WorldServer {
@@ -294,6 +312,7 @@ public class WorldServer {
|
|
|
|
|
// Load new loot system
|
|
|
|
|
Logger.info("Loading New Loot Tables"); |
|
|
|
|
LootManager.loadLootData(); |
|
|
|
|
|
|
|
|
|
//load old loot system (still needed for rolling for now)
|
|
|
|
|
LootTable.populateLootTables(); |
|
|
|
|
RuneBaseAttribute.LoadAllAttributes(); |
|
|
|
@ -307,7 +326,6 @@ public class WorldServer {
@@ -307,7 +326,6 @@ public class WorldServer {
|
|
|
|
|
Logger.info("Loading Mob Powers for MobBases"); |
|
|
|
|
PowersManager.LoadAllMobPowers(); |
|
|
|
|
|
|
|
|
|
//load item enchantment values
|
|
|
|
|
Logger.info("Loading item enchants"); |
|
|
|
|
DbManager.LootQueries.LOAD_ENCHANT_VALUES(); |
|
|
|
|
|
|
|
|
@ -364,18 +382,14 @@ public class WorldServer {
@@ -364,18 +382,14 @@ public class WorldServer {
|
|
|
|
|
SupportMsgType.InitializeSupportMsgType(); |
|
|
|
|
|
|
|
|
|
//Load Buildings, Mobs and NPCs for server
|
|
|
|
|
|
|
|
|
|
getWorldBuildingsMobsNPCs(); |
|
|
|
|
|
|
|
|
|
// Configure realms for serialization
|
|
|
|
|
// Doing this after the world is loaded
|
|
|
|
|
|
|
|
|
|
Logger.info("Configuring realm serialization data"); |
|
|
|
|
|
|
|
|
|
try{ |
|
|
|
|
Realm.configureAllRealms(); |
|
|
|
|
}catch(Exception e){ |
|
|
|
|
Logger.error( e.getMessage()); |
|
|
|
|
} |
|
|
|
|
Realm.configureAllRealms(); |
|
|
|
|
|
|
|
|
|
Logger.info("Loading Mine data."); |
|
|
|
|
Mine.loadAllMines(); |
|
|
|
@ -400,14 +414,16 @@ public class WorldServer {
@@ -400,14 +414,16 @@ public class WorldServer {
|
|
|
|
|
|
|
|
|
|
Logger.info("Loading All Players from database to Server Cache"); |
|
|
|
|
long start = System.currentTimeMillis(); |
|
|
|
|
try{ |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
DbManager.PlayerCharacterQueries.GET_ALL_CHARACTERS(); |
|
|
|
|
}catch(Exception e){ |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
long end = System.currentTimeMillis(); |
|
|
|
|
Logger.info("Loading All Players took " + (end - start) + " ms."); |
|
|
|
|
|
|
|
|
|
Logger.info("Loading All Players took " + (end - start) + " ms."); |
|
|
|
|
|
|
|
|
|
ItemProductionManager.ITEMPRODUCTIONMANAGER.initialize(); |
|
|
|
|
|
|
|
|
@ -444,17 +460,19 @@ public class WorldServer {
@@ -444,17 +460,19 @@ public class WorldServer {
|
|
|
|
|
DispatchMessage.startMessagePump(); |
|
|
|
|
|
|
|
|
|
// Run maintenance
|
|
|
|
|
|
|
|
|
|
MaintenanceManager.dailyMaintenance(); |
|
|
|
|
|
|
|
|
|
// Disabled but kept in case of emergency
|
|
|
|
|
Logger.info("Starting Orphan Item Purge"); |
|
|
|
|
PurgeOprhans.startPurgeThread(); |
|
|
|
|
|
|
|
|
|
// Open/Close mines for the current window
|
|
|
|
|
|
|
|
|
|
Logger.info("Processing mine window."); |
|
|
|
|
HourlyJobThread.processMineWindow(); |
|
|
|
|
|
|
|
|
|
// Calculate bootstrap time and rest boot time to current time.
|
|
|
|
|
|
|
|
|
|
java.time.Duration bootDuration = java.time.Duration.between(LocalDateTime.now(), bootTime); |
|
|
|
|
long bootSeconds = Math.abs(bootDuration.getSeconds()); |
|
|
|
|
String boottime = String.format("%d hours %02d minutes %02d seconds", bootSeconds / 3600, (bootSeconds % 3600) / 60, (bootSeconds % 60)); |
|
|
|
@ -467,15 +485,16 @@ public class WorldServer {
@@ -467,15 +485,16 @@ public class WorldServer {
|
|
|
|
|
System.gc(); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected boolean initDatabaselayer() { |
|
|
|
|
|
|
|
|
|
// Try starting a GOM <-> DB connection.
|
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
Logger.info("Configuring GameObjectManager to use Database: '" |
|
|
|
|
+ ConfigManager.MB_DATABASE_NAME.getValue() + "' on " |
|
|
|
|
+ ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':' |
|
|
|
|
+ ConfigManager.MB_DATABASE_PORT.getValue()); |
|
|
|
|
+ ConfigManager.MB_DATABASE_NAME.getValue() + "' on " |
|
|
|
|
+ ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':' |
|
|
|
|
+ ConfigManager.MB_DATABASE_PORT.getValue()); |
|
|
|
|
|
|
|
|
|
DbManager.configureConnectionPool(); |
|
|
|
|
|
|
|
|
@ -493,7 +512,6 @@ public class WorldServer {
@@ -493,7 +512,6 @@ public class WorldServer {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void getWorldBuildingsMobsNPCs() { |
|
|
|
|
|
|
|
|
|
ArrayList<Zone> rootParent; |
|
|
|
@ -521,10 +539,10 @@ public class WorldServer {
@@ -521,10 +539,10 @@ public class WorldServer {
|
|
|
|
|
try { |
|
|
|
|
ZoneManager.addZone(zone.getLoadNum(), zone); |
|
|
|
|
|
|
|
|
|
try{ |
|
|
|
|
try { |
|
|
|
|
zone.generateWorldAltitude(); |
|
|
|
|
}catch(Exception e){ |
|
|
|
|
Logger.error( e.getMessage()); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Logger.error(e.getMessage()); |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -539,7 +557,7 @@ public class WorldServer {
@@ -539,7 +557,7 @@ public class WorldServer {
|
|
|
|
|
b.setObjectTypeMask(MBServerStatics.MASK_BUILDING); |
|
|
|
|
b.setLoc(b.getLoc()); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Logger.error( b.getObjectUUID() + " returned an Error Message :" + e.getMessage()); |
|
|
|
|
Logger.error(b.getObjectUUID() + " returned an Error Message :" + e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -551,9 +569,9 @@ public class WorldServer {
@@ -551,9 +569,9 @@ public class WorldServer {
|
|
|
|
|
m.setObjectTypeMask(MBServerStatics.MASK_MOB | m.getTypeMasks()); |
|
|
|
|
m.setLoc(m.getLoc()); |
|
|
|
|
|
|
|
|
|
//ADD GUARDS HERE.
|
|
|
|
|
//ADD GUARDS HERE.
|
|
|
|
|
if (m.building != null && m.building.getBlueprint() != null && m.building.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK) |
|
|
|
|
DbManager.MobQueries.LOAD_PATROL_POINTS(m); |
|
|
|
|
DbManager.MobQueries.LOAD_PATROL_POINTS(m); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Handle npc's
|
|
|
|
@ -572,7 +590,7 @@ public class WorldServer {
@@ -572,7 +590,7 @@ public class WorldServer {
|
|
|
|
|
n.setObjectTypeMask(MBServerStatics.MASK_NPC); |
|
|
|
|
n.setLoc(n.getLoc()); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Logger.error( n.getObjectUUID() + " returned an Error Message :" + e.getMessage()); |
|
|
|
|
Logger.error(n.getObjectUUID() + " returned an Error Message :" + e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -648,7 +666,7 @@ public class WorldServer {
@@ -648,7 +666,7 @@ public class WorldServer {
|
|
|
|
|
|
|
|
|
|
//send update to friends that you are logged off.
|
|
|
|
|
|
|
|
|
|
PlayerFriends.SendFriendsStatus(playerCharacter,false); |
|
|
|
|
PlayerFriends.SendFriendsStatus(playerCharacter, false); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -688,43 +706,20 @@ public class WorldServer {
@@ -688,43 +706,20 @@ public class WorldServer {
|
|
|
|
|
if (group != null) |
|
|
|
|
GroupManager.LeaveGroup(player); |
|
|
|
|
} catch (MsgSendException e) { |
|
|
|
|
Logger.error( e.toString()); |
|
|
|
|
Logger.error(e.toString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
player.respawnLock.writeLock().lock(); |
|
|
|
|
try{ |
|
|
|
|
try { |
|
|
|
|
if (!player.isAlive()) |
|
|
|
|
player.respawn(false, false, true); |
|
|
|
|
}catch(Exception e){ |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Logger.error(e); |
|
|
|
|
}finally{ |
|
|
|
|
} finally { |
|
|
|
|
player.respawnLock.writeLock().unlock(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void writePopulationFile() { |
|
|
|
|
|
|
|
|
|
int population = SessionManager.getActivePlayerCharacterCount(); |
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File populationFile = new File(MBServerStatics.DEFAULT_DATA_DIR + ConfigManager.MB_WORLD_NAME.getValue().replaceAll("'","") + ".pop"); |
|
|
|
|
FileWriter fileWriter; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
fileWriter = new FileWriter(populationFile, false); |
|
|
|
|
fileWriter.write(Integer.toString(population)); |
|
|
|
|
fileWriter.close(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
}catch(Exception e){ |
|
|
|
|
Logger.error(e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void processTrashFile() { |
|
|
|
|
|
|
|
|
|
ArrayList<String> machineList; |
|
|
|
@ -742,7 +737,7 @@ try {
@@ -742,7 +737,7 @@ try {
|
|
|
|
|
|
|
|
|
|
// Build list of trash characters associated with that machineID
|
|
|
|
|
|
|
|
|
|
for (String machineID:machineList) { |
|
|
|
|
for (String machineID : machineList) { |
|
|
|
|
trashList = DbManager.AccountQueries.GET_ALL_CHARS_FOR_MACHINE(machineID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -784,7 +779,7 @@ try {
@@ -784,7 +779,7 @@ try {
|
|
|
|
|
// server cache file by now.
|
|
|
|
|
|
|
|
|
|
Timer timer = new Timer("Disconnect Trash"); |
|
|
|
|
timer.schedule(new DisconnectTrashTask( trashList ), 3000L); |
|
|
|
|
timer.schedule(new DisconnectTrashTask(trashList), 3000L); |
|
|
|
|
|
|
|
|
|
// Clean up after ourselves
|
|
|
|
|
|
|
|
|
@ -795,7 +790,7 @@ try {
@@ -795,7 +790,7 @@ try {
|
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void processFlashFile() { |
|
|
|
|
|
|
|
|
@ -823,8 +818,8 @@ try {
@@ -823,8 +818,8 @@ try {
|
|
|
|
|
if (flashString == "") |
|
|
|
|
flashString = "Rebooting for to fix bug."; |
|
|
|
|
|
|
|
|
|
Logger.info( "Sending flash from external interface"); |
|
|
|
|
Logger.info( "Msg: " + flashString); |
|
|
|
|
Logger.info("Sending flash from external interface"); |
|
|
|
|
Logger.info("Msg: " + flashString); |
|
|
|
|
|
|
|
|
|
ChatSystemMsg msg = new ChatSystemMsg(null, flashString); |
|
|
|
|
msg.setChannel(engine.Enum.ChatChannelType.FLASH.getChannelID()); |
|
|
|
|