Добавлен , опубликован
Используемый интерпретатор: vJass
struct vJass'a не использовал, пусть горит Векси###-решеточка в ##решеточка
И так я писал скорее не таблицу предметов, это больше походит на список типов.
Список функций:
function InitItemtableRes takes nothing returns nothing
function ItemtableCreate takes nothing returns integer
function DestroyItemtable takes integer whichItemtable returns boolean
function ItemtableAdd takes integer wItemtable, integer ItemTypeId returns boolean
function ItemtableRemove takes integer wItemtable, integer ItemId returns boolean
function ItemtableByIdRemove takes integer wItemtable, integer index returns boolean
function GetLastItemtableItemId takes nothing returns integer
function ItemTableGetItemRndId takes integer wItemtable returns integer
function ItemTableGetItemId takes integer wItemtable returns integer
function ItemTableGetItemIdOfChance takes integer wItemtable returns integer
Код
library KjItemTable
    globals
        integer kjs_itemtbale           = 0x0
        integer kjs_saved_itemtable     = 0x0
        boolean array kjs_fr_itemtable
        integer array kjs_st_itemtable
        integer kjs_itemtable_Result    = 0x0
        integer array kjs_it_ItemId       
        integer array kjs_it_sCnt
        integer kjs_it_LastAddedItemId  = 0x0
        constant integer kjs_it_ItAr    = 0xC
        integer array TempInt
    endglobals

    function InitItemtableRes takes nothing returns nothing
        local integer i = 0x0
        loop
            set kjs_fr_itemtable[i] = true
            set kjs_st_itemtable[i] = 0x0
            set i = i + 1
        exitwhen i == 0x2AA
        endloop
        set kjs_itemtbale       = 0x0 - 0x1
        set kjs_saved_itemtable = 0x0 - 0x1
        set i = 0x0
    endfunction


    function FreeItemTable takes integer whichItemtable returns nothing
        local integer i = 0x0
        local integer arr = whichItemtable * kjs_it_ItAr
        set kjs_it_sCnt[whichItemtable] = 0x0
        loop
            set kjs_it_ItemId[i+arr] = 0x0
            set i = i + 0x1
        exitwhen i == kjs_it_ItAr
        endloop
        set i = 0x0
        set arr = 0x0
    endfunction

    function ItemtableCreate takes nothing returns integer
        if kjs_saved_itemtable >= 0x0 then
            set kjs_itemtable_Result                        = kjs_st_itemtable[kjs_saved_itemtable]
            set kjs_fr_itemtable[kjs_itemtable_Result]      = false
            set kjs_saved_itemtable                         = kjs_saved_itemtable - 0x1
            return kjs_itemtable_Result 
        else
            if kjs_itemtbale < 0x2AA then
                set kjs_itemtbale = kjs_itemtbale + 0x1
                call FreeItemTable(kjs_itemtbale)
                return kjs_itemtbale
            else
                call BJDebugMsg("Ошибка: Исчерпано ограничение таблиц!")
                return 0
            endif
        endif
    endfunction

    function DestroyItemtable takes integer whichItemtable returns boolean
        if whichItemtable >= 0x0 and whichItemtable < 0x2AA then
            if kjs_fr_itemtable[whichItemtable] then
                call BJDebugMsg("Ошибка: Все данные по таблице и так свободны. Ты что свободную птичку освобождаешь, когда она уже свободна, а?")
                return false
            else
                call FreeItemTable(whichItemtable)
                set kjs_saved_itemtable = kjs_saved_itemtable + 0x1 
                set kjs_st_itemtable[kjs_saved_itemtable] = whichItemtable
                set kjs_fr_itemtable[whichItemtable] = true
                return true
            endif
        else
            call BJDebugMsg("Ошибка: Что за наглость вводить меньше нуля, али выше ограничения попёр???!! аа!!???")
            return false
        endif
    endfunction

    function ItemtableAdd takes integer wItemtable, integer ItemTypeId returns boolean
        if wItemtable >= 0x0 and wItemtable < 0x2AA then
            if kjs_fr_itemtable[wItemtable] then
                call BJDebugMsg("Ошибка: Нельзя задавать значения освобождённой таблице!")
                return false
            else
                if kjs_it_sCnt[wItemtable] < kjs_it_ItAr then
                    set kjs_it_LastAddedItemId = kjs_it_sCnt[wItemtable]+kjs_it_ItAr
                    set kjs_it_ItemId[kjs_it_LastAddedItemId] = ItemTypeId
                    set kjs_it_sCnt[wItemtable] = kjs_it_sCnt[wItemtable] + 1
                else
                    call BJDebugMsg("Ошибка: Нельзя добавить предмет, исчерпано ограничение предметов в таблице.")
                    return false
                endif
            endif
        else
            call BJDebugMsg("Ошибка: Что за наглость вводить меньше нуля, али выше ограничения попёр???!! аа!!???")
            return false
        endif
        return true
    endfunction

    function GetLastItemtableItemId takes nothing returns integer
        return kjs_it_LastAddedItemId
    endfunction
    
    function FlushItemtable takes integer wItemtable, integer ItemId returns nothing
        local integer i = 0x0
        local integer j = 0x0
        local integer arr = wItemtable * kjs_it_ItAr
        loop
            if kjs_it_ItemId[i+arr] > 0x0 and kjs_it_ItemId[i+arr] != ItemId then
                set TempInt[j] = kjs_it_ItemId[i+arr]
                set j = j + 0x1
            endif
            set kjs_it_ItemId[i+arr] = 0x0
            set i = i + 0x1
        exitwhen i == kjs_it_ItAr
        endloop
        set i = 0x0
        loop
            set kjs_it_ItemId[i+arr] = TempInt[i]
            set i = i + 0x1
        exitwhen i == j
        endloop
        set i = 0x0
        set j = 0x0
        set arr = 0x0
    endfunction
    
    function ItemtableRemove takes integer wItemtable, integer ItemId returns boolean
        if wItemtable >= 0x0 and wItemtable < 0x2AA then
            if kjs_fr_itemtable[wItemtable] then
                call BJDebugMsg("Ошибка: Нельзя  удалять на освобождённой таблице.")
                return false
            else
                if kjs_it_sCnt[wItemtable] > 0 and ItemId < wItemtable*kjs_it_ItAr+kjs_it_ItAr then
                    call FlushItemtable(wItemtable,ItemId)
                    set kjs_it_sCnt[wItemtable] = kjs_it_sCnt[wItemtable] - 1
                else
                    call BJDebugMsg("Ошибка: Нельзя удалить премдет, таблица пуста.")
                    return false
                endif
            endif
        else
            call BJDebugMsg("Ошибка: Что за наглость вводить меньше нуля, али выше ограничения попёр???!! аа!!???")
            return false
        endif
        return true
    endfunction
    
    function ItemtableByIdRemove takes integer wItemtable, integer index returns boolean
        local integer ItemId = 0x0
        if wItemtable >= 0x0 and wItemtable < 0x2AA then
            if kjs_fr_itemtable[wItemtable] then
                call BJDebugMsg("Ошибка: Нельзя  удалять на освобождённой таблице.")
                return false
            else
                if kjs_it_sCnt[wItemtable] > 0 and index < kjs_it_sCnt[wItemtable] then
                    set kjs_it_LastAddedItemId = index+wItemtable*kjs_it_ItAr
                    call FlushItemtable(wItemtable,kjs_it_LastAddedItemId)
                    set kjs_it_sCnt[wItemtable] = kjs_it_sCnt[wItemtable] - 1
                else
                    call BJDebugMsg("Ошибка: Нельзя удалить премдет, таблица пуста.")
                    return false
                endif
            endif
        else
            call BJDebugMsg("Ошибка: Что за наглость вводить меньше нуля, али выше ограничения попёр???!! аа!!???")
            return false
        endif
        set ItemId = 0x0
        return true
    endfunction
    
    function ItemTableGetItemRndId takes integer wItemtable returns integer
        return kjs_it_ItemId[kjs_it_ItAr*wItemtable+GetRandomInt(0,kjs_it_sCnt[wItemtable])]
    endfunction
    
    function ItemTableGetItemId takes integer wItemtable, integer index returns integer
        return kjs_it_ItemId[kjs_it_ItAr*wItemtable+index]
    endfunction
    
    function ItemTableGetItemIdOfChance takes integer wItemtable, integer index, integer chance returns integer
        if chance <= 100 then
            return kjs_it_ItemId[kjs_it_ItAr*wItemtable+index]
        endif
        return 0
    endfunction
endlibrary
Функция Описание
InitItemtableRes() Нужна для инициализации обрабочика таблиц.(Обязательна)
ItemtableCreate() Создаёт таблицу
DestroyItemtable(wItemtable) Удаляет таблицу
ItemtableAdd(wItemtable,'I000') Добавляет тип предмета в таблцу
GetLastItemtableItemId() Возвращает ячейку из массива [n*12+i]
ItemtableRemove(wItemtable,itemIdN) Удаляет из общего массива по его ячейке
ItemtableByIdRemove(wItemtable,Index) Удаляет из общего массива по таблице от её индекса 0..11
ItemTableGetItemRndId() Возвращает случайный тип предмета от 0 до max
ItemTableGetItemId Возращает тип предмета по индексу в таблице
ItemTableGetItemIdOfChance Возвращает тип предмета по индексу в таблице с шансом, если не выпал то вернёт 0.

Я человек честный. Ещё эту табличку(список) ,не испытывал, но писал просчитывая в уме каждую мелочь. Мог просто что-то упустить.
ПН (Читать не обязательно)
Такс, но всё таки оставлю это здесь, всякое бывает. Чтобы по сто раз не писать, в случае если удалю случайно, когда буду чистить HDD от хлама или просто что-то случиться.
Ты всё таки прочитал
Да, те функции не описаны, потому, что они не используется внтури.
Да, я решил написать свою табличную системку, которая будет рандомит предметы.
Да, я написал потому, что один пользователь что-то спрашивал, вдруг пригодится в какой-нить карте.

В случаи обнаружении ошибок, код будет исправлен.
`
ОЖИДАНИЕ РЕКЛАМЫ...