HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

SUMMON NOT SPAWNING WHERE IT SHOULD

07-31-2008, 10:35 AM#1
fX_
This trigger summons a unit for the caster and makes him follow his orders.

The unit is SUPPOSED to be summoned 200 units towards the facing angle of the caster. For some reason, it ALWAYS spawns towards 0.00 degrees. Can anybody tell me why and how to fix this?

Collapse JASS:
//CONSTANTS START//
constant function RallyKorkronINT_AbilityIdCast takes nothing returns integer
    return 'A040'
endfunction

constant function RallyKorkronINT_AbilityIdBonusDmg takes nothing returns integer
    return 'A042'
endfunction

constant function RallyKorkronINT_AbilityIdBonusCombat takes nothing returns integer
    return 'A043'
endfunction

constant function RallyKorkronINT_UnitIdSummon takes nothing returns integer
    return 'o014'
endfunction

constant function RallyKorkronINT_AmountMaxSummon takes nothing returns integer
    return 6
endfunction

constant function RallyKorkronR_Range takes nothing returns real
    return 1000.00
endfunction

//CONSTANTS: Kor'kron Missive Start//
constant function RallyKorkronINT_AbilityIdFormationMarch takes nothing returns integer
    return 'A04G'
endfunction

constant function RallyKorkronINT_AbilityIdFreeMarch takes nothing returns integer
    return 'A04J'
endfunction

constant function RallyKorkronINT_AbilityIdFormationMarker takes nothing returns integer
    return 'A04K'
endfunction

constant function RallyKorkronINT_AbilityIdRegroup takes nothing returns integer
    return 'A04F'
endfunction

constant function RallyKorkronINT_AbilityIdSpread takes nothing returns integer
    return 'A04E'
endfunction

constant function RallyKorkronR_RangeShortDistance takes nothing returns real
    return 300.00
endfunction

constant function RallyKorkronR_RangeLongDistance takes nothing returns real
    return 600.00
endfunction

constant function RallyKorkronINT_AbilityIdOffensive takes nothing returns integer
    return 'A04I'
endfunction

constant function RallyKorkronINT_AbilityIdDefensive takes nothing returns integer
    return 'A04H'
endfunction

constant function RallyKorkronR_RangeShortAttack takes nothing returns real
    return 750.00
endfunction

constant function RallyKorkronR_RangeLongAttack takes nothing returns real
    return 2000.00
endfunction
//CONSTANTS: Kor'kron Missive End//
//CONSTANTS END//

function RallyKorkronBoolExpr1 takes nothing returns boolean
    return GetUnitAbilityLevel(GetTriggerUnit(),RallyKorkronINT_AbilityIdCast()) > 0
endfunction

function TRIG_RallyKorkronCast_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == RallyKorkronINT_AbilityIdCast()
endfunction

function RallyKorkronBoolExpr2 takes nothing returns boolean
    return (GetUnitTypeId(GetFilterUnit()) == RallyKorkronINT_UnitIdSummon()) and (GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE) > 0.00) and (GetOwningPlayer(GetFilterUnit()) == GetOwningPlayer(GetTriggerUnit()))
endfunction

//MOVMEMENT AND UPDATE START//
function RallyKorkronExecuteFunc1 takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local player P_OwnerCaster = GetOwningPlayer(U_Caster)
    local real R_LocXFallback = 0.00
    local real R_LocYFallback = 0.00
    local real R_LocXCaster = GetUnitX(U_Caster)
    local real R_LocYCaster = GetUnitY(U_Caster)
    local real R_Angle = GetUnitFacing(U_Caster)
    local real R_LocXTarget = R_LocXCaster + (200.00 * Cos(R_Angle))
    local real R_LocYTarget = R_LocYCaster + (200.00 * Sin(R_Angle))
    local real R_DistanceOffset
    local integer INT_LevelUnitCaster
    local integer INT_LevelFormationMarker
    local unit U_Summon
    local string STR_OrderSummon
    local sound SND_Birth
    if (GetRandomInt(1,2) == 1) then
        set SND_Birth = gg_snd_AbilityRallyKorkronSummon1
    else
        set SND_Birth = gg_snd_AbilityRallyKorkronSummon2
    endif
    set U_Summon = SpawnUnit(P_OwnerCaster,RallyKorkronINT_UnitIdSummon(),R_LocXCaster,R_LocYCaster,(R_Angle + 180.00),0,255,255,255,255,1.00,"victory",null,SND_Birth,1.00,"move",3,null,null,U_Caster)
    loop
        exitwhen (GetUnitState(U_Summon,UNIT_STATE_LIFE) <= 0)
        set R_LocXCaster = GetUnitX(U_Caster)
        set R_LocYCaster = GetUnitY(U_Caster)
        set INT_LevelUnitCaster = GetHeroLevel(U_Caster)
        call SetUnitAbilityLevel(U_Summon,RallyKorkronINT_AbilityIdBonusCombat(),INT_LevelUnitCaster)
        call SetUnitAbilityLevel(U_Summon,RallyKorkronINT_AbilityIdBonusDmg(),INT_LevelUnitCaster)
        if (GetUnitState(U_Caster,UNIT_STATE_LIFE) > 0) then
            set STR_OrderSummon = OrderId2String(GetUnitCurrentOrder(U_Summon))
            set R_LocXTarget = GetUnitX(U_Summon)           
            set R_LocYTarget = GetUnitY(U_Summon)
            set INT_LevelFormationMarker = GetUnitAbilityLevel(U_Summon,RallyKorkronINT_AbilityIdFormationMarker())
            if (INT_LevelFormationMarker > 0) then
                set R_Angle = (GetUnitFacing(U_Caster) - 90.00 ) + (INT_LevelFormationMarker * 3.00)
                set R_LocXTarget = R_LocXCaster + (RallyKorkronR_RangeShortDistance() * Cos(R_Angle))
                set R_LocYTarget = R_LocYCaster + (RallyKorkronR_RangeShortDistance() * Sin(R_Angle))
                set R_DistanceOffset = SquareRoot(Pow((GetUnitX(U_Summon) - R_LocXTarget),2) + Pow(GetUnitY(U_Summon) - R_LocYTarget,2))                
                if ((STR_OrderSummon == "move") or ((STR_OrderSummon == null) and (R_DistanceOffset > 0.00))) then                    
                    call IssuePointOrder(U_Summon,"move",R_LocXTarget,R_LocYTarget)
                endif
            else
                set R_DistanceOffset = SquareRoot(Pow((R_LocXCaster - R_LocXTarget),2) + Pow(R_LocYCaster - R_LocYTarget,2))
                if (R_DistanceOffset > RallyKorkronR_Range()) then
                    set R_Angle = GetRandomReal(0.00,360.00)
                    set R_DistanceOffset = GetRandomReal(RallyKorkronR_RangeShortDistance(),RallyKorkronR_Range())
                    set R_LocXTarget = R_LocXCaster + (R_DistanceOffset * Cos(R_Angle))
                    set R_LocYTarget = R_LocYCaster + (R_DistanceOffset * Sin(R_Angle))
                    call IssuePointOrder(U_Summon,"move",R_LocXTarget,R_LocYTarget)
                endif
            endif
        else
            set R_LocXTarget = R_LocXFallback
            set R_LocYTarget = R_LocYFallback
            call IssuePointOrder(U_Summon,"move",R_LocXTarget,R_LocYTarget)
        endif
        call TriggerSleepAction(1.00)
    endloop
    set U_Caster = null
    set P_OwnerCaster = null
    set U_Summon = null
    set STR_OrderSummon = "null"
endfunction
//MOVMEMENT AND UPDATE END//

function TRIG_RallyKorkronCast_Actions takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local player P_OwnerCaster = GetOwningPlayer(U_Caster)
    local unit U_Summon
    local group UG_Summon = CreateGroup()
    local integer INT_Count = 0
    call SetUnitAnimationByIndex(U_Caster,3)
    call GroupEnumUnitsOfPlayer(UG_Summon,P_OwnerCaster,Filter(function RallyKorkronBoolExpr2))
    set U_Summon = FirstOfGroup(UG_Summon)
    loop
        exitwhen (U_Summon == null)
        set INT_Count = INT_Count + 1
        call GroupRemoveUnit(UG_Summon,U_Summon)
        set U_Summon = FirstOfGroup(UG_Summon)
    endloop
    if (INT_Count < RallyKorkronINT_AmountMaxSummon()) then
        call ExecuteFunc("RallyKorkronExecuteFunc1")
    else
        call BJDebugMsg("NO, YOU CANNOT SUMMON MORE GUYS")
        call PauseUnit(U_Caster,TRUE)
        call IssueImmediateOrder(U_Caster,"stop")
        call PauseUnit(U_Caster,FALSE)
    endif
    set P_OwnerCaster = null
    set U_Caster = null
    set U_Summon = null
    call DestroyGroup(UG_Summon)
endfunction

//KOR'KRON MISSIVE START//
//FormationMarch/FreeMarch Start//
function TRIG_RallyKorkronFormationMarch_Conditions takes nothing returns boolean
    return (GetSpellAbilityId() == RallyKorkronINT_AbilityIdFormationMarch()) or (GetSpellAbilityId() == RallyKorkronINT_AbilityIdFreeMarch())
endfunction

function TRIG_RallyKorkronFormationMarch_Actions takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local player P_OwnerCaster = GetOwningPlayer(U_Caster)
    local real R_CountLoop = 0
    local real R_CountUnit = 0
    local unit U_Summon
    local group UG_Summon = CreateGroup()
    local integer INT_Order = GetSpellAbilityId()
    call GroupEnumUnitsOfPlayer(UG_Summon,P_OwnerCaster,Filter(function RallyKorkronBoolExpr2))
    set U_Summon = FirstOfGroup(UG_Summon)
    loop
        exitwhen (U_Summon == null)
        set R_CountLoop = R_CountLoop + 1.00
        if (INT_Order == RallyKorkronINT_AbilityIdFormationMarch()) then
            call UnitAddAbility(U_Summon,RallyKorkronINT_AbilityIdFormationMarker())
            call SetUnitAbilityLevel(U_Summon,RallyKorkronINT_AbilityIdFormationMarker(),R2I(R_CountLoop))
        else
            call UnitRemoveAbility(U_Summon,RallyKorkronINT_AbilityIdFormationMarker())
        endif
        call GroupRemoveUnit(UG_Summon,U_Summon)
        set U_Summon = FirstOfGroup(UG_Summon)
    endloop
    set U_Caster = null
    set P_OwnerCaster = null
    set U_Summon = null
    call DestroyGroup(UG_Summon)
endfunction
//FormationMarch/FreeMarch End//

//Regroup/Spread Start//
function TRIG_RallyKorkronRegroup_Conditions takes nothing returns boolean
    return (GetSpellAbilityId() == RallyKorkronINT_AbilityIdRegroup()) or (GetSpellAbilityId() == RallyKorkronINT_AbilityIdSpread())
endfunction

function TRIG_RallyKorkronRegroup_Actions takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local player P_OwnerCaster = GetOwningPlayer(U_Caster)
    local real R_CountLoop = 0
    local real R_CountUnit = 0
    local real R_LocXCaster = GetUnitX(U_Caster)
    local real R_LocYCaster = GetUnitY(U_Caster)
    local real R_LocXTarget
    local real R_LocYTarget
    local real R_Angle
    local unit U_Summon
    local group UG_Summon = CreateGroup()
    local real R_Distance
    if (GetSpellAbilityId() == RallyKorkronINT_AbilityIdSpread()) then
        set R_Distance = RallyKorkronR_RangeLongDistance()
    else
        set R_Distance = RallyKorkronR_RangeShortDistance()
    endif
    call GroupEnumUnitsOfPlayer(UG_Summon,P_OwnerCaster,Filter(function RallyKorkronBoolExpr2))
    set U_Summon = FirstOfGroup(UG_Summon)
    loop
        exitwhen (U_Summon == null)
        set R_CountUnit = R_CountUnit + 1.00
        call GroupRemoveUnit(UG_Summon,U_Summon)
        set U_Summon = FirstOfGroup(UG_Summon)
    endloop
    call GroupEnumUnitsOfPlayer(UG_Summon,P_OwnerCaster,Filter(function RallyKorkronBoolExpr2))
    set U_Summon = FirstOfGroup(UG_Summon)
    loop
        exitwhen (U_Summon == null)
        set R_Angle = 360.00/R_CountUnit * R_CountLoop
        set R_LocXTarget = R_LocXCaster + (R_Distance * Cos(R_Angle))
        set R_LocYTarget = R_LocYCaster + (R_Distance * Sin(R_Angle))
        call IssuePointOrder(U_Summon,"move",R_LocXTarget,R_LocYTarget)
        set R_CountLoop = R_CountLoop + 1.00
        call GroupRemoveUnit(UG_Summon,U_Summon)
        set U_Summon = FirstOfGroup(UG_Summon)
    endloop
    set U_Caster = null
    set P_OwnerCaster = null
    set U_Summon = null
    call DestroyGroup(UG_Summon)
endfunction
//Regroup/Spread End//

//Offensive/Defensive Start//
function TRIG_RallyKorkronOffensive_Conditions takes nothing returns boolean
    return (GetSpellAbilityId() == RallyKorkronINT_AbilityIdOffensive()) or (GetSpellAbilityId() == RallyKorkronINT_AbilityIdDefensive())
endfunction

function TRIG_RallyKorkronOffensive_Actions takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local player P_OwnerCaster = GetOwningPlayer(U_Caster)
    local real R_CountUnit = 0
    local unit U_Summon
    local group UG_Summon = CreateGroup()
    local real R_AcquisitionRange
    if (GetSpellAbilityId() == RallyKorkronINT_AbilityIdDefensive()) then
        set R_AcquisitionRange = RallyKorkronR_RangeShortAttack()
    else
        set R_AcquisitionRange = RallyKorkronR_RangeLongAttack()
    endif
    call GroupEnumUnitsOfPlayer(UG_Summon,P_OwnerCaster,Filter(function RallyKorkronBoolExpr2))
    set U_Summon = FirstOfGroup(UG_Summon)
    loop
        exitwhen (U_Summon == null)
        call SetUnitAcquireRange(U_Summon,R_AcquisitionRange)
        call GroupRemoveUnit(UG_Summon,U_Summon)
        set U_Summon = FirstOfGroup(UG_Summon)
    endloop
    set U_Caster = null
    set P_OwnerCaster = null
    set U_Summon = null
    call DestroyGroup(UG_Summon)
endfunction
//Offensive/Defensive End//
//KOR'KRON MISSIVE END//

function Trig_RallyKorkron_Actions takes nothing returns nothing
    local unit U_Caster = GetTriggerUnit()
    local trigger TRIG_RallyKorkronCast = CreateTrigger()
    local trigger TRIG_RallyKorkronFormationMarch = CreateTrigger()
    local trigger TRIG_RallyKorkronRegroup = CreateTrigger()
    local trigger TRIG_RallyKorkronOffensive = CreateTrigger()
    call TriggerRegisterUnitEvent(TRIG_RallyKorkronCast,U_Caster,EVENT_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(TRIG_RallyKorkronCast,Condition(function TRIG_RallyKorkronCast_Conditions))
    call TriggerAddAction(TRIG_RallyKorkronCast,function TRIG_RallyKorkronCast_Actions)
    call TriggerRegisterUnitEvent(TRIG_RallyKorkronFormationMarch,U_Caster,EVENT_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(TRIG_RallyKorkronFormationMarch,Condition(function TRIG_RallyKorkronFormationMarch_Conditions))
    call TriggerAddAction(TRIG_RallyKorkronFormationMarch,function TRIG_RallyKorkronFormationMarch_Actions)
    call TriggerRegisterUnitEvent(TRIG_RallyKorkronRegroup,U_Caster,EVENT_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(TRIG_RallyKorkronRegroup,Condition(function TRIG_RallyKorkronRegroup_Conditions))
    call TriggerAddAction(TRIG_RallyKorkronRegroup,function TRIG_RallyKorkronRegroup_Actions)
    call TriggerRegisterUnitEvent(TRIG_RallyKorkronOffensive,U_Caster,EVENT_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(TRIG_RallyKorkronOffensive,Condition(function TRIG_RallyKorkronOffensive_Conditions))
    call TriggerAddAction(TRIG_RallyKorkronOffensive,function TRIG_RallyKorkronOffensive_Actions)
    set U_Caster = null
endfunction

//==== Init Trigger RallyKorkron ====
function InitTrig_RallyKorkron takes nothing returns nothing
    set gg_trg_RallyKorkron = CreateTrigger()
    call TriggerRegisterEnterRectSimple(gg_trg_RallyKorkron,GetPlayableMapRect())
    call TriggerAddCondition(gg_trg_RallyKorkron,Condition(function RallyKorkronBoolExpr1))
    call TriggerAddAction(gg_trg_RallyKorkron,function Trig_RallyKorkron_Actions)
endfunction

Here is the SpawnUnit function if it'll help:
Collapse JASS:
//SPAWN UNIT START//
function SpawnUnit takes player owner,integer unitId,real locX,real locY,real facing,integer color,integer red,integer green,integer blue,integer alpha,real spawnTime,string animation,integer animationInt,sound soundBirth,real sleep,string order,integer orderType,real locXTarget,real locYTarget,unit unitTarget returns unit
    local unit U_Spawn = CreateUnit(owner,unitId,locX,locY,facing)
    local real R_CountLoop = 0
    local real R_SpawnTime = spawnTime
    local real R_Interval = R_SpawnTime/10
    local integer INT_RedIncrement = red/10
    local integer INT_GreenIncrement = green/10
    local integer INT_BlueIncrement = blue/10
    local integer INT_AlphaIncrement = alpha/10
    local integer INT_Red = 0
    local integer INT_Green = 0
    local integer INT_Blue = 0
    local integer INT_Alpha = 0
    local string STR_Animation = animation
    local integer INT_Animation = animationInt
    local sound SND_Birth = soundBirth
    local real R_DurationAnimation = sleep
    local string STR_Order = order
    local integer INT_OrderType = orderType
    local real R_LocXTarget = locXTarget
    local real R_LocYTarget = locYTarget
    local unit U_Target = unitTarget
    call PauseUnit(U_Spawn,TRUE)
    call SetUnitColor(U_Spawn,ConvertPlayerColor(color))
    call SetUnitVertexColor(U_Spawn,0,0,0,0)
    loop
        exitwhen (R_CountLoop >= R_SpawnTime)
        call TriggerSleepAction(R_Interval)
        set INT_Red = INT_Red + INT_RedIncrement
        set INT_Green = INT_Green + INT_GreenIncrement
        set INT_Blue = INT_Blue + INT_BlueIncrement
        set INT_Alpha = INT_Alpha + INT_AlphaIncrement
        call SetUnitVertexColor(U_Spawn,INT_Red,INT_Green,INT_Blue,INT_Alpha)
        set R_CountLoop = R_CountLoop + R_Interval
    endloop
    if (STR_Animation != null) then
        call SetUnitAnimation(U_Spawn,STR_Animation)
    else
        call SetUnitAnimationByIndex(U_Spawn,INT_Animation)
    endif
    call PlaySoundOnUnitBJ(SND_Birth,100.00,U_Spawn)
    call TriggerSleepAction(R_DurationAnimation)
    call SetUnitAnimation(U_Spawn,"stand")
    if (INT_OrderType == 1) then
        call IssueImmediateOrder(U_Spawn,STR_Order)
    elseif (INT_OrderType == 2) then
        call IssuePointOrder(U_Spawn,STR_Order,R_LocXTarget,R_LocYTarget)
    else
        call IssueTargetOrder(U_Spawn,STR_Order,U_Target)
    endif
    call PauseUnit(U_Spawn,FALSE)
    return U_Spawn
endfunction
//SPAWN UNIT END//
07-31-2008, 10:51 AM#2
Alexander244
The arguments of Cos and Sin should be in radians:
Collapse JASS:
    local real R_LocXTarget = R_LocXCaster + (200.00 * Cos(R_Angle*bj_DEGTORAD))
    local real R_LocYTarget = R_LocYCaster + (200.00 * Sin(R_Angle*bj_DEGTORAD))
07-31-2008, 10:57 AM#3
Themerion
If you think bj_DEGTORAD is too hard to remember, you can always use Blizzard's own wrapper functions: CosBJ and SinBJ.

Collapse JASS:
function CosBJ takes real angle returns real
    return Cos(angle*bj_DEGTORAD)
endfunction

function SinBJ takes real angle returns real
    return Sin(angle*bj_DEGTORAD)
endfunction
07-31-2008, 11:10 AM#4
fX_
LOL o right
forgot to add that in coz i copied the polar projection from another one that uses angle between points formula; i dont have degtorad/radtodeg in the latter coz they cancel each other out.