Имеется лавка Статуя в инвентаре которой лежит предмет "Обменять способность" при использовании этого предмета в лавку добавляется 1 рандомный предмет (на данный момент 1 из 8) - это работает.
Если добавленный предмет покупают то нужно чтобы этот предмет больше не выпадал как рандомный, то есть больше не добавлялся в лавку после использования "Обменять способность" - вот с этим какой то косяк, после приобретения нескольких предметов из лавки при использовании "Обменять способность" могут добавляться предметы которые уже были куплены или же некоторые предметы вообще перестают добавляться в лавку. Прилагаю карту для тестов, хелп!

Принятый ответ

Так как автор гуишник, вариант будет актуальным.
Переменные:
item - массив предметов(заполняется нужными предметами 0-7)
max - целочисленная (равна количеству предметов 7)
random - целочисленная
Второй триггер:
random = случайное число от 0 до max
цыкл А от 0 до max
Добавить предмет item[A]
Конец цикла
item[random] = item[max]
max = max - 1
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
3 года назад
0
Извиняюсь за некромантию, но мне сказали тут построить зиккурат
Смотрю никто так и не ответил на вопрос, хотя решение вроде бы простое
Вариантов много, но я решил через хэш-таблицу и сохранением предметов в юнита
код
define{void = nothing; int = integer; bool = boolean}
library mylib initializer init{
    private hashtable H = InitHashtable()
    
    private void act(){
        unit u = GetSellingUnit()
        int i = GetHandleId(u), c = 0, c1, c2 = 0
        
        if !HaveSavedInteger(H,i,c){
            BJDebugMsg("закончились итемы")
        }else{
            while HaveSavedInteger(H,i,c){c++; BJDebugMsg(I2S(c))}
            c--; c1 = c; c = GetRandomInt(0,c)
            AddItemToStock(u,LoadInteger(H,i,c),1,1)
            RemoveSavedInteger(H,i,c)
            if c != c1{
                SaveInteger(H,i,c,LoadInteger(H,i,c1))
                RemoveSavedInteger(H,i,c1)
            }
        }
        
        u = null
    }
    
    private void save(){
        int i = GetHandleId(GetEnumUnit())
        SaveInteger(H,i,0,'spsh')
        SaveInteger(H,i,1,'pmna')
        SaveInteger(H,i,2,'penr')
        SaveInteger(H,i,3,'ward')
        SaveInteger(H,i,4,'ratc')
    }
    private bool cond(){return GetItemTypeId(GetSoldItem()) == 'I000'}
    private bool cond1(){return !IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) && GetUnitTypeId(GetFilterUnit()) == 'ngme'}
    private void init(){
        trigger t = CreateTrigger(); int i = 0; group g = CreateGroup()
        
        while i < 16{
            TriggerRegisterPlayerUnitEvent(t,Player(i++),EVENT_PLAYER_UNIT_SELL_ITEM,null)
        }
        TriggerAddCondition(t,Condition(function cond))
        TriggerAddAction(t,function act)
        t = null
        
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function cond1))
        ForGroup(g,function save)
        GroupClear(g); DestroyGroup(g); g = null
        
        SetPlayerState(Player(0),PLAYER_STATE_RESOURCE_GOLD,99999)
        
    }
}
В чём суть: если у юнита нет сохраннёного айди итема в первой ячейке, значит все рандомные предметы уже выпали, выскакивает надпись, что они закончились
иначе - идёт подсчёт кол-ва оставшихся предметов, среди них выбирается рандомный, он добавляется в магазин и удаляется из хэша юнита, последний из списка предмет переносится на место удалённого, последнее место так же удаляется

это можно на гуи сделать, но я никогда не юзал там хэш-таблицу, так что сорян))
Загруженные файлы
2
13
3 года назад
2
Так как автор гуишник, вариант будет актуальным.
Переменные:
item - массив предметов(заполняется нужными предметами 0-7)
max - целочисленная (равна количеству предметов 7)
random - целочисленная
Второй триггер:
random = случайное число от 0 до max
цыкл А от 0 до max
Добавить предмет item[A]
Конец цикла
item[random] = item[max]
max = max - 1
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.