Q/A

Добавлен , опубликован
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
5
10 лет назад
Отредактирован Shuex
0
Как лучше всего занести юнитов в группу G в радиусе R от точки P ?
Перед занесением нужно проверить, чтобы юнит не был невосприимчивым к магии и не являлся членом группы G.
Вот, я сделал свой первый спелл на джассе) Точнее это пока заготовка. Линейное движения снаряда.
И вот, мой снаряд летит, а как выбирать юнитов вокруг него, чтобы урон наносить?
И оптимальный ли код у меня?)
Загруженные файлы
0
28
10 лет назад
0
Emily_WoRnz, кидай код текстовым файлом а не картой
0
5
10 лет назад
0
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
}
}
так как выбрать юнитов в области и продамажить?)
0
21
10 лет назад
Отредактирован Buulichkaa
0
выбираем
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
0
5
10 лет назад
0
Buulichkaa, лучше конкретный пример мне приведи.. я неопытный ещё)
Просто не могу разобраться создавать эти функции в структуре или нет, если нет, то надо в них передать будет параметры, игрока например
0
28
10 лет назад
Отредактирован nvc123
0
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
}
0
21
10 лет назад
0
nvc123, условие припердоль
0
28
10 лет назад
0
Buulichkaa, ему надо выбрать всех юнитов в области
0
37
10 лет назад
0
всё уже придумано xgm.ru/p/wc3/sc-sorted-selector
0
28
10 лет назад
0
ScorpioT1000, ему нужен тупой пик в пару строчек
зачем система?
0
5
10 лет назад
0
Я просто для того, чтобы научиться делаю способность "Волна силы", только на cJass.
Поэтому мне нужно выбирать юнитов вокруг дамми, проверять имунны они кмагии или нет и входят ли в группу.
Если не имунны и не в группе - занести в группу и продамажить. А группа уже очистится в методе destroy()
0
37
10 лет назад
Отредактирован ScorpioT1000
0
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();
0
28
10 лет назад
0
Emily_WoRnz, тогда делай группу в структуре
зачем массив
0
15
10 лет назад
0
Как использовать хэш таблицу, не конфликтуя с наработками\системами, использующими её? Несколько таблиц создавать ведь опасно, а так индексы могут совпасть?
2
21
10 лет назад
Отредактирован Buulichkaa
2
два выхода
  1. юзать структуры вместо таблиц
  2. делать все наработки самому, тогда ничего нигде не пересечется, ну или юзать разумно написанные наработки, где расписано какие индексы и чем используются
0
15
10 лет назад
0
Buulichkaa, спасибо, а если отбросить элементы c- и v- Jass, то какой способ создания MUI лучше подходит: массивы или хэш-таблица?
2
21
10 лет назад
Отредактирован Buulichkaa
2
Audes, оба подходят отлично, но без надстроек в виде структур код с массивами будет трудно-читабельным (на чистом джассе в смысле)
да и труднописабельным тоже
0
21
9 лет назад
0
Любые функции по типу Get[object] нужно приравнивать к переменным, удалять объект и обнулять переменную?
В чём отличие udg_global и переменной, оглашенной в globals?
0
28
9 лет назад
Отредактирован nvc123
0
Любые функции по типу Get[object] нужно приравнивать к переменным, удалять объект и обнулять переменную?
только те что возвращают хэндл
заносить в переменную нужно только если используем этот объект в дальнейшем
обнулять надо только после юза(если удаление и обнуление в 1 функции то сначала удаление а потом обнуляем)
удалять только если необходимо избавится от объекта
например :
UnitItemInSlot(u,0) // заносим в переменную если используем более 1 раза либо если надо сохранить, после юза обнуляем, удаляем только в случае если нужно удалить сам предмет у героя
GetUnitX(u) // заносим в переменную если используем более 1 раза либо если надо сохранить , обнулять ненадо, удалить вообще невозможно
GetUnitLoc(u) // не используем вообще
если в данной функции объект используется только 1 раз то заносить в переменную не надо
RiseD:
В чём отличие udg_global и переменной, оглашенной в globals?
если в гуи создать глобалку abc то она в коде будет называться udg_abc
если использовать v/cjass то она будет называться abc
0
21
9 лет назад
0
Тоесть глобалки обьявленные в одном тригге можно использовать в другом так же как udg_, или только внутри тригга?
удалить вообще невозможно
А как же
RemoveUnit(u)
?
И, например
set u = null
0
28
9 лет назад
0
Тоесть глобалки обьявленные в одном тригге можно использовать в другом так же как udg_, или только внутри тригга?
триггер который ты имеешь ввиду(как листок с именем в гуи) это иллюзия созданная для удобства
на самом деле их не существует
это как страницы в книги
носить огромный свиток было не удобно поэтому текст разбили на страницы
все глобалки(включая и те что в гуи) при сохранении переносятся в блок globals находящийся в самом начале карты
но к гуишкам при этом приписывается udg_
RiseD:
А как же
RemoveUnit(u)
?
результат функции GetUnitX(u) это дробное число(real/float)
RemoveUnit(u) удалит юнита а не число
комментарии относятся к тому что возвращает функция(предмет,число,локейшн) а не к юниту которого она принимают
0
21
9 лет назад
0
В какой-то статье писали мол обнулять риалы смысла нет
Нужно еще почитать
0
28
9 лет назад
0
RiseD:
В какой-то статье писали мол обнулять риалы смысла нет
Нужно еще почитать
nvc123:
обнулять не надо, удалить вообще невозможно
2
21
9 лет назад
2
xD
Вот что бывает когда в один день ты вспоминаешь о варе, а твой код компилится. Как говорится лучше поздно чем невер. Все статейки, которые были чем-то не понятным вдруг обрели смысл не стану утверждать что со всем разобрался, но гуи юзать не хочется.
0
27
9 лет назад
0
Скилл "читать код на любом императивном языке" разблокирован.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.