Immolation
Member
- Reaction score
- 20
Hello, can I haz a Master_GetSummons function with this system? Pwetty pwease!
Notes:
If in any way you feel this system totally wrong, you are completly allowed to make it the next ub3rl33t system in the JASS world(I accept everything except cJass)
JASS:
library IndieSummon uses AIDS, KT
//**************************************************************************************************
//*
//* Independant Summons
//* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
//* This is a crappy AIDS/KT2 port of IndieSummon written by Jesus4Lyf. It is based strongly on
//* the previous system code. It is designed to work without leaking. There is one flaw which exists
//* also in the original - you should not stop the AI and then immediately start it again. Instead,
//* just call start without stopping it first. <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile :)" loading="lazy" data-shortname=":)" />
//*
//**************************************************************************************************
//==================================================================================================
// Independant Summons Configuration:
//
globals
private constant real MAXDELAY=0.25 //* The max delay betwen orders issued to the summon
private constant real MINDELAY=0.25 //* The min delay betwen orders issued to the summon
private constant real MAXDISTANCE=1000.0 //* If the distance betwen the summon and the master is greater than this value,
// The summon will move to the position of the master instead of attack move
private constant real COMETOMAXDIST=100.0 //* Max distance for issued orders to approach the master
private constant real COMETOMINDIST=100.0 //* Min distance for issued orders to approach the master
endglobals
//==================================================================================================
function IndieSummon_Order takes unit summon, unit master returns nothing
local integer o=GetUnitCurrentOrder(summon)
local real tx=GetUnitX(master)
local real ty=GetUnitY(master)
local real angle
local real dist
set dist=Pow(tx-GetUnitX(summon),2) + Pow(ty-GetUnitY(summon),2)
if (dist > (MAXDISTANCE*MAXDISTANCE) ) and (o == 0 or o == OrderId("attack") or o == OrderId("move") or o == OrderId("stop") or o==851971) then
call IssuePointOrder(summon, "move", tx,ty)
elseif dist >= (COMETOMINDIST*COMETOMINDIST) and (o == 0 or o == 851971) then
set angle = GetRandomReal( GetUnitFacing(master)-80, GetUnitFacing(master)+80)
if (ModuloInteger(GetUnitPointValue(summon),2)==0) then
set angle=angle * bj_DEGTORAD
else
set angle=- angle * bj_DEGTORAD
endif
set dist = GetRandomReal(COMETOMINDIST, COMETOMAXDIST)
set tx=tx+dist*Cos(angle)
set ty=ty+dist*Sin(angle)
if not IssuePointOrder(summon, "attack", tx, ty ) then
call IssuePointOrder(summon, "move", tx, ty )
endif
endif
endfunction
private struct Summon extends array
unit master
private method AIDS_onDestroy takes nothing returns nothing
set this.master=null
endmethod
//! runtextmacro AIDS()
endstruct
globals
private unit Unit=null // must be set to null.
endglobals
private function IndieSummon_AntiSmart_Timer takes nothing returns boolean
local Summon s=Summon(KT_GetData())
if (GetUnitCurrentOrder(s.unit)==851971) then
call IndieSummon_Order( s.unit, s.master )
call KT_Add(function IndieSummon_AntiSmart_Timer,s,0.1)
endif
return true
endfunction
private function IndieSummon_AntiSmart takes nothing returns nothing
if (GetIssuedOrderId() == 851971) then
call KT_Add(function IndieSummon_AntiSmart_Timer, Summon[GetTriggerUnit()], 0.0)
endif
endfunction
function IndieSummon_loop takes nothing returns nothing
// Executed in another thread
local unit summon=Unit
local Summon k=Summon[summon]
local unit master
local trigger smart=CreateTrigger()
//local integer n=0
local triggeraction ac=TriggerAddAction( smart, function IndieSummon_AntiSmart)
call TriggerRegisterUnitEvent( smart, summon, EVENT_UNIT_ISSUED_TARGET_ORDER )
call TriggerRegisterUnitEvent( smart, summon, EVENT_UNIT_ISSUED_POINT_ORDER )
loop
exitwhen (GetWidgetLife(summon)<=0)
set master=k.master
exitwhen master==null
call IndieSummon_Order( summon, master)
call TriggerSleepAction( GetRandomReal( MINDELAY, MAXDELAY )) // Changed from PolledWait.
endloop
set k.master=null
call TriggerRemoveAction(smart,ac)
call DestroyTrigger(smart)
set ac=null
set summon=null
set master=null
set smart=null
endfunction
function IndieSummon_SetMaster takes unit summon, unit master returns nothing
local unit a=Unit
local Summon k=Summon[summon]
if k.master!=null then
set k.master=master
else
set k.master=master
set Unit=summon
call ExecuteFunc("IndieSummon_loop")
set Unit=a
endif
set a=null
endfunction
function IndieSummon_GetMaster takes unit summon returns unit
return Summon[summon].master
endfunction
function IndieSummon_StopAI takes unit summon returns nothing
set Summon[summon].master=null
endfunction
endlibrary
Notes:
If in any way you feel this system totally wrong, you are completly allowed to make it the next ub3rl33t system in the JASS world(I accept everything except cJass)