не, не забыл. Блин. Придется выставить на оборзение:
library DamageLib initializer DamageLib_Init {
define {
private DMG_TT_TIME = 0.6
private DEC_PER_INT = 0.5
}
globals
private trigger Damage_Trg_Var = null
private group All_Units_Group = CreateGroup()
public integer array Damage_Per_Second [MAX_PLAYERS]
public integer array Total_Damage_Done [MAX_PLAYERS]
private constant real Normal_Size = 8.
private constant real Crit_Size = 12.
private constant real Spell_Damage_Height = 0.
private constant real Spell_Heal_Height = 0.
private constant real Usual_Damage_Height = 0.
endglobals
public void AddToDamageGroup (unit u) {
GroupAddUnit(All_Units_Group, u)
TriggerRegisterUnitEvent(Damage_Trg_Var, u, EVENT_UNIT_DAMAGED)
TriggerRegisterUnitEvent(INQSp6Lib_Trg, u, EVENT_UNIT_DAMAGED)
TriggerRegisterUnitEvent(DPSLib_DPS_Trg, u, EVENT_UNIT_DAMAGED)
}
private void DamagePerSecondNulling () {
}
private void UsualDamageTextTag (unit u, real dmg, integer dmgOwnPlayerId) {
local texttag tt = CreateTextTagUnitBJ(I2S(R2I(dmg)), u, Usual_Damage_Height, Normal_Size, 0., 0., 0., 0.)
SetTextTagVelocity(tt, 0.03, 0.03)
SetTextTagColor(tt, 255, 255, 255, 255)
SetTextTagFadepoint(tt, DMG_TT_TIME/2)
SetTextTagLifespan(tt, DMG_TT_TIME)
SetTextTagPermanent(tt, false)
tt = null
}
public void DamageTextTag (unit u, real dmg, integer dmgOwnPlayerId, boolean crit) {
local real size = 0.
local real time = DMG_TT_TIME
if not crit {
size = Normal_Size
else
size = Crit_Size
time = time*2
}
local texttag tt = CreateTextTagUnitBJ(I2S(R2I(dmg)), u, Spell_Damage_Height, size, 0., 0., 0., 0.)
SetTextTagVelocity(tt, 0.03, 0.03)
SetTextTagColor(tt, Color_Dec_1[5], Color_Dec_2[5], Color_Dec_3[5], 255)
SetTextTagFadepoint(tt, time/2)
SetTextTagLifespan(tt, time)
SetTextTagPermanent(tt, false)
tt = null
}
public void HealTextTag (unit u, real heal, integer dmgOwnPlayerId, boolean crit) {
local real size = 0.
local real time = DMG_TT_TIME
if not crit {
size = Normal_Size
else
size = Crit_Size
time = time*2
}
local texttag tt = CreateTextTagUnitBJ("+"+I2S(R2I(-heal)), u, Spell_Heal_Height, size, 0., 0., 0., 0.)
SetTextTagVelocity(tt, 0.03, 0.03)
SetTextTagColor(tt, 0, 255, 0, 255)
SetTextTagFadepoint(tt, time/2)
SetTextTagLifespan(tt, time)
SetTextTagPermanent(tt, false)
tt = null
}
public void SpellDamage (unit cst, unit target, real dmg) {
local real r_dmg = 0.
local bool crit = FALSE
local real life = 0.
crit = Crit_IsCrit(cst)
r_dmg = Crit_GetDamage(dmg, crit)-GetHeroInt(target, TRUE)*DEC_PER_INT
life = GetUnitState(target, UNIT_STATE_LIFE)
DisableTrigger(Damage_Trg_Var)
UnitDamageTarget(cst, target, r_dmg, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_DIVINE, WEAPON_TYPE_WHOKNOWS)
EnableTrigger(Damage_Trg_Var)
DamageTextTag (target, life-GetUnitState(target, UNIT_STATE_LIFE), GetConvertedPlayerId(GetOwningPlayer(cst)), crit)
}
public void SpellHeal (unit cst, unit target, real heal) {
local real r_heal = 0.
local bool crit = FALSE
local real life = 0.
crit = Crit_IsCrit(cst)
r_heal = Crit_GetDamage(heal, crit)
life = GetUnitState(target, UNIT_STATE_LIFE)
DisableTrigger(Damage_Trg_Var)
UnitDamageTarget(cst, target, r_heal, true, false, null, null, WEAPON_TYPE_WHOKNOWS)
EnableTrigger(Damage_Trg_Var)
HealTextTag (target, life-GetUnitState(target, UNIT_STATE_LIFE), GetConvertedPlayerId(GetOwningPlayer(cst)), crit)
}
private void Damage_Act () {
local unit u = GetTriggerUnit()
local unit a = GetEventDamageSource()
local real d = GetEventDamage()
if d > 0 {
UsualDamageTextTag (u, d, GetConvertedPlayerId(GetOwningPlayer(a)))
}
a = null
u = null
}
private void DamageLib_Init () {
trigger Damage_Trg = CreateTrigger()
TriggerAddAction(Damage_Trg, function Damage_Act)
Damage_Trg_Var = Damage_Trg
trigger DamagePerSecondNulling_Trg = CreateTrigger()
TriggerRegisterTimerEvent(DamagePerSecondNulling_Trg, 1., true)
TriggerAddAction(DamagePerSecondNulling_Trg, function DamagePerSecondNulling)
}
}
library DRASp1Lib initializer DRASp1Lib_Init {
define {
private AR = 'A00F' // Abil raw.
private D_AR = 'A00H' // Dummy abil rc.
private DUMMY = 'hfoo'
private SPEED = 2500.
private AOE = 800.
private ORDER = order_creepthunderbolt
private INT = 1 // How much is absorbed.
private TIM = 0.3 // Waiting to make effect.
private TEXT_INT = " ИНТ"
private EFF = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl"
private ATTACH = "chest"
}
globals
private player ch_p = null
private integer Count_Absorbed = 0
private unit array Absorbed_Unit
endglobals
private void TT (unit u, string t, boolean plus) {
local texttag tt = CreateTextTagUnitBJ(t, u, -3., 8., 0., 0., 0., 0.)
if plus {
SetTextTagColor(tt, 128, 255, 128, 200)
else
SetTextTagColor(tt, 255, 128, 128, 200)
}
SetTextTagVelocity(tt, 0.00, 0.03)
SetTextTagFadepoint(tt, 1./2)
SetTextTagLifespan(tt, 1.)
SetTextTagPermanent(tt, false)
tt = null
}
private boolean Cond1 () {
local unit u = GetFilterUnit()
local boolean b = IsPlayerEnemy(GetOwningPlayer(u), ch_p) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and IsUnitType(u, UNIT_TYPE_HERO)
u = null
return b
}
private void DRASp1_Death_A () {
local unit u = GetDyingUnit()
if GetUnitAbilityLevel(u, AR) > 0 {
local integer i = Count_Absorbed
local unit trg = null
whilenot (i == 0) {
trg = Absorbed_Unit[i]
SetHeroInt(trg, GetHeroInt(trg, true)+INT, TRUE)
TT (trg, "+"+I2S(INT)+TEXT_INT, TRUE)
DestroyEffect(AddSpecialEffectTarget(EFF, trg, ATTACH))
SetHeroInt(u, GetHeroInt(u, true)-INT, TRUE)
i--
}
Count_Absorbed = 0
trg = null
}
u = null
}
private void DRASp1_Act () {
if GetSpellAbilityId() == AR {
local unit cst = GetTriggerUnit()
local real cstX = GetUnitX(cst)
local real cstY = GetUnitY(cst)
local group g = CreateGroup()
local unit FoG
local integer i = 0
local real dist = 0.
local integer damage = 0
ch_p = GetOwningPlayer(cst)
GroupEnumUnitsInRange(g, cstX, cstY, AOE, function Cond1)
FoG = FirstOfGroup(g)
if FoG != null {
TriggerSleepAction(TIM)
whilenot (FoG == null) {
TriggerSleepAction(0.01)
SetHeroInt(FoG, GetHeroInt(FoG, TRUE)-INT, TRUE)
TT (FoG, "-"+I2S(INT)+TEXT_INT, FALSE)
Count_Absorbed++
Absorbed_Unit[Count_Absorbed] = FoG
SetHeroInt(cst, GetHeroInt(cst, true)+INT, TRUE)
TT (cst, "+"+I2S(INT)+TEXT_INT, TRUE)
if IsUnitType(FoG, UNIT_TYPE_HERO) {
damage = GetHeroInt(cst, TRUE) - GetHeroInt(FoG, TRUE)
else
damage = GetHeroInt(cst, TRUE)
}
if damage > 0 {
DamageLib_SpellDamage (cst, FoG, damage)
}
GroupRemoveUnit(g, FoG)
FoG = FirstOfGroup(g)
}
}
GroupClear(g)
cst = null
FoG = null
GroupClear(g)
DestroyGroup(g)
g = null
}
}
private void DRASp1Lib_Init () {
trigger DRASp1_Trg = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(DRASp1_Trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddAction(DRASp1_Trg,function DRASp1_Act)
trigger DRASp1_Death = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(DRASp1_Death, EVENT_PLAYER_UNIT_DEATH)
TriggerAddAction(DRASp1_Death,function DRASp1_Death_A)
Preload("EFF")
PreloadEnd(0.01)
}
}
inadequate_ добавил:
if damage > 0 {
DamageLib_SpellDamage (cst, FoG, damage)
}