def do_09fd(self, data_io): #倉庫に預ける item_iid = io_unpack_int(data_io) item_count = io_unpack_short(data_io) general.log("[ map ] store item to warehouse", item_iid, item_count) with self.pc.lock: if len(self.pc.warehouse) >= env.MAX_WAREHOURSE_STOCK: #倉庫に預けた時の結果 倉庫のアイテム数が上限を超えてしまうためキャンセルされました self.send("09fe", -4) return if self.pc.warehouse_open is None: #倉庫に預けた時の結果 #倉庫を開けていません self.send("09fe", -1) return if item_iid not in self.pc.item: #倉庫に預けた時の結果 #指定されたアイテムは存在しません self.send("09fe", -2) return item = self.pc.item[item_iid] if item.count < item_count: #倉庫に預けた時の結果 #指定された数量が不正です self.send("09fe", -3) elif item.count == item_count: self.pc.item_pop(item_iid) else: item.count -= item_count self.send("09cf", item, item_iid) #アイテム個数変化 script.msg(self.pc, "%sを%s個失いました"%(item.name, item_count)) item_store = general.copy(item) item_store.count = item_count item_store.warehouse = self.pc.warehouse_open self.pc.warehouse_append(item_store) #倉庫に預けた時の結果 #成功 self.send("09fe", 0) self.pc.update_item_status()
def do_09fd(self, data_io): #倉庫に預ける item_iid = io_unpack_int(data_io) item_count = io_unpack_short(data_io) general.log("[ map ] store item to warehouse", item_iid, item_count) with self.pc.lock: if len(self.pc.warehouse) >= env.MAX_WAREHOURSE_STOCK: #倉庫に預けた時の結果 倉庫のアイテム数が上限を超えてしまうためキャンセルされました self.send("09fe", -4) return if self.pc.warehouse_open is None: #倉庫に預けた時の結果 #倉庫を開けていません self.send("09fe", -1) return if item_iid not in self.pc.item: #倉庫に預けた時の結果 #指定されたアイテムは存在しません self.send("09fe", -2) return item = self.pc.item[item_iid] if item.count < item_count: #倉庫に預けた時の結果 #指定された数量が不正です self.send("09fe", -3) elif item.count == item_count: self.pc.item_pop(item_iid) else: item.count -= item_count self.send("09cf", item, item_iid) #アイテム個数変化 script.msg(self.pc, "%sを%s個失いました" % (item.name, item_count)) item_store = general.copy(item) item_store.count = item_count item_store.warehouse = self.pc.warehouse_open self.pc.warehouse_append(item_store) #倉庫に預けた時の結果 #成功 self.send("09fe", 0) self.pc.update_item_status()
def do_07e4(self, data_io): #pick up item request mapitem_id = io_unpack_int(data_io) general.log("[ map ] pick up item: mapitem_id", mapitem_id) if len(self.pc.item) >= env.MAX_ITEM_STOCK: script.msg(self.pc, "pick up item error: stock limit") return with self.pc.lock: if self.pc.trade: #pick up item error, トレード中はアイテムを拾うことが出来ません self.send("07e6", -8) return if self.pc.event_id: #pick up item error, イベント中はアイテムを拾うことが出来ません self.send("07e6", -9) return mapitem_obj = self.pc.map_obj.mapitem_pop(mapitem_id) if not mapitem_obj: #pick up item error, 存在しないアイテムです self.send("07e6", -1) return self.send_map("07df", mapitem_obj) #pick up item item = mapitem_obj.item if item.stock: script.item(self.pc, item.item_id, item.count) else: self.pc.item_append(mapitem_obj.item) self.pc.update_item_status()
def main(pc): usermap_obj = usermaps.get_usermap_from_map_id(pc.map_obj.map_id) if not usermap_obj: script.msg(pc, "rope error: usermap id %s not exist"%pc.map_obj.map_id) return general.log(usermap_obj.master, pc) if usermap_obj.master == pc: master_event(pc, usermap_obj) else: guest_event(pc, usermap_obj)
def main(pc): usermap_obj = usermaps.get_usermap_from_map_id(pc.event_id) if not usermap_obj: script.msg(pc, "rope error: usermap id %s not exist" % pc.event_id) return general.log(usermap_obj.master, pc) if usermap_obj.master == pc: master_event(pc) else: guest_event(pc)
def warehouse_pop(self, iid): with self.lock: try: item = self.warehouse.pop(iid) self.sort.warehouse.remove(iid) except KeyError: general.log_error(traceback.format_exc()) return None if self.online: script.msg(self, "%sを%s個取り出しました" % (item.name, item.count)) return item
def warehouse_pop(self, iid): with self.lock: try: item = self.warehouse.pop(iid) self.sort.warehouse.remove(iid) except KeyError: general.log_error(traceback.format_exc()) return None if self.online: script.msg(self, "%sを%s個取り出しました"%(item.name, item.count)) return item
def warehouse_append(self, item): if len(self.warehouse) >= env.MAX_WAREHOURSE_STOCK: script.msg(self, "warehouse_append error: stock limit") return item with self.lock: item_iid = general.make_id(self.sort.item + self.sort.warehouse) self.warehouse[item_iid] = item self.sort.warehouse.append(item_iid) if self.online: #倉庫インベントリーデータ self.map_send("09f9", item, item_iid, 30) script.msg(self, "%sを%s個預りました" % (item.name, item.count))
def warehouse_append(self, item): if len(self.warehouse) >= env.MAX_WAREHOURSE_STOCK: script.msg(self, "warehouse_append error: stock limit") return item with self.lock: item_iid = general.make_id(self.sort.item+self.sort.warehouse) self.warehouse[item_iid] = item self.sort.warehouse.append(item_iid) if self.online: #倉庫インベントリーデータ self.map_send("09f9", item, item_iid, 30) script.msg(self, "%sを%s個預りました"%(item.name, item.count))
def item_append(self, item, place=0x02): if len(self.item) >= env.MAX_ITEM_STOCK: script.msg(self, "item_append error: stock limit") return item #0x02: body with self.lock: item_iid = general.make_id(self.sort.item + self.sort.warehouse) self.item[item_iid] = item self.sort.item.append(item_iid) if self.online: #アイテム取得 self.map_send("09d4", item, item_iid, place) script.msg(self, "%sを%s個入手しました" % (item.name, item.count))
def item_pop(self, iid): with self.lock: try: item = self.item.pop(iid) self.sort.item.remove(iid) except KeyError: general.log_error(traceback.format_exc()) return None if self.online: #インベントリからアイテム消去 self.map_send("09ce", iid) script.msg(self, "%sを%s個失いました" % (item.name, item.count)) return item
def item_pop(self, iid): with self.lock: try: item = self.item.pop(iid) self.sort.item.remove(iid) except KeyError: general.log_error(traceback.format_exc()) return None if self.online: #インベントリからアイテム消去 self.map_send("09ce", iid) script.msg(self, "%sを%s個失いました"%(item.name, item.count)) return item
def item_append(self, item, place=0x02): if len(self.item) >= env.MAX_ITEM_STOCK: script.msg(self, "item_append error: stock limit") return item #0x02: body with self.lock: item_iid = general.make_id(self.sort.item+self.sort.warehouse) self.item[item_iid] = item self.sort.item.append(item_iid) if self.online: #アイテム取得 self.map_send("09d4", item, item_iid, place) script.msg(self, "%sを%s個入手しました"%(item.name, item.count))
def use(pc, target_id, x, y, skill_id, skill_lv): general.log("[skill] use skill (%s, %s) -> (%s, %s, %s)"%( skill_id, skill_lv, target_id, x, y, )) mod = name_map.get(str(skill_id)) if mod is None: skill_obj = db.skill.get(skill_id) skill_name = skill_obj.name if skill_obj else "unknow" script.msg(pc, "skill %s %s not define"%(skill_id, skill_name)) #スキル使用 #スキルを使用できません pc.map_send("1389", pc, -1, x, y, skill_id, skill_lv, 13, -1) #スキル使用通知 #スキルを使用できません pc.map_send("138a", pc, 13) return general.start_thread(use_thread, (mod, pc, target_id, x, y, skill_id, skill_lv)) return True
def use(pc, target_id, x, y, skill_id, skill_lv): general.log("[skill] use skill (%s, %s) -> (%s, %s, %s)" % ( skill_id, skill_lv, target_id, x, y, )) mod = name_map.get(str(skill_id)) if mod is None: skill_obj = db.skill.get(skill_id) skill_name = skill_obj.name if skill_obj else "unknow" script.msg(pc, "skill %s %s not define" % (skill_id, skill_name)) #スキル使用 #スキルを使用できません pc.map_send("1389", pc, -1, x, y, skill_id, skill_lv, 13, -1) #スキル使用通知 #スキルを使用できません pc.map_send("138a", pc, 13) return general.start_thread(use_thread, (mod, pc, target_id, x, y, skill_id, skill_lv)) return True
def do_0614(self, data_io): #NPCショップのアイテム購入 general.log("[ map ] npcshop") with self.pc.lock: if self.pc.shop_open is None: general.log_error("do_0614: shop_open is None") return if hasattr(self.pc.shop_open, "__iter__"): shop_item_list = self.pc.shop_open else: shop = db.shop.get(self.pc.shop_open) if not shop: general.log_error("do_0614 error: shop_id not exist", self.pc.shop_open) return shop_item_list = shop.item item_id_list = io_unpack_array(io_unpack_int, data_io) item_count_list = io_unpack_array(io_unpack_int, data_io) item_buy_list = zip(item_id_list, item_count_list) general.log("[ map ] item_buy_list", item_buy_list) if len(self.pc.item) + len(item_buy_list) > env.MAX_ITEM_STOCK: script.msg(self.pc, "npcshop buy error: stock limit") return for item_id, item_count in item_buy_list: if not item_count: general.log_error("do_0614 error: item_count is 0", item_count) continue if item_id not in shop_item_list: general.log_error( "do_0614 error: item_id not in shop_item_list", item_id, shop_item_list) continue item = db.item.get(item_id) if not item: general.log_error("do_0614 error: item_id not exist", item_id) continue if script.takegold(self.pc, (int(item.price / 10.0) or 1) * item_count): script.item(self.pc, item_id, item_count) self.pc.update_item_status()
def set_trade_return(self): #move item and gold to trade_return_list and trade_return_gold #must check_trade_list before with self.lock and self.user.lock: if not self.online: return general.log("[ pc ] set_trade_return") script.takegold(self, self.trade_gold) self.trade_return_gold = self.trade_gold for iid, count in self.trade_list: item = self.item.get(iid) if item.count > count: item.count -= count item_return = general.copy(item) item_return.count = count self.trade_return_list.append(item_return) #self.map_send("09cf", item, iid) #アイテム個数変化 script.msg(self, "%sを%s個失いました" % (item.name, count)) else: item_return = self.item_pop(iid) item_return.count = count self.trade_return_list.append(item_return)
def set_trade_return(self): #move item and gold to trade_return_list and trade_return_gold #must check_trade_list before with self.lock and self.user.lock: if not self.online: return general.log("[ pc ] set_trade_return") script.takegold(self, self.trade_gold) self.trade_return_gold = self.trade_gold for iid, count in self.trade_list: item = self.item.get(iid) if item.count > count: item.count -= count item_return = general.copy(item) item_return.count = count self.trade_return_list.append(item_return) #self.map_send("09cf", item, iid) #アイテム個数変化 script.msg(self, "%sを%s個失いました"%(item.name, count)) else: item_return = self.item_pop(iid) item_return.count = count self.trade_return_list.append(item_return)
def do_0614(self, data_io): #NPCショップのアイテム購入 general.log("[ map ] npcshop") with self.pc.lock: if self.pc.shop_open is None: general.log_error("do_0614: shop_open is None") return if hasattr(self.pc.shop_open, "__iter__"): shop_item_list = self.pc.shop_open else: shop = db.shop.get(self.pc.shop_open) if not shop: general.log_error( "do_0614 error: shop_id not exist", self.pc.shop_open) return shop_item_list = shop.item item_id_list = io_unpack_array(io_unpack_int, data_io) item_count_list = io_unpack_array(io_unpack_int, data_io) item_buy_list = zip(item_id_list, item_count_list) general.log("[ map ] item_buy_list", item_buy_list) if len(self.pc.item)+len(item_buy_list) > env.MAX_ITEM_STOCK: script.msg(self.pc, "npcshop buy error: stock limit") return for item_id, item_count in item_buy_list: if not item_count: general.log_error("do_0614 error: item_count is 0", item_count) continue if item_id not in shop_item_list: general.log_error("do_0614 error: item_id not in shop_item_list", item_id, shop_item_list) continue item = db.item.get(item_id) if not item: general.log_error("do_0614 error: item_id not exist", item_id) continue if script.takegold(self.pc, (int(item.price/10.0) or 1)*item_count): script.item(self.pc, item_id, item_count) self.pc.update_item_status()
def do_09fb(self, data_io): #倉庫から取り出す if len(self.pc.item) >= env.MAX_ITEM_STOCK: #倉庫から取り出した時の結果 #キャラのアイテム数が100個を超えてしまうためキャンセルされました self.send("09fc", -5) return item_iid = io_unpack_int(data_io) item_count = io_unpack_short(data_io) general.log("[ map ] take item from warehouse", item_iid, item_count) with self.pc.lock: if self.pc.warehouse_open is None: #倉庫から取り出した時の結果 #倉庫を開けていません self.send("09fc", -1) return if item_iid not in self.pc.warehouse: #倉庫から取り出した時の結果 #指定されたアイテムは存在しません self.send("09fc", -2) return item = self.pc.warehouse[item_iid] if item.count < item_count: #倉庫から取り出した時の結果 #指定された数量が不正です self.send("09fc", -3) return elif item.count == item_count: self.pc.warehouse_pop(item_iid) else: item.count -= item_count script.msg(self.pc, "%sを%s個取り出しました" % (item.name, item_count)) if item.stock: script.item(self.pc, item.item_id, item_count) else: item_take = general.copy(item) item_take.count = item_count item_take.warehouse = 0 self.pc.item_append(item_take) #倉庫から取り出した時の結果 #成功 self.send("09fc", 0) self.pc.update_item_status()
def do_09fb(self, data_io): #倉庫から取り出す if len(self.pc.item) >= env.MAX_ITEM_STOCK: #倉庫から取り出した時の結果 #キャラのアイテム数が100個を超えてしまうためキャンセルされました self.send("09fc", -5) return item_iid = io_unpack_int(data_io) item_count = io_unpack_short(data_io) general.log("[ map ] take item from warehouse", item_iid, item_count) with self.pc.lock: if self.pc.warehouse_open is None: #倉庫から取り出した時の結果 #倉庫を開けていません self.send("09fc", -1) return if item_iid not in self.pc.warehouse: #倉庫から取り出した時の結果 #指定されたアイテムは存在しません self.send("09fc", -2) return item = self.pc.warehouse[item_iid] if item.count < item_count: #倉庫から取り出した時の結果 #指定された数量が不正です self.send("09fc", -3) return elif item.count == item_count: self.pc.warehouse_pop(item_iid) else: item.count -= item_count script.msg(self.pc, "%sを%s個取り出しました"%(item.name, item_count)) if item.stock: script.item(self.pc, item.item_id, item_count) else: item_take = general.copy(item) item_take.count = item_count item_take.warehouse = 0 self.pc.item_append(item_take) #倉庫から取り出した時の結果 #成功 self.send("09fc", 0) self.pc.update_item_status()
def do_0616(self, data_io): #ショップで売却 general.log("[ map ] npcsell") with self.pc.lock: if self.pc.shop_open != 65535: general.log_error("do_0616: shop_open != 65535", self.pc.shop_open) return item_iid_list = io_unpack_array(io_unpack_int, data_io) item_count_list = io_unpack_array(io_unpack_int, data_io) item_sell_list = zip(item_iid_list, item_count_list) general.log("[ map ] item_sell_list", item_sell_list) with self.pc.lock: for item_iid, item_count in item_sell_list: if not item_count: general.log_error("do_0616: not item_count", item_count) continue if self.pc.in_equip(item_iid): general.log_error("do_0616: in_equip(item_iid)", item_iid) continue item = self.pc.item.get(item_iid) if not item: general.log_error("do_0616: not item", item_iid) continue if item.count < item_count: general.log_error("do_0616: item.count < item_count") continue if script.gold(self.pc, (int(item.price / 100.0) or 1) * item_count): if item.count <= item_count: self.pc.item_pop(item_iid) else: item.count -= item_count script.msg(self.pc, "%sを%s個失いました" % (item.name, item_count)) self.send("09cf", item, item_iid) #アイテム個数変化 self.pc.update_item_status()
def do_0616(self, data_io): #ショップで売却 general.log("[ map ] npcsell") with self.pc.lock: if self.pc.shop_open != 65535: general.log_error("do_0616: shop_open != 65535", self.pc.shop_open) return item_iid_list = io_unpack_array(io_unpack_int, data_io) item_count_list = io_unpack_array(io_unpack_int, data_io) item_sell_list = zip(item_iid_list, item_count_list) general.log("[ map ] item_sell_list", item_sell_list) with self.pc.lock: for item_iid, item_count in item_sell_list: if not item_count: general.log_error("do_0616: not item_count", item_count) continue if self.pc.in_equip(item_iid): general.log_error("do_0616: in_equip(item_iid)", item_iid) continue item = self.pc.item.get(item_iid) if not item: general.log_error("do_0616: not item", item_iid) continue if item.count < item_count: general.log_error("do_0616: item.count < item_count") continue if script.gold(self.pc, (int(item.price/100.0) or 1)*item_count): if item.count <= item_count: self.pc.item_pop(item_iid) else: item.count -= item_count script.msg(self.pc, "%sを%s個失いました"%( item.name, item_count )) self.send("09cf", item, item_iid) #アイテム個数変化 self.pc.update_item_status()
def main(pc): nekomata_info = ITEM_EVENT_ID[pc.item_event_id] if not pc.pet: script.msg(pc, "error: not pet") return with pc.lock and pc.pet.lock: pet_item = pc.item.get(pc.equip.pet) if not pet_item: script.msg(pc, "error: not pet equip") return if pet_item.pet_id != nekomata_info[0]: script.msg(pc, "error: pet id != %s"%nekomata_info[0]) return if pc.pet.item[1].pict_id == nekomata_info[1]: pet_pict_id = nekomata_info[0] else: pet_pict_id = nekomata_info[1] pet_item.pet_pict_id = pet_pict_id pc.pet.item[1].pict_id = pet_pict_id script.update_pet(pc)
def main(pc): nekomata_info = ITEM_EVENT_ID[pc.item_event_id] if not pc.pet: script.msg(pc, "error: not pet") return with pc.lock and pc.pet.lock: pet_item = pc.item.get(pc.equip.pet) if not pet_item: script.msg(pc, "error: not pet equip") return if pet_item.pet_id != nekomata_info[0]: script.msg(pc, "error: pet id != %s" % nekomata_info[0]) return if pc.pet.item[1].pict_id == nekomata_info[1]: pet_pict_id = nekomata_info[0] else: pet_pict_id = nekomata_info[1] pet_item.pet_pict_id = pet_pict_id pc.pet.item[1].pict_id = pet_pict_id script.update_pet(pc)
def exp_add(self, exp, job_exp): #self.exp += exp #self.job_exp += job_exp script.msg(self, "基本経験値 %s、職業経験値 %sを取得しました" % (exp, job_exp))
def _set_trade_finish(self): if not self.check_trade_list(): self.cancel_trade() return if not self.trade: return self.trade_state = 1 #トレード完了してる状態 p = self.get_trade_target() if p: with p.lock and p.user.lock: if not p.trade: return if len(self.item) + len(p.trade_list) > env.MAX_ITEM_STOCK: script.msg(self, "trade error: self stock limit") script.msg(p, "trade error: target stock limit") self.cancel_trade() p.cancel_trade() return if len(p.item) + len(self.trade_list) > env.MAX_ITEM_STOCK: script.msg(self, "trade error: target stock limit") script.msg(p, "trade error: self stock limit") self.cancel_trade() p.cancel_trade() return if p.trade_state == 1: #exchange item and gold if not p.check_trade_list(): self.cancel_trade() return self.set_trade_return() p.set_trade_return() if self.trade_return_gold: script.gold(p, self.trade_return_gold) for item in self.trade_return_list: if item.stock: script.item(p, item.item_id, item.count) else: p.item_append(item) if p.trade_return_gold: script.gold(self, p.trade_return_gold) for item in p.trade_return_list: if item.stock: script.item(self, item.item_id, item.count) else: self.item_append(item) self.reset_trade() p.reset_trade() self.map_send("0a1c") #トレード終了通知 p.map_send("0a1c") #トレード終了通知 self.update_item_status() p.update_item_status() script.update_item(self) script.update_item(p) else: #send trade status #自分・相手がOKやキャンセルを押した際に双方に送信される self.map_send("0a19", self, p) #自分・相手がOKやキャンセルを押した際に双方に送信される p.map_send("0a19", p, self) elif p is False: #target offline or map changed self.cancel_trade() else: #p is None: npctrade self.set_trade_return() self.reset_trade(False) #don't clear return list self.map_send("0a1c") #トレード終了通知 self.update_item_status() script.update_item(self)
def _set_trade_finish(self): if not self.check_trade_list(): self.cancel_trade() return if not self.trade: return self.trade_state = 1 #トレード完了してる状態 p = self.get_trade_target() if p: with p.lock and p.user.lock: if not p.trade: return if len(self.item)+len(p.trade_list) > env.MAX_ITEM_STOCK: script.msg(self, "trade error: self stock limit") script.msg(p, "trade error: target stock limit") self.cancel_trade() p.cancel_trade() return if len(p.item)+len(self.trade_list) > env.MAX_ITEM_STOCK: script.msg(self, "trade error: target stock limit") script.msg(p, "trade error: self stock limit") self.cancel_trade() p.cancel_trade() return if p.trade_state == 1: #exchange item and gold if not p.check_trade_list(): self.cancel_trade() return self.set_trade_return() p.set_trade_return() if self.trade_return_gold: script.gold(p, self.trade_return_gold) for item in self.trade_return_list: if item.stock: script.item(p, item.item_id, item.count) else: p.item_append(item) if p.trade_return_gold: script.gold(self, p.trade_return_gold) for item in p.trade_return_list: if item.stock: script.item(self, item.item_id, item.count) else: self.item_append(item) self.reset_trade() p.reset_trade() self.map_send("0a1c") #トレード終了通知 p.map_send("0a1c") #トレード終了通知 self.update_item_status() p.update_item_status() script.update_item(self) script.update_item(p) else: #send trade status #自分・相手がOKやキャンセルを押した際に双方に送信される self.map_send("0a19", self, p) #自分・相手がOKやキャンセルを押した際に双方に送信される p.map_send("0a19", p, self) elif p is False: #target offline or map changed self.cancel_trade() else: #p is None: npctrade self.set_trade_return() self.reset_trade(False) #don't clear return list self.map_send("0a1c") #トレード終了通知 self.update_item_status() script.update_item(self)
def exp_add(self, exp, job_exp): #self.exp += exp #self.job_exp += job_exp script.msg(self, "基本経験値 %s、職業経験値 %sを取得しました"%(exp, job_exp))
def main(pc): script.msg(pc, "-"*30) script.msg(pc, "%s %s"%(env.NAME, env.LAST_UPDATE)) script.msg(pc, "%s"%env.RUNTIME_VERSION_ALL) script.msg(pc, "-"*30)