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

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

Закрытая тема
 
KPOKODIL
В разработке
offline
Опыт: 10,262
Активность:
Проблема с jass спелом
Уже 3й час сижу над ним, и ничерта не получается.Спел то частично работает, то не работает вообще.
Суть спела в чем: При атаке у башни есть 10% шанс отравить противника. Яд наносит 50 ед. урона в сек. Время действия яда - 4 сек. Если под действием этого эффекта воин умрет (не обязательно от самого эффекта), то всем близстоящим войнам нанесется 250 ед. урона.
Я пытался сделать без использования глобалок, но тогда у меня не исчезал эффект яда. Впихнул глобалку - перестало работать все.
Помогите плз.
» раскрыть
Код:
globals
group udg_SOPGroup 
endglobals
function Bool1 takes nothing returns boolean
    if ( not(GetRandomReal(0, 100.00) <= 10.00) ) then
        return false
    endif
    if ( not(GetUnitAbilityLevelSwapped('A001', GetAttacker()) > 0) ) then
        return false
    endif
    if ( not ( IsUnitInGroup(GetAttackedUnitBJ(), udg_SOPGroup) == false ) ) then
        return false
    endif
    return true
endfunction

function SOPActions takes nothing returns nothing
    if ( Bool1() ) then
    local unit at = GetAttacker()
    local unit tg = GetAttackedUnitBJ()
    local effect e = AddSpecialEffectTargetUnitBJ( "overhead", tg , "Abilities\\Spells\\Other\\Parasite\\ParasiteTarget.mdl" )
    local integer time = 0
    call GroupAddUnitSimple( tg, udg_SOPGroup) 
    endif
    if ( time < 4 ) then
    call UnitDamageTargetBJ( at, tg, 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    set time = time +1
    call PolledWait (1.00)
    endif
    if (time == 4) then
    call GroupRemoveUnitSimple( tg , udg_SOPGroup )
    set tg = null
    set at = null
    set time = 0
    call DestroyEffectBJ (e)
    endif
    if (IsUnitAliveBJ(tg) == false)
    call UnitDamagePointLoc( at, 0, 200.00, GetUnitLoc(tg), 250.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call AddSpecialEffectLocBJ( GetUnitLoc(tg), "EarthRender.mdx" )
    endif
endfunction

//===========================================================================
function InitTrig_SeedOfPoison3 takes nothing returns nothing
    set gg_trg_SeedOfPoison3 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SeedOfPoison3, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( gg_trg_SeedOfPoison3, function SOPActions )
endfunction
Прикрепленные файлы
Тип файла: w3x SeedofVenom.w3x (25.6 Кбайт, 1 просмотров )
Старый 04.02.2012, 22:20
Hares
полупротосс
offline
Опыт: 6,966
Активность:
KPOKODIL:
((код jass
call PolledWait (1.00)
))
Страшная ошибка здесь. Ты код этой ф-ии читал?
Но ещё большая ошибка в том, что ты забыл цикл.
К тому же вообще непонятно,зачем ты ввёл группу.
Плюс ещё:
((код jass
call UnitDamagePointLoc( at, 0, 200.00, GetUnitLoc(tg), 250.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
))
Эта ф-ия дамажит по всем юнитам в области. ПО ВСЕМ.
И ты не удаляешь спецэффекты.
А вот ошибка, почему не работает спелл:
((код
globals
group udg_SOPGroup = CreateGroup()
endglobals
))
У тебя группа не создавалась, и код, дойдя до точки, где юнит аттачится к группе, вылетает.
Hares добавил:
Итого где-то так:
» Разверни меня!
((код
function Bool2 takes nothing returns boolean
local unit u = GetFilterUnit()
if IsPlayerAlly(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
set u = null
return false
elseif GetOwningPlayer(GetSpellAbilityUnit()) == GetOwningPlayer(u) then
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
set u = null
return false
elseif GetWidgetLife(u) < 0.405
set u = null
return false
endif
set u = null
return true
endfunction
function Bool1 takes nothing returns boolean
if ( not(GetRandomReal(0, 100.00) <= 10.00) ) then
return false
endif
if ( not(GetUnitAbilityLevelSwapped('A001', GetAttacker()) > 0) ) then
return false
endif
if ( not ( IsUnitInGroup(GetAttackedUnitBJ(), udg_SOPGroup) == false ) ) then
return false
endif
return true
endfunction
function SOPActions takes nothing returns nothing
if (not(Bool1())) then return

local unit at = GetAttacker()
local unit tg = GetAttackedUnitBJ()
local effect e = AddSpecialEffectTargetUnitBJ("overhead", tg , "Abilities\\Spells\\Other\\Parasite\\ParasiteTarget.mdl")
local integer time = 0
local group g

loop
exitwhen (time = 4)

call UnitDamageTargetBJ(at, tg, 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL)
call UnitDamageTarget(at, tg, 50, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
set time = time +1
call TriggerSleepAction(1.00)
endloop

set tg = null
set at = null
set time = 0
call DestroyEffectBJ (e)

if (not(IsUnitAliveBJ(tg)))
set g = CreateGroup()
call GroupEnumUnitsInRange(g, GetUnitX(tg), GetUnitY(tg), 200, function Bool2)

loop
set tg= FirstOfGroup(g)
exitwhen tg == null
call GroupRemoveUnit(g, tg)
call UnitDamageTarget(at, tg, 250, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endloop
call DestroyGroup(g)
set g = null

call RemoveSpecialEffect(AddSpecialEffectLocBJ(GetUnitLoc(tg), "EarthRender.mdx"))
endif

endfunction
))
Старый 04.02.2012, 23:31
alpha

offline
Опыт: 7,387
Активность:
Hares, код проверил бы на предмет ошибок..
Старый 04.02.2012, 23:35
KPOKODIL
В разработке
offline
Опыт: 10,262
Активность:
Цитата:
Сообщение от Hares
К тому же вообще непонятно,зачем ты ввёл группу.

Группа нужна, чтобы повторно не использовать заклинание на юните, если на нем уже есть это заклиание
Цитата:
Сообщение от Hares
Эта ф-ия дамажит по всем юнитам в области. ПО ВСЕМ.


Ну да, мне это и надо, я так и написал в описании.

Щас посмотрю твой вариант кода

KPOKODIL добавил:
код не компилится твой, выдает ошибку
Missing: Endblock
Старый 04.02.2012, 23:57
Hares
полупротосс
offline
Опыт: 6,966
Активность:
KPOKODIL:
Ну да, мне это и надо, я так и написал в описании.
Втч. по мёртвым, по зданим, по механическим... У тебя яд разъедает бетон? - удивлён.
alpha:
Hares, код проверил бы на предмет ошибок..
В общем-то нет, но, по идее, не должно быть.
Hares добавил:
KPOKODIL:
KPOKODIL добавил:
код не компилится твой, выдает ошибку
Missing: Endblock
На чём?
Hares добавил:
тогда ещё такое:
GroupAddUnit(udg_SOPGroup, tg)
и
GroupRemoveUnit(udg_SOPGroup, tg)
Старый 05.02.2012, 00:03
KPOKODIL
В разработке
offline
Опыт: 10,262
Активность:
Цитата:
Сообщение от Hares
Втч. по мёртвым, по зданим, по механическим... У тебя яд разъедает бетон? - удивлён.

а кто тебе сказал что этот спел будет вообще контактироваться со зданиями и тп?

KPOKODIL добавил:
Цитата:
Сообщение от KPOKODIL
На чём?

в том то и дело, что непотно где
Старый 05.02.2012, 00:12
Hares
полупротосс
offline
Опыт: 6,966
Активность:
KPOKODIL:
в том то и дело, что непотно где
JassHelper (JNPG) Вам в помощь.
Hares добавил:
И вообще, делай с таймером. Это точнее.
Старый 05.02.2012, 00:14
KPOKODIL
В разработке
offline
Опыт: 10,262
Активность:
в общем переделал свой код, использую ваши подсказки. Теперь все работает.
Выложил код, кому интересно может глянуть.
Тему мжно закрывать , всем спасибо.
» раскрыть
Код:
globals
group udg_SOPGroup = CreateGroup() 
endglobals
function Bool1 takes nothing returns boolean
    if ( not(GetRandomReal(0, 100.00) <= 10.00) ) then
        return false
    endif
    if (not (IsUnitType(GetAttackedUnitBJ(), UNIT_TYPE_MECHANICAL)==false)) then
    return false
    endif
    if ( not(GetUnitAbilityLevelSwapped('A001', GetAttacker()) > 0) ) then
        return false
    endif
    if ( not ( IsUnitInGroup(GetAttackedUnitBJ(), udg_SOPGroup) == false ) ) then
        return false
    endif
    return true
endfunction

function SOPActions takes nothing returns nothing
    if ( Bool1() ) then
    local unit at = GetAttacker()
    local unit tg = GetAttackedUnitBJ()
    local effect e = AddSpecialEffectTargetUnitBJ( "overhead", tg , "Abilities\\Spells\\Other\\Parasite\\ParasiteTarget.mdl" )
    local integer time = 0
    call GroupAddUnitSimple( tg, udg_SOPGroup) 
    endif
    loop
    exitwhen (time == 4)
    call UnitDamageTargetBJ( at, tg, 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    if (IsUnitAliveBJ(tg) == false)
    call UnitDamagePointLoc( at, 0, 200.00, GetUnitLoc(tg), 250.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call DestroyEffectBJ(AddSpecialEffectLocBJ( GetUnitLoc(tg), "EarthRender.mdx" ))
    call DestroyEffectBJ (e)
    set time = 3
    endif
    set time = time +1
    call TriggerSleepAction (1.00)
    endloop
    call GroupRemoveUnitSimple( tg , udg_SOPGroup )
    set tg = null
    set at = null
    set time = 0
    call DestroyEffectBJ (e)
endfunction

//===========================================================================
function InitTrig_SeedOfPoison takes nothing returns nothing
    set gg_trg_SeedOfPoison = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SeedOfPoison, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SeedOfPoison, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddAction( gg_trg_SeedOfPoison, function SOPActions )
endfunction


KPOKODIL добавил:
Цитата:
Сообщение от Hares
JassHelper (JNPG) Вам в помощь.

им уже как 2 года только и пользуюсь
Старый 05.02.2012, 00:28
Закрытая тема

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

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

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

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



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