Ну вы хоть немного то пытайтесь думать, что пишите! А ещё лучше было бы прочитать какую-нибудь книжку по C++, например.
EntityAI itemEnt;
ItemBase itemBs;
Вы определили переменные типов EntityAI и ItemBase, но эти переменные не инициализированы. У этих переменных нет значения, они равны NULL.
itemBs = ItemBase.Cast(itemEnt);
Теперь вы пытаетесь привести объект одного класса к другому, но itemEnt у нас всё ещё не инициализирована и равна NULL. Соответственное, операция проходит неудачно и itemBs не получает значения.
itemBs.SetQuantity(5);
Здесь вы пытаетесь вызвать метод SetQuantity() у объекта, на который должна указывать переменная itemBs, а она никуда не указывает и метод вызывать не получается.
Короче, делается всё так:
Если хотим просто запихнуть какую-то вещь в инвентарь игрока и не собираемся производить с этой вещью каких-либо операций, то просто пишем
player.GetInventory().CreateInInventory("MyCoolObject");
Если собираемся что-то с этой вещью делать, например, изменить её состояние и(ли) количество, то пишем
itemEnt = player.GetInventory().CreateInInventory("MyCoolObject");
Мы в переменную itemEnt сохранили «указатель» на объект, который мы создали. Дальше нам нужно привести объект к классу ItemBase, чтоб вызвать метод SetQuantity() и изменить количество:
itemEnt.SetHealth("","",50); // вызываем метод SetHealth() класса EntityAI и, тем самым, меняет уровень «здоровья» предмету (сломали на половину)
itemBs = ItemBase.Cast(itemEnt); // приводим объект класса EntityAI (в переменной itemEnt) к классу ItemBase (в переменной itemBs)
itemBs.SetQuantity(4); // вызываем метод SetQuantity() класса ItemBase и, тем самым, задаём количество (для стакающихся предметов) или наполненность объекта (для нестакающихся предметов — фляги, обоймы и т.п.)
Опять же, например, хотим дать игроку рюкзак и ботинки, положив в них определенные вещи:
itemEnt = player.GetInventory().CreateInInventory("MyCoolBagPack"); // даём игроку условный рюкзак и запоминаем «ссылку» на него
itemEnt.GetInventory().CreateInInventory("MyCoolObject"); // «даём» рюкзаку, который ранее выдали игроку некий объект, т.ч. теперь у игрока в выданном ранее рюкзаке лежит этот объект
itemEnt = player.GetInventory().CreateInInventory("MilitaryBoots_Black"); // даём игроку военные ботинки
itemEnt.GetInventory().CreateInInventory("CombatKnife"); // «даём» ботинках боевой нож (кладём в них боевой нож)
itemEnt = player.GetHumanInventory().CreateInHands("AKM"); // дали игроку в руки «калаш»
itemEnt.GetInventory().CreateAttachment("AK_Suppressor"); // установили на «калаш» глушитель
itemEnt = player.GetInventory().CreateInInventory("Flashlight"); // дали игроку фонарик
itemEnt = itemEnt.GetInventory().CreateAttachment("Battery9V"); // установили в него батарейку, запомнили указатель на батарейку
itemEnt.SetQuantity(25); // разрядили батарейку на 3/4 (здесь не уверен, но по идее заряд через ItemBase.SetQuantity() указывается)
Писал «от руки», т.ч. где-то мог ошибиться в названии методов, но главное, чтоб суть была ясна.
P.S. Для большей наглядности ещё немного говнокода добавлю:
EntityAI itemEnt;
EntityAI itemTmp; // определили переменные itemEnt и itemTmp типа EntityAI
ItemBase itemBs; // определили переменную itemBs типа ItemBase
// Сейчас itemEnt, itemTmp и itemBs равны NULL
player.GetInventory().CreateInInventory("Armband_Red"); // создали в инвентаре игрока красную повязку, но никуда не сохранили указатель на неё
itemEnt = player.GetInventory().CreateInInventory("AliceBag"); // создали рюкзак в инвентаре игрока и сохранили указатель на него в itemEnt
if( itemEnt ) // проверяем, создался ли рюкзак (если нет, то значение itemEnt будет NULL; например, мы допустили опечатку в названии рюкзака)
{
itemEnt.GetInventory().CreateInInventory("Apple"); // создаём яблоко в рюкзаке, но не сохраняем на него указатель
itemTmp = itemEnt.GetInventory().CreateInInventory("Apple"); // создаём ещё яблоко в рюкзаке, но теперь СОХРАНЯЕМ на него указатель в itemTmp
itemTmp.SetHealth("", "", 10); // меняем второму яблоку «здоровье», теперь оно, наверное, RUINED.
itemEnt.GetInventory().CreateInInventory("Plum"); // создаём сливу в рюкзаке
}
Обращу внимание, что специально для операций над вторым яблоком я заранее определил дополнительную переменную itemTmp, ведь itemEnt мне ещё нужна (точнее её значение — ссылка в ней на рюкзак), чтоб дальше класть предметы в рюкзак.