def drop_item(self, iiid): """ @warning [Использовать в транзакции] Убрать предмет из инвентаря """ if ensure_locked(self.Items, self.ItemsOrder): del self.Items[iiid] del self.ItemsOrder[iiid]
def swap_items(self, iiid1, iiid2): """ @warning [Использовать в транзакции] Поменять местами предметы """ if ensure_locked(self.ItemsOrder): self.ItemsOrder[iiid1], self.ItemsOrder[iiid2] = self.ItemsOrder[ iiid2], self.ItemsOrder[iiid1]
def give_item(self, item_instance): """ @warning [Использовать в транзакции] Дать предмет игроку """ if ensure_locked(self.Items, self.ItemsOrder): instance_id = item_instance['InstanceID'] self.Items[instance_id] = item_instance order_values = self.ItemsOrder.values() for i in range(1000): if i not in order_values: self.ItemsOrder[instance_id] = i break
def merge_items(self, source_id, target_id): if ensure_locked(self.ItemsOrder, self.Items): source_item = self.Items[source_id] target_item = self.Items[target_id] source_item_info = item_info = ItemsCatalog.get_by( "Name", source_item["Name"]) target_item_info = ItemsCatalog.get_by("Name", target_item["Name"]) if source_item_info is None or target_item_info is None: ERROR_MSG( f"Failed to merge items with Names " f"{source_item['Name']} & { target_item['Name']}. ItemsCatalog corrupted!" ) return if source_item_info["Name"] != target_item_info["Name"]: ERROR_MSG( f"Failed to merge items with different ID {source_item_info['Name']} & {target_item_info['Name']}" ) return if source_item.Count >= item_info[ "MaxStack"] or target_item.Count >= item_info["MaxStack"]: self.swap_items(source_id, target_id) else: if (source_item.Count + target_item.Count) <= item_info["MaxStack"]: target_item.Count = source_item.Count + target_item.Count self.drop_item(source_id) else: loc_count_item = item_info["MaxStack"] - self.Items[ target_id].Count if self.Items[source_id].Count >= loc_count_item: with self.Items.edit(source_id): target_item.Count += loc_count_item with self.Items.edit(target_id): source_item.Count -= loc_count_item if source_item.Count == 0: with self.Items.edit(source_id): self.drop_item(source_id) else: with self.Items.edit(target_id): target_item.Count += source_item.Count self.drop_item(source_id)
def move_item(self, iiid, order_index): """ @warning [Использовать в транзакции] Переместить предмет с места на место в инвентаре """ if ensure_locked(self.ItemsOrder): order_values = self.ItemsOrder.values() if order_index in order_values: for existed_iiid, existed_order_index in self.ItemsOrder.items( ): if order_index == existed_order_index: if self.is_item_stackable( iiid) and self.is_item_stackable(existed_iiid): if self.Items[iiid]["Name"] == self.Items[ existed_iiid]["Name"]: self.merge_items(iiid, existed_iiid) return else: self.swap_items(iiid, existed_iiid) return else: self.swap_items(iiid, existed_iiid) return self.ItemsOrder[iiid] = order_index
def next_item_instance_id(self): if ensure_locked(self.ItemsCounter): self.ItemsCounter += 1 return self.ItemsCounter