[Spell Request] GUI and MUI Upgradeable Toss

junz13

New Member
Reaction score
1
Im in need of a GUI and MUI Upgradeable Toss. (The Toss in DotA where you grab a random nearby unit and toss it at another unit)

By Upgradeable I mean you can increase its damage,range and reduce it's cooldown, through tomes and etc.

I need its damage to depend on your heroes STR. Toss damage is 20*each point of STR.
 

eXirrah

New Member
Reaction score
51
Off Topic: Nice avatar Sooda is it connected to your currente reputation status: "Sooda is a sight to see"? :)

On Topic: Try to create the spell and if you can't do it we can help you. I don't have the nerve to create the whole spell man.
 

junz13

New Member
Reaction score
1
Okay then... well can anyone at least teach me how to edit the JASS Toss trigger to fulfill the role of the toss i requested? here is the code....
Code:
function Trig_Toss_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A004'        
endfunction

function Toss_Unit_Group takes nothing returns boolean 
 if ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_ANCIENT) == true ) then  
 return false 
 endif 
 if IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) then 
 return false 
 elseif IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) then 
 return false 
 elseif GetFilterUnit() == GetSpellAbilityUnit() then 
 return false 
 elseif IsUnitDeadBJ(GetFilterUnit()) then 
 return false 
 endif 
return true
endfunction

function Toss_Destroy_Trees takes nothing returns nothing
    call KillDestructable( GetEnumDestructable() )
endfunction

function TossFX takes nothing returns nothing
local effect f= bj_lastCreatedEffect
call TriggerSleepAction(0.4)
call DestroyEffect(f)
set f=null
endfunction

function Toss_Movement takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=GetHandleUnit(t,"t")
local real b=GetHandleReal(t,"r")
local real n=GetHandleReal(t,"n")
local real d=GetHandleReal(t,"d")
local location l=GetHandleLocation(t,"l")
local real x=-d+(d*(b/50))
local location m=PolarProjectionBJ(l,x,n)
local real y=((b-25)*(b-25))
call SetUnitPositionLoc(u,m)
call SetUnitFlyHeight( u, ( 775-y ) , 10000.00 )
if GetRandomInt(1,4)==2 then
call AddSpecialEffectTargetUnitBJ( "origin", u, "Abilities\\Spells\\Undead\\Cripple\\CrippleTarget.mdl" )
call TriggerExecute(gg_trg_DestroyFX)
endif
set b=b+1
call SetHandleReal(t,"r",b)
set t=null
set u=null
set b=0
set n=0
set d=0
set l=null
set x=0
call RemoveLocation(m)
set m=null
set y=0
endfunction

function Trig_Toss_Actions takes nothing returns nothing
local group g=CreateGroup()
local unit c=GetTriggerUnit()
local unit a=null
local location l=GetSpellTargetLoc()
local timer t=null
local real b=1
local real d=0
local real n=0
call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),275,Condition(function Toss_Unit_Group))
set a=GroupPickRandomUnit(g)
call GroupClear(g)
if a!=null then    
    call SetUnitAnimationByIndex(c,4)
    call PauseUnitBJ( true, a )
    call SetUnitPathing( a, false )
    call SetUnitFacingToFaceLocTimed( a, l, 0 )
    call UnitAddAbilityBJ( 'A002', a )
    call UnitRemoveAbilityBJ( 'A002', a )    
    set t=CreateTimer()
    call SetHandleHandle(t,"t",a)
    call SetHandleReal(t,"r",b)    
    set d = DistanceBetweenPoints(GetUnitLoc(c), l)
    set n= AngleBetweenPoints(GetUnitLoc(c), l)
    call SetHandleReal(t,"d",d)
    call SetHandleReal(t,"n",n)
    call SetHandleHandle(t,"l",l)   
    call TimerStart(t,0.02,true,function Toss_Movement)
    call TriggerSleepAction(1.0)
    call RemoveLocation(l)
    set l=GetHandleLocation(t,"l")
    call RemoveLocation(l)
    call FlushHandleLocals(t)
    call PauseTimer(t)
    call DestroyTimer(t)
    call SetUnitFlyHeightBJ( a, GetUnitDefaultFlyHeight(a), 10000.00 )
    call PauseUnitBJ( false, a )
    call SetUnitPathing( a, true )    
    set l=GetUnitLoc(a)
    call DestroyEffect(AddSpellEffectByIdLoc('A0BZ', EFFECT_TYPE_TARGET, l))
    call TerrainDeformationRippleBJ( 0.2, true, l, 1.00, 300.00, 96.00, 1, 64.00 )
    call UnitDamageTargetBJ( c, a, 38.00 * I2R(GetUnitAbilityLevelSwapped('A004', c)) , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_DEMOLITION )
    set g = GetUnitsInRangeOfLocAll(300.00, l)
    loop
        set a = FirstOfGroup(g)
        exitwhen a == null
        call GroupRemoveUnit(g,a)
        call UnitDamageTargetBJ( c, a, 75.00 * I2R(GetUnitAbilityLevelSwapped('A004', c)) , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_DEMOLITION )     
    endloop
    call EnumDestructablesInCircleBJ( 300,l , function Toss_Destroy_Trees )
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",GetLocationX(l),GetLocationY(l)))
endif
call DestroyGroup(g)
set g=null
set c=null
set a=null
call RemoveLocation(l)
set l=null
set t=null
set b=0
set n=0
set d=0
endfunction

//===========================================================================
function InitTrig_Toss takes nothing returns nothing
    set gg_trg_Toss = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Toss, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Toss, Condition( function Trig_Toss_Conditions ) )
    call TriggerAddAction( gg_trg_Toss, function Trig_Toss_Actions )
endfunction

this was emjlr3's Toss Trigger in an old DotA Spellpack... I will surely +rep anyone who helps me... :D
 

Sooda

Diversity enchants
Reaction score
318
Projectile takes 20% Toss damage and enemies get bonus damage from hero str (+20 per str point). It uses DotA Toss damage formula, each level deals +75 damage more (level 1 does 75 damage plus str bonus).

Make sure to change ability id with your made, find function 'Trig_Toss_Actions' and change ability id 'A004' to correct id.
JASS:
local real dmg = (GetUnitAbilityLevel(c,'A004')* 75.) + (GetHeroStr(c, true) * 20.)
You need to change ability id in function 'Trig_Toss_Conditions' too.

Toss distance and cooldown are controlled by actual ability on hero (You need to change fields in Object Editor, Ability Tab, Toss ability).

Create new trigger, convert it to custom text (From upper dropdown menu), change trigger name to 'Toss' (without '') and copy paste whole JASS in it. Make sure your map has correct handle variables system in your mapheader (click on your map name in Trigger Editor to access mapheader.) and follow emjlr3 implementation instructions.
JASS:
function Trig_Toss_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A004'        
endfunction

function Toss_Unit_Group takes nothing returns boolean 
 if ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_ANCIENT) == true ) then  
 return false 
 endif 
 if IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) then 
 return false 
 elseif IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) then 
 return false 
 elseif GetFilterUnit() == GetSpellAbilityUnit() then 
 return false 
 elseif IsUnitDeadBJ(GetFilterUnit()) then 
 return false 
 endif 
return true
endfunction

function Toss_Destroy_Trees takes nothing returns nothing
    call KillDestructable( GetEnumDestructable() )
endfunction

function TossFX takes nothing returns nothing
local effect f= bj_lastCreatedEffect
call TriggerSleepAction(0.4)
call DestroyEffect(f)
set f=null
endfunction

function Toss_Movement takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=GetHandleUnit(t,"t")
local real b=GetHandleReal(t,"r")
local real n=GetHandleReal(t,"n")
local real d=GetHandleReal(t,"d")
local location l=GetHandleLocation(t,"l")
local real x=-d+(d*(b/50))
local location m=PolarProjectionBJ(l,x,n)
local real y=((b-25)*(b-25))
call SetUnitPositionLoc(u,m)
call SetUnitFlyHeight( u, ( 775-y ) , 10000.00 )
if GetRandomInt(1,4)==2 then
call AddSpecialEffectTargetUnitBJ( "origin", u, "Abilities\\Spells\\Undead\\Cripple\\CrippleTarget.mdl" )
call TriggerExecute(gg_trg_DestroyFX)
endif
set b=b+1
call SetHandleReal(t,"r",b)
set t=null
set u=null
set b=0
set n=0
set d=0
set l=null
set x=0
call RemoveLocation(m)
set m=null
set y=0
endfunction

function Trig_Toss_Actions takes nothing returns nothing
local group g=CreateGroup()
local unit c=GetTriggerUnit()
local unit a=null
local location l=GetSpellTargetLoc()
local timer t=null
local real b=1
local real d=0
local real n=0
local real dmg = (GetUnitAbilityLevel(c,'A004')* 75.) + (GetHeroStr(c, true) * 20.)
call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),275,Condition(function Toss_Unit_Group))
set a=GroupPickRandomUnit(g)
call GroupClear(g)
if a!=null then    
    call SetUnitAnimationByIndex(c,4)
    call PauseUnitBJ( true, a )
    call SetUnitPathing( a, false )
    call SetUnitFacingToFaceLocTimed( a, l, 0 )
    call UnitAddAbilityBJ( 'A002', a )
    call UnitRemoveAbilityBJ( 'A002', a )    
    set t=CreateTimer()
    call SetHandleHandle(t,"t",a)
    call SetHandleReal(t,"r",b)    
    set d = DistanceBetweenPoints(GetUnitLoc(c), l)
    set n= AngleBetweenPoints(GetUnitLoc(c), l)
    call SetHandleReal(t,"d",d)
    call SetHandleReal(t,"n",n)
    call SetHandleHandle(t,"l",l)   
    call TimerStart(t,0.02,true,function Toss_Movement)
    call TriggerSleepAction(1.0)
    call RemoveLocation(l)
    set l=GetHandleLocation(t,"l")
    call RemoveLocation(l)
    call FlushHandleLocals(t)
    call PauseTimer(t)
    call DestroyTimer(t)
    call SetUnitFlyHeightBJ( a, GetUnitDefaultFlyHeight(a), 10000.00 )
    call PauseUnitBJ( false, a )
    call SetUnitPathing( a, true )    
    set l=GetUnitLoc(a)
    call DestroyEffect(AddSpellEffectByIdLoc('A0BZ', EFFECT_TYPE_TARGET, l))
    call TerrainDeformationRippleBJ( 0.2, true, l, 1.00, 300.00, 96.00, 1, 64.00 )
    call UnitDamageTargetBJ( c, a,dmg * .2 , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_DEMOLITION )
    set g = GetUnitsInRangeOfLocAll(300.00, l)
    loop
        set a = FirstOfGroup(g)
        exitwhen a == null
        call GroupRemoveUnit(g,a)
        call UnitDamageTargetBJ( c, a,dmg , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_DEMOLITION )     
    endloop
    call EnumDestructablesInCircleBJ( 300,l , function Toss_Destroy_Trees )
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",GetLocationX(l),GetLocationY(l)))
endif
call DestroyGroup(g)
set g=null
set c=null
set a=null
call RemoveLocation(l)
set l=null
set t=null
set b=0
set n=0
set d=0
endfunction

//===========================================================================
function InitTrig_Toss takes nothing returns nothing
    set gg_trg_Toss = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Toss, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Toss, Condition( function Trig_Toss_Conditions ) )
    call TriggerAddAction( gg_trg_Toss, function Trig_Toss_Actions )
endfunction


Off-topic: It's one of my old avatar, avatar gave nice feedback and I'm using it again after long time. I have always used ladies XD avatars. Picture change isn't connected with my reputation, I got reputation boost from someone (or many) which made it go over 700. After new year I had still below 700.
EDIT: My avatar and reputation comment goes pretty well together :p Nice find.
 

junz13

New Member
Reaction score
1
Thanx sooo much soooda!!! +REP i wish i could give you 10000 rep! :)) thanx so much!! ~~obviously im still a noob at this.
 

eXirrah

New Member
Reaction score
51
Off-topic: It's one of my old avatar, avatar gave nice feedback and I'm using it again after long time. I have always used ladies XD avatars. Picture change isn't connected with my reputation, I got reputation boost from someone (or many) which made it go over 700. After new year I had still below 700.
EDIT: My avatar and reputation comment goes pretty well together :p Nice find.

Off Topic: Well I was just curious :). Pretty cool coincidence
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top