RangerX
I am justice!
- Reaction score
- 69
hehehe just make it no hashtables )
If you're not to busy, could I make a request?
Spell Name
Mystic Dome
Code Preference: GUI
Spell Type: MUI
Description: A toggle-able unit spell that drains 5 mana per second while active. When active, it prevents enemy units from coming within a 400 range of the casting unit.
Other Remarks: If you could somehow make a dome/sphere-ish special effect appear while it's active, that would be great.
Oh, okay. But mind if I do it in vJASS? Would be easier.
New spell request
Charge
Warrior charges to a target stunning it for 2 seconds. Cannot be used in combat !
-EDIT
Hmmm, Found a done one... Testing it
-EDIT
I like it but can u edit it a little, make it 1 level and 700 distance only, stun is 2...
Edit which spell?
constant function Multi_Arrow_Spell_Id takes nothing returns integer
return 039;A001039;
endfunction
constant function Multi_Arrow_Dummy_Up takes nothing returns integer
return 039;h002039;
endfunction
constant function Multi_Arrow_Dummy_Down takes nothing returns integer
return 039;h000039;
endfunction
function Multi_Arrow_Damage_Amount takes integer lvl returns real
return (lvl * 100.) + 200.
endfunction
function Max_Range takes integer lvl returns real
return (lvl * 100.) + 300.
endfunction
function Max_Radius takes integer lvl returns real
return (lvl * 100.) + 100.
endfunction
//===========================================================================
//==============================Timer Functions==============================
//===========================================================================
function SetTimerData takes timer t, integer value returns nothing
set udg_si__MultiArrow_TU_Data[GetHandleId(t)-udg_ss__MultiArrow_TU_Offset] = value
endfunction
function GetTimerData takes timer t returns integer
return udg_si__MultiArrow_TU_Data[GetHandleId(t)-udg_ss__MultiArrow_TU_Offset]
endfunction
function NewTimer takes nothing returns timer
set udg_si__MultiArrow_TU_F = udg_si__MultiArrow_TU_F - 1
return udg_si__MultiArrow_TU_V[udg_si__MultiArrow_TU_F]
endfunction
function ReleaseTimer takes timer t returns nothing
call PauseTimer(t)
set udg_si__MultiArrow_TU_V[udg_si__MultiArrow_TU_F] = t
set udg_si__MultiArrow_TU_F = udg_si__MultiArrow_TU_F + 1
endfunction
function NewIndex takes nothing returns integer
if udg_si__MultiArrow_Index_F == 0 then
set udg_si__MultiArrow_Index_I = udg_si__MultiArrow_Index_I + 1
set udg_s__MultiArrow_Data_bundle[udg_si__MultiArrow_Index_I] = CreateGroup()
return udg_si__MultiArrow_Index_I
endif
set udg_si__MultiArrow_Index_F = udg_si__MultiArrow_Index_F - 1
return udg_si__MultiArrow_Index_V[udg_si__MultiArrow_Index_F]
endfunction
function RecycleIndex takes integer i returns nothing
set udg_s__MultiArrow_Data_height<i> = 0
set udg_s__MultiArrow_Data_direction<i> = true
set udg_s__MultiArrow_Data_number<i> = 0
set udg_si__MultiArrow_Index_V[udg_si__MultiArrow_Index_F] = i
set udg_si__MultiArrow_Index_F = udg_si__MultiArrow_Index_F + 1
//no safety bounds
endfunction
//===========================================================================
//==============================Spell Code===================================
//===========================================================================
function Trig_Multi_Arrow_Conditions takes nothing returns boolean
return GetSpellAbilityId() == Multi_Arrow_Spell_Id()
endfunction
function Multi_Arrow_Damage takes nothing returns boolean
local unit u = GetFilterUnit()
local integer i = udg_ss_MultiArrow_Data_this
if IsUnitEnemy(u, GetOwningPlayer(udg_s__MultiArrow_Data_hero<i>)) and not IsUnitType(u, UNIT_TYPE_STRUCTURE) then
call UnitDamageTarget(udg_s__MultiArrow_Data_hero<i>,u,Multi_Arrow_Damage_Amount(GetUnitAbilityLevel(udg_s__MultiArrow_Data_hero<i>, Multi_Arrow_Spell_Id())),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
endif
set u = null
return false
endfunction
function Multi_Arrow_Delayed_Height takes nothing returns nothing
local integer i = udg_ss_MultiArrow_Data_this
local unit u = GetEnumUnit()
local real x = GetUnitX(u) + udg_s__MultiArrow_Data_dist<i> * Cos(udg_s__MultiArrow_Data_facing<i>)
local real y = GetUnitY(u) + udg_s__MultiArrow_Data_dist<i> * Sin(udg_s__MultiArrow_Data_facing<i>)
call RemoveUnit(u)
set u = CreateUnit(GetOwningPlayer(udg_s__MultiArrow_Data_hero<i>), Multi_Arrow_Dummy_Down(), x, y, 270.)
call UnitAddAbility(u, 039;Amrf039;)
call UnitRemoveAbility(u, 039;Amrf039;)
call SetUnitFlyHeight(u, GetUnitFlyHeight(u) - GetRandomReal(100., 1000.), 9999.)
call GroupAddUnit(udg_s__MultiArrow_Data_bundle<i>, u)
set u = null
endfunction
function Multi_Arrow_IHeight takes nothing returns nothing
local unit u = GetEnumUnit()
call SetUnitFlyHeight(u, GetUnitFlyHeight(u) + udg_ss__MultiArrow_Data_increase, 9999.)
if GetUnitFlyHeight(u) <= 400. and udg_ss__MultiArrow_Data_increase == -100 then
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\Devour\\DevourEffectArt.mdl",GetUnitX(u), GetUnitY(u) ))
endif
set u = null
endfunction
function Multi_Arrow_Remove_Arrow takes nothing returns nothing
call RemoveUnit(GetEnumUnit())
endfunction
function Multi_Arrow_Height takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetTimerData(t)
if udg_s__MultiArrow_Data_direction<i> then
set udg_ss__MultiArrow_Data_increase = 100.
set udg_s__MultiArrow_Data_height<i> = udg_s__MultiArrow_Data_height<i> + 100.
else
set udg_ss__MultiArrow_Data_increase = -100.
set udg_s__MultiArrow_Data_height<i> = udg_s__MultiArrow_Data_height<i> - 100.
endif
call ForGroup(udg_s__MultiArrow_Data_bundle<i>, function Multi_Arrow_IHeight)
if udg_s__MultiArrow_Data_height<i> >= 2000. then
set udg_s__MultiArrow_Data_direction<i> = false
set udg_ss_MultiArrow_Data_this = i
call ForGroup(udg_s__MultiArrow_Data_bundle<i>, function Multi_Arrow_Delayed_Height)
elseif udg_s__MultiArrow_Data_height<i> <= 1000. and udg_s__MultiArrow_Data_direction<i> == false then
set udg_ss_MultiArrow_Data_this = i
call GroupEnumUnitsInRange(udg_ss__MultiArrow_Data_tempg, udg_s__MultiArrow_Data_x<i>+ udg_s__MultiArrow_Data_dist<i> * Cos(udg_s__MultiArrow_Data_facing<i>), udg_s__MultiArrow_Data_y<i>+ udg_s__MultiArrow_Data_dist<i> * Sin(udg_s__MultiArrow_Data_facing<i>), Max_Radius(GetUnitAbilityLevel(udg_s__MultiArrow_Data_hero<i>, Multi_Arrow_Spell_Id())), Filter(function Multi_Arrow_Damage))
call ForGroup(udg_s__MultiArrow_Data_bundle<i>, function Multi_Arrow_Remove_Arrow)
call GroupClear(udg_s__MultiArrow_Data_bundle<i>)
call ReleaseTimer(t)
call RecycleIndex(i)
endif
endfunction
function Fade takes nothing returns nothing
local integer i = 0
loop
exitwhen i == udg_si__MultiArrow_Fade_I
call SetUnitVertexColor(udg_s__MultiArrow_Fade_unit<i>, 255, 255, 255, 55 + (udg_s__MultiArrow_Fade_period<i>*60))
set udg_s__MultiArrow_Fade_period<i> = udg_s__MultiArrow_Fade_period<i> + 1
if udg_s__MultiArrow_Fade_period<i> == 10 then
set udg_s__MultiArrow_Fade_period<i> = udg_s__MultiArrow_Fade_period[udg_si__MultiArrow_Fade_I]
set udg_s__MultiArrow_Fade_unit<i> = udg_s__MultiArrow_Fade_unit[udg_si__MultiArrow_Fade_I]
set udg_si__MultiArrow_Fade_I = udg_si__MultiArrow_Fade_I - 1
set i = i - 1
if udg_si__MultiArrow_Fade_I == 0 then
call PauseTimer(GetExpiredTimer())
endif
endif
set i = i + 1
endloop
endfunction
function FadeCreateUnit takes integer i, real x, real y returns unit
local unit u = CreateUnit(GetOwningPlayer(udg_s__MultiArrow_Data_hero<i>), Multi_Arrow_Dummy_Up(), x, y, 270.)
set udg_s__MultiArrow_Fade_unit[udg_si__MultiArrow_Fade_I] = u
set udg_si__MultiArrow_Fade_I = udg_si__MultiArrow_Fade_I + 1
call SetUnitVertexColor(u, 255, 255, 255, 55)
set udg_s__MultiArrow_Fade_period[udg_si__MultiArrow_Fade_I] = 0
if udg_si__MultiArrow_Fade_I == 1 then
call TimerStart(udg_si__MultiArrow_Fade_Timer, 0.05, true, function Fade)
endif
call UnitAddAbility(u, 039;Amrf039;)
call UnitRemoveAbility(u, 039;Amrf039;)
return u
endfunction
function Multi_Arrow_Expire takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetTimerData(t)
local real rr = GetRandomReal(udg_s__MultiArrow_Data_number<i>*-15.,udg_s__MultiArrow_Data_number<i>*15.)
local real rrt = GetRandomReal(50., 100.)
local real tx
local real ty
if (udg_s__MultiArrow_Data_number<i>/2)*2 == udg_s__MultiArrow_Data_number<i> then
set tx = (udg_s__MultiArrow_Data_x<i> + rrt*Cos(udg_s__MultiArrow_Data_facing<i>)) + (rr)* Cos((GetUnitFacing(udg_s__MultiArrow_Data_hero<i>)-90)*bj_DEGTORAD)
set ty = (udg_s__MultiArrow_Data_y<i> + rrt*Sin(udg_s__MultiArrow_Data_facing<i>)) + (rr)* Sin((GetUnitFacing(udg_s__MultiArrow_Data_hero<i>)-90)*bj_DEGTORAD)
else
set tx = udg_s__MultiArrow_Data_x<i> + (rr)* Cos((GetUnitFacing(udg_s__MultiArrow_Data_hero<i>)+90)*bj_DEGTORAD)
set ty = udg_s__MultiArrow_Data_y<i> + (rr)* Sin((GetUnitFacing(udg_s__MultiArrow_Data_hero<i>)+90)*bj_DEGTORAD)
endif
call GroupAddUnit(udg_s__MultiArrow_Data_bundle<i>, FadeCreateUnit(i, tx, ty) )
set udg_s__MultiArrow_Data_number<i> = udg_s__MultiArrow_Data_number<i> + 1
if udg_s__MultiArrow_Data_number<i> == 30 then
call PauseTimer(t)
call TimerStart(t, 0.03, true, function Multi_Arrow_Height)
endif
endfunction
function Trig_Multi_Arrow_Actions takes nothing returns nothing
local timer t = NewTimer()
local integer i = NewIndex()
local location l = GetSpellTargetLoc()
local real dx = GetLocationX(l)- GetUnitX(GetTriggerUnit())
local real dy = GetLocationY(l)- GetUnitY(GetTriggerUnit())
call RemoveLocation(l)
set udg_s__MultiArrow_Data_hero<i> = GetTriggerUnit()
set udg_s__MultiArrow_Data_facing<i> = GetUnitFacing(udg_s__MultiArrow_Data_hero<i>)*bj_DEGTORAD
set udg_s__MultiArrow_Data_x<i> = GetUnitX(udg_s__MultiArrow_Data_hero<i>)
set udg_s__MultiArrow_Data_y<i> = GetUnitY(udg_s__MultiArrow_Data_hero<i>)
set udg_s__MultiArrow_Data_dist<i> = RMinBJ(Max_Range(GetUnitAbilityLevel(udg_s__MultiArrow_Data_hero<i>, Multi_Arrow_Spell_Id())), SquareRoot(dx * dx + dy * dy)) - 100.
call SetTimerData(t, i)
call TimerStart(t, 0.03, true, function Multi_Arrow_Expire)
endfunction
//===========================================================================
function InitTrig_Multi_Arrow takes nothing returns nothing
local integer i = 0
set gg_trg_Multi_Arrow = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Multi_Arrow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Multi_Arrow, Condition( function Trig_Multi_Arrow_Conditions ) )
call TriggerAddAction( gg_trg_Multi_Arrow, function Trig_Multi_Arrow_Actions )
set udg_si__MultiArrow_TU_V[0] = CreateTimer()
set udg_ss__MultiArrow_TU_Offset = GetHandleId(udg_si__MultiArrow_TU_V[0])
loop
set i = i + 1
exitwhen i == 150
set udg_si__MultiArrow_TU_V<i> = CreateTimer()
endloop
call DestroyGroup(udg_s__MultiArrow_Data_bundle[0])
set udg_si__MultiArrow_TU_F = 150
endfunction</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>
can i do multi arrow? its a challenge for me to make it MUI without hashtables in vanilla jass. : D