Sladkoegka
Забыл что хотел...
offline
Опыт:
7,437
Активность:
|
Пик юнитов в отряде и хэш-таблица
В общем начал изучать Хэш-Таблицы и перевел 2 своих триггеров с глобалками в 1 триггер с хэш таблицей.
Вот проблемный кусок кода:
» КОД
-------------------------------
function Trig_Collision_flight_Move_ForGroup
local unit u = GetFilterUnit()
local real xu = GetUnitX(u)
local real yu = GetUnitY(u)
local unit caster //-------------------вот ОНО
local real angle = Atan2(GetUnitY(caster) - yu, GetUnitX(caster) - xu)
if IsUnitEnemy(u, GetOwningPlayer(caster)) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and not IsUnitType(u, UNIT_TYPE_STRUCTURE) then
!!Всяческие действия с кастером и пикнутым юнитом!!
endif
set u = null
return false
endfunction
----------------------------
-----------------------------
function Trig_Collision_flight_Move_Actions
..................
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_hash,h,1)
call GroupEnumUnitsInRange(g,x,y,125, Filter(function Trig_Collision_flight_Move_ForGroup))
--------------------------
-----------------------------------
Trig_Collision_flight_Actions
local unit caster = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call SaveUnitHandle(udg_hash,h,1,caster)
call TimerStart(t,0.04,true,function Trig_Collision_flight_Move_Actions)
------------------------------
И я не знаю как достать юнита "caster" в функции function Trig_Collision_flight_Move_ForGroup .Он у меня записан на ID таймера,но ведь когда пикаются юниты вокруг кастера никакие таймеры не истекают...получается что пик юнита реагирует только на самого "выбранного юнита"...В общем я запутался, прошу помочь.
Добавлю на всякий случай свой угокод
» Не для слабонервных
function Trig_Collision_flight_Move_ForGroup takes nothing returns boolean
local unit u = GetFilterUnit()
local real xu = GetUnitX(u)
local real yu = GetUnitY(u)
local unit caster
local real angle = Atan2(GetUnitY(caster) - yu, GetUnitX(caster) - xu)
if IsUnitEnemy(u, GetOwningPlayer(caster)) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and not IsUnitType(u, UNIT_TYPE_STRUCTURE) then
call SetUnitPosition( u, xu - 10.00 * Cos(angle), yu - 10.00 * Sin(angle))
call UnitDamageTarget(caster, u, ( 10.00 * I2R(GetUnitAbilityLevel(caster, 'A004' )) ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call UnitDamageTarget(caster, caster, ( 2.00 * I2R(GetUnitAbilityLevel(caster, 'A004' )) ),true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call AddSpecialEffectTarget( "Objects\\Spawnmodels\\Human\\HumanBlood\\HumanBloodSorceress.mdl",u,"chest" )
endif
set u = null
return false
endfunction
function Trig_Collision_flight_Move_Actions takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_hash,h,1)
local real xC = GetUnitX(caster)
local real yC = GetUnitY(caster)
local real my_end_x = LoadReal(udg_hash,h,2)
local real my_end_y = LoadReal(udg_hash,h,3)
local real angle = Atan2(my_end_y - yC, my_end_x - xC)
local real x = xC + 25.00 * Cos( angle )
local real y = yC + 25.00 * Sin( angle )
local integer I = LoadInteger(udg_hash,h,4)
local group g = CreateGroup()
if I==5 then
call SetUnitFlyHeight( caster, 220.00, 375.00 )
call SetUnitPathing( caster, true )
endif
if I>0 then
call SetUnitPosition( caster, x,y )
call GroupEnumUnitsInRange(g,x,y,125, Filter(function Trig_Collision_flight_Move_ForGroup))
call SaveInteger(udg_hash,h,4,I-1)
else
call DestroyTimer(t)
call FlushChildHashtable(udg_hash,h)
endif
set caster = null
set t = null
call GroupClear(g)
call DestroyGroup(g)
set g = null
endfunction
function Trig_Collision_flight_Actions takes nothing returns nothing
local real distance
local unit caster = GetSpellAbilityUnit()
local location loc = GetUnitLoc(caster)
local real x = GetUnitX(caster)
local real y = GetUnitY(caster)
local real my_end_x
local real my_end_y
local integer I = GetUnitAbilityLevel(caster, 'A004')
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call SaveUnitHandle(udg_hash,h,1,caster)
set my_end_x = GetLocationX(GetSpellTargetLoc())
set my_end_y = GetLocationY(GetSpellTargetLoc())
set my_end_x = GetUnitX(GetSpellTargetUnit())
set my_end_y = GetUnitY(GetSpellTargetUnit())
call SaveReal(udg_hash,h,2,my_end_x)
call SaveReal(udg_hash,h,3,my_end_y)
set distance = SquareRoot((my_end_x - x) * (my_end_x - x) + (my_end_y - y) * (my_end_y - y))
call SetUnitFacing(caster, bj_RADTODEG * Atan2(my_end_y - y, my_end_x - x))
if distance >= 300.00 then
call SaveInteger(udg_hash,h,4,(R2I(distance/25)))
call TimerStart(t,0.04,true,function Trig_Collision_flight_Move_Actions)
call SetUnitFlyHeight(caster, 70.00, 750.00 )
call SetUnitFlyHeight(caster, 70.00, 750.00 )
call SetUnitPathing(caster, false )
else
call UnitRemoveAbility( caster ,'A004')
call UnitAddAbility( caster ,'A004' )
call SetUnitAbilityLevel( caster ,'A004',I )
call SetUnitState( caster,UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA) + 90.00 )
endif
set caster = null
set t = null
endfunction
function Trig_Collision_flight_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A004'
endfunction
//===========================================================================
function InitTrig_Collision_flight takes nothing returns nothing
set gg_trg_Collision_flight = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Collision_flight, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Collision_flight, Condition( function Trig_Collision_flight_Conditions ) )
call TriggerAddAction( gg_trg_Collision_flight, function Trig_Collision_flight_Actions )
endfunction
Отредактировано Sladkoegka, 25.06.2012 в 11:55.
|