Используемый интерпретатор: vJass
struct vJass'a не использовал, пусть горит Векси###-решеточка в ##решеточка
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 от хлама или просто что-то случиться.
Ты всё таки прочитал
Да, те функции не описаны, потому, что они не используется внтури.
Да, я решил написать свою табличную системку, которая будет рандомит предметы.
Да, я написал потому, что один пользователь что-то спрашивал, вдруг пригодится в какой-нить карте.
Да, я решил написать свою табличную системку, которая будет рандомит предметы.
Да, я написал потому, что один пользователь что-то спрашивал, вдруг пригодится в какой-нить карте.
В случаи обнаружении ошибок, код будет исправлен.