Событие: юнит завершает исследование
Условие Изученное исследование равно Х
Действия:
set bj_wantDestroy = true
Выбрать всех юнитов из группы (Все юниты Игрок-владелец(Юнит триггера)) и сделать действия:
Если\то\иначе
Условие: Тип Выбранного юнита равен Y
То:
Создать 5 юнитов типа Z Игроку-владелецу(Юнит триггера) в точке Позиция(Выбранный юнит)
Удалить Выбранного юнита
Иначе: <пусто>
Во время инициализации создаём все необходимые точки через Object.create(), затем после создания всех деструктаблов вызываем Object.findClosestDestForAll(). При создании нового деструктабла нужно вызвать Object.updateDestForAll(), а при смерти - Object.findClosestDestForAll(). Как ловить смерть я уже говорил.
Детектим смерть деструктабла с помощью события на смерть виджета и условия, что деструктабл триггера не нулл.
Код
function GetDistanceDestPoint takes destructable d, real x, real y returns real
local real dx = GetDestructableX(d) - x
local real dy = GetDestructableY(d) - y
return SquareRoot(dx * dx + dy * dy)
endfunction
struct Object
readonly static real StartDistance
readonly static rect World
private static boolexpr filter
static thistype array entities
readonly static integer top = -1
real x
real y
readonly destructable d
private real distance = StartDistance
private integer index
static method create takes real x, real y returns thistype
local thistype this = allocate()
set this.x = x
set this.y = y
set top = top + 1
set entities[top] = this
set index = top
return this
endmethod
method onDestroy takes nothing returns nothing
local integer i = index
if i < top then
set entities[i] = entities[top]
set entities[i].index = i
endif
set top = top - 1
set d = null
endmethod
method updateDest takes destructable d returns nothing
local real dist = GetDistanceDestPoint(d, x, y)
if dist > distance then
set this.d = d
set distance = dist
endif
endmethod
static method updateDestForAll takes destructable d returns nothing
local integer a = 0
loop
exitwhen a > top
call entities[a].updateDest(d)
set a = a + 1
endloop
endmethod
private static method FilterFunc takes nothing returns boolean
//local destructable t = GetFilterDestructable()
//if GetDestructableTypeId(t) == 'ATtr' then
// call TransmittedObject.updateDest(t)
//endif
//set t = null
call TransmittedObject.updateDest(GetFilterDestructable())
return false
endmethod
private static thistype TransmittedObject
method findClosestDest takes nothing returns nothing
set TransmittedObject = this
call EnumDestructablesInRect(World, filter, null)
endmethod
static method findClosestDestForAll takes nothing returns nothing
local integer a = 0
loop
exitwhen a > top
call entities[a].findClosestDest()
set a = a + 1
endloop
endmethod
private static method OnInit takes nothing returns nothing
local rect r = GetWorldBounds()
local real dx = GetRectMaxX(r) - GetRectMinX(r)
local real dy = GetRectMaxY(r) - GetRectMinY(r)
set StartDistance = SquareRoot(dx * dx + dy * dy) * 2.
set World = r
set r = null
set filter = Filter(function thistype.FilterFunc)
endmethod
endstruct
Я же верно понимаю, что деструктаблы не двигаются?
Раз уж на то пошло, то это бесконечная рекурсия, так как нет условия для остановки.
Вообще, в ЯП рекурсия и циклы взаимозаменяемы, но в JASS циклы предпочтительнее.
function FilterFunct takes nothing returns boolean
local destructable d = GetFilterDestructable()
local integer T = GetDestructableTypeId(d)
if T == ... then
// ...
elseif T == ... then
// ...
endif
set d = null
return false
endfunction
function SomeFunct takes rect r returns nothing
call EnumDestructablesInRect(r, Filter(function FilterFunct), null)
endfunction
А вообще, предлагаю сделать так. Тем более, выполняется такое условие.
Точка X неподвижна.
Для каждого нужного объекта вычисляем ближайший деструктабл во время инициализации.
Детектим смерть деструктабла с помощью события на смерть виджета и условия, что деструктабл триггера не нулл. Пересчитываем для каждого объекта ближайший деструктабл.
При создании нового деструктабла для каждого объекта сравниваем его текущий ближайший деструктабл с новым. Если новый ближе, заменяем. Если нет, то ничего не меняем.
а есть вариант побыстрее, слышал, что строки грузят сильно.
Конечно.
function UnitExists takes unit u returns boolean
return GetUnitTypeId(u) != 0
endfunction
function UnitDoesNotExist takes unit u returns boolean
return GetUnitTypeId(u) == 0
endfunction
Сделал без триггеров, как и хотел. Спасибо 8gabriel8 за подсказку.
Но есть 1 ограничение: Unit Availability Change работает, только если стоит галка Applies To All Units (global, если смотреть в Ctrl+D). Но в этом случае увеличение хп работает только на новых юнитов, старые бегают без грейда.
Были добавлены грейды, изменены кузница, пехотинец, настройки улучшений для красного игрока.
Грейды стоят столько, сколько хотел автор: 25\50\100.
» WarCraft 3 / Продажа юнитов
» WarCraft 3 / Эволюция персонажа
Ред. PT153
» WarCraft 3 / Удален
» WarCraft 3 / Эволюция персонажа
Ред. PT153
» WarCraft 3 / Как сделать триггер
» WarCraft 3 / Как сделать триггер
» WarCraft 3 / Как при помощи War import manager
Ред. PT153
» WarCraft 3 / Как найти ближайший разрушаемый объект?
» WarCraft 3 / Какие есть варианты для принудительного завершения работы карты?
Вообще, в ЯП рекурсия и циклы взаимозаменяемы, но в JASS циклы предпочтительнее.
Ред. PT153
» WarCraft 3 / Как найти ближайший разрушаемый объект?
Детектим смерть деструктабла с помощью события на смерть виджета и условия, что деструктабл триггера не нулл. Пересчитываем для каждого объекта ближайший деструктабл.
При создании нового деструктабла для каждого объекта сравниваем его текущий ближайший деструктабл с новым. Если новый ближе, заменяем. Если нет, то ничего не меняем.
» WarCraft 3 / Как найти ближайший разрушаемый объект?
» WarCraft 3 / Не работает нестандартное заклинание
» WarCraft 3 / За что отвечают данные функции?
Ред. PT153
» WarCraft 3 / Удаление лишнего
» WarCraft 3 / За что отвечают данные функции?
» WarCraft 3 / За что отвечают данные функции?
» WarCraft 3 / Новый тип переменной
» WarCraft 3 / Новый тип переменной
» WarCraft 3 / Если unit == null
» WarCraft 3 / Ошибка, при объявлении библиотеки.
Скорее всего, у тебя эта функция что-то возвращает.
» WarCraft 3 / повернуть здание через мемхак
» WarCraft 3 / Передача локальной переменной
Ред. PT153
» WarCraft 3 / Надбавка золота за уровень исследования
Но есть 1 ограничение: Unit Availability Change работает, только если стоит галка Applies To All Units (global, если смотреть в Ctrl+D). Но в этом случае увеличение хп работает только на новых юнитов, старые бегают без грейда.
Грейды стоят столько, сколько хотел автор: 25\50\100.
» WarCraft 3 / Проблема с редактором карт на 24 игрока