Решил сделать систему, позволяющие иметь ЮНИТУ (или предмету) множество переменных(integer,real,unit и тд) и СТРУКТУР созданым пользователем, система связанна на прямую с SetUnitUserData, и лучше если, вы используйте эту нароботку, SetUnitUserData не использовать. Опытные коддеры скажут, почему тебя не устраивает КеШ и ХеШ таблицы, отвечу - к ним нельзя привязать свои переменные созданные при помощи JNGP. так же в дальнейшим я буду юзать и эту систему совместно ХеШТаблицы. Вот собственно эта системка, сделал меньше чем за пару часов, но работает на ура. кто может, подскажите как её улучшить.
Code
struct Item
item array I[12]
endstruct
struct Unit extends array [500]
unit UnitA
integer Int
real Real1
real Real2
Item Items
endstruct
globals
integer kolvo = 0
endglobals
function AddUnitS takes unit u returns nothing
set kolvo = kolvo + 1
set Unit[kolvo].UnitA = u
call SetUnitUserData( u, kolvo )
endfunction
function RemoveUnitS takes unit u returns nothing
local integer i = GetUnitUserData(u)
local integer i2 = 0
//
set Unit[i].UnitA = Unit[kolvo].UnitA
set Unit[i].Int = Unit[kolvo].Int
set Unit[i].Real1 = Unit[kolvo].Real1
set Unit[i].Real2 = Unit[kolvo].Real2
loop
exitwhen i2 > 12
set Unit[i].Items.I[i2] = Unit[kolvo].Items.I[i2]
set Unit[kolvo].Items.I[i2] = null
set i2 = i2 + 1
endloop
//
set Unit[kolvo].UnitA = null
set Unit[kolvo].Int = 0
set Unit[kolvo].Real1 = 0
set Unit[kolvo].Real2 = 0
//
set kolvo = kolvo - 1
endfunction
function Prinadl takes unit u returns boolean
local boolean b = false
local integer i = 0
loop
exitwhen i > kolvo
if ( u == Unit[i].UnitA) then
set b = true
endif
endloop
return b
endfunction
function GetUnit takes integer i returns unit
return Unit[i].UnitA
endfunction
Ну вот собсвенно, а теперь по частям.
__________________________________________________________________________________
Code
struct Item
item array I[12]
endstruct
Вот собственно для чего эта системка, обычная структура, вмещает себя 12 предметов.
__________________________________________________________________________________
Code
struct Unit extends array [500]
unit UnitA
integer Int
real Real1
real Real2
Item Items
endstruct
А вот какие параметры я привязываем к юниту: Целочисловую переменную, два реальных и замедте:
Привязал свой тип данных, в данном случае привязал массив из 12 предметов.
Code
[color=red]extends array [500][/color]
Массив из 500, это значит что в этом случае можно привязать данные к 500 юнитам, можно увеличить. __________________________________________________________________________________
Чтобы юниту можно присвоить данные, нужно использовать функцию:
Code
function AddUnitS takes unit u returns nothing
set kolvo = kolvo + 1
set Unit[kolvo].UnitA = u
call SetUnitUserData( u, kolvo )
endfunction
Чтобы убрать (если юнит уже не нужен):
Code
function RemoveUnitS takes unit u returns nothing
local integer i = GetUnitUserData(u)
local integer i2 = 0
//
set Unit[i].UnitA = Unit[kolvo].UnitA
set Unit[i].Int = Unit[kolvo].Int
set Unit[i].Real1 = Unit[kolvo].Real1
set Unit[i].Real2 = Unit[kolvo].Real2
loop
exitwhen i2 > 12
set Unit[i].Items.I[i2] = Unit[kolvo].Items.I[i2]
set Unit[kolvo].Items.I[i2] = null
set i2 = i2 + 1
endloop
//
set Unit[kolvo].UnitA = null
set Unit[kolvo].Int = 0
set Unit[kolvo].Real1 = 0
set Unit[kolvo].Real2 = 0
//
set kolvo = kolvo - 1
endfunction
__________________________________________________________________________________
Функция, проверяет, принадлижит ли этот юнит к списку юнитов, которым привязанны данные.
Code
function Prinadl takes unit u returns boolean
local boolean b = false
local integer i = 0
loop
exitwhen i > kolvo
if ( u == Unit[i].UnitA) then
set b = true
endif
endloop
return b
endfunction
__________________________________________________________________________________ Собственно по номеру возращает юнита:
Code
function GetUnit takes integer i returns unit
return Unit[i].UnitA
endfunction
__________________________________________________________________________________ А теперь, если вам нужно "Прочитать" или изменить данные юнита используем:
Unit[GetUnitUserData(u)].Тип Данных
Пример:
local integer i = Unit[GetUnitUserData(u)].Int // берем данные
set Unit[GetUnitUserData(u)].Int = 20// присаиваем значение
С структурами также:
local item i = Unit[GetUnitUserData(u)].Items.I[5] // присваиваем к переменной, 5 предмет который присвоин к юниту.
set Unit[GetUnitUserData(u)].Items.I[2] = i // присваиваем к юниту предмет.
с JNGP я работаю только сегоднишинй день, жду ваших коментарий
для коректной работы скачайте Jass New Gen Pack
Добавлено (22-07-2009, 03:37)
---------------------------------------------
Модер, исправте название темы на My CostumeVаlue