Не люблю скрипты, но была задачка, пришлось лезть не в свой огород.
Ситуация: NPC-торговец, имеет заданный инвентарь, состоящий из определённого количества предметов, прописанных в простенькой B-функции вида:
func void B_GIVE_INV()
{
CreateInvItem(self,SWORD1);
CreateInvItem(self,SWORD2);
...
CreateInvItem(self,SWORDN);
};
Вызываем функцию, торговец получает мечи. Затем, при определённом условии ему надо очистить эти мечи. Пишем так:
func void B_CLEAR_INV()
{
Npc_RemoveInvItems(self,SWORD1,Npc_HasItems(self, SWORD1);
Npc_RemoveInvItems(self,SWORD2,Npc_HasItems(self, SWORD2);
...
Npc_RemoveInvItems(self,SWORDN,Npc_HasItems(self, SWORDN);
};
При чистом тесте вроде как работает. Проверяю- инвентарь пуст. Хорошо.
Но в реальной игре можно продать ему кучу хлама, купить что-то. Короче, обычная игровая рутина. В результае у торговца может оказаться 2-3 одинаковых меча (нашёл такой-же и продал ему). Мечи не носят флаг MULTI и каждый сидит в своём слоте. В этом случае все мечи, имеющие дубликаты, остаются в инвентаре. Т.е. не срабатывает конструкция:
Npc_RemoveInvItems(self,SWORDN,Npc_HasItems(self, SWORDN);
Всё остальное удаляется: multi-предметы и оружие, не имеющее дубликатов в инвентаре торговца.
Очередной ли это глюк движка, или тут ошибка скрипта? Или быть может есть другие варианты решения задачи?
* тест вёл на Готике1. Думаю, в Г2 будет такой же результат.