def cmd_summon(s, r): '''summon <character>|<mob class> If the name or id# given is an existing player or mob, this will act like: teleport <character> to <here>. If the name does not exist already, but is a mob class, this will be like: clone <mobclass>. ''' room = s.room objname = r.get('objname', '') objtzid = r.get('objtzid', 0) char = players.getname(objname) or players.get(objtzid) or \ mobs.getname(objname) or mobs.get(objtzid) if char is not None: char.teleport(room) s.message('You summon', char, '.') elif objname in mobs.classes(): mob = _clone_mob(s, objname, objtzid) s.message('You summon', mob, '.') else: iden = objname if objname else '#%s' % objtzid s.message('Unable to summon', iden, '.')
def login(self, r): 'Log a player in if possible.' try: player_name, pwtext = r.split() except ValueError: self.simessage('Must log in with "login <name> <password>"') else: player = players.getname(player_name) if player is None: self.simessage('Incorrect user name or password.') self.login_failures += 1 print 'player', player_name, 'does not exist' elif player.logged_in: if player.check_password(pwtext): self.simessage('Player already logged in.') if conf.auto_purge: self._purge(player) self.login(r) else: self.simessage('Use "purge <name> <password>" to disconnect other session.') print 'player', player.name, 'already logged in' else: self.simessage('Incorrect user name or password.') print 'player', player.name, 'wrong password' self.login_failures += 1 else: try: # if this doesn't fail, then that player is still logging out... print self.factory._player_protocols[player_name] try: reactor.callLater(0.1, self.login, r) except: print 'tzprotocol :: login :: callLater :: fail' except: if player.check_password(pwtext): #if True: self.logged_in = True player.logged_in = True self.player = player player.last = time.time() player.following = None self.factory._player_protocols[player_name] = self wizard.cmd_teleport(self, {}) reactor.callLater(0.6, actions.cmd_look, self, dict(verb='look')) print 'player', player.name, 'logged in' else: self.simessage('Incorrect user name or password.') print 'player', player.name, 'wrong password' self.login_failures += 1 if self.login_failures >= 3: self.transport.loseConnection()
def purge(self, r): 'Disconnect other session with this account logged in.' try: player_name, pwtext = r.split() except ValueError: self.simessage('Incorrect user name or password.') else: player = players.getname(player_name) if player.check_password(pwtext): if player.logged_in: self._purge(player) self.simessage('Connection purged.') self.simessage('Log in with "login <name> <password>"') else: self.simessage('Player is not logged in.') else: self.simessage('Incorrect user name or password.')
def create(self, r): 'Create a new account.' try: player_name, pwtext = r.split() except ValueError: self.simessage('Create account with "create <name> <password>"') else: existing = players.getname(player_name) if existing: self.simessage('Name already in use.') elif player_name=='quit': self.simessage('Cannot use the name "quit"') else: player = players.Player(player_name) player.set_password(pwtext) if len(players.ls()) == 1: admin.add(player) self.simessage('Account created.') self.simessage('Log in with "login <name> <password>"')
def who(cls): 'Return list of names of players connected right now.' names = cls.factory._player_protocols.keys() return [players.getname(name) for name in names]
def cmd_teleport(s, r=None): '''teleport [to [<room>|<character>]] OR teleport <object> to <room> Teleport self to the named room or character, or if no name is given teleport self to home, OR Teleport the object to the room. ''' room = s.room player = s.player if room is not None: room.action(dict(act='teleport', actor=player)) objname = r.get('objname', '') objtzid = r.get('objtzid', 0) destname = r.get('obj2name', '') desttzid = r.get('obj2tzid', 0) if (objname or objtzid) and (destname or desttzid): destination = rooms.getname(destname) or rooms.get(desttzid) if destination is None: s.message('No such place.') return obj = find(r, room, player, room) or \ players.getname(objname) or players.get(objtzid) or \ mobs.getname(objname) or mobs.get(objtzid) or \ tzindex.get(objtzid) if obj is None: s.message('No such object.') elif obj._bse == 'Room': s.message('You cannot teleport a room.') else: obj.teleport(destination) s.message('You teleport', obj, '.') elif not (destname or desttzid): # send the player home player.teleport() else: destination = rooms.getname(destname) or \ rooms.get(desttzid) if destination is None: toplayer = players.getname(destname) or \ players.get(desttzid) if toplayer is not None: destination = toplayer.room if destination is None: s.message('Player is not logged in.') return else: tomob = mobs.getname(destname) or \ mobs.get(desttzid) if tomob is not None: destination = tomob.room else: s.message('No such room or character.') return player.teleport(destination)
def who(cls): 'Return list of names of players connected right now.' names = cls.factory._player_protocols.keys() return [unicode(players.getname(name))+'\t'+players.getname(name).room.name for name in names]