def return_appearance(self, looker, **kwargs): """ This formats a description. It is the hook a 'look' command should call. The Stash will not have any objects stored inside it. We collect all the objects the Player currently has in it's Stash by pulling the tag and presents it as the Stash's contents. Args: looker (Object): Object doing the looking. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). """ if not looker: return "" # get and identify all objects tagged_objs = evennia.search_tag(looker.dbref, category="stash") string = "|c%s|n\n" % self.get_display_name(looker) desc = self.db.desc if desc: string += "%s" % desc if tagged_objs: string += "\n|wContents:|n " for obj in tagged_objs: string += "%s - %s" % (obj.name, obj.db.desc.strip('\n')[0:80-(len(obj.name)+6)] + "...")
def goto_next_room(self): if hasattr(self, 'db.hometown'): hometown = self.db.hometown location = self.location exits = [ o for o in location.contents if o.location is location and o.destination ] options = len(exits) + 1 direction = random.randint(1, options) if direction <= len(exits): new_room = random.choice(exits) hometown = '' if hasattr(self.db, 'hometown'): hometown = self.db.hometown possible_rooms = evennia.search_tag(hometown, category="zone") can_go = False for pr in possible_rooms: if new_room.destination.dbref == pr.dbref: can_go = True if not can_go: return self.move_to(new_room)
def func(self): """Execute the command.""" screen = self.screen sender = screen.app.phone_number recipients = list(screen.db.get("recipients", [])) if not recipients: self.msg("You haven't specified at least one recipient.") screen.display() return content = screen.db.get("content") if not content: self.msg("This text is empty, write something before sending it.") screen.display() return # Send the new text text = Text.objects.send(sender, recipients, content) thread = text.thread self.msg("Thanks, your message has been sent successfully.") if screen.db.get("go_back", True): screen.back() else: del screen.db["content"] # Notify the recipients for number in text.recipients: devices = search_tag(number, category="phone number") for device in devices: NewTextScreen.notify(device, text)
def func(self): """implements the command.""" caller = self.caller # If no args if not self.args: caller.msg("Get what?") return # 1. lhs = "wooden sword"; rhs = "" # 2. lhs = "Big book"; rhs = "old bookshelf" if self.rhs: location = caller.search(self.rhs) else: location = caller.location if not location: return # TO DO Add some sort of check that you can get objects from target # Get Object. We have to allow for Player Stash if isinstance(location, Stash): obj = caller.search(self.lhs, candidates=evennia.search_tag(caller.dbref, category="stash")) else: obj = caller.search(self.lhs, location=location) if not obj: return if caller == obj: caller.msg("You can't get yourself.") return if not obj.access(caller, 'get'): if obj.db.get_err_msg: caller.msg(obj.db.get_err_msg) else: caller.msg("You can't get that.") return # calling at_before_get hook method if not obj.at_before_get(caller): return obj.move_to(caller, quiet=True) if self.rhs: caller.msg("You pick up %s from %s." % (obj.name, location.name)) caller.location.msg_contents("%s picks up %s from %s." % (caller.name, obj.name, location.name), exclude=caller) else: caller.msg("You pick up %s." % obj.name) caller.location.msg_contents("%s picks up %s." % (caller.name, obj.name), exclude=caller) # calling at_get hook method obj.at_get(caller)
def prīmā_lūce(): """ When the sun rises, display a message in every room. """ # Browse all rooms for locus in Locus.objects.all(): locus.msg_contents("|ySōl orītur.|n") # Set "dark" = False for external rooms externa = evennia.search_tag("forīs", category="zōna") for e in externa: e.db.āter=False
def occāsū(): """ When the sun sets, display a message in every room. """ # Browse all rooms for locus in Locus.objects.all(): locus.msg_contents("|rSōl occidit.|n") # Set "dark" = True for external rooms externa = evennia.search_tag("forīs", category="zōnā") for e in externa: e.db.āter=True
def message_occupants(self, msg, exclude=[]): """ Called to message all occupants of 'place' Checks occupants are still at location and sends message. """ occupants = evennia.search_tag(self.dbref, category="places") # Remove stale occupants and exclude specified. for occupant in occupants: if not occupant.location == self.location: self.leave_occupants(occupant) continue if occupant not in exclude: occupant.msg(msg)
def at_after_move(self, source_location, **kwargs): """ Overload this in order to update other players' maps. """ self.update_map() for i in search_tag("sees_%i" % self.id): i.tags.remove("sees_%i" % self.id) i.update_map() # needed for <vai> def move_callback(): self.execute_cmd(self.db.travel_direction) if self.db.travel_direction: deferred = utils.delay(0.2, move_callback) self.ndb.currently_moving = deferred super().at_after_move(source_location, **kwargs)
def associated(self): """search for and return any jobs associated with this bucket""" jobs = [] for job in ev.search_tag(self.key, category="jobs"): jobs.append(job) return jobs
def func(self): """Performs the summon, accounting for in-world conditions.""" char = self.character loc = char.location account = self.account args = self.args lhs, rhs = self.lhs, self.rhs # opt = self.switches # TODO - add code to make the switches work. if char and char.ndb.currently_moving: account.msg("You can not summon while moving. (|rstop|n, then try again.)") return if not args: char.msg("Could not find target to summon. Usage: summon <character or NPC>") return session_list = SESSIONS.get_sessions() target = [] for session in session_list: if not (session.logged_in and session.get_puppet()): continue puppet = session.get_puppet() if lhs.lower() in puppet.get_display_name(char, plain=True).lower(): target.append(puppet) if len(target) < 1: char.msg("Error: character not found.") return if len(target) > 1: # Too many partial matches, try exact matching. char.msg("Error: character not found.") return else: target[0].msg("You are being summoned to %s " % loc.get_display_name(target[0]) + "by %s" % char.get_display_name(target[0]) + ". A portal should appear soon that will take you to " + "%s." % char.get_display_name(target[0])) char.msg("You begin to summon a portal between %s" % target[0].get_display_name(char) + " and your location.") # Check the pool for objects to use. Filter a list of objects tagged "pool" by those located in None. obj_pool = [each for each in evennia.search_tag('pool', category='portal') if not each.location] print('Object pool total: %i' % len(obj_pool)) if len(obj_pool) < 2: char.msg('Portals are currently out of stock or in use elsewhere.') return portal_enter, portal_exit = obj_pool[-2:] def open_portal(): """Move inflatable portals into place.""" portal_enter.move_to(target[0].location) portal_exit.move_to(loc) delay(10, callback=open_portal) # 10 seconds later, the portal (exit pair) appears. def close_portal(): """Remove and store inflatable portals in Nothingness.""" for each in portal_enter.contents: each.move_to(target[0].location) for each in portal_exit.contents: each.move_to(loc) portal_enter.location.msg_contents("|r%s|n vanishes into |222Nothingness|n." % portal_enter) portal_exit.location.msg_contents("|r%s|n vanishes into |222Nothingness|n." % portal_exit) portal_enter.move_to(None, to_none=True) portal_exit.move_to(None, to_none=True) delay(180, callback=close_portal) # Wait, then move portal objects to the portal pool in Nothingness
def jobids(self): return ev.search_tag(self.db.key, category="jobs")
def delete_tagged(tag): for obj in search_tag(tag): try: obj.delete() except ObjectDoesNotExist: pass
def func(self): """ Performs the summon, accounting for in-world conditions. join: Implies one way portal to target summon: Implies one way portal to summoner meet: Implies two-way portal, both can meet. """ char = self.character cmd = self.cmdstring loc = char.location account = self.account args = self.args lhs, rhs = self.lhs, self.rhs opt = self.switches message_private = ' in a private room that does not allow portals to form.' if char and char.ndb.currently_moving: account.msg( "You can not open a portal while moving. (|lcstop|lt|rStop|n|le, then try again.)" ) return if not args and 'vanish' not in opt: char.msg('Usage: {} <character or NPC>'.format(cmd)) return session_list = SESSIONS.get_sessions() target = [] # Check for private flag on source room. It must be controlled by summoner if private. if loc.tags.get('private', category='flags') and not loc.access(char, 'control'): char.msg('You are' + message_private) return # Check object pool filtered by tagged "pool" and located in None. obj_pool = [ each for each in evennia.search_tag('pool', category='portal') if not each.location ] print('Object pool total: %i' % len(obj_pool)) if len(obj_pool) < 2: char.msg('Portals are currently out of stock or in use elsewhere.') return portal_enter, portal_exit = obj_pool[-2:] for session in session_list: if not (session.logged_in and session.get_puppet()): continue puppet = session.get_puppet() if lhs.lower() in puppet.get_display_name(char, plain=True).lower(): target.append(puppet) if len(target) < 1: char.msg("Specific character name not found.") return elif len(target) > 1: # Too many partial matches, try exact matching. char.msg("Unique character name not found.") return first_target = target[0] target = list(set(target)) # Remove duplicate character sessions target = first_target # Check for private flag on destination room. If so, check for in/out locks. there = target.location if there and there.tags.get( 'private', category='flags') and not there.access(char, 'control'): char.msg('Destination of portal is' + message_private) return # Check if A can walk to B, or B to A depending on meet or summon, # because sometimes a portal might not be needed. meet_message = 'You are being invited to meet {summoner} in {loc}.' join_message = 'You are being joined by {summoner} from {loc}.' summon_message = 'You are being summoned to {loc} by {summoner}.' message = meet_message if 'meet' in cmd else ( summon_message if 'summon' in cmd else join_message) loc_name = loc.get_display_name(target) target_name = target.get_display_name(char) char_name = char.get_display_name(target) target.msg(message.format(summoner=char_name, loc=loc_name)) target.msg('A portal should appear soon.') char.msg("You begin to open a portal connecting %s" % target_name + " and your location.") def open_portal(): """Move inflatable portals into place.""" # If in or out, join or summon, lock portals, depending. enter_lock, exit_lock = 'all()', 'all()' if 'only' in opt: enter_lock = 'id({}) OR id({})'.format(target.id, char.id) exit_lock = 'id({}) OR id({})'.format(target.id, char.id) if 'in' in opt or 'join' in cmd: enter_lock = 'none()' if 'out' in opt or 'summon' in cmd: exit_lock = 'none()' portal_enter.locks.add('enter:' + enter_lock) portal_exit.locks.add('enter:' + exit_lock) quiet = True if ('quiet' in opt or 'silent' in opt) else False portal_enter.move_to(target.location, quiet=quiet) if quiet: target.msg('{} quietly appears in {}.'.format( portal_enter.get_display_name(target), loc_name)) char.msg('{} quietly appears in {}.'.format( portal_exit.get_display_name(char), loc.get_display_name(char))) portal_exit.move_to(loc, quiet=quiet) delay(10, callback=open_portal ) # 10 seconds later, the portal (exit pair) appears. def close_portal(): """Remove and store inflatable portals in Nothingness.""" vanish_message = '|r{}|n vanishes into ' + settings.NOTHINGNESS + '.' for every in portal_enter.contents: every.move_to(target.location) for every in portal_exit.contents: every.move_to(loc) # if not quiet: if portal_enter.location: portal_enter.location.msg_contents( vanish_message.format(portal_enter)) portal_enter.move_to(None, to_none=True) # , quiet=quiet) if portal_exit.location: portal_exit.location.msg_contents( vanish_message.format(portal_exit)) portal_exit.move_to(None, to_none=True) # , quiet=quiet) delay( 180, callback=close_portal ) # Wait, then move portal objects to the portal pool in Nothingness
def func(self): """Performs the summon, accounting for in-world conditions.""" char = self.character loc = char.location account = self.account args = self.args lhs, rhs = self.lhs, self.rhs # opt = self.switches # TODO - add code to make the switches work. if char and char.ndb.currently_moving: account.msg( "You can not summon while moving. (|rstop|n, then try again.)") return if not args: char.msg( "Could not find target to summon. Usage: summon <character or NPC>" ) return session_list = SESSIONS.get_sessions() target = [] for session in session_list: if not (session.logged_in and session.get_puppet()): continue puppet = session.get_puppet() if lhs.lower() in puppet.get_display_name(char, plain=True).lower(): target.append(puppet) if len(target) < 1: char.msg("Error: character not found.") return if len(target) > 1: # Too many partial matches, try exact matching. char.msg("Error: character not found.") return else: target[0].msg( "You are being summoned to %s " % loc.get_display_name(target[0]) + "by %s" % char.get_display_name(target[0]) + ". A portal should appear soon that will take you to " + "%s." % char.get_display_name(target[0])) char.msg("You begin to summon a portal between %s" % target[0].get_display_name(char) + " and your location.") # Check the pool for objects to use. Filter a list of objects tagged "pool" by those located in None. obj_pool = [ each for each in evennia.search_tag('pool', category='portal') if not each.location ] print('Object pool total: %i' % len(obj_pool)) if len(obj_pool) < 2: char.msg('Portals are currently out of stock or in use elsewhere.') return portal_enter, portal_exit = obj_pool[-2:] def open_portal(): """Move inflatable portals into place.""" portal_enter.move_to(target[0].location) portal_exit.move_to(loc) delay(10, callback=open_portal ) # 10 seconds later, the portal (exit pair) appears. def close_portal(): """Remove and store inflatable portals in Nothingness.""" for each in portal_enter.contents: each.move_to(target[0].location) for each in portal_exit.contents: each.move_to(loc) portal_enter.location.msg_contents( "|r%s|n vanishes into |222Nothingness|n." % portal_enter) portal_exit.location.msg_contents( "|r%s|n vanishes into |222Nothingness|n." % portal_exit) portal_enter.move_to(None, to_none=True) portal_exit.move_to(None, to_none=True) delay( 180, callback=close_portal ) # Wait, then move portal objects to the portal pool in Nothingness