Есть способ такое организовать? Random creep unit-type я видел, но она выдаёт очень ограниченный набор мобов. Можно как-нибудь расширить выдачу? Или другим способом.
Спасибо. В принципе ясно - предлагаете расширить пул крипов, или создать свои пулы и спавнить из них. А где можно узнать идентификаторы монстров, игроков (у меня русский WorldEditor) ? (да, с программированием знаком не по наслышке, хотя с джассом пока не работал)
И кстати, я так понял что это надо писать в "нестанандартный код" и вызывать через кастом скрипт.
Блин, у меня при попытке сохранениия после ввода любого кода в кастом скрипт вылетает ошибка что нет конца строки. В том числе и скопированного и статьи http://warcraft3ft.info/forum/29-36819-1. Спасибо, кстати, прочитал.
private function GetRandomUnit takes rect r, integer times returns nothing// - берет область rect r, integer times local unitpool up = LoadUnitPoolHandle(Hash, GetHandleId, 0)// - загружаем из хеша unitpool if (LocalUnits) then// - условия которое опишу далее, даст нам значение true если в области отстуствуют уже крипы. Тоесть крипы убиты. loop// - далее простейший цикл exitwhen times == 0// - сколько раз надо создать рандомного юнита. call PlaceRandomUnit(up, Player(PLAYER_NEUTRAL_AGGRESSIVE), GetRectCenterX, GetRectCenterY, 0)// - создаем юнит для игрока в позиции call SaveUnitPoolHandle(Hash, GetHandleId, 0, up)// - сохраняем уже изменившиеся параметры unitpool'а - это обязательно. set times = times - 1 endloop endif set up = null endfunction
private function CreateRandomUnits takes nothing returns nothing// - ни чего не берет и не возвращает call GetRandomUnit(gg_rct_NC1, 2)// - вызывает функцию "GetRandomUnit" которая создаст нам рандомных юнитов. Функция ьерет область и кол-во юнитов для создания. Кол-во может быть любым от 0 до ... endfunction
private function InitTimer takes nothing returns nothing set gg_trg_test = CreateTrigger()// - создаст нам триггер который будет выполнять дейтсвия через период вермени call TriggerRegisterTimerEvent(gg_trg_test, 50, true)// - зарегистрируем событие триггера через каждые 50 секунд call TriggerAddAction(gg_trg_test, function CreateRandomUnits)// - добавим функцию которая будет выполняться через период времени endfunction
function AttachPool takes rect r returns nothing// - функция берет в виде аргумента область rect r local unitpool up = CreateUnitPool()// - создаем локальный unitpool call SaveUnitPoolHandle(Hash, GetHandleId, 0, up)// - сохраняем в хеш локально созданный unitpool для каждой области. set up = null// - оптимизация endfunction
function AddTypes takes rect r, integer id, real times returns nothing// - функция берет значения: область, рав-код, уровень слуайности. local unitpool up = LoadUnitPoolHandle(Hash, GetHandleId, 0)// - загружаем unitpool для выбранной области call UnitPoolAddUnitType(up, id, times)// - добавляем рав-код в unitpool и уровень случайности call SaveUnitPoolHandle(Hash, GetHandleId, 0, up)// - сохраняем unitpool для выбранной области в хеш-таблицу. set up = null endfunction
private function LocalUnits takes rect r returns boolean// - берет в виде аргумента область local group g = CreateGroup()// - создаем локальную группу call GroupEnumUnitsInRect(g, r, Condition(function FilterCreeps))// - пикаем в группу юнитов через фильтр if (FirstOfGroup(g) == null) then// - проверяем - есть ли в группе юниты return true// - если условие выполнилось возвращаем true - тоесть юнитов в группе НЕТ. endif call DestroyGroup(g)// - удаляем группу set g = null return false// - иначе возвращаем false endfunction
Это функции, принимают rect. Т. е. после каждой должно быть ( r ). Если писать без пробелов (как все и делают), форумный движок превратит это в ®. То же самое с GetHandleId(...).
Quote (Eliont)
Выдаёт ошибку. Если убрать, то компилируется (jngp) нормально.
Я просто дал вырезки из стандартных библиотек языка. Они автоматически подключаются.
private function GetRandomUnit takes rect r, integer times returns nothing// - берет область rect r, integer times local unitpool up = LoadUnitPoolHandle(udg_Hash, GetHandleId(r), 0)// - загружаем из хеша unitpool loop// - далее простейший цикл exitwhen times == 0// - сколько раз надо создать рандомного юнита. call PlaceRandomUnit(up, Player(PLAYER_NEUTRAL_AGGRESSIVE), GetRectCenterX(r), GetRectCenterY(r), 0)// - создаем юнит для игрока в позиции call SaveUnitPoolHandle(udg_Hash, GetHandleId(r), 0, up)// - сохраняем уже изменившиеся параметры unitpool'а - это обязательно. set times = times - 1 endloop set up = null endfunction
private function CreateRandomUnits takes nothing returns nothing// - ни чего не берет и не возвращает call GetRandomUnit(udg_current_random_creeps_location, udg_current_random_creeps_count)// - вызывает функцию "GetRandomUnit" которая создаст нам рандомных юнитов. Функция ьерет область и кол-во юнитов для создания. Кол-во может быть любым от 0 до ... endfunction
private function InitTimer takes nothing returns nothing set gg_trg_test = CreateTrigger()// - создаст нам триггер который будет выполнять дейтсвия через период вермени call TriggerRegisterTimerEvent(gg_trg_test, 50, true)// - зарегистрируем событие триггера через каждые 50 секунд call TriggerAddAction(gg_trg_test, function CreateRandomUnits)// - добавим функцию которая будет выполняться через период времени endfunction
function AttachPool takes rect r returns nothing// - функция берет в виде аргумента область rect r local unitpool up = CreateUnitPool()// - создаем локальный unitpool call SaveUnitPoolHandle(udg_Hash, GetHandleId(r), 0, up)// - сохраняем в хеш локально созданный unitpool для каждой области. set up = null// - оптимизация endfunction
function AddTypes takes rect r, integer id, real times returns nothing// - функция берет значения: область, рав-код, уровень слуайности. local unitpool up = LoadUnitPoolHandle(udg_Hash, GetHandleId(r), 0)// - загружаем unitpool для выбранной области call UnitPoolAddUnitType(up, id, times)// - добавляем рав-код в unitpool и уровень случайности call SaveUnitPoolHandle(udg_Hash, GetHandleId(r), 0, up)// - сохраняем unitpool для выбранной области в хеш-таблицу. set up = null endfunction
private function LocalUnits takes rect r returns boolean// - берет в виде аргумента область local group g = CreateGroup()// - создаем локальную группу call GroupEnumUnitsInRect(g, r, Condition(function FilterCreeps))// - пикаем в группу юнитов через фильтр if (FirstOfGroup(g) == null) then// - проверяем - есть ли в группе юниты return true// - если условие выполнилось возвращаем true - тоесть юнитов в группе НЕТ. endif call DestroyGroup(g)// - удаляем группу set g = null return false// - иначе возвращаем false endfunction
endlibrary
Дополнительно созданы переменные:
Hash, типа Хэш-таблица, начальное значение null
current_random_creeps_location типа Область, начальное зачение null
current_random_creeps_count, типа Целочисленная, начальное значение 1
А шде найти список рав-кодов? Все о них говорят как сасо собой разумеющееся, а списка найти не могу.