def get_room(self, msg, client): online = self.server.online.copy() num = 1 while True: i = 0 for tmp in online: if tmp.room == f"{msg[2]['lid']}_{msg[2]['gid']}_{num}": i += 1 if i >= const.ROOM_LIMIT: num += 1 else: break room = f"{msg[2]['lid']}_{msg[2]['gid']}_{num}" if client.room: prefix = common.get_prefix(client.room) for tmp in self.server.online.copy(): if tmp.room != client.room or tmp.uid == client.uid: continue tmp.send([prefix + ".r.lv", {"uid": client.uid}]) tmp.send([client.room, client.uid], type_=17) client.room = room client.position = (-1.0, -1.0) client.action_tag = "" client.state = 0 client.dimension = 4 plr = gen_plr(client, self.server) for tmp in self.server.online.copy(): if tmp.room != client.room: continue tmp.send(["o.r.jn", {"plr": plr}]) tmp.send([client.room, client.uid], type_=16) client.send(["o.gr", {"rid": client.room}])
def owner_info(self, msg, client): if not msg[2]["uid"]: return plr = gen_plr(msg[2]["uid"], self.server) rooms = [] tmp = self.server.redis.smembers(f"rooms:{msg[2]['uid']}") for item in tmp: room = self.server.redis.lrange(f"rooms:{msg[2]['uid']}:{item}", 0, -1) room_items = self.server.get_room_items(msg[2]["uid"], item) rooms.append({ "f": room_items, "w": 13, "l": 13, "id": item, "lev": int(room[1]), "nm": room[0] }) client.send([ "h.oinfo", { "ath": False, "plr": plr, "hs": { "r": rooms, "lt": 0 } } ])
def room(self, msg, client): subcommand = msg[1].split(".")[2] if subcommand == "info": rmmb = [] room = msg[0] for tmp in self.server.online.copy(): if tmp.room != room: continue rmmb.append(gen_plr(tmp, self.server)) room_addr = f"rooms:{msg[2]['uid']}:{msg[2]['rid']}" tmp = self.server.redis.lrange(room_addr, 0, -1) room_items = self.server.get_room_items(msg[2]["uid"], msg[2]["rid"]) room = {"f": room_items, "w": 13, "id": msg[2]["rid"], "l": 13, "lev": int(tmp[1]), "nm": tmp[0]} client.send(["h.r.info", {"rmmb": rmmb, "rm": room, "evn": None}]) elif subcommand == "rfr": room = msg[0].split("_")[-1] room_data = self.server.redis.lrange(f"rooms:{client.uid}:{room}", 0, -1) room_items = self.server.get_room_items(client.uid, room) for tmp in self.server.online.copy(): if tmp.room != msg[0]: continue tmp.send(["h.r.rfr", {"rm": {"f": room_items, "w": 13, "l": 13, "lev": int(room_data[1]), "nm": room_data[0]}}]) else: super().room(msg, client)
def get_room(self, msg, client): online = self.server.online.copy() num = 1 while True: i = 0 for tmp in online: if tmp.room == f"{msg[2]['lid']}_{msg[2]['gid']}_{num}": i += 1 if i >= const.ROOM_LIMIT: num += 1 else: break room = f"{msg[2]['lid']}_{msg[2]['gid']}_{num}" if client.room: logging.error(f"Already in room, uid - {client.uid}") return client.room = room client.position = (-1.0, -1.0) client.action_tag = "" client.state = 0 client.dimension = 4 plr = gen_plr(client, self.server) for tmp in self.server.online.copy(): if tmp.room != client.room: continue tmp.send(["o.r.jn", {"plr": plr}]) tmp.send([client.room, client.uid], type_=16) client.send(["o.gr", {"rid": client.room}])
def get_my_info(self, msg, client): apprnc = self.server.get_appearance(client.uid) if not apprnc: client.send(["h.minfo", {"has.avtr": False}]) return user_data = self.server.get_user_data(client.uid) inv = self.server.inv[client.uid].get() cs = self.server.get_clothes(client.uid, type_=1) rooms = [] for item in self.server.redis.smembers(f"rooms:{client.uid}"): room = self.server.redis.lrange(f"rooms:{client.uid}:{item}", 0, -1) rooms.append({"f": self.server.get_room_items(client.uid, item), "w": 13, "id": item, "lev": int(room[1]), "l": 13, "nm": room[0]}) tr = {} for item in const.tr: tr[item] = {"trrt": 0, "trcd": 0, "trid": item} plr = gen_plr(client, self.server) plr.update({"cs": cs, "hs": {"r": rooms, "lt": 0}, "inv": inv, "onl": True, "achc": {"ac": {}, "tr": tr}}) plr["res"] = {"slvr": user_data["slvr"], "enrg": user_data["enrg"], "emd": user_data["emd"], "gld": user_data["gld"]} client.send(["h.minfo", {"plr": plr, "tm": 1}]) self._perform_login(client)
def save_layout(self, msg, client): room = msg[0].split("_") uid = client.uid if room[1] != client.uid: return for item in msg[2]["f"]: if item["t"] == 0: self.type_add(item, room, uid) if item["t"] == 1: self.type_update(item, room, uid) elif item["t"] == 2: self.type_remove(item, room, uid) elif item["t"] == 3: self.type_replace_door(item, room, uid) inv = self.server.inv[uid].get() room_inf = self.server.redis.lrange(f"rooms:{uid}:{room[2]}", 0, -1) room_items = self.server.get_room_items(uid, room[2]) self.update_hrt(uid) ci = gen_plr(client, self.server)["ci"] client.send([ "frn.save", { "inv": inv, "ci": ci, "hs": { "f": room_items, "w": 13, "id": room[2], "l": 13, "lev": int(room_inf[1]), "nm": room[0] } } ])
def sale_item(self, msg, client): items = self.server.game_items["game"] tpid = msg[2]["tpid"] cnt = msg[2]["cnt"] if tpid not in items or "saleSilver" not in items[tpid]: return if not self.server.inv[client.uid].take_item(tpid, cnt): return price = items[tpid]["saleSilver"] user_data = self.server.get_user_data(client.uid) redis = self.server.redis redis.set(f"uid:{client.uid}:slvr", user_data["slvr"] + price * cnt) ci = gen_plr(client.uid, self.server)["ci"] client.send(["ntf.ci", {"ci": ci}]) inv = self.server.inv[client.uid].get() client.send(["ntf.inv", {"inv": inv}]) user_data = self.server.get_user_data(client.uid) client.send([ "ntf.res", { "res": { "gld": user_data["gld"], "slvr": user_data["slvr"], "enrg": user_data["enrg"], "emd": user_data["emd"] } } ])
def players_by_id(self, msg, client): players = [] for uid in msg[2]["uids"]: plr = gen_plr(uid, self.server) if not plr: continue players.append(plr) client.send(["pl.get", {"plrs": players, "clid": msg[2]["clid"]}])
def room(self, msg, client): subcommand = msg[1].split(".")[2] if subcommand == "info": rmmb = [] room = msg[0] for tmp in self.server.online.copy(): if tmp.room != room: continue rmmb.append(gen_plr(tmp, self.server)) client.send(["o.r.info", {"rmmb": rmmb, "evn": None}]) else: super().room(msg, client)
def save_layout(self, msg, client): room = msg[0].split("_") uid = client.uid if room[1] != client.uid: return for item in msg[2]["f"]: items = self.server.redis.smembers(f"rooms:{uid}:{room[2]}:items") if item["t"] == 1: name = f"{item['tpid']}_{item['oid']}" if name in items: self.del_item(name, room[2], uid) self.add_item(item, room[2], uid) else: if not self.server.inv[uid].take_item(item["tpid"]): continue self.add_item(item, room[2], uid) elif item["t"] == 2: name = f"{item['tpid']}_{item['oid']}" if name not in items: continue self.del_item(name, room[2], uid) self.server.inv[uid].add_item(item["tpid"], "frn") inv = self.server.inv[uid].get() room_inf = self.server.redis.lrange(f"rooms:{uid}:{room[2]}", 0, -1) room_items = self.server.get_room_items(uid, room[2]) self.server.update_hrt(uid) ci = gen_plr(client, self.server)["ci"] client.send([ "frn.save", { "inv": inv, "ci": ci, "hs": { "f": room_items, "w": 13, "id": room[2], "l": 13, "lev": int(room_inf[1]), "nm": room[0] } } ])
def get_room(self, msg, client): room = f"{msg[2]['lid']}_{msg[2]['gid']}_{msg[2]['rid']}" if client.room: prefix = common.get_prefix(client.room) for tmp in self.server.online.copy(): if tmp.room != client.room or tmp.uid == client.uid: continue tmp.send([f"{prefix}.r.lv", {"uid": client.uid}]) tmp.send([client.room, client.uid], type_=17) client.room = room client.position = (-1.0, -1.0) client.action_tag = "" client.state = 0 client.dimension = 4 plr = gen_plr(client, self.server) for tmp in self.server.online.copy(): if tmp.room != client.room: continue prefix = common.get_prefix(client.room) tmp.send([f"{prefix}.r.jn", {"plr": plr}]) tmp.send([client.room, client.uid], type_=16) client.send(["h.gr", {"rid": client.room}])
def get_room(self, msg, client): if "rid" not in msg[2]: num = 1 room = f"{msg[2]['lid']}_{msg[2]['gid']}_{num}" while True: if self._get_room_len(room) >= const.ROOM_LIMIT: num += 1 else: break else: room = f"{msg[2]['lid']}_{msg[2]['gid']}_{msg[2]['rid']}" if msg[2]["gid"][-1] == "e": limit = const.EVENT_ROOM_LIMIT else: limit = const.ROOM_LIMIT if self._get_room_len(room) >= limit: return if client.room: prefix = common.get_prefix(client.room) for tmp in self.server.online.copy(): if tmp.room != client.room or tmp.uid == client.uid: continue tmp.send([prefix + ".r.lv", {"uid": client.uid}]) tmp.send([client.room, client.uid], type_=17) client.room = room client.position = (-1.0, -1.0) client.action_tag = "" client.state = 0 client.dimension = 4 plr = gen_plr(client, self.server) for tmp in self.server.online.copy(): if tmp.room != client.room: continue tmp.send(["o.r.jn", {"plr": plr}]) tmp.send([client.room, client.uid], type_=16) client.send(["o.gr", {"rid": client.room}])
def init_owner_info(self, msg, client): if not msg[2]["uid"]: return plr = gen_plr(msg[2]["uid"], self.server) client.send("h.ioinfo", {"tids": [], "ath": False, "plr": plr})