This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Вопрос Нужна помощь специалиста

Depp

Активный участник
1 Ноя 2020
116
29
95
Приветствую.
Решил добавить систему крафта на мод RedAge, но столкнулся с одной проблемой.
При выборе предмета для крафта, отображается список и количество предметов которые для этого нужны (На скиншоте видно 1/1 сверху справа от предмета) первая цифра отвечает за то сколько есть в наличии (В инвентаре), вторая сколько нужно чтобы скрафтить.
Но проблема в том что счетчики нормально работают только если есть все предметы для крафта в инвентаре, если хоть одного не хватает, они обновляться не будут.



Вот весь нужный код:


C#:
// Отображение предметов в инвентаре:           

                    <div class="listblocksel">
                        <div v-if="selectedcraft.tr1 != 0" class="listblockselected">
                            <div class="needed"><a style="color: #6b6bfa;">{{counthave1}}</a> / {{selectedcraft.trc1}}</div>
                            <img :src="`./assets/images/icons/items/`+ selectedcraft.tr1 + `.png`" class="icoadds">
                        </div>
                        <div v-if="selectedcraft.tr2 != 0" class="listblockselected">
                            <div class="needed"><a style="color: #6b6bfa;">{{counthave2}}</a> / {{selectedcraft.trc2}}</div>
                            <img :src="`./assets/images/icons/items/`+ selectedcraft.tr2 + `.png`" class="icoadds">
                        </div>
                        <div v-if="selectedcraft.tr3 != 0" class="listblockselected">
                            <div class="needed"><a style="color: #6b6bfa;">{{counthave3}}</a> / {{selectedcraft.trc3}}</div>
                            <img :src="`./assets/images/icons/items/`+ selectedcraft.tr3 + `.png`" class="icoadds">
                        </div>
                    </div>
                    
//server::checkitems
                                
        [RemoteEvent("server::checkitems")]
        public static void ChecksItemsForCraft(Player player, int id)
        {
            int find1 = 0;
            int find2 = 0;
            int find3 = 0;
            switch (id)
            {
                case 0:
                    find1 = nInventory.Find(Main.Players[player].UUID, ItemType.Pißwasser).Count;
                    find2 = nInventory.Find(Main.Players[player].UUID, ItemType.Pizza).Count;
                    find3 = nInventory.Find(Main.Players[player].UUID, ItemType.Burger).Count;
                    Trigger.ClientEvent(player, "client::checkitemsDONE", find1, find2, find3);
                    return;
            }
        }

//client::checkitemsDONE

mp.events.add("client::checkitemsDONE", (a,b,c) => {
    board.execute(`board.counthave1=${a}`);
    board.execute(`board.counthave2=${b}`);
    board.execute(`board.counthave3=${c}`);
});

Буду безумно благодарен если кто-то поможет.
 

Depp

Активный участник
1 Ноя 2020
116
29
95
При открытии предмета в консоле появляется следующее:


C#:
Object reference not set to an instance of an object.
Exception has been thrown by the target of an invocation.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.NullReferenceException: Object reference not set to an instance of an object.
   at void Alyx.Core.Items.ChecksItemsForCraft(Player player, int id) in C:/Users/.../Core/Player/Inventory.cs:line 1821
   --- End of inner exception stack trace ---
   at object RuntimeMethodHandle.InvokeMethod(object target, object[] arguments, Signature sig, bool constructor, bool wrapExceptions)
   at object System.Reflection.RuntimeMethodInfo.Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)
   at void GTANetworkInternals.RemoteEventParser.Parse(Player sender, ulong eventNameHash, params object[] args)
   at void GTANetworkInternals.RemoteEventHandler.Parse(Player sender, ulong eventNameHash, params object[] arguments)

1821 строчка в Inventory.cs:

find1 = nInventory.Find(Main.Players[player].UUID, ItemType.Pißwasser).Count;
 

Randomchik

Старожил
BackEnd developer
19 Сен 2020
823
290
141
У тебя nInventory.Find(Main.Players[player].UUID, ItemType.Pißwasser) вернул null.
 
Реакции: Depp

Randomchik

Старожил
BackEnd developer
19 Сен 2020
823
290
141
find1 = nInventory.Find(Main.Players[player].UUID, ItemType.Pißwasser) != null ? nInventory.Find(Main.Players[player].UUID, ItemType.Pißwasser).Count : 0;
 
Реакции: Depp