Q/A

Добавлен , опубликован
`
ОЖИДАНИЕ РЕКЛАМЫ...
5
Как лучше всего занести юнитов в группу G в радиусе R от точки P ?
Перед занесением нужно проверить, чтобы юнит не был невосприимчивым к магии и не являлся членом группы G.
Вот, я сделал свой первый спелл на джассе) Точнее это пока заготовка. Линейное движения снаряда.
И вот, мой снаряд летит, а как выбирать юнитов вокруг него, чтобы урон наносить?
И оптимальный ли код у меня?)
Загруженные файлы
5
nvc123, вот код:
include "cj_types.j"
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

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)
}
private boolean cond(){
return GetSpellAbilityId()==spell
}
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
}
}
так как выбрать юнитов в области и продамажить?)
21
выбираем
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 //юнит, возвращаемый в ф-ии условия
дамажим
native UnitDamageTarget             takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
5
Buulichkaa, лучше конкретный пример мне приведи.. я неопытный ещё)
Просто не могу разобраться создавать эти функции в структуре или нет, если нет, то надо в них передать будет параметры, игрока например
28
unit aaa=дами юнит

void abcd(){
UnitDamageTarget(aaa,GetEnumUnit(),500,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
}

void abc(){
group a=CreateGroup()
unit b=GetTriggerUnit()
GroupEnumUnitsInRange(a,GetUnitX(b),GetUnitY(b),500,null)
ForGroup(a,function abcd)
DestroyGroup(a)
a=null
b=null
}
28
ScorpioT1000, ему нужен тупой пик в пару строчек
зачем система?
5
Я просто для того, чтобы научиться делаю способность "Волна силы", только на cJass.
Поэтому мне нужно выбирать юнитов вокруг дамми, проверять имунны они кмагии или нет и входят ли в группу.
Если не имунны и не в группе - занести в группу и продамажить. А группа уже очистится в методе destroy()
38
ScSelector s = ScSelector.NewFromTarget(GetTriggerUnit(), X ТОЧКИ, Y ТОЧКИ, РАДИУС, SC_FILTER_ENEMY_NOT_DEAD_NOT_CASTER, false, -1);
        
for(int i = 0; i < s.Size(); ++i) {
    if( проверяешь юнита s[i], если он имунный или еще что или что угодно ) {
        наносишь дамаг юниту s[i]
    }
}
s.Delete();
15
Как использовать хэш таблицу, не конфликтуя с наработками\системами, использующими её? Несколько таблиц создавать ведь опасно, а так индексы могут совпасть?
21
два выхода
  1. юзать структуры вместо таблиц
  2. делать все наработки самому, тогда ничего нигде не пересечется, ну или юзать разумно написанные наработки, где расписано какие индексы и чем используются
15
Buulichkaa, спасибо, а если отбросить элементы c- и v- Jass, то какой способ создания MUI лучше подходит: массивы или хэш-таблица?
21
Audes, оба подходят отлично, но без надстроек в виде структур код с массивами будет трудно-читабельным (на чистом джассе в смысле)
да и труднописабельным тоже
21
Любые функции по типу Get[object] нужно приравнивать к переменным, удалять объект и обнулять переменную?
В чём отличие udg_global и переменной, оглашенной в globals?
28
Любые функции по типу Get[object] нужно приравнивать к переменным, удалять объект и обнулять переменную?
только те что возвращают хэндл
заносить в переменную нужно только если используем этот объект в дальнейшем
обнулять надо только после юза(если удаление и обнуление в 1 функции то сначала удаление а потом обнуляем)
удалять только если необходимо избавится от объекта
например :
UnitItemInSlot(u,0) // заносим в переменную если используем более 1 раза либо если надо сохранить, после юза обнуляем, удаляем только в случае если нужно удалить сам предмет у героя
GetUnitX(u) // заносим в переменную если используем более 1 раза либо если надо сохранить , обнулять ненадо, удалить вообще невозможно
GetUnitLoc(u) // не используем вообще
если в данной функции объект используется только 1 раз то заносить в переменную не надо
RiseD:
В чём отличие udg_global и переменной, оглашенной в globals?
если в гуи создать глобалку abc то она в коде будет называться udg_abc
если использовать v/cjass то она будет называться abc
21
Тоесть глобалки обьявленные в одном тригге можно использовать в другом так же как udg_, или только внутри тригга?
удалить вообще невозможно
А как же
RemoveUnit(u)
?
И, например
set u = null
28
Тоесть глобалки обьявленные в одном тригге можно использовать в другом так же как udg_, или только внутри тригга?
триггер который ты имеешь ввиду(как листок с именем в гуи) это иллюзия созданная для удобства
на самом деле их не существует
это как страницы в книги
носить огромный свиток было не удобно поэтому текст разбили на страницы
все глобалки(включая и те что в гуи) при сохранении переносятся в блок globals находящийся в самом начале карты
но к гуишкам при этом приписывается udg_
RiseD:
А как же
RemoveUnit(u)
?
результат функции GetUnitX(u) это дробное число(real/float)
RemoveUnit(u) удалит юнита а не число
комментарии относятся к тому что возвращает функция(предмет,число,локейшн) а не к юниту которого она принимают
21
В какой-то статье писали мол обнулять риалы смысла нет
Нужно еще почитать
28
RiseD:
В какой-то статье писали мол обнулять риалы смысла нет
Нужно еще почитать
nvc123:
обнулять не надо, удалить вообще невозможно
21
xD
Вот что бывает когда в один день ты вспоминаешь о варе, а твой код компилится. Как говорится лучше поздно чем невер. Все статейки, которые были чем-то не понятным вдруг обрели смысл не стану утверждать что со всем разобрался, но гуи юзать не хочется.
27
Скилл "читать код на любом императивном языке" разблокирован.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.