• Хостинг игровых серверов

    Максимальная производительность для ваших игровых серверов!

    Заказать сейчас

Обсудим Не работает MoveToContainer

IIIaKa

23 Авг 2023
10
2
6
При создании плагина, столкнулся с проблемой с методом MoveToContainer.
Не могу понять в чем проблема. Для примера, мне нужно, чтобы при выпадении камня, он переносился в ящик(для примера взял свой инвентарь).
Но он не переносится, если в инвентаре нет слота с камнем(stones). Но при этом из мира он пропадает и ни какой ошибки в консоле нет.
Если в инвентаре оставить хотя бы 1 штуку камня, то тогда он без проблем переносет.
Как исправить это? Есть ли альтернатива этому?

C#:
void OnItemDropped(Item item, BaseEntity entity)
{
     var player = BasePlayer.FindByID(*steamID*);
     if (item.info.shortname == "stones")
          item.MoveToContainer(player.inventory.containerMain);
          //item.MoveToContainer(player.inventory.containerMain, 0);
          //item.MoveToContainer(player.inventory.containerMain, 1);
          //item.MoveToContainer(player.inventory.containerMain, -1, true, true);
}
 
Единственное, что получается, это создать новый Item, затем переместить его в нужный контейнер и удалить старый Item.

C#:
ItemDefinition newItemDef = ItemManager.FindItemDefinition(item.info.shortname);
Item newItem = ItemManager.Create(newItemDef, item.amount);
if (newItem != null)
{
     newItem.name = item.name;
     newItem.MoveToContainer(player.inventory.containerMain);
     item.Remove();
}
 
Проблема, с которой вы столкнулись, связана с условием, которое у вас сейчас написано перед перемещением предмета в контейнер. Вы проверяете, есть ли у игрока предмет в инвентаре, и если его нет, то ничего не делаете.

Вместо этого, вам нужно использовать метод TryMoveItemToContainer, который позволит вам перемещать предметы даже в отсутствующие слоты в инвентаре.

Вот исправленный код:

C#:
void OnItemDropped(Item item, BaseEntity entity)
{
    var player = BasePlayer.FindByID(*steamID*);
    if (item.info.shortname == "stones")
    {
        var targetContainer = player.inventory.containerMain;
        item.TryMoveItemToContainer(targetContainer);
    }
}

Теперь предмет будет перемещаться в контейнер player.inventory.containerMain, даже если в нем нет слота для камней.
 
Активность
Пока никто не печатает сообщение