Как лучше всего занести юнитов в группу G в радиусе R от точки P ?
Перед занесением нужно проверить, чтобы юнит не был невосприимчивым к магии и не являлся членом группы G.
Вот, я сделал свой первый спелл на джассе) Точнее это пока заготовка. Линейное движения снаряда.
И вот, мой снаряд летит, а как выбирать юнитов вокруг него, чтобы урон наносить?
И оптимальный ли код у меня?)
library holyOrb initializer init{
private integer spell = 'A005' равкод способности
private integer dummyId = 'u001' равкод снаряда
private real speed = 20.00 скорость движения снаряда
private real dmgAoE = 275.00 область нанесения урона
private int maxIndex = 0 индекс для MUI
struct missile{
unit caster
unit dummy
real distance
real angle
real damage
group dmgGroup
static void new(unit caster,unit dummy,real distance, real angle,real damage){ создаём статичный метод new
local missile a=missile.create()//создание структуры
if(int(a)>10){ защита от переполнения
call a.destroy()
return
}
else{
set a.caster=caster юнит, применивший заклинание
set a.dummy=dummy заносим в структуру юнита которого будем двигать
set a.distance=distance заносим в структуру юнита к которому будем двигаться
set a.angle=angle
set a.damage=damage
set a.dmgGroup=null
private void action(){
local location casterLoc = GetUnitLoc(GetTriggerUnit())
local location targetLoc = GetSpellTargetLoc()
local real ho_angle = AngleBetweenPoints(casterLoc,targetLoc)
local real ho_distance = 1100.00
local real ho_damage = 70.00 * I2R(GetUnitAbilityLevel(GetTriggerUnit(), spell))
local unit ho_dummy
private void init(){
local trigger trig=CreateTrigger() создание триггера
local timer tmr=CreateTimer() создание таймера
call TriggerAddAction(trig,function action) добавление действия
call TriggerAddCondition(trig,Condition(function cond)) добавление условия
call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_SPELL_EFFECT) добавление события
call TimerStart(tmr,0.025,true,function update) запускаем таймер с функцией update
set trig=null
}
}
native CreateGroup takes nothing returns group //создание группы
native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing //занесение юнитов в радиусе в группу по условию
native Condition takes code func returns conditionfunc // создание условия
constant native GetFilterUnit takes nothing returns unit //юнит, возвращаемый в ф-ии условия
Buulichkaa, лучше конкретный пример мне приведи.. я неопытный ещё)
Просто не могу разобраться создавать эти функции в структуре или нет, если нет, то надо в них передать будет параметры, игрока например
пластмассовым не кул
Отредактирован Shuex
Перед занесением нужно проверить, чтобы юнит не был невосприимчивым к магии и не являлся членом группы G.
Вот, я сделал свой первый спелл на джассе) Точнее это пока заготовка. Линейное движения снаряда.
И вот, мой снаряд летит, а как выбирать юнитов вокруг него, чтобы урон наносить?
И оптимальный ли код у меня?)
include "cj_types.j"
private integer spell = 'A005' равкод способности
private integer dummyId = 'u001' равкод снаряда
private real speed = 20.00 скорость движения снаряда
private real dmgAoE = 275.00 область нанесения урона
private int maxIndex = 0 индекс для MUI
struct missile{
unit caster
unit dummy
real distance
real angle
real damage
group dmgGroup
static void new(unit caster,unit dummy,real distance, real angle,real damage){ создаём статичный метод new
local missile a=missile.create()//создание структуры
if(int(a)>10){ защита от переполнения
call a.destroy()
return
}
else{
set a.caster=caster юнит, применивший заклинание
set a.dummy=dummy заносим в структуру юнита которого будем двигать
set a.distance=distance заносим в структуру юнита к которому будем двигаться
set a.angle=angle
set a.damage=damage
set a.dmgGroup=null
call DisplayTimedTextToForce(GetPlayersAll(), 1.00, "Missile created")
call DisplayTimedTextToForce(GetPlayersAll(), 1.00, GetUnitName(a.dummy) + " angle = " + R2S(a.angle))
}
}
void delete(){
call KillUnit(.dummy)
set .caster=null
set .dummy=null
думаю, реальные переменные обнулять не надо, это я на всякий случай :D
set .angle=0
set .distance=0
set .damage=0
call .destroy()
call DisplayTimedTextToForce(GetPlayersAll(), 1.00, "Missile deleted")
}
void move(){
local location dummyLoc = GetUnitLoc(.dummy)
local location offsetLoc = PolarProjectionBJ(dummyLoc,speed,.angle)
set .distance = .distance - speed
if(.distance<speed){
call .delete()
}
else{
call SetUnitPositionLoc(.dummy,offsetLoc)
call SetUnitFacing(.dummy,.angle)
}
call RemoveLocation(dummyLoc)
call RemoveLocation(offsetLoc)
}
}
private void update(){
set maxIndex = maxIndex + 1
local missile holyOrb = maxIndex
loop
if(holyOrb.distance>=speed){
holyOrb.move()
}
exitwhen holyOrb==1
holyOrb--
endloop
}
private void action(){
local location casterLoc = GetUnitLoc(GetTriggerUnit())
local location targetLoc = GetSpellTargetLoc()
local real ho_angle = AngleBetweenPoints(casterLoc,targetLoc)
local real ho_distance = 1100.00
local real ho_damage = 70.00 * I2R(GetUnitAbilityLevel(GetTriggerUnit(), spell))
local unit ho_dummy
call CreateNUnitsAtLoc( 1, dummyId, GetTriggerPlayer(), casterLoc, ho_angle )
set ho_dummy = GetLastCreatedUnit()
call missile.new(GetTriggerUnit(),ho_dummy,ho_distance,ho_angle,ho_damage) вызываем статичный метод new
ho_dummy = null
call RemoveLocation(casterLoc)
call RemoveLocation(targetLoc)
}
return GetSpellAbilityId()==spell
}
local trigger trig=CreateTrigger() создание триггера
local timer tmr=CreateTimer() создание таймера
call TriggerAddAction(trig,function action) добавление действия
call TriggerAddCondition(trig,Condition(function cond)) добавление условия
call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_SPELL_EFFECT) добавление события
call TimerStart(tmr,0.025,true,function update) запускаем таймер с функцией update
set trig=null
}
}
Отредактирован Buulichkaa
Просто не могу разобраться создавать эти функции в структуре или нет, если нет, то надо в них передать будет параметры, игрока например
Отредактирован nvc123