AoW_Hun7312
I'm a magic man, I've got magic hands.
- Reaction score
- 76
I've currently been working on an assist system for my map, but I'm fairly certain it can be improved. Does anyone see anything that would help its performance?
JASS:
// Created by AoW_Hun7312
library ASYST initializer Init requires AIDS, Damage, TimerUtils
globals
// Configurable Settings
// The gold gained from a kill
private constant integer Bounty = 250
// The gold to split among assisters
private constant integer AssistBounty = 50
// The time before assists are no longer valid.
private constant real DecayTime = 10.
// The duration of the messages
private constant real MessageDuration = 15.
// Messages displayed when killed
private constant string KillMessage = " killed "
private constant string AssistMessage = "With help from: "
private constant string BountyMessage = " gold!"
private constant string SplitMessage = " gold is split!"
// Don't touch below here!
private force array AssistGroup
private timer array AssistTimer
private group RegisteredGroup = CreateGroup()
private player killedp = null
private player killerp = null
private trigger UnitDamaged = CreateTrigger()
private trigger UnitKilled = CreateTrigger()
private unit damaged = null
private unit damager = null
private unit killed = null
private unit killer = null
endglobals
function ASYST_Register takes unit whichUnit returns nothing
set AssistGroup[GetUnitId(whichUnit)] = CreateForce()
call GroupAddUnit(RegisteredGroup, whichUnit)
endfunction
private function AssistDecay takes nothing returns nothing
local integer index = GetTimerData(GetExpiredTimer())
call ForceClear(AssistGroup[index])
call ReleaseTimer(AssistTimer[index])
set AssistTimer[index] = null
endfunction
private function Damaged takes nothing returns boolean
local integer index = 0
set damaged = GetTriggerUnit()
if (IsUnitInGroup(damaged, RegisteredGroup)) then
set damager = GetEventDamageSource()
set index = GetUnitId(damaged)
if (AssistTimer[index] == null) then
set AssistTimer[index] = NewTimer()
call ForceAddPlayer(AssistGroup[index], GetOwningPlayer(damager))
call SetTimerData(AssistTimer[index], index)
call TimerStart(AssistTimer[index], DecayTime, false, function AssistDecay)
else
call ForceAddPlayer(AssistGroup[index], GetOwningPlayer(damager))
call PauseTimer(AssistTimer[index])
call TimerStart(AssistTimer[index], DecayTime, false, function AssistDecay)
endif
endif
return false
endfunction
private function Killed takes nothing returns boolean
local integer counter = 0
local integer index = 0
local integer gold = AssistBounty
local string assist = ""
set killed = GetTriggerUnit()
if (IsUnitInGroup(killed, RegisteredGroup)) then
set killer = GetKillingUnit()
if not (killed == killer) then
set index = GetUnitId(killed)
set gold = gold / CountPlayersInForceBJ(AssistGroup[index])
set killedp = GetOwningPlayer(killed)
set killerp = GetOwningPlayer(killer)
loop
exitwhen counter > 11
if (IsPlayerInForce(Player(counter), AssistGroup[index]) and (Player(counter) != killerp)) then
call SetPlayerState(Player(counter), ConvertPlayerState(1), GetPlayerState(Player(counter), ConvertPlayerState(1)) + gold)
set assist = assist + GetPlayerName(Player(counter)) + ", "
endif
set counter = counter + 1
endloop
endif
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, MessageDuration, GetPlayerName(killerp) + KillMessage + GetPlayerName(killedp) + " for " + I2S(Bounty) + BountyMessage)
if (assist != "") then
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, MessageDuration, AssistMessage + assist + I2S(gold) + SplitMessage)
endif
call ForceClear(AssistGroup[index])
endif
return false
endfunction
private function Init takes nothing returns nothing
call Damage_RegisterEvent(UnitDamaged)
call TriggerRegisterAnyUnitEventBJ(UnitKilled, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(UnitDamaged, function Damaged)
call TriggerAddCondition(UnitKilled, function Killed)
endfunction
endlibrary