from collections import OrderedDict import net.mapserv as mapserv import net.stats as st import itemdb from utils import encode_str import mapnames def stats_repr(*stat_types): ps = mapserv.player_stats sd = OrderedDict() if 'stats' in stat_types: sd['stats'] = 'STR:{} AGI:{} VIT:{} INT:{} DEX:{} LUK:{}'.format( ps[st.STR], ps[st.AGI], ps[st.VIT], ps[st.INT], ps[st.DEX], ps[st.LUK]) if 'hpmp' in stat_types: sd['hpmp'] = 'HP:{}/{} MP:{}/{}'.format(ps[st.HP], ps[st.MAX_HP], ps[st.MP], ps[st.MAX_MP]) if 'weight' in stat_types: sd['weight'] = 'WG: {}/{}'.format(ps[st.TOTAL_WEIGHT], ps[st.MAX_WEIGHT]) if 'points' in stat_types: sd['points'] = 'LVL: {} EXP:{}/{} CP:{} SP:{}'.format( ps[st.LEVEL], ps[st.EXP], ps[st.EXP_NEEDED], ps[st.CHAR_POINTS], ps[st.SKILL_POINTS]) if 'zeny' in stat_types: sd['zeny'] = 'GP:{}'.format(ps[st.MONEY]) if 'attack' in stat_types: sd['attack'] = 'ATK:{} DEF:{} MATK:{} MDEF:{}'.format( ps[st.ATK], ps[st.DEF], ps[st.MATK], ps[st.MDEF]) if 'skills' in stat_types: sl = [] ps = mapserv.player_skills skill_names = {339: 'focusing', 45: 'mallard', 350: 'brawling', 352: 'speed', 353: 'resist', 354: 'astral', 355: 'raging', 340: 'magic', 341: 'life', 342: 'war', 343: 'transmut', 344: 'nature', 345: 'astralm'} for s_id, s_v in ps.items(): if s_v > 0: sl.append('{}:{}'.format(skill_names.get(s_id, str(s_id)), s_v)) sd['skills'] = ' '.join(sl) return sd def invlists(max_items=1000): inventory = OrderedDict() for id_, amount in mapserv.player_inventory.values(): inventory[id_] = inventory.setdefault(id_, 0) + amount lists = [] data = '\302\202B1' i = 0 for id_, amount in inventory.items(): i += 1 if i > max_items: i = 0 lists.append(data) data = '\302\202B1' data += encode_str(id_, 2) data += encode_str(1, 4) data += encode_str(amount, 3) lists.append(data) return lists def invlists2(max_length=255, source='inventory'): inventory = OrderedDict() if source == 'inventory': source = mapserv.player_inventory elif source == 'storage': source = mapserv.player_storage else: return [] for id_, amount in source.values(): inventory[id_] = inventory.setdefault(id_, 0) + amount lists = [] data = '' for id_, amount in inventory.items(): s = itemdb.item_name(id_, True) + ', ' if amount > 1: s = str(amount) + ' ' + s if len(data + s) > max_length: lists.append(data) data = '' data += s lists.append(data[:-2]) return lists def player_position(): pp = mapserv.player_pos map_name = mapnames.map_names.get(pp['map'], 'Unknown') s = "Map: {} ({}), coor: {}, {}".format( map_name, pp['map'], pp['x'], pp['y']) return s def split_names(names, origin=[''], maxlen=255, separator=', '): origin = origin[:] if len(origin) < 1: origin = [''] for n in names: ns = n + separator if len(origin[-1] + ns) > maxlen: origin.append(ns) else: origin[-1] += ns origin[-1] = origin[-1][:-len(separator)] return origin def nearby(btype=''): nearby_beings = {'player': {}, 'npc': {}, 'monster': {}, 'portal': []} for being in mapserv.beings_cache.itervalues(): if btype and being.type != btype: continue if being.type == 'portal': nearby_beings['portal'].append((being.x, being.y)) continue if being.type == 'npc' and len(being.name) < 1: nearby_beings[being.type][str(being.job)] = 1 elif being.name in nearby_beings[being.type]: nearby_beings[being.type][being.name] += 1 else: nearby_beings[being.type][being.name] = 1 del_types = [] for t in nearby_beings: if not nearby_beings[t]: del_types.append(t) for t in del_types: del nearby_beings[t] lines = [] for bt in ('monster', 'player', 'npc'): if bt not in nearby_beings: continue lines.append(bt + 's : ') names_s = [] for bname in sorted(nearby_beings[bt].iterkeys()): count = nearby_beings[bt][bname] if count > 1: names_s.append('{} ({})'.format(bname, count)) else: names_s.append(bname) lines = split_names(names_s, lines) if 'portal' in nearby_beings: lines.append('portals : ') coor_s = [] for cx, cy in nearby_beings['portal']: coor_s.append('({},{})'.format(cx, cy)) lines = split_names(coor_s, lines) return lines