kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
JASS:
////////////////////////////////////////////////////////
//
// -----------------
// | HealCraft | ~ v1.0.2 ~
// -----------------
// by kingking
// ==================
// What's HealCraft?
// ==================
// HealCraft simulates normal unit regeneration
// and provides some handy functions like
// firing triggers when units' hp are gained.
//
// ==================
// Why use it?
// ==================
// Some users tried to use some kinds of snippet to
// block units' normal regeneration but it is not the
// best solution. HealCraft is aimed to solve that.
//
// =====================
// Functions provided :
// =====================
// SetUnitTypeRegeneration(integer unitid,real amount)
// -> unitid - Type of unit, like 'hfoo' for footmen
// -> amount - Amount of regeneration per second
//
// HealCraft_RegisterEvent(trigger)
// HealCraft_UnregisterEvent(trigger)
// -> Wrapper for unit hp regeneration event.
// -> You can use Heal_RegisterEvent + NORMAL_HP_REGEN
// constants too, they are same.
// -> This is just for better readability.
//
// HealCraft_EnableCallback(unit whichUnit, boolean flag)
// -> Activate/Deactivate the regen event for unit.
// -> It uses stack, you must decrease it
// to 0 if you want to disable the callback.
// -> The event is disabled by default.
//
// --------------------------------------
// ~ Useful functions for callbacks.
// --------------------------------------
// Heal_GetTarget() -> unit
// -> Simulates GetTriggerUnit for the event.
//
// Heal_GetAmount() -> real
// -> Return the amount of hp regenerated.
//
// Heal_Block(real amount)
// -> Block certain amount of regenerated hp.
//
// Heal_BlockAll()
// -> Block the hp regeneration of unit for
// current instance.
//
// ============
// Constants :
// ============
// HEALS_PER_SECOND
// -> How fast the unit will get hp regeneration.
// -> Too high( >32 ) will cripple the performance if you
// have too many units on map.
//
// NORMAL_HP_REGEN
// -> Heal type for healing event.
//
// =============
// Extra Info :
// =============
// ~ You must set the unit regeneration for all units
// to 0.000 in Object Editor. (Apply this for unit
// types that are used in your map, just leave
// those are not used in your map. <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile :)" loading="lazy" data-shortname=":)" /> )
// ~ You must set Hero Attributes - HP Regen. Bonus
// per Strength Point to 0.00
// ~ You must set the value of unit regeneration in
// this library if you want hp regeneration for the
// unit.
//
// ===========
// Requires :
// ===========
// AIDS by Jesus4Lyf
// Heal by kingking
// Event by Jesus4Lyf
// Jasshelper 0.A.2.B or newer
/////////////////////////////////////////////////////////
library HealCraft requires AIDS, Heal, Event
globals
public constant real HEALS_PER_SECOND = 32
endglobals
globals
HealType NORMAL_HP_REGEN
private Event OnHeal
private hashtable hasht = InitHashtable()
endglobals
public function RegisterEvent takes trigger whichTrigger returns EventReg
return OnHeal.register(whichTrigger)
endfunction
public function UnregisterEvent takes trigger whichTrigger returns nothing
call OnHeal.unregister(whichTrigger)
endfunction
private keyword Data
public function EnableCallback takes unit whichUnit, boolean flag returns nothing
if flag == true then
set Data[whichUnit].stackLevel = Data[whichUnit].stackLevel + 1
elseif Data[whichUnit].stackLevel > 0 then
set Data[whichUnit].stackLevel = Data[whichUnit].stackLevel - 1
endif
endfunction
function SetUnitTypeRegeneration takes integer whichId,real amount returns nothing
call SaveReal(hasht,whichId,0,amount / HEALS_PER_SECOND)
endfunction
private struct EventWrapper extends array
private static method Cond takes nothing returns boolean
if Heal_GetType() == NORMAL_HP_REGEN then
call OnHeal.fire()
endif
return false
endmethod
private static method onInit takes nothing returns nothing
local trigger trig = CreateTrigger()
set OnHeal = Event.create()
call Heal_RegisterEvent(trig)
call TriggerAddCondition(trig,Condition(function thistype.Cond))
endmethod
endstruct
private struct Data extends array
private thistype next
private thistype prev
integer stackLevel
private method AIDS_onCreate takes nothing returns nothing
set this.prev = thistype(0).prev
set this.next = thistype(0)
set thistype(0).prev.next = this
set thistype(0).prev = this
//Link
endmethod
private method AIDS_onDestroy takes nothing returns nothing
set this.next.prev = this.prev
set this.prev.next = this.next
set this.stackLevel = 0
//Unlink
endmethod
private static method periodicHandler takes nothing returns nothing
local thistype this = 0
loop
set this = this.prev//Should be faster than array stack.
exitwhen this == 0
if this.stackLevel > 0 then
call HealUnit(this.unit,this.unit,LoadReal(hasht,GetUnitTypeId(this.unit),0),NORMAL_HP_REGEN)
else
if GetWidgetLife(this.unit) > .405 then
call SetWidgetLife(this.unit,GetWidgetLife(this.unit) + LoadReal(hasht,GetUnitTypeId(this.unit),0))
endif
endif
endloop
endmethod
private static method AIDS_onInit takes nothing returns nothing
set NORMAL_HP_REGEN = HealType.new()
call TimerStart(CreateTimer(),1. / HEALS_PER_SECOND,true,function thistype.periodicHandler)
endmethod
//! runtextmacro AIDS()
endstruct
endlibrary
HealCraft requires Event | Heal | AIDS
HealCraft
v1.0.0 - Release
v1.0.1 - Changed Jesus4Lyf's Hash to Table + My Hash algorithm, efficiency increased.
v1.0.2 - Does not use hash anymore, use hashtable attachment instead. Regen event is disabled by default. New function is added to let users to enable/disable regen event.