コード例 #1
0
 def drop_item(self, iiid):
     """ @warning [Использовать в транзакции]
         Убрать предмет из инвентаря
     """
     if ensure_locked(self.Items, self.ItemsOrder):
         del self.Items[iiid]
         del self.ItemsOrder[iiid]
コード例 #2
0
 def swap_items(self, iiid1, iiid2):
     """ @warning [Использовать в транзакции]
         Поменять местами предметы
     """
     if ensure_locked(self.ItemsOrder):
         self.ItemsOrder[iiid1], self.ItemsOrder[iiid2] = self.ItemsOrder[
             iiid2], self.ItemsOrder[iiid1]
コード例 #3
0
 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
コード例 #4
0
    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)
コード例 #5
0
 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
コード例 #6
0
 def next_item_instance_id(self):
     if ensure_locked(self.ItemsCounter):
         self.ItemsCounter += 1
         return self.ItemsCounter