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 _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)