| 07-31-2008, 10:35 AM | #1 |
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? 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: 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 |
The arguments of Cos and Sin should be in radians: 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 |
If you think bj_DEGTORAD is too hard to remember, you can always use Blizzard's own wrapper functions: CosBJ and SinBJ. 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 |
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. |
