XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Terros

offline
Опыт: 2,502
Активность:
Ясно, спасибо :) щас сделаем...

Код:
function launch_axe_period takes nothing returns nothing
   local unit u
   local timer tt = GetExpiredTimer()
   local unit la = I2U(get_object_iparam(tt, "la"))
   local real face = get_object_rparam(tt, "face")
   local group gg = I2G(get_object_iparam(tt, "group"))
   local group gay = CreateGroup()
   local real x
   local real y   
   local real speed = get_object_rparam(tt, "speed")
   local unit proj = I2U(get_object_iparam(tt, "proj"))
   local location pl = Location(GetUnitX(la), GetUnitY(la))
   local location p = GetUnitLoc(proj)
   local real dx = GetLocationX(p) - GetLocationX(pl)
   local real angle = (bj_RADTODEG * Atan2(GetUnitY(proj) - GetUnitY(la), GetUnitX(proj) - GetUnitX(la)))
   local real dy = GetLocationY(p) - GetLocationY(pl) 
   
if (speed < 0) then
    set x = GetUnitX(proj) + speed * Cos(angle * 0.0174)
    set y = GetUnitY(proj) + speed * Sin(angle * 0.0174)
    call SetUnitPosition(proj, x, y)    
   else 
    set x = GetUnitX(proj) + speed * Cos(face * 0.0174)
    set y = GetUnitY(proj) + speed * Sin(face * 0.0174)
    call SetUnitPosition(proj, x, y)    
endif     
    
if ((SquareRoot(dx * dx + dy * dy) <= 90 and speed < 0) or (GetUnitState(la, UNIT_STATE_LIFE) <= 0 == true)) then
     set udg_AxeAlreadyLaunched = false
     call RemoveUnit(proj)
     call RemoveLocation(pl)
     call DestroyGroup(gg)
     call DestroyGroup(gay) 
     call RemoveLocation(p)
     set p = null
     set angle = 0
     set pl = null 
     set la = null
     set gay = null
     set gg = null
     set proj = null
     set tt = null
     set u = null 
     call flush_object(tt) 
     call FlushStoredMission(udg_cache, "bool")
     call DestroyTimer(tt)
endif
  call GroupEnumUnitsInRange(gay, x, y, 100, null)
  set u = FirstOfGroup(gay)
  if u!=null and IsUnitEnemy(u ,GetOwningPlayer(proj)) and u!=la and u!=proj and IsUnitType(u,UNIT_TYPE_FLYING)!=true and GetUnitState(u,UNIT_STATE_LIFE)>0 and (IsUnitInGroup(u, gg) == false) then
    call GroupAddUnit(gg, u)    
    call UnitDamageTarget( la, u,150,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_METAL_HEAVY_C  HOP)
    call GroupRemoveUnit(gay, u)
   endif
   set speed = speed - 0.55 
   call set_object_iparam(tt, "group", H2I(gg))
   call set_object_rparam(tt, "speed", speed - 0.55)
endfunction

function axe_launch takes nothing returns nothing
   local timer tt = CreateTimer()
   local group gg = CreateGroup()
   local unit la = udg_AxePowerCaster
   local real face = GetUnitFacing(la)
   local unit proj = CreateUnit(GetOwningPlayer(la), 'h00D', GetUnitX(la), GetUnitY(la), GetUnitFacing(la))
   set udg_AxeAlreadyLaunched = true
   call TimerStart(tt, 0.05, true, function launch_axe_period)
   call set_object_rparam(tt, "speed", 40)
   call set_object_rparam(tt, "face", face)
   call set_object_iparam(tt, "la", H2I(la))   
   call set_object_iparam(tt, "group", H2I(gg))
   call set_object_iparam(tt, "proj", H2I(proj))
   set proj = null
   call DestroyGroup(gg)
   set la = null
   set gg = null
   set tt = null
endfunction

//===========================================================================
function InitTrig_Axe_Power_Body takes nothing returns nothing
    set gg_trg_Axe_Power_Body = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Axe_Power_Body, function axe_launch )
endfunction

Отредактировано Terros, 31.07.2007 в 22:37.
Старый 31.07.2007, 19:06
J
expert
offline
Опыт: 48,447
Активность:
точки! неюзай точки!

Jon добавил:
+ забываеш созданую группу удалить
Старый 31.07.2007, 19:56
Terros

offline
Опыт: 2,502
Активность:
Обновил код, на глаз утечек в игре небыло :)
Я все правильно сделал ?
Старый 31.07.2007, 22:37
J
expert
offline
Опыт: 48,447
Активность:
ТОЧКИ...
Старый 31.07.2007, 22:54
Terros

offline
Опыт: 2,502
Активность:
Цитата:
Сообщение от Jon
ТОЧКИ...

хммм, ткни пальцем тогда пожалуста, а то уже невижу =\
Старый 31.07.2007, 23:26
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
local location pl = Location(GetUnitX(la), GetUnitY(la))
local location p = GetUnitLoc(proj)
Старый 31.07.2007, 23:30
Terros

offline
Опыт: 2,502
Активность:

т.е. юзать только координаты x,y вместо создания локальных переменных - точек ?
или я че-то уже недопонимаю...
Старый 31.07.2007, 23:35
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Цитата:
т.е. юзать только координаты x,y вместо создания локальных переменных - точек ?
- именно
Старый 31.07.2007, 23:54
Terros

offline
Опыт: 2,502
Активность:
Все спасибо тогда вам =)
Теперь вместо точек только координаты выщитываю...
Старый 01.08.2007, 11:40
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Terros
Правильно!
Старый 01.08.2007, 12:16
Terros

offline
Опыт: 2,502
Активность:
Код:
function stomp_CopyGroup takes group g returns group
    set bj_groupAddGroupDest = CreateGroup()
    call ForGroup(g, function GroupAddGroupEnum)
    return bj_groupAddGroupDest
endfunction


function war_stomp_filter takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and UnitHasBuffBJ(GetFilterUnit(), 'B008') == true and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) 
endfunction

function Trig_War_Stomp_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A00Y'
endfunction

function war_stomp_period takes nothing returns nothing
local timer t = GetExpiredTimer()
local real h = get_object_rparam(t, "height")
local real speed = get_object_iparam(t, "speed")
local real rr
local group gr = stomp_CopyGroup(I2G(get_object_iparam(t, "group")))
local real uy
local real ux
local unit caster = I2U(get_object_iparam(t, "caster"))
local real y = GetUnitY(caster)
local real x = GetUnitX(caster)
local unit u
local real d = get_object_rparam(t, "duration")
local integer i = 0
  if d < 3 then
        loop
            call DisplayTextToForce( GetPlayersAll(), "33" )
            set u = FirstOfGroup(gr)           
            exitwhen u == null
            set ux = GetUnitX(u)
            set uy = GetUnitY(u)
            set rr = Atan2(uy-y, ux-x)
            call DisplayTextToForce( GetPlayersAll(), "3" )
            call SetUnitPosition(u, ux+speed*Cos(rr), uy+speed*Sin(rr))
            call SetUnitFlyHeight(u, h, 0)
            call GroupRemoveUnit(gr, u)
        endloop           
            call set_object_iparam(t, "gr", H2I(gr))
  else   
        call DisplayTextToForce( GetPlayersAll(), "4" )
        set caster = null
        set u = null
        set gr = null
        call DestroyGroup(I2G(get_object_iparam(t, "gr")))
        call flush_object(t)
        call DestroyTimer(t)
  endif
if (d >1.5) then
       set h = h-3 
       call set_object_rparam(t, "height", h)
else
       set h = h+3 
       call set_object_rparam(t, "height", h)
endif
set d = d +0.05
set speed = speed -0.5
call set_object_rparam(t, "duration", d)
call set_object_rparam(t, "speed", speed)
call DisplayTextToForce( GetPlayersAll(), R2S(d) )
endfunction

function Trig_War_Stomp_Actions takes nothing returns nothing
local timer t = CreateTimer()
local boolexpr b = Condition(function war_stomp_filter)
local integer i = 0
local unit caster = GetTriggerUnit()
local group gr = CreateGroup()
call TriggerSleepAction(0.25)
call GroupEnumUnitsInRange(gr, GetUnitX(caster), GetUnitY(caster), 250, b)
call set_object_iparam(t, "grp", H2I(gr)) 
call set_object_iparam(t, "caster", H2I(caster))   
call set_object_rparam(t, "height", 0)
call set_object_rparam(t, "speed", 10)
call set_object_rparam(t, "duration", 0)
if (CountUnitsInGroup(gr) != 0) then
call TimerStart(t, 0.05, true, function war_stomp_period)
endif
call DestroyGroup(gr)
set caster = null
set t = null
set gr = null
endfunction

//===========================================================================
function InitTrig_War_Stomp takes nothing returns nothing
    set gg_trg_War_Stomp = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_War_Stomp, EVENT_PLAYER_UNIT_SPELL_CHANNEL )
    call TriggerAddCondition( gg_trg_War_Stomp, Condition( function Trig_War_Stomp_Conditions ) )
    call TriggerAddAction( gg_trg_War_Stomp, function Trig_War_Stomp_Actions )
endfunction
Старый 01.08.2007, 16:47
J
expert
offline
Опыт: 48,447
Активность:
Ну теперь уже более мение... только еще это:
Код:
local timer t = CreateTimer()
local boolexpr filterfunc b = ConditionFilter(function war_stomp_filter)
[...]
call GroupEnumUnitsInRange(gr, GetUnitX(caster), GetUnitY(caster), 250, b)
  call DestroyFilter(b)
call set_object_iparam(t, "grp", H2I(gr))
Старый 01.08.2007, 18:51
Terros

offline
Опыт: 2,502
Активность:
тьфу... редактировал, и не написал че хотел спросить то...
кароче вот этот код, но группа не переносится через кэш в war_stomp_period...
как не бился немогу понять и сделать...
че я не так сделал ??
Старый 01.08.2007, 22:07
J
expert
offline
Опыт: 48,447
Активность:
Ы, ты ее посла переноса, чуть ниже - удаляеш:):
удаляй ее в функции таймера когда тот закончился:):
и помни что сылок то хоть и много.. но обьект один, удалиш сдесь, небудет там...
Старый 01.08.2007, 23:14
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Romeno это событие "Юнит атакован", но "снаряд выпущен" ещё не значит что он попадёт т.е. юнит может увернутся.
Старый 02.08.2007, 00:22
J
expert
offline
Опыт: 48,447
Активность:
MrSmiLe юнит атакован регистрирует начало атаки, атаку можно отменить некоторое время после начала, такчто это не подходит...
Romeno недумаю что можно..
Старый 02.08.2007, 00:27
YasonDelAlt

offline
Опыт: 862
Активность:
Можно ли при возникновении события Юниту Нанесен Урон, получить точное количество нанесенного урона стандартными средствами, весь common.j перелопатил не могу ни фига найти =(.
Старый 05.08.2007, 15:41
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
YasonDelAlt
Код:
constant native GetEventDamage takes nothing returns real
Старый 05.08.2007, 20:34
HighTemplar
かえるたす すんせてりで
offline
Опыт: 2,388
Активность:
У меня возникла проблема: Я пишу подобные функции а WE выдает ошибку "Отсутствует название функции"
function Trig_Cam_Actions takes nothing returns nothing
call InitAdvancedTriggers( )
call CamFollowUnit( Player(0), gg_unit_H601_0000, true )
call SetFollowDetails( Player(0), 5, 200.00 )
call SetFollowDetails( Player(0), 3, 450 )
call SetFollowDetails( Player(0), 4, 350.00 )
call SetCustomBooleanValue( gg_unit_H601_0000, true )
endfunction

PS. используется WE unlimited

HighTemplar добавил:
Цитата:
Сообщение от Megalol4er
Товарищи знатоки скажите можно либо каким нибудь тригером сделать следующее действие - если в кампании 2 мапы - по ходу игры в одной мапе можно будет загрузить другую? Если допустим условие юнит вошол в регион один то load и название мапы. Такое возможно?

Создай по нескольку Одинаковых карт путем копирования, затем создай на них начальные точки (на каждой свою) а за тем, при помощи триггера преход с одной карты на другую. Например у тя на карте туннель, ты копируешь карту, и на одной ставишь начальную точку на входе, другую на выходе и тоже самое делаешь с другой картой (самим тоннелем) затем используй триггеры, чтобы перемещятся по картам и сохраняй героя используя Game Cache.
Старый 06.08.2007, 13:41
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
HighTemplar
Имхо, не используй новые триггеры у ВЕУ.
Старый 06.08.2007, 20:48
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 13:18.