Hildagarn
Member
- Reaction score
- 20
But I know nothing of JASS at all
function InitTrig_IndieSummon takes nothing returns nothing
endfunction
//##Start##
//**************************************************************************************************
//*
//* IndieSummons (header functions)
//* ¯¯¯¯¯¯¯¯¯¯¯¯
//* To implement these functions, you must select the contents of this trigger starting
//* with the //##Start## and finishing with the //##End##, and copy that TO YOUR MAP's
//* CUSTOM SCRIPT SECTION, (it is at the top of the trigger list in the trigger editor)
//*
//* DON'T JUST COPY THE TRIGGER; copy this to the custom script section
//*
//* AFTER copying this function to custom script section, copy the next trigger to your map
//*
//**************************************************************************************************
//=================================================================================================
//
// <a href="http://www.wc3jass.com" target="_blank" class="link link--external" rel="nofollow ugc noopener">http://www.wc3jass.com</a> : The place with tons of JASS scripts
//
//=================================================================================================
function IndieSummon_SetMaster takes unit summon, unit master returns nothing
local unit a=bj_ghoul[0]
local string k=GetAttachmentTable(summon)
if (HaveStoredInteger(CSCache(),"[IndieSummons]",k)) then
call SetTableObject("[IndieSummons]",k,master)
else
call SetTableObject("[IndieSummons]",k,master)
set bj_ghoul[0]=summon
call ExecuteFunc("IndieSummon_loop")
set bj_ghoul[0]=a
endif
set a=null
endfunction
function IndieSummon_GetMasterSubcall takes unit summon returns unit
call GetStoredInteger(CSCache(),"[IndieSummons]",GetAttachmentTable(summon))
if false then
return null
endif
endfunction
function GiveMyUnitBackGrr takes unit u returns unit
return u
endfunction
function IndieSummon_GetMaster takes unit summon returns unit
return GiveMyUnitBackGrr(IndieSummon_GetMaster(summon))
endfunction
function IndieSummon_StopAI takes unit summon returns nothing
call FlushStoredInteger(CSCache(),"[IndieSummons]",GetAttachmentTable(summon))
endfunction
//##End##
want to do this! Tryingor learn JASS
Why bump? Take your pick.>But I know nothing of JASS at all
Alright, have a lame fix then.
...
If that still does not work, please post the entire CSCache code.
If you want a real fix... learn JASS.
Why bump? Take your pick.
could you do this for me?You could pretty much do this with GUI lol.
Just give all summons the Ward classification, add a trigger that prevents the order called "smart" for those units, give them Wander (optional, you can also periodically order them to attack ground a random point near owner), index all summons in a unit group array to a unit array and check periodically if theyre not too far from the owner and voila.
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=2.5 //* The max delay betwen orders issued to the summon
private constant real MINDELAY=1.00 //* 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=500.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
static if AIDS___USE_PERIODIC_RECYCLER then
local integer s=(KT_GetData())
local integer s=(KT_GetData())
call KT_Add(function IndieSummon___IndieSummon_AntiSmart_Timer , s , 0.1)
call KT_Add(function IndieSummon___IndieSummon_AntiSmart_Timer , s__IndieSummon___Summon__staticgetindex(GetTriggerUnit()) , 0.0)