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

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

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

offline
Опыт: 442
Активность:
Проблема с группами
Решил сделать пассиву, при срабатывании, которой дамажит юнитов в радиусе 300 от цели и саму цель, проблема состоит в том , что урон не наносится и эффект не создается, проблему найти не смог;[
P.S. с группами только начал разбираться, поэтому не уверен в правильности кода...
((код jass
function Trig_Sunstrike_Conditions takes nothing returns boolean
return GetUnitAbilityLevelSwapped('A009', GetAttacker())== 1
endfunction
function FilterUnit takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND)
endfunction
function Damage takes unit caster returns nothing
call DestroyEffect(AddSpecialEffectTargetUnitBJ("origin", GetEnumUnit(), "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"))
call UnitDamageTargetBJ( caster, GetEnumUnit(), 250, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE )
endfunction
function Trig_Sunstrike_Actions takes nothing returns nothing
local unit target = GetAttackedUnitBJ()
local unit caster = GetAttacker()
local real x = GetUnitX(target)
local real y = GetUnitY(target)
local group g = CreateGroup()
local boolexpr b = function FilterUnit
local integer chance = GetRandomInt(1, 100)
if chance <= 10 then
call GroupEnumUnitsInRange(g, x, y, 300, b)
call ForGroup(g, function Damage)
call DestroyGroup(g)
set g = null
set caster = null
set target = null
else
call DestroyGroup(g)
set g = null
set target = null
set caster = null
endif
endfunction
function InitTrig_Sunstrike takes nothing returns nothing
set gg_trg_Sunstrike = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Sunstrike, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Sunstrike, Condition( function Trig_Sunstrike_Conditions ) )
call TriggerAddAction( gg_trg_Sunstrike, function Trig_Sunstrike_Actions )
endfunction
))

Отредактировано freest, 25.01.2012 в 14:06.
Старый 25.01.2012, 13:33
youtube
сктыщь
offline
Опыт: 8,025
Активность:
globals
unit CAST
real damage=100.
endglobals
function abc takes nothing returns boolen
	local unit u = GetFilterUnit()
        if IsUnitType(u, UNIT_TYPE_GROUND) then
            call UnitDamageTarget(CASDT, u, damage , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, null)  
        endif
        set u = null
        return false     
endfunction

...
CAST=caster
GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, 300, Filter(function thistype.onDamage)) 
...
вот попробуй примерно как то так

Отредактировано youtube, 25.01.2012 в 14:34.
Старый 25.01.2012, 13:50
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
function InitTrig_Sunstrike takes nothing returns nothing
    set gg_trg_Sunstrike = CreateTrigger(  )
    call TriggerAddCondition( gg_trg_Sunstrike, Condition( function Trig_Sunstrike_Conditions ) )
    call TriggerAddAction( gg_trg_Sunstrike, function Trig_Sunstrike_Actions )
endfunction
Один я не вижу события срабатывания триггера?
Старый 25.01.2012, 13:51
alpha

offline
Опыт: 7,387
Активность:
локальные переменные еще используешь в качестве глобальных
Старый 25.01.2012, 13:57
freest

offline
Опыт: 442
Активность:
Nerevar:
function InitTrig_Sunstrike takes nothing returns nothing
    set gg_trg_Sunstrike = CreateTrigger(  )
    call TriggerAddCondition( gg_trg_Sunstrike, Condition( function Trig_Sunstrike_Conditions ) )
    call TriggerAddAction( gg_trg_Sunstrike, function Trig_Sunstrike_Actions )
endfunction
Один я не вижу события срабатывания триггера?
Да, спасибо, случайно забыл про него)
Теперь, когда срабатывает пассива вар критует -___-
Старый 25.01.2012, 14:02
alpha

offline
Опыт: 7,387
Активность:
function Damage takes unit caster returns nothing
    call DestroyEffect(AddSpecialEffectTargetUnitBJ("origin", GetEnumUnit(), "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"))
    call UnitDamageTargetBJ( caster, GetEnumUnit(), 250, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE )
endfunction
ты используешь функцию с принимаемыми аргументами некорректно.
Скинь весь код(с событием и поправками) - я исправлю и увидишь
Старый 25.01.2012, 14:06
freest

offline
Опыт: 442
Активность:
((код jass
function Trig_Sunstrike_Conditions takes nothing returns boolean
return GetUnitAbilityLevelSwapped('A009', GetAttacker())== 1
endfunction
function FilterUnit takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND)
endfunction
function Damage takes unit caster returns nothing
call DestroyEffect(AddSpecialEffectTargetUnitBJ("origin", GetEnumUnit(), "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"))
call UnitDamageTargetBJ( caster, GetEnumUnit(), 250, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE )
endfunction
function Trig_Sunstrike_Actions takes nothing returns nothing
local unit target = GetAttackedUnitBJ()
local unit caster = GetAttacker()
local group g = CreateGroup()
local integer chance = GetRandomInt(1, 100)
if chance <= 10 then
call GetUnitsInRangeOfLocMatching(300, GetUnitLoc(target), Condition(function FilterUnit))
call ForGroup(g, function Damage)
call DestroyGroup(g)
set g = null
set caster = null
set target = null
else
call DestroyGroup(g)
set g = null
set target = null
set caster = null
endif
endfunction
function InitTrig_Sunstrike takes nothing returns nothing
set gg_trg_Sunstrike = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Sunstrike, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Sunstrike, Condition( function Trig_Sunstrike_Conditions ) )
call TriggerAddAction( gg_trg_Sunstrike, function Trig_Sunstrike_Actions )
endfunction
))
немного поправил, вар критовать перестал, теперь абила не срабатывает ;[
Старый 25.01.2012, 14:18
alpha

offline
Опыт: 7,387
Активность:

define
  //syntax
  InitUnitXY(a) = {real x = GetUnitX(a); real y = GetUnitY(a)}
  
enddefine

  globals
     hashtable H = InitHashtable()
  endglobals

  function Trig_Sunstrike_Actions takes nothing returns nothing
    unit target = GetTriggerUnit()
    unit caster = GetAttacker()
    unit a
    InitUnitXY(target)
    
    group g = LoadGroupHandle(H,GetHandleId(GetTriggeringTrigger()),0)
    
    if GetRandomInt(1, 100) < 11 then
      GroupEnumUnitsInRange(g, x, y, 300., null)

      loop
         a = FirstOfGroup(g)
         exitwhen a == null
         if IsUnitType(a, UNIT_TYPE_GROUND) then
           DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl", a, "origin"))
           UnitDamageTarget(caster, a, 250., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
         endif
         GroupRemoveUnit(g,a)
      endloop

    endif

    GroupClear(g)
    g = null; a = null; target = null; caster = null
  endfunction

  function InitTrig_Sunstrike takes nothing returns nothing
    trigger t = CreateTrigger()
    
     //что за дряхлое событие, испльзуй EVENT_UNIT_DAMAGED.
      TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
    
    //Создаем(!) триггер когда еденица прокачала способность.
    
    SaveGroupHandle(H,GetHandleId(t),0,CreateGroup())
   //Подгрузка
      
    TriggerAddCondition(t, Condition( function Trig_Sunstrike_Conditions ) )
    TriggerAddAction(t, function Trig_Sunstrike_Actions )
    gg_trg_Sunstrike = t
    t = null
  endfunction
Работай через хеш, он на то и придуман

Отредактировано alpha, 25.01.2012 в 14:41.
Старый 25.01.2012, 14:32
youtube
сктыщь
offline
Опыт: 8,025
Активность:
alpha:
      loop
         a = FirstOfGroup(g)
         if IsUnitType(a, UNIT_TYPE_GROUND) then
           DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl", a, "origin"))
           UnitDamageTarget(caster, a, 250., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
         endif
         GroupRemoveUnit(g,a)
      endloop
циклы не тру
Старый 25.01.2012, 14:39
alpha

offline
Опыт: 7,387
Активность:
код из пяти строк, тут трудно не понять
youtube:
циклы не тру
нормально, может и не оптимально в плане производительности..
там забыл
         exitwhen a == null
:3
исправил
можно "exitwhen not a" между прочим) © Sc

Отредактировано ScorpioT1000, 26.01.2012 в 02:53.
Старый 25.01.2012, 14:39
Kirya92

offline
Опыт: 107
Активность:
scope spell initializer spellEvent

private boolean Conditions()
{ return GetUnitAbilityLevel(GetAttacker(), 'A009')>=1 }

private nothing Actions()
{
    unit u = GetTriggerUnit()
    unit t = GetAttacker()
    group g
    unit f
    integer c = GetRandomInt(1, 100)
    if( c<=10 )
    {
        g = CreateGroup()
        GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 300, null)
        loop
        {
            f = FirstOfGroup(g)
            exitwhen( f==null )
            if( (IsUnitType(f, UNIT_TYPE_GROUND)) and (GetUnitState(f, UNIT_STATE_LIFE)>0.405) )
            {
                DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl", GetUnitX(f), GetUnitY(f)))
                UnitDamageTarget(t, f, 250, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
            }
            GroupRemoveUnit(g, f)
        }
    }
    
    DestroyGroup(g)
    u = null
    t = null
    g = null
    f = null
    c = 0
}

private nothing spellEvent()
{
    gg_trg_spell = CreateTrigger(  )
    TriggerRegisterAnyUnitEventBJ( gg_trg_spell, EVENT_PLAYER_UNIT_ATTACKED )
    TriggerAddCondition( gg_trg_spell, Condition( function Conditions ) )
    TriggerAddAction( gg_trg_spell, function Actions )
}
endscope
Старый 26.01.2012, 02:13
alpha

offline
Опыт: 7,387
Активность:
Kirya92, почему не извлекли урок из сообщений в теме?
Вы дали код в котором лишние подгрузки и операции. К тому же еще и красиво обнулили целочисленную нужда в инициализации которой даже отсутствует.
Неплохое владение cjass'ом, а толковых знаний меньше, чем у рядовых пользователей этого языка-дополнения.
Старый 26.01.2012, 02:55
Kirya92

offline
Опыт: 107
Активность:
alpha, речь шла о работоспособности кода, а не о его производительности..)
Старый 26.01.2012, 16:53
freest

offline
Опыт: 442
Активность:
Всем спасибо, все было проще ^_^
тему клоуз .
Старый 30.01.2012, 10:22
Закрытая тема

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

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

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

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



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