From 3e8b43d222255e14a7a9c935ff812e6e413ae632 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 6 Nov 2011 23:55:24 +0100 Subject: [PATCH] More fixes and cleanup in wake of ic/ooc changes. --- contrib/chargen.py | 2 +- game/gamesrc/commands/basecmdset.py | 9 ++++---- game/gamesrc/objects/baseobjects.py | 36 +++++------------------------ src/commands/default/general.py | 15 +++++++++++- src/objects/models.py | 2 +- src/objects/objects.py | 28 ++++++++++++++++++++++ src/server/initial_setup.py | 3 +-- src/settings_default.py | 6 +++++ src/utils/create.py | 5 ++++ 9 files changed, 66 insertions(+), 40 deletions(-) diff --git a/contrib/chargen.py b/contrib/chargen.py index bf990c7728..9609d3f54d 100644 --- a/contrib/chargen.py +++ b/contrib/chargen.py @@ -190,7 +190,7 @@ class OOCCmdSetCharGen(OOCCmdSet): """ def at_cmdset_creation(self): "Install everything from the default set, then overload" - #super(OOCCmdSetExtended, self).at_cmdset_creation() + super(OOCCmdSetCharGen, self).at_cmdset_creation() self.add(CmdOOCLook()) self.add(CmdOOCCharacterCreate()) diff --git a/game/gamesrc/commands/basecmdset.py b/game/gamesrc/commands/basecmdset.py index 72ffd98443..3e95320848 100644 --- a/game/gamesrc/commands/basecmdset.py +++ b/game/gamesrc/commands/basecmdset.py @@ -22,9 +22,9 @@ from src.commands.cmdset import CmdSet from src.commands.default import cmdset_default, cmdset_unloggedin, cmdset_ooc from game.gamesrc.commands.basecommand import Command -from contrib import menusystem, lineeditor +#from contrib import menusystem, lineeditor #from contrib import misc_commands -from contrib import chargen +#from contrib import chargen, menu_login class DefaultCmdSet(cmdset_default.DefaultCmdSet): """ @@ -48,7 +48,7 @@ class DefaultCmdSet(cmdset_default.DefaultCmdSet): # # any commands you add below will overload the default ones. # - self.add(menusystem.CmdMenuTest()) + #self.add(menusystem.CmdMenuTest()) #self.add(lineeditor.CmdEditor()) #self.add(misc_commands.CmdQuell()) @@ -92,8 +92,7 @@ class OOCCmdSet(cmdset_ooc.OOCCmdSet): # # any commands you add below will overload the default ones. - # - self.add(chargen.OOCCmdSetCharGen) + # class BaseCmdSet(CmdSet): """ diff --git a/game/gamesrc/objects/baseobjects.py b/game/gamesrc/objects/baseobjects.py index e8603438b7..689588f4cf 100644 --- a/game/gamesrc/objects/baseobjects.py +++ b/game/gamesrc/objects/baseobjects.py @@ -99,37 +99,13 @@ class Object(BaseObject): class Character(BaseCharacter): """ This is the default object created for a new user connecting - the - in-game player character representation. Note that it's important - that at_object_creation sets up an script that adds the Default - command set whenever the player logs in - otherwise they won't be - able to use any commands! + in-game player character representation. The basetype_setup always + assigns the default_cmdset as a fallback to objects of this type. + The default hooks also hide the character object away (by moving + it to a Null location whenever the player logs off (otherwise the + character would remain in the world, "headless" so to say). """ - - def at_disconnect(self): - """ - We stove away the character when logging off, otherwise the character object will - remain in the room also after the player logged off ("headless", so to say). - """ - if self.location: # have to check, in case of multiple connections closing - self.location.msg_contents("%s has left the game." % self.name) - self.db.prelogout_location = self.location - self.location = None - - def at_post_login(self): - """ - This recovers the character again after having been "stoved away" at disconnect. - """ - if self.db.prelogout_location: - # try to recover - self.location = self.db.prelogout_location - if self.location == None: - # make sure location is never None (home should always exist) - self.location = self.home - # save location again to be sure - self.db.prelogout_location = self.location - - self.location.msg_contents("%s has entered the game." % self.name, exclude=[self]) - self.location.at_object_receive(self, self.location) + pass class Room(BaseRoom): """ diff --git a/src/commands/default/general.py b/src/commands/default/general.py index dc73b91f1d..026419d021 100644 --- a/src/commands/default/general.py +++ b/src/commands/default/general.py @@ -685,6 +685,15 @@ class CmdIC(MuxCommand): if caller.swap_character(new_character): new_character.msg("\n{gYou become {c%s{n.\n" % new_character.name) caller.db.last_puppet = old_char + if not new_character.location: + # this might be due to being hidden away at logout; check + loc = new_character.db.prelogout_location + if not loc: # still no location; use home + loc = new_character.home + new_character.location = loc + if new_character.location: + new_character.location.msg_contents("%s has entered the game." % new_character.key, exclude=[new_character]) + new_character.location.at_object_receive(new_character, new_character.location) new_character.execute_cmd("look") else: caller.msg("{rYou cannot become {C%s{n." % new_character.name) @@ -720,11 +729,15 @@ class CmdOOC(MuxCommand): return caller.db.last_puppet = caller.character + # save location as if we were disconnecting from the game entirely. + if caller.character.location: + caller.character.location.msg_contents("%s has left the game." % caller.character.key, exclude=[caller.character]) + caller.character.db.prelogout_location = caller.character.location + caller.character.location = None # disconnect caller.character.player = None caller.character = None - caller.msg("\n{GYou go OOC.{n\n") caller.execute_cmd("look") diff --git a/src/objects/models.py b/src/objects/models.py index 10601deb45..d13555a292 100644 --- a/src/objects/models.py +++ b/src/objects/models.py @@ -316,7 +316,7 @@ class ObjectDB(TypedObject): string += "%s is not a valid home." self.msg(string % home) logger.log_trace(string) - raise + #raise self.save() #@home.deleter def home_del(self): diff --git a/src/objects/objects.py b/src/objects/objects.py index 160b379454..c99844115e 100644 --- a/src/objects/objects.py +++ b/src/objects/objects.py @@ -409,6 +409,34 @@ class Character(Object): def at_after_move(self, source_location): "Default is to look around after a move." self.execute_cmd('look') + + def at_disconnect(self): + """ + We stove away the character when logging off, otherwise the character object will + remain in the room also after the player logged off ("headless", so to say). + """ + if self.location: # have to check, in case of multiple connections closing + self.location.msg_contents("%s has left the game." % self.name, exclude=[self]) + self.db.prelogout_location = self.location + self.location = None + + def at_post_login(self): + """ + This recovers the character again after having been "stoved away" at disconnect. + """ + if self.db.prelogout_location: + # try to recover + self.location = self.db.prelogout_location + if self.location == None: + # make sure location is never None (home should always exist) + self.location = self.home + # save location again to be sure + self.db.prelogout_location = self.location + + self.location.msg_contents("%s has entered the game." % self.name, exclude=[self]) + self.location.at_object_receive(self, self.location) + + # # Base Room object diff --git a/src/server/initial_setup.py b/src/server/initial_setup.py index 0000d30989..fe62151e62 100644 --- a/src/server/initial_setup.py +++ b/src/server/initial_setup.py @@ -59,8 +59,7 @@ def create_objects(): character_typeclass=character_typeclass) if not god_character: - print _("#1 could not be created. Check the Player/Character typeclass for bugs.") - raise Exception + raise Exception(_("#1 could not be created. Check the Player/Character typeclass for bugs.")) god_character.id = 1 god_character.db.desc = _('This is User #1.') diff --git a/src/settings_default.py b/src/settings_default.py index 85be9e2b4c..6fa5abb5f1 100644 --- a/src/settings_default.py +++ b/src/settings_default.py @@ -168,6 +168,12 @@ AT_INITIAL_SETUP_HOOK_MODULE = "game.gamesrc.world.at_initial_setup" ################################################### # Default command sets ################################################### +# Note that with the exception of the unloggedin set (which is not +# stored anywhere), changing these paths will only affect NEW created +# characters, not those already in play. So if you plan to change +# this, it's recommended you do it on a pristine setup only. To +# dynamically add new commands to a running server, extend/overload +# these existing sets instead. # Command set used before player has logged in CMDSET_UNLOGGEDIN = "game.gamesrc.commands.basecmdset.UnloggedinCmdSet" diff --git a/src/utils/create.py b/src/utils/create.py index d75808a766..2b57b5c704 100644 --- a/src/utils/create.py +++ b/src/utils/create.py @@ -73,6 +73,7 @@ def create_object(typeclass, key=None, location=None, # this will either load the typeclass or the default one new_object = new_db_object.typeclass + if not object.__getattribute__(new_db_object, "is_typeclass")(typeclass, exact=True): # this will fail if we gave a typeclass as input and it still gave us a default SharedMemoryModel.delete(new_db_object) @@ -105,6 +106,10 @@ def create_object(typeclass, key=None, location=None, # perform a move_to in order to display eventual messages. if home: new_object.home = home + else: + new_object.home = settings.CHARACTER_DEFAULT_HOME + + if location: new_object.move_to(location, quiet=True) else: