function EnableCode takes nothing returns nothing
endfunction
Name | Type | is_array | initial_value |
CapturePoint_DeRegister | trigger | No | |
CapturePoint_Register | trigger | No | |
CapturePoint_Register_Influ | integer | No | |
CapturePoint_Register_Range | real | No | |
CapturePoint_Register_Style | integer | No | |
CapturePoint_Register_Unit | unit | No | |
CapturePoint_TempGroup | group | No | |
CapturePointAutoDeregister | trigger | No | |
CapturePointBarType | modelfile | No | |
CapturePointDefaultFilter | boolexpr | No | |
CapturePointEvent | real | No | |
CapturePointEventMovedUnit | unit | No | |
CapturePointEventPlayer | player | No | |
CapturePointEventUnit | unit | No | |
CapturePointHash | hashtable | No | |
CapturePoints | group | No | |
CapturePointTeamLeader | player | Yes | |
CapturePointTimer | timer | Yes | |
farbcode | string | Yes | |
Win | boolean | No | |
WithinRange__DeRegister | trigger | No | |
WithinRangeEnteringUnit | unit | No | |
WithinRangeEvent | real | No | |
WithinRangeHash | hashtable | No | |
WithinRangeRange | real | No | |
WithinRangeUnit | unit | No | |
WithinRangeUsers | group | No | |
WithinRangeWanted_Event | real | No | |
WithinRangeWanted_Filter | boolexpr | No | |
WithinRangeWanted_Keep | boolean | No | |
WithinRangeWanted_Trigger | trigger | No |
//UnitWithinRange 1.5
// By Tasyen
//Allows to register specific Units to throw events when an unit enters a wanted range.
//Inside this Events you have access to the entered unit, the enteringUnit and the Range this was registered on.
//How UnitWithinRange works?
//UnitWithinRange generateds for any Unit Registered an own Trigger handling Unit comes in Range of x.
//By Connecting Unit/Trigger with Hashtabels under their HandleID
// All units using this are inside the Group udg_WithinRangeUsers.
//=========================================================================================================
// Event
//=========================================================================================================
// udg_WithinRangeEvent tells you what happens
// udg_WithinRangeEvent = 1 Enters
// udg_WithinRangeEvent = -1 AutoClean Cause of Death/Remove/Replaced of the registered Unit
// udg_WithinRangeUnit is the Unit who was Registered
// udg_WithinRangeEnteringUnit is the Unit who came in Range
// udg_WithinRangeRange is the Range under which this was registered (it is not the distance between 2 units, the distance function will bve from the center of each unit while the range detecions includes colisionsizes).
//=========================================================================================================
//Jass API
//=========================================================================================================
// function RegisterUnitWithinRangeEvent takes unit u, real range, code filter, real eventValue returns boolean
// - more simple usage of super: no trigger, destroyFilterWhenDone=true, cleanOnKilled = true
// function RegisterUnitWithinRangeTrigger takes unit u, real range, code filter, trigger execution returns boolean
// - more simple usage of super: no Event Thrown, destroyFilterWhenDone=true, cleanOnKilled = true
// function RegisterUnitWithinRangeSuper takes unit u, real range, boolean cleanOnKilled, boolexpr filter, trigger execution, real eventValue, boolean destroyFilterWhenDone returns boolean
// - inside the filter you can only access the entering Unit with GetTriggerUnit()
// - Start the detection for this Unit with this range
// - can not register twice the same range (main number 800.0 and 800.1 are now allowed) onto 1 unit.
// - cleanOnKilled will generate an trigger which will execute DeRegisterUnitWithinRangeUnit as soon the unit dies.
// - cleanOnKilled creates 1 Trigger for each Unit registered.
// function RegisterUnitWithinRangeEx takes unit u, real range, boolean cleanOnKilled, boolexpr filter returns boolean
// -backwards comptatible, wrapper for super
// function RegisterUnitWithinRange takes unit u, real range, boolean cleanOnKilled returns boolean
// -backwards comptatible, wrapper for super
// function DeRegisterUnitWithinRange takes unit u, real range returns boolean
// Destroys the range detection with this specific Range and Unit.
// function DeRegisterUnitWithinRangeUnit takes unit u returns boolean
// Destroys all Triggers used by the unit from UnitWithinRange.
//=========================================================================================================
//Hashtable Indexes:
//=========================================================================================================
// unitId
// -1 = Auto Clean Trigger
// 0 = amount of range triggers used
// 1+ = Range-Detecion Triggers
// range = index of the trigger controlling that range.
// trigId
// -1 = TriggerAction (For remove usage)
// 0 = Registered Unit
// 0 = Range Detected
// 0 = destroyFilterWhenDone
// 1 = EventValue
// 1 = ExecutionTrigger
// 3 = filter (boolexpr)
//=========================================================================================================
//changes 1.5
//=========================================================================================================
// One can now choose the EventValue thrown.
// One can now choose a trigger beeing executed (including conditions) when a unit enters.
// ^^ included for GUI with Wanted_Event/Wanted_Trigger.
// The Filters are now supported by the GUI usage.
// Implemented Autodestorying of the filters, if the range detection ends .
// RegisterUnitWithinRangeSuper allows you to choose, the others allways destory the filter.
//=========================================================================================================
constant function UnitWithinRangeDefaultEvent takes nothing returns real
return 1.0
endfunction
//helper function destroys a trigger, its action, and clears the used table space.
function DestroyUnitWhithinTrigger takes trigger trig returns nothing
local integer trigId = GetHandleId(trig)
if LoadBoolean(udg_WithinRangeHash, trigId,0) then
call DestroyBoolExpr(LoadBooleanExprHandle(udg_WithinRangeHash,trigId,3))
endif
call TriggerRemoveAction(trig, LoadTriggerActionHandle(udg_WithinRangeHash,trigId,-1))
call FlushChildHashtable(udg_WithinRangeHash, trigId)
call DestroyTrigger(trig)
endfunction
//Destroys all Triggers used by the unit from UnitWithinRange.
function DeRegisterUnitWithinRangeUnit takes unit u returns boolean
local integer unitId = GetHandleId(u)
local integer size = LoadInteger(udg_WithinRangeHash,unitId,0)
local integer LoopA = 1
//is there a cleanOnKilled Trigger?
if LoadTriggerHandle(udg_WithinRangeHash,unitId,-1) != null then
call DestroyUnitWhithinTrigger(LoadTriggerHandle(udg_WithinRangeHash,unitId,-1))
endif
loop
exitwhen LoopA > size
call DestroyUnitWhithinTrigger(LoadTriggerHandle(udg_WithinRangeHash,unitId,LoopA))
set LoopA = LoopA + 1
endloop
call FlushChildHashtable(udg_WithinRangeHash, unitId)
call GroupRemoveUnit(udg_WithinRangeUsers, u)
return true
endfunction
//Destroys the Trigger form this unit having this specific Range.
//Triggers are unique based on Range & Unit.
function DeRegisterUnitWithinRange takes unit u, real range returns boolean
local trigger trig
local integer trigId
local integer unitId = GetHandleId(u)
local integer size = LoadInteger(udg_WithinRangeHash,unitId,0)
local integer rangeAsInt = R2I(range)
local integer index
//Range smaller equal 0 does not make sense, skip it or has nothing registered.
if range <= 0 or size <= 0 or not HaveSavedInteger(udg_WithinRangeHash,unitId,rangeAsInt) then
return false
endif
set index = LoadInteger(udg_WithinRangeHash,unitId,rangeAsInt)
set trig = LoadTriggerHandle(udg_WithinRangeHash,unitId,index)
set trigId = GetHandleId(trig)
//destroy and clean it.
call RemoveSavedInteger(udg_WithinRangeHash, unitId, rangeAsInt)
call RemoveSavedHandle(udg_WithinRangeHash, unitId, index)
call DestroyUnitWhithinTrigger(trig)
//Redindex, when not last?
if index != size then
set trig = LoadTriggerHandle(udg_WithinRangeHash, unitId, size)
set trigId = GetHandleId(trig)
call SaveTriggerHandle(udg_WithinRangeHash,unitId,index, trig )
set rangeAsInt = R2I( LoadReal(udg_WithinRangeHash, trigId, 0) )
call SaveInteger(udg_WithinRangeHash,unitId,rangeAsInt,index)
endif
set trig = null
call SaveInteger(udg_WithinRangeHash,unitId,0,size - 1)
//if the last trigger was removed, remove it from users.
if size == 1 then
//is there a cleanOnKilled Trigger?
if LoadTriggerHandle(udg_WithinRangeHash,unitId,-1) != null then
call RemoveSavedHandle(udg_WithinRangeHash, unitId, -1)
call DestroyUnitWhithinTrigger(LoadTriggerHandle(udg_WithinRangeHash,unitId,-1))
endif
call GroupRemoveUnit(udg_WithinRangeUsers, u)
call FlushChildHashtable(udg_WithinRangeHash, unitId)
endif
set trig = null
return true
endfunction
//This is called when someone comes in Range.
function ActionUnitWithinRange takes nothing returns nothing
local integer trigId = GetHandleId(GetTriggeringTrigger ())
local real eventValue = LoadReal(udg_WithinRangeHash, trigId, 1)
local trigger execution = LoadTriggerHandle(udg_WithinRangeHash, trigId, 1)
set udg_WithinRangeUnit = LoadUnitHandle(udg_WithinRangeHash,trigId,0)
set udg_WithinRangeEnteringUnit = GetTriggerUnit()
set udg_WithinRangeRange = LoadReal(udg_WithinRangeHash, trigId, 0)
if eventValue != 0.0 then
set udg_WithinRangeEvent = eventValue
set udg_WithinRangeEvent = 0.0
endif
if execution != null then
call ConditionalTriggerExecute(execution)
endif
set execution = null
endfunction
//This Action is called on Death/Remove/Replaced, if wanted on creation.
// Will throw an -1 Event after the DeRegistering was done.
function ActionUnitWithinCleanOnKilled takes nothing returns nothing
call DeRegisterUnitWithinRangeUnit (GetTriggerUnit())
set udg_WithinRangeUnit = GetTriggerUnit()
set udg_WithinRangeEvent = -1
set udg_WithinRangeEvent = 0
endfunction
//Registers an Unit comes within Range around Unit event.
//Uses for each Unit a own Trigger.
//Each Range can only be registered one time on each unit
//if cleanOnKilled = true an Trigger will be generated, if not existing which will DeRegister as soon the unit dies.
function RegisterUnitWithinRangeSuper takes unit u, real range, boolean cleanOnKilled, boolexpr filter, trigger execution, real eventValue, boolean destroyFilterWhenDone returns boolean
local trigger trig
local integer trigId
local integer unitId = GetHandleId(u)
local integer size = LoadInteger(udg_WithinRangeHash,unitId,0)
local integer rangeAsInt = R2I(range)
//Range smaller equal 0 does not make sense, skip it.
if range <= 0 then
return false
endif
//is the cleanOnKilled Trigger already existing?
if LoadTriggerHandle(udg_WithinRangeHash,unitId,-1) == null and cleanOnKilled then
set trig = CreateTrigger()
set trigId = GetHandleId(trig)
call SaveTriggerHandle(udg_WithinRangeHash,unitId,-1,trig)
call SaveTriggerActionHandle(udg_WithinRangeHash,trigId,-1, TriggerAddAction(trig, function ActionUnitWithinCleanOnKilled))
// This will trigger if the unit is removed/killed
call TriggerRegisterUnitStateEvent(trig, u, UNIT_STATE_LIFE, LESS_THAN_OR_EQUAL, 0.405)
set trig = null
endif
//Was this Range already Registered?
if HaveSavedInteger(udg_WithinRangeHash, unitId, rangeAsInt) then
return false
endif
//New Unique Range for this unit; create an new Trigger handling this range.
set trig = CreateTrigger()
set trigId = GetHandleId(trig)
set size = size + 1
call SaveTriggerHandle(udg_WithinRangeHash,unitId,size,trig)
call SaveUnitHandle(udg_WithinRangeHash,trigId,0,u)
call SaveReal(udg_WithinRangeHash,trigId,0,range)
call SaveTriggerActionHandle(udg_WithinRangeHash,trigId,-1, TriggerAddAction(trig, function ActionUnitWithinRange))
call SaveInteger(udg_WithinRangeHash,unitId,0,size)
call SaveInteger(udg_WithinRangeHash,unitId,rangeAsInt,size)
call SaveBoolean(udg_WithinRangeHash,trigId,0,destroyFilterWhenDone)
call SaveBooleanExprHandle(udg_WithinRangeHash,trigId,3,filter)
call SaveTriggerHandle(udg_WithinRangeHash,trigId,1,execution)
call SaveReal(udg_WithinRangeHash,trigId,1,eventValue)
call TriggerRegisterUnitInRange(trig, u, range, filter)
set trig = null
call GroupAddUnit(udg_WithinRangeUsers, u)
return true
endfunction
//Backwards compatible to 1.4
function RegisterUnitWithinRangeEx takes unit u, real range, boolexpr filter returns boolean
return RegisterUnitWithinRangeSuper(u,range,true,filter, null, 1.0,true)
endfunction
//added 1.5
function RegisterUnitWithinRangeEvent takes unit u, real range, code filter, real eventValue returns boolean
return RegisterUnitWithinRangeSuper(u,range,true,Condition(filter), null, eventValue, true)
endfunction
//added 1.5
function RegisterUnitWithinRangeTrigger takes unit u, real range, code filter, trigger execution returns boolean
return RegisterUnitWithinRangeSuper(u,range,true, Condition(filter), execution, 0.0, true)
endfunction
//Backwards compatible to below 1.4
function RegisterUnitWithinRange takes unit u, real range, boolean cleanOnKilled returns boolean
return RegisterUnitWithinRangeSuper(u,range,cleanOnKilled,null, null, 1.0,false)
endfunction
function WithinRangeGUIRegister takes nothing returns nothing
call RegisterUnitWithinRangeSuper( udg_WithinRangeUnit, udg_WithinRangeRange, true, udg_WithinRangeWanted_Filter, udg_WithinRangeWanted_Trigger, udg_WithinRangeWanted_Event, true)
if not udg_WithinRangeWanted_Keep then
set udg_WithinRangeWanted_Trigger = null
set udg_WithinRangeWanted_Event = UnitWithinRangeDefaultEvent()
set udg_WithinRangeWanted_Filter = null
endif
endfunction
function WithinRangeGUIDeRegister takes nothing returns nothing
//When called with Range 0 or below all Ranges will be removed.
if udg_WithinRangeRange <= 0 then
call DeRegisterUnitWithinRangeUnit( udg_WithinRangeUnit)
else
call DeRegisterUnitWithinRange( udg_WithinRangeUnit, udg_WithinRangeRange)
endif
endfunction
//===========================================================================
function InitTrig_WithinRange takes nothing returns nothing
set udg_WithinRangeHash = InitHashtable()
set udg_WithinRangeWanted_Event = UnitWithinRangeDefaultEvent()
set gg_trg_WithinRange = CreateTrigger()
set udg_WithinRange__DeRegister = CreateTrigger()
call TriggerAddAction(gg_trg_WithinRange, function WithinRangeGUIRegister)
call TriggerAddAction(udg_WithinRange__DeRegister, function WithinRangeGUIDeRegister)
endfunction
//CapturePoint System 1.5b
// By Tasyen
//Allows to Make any Unit, you Register, captureable by staying near to it.
//This System has to be called before it starts working, is done in "CapturePoint Init" on default.
//Uses the UnitWithinRangeEvent
//=========================================================================================================
//Capture Style:
//=========================================================================================================
// 0 = +1 Influence, if only Allies are inside the CaptureZone. -1 If only Foes.
// 1 = Like 0; but Lose Influence, if no Ally is inside.
// 2 = +1 Influence if more allies; -1 if more foes
// 3 = Like 2; but Lose Influence, if no Ally is inside.
// 4 = Influence gain/loss is done by difference of Foes and allies
// 5 = Like 4; but Lose Influence, if no Ally is inside.
// to define new Styles Checkout "function CaptureGetInfluenceChange" and inser them
//=========================================================================================================
//CapturePointEvent
//=========================================================================================================
// With CapturePointEvent you can catch some nice Situations.
//
// CatpurePointEvent = 1 udg_CapturePointEventMovedUnit Starts Influenceing udg_CapturePointEventUnit
// CapturePointEvent = -1 udg_CapturePointEventMovedUnit stopps Influenceing udg_CapturePointEventUnit
// InfluencePercent Steps: udg_CapturePointEventPlayer = leadingPlayer, on a negative capturePointEvent its equal to owner.
// CapturePointEvent = 25 udg_CapturePointEventPlayer reached 25% Influence on udg_CapturePointEventUnit
// CapturePointEvent = 50 udg_CapturePointEventPlayer reached 50% Influence on udg_CapturePointEventUnit
// CapturePointEvent = 75 udg_CapturePointEventPlayer reached 75% Influence on udg_CapturePointEventUnit
// CapturePointEvent = -75 controlled CapturePoint udg_CapturePointEventUnit was reduced below 75%
// CapturePointEvent = -50 controlled CapturePoint udg_CapturePointEventUnit was reduced below 50%
// CapturePointEvent = -25 controlled CapturePoint udg_CapturePointEventUnit was reduced below 25%
// You can modify the Percent Events in the approaching Definition
//=========================================================================================================
//Definitions:
//=========================================================================================================
// function CapturePointDefaultFiler takes nothing returns boolean
// Defines who is excluded from influencing capture points.
// Default: Structures, Neutral Passive Units, Capture Points and Aloc Units are exclude from using capturing.
// function Captureinfluence takes unit u returns integer
// Definies how much a unit does Influence CapturePoints
// Default: Hero 2, Non-Hero 1, summoned 0.
// constant function CaptureTimerInterval takes nothing returns real
// Defines Bar/Influence Update Interval
// constant function CaptureBarUnitType takes nothing returns integer
// The ObjectId of the used GenericBar Unit, Make sure it is correct.
// constant function CaptureUsePercentEvents takes nothing returns boolean
// Enables % Influence Events
// constant function CapturePercentEventBase takes nothing returns integer
// On which x * base % a Event is Thrown
// constant function CapturePointDefaultStyle takes nothing returns integer
// constant function CapturePointDefaultInfluence takes nothing returns integer
// constant function CapturePointDefaultRange takes nothing returns real
// used in RegisterCapturePointSimple
// constant function CaptureBarDefaultX_Offset takes nothing returns real
// constant function CaptureBarDefaultY_Offset takes nothing returns real
// constant function CaptureBarDefaultZ_Offset takes nothing returns real
// used by RegisterCapturePointSimple & RegisterCapturePoint
//=========================================================================================================
//API:
//=========================================================================================================
// function RegisterCapturePointSpecific takes unit u, real range, integer influence, integer style, real x, real y, real z, real scale returns boolean
// Makes an Unit Captureable and generateds an CaptureBar over it.
// function RegisterCapturePoint takes unit u, real range, integer influence, integer style returns boolean
// Makes an Unit Captureable and generateds an CaptureBar over it.
// Simple Ones use default X/Y/Z offset and the unit scale from Object Editor
// function RegisterCapturePointSimple takes unit u returns boolean
// Wrapper for RegisterCapturePoint by using the Default Values in Definitions
// Except for the unit.
// function DeRegisterCapturePoint takes unit u, boolean DeregisterUnitWithin returns boolean
// Makes an Captureable Unit uncaptureable again.
// If true the unit will be kicked out of UnitWithin too.
// function CapturePointStopTimer takes nothing returns nothing
// Stops the Influence Timer and the Grafic Update Timer of CapturePoint
// function CapturePointStartTimer takes nothing returns nothing
// Starts the timers of this System.
// Is done if you call this System the first time.
// udg_CatpurePointEvent = 1 | -1
//=========================================================================================================
// Definitions:
//=========================================================================================================
//Define how much influnce Influnce Generated by unit u
//If you don't want such a behaviour simply remove anything except the last "return 1"
function Captureinfluence takes unit u returns integer
if IsUnitType(u, UNIT_TYPE_HERO) then
return 2
else
if IsUnitType(u, UNIT_TYPE_SUMMONED) then
return 0
else
return 1
endif
endif
return 1
endfunction
//Structures, Neutral Passive Units, Capture Points and Aloc Units are exclude from using capturing.
function CapturePointDefaultFiler takes nothing returns boolean
local unit u = GetTriggerUnit()
local boolean b = not IsUnitType(u, UNIT_TYPE_STRUCTURE) and GetOwningPlayer(u) != Player(PLAYER_NEUTRAL_PASSIVE) and not IsUnitInGroup(u, udg_CapturePoints) and GetUnitAbilityLevel(u,'Aloc') == 0
set u = null
return b
endfunction
constant function CaptureUsePercentEvents takes nothing returns boolean
return true
endfunction
//If Influence Rises/Falls over a negative/positive x time of this value a Event with this Value is thrown
//Default 25/50/75 %;
//0% Event is hardcoded excluded.
// Anything below 5 is not Recommented.
// Insering 0 or 1 will break the system.
constant function CapturePercentEventBase takes nothing returns integer
return 25
endfunction
//Is used in RegisterCapturePointSimple
constant function CapturePointDefaultStyle takes nothing returns integer
return 0
endfunction
constant function CapturePointDefaultRange takes nothing returns real
return 200.0
endfunction
constant function CapturePointDefaultInfluence takes nothing returns integer
return 30
endfunction
//Is used in RegisterCapturePointSimple & RegisterCapturePoint
constant function CaptureBarDefaultX_Offset takes nothing returns real
return 0.0
endfunction
constant function CaptureBarDefaultY_Offset takes nothing returns real
return 50.0
endfunction
constant function CaptureBarDefaultZ_Offset takes nothing returns real
return 300.0
endfunction
constant function CaptureBarDefaultScale takes nothing returns real
return 3.0
endfunction
//How long is one Interval of Capture, The time to capture a CapturePoint is CaptureTimerInterval*Influence (*2, if Controled by foe)
//Capture Points first have to be neutralised
constant function CaptureTimerInterval takes nothing returns real
return 0.5
endfunction
//=========================================================================================================
//Hashtable Indexes:
//=========================================================================================================
//Handle
function CapturePointHashIndex_Group takes nothing returns integer
return 0
endfunction
function CapturePointHashIndex_LeadingPlayer takes nothing returns integer
return 1
endfunction
function CapturePointHashIndex_Bar takes nothing returns integer
return 2
endfunction
//Real
function CapturePointHashIndex_Range takes nothing returns integer
return 0
endfunction
function CapturePointHashIndex_XOffset takes nothing returns integer
return 1
endfunction
function CapturePointHashIndex_YOffset takes nothing returns integer
return 2
endfunction
function CapturePointHashIndex_ZOffset takes nothing returns integer
return 3
endfunction
//Int
function CapturePointHashIndex_Influence takes nothing returns integer
return 0
endfunction
function CapturePointHashIndex_InfluenceNeed takes nothing returns integer
return 1
endfunction
function CapturePointHashIndex_Style takes nothing returns integer
return 2
endfunction
//Boolean
function CapturePointHashIndex_UseOffset takes nothing returns integer
return 0
endfunction
//======================================================================================================
//System Code Start
//======================================================================================================
function CapturePointCreateBar takes unit u, real x, real y, real z, real scale returns nothing
local integer cpId = GetHandleId(u)
local player owner = GetOwningPlayer(u)
local effect bar = AddSpecialEffect(udg_CapturePointBarType, GetUnitX(u)+x, GetUnitY(u)+y)
call BlzSetSpecialEffectTimeScale(bar, 0) //Disalbe AutoAnimation
call BlzSetSpecialEffectTime(bar, 0)
call BlzSetSpecialEffectScale(bar, scale)
call BlzSetSpecialEffectHeight(bar, GetUnitFlyHeight(u) + z + BlzGetLocalUnitZ(u))
call SaveEffectHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Bar(), bar)
if x != CaptureBarDefaultX_Offset() or y != CaptureBarDefaultY_Offset() or z != CaptureBarDefaultZ_Offset() then
call SaveBoolean(udg_CapturePointHash,cpId,CapturePointHashIndex_UseOffset(),true)
call SaveReal(udg_CapturePointHash,cpId,CapturePointHashIndex_XOffset(),x)
call SaveReal(udg_CapturePointHash,cpId,CapturePointHashIndex_YOffset(),y)
call SaveReal(udg_CapturePointHash,cpId,CapturePointHashIndex_ZOffset(),z)
endif
if owner != Player(PLAYER_NEUTRAL_PASSIVE) then
call BlzSetSpecialEffectTime(bar, 1)
call BlzSetSpecialEffectColorByPlayer(bar, owner)
endif
set bar = null
set owner = null
endfunction
function CapturePointSetupData takes unit u, real range, integer influence, integer style returns boolean
local integer cpId = GetHandleId(u)
local player owner = GetOwningPlayer(u)
if IsUnitInGroup( u, udg_CapturePoints) then
return false
endif
call RegisterUnitWithinRangeSuper(u, range, true, udg_CapturePointDefaultFilter, gg_trg_CapturePoint, 0, false)
call GroupAddUnit(udg_CapturePoints, u)
call SaveGroupHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Group(), CreateGroup() )
call SavePlayerHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_LeadingPlayer(),owner)
call SaveReal(udg_CapturePointHash,cpId,CapturePointHashIndex_Range(),range)
call SaveInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_InfluenceNeed(),influence)
//Start with Max Influence, if Controled already
if owner != Player(PLAYER_NEUTRAL_PASSIVE) then
call SaveInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_Influence(),influence)
endif
call SaveInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_Style(),style)
set owner = null
return true
endfunction
//Inser a Unit as Captureable Capture Unit, Range is the distance from which the unit can be captured,
//Influence * CaptureTimerInterval() time in seconds, style defines under which situation influences changes
//Uses more arguments to define x/y/z/facing indiviudal
function RegisterCapturePointSpecific takes unit u, real range, integer influence, integer style, real x, real y, real z, real scale returns boolean
if CapturePointSetupData(u, range, influence, style) then
call CapturePointCreateBar(u, x, y, z, scale)
return true
else
return false
endif
endfunction
function RegisterCapturePoint takes unit u, real range, integer influence, integer style returns boolean
if CapturePointSetupData(u, range, influence, style) then
call CapturePointCreateBar(u, CaptureBarDefaultX_Offset(), CaptureBarDefaultY_Offset(), CaptureBarDefaultZ_Offset(), CaptureBarDefaultScale())
return true
else
return false
endif
endfunction
function RegisterCapturePointSimple takes unit u returns boolean
return RegisterCapturePoint( u, CapturePointDefaultRange(), CapturePointDefaultInfluence(), CapturePointDefaultStyle())
endfunction
//Makes a Capture Point uncapturable, second argument asks if it should be removed from the "Unit within"-System too.
//Removes the Bar Unit from the game.
function DeRegisterCapturePoint takes unit u, boolean DeregisterUnitWithin returns boolean
local integer cpId = GetHandleId(u)
if DeregisterUnitWithin then
call DeRegisterUnitWithinRangeUnit(u)
endif
call GroupRemoveUnit(udg_CapturePoints, u)
call DestroyGroup(LoadGroupHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Group()) )
call BlzSetSpecialEffectTimeScale(LoadEffectHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Bar()), 10)
call DestroyEffect(LoadEffectHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Bar()))
call FlushChildHashtable(udg_CapturePointHash, cpId)
return true
endfunction
//This catches the WithingRangeEvent = -1
// aka Removed/Killed/Replaced
//We do not clean in WithinRange cause it does it onitself if this event is thrown.
function CapturePointAutoClean takes nothing returns nothing
call DeRegisterCapturePoint (udg_WithinRangeUnit,false)
endfunction
function CapturePointGetOwner takes player p returns player
local integer teamNr = GetPlayerTeam(p)
if GetPlayerId(p) <= GetBJMaxPlayers() and udg_CapturePointTeamLeader[teamNr] != null then
//swap owner to the Team Leader
return udg_CapturePointTeamLeader[teamNr]
else
return p
endif
endfunction
//Is Called with the Custom-Event UnitWithin = 1.
function CapturePointEnter takes nothing returns nothing
local integer cpId = GetHandleId(udg_WithinRangeUnit)
local player owner = GetOwningPlayer(udg_WithinRangeEnteringUnit)
local group g = LoadGroupHandle( udg_CapturePointHash,cpId,CapturePointHashIndex_Group())
if IsUnitInGroup(udg_WithinRangeEnteringUnit, g) then
set owner = null
set g = null
return //Do not allow twice
endif
call GroupAddUnit(g ,udg_WithinRangeEnteringUnit)
//Become the Leading Player if current Leadingplayer is Neutral_Passive.
if LoadPlayerHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_LeadingPlayer()) == Player(PLAYER_NEUTRAL_PASSIVE) then
//this team has a Leader?
set owner = CapturePointGetOwner(owner)
call SavePlayerHandle(udg_CapturePointHash, cpId, CapturePointHashIndex_LeadingPlayer(), owner)
call BlzSetSpecialEffectColorByPlayer(LoadEffectHandle(udg_CapturePointHash, cpId,CapturePointHashIndex_Bar()), owner)
endif
//Event Entered
set udg_CapturePointEventMovedUnit = udg_WithinRangeEnteringUnit
set udg_CapturePointEventUnit = udg_WithinRangeUnit
set udg_CapturePointEvent = 1
set udg_CapturePointEvent = 0
set owner = null
set g = null
endfunction
//Will Return influenceChange the result will be in Bounds of 0 to Max depending on Style regarding foes/allies.
function CaptureGetInfluenceChange takes integer influence, integer influenceMax, integer allies, integer foes, integer style returns integer
if style == 0 then
if allies != 0 and foes == 0 then //Only Allies?
if influence == influenceMax then //Exceed Limit?
return 0 //It execeeds.
else
return 1
endif
endif
if allies == 0 and foes != 0 then //Only Foes?
if influence == 0 then //Exceed Limit?
return 0 //It execeeds.
else
return -1
endif
endif
endif
if style == 1 then
if allies != 0 and foes == 0 then //Only Allies?
if influence == influenceMax then
return 0
else
return 1
endif
else
if allies == 0 then //No allies?
if influence == 0 then
return 0
else
return -1
endif
else
return 0 //There are Allies and Foes, do nothing!
endif
endif
endif
if style == 2 then
if allies > foes then //More Allies?
if influence == influenceMax then
return 0
else
return 1
endif
endif
if allies < foes then //Less Allies?
if influence == 0 then
return 0
else
return -1
endif
endif
endif
if style == 3 then
if allies > foes then
if influence == influenceMax then
return 0
else
return 1
endif
endif
if allies < foes or allies == 0 then //Less Allies or none Ally?
if influence == 0 then
return 0
else
return -1
endif
endif
endif
if style == 4 then
if influence + (allies - foes) < influenceMax then //New Influence below Upper Limit?
if influence + (allies - foes) > 0 then //New Influence above lower Limit?
return (allies - foes)
else
return -influence //Below Lower Limit Reduce by current Influence, to 0 it!
endif
else
return influenceMax - influence //Above Upper Limit Return Missing to Upper Limit!
endif
endif
if style == 5 then
if allies == 0 and foes == 0 then //No Influncing Unit -> Lose 1 Influence?
if influence == 0 then
return 0
else
return -1
endif
else //Style 4
if influence + (allies - foes) < influenceMax then
if influence + (allies - foes) > 0 then
return (allies - foes)
else
return -influence
endif
else
return influenceMax - influence
endif
endif
endif
return 0
endfunction
//Checks all x times of CapturePercentEventBase() and throws the first found Event.
//Throws negative Events if Influence fall and a positive if Influence Rises.
// udg_CapturePointEventUnit CapturePoint;
// udg_CapturePointEventPlayer = leadingPlayer -> Rising = the one will get the Point; falling the one who is losing this Point
function CapturePointThrowEvent takes integer oldPercent, integer newPercent, unit cp, player p returns boolean
local integer oldStep = oldPercent / CapturePercentEventBase()
local integer newStep = newPercent / CapturePercentEventBase()
if oldStep != newStep then //Step changed?
set udg_CapturePointEventUnit = cp
set udg_CapturePointEventPlayer = p
if oldStep < newStep then //Rise?
set udg_CapturePointEvent = newStep * CapturePercentEventBase()
else //Fallen below newstep + 1 (old => 8 new = 6 you enter 60% realm -> lose the 70% Influence)
set udg_CapturePointEvent = -(newStep+1) * CapturePercentEventBase()
endif
set udg_CapturePointEvent = 0
return true
endif
return false
endfunction
//Group Enumeration for all CapturePoints, Changes Influence, Ownership and Bar Color.
function CapturePointsLoop takes nothing returns nothing
local unit cp = GetEnumUnit()
local unit u
local real oldPercent
local real newPercent
local integer cpId = GetHandleId(cp)
local player leadingPlayer = LoadPlayerHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_LeadingPlayer())
local group influencingUnits = LoadGroupHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Group())
local integer index = 0
local integer allies = 0
local integer foes = 0
local real range = LoadReal(udg_CapturePointHash,cpId,CapturePointHashIndex_Range())
local integer influence = LoadInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_Influence())
local integer influenceMax = LoadInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_InfluenceNeed())
local integer array playerInfluence
local integer playerId
local integer playerIdMax = bj_MAX_PLAYER_SLOTS
local integer influenceGain
local integer style = LoadInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_Style())
local effect bar = LoadEffectHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Bar())
local integer influencePower
set playerInfluence[playerIdMax] = -1
//call GroupClear(udg_CapturePoint_TempGroup)
loop
set u = FirstOfGroup(influencingUnits)
exitwhen u == null
call GroupRemoveUnit(influencingUnits, u)
//Is Unit still Influencing?
if not IsUnitType(u, UNIT_TYPE_DEAD) and IsUnitInRange (u, cp, range) and GetUnitTypeId(u)!=0 then
call GroupAddUnit(udg_CapturePoint_TempGroup, u)
if not (IsUnitPaused(u)) and not (IsUnitHidden(u)) then //can it influence now?
//Save Influence of this Player
set playerId = GetPlayerId( GetOwningPlayer (u))
set influencePower = Captureinfluence(u)
set playerInfluence[playerId] = playerInfluence[playerId] + influencePower
if playerInfluence[playerId] > playerInfluence[playerIdMax] then
set playerIdMax = playerId
endif
//Count allies/Foes.
if IsUnitAlly (u, leadingPlayer) then
set allies = allies + influencePower
else
set foes = foes + influencePower
endif
endif
else
//This unit is no Influencer for this point anymore.
//Event Unit stops Influenceing
set udg_CapturePointEventUnit = cp
set udg_CapturePointEventMovedUnit = u
set udg_CapturePointEvent = -1
set udg_CapturePointEvent = 0
endif
endloop
//Refill
loop
set u = FirstOfGroup(udg_CapturePoint_TempGroup)
exitwhen u == null
call GroupRemoveUnit(udg_CapturePoint_TempGroup, u)
call GroupAddUnit(influencingUnits,u)
endloop
set influenceGain = CaptureGetInfluenceChange(influence,influenceMax, allies, foes, style)
//Is there InfluenceGain?
if influenceGain != 0 then
set oldPercent = I2R(influence) / influenceMax
set influence = influence + influenceGain
call SaveInteger(udg_CapturePointHash,cpId,CapturePointHashIndex_Influence(),influence)
set newPercent = I2R(influence) / influenceMax
call BlzSetSpecialEffectTime(bar, newPercent)
//Call Influence %-Event?
if CaptureUsePercentEvents() then
call CapturePointThrowEvent(R2I(oldPercent*100),R2I(newPercent*100),cp,leadingPlayer)
endif
endif
if influenceGain != 0 or not IsUnitOwnedByPlayer (cp, leadingPlayer) then
//Neutralise the Point?
if influence == 0 then
//ControlLose with units?
if FirstOfGroup(influencingUnits) != null then
set leadingPlayer = Player(playerIdMax)
call BlzSetSpecialEffectColorByPlayer(bar, leadingPlayer)
else
set leadingPlayer = Player(PLAYER_NEUTRAL_PASSIVE)
call BlzSetSpecialEffectColorByPlayer(bar, leadingPlayer)
endif
call SetUnitOwner (cp, Player(PLAYER_NEUTRAL_PASSIVE), true)
call SavePlayerHandle(udg_CapturePointHash, cpId, CapturePointHashIndex_LeadingPlayer(), CapturePointGetOwner(leadingPlayer))
call BlzSetSpecialEffectTime(bar, 0)
else
//Leading Player captures it?
if influence == influenceMax and not IsUnitOwnedByPlayer (cp, leadingPlayer) then
call SetUnitOwner (cp, leadingPlayer, true)
//Added 1.4a to support changing the ownership of the captured unit inside the change owner event
set leadingPlayer = GetOwningPlayer(cp)
call SavePlayerHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_LeadingPlayer(),leadingPlayer)
endif
call BlzSetSpecialEffectColorByPlayer(bar, leadingPlayer)
endif
endif
//Clear Unit stack
set leadingPlayer = null
set cp = null
set bar = null
set influencingUnits = null
endfunction
//Group Enumeration for all CapturePoints repos Bars
function CapturePointsReposBar takes nothing returns nothing
local unit cp = GetEnumUnit()
local integer cpId = GetHandleId(cp)
local effect bar =LoadEffectHandle(udg_CapturePointHash,cpId,CapturePointHashIndex_Bar())
//use Speciifc Offset?
if LoadBoolean(udg_CapturePointHash,cpId,CapturePointHashIndex_UseOffset()) then
call BlzSetSpecialEffectPosition(bar, GetUnitX(cp) + LoadReal(udg_CapturePointHash,cpId,CapturePointHashIndex_XOffset()), GetUnitY(cp) + LoadReal(udg_CapturePointHash,cpId,CapturePointHashIndex_YOffset()), GetUnitFlyHeight(cp) + LoadReal(udg_CapturePointHash,cpId,CapturePointHashIndex_ZOffset()) )
else
//Used Default
call BlzSetSpecialEffectPosition(bar, GetUnitX(cp) + CaptureBarDefaultX_Offset(), GetUnitY(cp) + CaptureBarDefaultY_Offset(), GetUnitFlyHeight(cp) + BlzGetLocalUnitZ(cp) + CaptureBarDefaultZ_Offset())
endif
set cp = null
set bar = null
endfunction
function CaptureTimerReposBar takes nothing returns nothing
call ForGroup (udg_CapturePoints, function CapturePointsReposBar)
endfunction
function CaptureTimerInfluence takes nothing returns nothing
call ForGroup (udg_CapturePoints, function CapturePointsLoop)
endfunction
function CapturePointStartTimer takes nothing returns nothing
call TimerStart(udg_CapturePointTimer[0], CaptureTimerInterval(), true, function CaptureTimerInfluence)
call TimerStart(udg_CapturePointTimer[1], 1.0/32.0, true, function CaptureTimerReposBar)
endfunction
function CapturePointStopTimer takes nothing returns nothing
call PauseTimer(udg_CapturePointTimer[0])
call PauseTimer(udg_CapturePointTimer[1])
endfunction
//Is Executed if you run CapturePoint the first time.
//Start Catching Events thrown by UnitWithinRange
//Start timer[0][1]
function CaptureInit takes nothing returns nothing
//Auto deregister on death/Killed/Removed
set udg_CapturePointDefaultFilter = Condition( function CapturePointDefaultFiler)
set udg_CapturePointAutoDeregister = CreateTrigger()
call TriggerRegisterVariableEvent( udg_CapturePointAutoDeregister, "udg_WithinRangeEvent", EQUAL, -1 )
call TriggerAddAction(udg_CapturePointAutoDeregister,function CapturePointAutoClean)
//enable Capturing
call TriggerClearActions(gg_trg_CapturePoint)
call TriggerRegisterVariableEvent( gg_trg_CapturePoint, "udg_WithinRangeEvent", EQUAL, 1 )
call TriggerAddAction(gg_trg_CapturePoint,function CapturePointEnter)
call CapturePointStartTimer()
set udg_CapturePointHash = InitHashtable()
set udg_CapturePoint_Register_Range = CapturePointDefaultRange()
set udg_CapturePoint_Register_Influ = CapturePointDefaultInfluence()
set udg_CapturePoint_Register_Style = CapturePointDefaultStyle()
endfunction
function CaptureRegisterGUI takes nothing returns nothing
if udg_CapturePoint_Register_Range <= 0 then
set udg_CapturePoint_Register_Range = CapturePointDefaultRange()
endif
call RegisterCapturePoint(udg_CapturePoint_Register_Unit, udg_CapturePoint_Register_Range, udg_CapturePoint_Register_Influ, udg_CapturePoint_Register_Style)
set udg_CapturePoint_Register_Range = CapturePointDefaultRange()
set udg_CapturePoint_Register_Influ = CapturePointDefaultInfluence()
set udg_CapturePoint_Register_Style = CapturePointDefaultStyle()
endfunction
function CaptureDeRegisterGUI takes nothing returns nothing
call DeRegisterCapturePoint(udg_CapturePoint_Register_Unit, true)
endfunction
//===========================================================================
function InitTrig_CapturePoint takes nothing returns nothing
set gg_trg_CapturePoint = CreateTrigger()
call TriggerAddAction(gg_trg_CapturePoint, function CaptureInit)
set udg_CapturePoint_DeRegister = CreateTrigger()
set udg_CapturePoint_Register = CreateTrigger()
call TriggerAddAction(udg_CapturePoint_DeRegister, function CaptureDeRegisterGUI)
call TriggerAddAction(udg_CapturePoint_Register, function CaptureRegisterGUI)
endfunction