4

» WarCraft 3 / Как управлять своей молнией каждому юниту отдельно, а не всем одной

Получилось двигать каждому своей молнией но координата Z почему-то утекающая . Да и надо подумать над уничтожением молнии при малом количестве маны и нажатой способностью отмены.
Библиотека
real GetUnitZ(unit u){
return GetLocationZ(GetUnitLoc(u))+GetUnitFlyHeight(u)
}
nothing MyFunc(){
unit u1 = GetSpellAbilityUnit() первый юнит
unit u2 = GetSpellTargetUnit() второй юнит

real x1 = GetUnitX(u1)
real y1 = GetUnitY(u1)
real z1 = GetUnitZ(u1)

real x2 = GetUnitX(u2)
real y2 = GetUnitY(u2)
real z2 = GetUnitZ(u2)

real x = x2 - x1
real y = y2 - y1
real z = z2 - z1

real angle_xy = Atan2(y, x) угол в XY
real dist_xy = SquareRoot(x*x + y*y) длина XY

получем угол Z
real angle_z = Atan2(z, dist_xy)
}
Код
2 Действие
function Trig_WaveLight_Actions2 takes nothing returns nothing
local timer timerAct = GetExpiredTimer()
local integer id = GetHandleId(timerAct)
local unit caster = LoadUnitHandle(Hash, id, StringHash("caster"))
local integer id2 = GetHandleId(caster)
local unit ligUnit = LoadUnitHandle(Hash, id2, StringHash("ligUnit"))
local lightning lig = LoadLightningHandle(Hash, id2, StringHash("lig"))
local real process = LoadReal(Hash, id, StringHash("process")) + LoadReal(Hash, id, StringHash("speed"))
local group groupAct
local real M = GetUnitState(caster, UNIT_STATE_MANA)
local unit u = null

if process > LoadReal(Hash, id, StringHash("maxDist")) or M < 2 then
call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
call KillUnit(ligUnit)
call DestroyLightning(lig)
call FlushChildHashtable(Hash, id)
call PauseTimer(timerAct)
call DestroyTimer(timerAct)
else
call SaveReal(Hash, id, StringHash("process"), process)
call SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA)-2)
local real CL1 = GetUnitX(caster)
local real CL2 = GetUnitY(caster)
local real CL3 = GetUnitZ(caster)
local real UL1 = GetUnitX(ligUnit)
local real UL2 = GetUnitY(ligUnit)
local real UL3 = GetUnitZ(ligUnit)
call MoveLightningEx(lig, true, CL1, CL2, CL3+110, UL1, UL2, UL3)
call SetUnitX(ligUnit, GetUnitX(ligUnit) + LoadReal(Hash, id, StringHash("speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
call SetUnitY(ligUnit, GetUnitY(ligUnit) + LoadReal(Hash, id, StringHash("speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))

set groupAct = CreateGroup()
call GroupEnumUnitsInRange(groupAct, GetUnitX(ligUnit), GetUnitY(ligUnit), LoadReal(Hash, id2, StringHash("aoe")), null)
loop
set u = FirstOfGroup(groupAct)
exitwhen u == null
if GetWidgetLife(u) > 0.405 then
if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
if IsUnitEnemy(u, GetOwningPlayer(caster)) then
call UnitDamageTarget(caster, u, LoadReal(Hash, id2, StringHash("damage")), false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
call DestroyEffect(AddSpecialEffectTarget(LoadStr(Hash, id, StringHash("damageEffect")), u, "origin"))
call GroupAddUnit(LoadGroupHandle(Hash, id2, StringHash("group")), u)
else
endif
endif
endif
call GroupRemoveUnit(groupAct, u)
endloop
call DestroyGroup(groupAct)
endif

set caster = null
set ligUnit = null
set timerAct = null
set groupAct = null
endfunction
1 Действие
function Trig_WaveLight_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer id2 = GetHandleId(caster)
Создание молнии
if ( GetUnitAbilityLevel(caster , 'A032') == 1 ) then
local unit ligUnit = CreateUnitAtLoc(GetOwningPlayer(caster),'h00N', GetUnitLoc(caster), 270 )
local real xCaster = GetUnitX(ligUnit)
local real yCaster = GetUnitY(ligUnit)
local real xLigUnit = GetUnitX(ligUnit)
local real yLigUnit = GetUnitY(ligUnit)

local real xTarget = GetSpellTargetX()
local real yTarget = GetSpellTargetY()
local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
local real dx = xTarget - xCaster
local real dy = yTarget - yCaster

local location CL = GetUnitLoc(caster)
local location UL = GetUnitLoc(ligUnit)

local lightning lig = AddLightningEx("CLPB", true, GetLocationX(CL), GetLocationY(CL), (GetLocationZ(CL)+100), GetLocationX(UL), GetLocationY(UL), GetLocationZ(UL)+100)

local integer level = GetUnitAbilityLevel(caster, 'A000')
local real maxDist = SquareRoot(dx * dx + dy * dy)
local real damage = 5 GetHeroStr(caster, true) * 3
local real speed = 1700
local real aoe = 300

local string damageEffect = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"

local timer timerAct = CreateTimer()
local integer id = GetHandleId(timerAct)
local timer timerAct3 = CreateTimer()
local integer id3 = GetHandleId(timerAct3)

call SaveUnitHandle(Hash, id, StringHash("caster"), caster)
call SaveUnitHandle(Hash, id2, StringHash("ligUnit"), ligUnit)
call SaveLightningHandle(Hash, id2, StringHash("lig"), lig)
call SaveLocationHandle(Hash, id2, StringHash("CL"), CL)
call SaveLocationHandle(Hash, id2, StringHash("UL"), UL)

call SaveReal(Hash, id2, StringHash("aoe"), aoe)
call SaveReal(Hash, id2, StringHash("damage"), damage)
call SaveReal(Hash, id, StringHash("maxDist"), maxDist)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("speed"), speed * 0.03)
call SaveStr(Hash, id, StringHash("damageEffect"), damageEffect)

call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

call IncUnitAbilityLevel(caster, 'A032')

call TimerStart(timerAct, 0.03, true, function Trig_WaveLight_Actions2)
set caster = null
set ligUnit = null
set timerAct = null
Передвижение молнии
else
local unit ligUnit = LoadUnitHandle(Hash, id2, StringHash("ligUnit"))
local real xCaster = GetUnitX(ligUnit)
local real yCaster = GetUnitY(ligUnit)

local real xTarget = GetSpellTargetX()
local real yTarget = GetSpellTargetY()
local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
local real dx = xTarget - xCaster
local real dy = yTarget - yCaster

local lightning Lig = LoadLightningHandle(Hash, id2, StringHash("Lig"))

local integer level = GetUnitAbilityLevel(caster, 'A030')
local real maxDist = SquareRoot(dx * dx + dy * dy)
local real damage = 50 + GetHeroStr(caster, true) * 3
local real speed = 700

local string damageEffect = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"

local timer timerAct = CreateTimer()
local integer id = GetHandleId(timerAct)

call SaveUnitHandle(Hash, id, StringHash("caster"), caster)

call SaveReal(Hash, id, StringHash("damage"), damage)
call SaveReal(Hash, id, StringHash("maxDist"), maxDist)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("speed"), speed * 0.03)

call SaveStr(Hash, id, StringHash("damageEffect"), damageEffect)

call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

call TimerStart(timerAct, 0.03, true, function Trig_WaveLight_Actions2)
set caster = null
set ligUnit = null
set timerAct = null
endif


endfunction
Применяемая способность
function Trig_WaveLight_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A030'
endfunction
Событие
function InitTrig_WaveLight takes nothing returns nothing
set gg_trg_WaveLight = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_WaveLight, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_WaveLight, Condition( function Trig_WaveLight_Conditions ) )
call TriggerAddAction( gg_trg_WaveLight, function Trig_WaveLight_Actions )
endfunction
4

» WarCraft 3 / Как управлять своей молнией каждому юниту отдельно, а не всем одной

quq_CCCP, В том то и проблема везде говорится взять что-нибудь закинуть куда нибудь подальше и через N секунд оно исчезнет. А как вернутся к этому объекту я не находил инфы.
4

» WarCraft 3 / Как управлять своей молнией каждому юниту отдельно, а не всем одной

EugeAl, Загрузил видео изменил код , но так и не понял что я типо должен из 2 действия выгрузить в 1 и вставить в после Else. Во 2 действии оно сохраняется но не выгружается в 1 ошибка выходит.
4

» WarCraft 3 / Захват генератора с помощью точки/области

В карте UZW 1.03 есть такая система убиваешь контрольную точку она возрождается и становится твоей и все к ней прикрепленные пушки. Правда там текста под 7к строчек попробуй разбери да и лагает.
4

» WarCraft 3 / Ящиковый монстр

Netherstorm, Так гениально-бредовые идеи в голову приходят дай думаю поделюсь с миром.
4

» WarCraft 3 / Лихолесье големов

RvzerBro, Да нет, все очевидно просто понравился ландшафт, удивил слегла
Да это Близзардский ландшафт но я его сильно изменил убрав 1 дерево , а то големы не помещались)))
4

» WarCraft 3 / Как раскрыть функцию с полярным смещением

nazarpunk, Да я немного перепутал . Но мне удалось сделать то что я хотел вот таким образом. Идея заключалась в создании юнитов паралельных Castery и смещённых в разных углах.
local unit caster = GetSpellAbilityUnit()
local location cas = GetUnitLoc(caster)
local location tar = GetSpellTargetLoc()
local real d = bj_RADTODEG * (Atan2(GetLocationY(cas) - GetLocationY(tar),GetLocationX(cas) - GetLocationX(tar)))
Точка создания Юнита1
local real x = (GetLocationX(tar) + 150 * Cos((d+90) * bj_DEGTORAD)) - 300 * Cos((d+180) * bj_DEGTORAD)
local real y = (GetLocationY(tar) + 150 * Sin((d+90) * bj_DEGTORAD)) - 300 * Sin((d+180) * bj_DEGTORAD)
Точка создания Юнита2
local real x2 = (GetLocationX(tar) + 150 * Cos((d-90) * bj_DEGTORAD)) - 300 * Cos((d-180) * bj_DEGTORAD)
local real y2 = (GetLocationY(tar) + 150 * Sin((d-90) * bj_DEGTORAD)) - 300 * Sin((d-180) * bj_DEGTORAD)
Появление 1 юнита
local unit Unit = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x, y), d + 90)
Появление 2 юнита
local unit Unit2 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x2, y2), d - 90)
Обнуление переменных
set caster = null
set Unit = null
set Unit2 = null
set d = 0
set x = 0
set y = 0
set x2 = 0
set y2 = 0
call RemoveLocation (cas)
call RemoveLocation (tar)
endfunction
Спасибо за напутствие и подсказки, буду совершенствовать свой vJASS!
4

» WarCraft 3 / Как раскрыть функцию с полярным смещением

nazarpunk, Функция рабочая взята из триггеров:
Целевая точка создания способности = T
Применяющий юнит = U
1 Созданная точка = D
Конечная точка создания юнита = V
Создать юнита в X смещением 150 поворот на угол между T-U + 90 + смещение на 150 поворот между на угол между Е и D + 90
Как создать юнита в точке T со смещением от угла между T-U я немного понял пример
scope landingTroops initializer Init
globals

private constant integer SpellId = 'A09D'
private constant integer Spell2Id = 'A005'
private constant integer UnitId = 'h01M'
private constant integer Unit2Id = 'h023'

endglobals
Условие
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SpellId
endfunction
Действие
private function Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local location cas = GetUnitLoc(caster)
local location tar = GetSpellTargetLoc()
Создание 1 Вертолёта
local real angle = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) - 0)
local real x = GetLocationX(tar) + 0 * Cos(angle * bj_DEGTORAD - 0)
local real y = GetLocationY(tar) + 0 * Sin(angle * bj_DEGTORAD - 0)
local unit Unit = CreateUnitAtLoc(GetOwningPlayer(caster),UnitId, Location(x, y), angle - 0)
call SetUnitFlyHeight(Unit, 1000, 0)
call SetUnitFlyHeight(Unit, 200, 500)
call TriggerSleepAction(1.60)
Создание 1 Юнита
local real angle2 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) - 0)
local real x2 = GetLocationX(tar) + 175 * Cos(angle * bj_DEGTORAD - 150)
local real y2 = GetLocationY(tar) + 175 * Sin(angle * bj_DEGTORAD - 150)
local unit Unit2 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x2, y2), angle2 + 45)
UnitAddAbility(Unit2, Spell2Id)
call SetUnitFlyHeight(Unit2, 150, 0)
call SetUnitFlyHeight(Unit2, 0, 300)
UnitRemoveAbility(Unit2, Spell2Id)
Создание 2 Юнита
local real angle3 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) - 0)
local real x3 = GetLocationX(tar) + 150 * Cos(angle * bj_DEGTORAD + 150)
local real y3 = GetLocationY(tar) + 150 * Sin(angle * bj_DEGTORAD + 150)
local unit Unit3 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x3, y3), angle3 -45)
UnitAddAbility(Unit3, Spell2Id)
call SetUnitFlyHeight(Unit3, 150, 0)
call SetUnitFlyHeight(Unit3, 0, 300)
UnitRemoveAbility(Unit3, Spell2Id)
call TriggerSleepAction(0.50)
Создание 3 Юнита
local real angle4 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) - 0)
local real x4 = GetLocationX(tar) + 175 * Cos(angle * bj_DEGTORAD - 30)
local real y4 = GetLocationY(tar) + 175 * Sin(angle * bj_DEGTORAD - 30)
local unit Unit4 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x4, y4), angle4 + 90)
UnitAddAbility(Unit4, Spell2Id)
call SetUnitFlyHeight(Unit4, 150, 0)
call SetUnitFlyHeight(Unit4, 0, 300)
UnitRemoveAbility(Unit4, Spell2Id)
Создание 4 Юнита
local real angle5 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) + 0)
local real x5 = GetLocationX(tar) + 175 * Cos(angle * bj_DEGTORAD + 30)
local real y5 = GetLocationY(tar) + 175 * Sin(angle * bj_DEGTORAD + 30)
local unit Unit5 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x5, y5), angle5 - 90)
UnitAddAbility(Unit5, Spell2Id)
call SetUnitFlyHeight(Unit5, 150, 0)
call SetUnitFlyHeight(Unit5, 0, 300)
UnitRemoveAbility(Unit5, Spell2Id)
call TriggerSleepAction(0.50)
Создание 5 Юнита
local real angle6 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) + 0)
local real x6 = GetLocationX(tar) + 150 * Cos(angle * bj_DEGTORAD - 90)
local real y6 = GetLocationY(tar) + 150 * Sin(angle * bj_DEGTORAD - 90)
local unit Unit6 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x6, y6), angle6 - 115)
UnitAddAbility(Unit6, Spell2Id)
call SetUnitFlyHeight(Unit6, 150, 0)
call SetUnitFlyHeight(Unit6, 0, 300)
UnitRemoveAbility(Unit6, Spell2Id)
Создание 6 Юнита
local real angle7 = bj_RADTODEG * Atan2(GetLocationY(tar) - GetLocationY(cas),GetLocationX(tar) - GetLocationX(cas) + 0)
local real x7 = GetLocationX(tar) + 175 * Cos(angle * bj_DEGTORAD + 90)
local real y7 = GetLocationY(tar) + 175 * Sin(angle * bj_DEGTORAD + 90)
local unit Unit7 = CreateUnitAtLoc(GetOwningPlayer(caster),Unit2Id, Location(x7, y7), angle7 + 115)
UnitAddAbility(Unit7, Spell2Id)
call SetUnitFlyHeight(Unit7, 150, 0)
call SetUnitFlyHeight(Unit7, 0, 300)
UnitRemoveAbility(Unit7, Spell2Id)
call TriggerSleepAction(0.75)
call SetUnitFlyHeight(Unit, 1200, 500)
call TriggerSleepAction(2.4)
RemoveUnit(Unit)
Обнуление Переменных
set caster = null
set Unit = null
set Unit2 = null
set Unit3 = null
set Unit4 = null
set Unit5 = null
set Unit6 = null
set Unit7 = null
set angle = 0
set angle2 = 0
set angle3 = 0
set angle4 = 0
set angle5 = 0
set angle6 = 0
set angle7 = 0
set x = 0
set y = 0
set x2 = 0
set y2 = 0
set x3 = 0
set y3 = 0
set x4 = 0
set y4 = 0
set x5 = 0
set y5 = 0
set x6 = 0
set y6 = 0
set x7 = 0
set y7 = 0
call RemoveLocation (cas)
call RemoveLocation (tar)
endfunction
СОБЫТИЕ
private function Init takes nothing returns nothing
local trigger t = CreateTrigger( )
local integer index
set index = 0
loop
call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition( t, Condition( function Conditions ) )
call TriggerAddAction( t, function Actions )
set t = null
endfunction
endscope
А вот относительно D точки не очень.
Загруженные файлы