#MUDPyE - (M)ulti-(U)ser (D)imension (Py)thon (E)ngine #Copyright (C) 2005 Corey Staten #This program is free software; you can redistribute it and/or #modify it under the terms of the GNU General Public License #as published by the Free Software Foundation; either version 2 #of the License, or (at your option) any later version. #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #Send feedback/questions to MUDPyE@gmail.com import sys import time import mptraceback import mpdatabase import mpcallback import mploader import mplog import mpserver from mpmudobject import Ex #World Properties File Keys: # SourceBackupPath - Backup path for the source database. # ObjectBackupPath - Backup path for the object database. # SourceDatabaseFile - Name of the source database file. # ScriptGlobalsFile - Name of file to load script globals from. # ObjectDatabaseFile - Name of the object database file. # ObjectCacheSize - Size of the object datbase cache(in objects). # TransitionsFile - Name of the Transitions file. # ObjectIndexFile - Name of the Object Index File. # StartupArgsFile - Name of the startup arguments file. # WorldObjectID - ID of the world object. # WorldObjectType - Type of the world object. class MudWorld(object): def __init__(self): pass def Boot(self, worldFile, logConfigFile): self.mudTraceback = [] self.worldFile = worldFile self.logConfigFile = logConfigFile self.loggers = mplog.InitLogging(mudWorld, logConfigFile) self.worldProperties = mploader.ReadPropertiesFile(mudWorld, worldFile) self.worldObjID = self.worldProperties["WorldObjectID"] self.worldObjType = self.worldProperties["WorldObjectType"] #Logging object defaults to world object, can be set differently by the mud at runtime if wanted. #Logging object is NOT CREATED, it is only used if it already exists. self.loggingObjID = self.worldObjID self.sourceBackupPath = self.worldProperties["SourceBackupPath"] self.objectBackupPath = self.worldProperties["ObjectBackupPath"] self.bootTime = time.time() self.dns = mpserver.DNSThread() self.servers = [] self.shutdown = False self.transitions = mploader.ReadTransitionFile(self, self.worldProperties["TransitionsFile"]) self.objIndex = mploader.ReadIndexFile(self, self.worldProperties["ObjectIndexFile"]) self.callbackHandler = mpcallback.CallbackHandler(mudWorld) self.objDB = mpdatabase.ObjectDatabase(self, self.worldProperties["ObjectDatabaseFile"]) self.sourceDB = mpdatabase.SourceDatabase(self, self.worldProperties["SourceDatabaseFile"], self.worldProperties["ScriptGlobalsFile"]) bootArgs = mploader.ReadPropertiesFile(self, self.worldProperties["StartupArgsFile"]) #Attempt to load the world object. If you can't, create it. if not self.objDB.HasObj(self.worldObjID): self.objDB.CreateObjAsID(self.worldObjID, self.worldObjType) Ex(self.objDB.GetObjRef(self.worldObjID), "_Sys_Boot", bootArgs=bootArgs) def Unboot(self): Ex(self.objDB.GetObjRef(self.worldObjID), "_Sys_Unboot") for server in self.servers: server.Shutdown() self.objDB.EmptyCache() self.objDB.CloseDB() self.sourceDB.CloseDB() def MudLoop(self): lastCycle = time.clock() lastDBCycle = time.clock() eventTime = 0 while not(self.shutdown): #Run mud events. newCycle = time.clock() self.callbackHandler.ProcessTime(newCycle - lastCycle) #Save the database every 10 seconds. if (newCycle - lastDBCycle) > 10: self.objDB._SaveDirtyObjs() lastDBCycle = newCycle #Update network. for server in self.servers: server.AcceptConnections() server.NetworkUpdate() lastCycle = newCycle time.sleep(.1) mudWorld = MudWorld() if __name__ == "__main__": if len(sys.argv) < 3: print "Usage: python mpmain.py worldfile logconfig" else: try: mudWorld.Boot(sys.argv[1], sys.argv[2]) mudWorld.MudLoop() mudWorld.Unboot() except: dumpFile = file("traceback.txt", "w") dumpFile.write(mptraceback.format_exc()) dumpFile.close() raise