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

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

Закрытая тема
 
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Прошу помочь с составлением функции и ее пояснением
Отряд- Выбрать юнитов в группе и нанести каждому выбранному 10% от хп элементом сила тьмы, типом яд.
В общем можно использовать всякое хамняжко(BJ функции), но меня интересует оптимизейшн да и просто не могу понять как работает ибо почему в функции на выбор есть булеан проверяющая желаемо ли уничтожение группы? Я минут 5 потупил, решил обратиться к возможно понимающим людям
Старый 19.05.2010, 14:03
perimetral

offline
Опыт: 3,058
Активность:
Не уверен, будет ли работать (нет возможности проверить), но все должно быть норм.
» Код
Использовать так:
call DamageGroup(g, d, r)
Где g - группа, d - урон (10% сам посчитаешь, думаю), r - дальний ли бой.
function DamageGroup takes group g, real dmg, boolean ranged returns nothing
    local unit u
    local group og = g
    loop
       set u = FirstOfGroup(og)
       call UnitDamageTarget(u, u, dmg, true, ranged, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
       call GroupRemoveUnit(og, u)
    exitwhen u = null
    endloop
    set g = null
endfunction
Можно еще сделать через ForGroup, но тут без хеша не обойтись имхо.
Старый 19.05.2010, 14:36
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
perimetral, с каких пор для фор гроуп хеш? Аттачить не к чему. Не нужно мудрить, а юзать call ForGroup()
Старый 19.05.2010, 19:16
Vash
Удалён
offline
Опыт: 1,722
Активность:
Код:
function TrigTrigGroup takes nothing returns boolean
    if IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetTriggerUnit())) and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0 then
        call UnitDamageTarget(GetTriggerUnit(),GetFilterUnit(),GetUnitState(GetFilterUnit(),U  NIT_STATE_MAX_LIFE)*.1,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
    endif
    return false
endfunction

function TrigTrig takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local group g=CreateGroup()
    call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),1000,Condition(function TrigTrigGroup))
    call DestroyGroup(g)
    set u=null
    set g=null
endfunction


Может чтото типо этого ?
Старый 19.05.2010, 20:29
perimetral

offline
Опыт: 3,058
Активность:
StoneHeartis, Если добавлять настраиваемый урон, то с юзом ФорГрупа без хеша не обойтись.
Старый 20.05.2010, 23:32
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
не шариш
bee добавил:
глобалки на что
bee добавил:
tempU;
tempR.
Старый 20.05.2010, 23:38
perimetral

offline
Опыт: 3,058
Активность:
bee, А вот этого нам знать не дано.
Лол, есть причины не юзать мой код без ФорГрупа, глобалок и хеша?
Старый 21.05.2010, 00:21
agentex

offline
Опыт: 34,834
Активность:
perimetral, твой код не тру. впрочем у Vash'а тоже но по другой причине.
то с юзом ФорГрупа без хеша не обойтись.
бред.
Старый 21.05.2010, 01:56
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Я в этой паре кодов не нашел ничего схожего с нативкой BJ-йской
Diaboliko добавил:
Типа функция криво составлена да?
Старый 21.05.2010, 04:55
silumin

offline
Опыт: 11,153
Активность:
Diaboliko, немного изменённый код Vash'а... Я так делаю, не утверждаю, что правильно.
Код:
// udg_TEMP_AbilityXXX_Unit - Боевая единица - переменная для хранения ссылки на нужного юнита

function TrigTrigGroup takes nothing returns boolean
local unit Fu = GetFilterUnit()
    if IsUnitEnemy(Fu,GetOwningPlayer(udg_TEMP_AbilityXXX_Unit)) and not IsUnitType(Fu, UNIT_TYPE_STRUCTURE) and GetUnitState(Fu,UNIT_STATE_LIFE)>0 then
        call UnitDamageTarget(udg_TEMP_AbilityXXX_Unit,Fu,GetUnitState(Fu,UNIT_STATE_MAX_LIFE  )*.1,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
    endif
    set u = null
    return false
endfunction

function TrigTrig takes nothing returns nothing
local group g=CreateGroup()
    set udg_TEMP_AbilityXXX_Unit = GetTriggerUnit()
    call GroupEnumUnitsInRange(g,GetUnitX(udg_TEMP_AbilityXXX_Unit),GetUnitY(udg_TEMP_Abi  lityXXX_Unit),1000,Condition(function TrigTrigGroup))
    call DestroyGroup(g)
    set g=null
endfunction
Старый 21.05.2010, 10:16
adic3x

offline
Опыт: 108,439
Активность:
// cJass
group gr_temp = CreateGroup ();
unit u_temp, c_temp;
player p_temp;

nothing fx () {
    u_temp = GetTriggerUnit ();
    p_temp = GetOwningPlayer (u_temp);
    GroupEnumUnitsInRange(gr_temp, GetUnitX(u_temp), GetUnitY(u_temp), 1024., Condition(lambda boolean () {
        c_temp = GetFilterUnit ();
        if (IsUnitEnemy(c_temp, p_temp) || !IsUnitType(c_temp, UNIT_TYPE_STRUCTURE) || GetWidgetLife(c_temp) > .405) {
            UnitDamageTarget (u_temp, c_temp, GetUnitState(c_temp, UNIT_STATE_MAX_LIFE  ) * .1, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS);
        }
        return false;
    }));
}
Старый 21.05.2010, 11:50
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Я все же не понимаю зачем нам булеан...
Старый 21.05.2010, 18:33
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
булеан bj_wantDestroyGroup нужен для уничтожении bj_lastCreatedGroup при выполнении чего-то там
но это все бред, это использовать не надо. надо удалять группу в ручную
function FilterFunc takes nothing returns boolean
	return true // здесь условия
endfunction

function OnSpellCast takes nothing returns nothing
	local unit c=GetTriggerUnit() // caster
	local group g=CreateGroup() // создаем новую группу
	local boolexpr b=Condition(function FilterFunc) // создаем фильтр
	local unit temp=null

	call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),200.,b)
	loop
	set u=FirstOfGroup(g)
	exitwhen u==null
	call GroupRemoveUnit(g,u)
	// здесь действия
	endloop

	// ну и обнуление
endfunction
Старый 21.05.2010, 19:50
silumin

offline
Опыт: 11,153
Активность:
Diaboliko, он нам незачем, но т.к. все, приведённые выше примеры, написаны в "сокращённой" форме, то приходится его прописывать.
Для наглядности "развёрнутая форма":
Код:
// udg_TEMP_AbilityXXX_Unit - Боевая единица - переменная для хранения ссылки на нужного юнита

function TrigTrigGroupAction  takes nothing returns nothing
call UnitDamageTarget(udg_TEMP_AbilityXXX_Unit,GetEnumUnit(),GetUnitState(Unit,GetEnu  mUnit(),UNIT_STATE_MAX_LIFE  )*.1,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
endfunction

function TrigTrigGroup takes nothing returns boolean
return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(udg_TEMP_AbilityXXX_Unit)) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)
endfunction

function TrigTrig takes nothing returns nothing
local group g=CreateGroup()
    set udg_TEMP_AbilityXXX_Unit = GetTriggerUnit()
    call GroupEnumUnitsInRange(g,GetUnitX(udg_TEMP_AbilityXXX_Unit),GetUnitY(udg_TEMP_Abi    lityXXX_Unit),1000,Condition(function TrigTrigGroup))
    call ForGroup(g,function TrigTrigGroupAction)
    call DestroyGroup(g)
    set g=null
endfunction

Суть в том, что если действие над юнитом в группе несложное и быстрое, то все действия выполняются в функции-фильтре, от сюда и булиан.

silumin добавил:
bee, во всех 3х примерах группа вообще не заполнялась, она оставалась пустой от объявления до дестроя. А твой код смахивает на стиль "программные извращения".
Старый 21.05.2010, 20:02
agentex

offline
Опыт: 34,834
Активность:
ну что вы тут развели флуд по поводу какайто элементарщины. вот непонимаю этого, все же обсуждалось по несколько десятков раз
Старый 21.05.2010, 20:41
adic3x

offline
Опыт: 108,439
Активность:
я вот не понимаю, ну я же привел нормальный код? уж так повелось, что если приводишь код после кого то - он дб лучше. а у вас тут все просто кошмарно...
Старый 22.05.2010, 01:33
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от ADOLF
я же привел нормальный код?

А кто говорил юзать / для переноса длиных строк ?)

silumin

Объясни, для чего создавать новую группу, если нужно нанести урон мгновенно?
Старый 22.05.2010, 03:23
silumin

offline
Опыт: 11,153
Активность:
ZeToX2007, т.к. автор темы немногозначно сформулировал свою проблему:
Цитата:
Сообщение от Diaboliko
Отряд- Выбрать юнитов в группе и нанести каждому выбранному 10% от хп элементом сила тьмы, типом яд...
Не умеем внимательно читать?
Старый 22.05.2010, 13:03
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Хмм... Так, ну теперь все понятно, спасибо) Но нельзя ли из этого
function abc1 takes ___ returns ___
function abc2 takes ___ returns ___
function abc3 takes ___ returns ___
function abc4 takes ___ returns ___
просто 1 функцию? или это реально задействует так многО? о_О
Старый 22.05.2010, 13:21
adic3x

offline
Опыт: 108,439
Активность:
А кто говорил юзать / для переноса длиных строк ?)
Ну поймал, поймал. По идее да, надо бы, но опять же смотреть по форматированию всего кода.
просто 1 функцию?
У меня одна функция, но судя по всему мой пост никто не видит. Хотя на самом деле нельзя.
Старый 22.05.2010, 19:12
Закрытая тема

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

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

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

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



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