def extractLoggingPlayer(player, save=True): if not AVATAR: return if save: if not player.party or not len(player.party.members): return from mud.worldserver.charutil import PLAYER_BUFFERS for pname, pbuffer, cbuffer, cvalues in PLAYER_BUFFERS[:]: if pname == player.publicName: PLAYER_BUFFERS.remove((pname, pbuffer, cbuffer, cvalues)) player.backupItems() publicName,pbuffer,cbuffer,cvalues = \ ExtractPlayer(player.publicName,player.id, \ player.party.members[0].id,False) pbuffer = encodestring(dumps(pbuffer, 2)) cbuffer = encodestring(dumps(cbuffer, 2)) publicName = player.publicName player.destroySelf() try: user = User.byName(publicName) for r in user.roles: r.removeUser(user) user.destroySelf() except: pass AVATAR.mind.callRemote("savePlayerBuffer",publicName,pbuffer, \ cbuffer,cvalues,True) else: AVATAR.mind.callRemote("savePlayerBuffer",player.publicName,None, \ None,None,True,False)
def extractLoggingPlayer(player, save=True): if not AVATAR: return if save: if not player.party or not len(player.party.members): return from mud.worldserver.charutil import PLAYER_BUFFERS for pname,pbuffer,cbuffer,cvalues in PLAYER_BUFFERS[:]: if pname == player.publicName: PLAYER_BUFFERS.remove((pname,pbuffer,cbuffer,cvalues)) player.backupItems() publicName,pbuffer,cbuffer,cvalues = \ ExtractPlayer(player.publicName,player.id, \ player.party.members[0].id,False) pbuffer = encodestring(dumps(pbuffer, 2)) cbuffer = encodestring(dumps(cbuffer, 2)) publicName = player.publicName player.destroySelf() try: user = User.byName(publicName) for r in user.roles: r.removeUser(user) user.destroySelf() except: pass AVATAR.mind.callRemote("savePlayerBuffer",publicName,pbuffer, \ cbuffer,cvalues,True) else: AVATAR.mind.callRemote("savePlayerBuffer",player.publicName,None, \ None,None,True,False)
def tick(): global TICK_COUNTER if not AVATAR: return #not official #error? if not AVATAR.mind: return if AVATAR.world.shuttingDown: return try: now = sysTime() #ship off any player buffers from the last time try: from mud.worldserver.charutil import PLAYER_BUFFERS for pname, pbuffer, cbuffer, cvalues in PLAYER_BUFFERS[:]: pbuf = encodestring(dumps(pbuffer, 2)) cbuf = None if cbuffer: cbuf = encodestring(dumps(cbuffer, 2)) print "Sending Player/Character buffers: %s (%ik/%ik)" % ( pname, len(pbuf) / 1024, len(cbuf) / 1024) AVATAR.mind.callRemote("savePlayerBuffer", pname, pbuf, cbuf, cvalues) #xxx add callback/errback EXTRACT_TIMES[pname] = now #should be removing these upon success PLAYER_BUFFERS.remove((pname, pbuffer, cbuffer, cvalues)) except: traceback.print_exc() TICK_COUNTER -= 3 if TICK_COUNTER > 0: return TICK_COUNTER = 6 * 15 #once every minute pnames = [] extractTarget = None best = 0 for p in AVATAR.world.activePlayers: if not p.zone or p.enteringWorld: continue pname = p.publicName pnames.append(pname) extractionTimer = EXTRACT_TIMES.setdefault(pname, now) t = now - extractionTimer if t < (60 * 10): continue if t > best: best = t extractTarget = pname remove = [] for k in EXTRACT_TIMES.iterkeys(): if k not in pnames: remove.append(k) map(EXTRACT_TIMES.__delitem__, remove) if extractTarget: p = Player.byPublicName( extractTarget) #already in active chars if p and p.party: p.backupItems() ExtractPlayer(p.publicName, p.id, p.party.members[0].id) except: traceback.print_exc() #send off all players try: pnames = [] #it's still possible that the player is installed but isn't active #so 2 people sharing an account could still cause problems for p in AVATAR.world.activePlayers: cname = "" if p.curChar: cname = p.curChar.name zname = "" if p.zone: zname = p.zone.zone.niceName pnames.append((p.publicName, cname, p.guildName, zname)) d = AVATAR.mind.callRemote("recordActivePlayers", AVATAR.world.multiName, pnames) d.addCallback(AVATAR.gotGlobalPlayers) except: traceback.print_exc()
def tick(): global TICK_COUNTER if not AVATAR: return #not official #error? if not AVATAR.mind: return if AVATAR.world.shuttingDown: return try: now = sysTime() #ship off any player buffers from the last time try: from mud.worldserver.charutil import PLAYER_BUFFERS for pname,pbuffer,cbuffer,cvalues in PLAYER_BUFFERS[:]: pbuf = encodestring(dumps(pbuffer, 2)) cbuf = None if cbuffer: cbuf = encodestring(dumps(cbuffer, 2)) print "Sending Player/Character buffers: %s (%ik/%ik)"%(pname,len(pbuf)/1024,len(cbuf)/1024) AVATAR.mind.callRemote("savePlayerBuffer",pname,pbuf,cbuf,cvalues) #xxx add callback/errback EXTRACT_TIMES[pname]=now #should be removing these upon success PLAYER_BUFFERS.remove((pname,pbuffer,cbuffer,cvalues)) except: traceback.print_exc() TICK_COUNTER -= 3 if TICK_COUNTER > 0: return TICK_COUNTER = 6 * 15 #once every minute pnames = [] extractTarget = None best = 0 for p in AVATAR.world.activePlayers: if not p.zone or p.enteringWorld: continue pname = p.publicName pnames.append(pname) extractionTimer = EXTRACT_TIMES.setdefault(pname,now) t = now - extractionTimer if t < (60 * 10): continue if t > best: best = t extractTarget = pname remove = [] for k in EXTRACT_TIMES.iterkeys(): if k not in pnames: remove.append(k) map(EXTRACT_TIMES.__delitem__,remove) if extractTarget: p = Player.byPublicName(extractTarget) #already in active chars if p and p.party: p.backupItems() ExtractPlayer(p.publicName,p.id,p.party.members[0].id) except: traceback.print_exc() #send off all players try: pnames = [] #it's still possible that the player is installed but isn't active #so 2 people sharing an account could still cause problems for p in AVATAR.world.activePlayers: cname = "" if p.curChar: cname = p.curChar.name zname = "" if p.zone: zname = p.zone.zone.niceName pnames.append((p.publicName,cname,p.guildName,zname)) d = AVATAR.mind.callRemote("recordActivePlayers",AVATAR.world.multiName,pnames) d.addCallback(AVATAR.gotGlobalPlayers) except: traceback.print_exc()