Unrealscript: как добавить оружие в инвентарь, только если группа вашего оружия уникальна - PullRequest
1 голос
/ 02 февраля 2012

Я пытался заставить нестандартный скрипт инвентаря работать в нереализованном виде.Мне нужно проверить при получении оружия, есть ли у оружия, которое вы забираете, группа оружия, которая соответствует той, которая у вас уже есть, или нет.Если так, то это меняет оружие данной группы.Если нет, вы получаете новое оружие.В настоящее время у нас есть 4 группы оружия.То, что я пытался безрезультатно найти, - это как найти группу оружия для подобранного оружия.и как проверить это против другого оружия.Я работал с функцией добавления инвентаря.

NewItem - элемент, с которым вы только что взаимодействовали.И мне нужно найти другое оружие в вашем текущем инвентаре и его оружейные группы.

simulated function bool AddInventory(Inventory NewItem, optional bool bDoNotActivate)
{
    local Inventory Item, LastItem;

    // The item should not have been destroyed if we get here.
    if( (NewItem != None) && !NewItem.bDeleteMe )
    {
        // if we don't have an inventory list, start here
        if( InventoryChain == None )
        {
            InventoryChain = newItem;
        }
        else
        {
            // Skip if already in the inventory.
            for (Item = InventoryChain; Item != None; Item = Item.Inventory)
            {
                if( Item == NewItem )
                {
                    return FALSE;
                }
                LastItem = Item;
            }
            LastItem.Inventory = NewItem;
        }

        //Edited by Matt Kerns

        `LogInv("adding" @ NewItem @ "bDoNotActivate:" @ bDoNotActivate);

        `Log ("Added to inventory!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        NewItem.SetOwner( Instigator );
        NewItem.Instigator = Instigator;
        NewItem.InvManager = Self;
        NewItem.GivenTo( Instigator, bDoNotActivate);

        // Trigger inventory event
        Instigator.TriggerEventClass(class'SeqEvent_GetInventory', NewItem);
        return TRUE;
    }

    return FALSE;
}

1 Ответ

0 голосов
/ 22 февраля 2012

Если вы хотите написать весь код в InventoryManager, он будет выглядеть как

simulated function bool AddInventory(Inventory NewItem, optional bool bDoNotActivate){
local Inventory Item, LastItem;

// The item should not have been destroyed if we get here.
if( (NewItem != None) && !NewItem.bDeleteMe )
{
//if weapon - work in personal weapon function
if(Weapon(NewItem) != none)
        return AddItemWeapon(NewItem, bDoNotActivate);
    // if we don't have an inventory list, start here
    if( InventoryChain == None )
    {
        InventoryChain = newItem;
    }
    else
    {
        // Skip if already in the inventory.
        for (Item = InventoryChain; Item != None; Item = Item.Inventory)
        {
            if( Item == NewItem )
            {
                return FALSE;
            }
            LastItem = Item;
        }
        LastItem.Inventory = NewItem;
    }

    //Edited by Matt Kerns

    `LogInv("adding" @ NewItem @ "bDoNotActivate:" @ bDoNotActivate);

    `Log ("Added to inventory!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    NewItem.SetOwner( Instigator );
    NewItem.Instigator = Instigator;
    NewItem.InvManager = Self;
    NewItem.GivenTo( Instigator, bDoNotActivate);

    // Trigger inventory event
    Instigator.TriggerEventClass(class'SeqEvent_GetInventory', NewItem);
    return TRUE;
}

return FALSE;

}

имитированная функция AddItemWeapon (Inventory NewItem, необязательный bool bDoNotActivate) {

local Inventory Item, LastItem;
local Weapon WeaponNewItem;

WeaponNewItem= Weapon(NewItem);

// The item should not have been destroyed if we get here.
if( (NewItem != None) && !NewItem.bDeleteMe )
{
    // if we don't have an inventory list, start here
    if( InventoryChain == None )
    {
        InventoryChain = newItem;
    }
    else
    {
        //look for our group
        for (Item = InventoryChain; Item != None; Item = Item.Inventory){
            if(Weapon(Item) != none && Weapon(Item).Group == WeaponNewItem.Group){
                RemoveFromInventory(Item);
                break;
            }

        }
            // Skip if already in the inventory.
            for (Item = InventoryChain; Item != None; Item = Item.Inventory)
            {
                if( Item == NewItem )
                {
                    return FALSE;
                }
                LastItem = Item;
            }
            LastItem.Inventory = NewItem;

    }

    //Edited by Matt Kerns

    `LogInv("adding" @ NewItem @ "bDoNotActivate:" @ bDoNotActivate);

    `Log ("Added to inventory!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    NewItem.SetOwner( Instigator );
    NewItem.Instigator = Instigator;
    NewItem.InvManager = Self;
    NewItem.GivenTo( Instigator, bDoNotActivate);

    // Trigger inventory event
    Instigator.TriggerEventClass(class'SeqEvent_GetInventory', NewItem);
    return TRUE;
}

return FALSE;

}

Это лучший способ, если ваша игра использует сеть и копирует инвентарь. Если нет, то вы можете просто написать что-то вроде

simulated function AddItemWeapon(Inventory NewItem, optional bool bDoNotActivate){
local Inventory Item, LastItem;
local Weapon WeaponNewItem;
local bool bAddNewWeapon;

bAddNewWeapon = true;
WeaponNewItem = Weapon(NewItem);

// The item should not have been destroyed if we get here.
if( (NewItem != None) && !NewItem.bDeleteMe )
{
    // if we don't have an inventory list, start here
    if( InventoryChain == None )
    {
        InventoryChain = newItem;
    }
    else
    {
        //look for our group
        for (Item = InventoryChain; Item != None; Item = Item.Inventory){
            if(Weapon(Item) != none && Weapon(Item).Group == WeaponNewItem.Group){
                NewItem.Inventory = Item.Inventory; 
                bAddNewWeapon = false;
                RemoveFromInventory(Item);
                break;
            }
            LastItem = Item;

        }
        if(bAddNewWeapon){
            for (Item = InventoryChain; Item != None; Item = Item.Inventory){
                LastItem = Item;
            }
        }
        LastItem.Inventory = NewItem;
    }

Но я уверен, что это плохой путь. Вы должны написать класс, который будет сохранять все используемые группы оружия и использовать InventoryManager только в качестве хранилища

...