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

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

Ответ
 
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
Проблема с фильтрами :(((
//...bla bla bla
function enumFilter takes nothing returns boolexpr
if IsUnitEnemy(GetEnumUnit(),GetOwningPlayer(ShC)) == true and IsUnitInGroup(GetEnumUnit(), allenum) == false and GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) <= 0.405 then
return true
else
return false
endif
endfunction
//...
call GroupEnumUnitsInRange(ShCenum, x2,y2, AOE, function enumFilter)
//...
В чем трабла???
Старый 17.10.2010, 19:06
ScorpioT1000
Работаем
offline
Опыт: отключен
returns boolean

Отредактировано ScorpioT1000, 17.10.2010 в 21:09.
Старый 17.10.2010, 19:08
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
ScorpioT1000, куда это ставить, ато я поставил вместо ретурна и выдало еще пару ошибок, пжлст напиши код как должен быть.
Старый 17.10.2010, 19:15
reALien

offline
Опыт: 29,211
Активность:
//...bla bla bla
function enumFilter takes nothing returns boolean
if IsUnitEnemy(GetEnumUnit(),GetOwningPlayer(ShC)) == true and IsUnitInGroup(GetEnumUnit(), allenum) == false and GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) <= 0.405 then
return true
else
return false
endif
endfunction
//...
call GroupEnumUnitsInRange(ShCenum, x2,y2, AOE, Filter(function enumFilter))
//...
Как-то так, если мне не изменяет память...
Старый 17.10.2010, 20:03
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
Блин :((( код отказывается работать, даже при том что все компилится.
» код
scope ShadowCoil initializer InitTrig_Shadow_Coil

globals
    private unit ShC
    private unit Caster
    private real x1
    private real y1
    private real x2
    private real y2
    private real angle
    private integer DAMAGE
    private integer SHC_SPEED
    private integer AOE
    private integer RANGE
    private integer SIZE
    private group ShCenum
    private group allenum
    hashtable ShCHash
    timer exp
    timer MT
endglobals

function Trig_Shadow_Coil_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction

function damage takes nothing returns nothing
call UnitDamageTarget(Caster, GetEnumUnit(), DAMAGE, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_DEATH, WEAPON_TYPE_WHOKNOWS)
call CreateUnit(GetOwningPlayer(Caster), 'h001', GetUnitX(GetEnumUnit()),GetUnitY(GetEnumUnit()),0)
call UnitAddAbility(bj_lastCreatedUnit,'A000')
call SetUnitAbilityLevel(bj_lastCreatedUnit,'A000', GetUnitAbilityLevel(Caster,'A001'))
call IssueImmediateOrder(bj_lastCreatedUnit,"howlofterror")
call UnitApplyTimedLife(bj_lastCreatedUnit,'BTLF',1)
call GroupAddUnit(allenum,GetEnumUnit())
call GroupRemoveUnit(ShCenum, GetEnumUnit())
endfunction

function enumFilter takes nothing returns boolean
if IsUnitEnemy(GetEnumUnit(),GetOwningPlayer(ShC)) == true and IsUnitInGroup(GetEnumUnit(), allenum) == false and GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) <= 0.405 then
return true
else
return false
endif
endfunction

function Moving takes nothing returns nothing
    set exp = GetExpiredTimer()
    set Caster = LoadUnitHandle(ShCHash,GetHandleId(exp),7)
    set ShC = LoadUnitHandle(ShCHash,GetHandleId(exp),6)
    set angle = LoadReal(ShCHash,GetHandleId(exp),5)
    set x1 = LoadReal(ShCHash,GetHandleId(exp),1)
    set y1 = LoadReal(ShCHash,GetHandleId(exp),2)
    set DAMAGE = LoadInteger(ShCHash,GetHandleId(exp),8)
    set SHC_SPEED = LoadInteger(ShCHash,GetHandleId(exp),9)
    set AOE = LoadInteger(ShCHash,GetHandleId(exp),10)
    set RANGE = LoadInteger(ShCHash,GetHandleId(exp),11)
    set ShCenum = LoadGroupHandle(ShCHash,GetHandleId(exp),3)
    set x2 = x1 + SHC_SPEED*0.03 * Cos(angle * bj_DEGTORAD)
    set y2 = y1 + SHC_SPEED*0.03 * Sin(angle * bj_DEGTORAD)
    call SetUnitX(ShC, x2)
    call SetUnitY(ShC, y2)
    call GroupEnumUnitsInRange(ShCenum, x2,y2, AOE, Filter(function enumFilter))
    call ForGroup(ShCenum, function damage)
    set RANGE = RANGE - SHC_SPEED/33
    if RANGE > 0 then
    set MT = CreateTimer()
    call SaveReal(ShCHash,GetHandleId(MT),1,x2)
    call SaveReal(ShCHash,GetHandleId(MT),2,y2)
    call SaveGroupHandle(ShCHash,GetHandleId(MT),3,ShCenum)
    call SaveGroupHandle(ShCHash,GetHandleId(MT),4,allenum)
    call SaveReal(ShCHash,GetHandleId(MT),5,angle)
    call SaveUnitHandle(ShCHash,GetHandleId(MT),6,ShC)
    call SaveUnitHandle(ShCHash,GetHandleId(MT),7,Caster)
    call SaveInteger(ShCHash,GetHandleId(MT),8,DAMAGE)
    call SaveInteger(ShCHash,GetHandleId(MT),9,SHC_SPEED)
    call SaveInteger(ShCHash,GetHandleId(MT),10,AOE)
    call SaveInteger(ShCHash,GetHandleId(MT),11,RANGE)
    call TimerStart(MT, 0.03, false, function Moving)
    else
    call RemoveUnit(ShC)
    endif
endfunction

function Trig_Shadow_Coil_Actions takes nothing returns nothing
    //Changeable values
    set Caster = GetTriggerUnit()
    set x1 = GetUnitX(Caster)
    set y1 = GetUnitY(Caster)
    set x2 = GetSpellTargetX()
    set y2 = GetSpellTargetY()
    set angle = bj_RADTODEG * Atan2(y2 - y1, x2 - x1)
    set DAMAGE = 50*GetUnitAbilityLevel(Caster,'A001')
    set SHC_SPEED = 600+100*GetUnitAbilityLevel(Caster,'A001')
    set AOE = 300
    set RANGE = 900
    set SIZE = 3
    //End Changeable values
    set MT = CreateTimer()
    if ShCHash == null then
	set ShCHash = InitHashtable()
    endif
    set ShC = CreateUnit(GetOwningPlayer(Caster),'h001', x1, y1, angle)
    call SetUnitScale(ShC,SIZE,SIZE,SIZE)
    call AddSpecialEffectTarget("Abilities//Weapons//AvengerMissile//AvengerMissile.mdl", ShC, "origin")
    call SaveReal(ShCHash,GetHandleId(MT),1,x1)
    call SaveReal(ShCHash,GetHandleId(MT),2,y1)
    call SaveGroupHandle(ShCHash,GetHandleId(MT),3,ShCenum)
    call SaveGroupHandle(ShCHash,GetHandleId(MT),4,allenum)
    call SaveReal(ShCHash,GetHandleId(MT),5,angle)
    call SaveUnitHandle(ShCHash,GetHandleId(MT),6,ShC)
    call SaveUnitHandle(ShCHash,GetHandleId(MT),7,Caster)
    call SaveInteger(ShCHash,GetHandleId(MT),8,DAMAGE)
    call SaveInteger(ShCHash,GetHandleId(MT),9,SHC_SPEED)
    call SaveInteger(ShCHash,GetHandleId(MT),10,AOE)
    call SaveInteger(ShCHash,GetHandleId(MT),11,RANGE)
    call TimerStart(MT, 0.03, false, function Moving)
endfunction

//===========================================================================
function InitTrig_Shadow_Coil takes nothing returns nothing
    local trigger gg_trg_Shadow_Coil = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Shadow_Coil, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Shadow_Coil, Condition( function Trig_Shadow_Coil_Conditions ) )
    call TriggerAddAction( gg_trg_Shadow_Coil, function Trig_Shadow_Coil_Actions )
    set gg_trg_Shadow_Coil = null
endfunction
endscope
Подскажите мне как заставить его работать, и как очищать утечки в Хэштаблицах
Старый 17.10.2010, 20:36
F3n1kz

offline
Опыт: 4,548
Активность:
чуть пофиксил код
function enumFilter takes nothing returns boolean
return ((IsUnitEnemy(GetEnumUnit(),GetOwningPlayer(ShC)) == true) and (IsUnitInGroup(GetEnumUnit(), allenum) == false) and (GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) <= 0.405))
endfunction
Старый 17.10.2010, 20:41
silumin

offline
Опыт: 11,153
Активность:
Just Fear, GetEnumUnit() - Это для ForGroup(...). А для фильтров - GetFilterUnit().
Старый 17.10.2010, 20:57
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
silumin, спс, но скил воооооообще не запускается, то есть даже юнит, который должен быть создан в основном блоке кода, не создается :((( мб я что то с initializator'ами напутал
Старый 17.10.2010, 21:51
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
карту в студию
Старый 17.10.2010, 23:06
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
bee, лови карту
Прикрепленные файлы
Тип файла: w3x trololo.w3x (25.0 Кбайт, 14 просмотров )
Старый 17.10.2010, 23:11
silumin

offline
Опыт: 11,153
Активность:
Just Fear, имхо, у тебя явный перебор с ХТ. Особенно для таймера с периодом 0.03 сек. GetHandleId(handle) лучше получить 1 раз в локальную переменную, нежели 10 раз получать в начале и ещё 10 раз в конце функции. Как бы непонятен смысл заносить тучу значений в глобалки (при касте спелла, я так понял), чтобы тремя строками ниже начать из записывать в ТХ, не проще ли сразу писать в ХТ? Не зачем абсолютно прощитывать полярные координаты в х2 и у2, сразу в сетХ/Y.

Короче, просто нужна оптимизация, хотя бы минимальная, а разбираться что тут не работает никому неохота.
Старый 18.10.2010, 15:41
Just Fear
Loading --•••----
offline
Опыт: 2,062
Активность:
silumin, Насколько я знаю, то записи в set являются настройками, а значит правилом хорошего тона, чтобы использующий это заклинание мапмейкер, не утруждал себя поисками настроек по всему коду. А насчет ХТ я наб, и мне нужна помощь, у меня есть идейка насчет ХТ. Например что лучше то что я написал или
» это
set caster[temp]
set target[temp]
set dmg[temp]
//...
set avilible[temp] = false
call SaveInteger(asd, dsa, sda, temp)
и потом циклами преберать если авилибл, то заполнять ячейку и запускать действия, а потом очищять переменки и ставить avilible[temp] = yes.
Старый 18.10.2010, 21:38
silumin

offline
Опыт: 11,153
Активность:
Just Fear, это дело вкуса и опыта. Мне неописуемо проще работать с параллельными массивами, а посте того как начал получать индекс ячейки из хендла объекта, так вообще красотища.

Ну и как бы мы все тут пишем карты на чистом альтруизме, поэтому, имхо, правила хорошего тона здесь не уместны, как удобно/лучше - так и кодируй.
Старый 18.10.2010, 22:11
Ответ

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

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

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

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



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