Lots of cleanup and bug fixes. Still some issues with reconnecting to the right location in multisession_mode 0.

This commit is contained in:
Griatch 2013-04-03 18:31:53 +02:00
parent e86c127903
commit 9eb1903f02
8 changed files with 73 additions and 83 deletions

View file

@ -36,7 +36,7 @@ from src.typeclasses.typeclass import TypeClass
from src.commands.cmdsethandler import CmdSetHandler
from src.commands import cmdhandler
from src.utils import logger, utils
from src.utils.utils import inherits_from
from src.utils.utils import inherits_from, make_iter
__all__ = ("PlayerAttribute", "PlayerNick", "PlayerDB")
@ -182,50 +182,17 @@ class PlayerDB(TypedObject):
#@property
def objs_get(self):
"Getter. Allows for value = self.obj"
return self.db_objs.all()
#return get_field_cache(self, "objs").all()
#@obj.setter
return list(self.db_objs.all())
#@objs.setter
def objs_set(self, value):
"Setter. Allows for self.obj = value"
global _TYPECLASS
if not _TYPECLASS:
from src.typeclasses.typeclass import TypeClass as _TYPECLASS
if isinstance(value, _TYPECLASS):
value = value.dbobj
try:
self.db_objs.add(value)
self.save()
#set_field_cache(self, "obj", value)
except Exception:
logger.log_trace()
raise Exception("Cannot assign %s as a player object!" % value)
"Setter. Allows for self.objs = value"
raise Exception("Use access methods to add new characters instead.")
#@obj.deleter
def objs_del(self):
"Deleter. Allows for del self.obj"
self.db_objs.clear()
self.save()
#del_field_cache(self, "obj")
raise Exception("Use access methods to delete new characters instead.")
objs = property(objs_get, objs_set, objs_del)
# whereas the name 'obj' is consistent with the rest of the code,
# 'character' is a more intuitive property name, so we
# define this too, as an alias to player.obj.
#@property
def character_get(self):
"Getter. Allows for value = self.character"
return get_field_cache(self, "obj")
#@character.setter
def character_set(self, character):
"Setter. Allows for self.character = value"
if inherits_from(character, TypeClass):
character = character.dbobj
set_field_cache(self, "obj", character)
#@character.deleter
def character_del(self):
"Deleter. Allows for del self.character"
del_field_cache(self, "obj")
character = property(character_get, character_set, character_del)
characters = property(objs_get, objs_set, objs_del)
# cmdset_storage property
# This seems very sensitive to caching, so leaving it be for now /Griatch
@ -407,6 +374,22 @@ class PlayerDB(TypedObject):
# a non-character session; this goes to player directly
_GA(self, "execute_cmd")(ingoing_string, sessid=sessid)
def get_session(self, sessid):
"""
Return session with given sessid connected to this player.
"""
global _SESSIONS
if not _SESSIONS:
from src.server.sessionhandler import SESSIONS as _SESSIONS
return _SESSIONS.sessions_from_player(self, sessid=sessid)
def get_all_sessions(self):
"Return all sessions connected to this player"
global _SESSIONS
if not _SESSIONS:
from src.server.sessionhandler import SESSIONS as _SESSIONS
return _SESSIONS.sessions_from_player(self)
def get_session_from_sessid(self, sessid):
"""
Get the session object from sessid. If session with sessid is not
@ -421,8 +404,8 @@ class PlayerDB(TypedObject):
"""
Access method for disconnecting a given session from the player.
"""
session = self.get_session_from_sessid(sessid)
if session:
sessions = self.get_session_from_sessid(sessid)
for session in make_iter(sessions):
session.sessionhandler.disconnect(session)
def connect_session_to_character(self, sessid, character, force=False):
@ -454,10 +437,11 @@ class PlayerDB(TypedObject):
# start (persistent) scripts on this object
#ScriptDB.objects.validate(obj=character)
pass
if character.db.FIRST_LOGIN:
if character.db._first_login:
character.at_first_login()
del character.db.FIRST_LOGIN
del character.db._first_login
character.at_pre_login()
print "player: calling at_post_login on char"
character.at_post_login()
return True
@ -494,23 +478,8 @@ class PlayerDB(TypedObject):
char = _GA(self, "get_character")(sessid=sessid, return_dbobj=True)
if not char:
return
self.connect_session_to_character(sessid, char, force=True)
_GA(self, "connect_session_to_character")(sessid, char, force=True)
def get_session(self, sessid):
"""
Return session with given sessid connected to this player.
"""
global _SESSIONS
if not _SESSIONS:
from src.server.sessionhandler import SESSIONS as _SESSIONS
return _SESSIONS.sessions_from_player(self, sessid=sessid)
def get_all_sessions(self):
"Return all sessions connected to this player"
global _SESSIONS
if not _SESSIONS:
from src.server.sessionhandler import SESSIONS as _SESSIONS
return _SESSIONS.sessions_from_player(self)
def get_character(self, sessid=None, character=None, return_dbobj=False):
"""
@ -550,14 +519,23 @@ class PlayerDB(TypedObject):
"""
return _GA(self, "get_character")(sessid=None, character=None)
def get_all_connected_characters(self):
"""
Return all characters with an active session connected
to them through this player
"""
chars = make_iter(_GA(self, "get_character")(sessid=None, character=None))
sessids = [sess.sessid for sess in _GA(self, "get_all_sessions")()]
return [char for char in chars if char.sessid in sessids]
def connect_character(self, character, sessid=None):
"""
Use the Player to connect a Character to a session. Note that
we don't do any access checks at this point. Note that if the
Use the Player to connect a Character to the Player. Note that
we don't do any access checks at this point. If the
game was fully restarted (including the Portal), this must be
used, since sessids will have changed as players reconnect.
if sessid is given, also connect the sessid to the character.
if sessid is given, also connect the sessid to the character directly.
"""
# first disconnect any other character from this session
char = character.dbobj
@ -590,7 +568,6 @@ class PlayerDB(TypedObject):
set_prop_cache(self, "_characters", cache)
return char
def disconnect_all_characters(self):
for char in self.db_objs.all():
_GA(self, "disconnect_character")(char)