Heavily reworked the many-char system, cleaner and more consistent by not having any persistent links on the Object side once a player has unconnected.

This commit is contained in:
Griatch 2013-04-09 15:59:21 +02:00
parent 5100a0561f
commit 26ced2cb90
8 changed files with 321 additions and 251 deletions

View file

@ -403,6 +403,7 @@ class CmdQuit(MuxCommand):
def func(self):
"hook function"
# always operate on the player
if hasattr(self.caller, "player"):
player = self.caller.player
else:
@ -772,7 +773,7 @@ class CmdColorTest(MuxCommand):
#------------------------------------------------------------
# OOC commands
# Player commands
#
# Note that in commands inheriting from MuxCommandOOC,
# self.caller is always the Player object, not the Character.
@ -803,15 +804,14 @@ class CmdOOCLook(MuxCommandOOC, CmdLook):
def look_target(self):
"Hook method for when an argument is given."
# caller is assumed to be a player object here.
caller = self.caller
player = self.caller
key = self.args.lower()
chars = dict((utils.to_str(char.key.lower()), char) for char in caller.db._playable_characters)
chars = dict((utils.to_str(char.key.lower()), char) for char in player.db._playable_characters)
looktarget = chars.get(key)
if looktarget:
caller.msg(looktarget.return_appearance(caller))
self.msg(looktarget.return_appearance(caller))
else:
caller.msg("No such character.")
self.msg("No such character.")
return
def no_look_target(self):
@ -887,7 +887,7 @@ class CmdCharCreate(MuxCommandOOC):
"create the new character"
player = self.caller
if not self.args:
player.msg("Usage: @charcreate <charname> [= description]")
self.msg("Usage: @charcreate <charname> [= description]")
return
key = self.lhs
desc = self.rhs
@ -941,44 +941,43 @@ class CmdIC(MuxCommandOOC):
"""
Simple puppet method
"""
caller = self.caller
player = self.caller
sessid = self.sessid
old_character = self.character
new_character = None
if not self.args:
new_character = caller.db._last_puppet
new_character = player.db._last_puppet
if not new_character:
self.msg("Usage: @ic <character>")
return
if not new_character:
# search for a matching character
new_character = search.objects(self.args, caller)
new_character = search.objects(self.args, player)
if new_character:
new_character = new_character[0]
else:
self.msg("That is not a valid character choice.")
return
# permission checks
if caller.get_character(sessid=sessid, character=new_character):
if player.get_puppet(sessid) == new_character:
self.msg("{RYou already act as {c%s{n." % new_character.name)
return
if new_character.player:
if new_character.sessid == sessid:
self.msg("{RYou already act as {c%s{n." % new_character.name)
return
elif new_character.sessid and new_character.player == caller:
# may not puppet an already puppeted character
if new_character.sessid and new_character.player == player:
self.msg("{RYou already act as {c%s{n in another session." % new_character.name)
return
elif not caller.get_character(character=new_character):
elif new_character.player != player and new_character.player.is_connected:
self.msg("{c%s{r is already acted by another player.{n" % new_character.name)
return
if not new_character.access(caller, "puppet"):
if not new_character.access(player, "puppet"):
# main acccess check
self.msg("{rYou may not become %s.{n" % new_character.name)
return
if caller.connect_character(new_character, sessid=sessid):
if player.puppet_object(sessid, new_character):
self.msg("\n{gYou become {c%s{n.\n" % new_character.name)
caller.db._last_puppet = old_character
player.db._last_puppet = old_character
if not new_character.location:
# this might be due to being hidden away at logout; check
loc = new_character.db.prelogout_location
@ -1012,15 +1011,16 @@ class CmdOOC(MuxCommandOOC):
def func(self):
"Implement function"
caller = self.caller
player = self.caller
sessid = self.sessid
old_char = caller.get_character(sessid=self.sessid)
old_char = player.get_puppet(sessid)
if not old_char:
string = "You are already OOC."
self.msg(string)
return
caller.db._last_puppet = old_char
player.db._last_puppet = old_char
# save location as if we were disconnecting from the game entirely.
if old_char.location:
old_char.location.msg_contents("%s has left the game." % old_char.key, exclude=[old_char])
@ -1028,7 +1028,9 @@ class CmdOOC(MuxCommandOOC):
old_char.location = None
# disconnect
err = caller.disconnect_character(self.character)
self.msg("\n{GYou go OOC.{n\n")
caller.execute_cmd("look")
if player.unpuppet_object(sessid):
self.msg("\n{GYou go OOC.{n\n")
player.execute_cmd("look")
else:
raise RuntimeError("Could not unpuppet!")