• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[JASS] Parabola function using GUI

Status
Not open for further replies.
Level 5
Joined
Sep 16, 2008
Messages
47
Grenade Init
JASS:
function Trig_Grenade_Init_Actions takes nothing returns nothing
    call InitHashtableBJ(  )
    set udg_Grenade_Table = GetLastCreatedHashtableBJ()
endfunction

//===========================================================================
function InitTrig_Grenade_Init takes nothing returns nothing
    set gg_trg_Grenade_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Grenade_Init, function Trig_Grenade_Init_Actions )
endfunction
Grenade Cast
JASS:
function Trig_Grenade_Cast_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A002' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Grenade_Cast_Actions takes nothing returns nothing
    // ============================================
    // ----------------------------------------------------------------------------------
    // Caster
    // ----------------------------------------------------------------------------------------
    // ============================================
    set udg_Grenade_Caster = GetTriggerUnit()
    set udg_Grenade_CasterPosition = GetUnitLoc(udg_Grenade_Caster)
    // ============================================
    // ----------------------------------------------------------------------------------
    // Ability
    // ----------------------------------------------------------------------------------------
    // ============================================
    set udg_Grenade_Ability = 'A002'
    set udg_Grenade_AbilityLevel = GetUnitAbilityLevelSwapped(udg_Grenade_Ability, udg_Grenade_Caster)
    set udg_Grenade_SpellPoint = GetSpellTargetLoc()
    // ============================================
    // ----------------------------------------------------------------------------------
    // Throw
    // ----------------------------------------------------------------------------------------
    // ============================================
    set udg_Grenade_Distance = DistanceBetweenPoints(udg_Grenade_CasterPosition, udg_Grenade_SpellPoint)
    set udg_Grenade_Angle = AngleBetweenPoints(udg_Grenade_CasterPosition, udg_Grenade_SpellPoint)
    set udg_Grenade_CurrentDistance = 0.00
    set udg_Grenade_MaxHeight = 500.00
    set udg_Grenade_Speed = 4.00
    // ============================================
    // ----------------------------------------------------------------------------------
    // Dummy
    // ----------------------------------------------------------------------------------------
    // ============================================
    set udg_Grenade_DummyModel = "Abilities\\Spells\\Other\\AcidBomb\\BottleMissile.mdl"
    set udg_Grenade_CreateDistance = 50.00
    set udg_Grenade_CreatePoint = PolarProjectionBJ(udg_Grenade_CasterPosition, udg_Grenade_CreateDistance, udg_Grenade_Angle)
    // ============================================
    // ----------------------------------------------------------------------------------
    // Damage
    // ----------------------------------------------------------------------------------------
    // ============================================
    set udg_Grenade_Damage = ( 100 * udg_Grenade_AbilityLevel )
    set udg_Grenade_DamageRange = 300.00
    // ============================================
    // ----------------------------------------------------------------------------------
    // Hashtables
    // ----------------------------------------------------------------------------------------
    // ============================================
    // Reals
    // ----------------------------------------------------------------------------------------
    call SaveRealBJ( udg_Grenade_Angle, 0, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    call SaveRealBJ( udg_Grenade_DamageRange, 1, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    call SaveRealBJ( udg_Grenade_Distance, 2, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    call SaveRealBJ( udg_Grenade_MaxHeight, 3, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    call SaveRealBJ( udg_Grenade_Speed, 4, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    call SaveRealBJ( udg_Grenade_CurrentDistance, 6, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    // ----------------------------------------------------------------------------------------
    // Integers
    // ----------------------------------------------------------------------------------------
    call SaveIntegerBJ( udg_Grenade_Damage, 5, GetHandleIdBJ(GetTriggerUnit()), udg_Grenade_Table )
    // ----------------------------------------------------------------------------------------
    // Strings
    // ----------------------------------------------------------------------------------------
    // ============================================
    // ----------------------------------------------------------------------------------
    // Actions
    // ----------------------------------------------------------------------------------------
    // ============================================
    call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(udg_Grenade_Caster), udg_Grenade_CreatePoint, udg_Grenade_Angle )
    set udg_Grenade_Dummy = GetLastCreatedUnit()
    call AddSpecialEffectTargetUnitBJ( "chest", udg_Grenade_Dummy, udg_Grenade_DummyModel )
    call GroupAddUnitSimple( udg_Grenade_Caster, udg_Grenade_SpellGroup )
endfunction

//===========================================================================
function InitTrig_Grenade_Cast takes nothing returns nothing
    set gg_trg_Grenade_Cast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Grenade_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Grenade_Cast, Condition( function Trig_Grenade_Cast_Conditions ) )
    call TriggerAddAction( gg_trg_Grenade_Cast, function Trig_Grenade_Cast_Actions )
endfunction
Grenade Loop
JASS:
function Trig_Grenade_Loop_Func001Func010Func005Func002C takes nothing returns boolean
    if ( not ( IsUnitEnemy(udg_Grenade_Damaged, GetOwningPlayer(udg_Grenade_Caster)) == false ) ) then
        return false
    endif
    if ( not ( IsUnitType(udg_Grenade_Damaged, UNIT_TYPE_MAGIC_IMMUNE) == false ) ) then
        return false
    endif
    if ( not ( IsUnitType(udg_Grenade_Damaged, UNIT_TYPE_FLYING) == false ) ) then
        return false
    endif
    return true
endfunction

function Trig_Grenade_Loop_Func001Func010Func005A takes nothing returns nothing
    set udg_Grenade_Damaged = GetEnumUnit()
    if ( Trig_Grenade_Loop_Func001Func010Func005Func002C() ) then
        call UnitDamageTargetBJ( udg_Grenade_Caster, udg_Grenade_Damaged, I2R(udg_Grenade_Damage), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    else
    endif
endfunction

function Trig_Grenade_Loop_Func001Func010C takes nothing returns boolean
    if ( not ( udg_Grenade_CurrentDistance < udg_Grenade_Distance ) ) then
        return false
    endif
    return true
endfunction

function Trig_Grenade_Loop_Func001A takes nothing returns nothing
    set udg_Grenade_Dummies = GetEnumUnit()
    set udg_Grenade_Casters = GetEnumUnit()
    set udg_Grenade_Angle = LoadRealBJ(0, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_DamageRange = LoadRealBJ(1, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_Distance = LoadRealBJ(2, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_MaxHeight = LoadRealBJ(3, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_Speed = LoadRealBJ(4, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_Damage = LoadIntegerBJ(5, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    set udg_Grenade_CurrentDistance = LoadRealBJ(6, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table)
    if ( Trig_Grenade_Loop_Func001Func010C() ) then
        call DisplayTimedTextToForce( GetPlayersAll(), 0.01, "TRIGSTR_619" )
        set udg_Grenade_DummyPosition = GetUnitLoc(udg_Grenade_Dummy)
        set udg_Grenade_MovePoint = PolarProjectionBJ(udg_Grenade_DummyPosition, udg_Grenade_Speed, udg_Grenade_Angle)
        call SetUnitPositionLoc( udg_Grenade_Dummy, udg_Grenade_MovePoint )
        call SaveRealBJ( ( udg_Grenade_CurrentDistance + udg_Grenade_Speed ), 6, GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table )
        set udg_Grenade_Real[1] = udg_Grenade_MaxHeight
        set udg_Grenade_Real[2] = udg_Grenade_Distance
        set udg_Grenade_Real[3] = udg_Grenade_CurrentDistance
        set udg_Grenade_Real[4] = ( 4 * udg_Grenade_Real[1] / udg_Grenade_Real[2]) * ( udg_Grenade_Real[2] - udg_Grenade_Real[3]) * ( udg_Grenade_Real[3] / udg_Grenade_Real[2] )
        call SetUnitFlyHeightBJ( udg_Grenade_Dummies, udg_Grenade_Real[4], 0.00 )
        call RemoveLocation(udg_Grenade_DummiesPosition)
        call RemoveLocation(udg_Grenade_MovePoint)
    else
        set udg_Grenade_DummiesPosition = GetUnitLoc(udg_Grenade_Dummies)
        set udg_Grenade_DamageGroup = GetUnitsInRangeOfLocAll(udg_Grenade_DamageRange, udg_Grenade_DummiesPosition)
        call ForGroupBJ( udg_Grenade_DamageGroup, function Trig_Grenade_Loop_Func001Func010Func005A )
        call RemoveLocation(udg_Grenade_DummiesPosition)
        call GroupRemoveUnitSimple( udg_Grenade_Dummy, udg_Grenade_SpellGroup )
        call RemoveUnit( udg_Grenade_Dummy )
        call FlushChildHashtableBJ( GetHandleIdBJ(GetEnumUnit()), udg_Grenade_Table )
    endif
endfunction

function Trig_Grenade_Loop_Actions takes nothing returns nothing
    call ForGroupBJ( udg_Grenade_SpellGroup, function Trig_Grenade_Loop_Func001A )
endfunction

//===========================================================================
function InitTrig_Grenade_Loop takes nothing returns nothing
    set gg_trg_Grenade_Loop = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Grenade_Loop, 0.01 )
    call TriggerAddAction( gg_trg_Grenade_Loop, function Trig_Grenade_Loop_Actions )
endfunction

My question is:
Why parabola don;t work?
How to fix this spell?
 
Level 11
Joined
May 31, 2008
Messages
698
To make the parabola thing all you have to do is use physics,
y = y0 + v0*t - (1/2)980t^2

y will be the height, so in the trigger it would be what your setting the flying height to.

y0 is initial height, so you could make it 0 if you wanna throw the grenade from the ground, or set it to like 150 to make it look like its being thrown from the units hand.

v0 is initial upward velocity, this can be anything you want it to be depending on how high you want the grenade to go.

t is the time, you can just set a global variable to keep track of the time.

and the 980 is due to gravity, on earth it is 9.8 but i think it is supposed to be 980 in world editor, i made a similar throwing kind of spell like your trying to make a while ago.

idk if this will help you figure it out, i could probly make the trigger for you in jass or gui if you want though
 
Status
Not open for further replies.
Top