//TESH.scrollpos=111
//TESH.alwaysfold=0
//!==========================================================//
//!==========================================================//
//!==========================================================//
//!==========================================================//
// Катон Система v 1.0 By lobter_1234
//!==========================================================//
//!==========================================================//
//!==========================================================//
//!==========================================================//
globals
boolean KatonDecorKill = true // Катон уничтажает декорации false отключить
hashtable HT = InitHashtable()
group Group = CreateGroup()
string SFX = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl"// спецэффект
boolean DestroyThree = true //включить уничтожение декораций false нет/true да
boolean Blood = false // включить эффект крови до начала толкалки
boolean SfxOff = false //включение и отлючение спецэффекта
endglobals
//!==========================================================//
// Уничтожение деревьев
//!==========================================================//
function PS_KillTreesChild takes nothing returns nothing
call KillDestructable(GetEnumDestructable())
endfunction
//!====================================================================================
// Rect
//!====================================================================================
function PS_KillTrees takes real x, real y, real radius returns nothing
local rect r=Rect(x-radius,y-radius,x+radius,y+radius)
call EnumDestructablesInRect(r,null,function PS_KillTreesChild)
call RemoveRect(r)
set r=null
endfunction
//!==========================================================//
// Фильтрация отряда
//!==========================================================//
function UnitCheck takes unit caster, unit u returns boolean
return IsUnitEnemy(u, GetOwningPlayer(caster)) and not (IsUnitType(u, UNIT_TYPE_DEAD) and GetUnitTypeId(u) != 0) and IsUnitType(u, UNIT_TYPE_GROUND) and not IsUnitType(u, UNIT_TYPE_STRUCTURE)
endfunction
//!====================================================================================================================
// Массивный Knouback By Lobster_1234
//!====================================================================================================================
function MassiveDamageLoop takes nothing returns nothing
local timer TMR = GetExpiredTimer()
local integer id = GetHandleId(TMR)
local unit i = LoadUnitHandle(HT,id,100)
local real speed = LoadReal(HT,id,101) - ( 1. )
local real angle = LoadReal(HT,id,102)
local real x = GetUnitX(i)
local real y = GetUnitY(i)
local real x1 = x+speed*Cos(angle*bj_DEGTORAD)
local real y1 = y+speed*Sin(angle*bj_DEGTORAD)
if DestroyThree then
call PS_KillTrees( x, y, 150. )
endif
if SfxOff then
call DestroyEffect(AddSpecialEffect(SFX,GetUnitX(i),GetUnitY(i)))
endif
if speed <= 1 then
call PauseTimer(TMR)
call DestroyTimer(TMR)
call FlushChildHashtable(HT,id)
else
if IsTerrainPathable(x1, y1, PATHING_TYPE_WALKABILITY) == true then
set speed = 1
else
call SetUnitX(i,x1)
call SetUnitY(i,y1)
endif
endif
call SaveReal(HT,id,101,speed)
set TMR = null
set i = null
endfunction
function md takes unit a,real x,real y,real damage,real range,real speed returns nothing
local group gr
local unit i
local real angle
local timer TMR
local integer id
set gr = CreateGroup()
call GroupEnumUnitsInRange(gr, x, y, range, null)
set i = FirstOfGroup(gr);
loop
exitwhen(i == null)
if(IsUnitEnemy(i, GetOwningPlayer(a))) and UnitCheck(a, i) then
set TMR = CreateTimer();
set id = GetHandleId(TMR)
set angle = bj_RADTODEG * Atan2(GetUnitY(i) - y, GetUnitX(i) - x)
if Blood then
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl",GetUnitX(i),GetUnitY(i)))
endif
call UnitDamageTarget(a,i,damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
call SaveUnitHandle(HT,id,100,i)
call SaveReal(HT,id,101,speed)
call SaveReal(HT,id,102,angle)
call TimerStart(TMR,0.02,true,function MassiveDamageLoop)
set TMR = null
endif
call GroupRemoveUnit(gr, i);
set i = FirstOfGroup(gr);
endloop
call DestroyGroup(gr);
set a = null
set i = null
set gr = null
endfunction
//!======================================================================
// Катон система
//!======================================================================
function Katon_Loop takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit a = LoadUnitHandle(HT,id,0)
local unit dummy = LoadUnitHandle(HT,id,1)
local real angle = LoadReal(HT,id,2)
local real speed = LoadReal(HT,id,3)
local real distance = LoadReal(HT,id,4)
local string Effect = LoadStr(HT,id,5)
local real x = LoadReal(HT,id,6)
local real y = LoadReal(HT,id,7)
local real damage = LoadReal(HT,id,8)
local group g = LoadGroupHandle(HT,id,9)
local real Radius = LoadReal(HT,id,10)
local boolean Bool = LoadBoolean(HT,id,11)
local unit u
local real x1 = GetUnitX(dummy)
local real y1 = GetUnitY(dummy)
local real x2= x1+speed*Cos(angle*bj_DEGTORAD)
local real y2= y1+speed*Sin(angle*bj_DEGTORAD)
if KatonDecorKill then
call PS_KillTrees( x1, y1, Radius )
endif
if SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1)) >= distance then
call PauseTimer(t)
call DestroyTimer(t)
call RemoveUnit(dummy)
call FlushChildHashtable(HT,id)
endif
if GetRectMinX(bj_mapInitialPlayableArea) <= x2 and x2 <= GetRectMaxX(bj_mapInitialPlayableArea) and GetRectMinY(bj_mapInitialPlayableArea) <= y2 and y2 <= GetRectMaxY(bj_mapInitialPlayableArea) then
call GroupEnumUnitsInRange(Group, x1, y1, Radius, null)
loop
set u = FirstOfGroup(Group)
exitwhen u == null
if not IsUnitInGroup(u, g) and UnitCheck(a, u) then
call UnitDamageTarget(a,u,damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
call GroupAddUnit(g, u)
if Bool then
call PauseTimer(t)
call DestroyTimer(t)
call KillUnit(dummy)
call FlushChildHashtable(HT,id)
endif
endif
call GroupRemoveUnit(Group, u)
endloop
call SetUnitX(dummy,x2)
call SetUnitY(dummy,y2)
call DestroyEffect(AddSpecialEffect(Effect,GetUnitX(dummy),GetUnitY(dummy)))
else
call PauseTimer(t)
call DestroyTimer(t)
call RemoveUnit(dummy)
call FlushChildHashtable(HT,id)
endif
set t = null
set a = null
set dummy = null
set g = null
endfunction
function KT takes unit a,integer RawCode,real speed,real distance,string Effect,real damage,real Radius,real angle,boolean Bool returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local real x = GetUnitX(a)
local real y = GetUnitY(a)
local unit dummy = CreateUnit(GetOwningPlayer(a),RawCode,GetUnitX(a)+80*Cos(angle*bj_DEGTORAD),GetUnitY(a)+80*Sin(angle*bj_DEGTORAD),angle)
local real x1 = GetUnitX(dummy)
local real y1 = GetUnitY(dummy)
call SaveUnitHandle(HT,id,0,a)
call SaveUnitHandle(HT,id,1,dummy)
call SaveReal(HT,id,2,angle)
call SaveReal(HT,id,3,speed)
call SaveReal(HT,id,4,distance)
call SaveStr(HT,id,5,Effect)
call SaveReal(HT,id,6,x)
call SaveReal(HT,id,7,y)
call SaveReal(HT,id,8,damage)
call SaveGroupHandle(HT,id,9,CreateGroup())
call SaveReal(HT,id,10,Radius)
call SaveBoolean(HT,id,11,Bool)
call TimerStart(t,0.03,true,function Katon_Loop)
endfunction
Name | Type | is_array | initial_value |
Angle | real | No | |
Caster | unit | No | |
Damage | real | No | |
Distance | real | No | |
Dummy | unitcode | No | |
Effect | string | No | |
HandleBoard | leaderboard | No | |
Radius | real | No | |
Speed | real | No | |
Vzryv | boolean | No |
//TESH.scrollpos=0
//TESH.alwaysfold=0
function HandleCounter_Update takes nothing returns nothing
local integer i = 0
local integer id
local location array P
local real result=0
loop
exitwhen i >= 50
set i = i + 1
set P[i] = Location(0,0)
set id = GetHandleId(P[i])
set result = result + (id-0x100000)
endloop
set result = result/i-i/2
loop
call RemoveLocation(P[i])
set P[i] = null
exitwhen i <= 1
set i = i - 1
endloop
call LeaderboardSetItemValue(udg_HandleBoard,0,R2I(result))
endfunction
function HandleCounter_Actions takes nothing returns nothing
set udg_HandleBoard = CreateLeaderboard()
call LeaderboardSetLabel(udg_HandleBoard, "Handle Counter")
call PlayerSetLeaderboard(GetLocalPlayer(),udg_HandleBoard)
call LeaderboardDisplay(udg_HandleBoard,true)
call LeaderboardAddItem(udg_HandleBoard,"Handles",0,Player(0))
call LeaderboardSetSizeByItemCount(udg_HandleBoard,1)
call HandleCounter_Update()
call TimerStart(GetExpiredTimer(),0.01,true,function HandleCounter_Update)
endfunction
function InitTrig_HandleCounter takes nothing returns nothing
call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Katon_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A002'
endfunction
function Trig_Katon_Actions takes nothing returns nothing
local unit a = GetTriggerUnit()
local string Effect = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"
local real d = bj_RADTODEG * Atan2(GetSpellTargetY() - GetUnitY(a), GetSpellTargetX() - GetUnitX(a))
local real damage = 100.00 + (2.00* I2R(GetHeroAgi(a, true))) * I2R(GetUnitAbilityLevel(a ,'A000'))
local real Radius = 200
local boolean Bool = true// true включить
call KT(a,'h000',35,1000,Effect,damage,Radius,d,Bool)
set a = null
endfunction
//===========================================================================
function InitTrig_Katon takes nothing returns nothing
set gg_trg_Katon = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Katon, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Katon, Condition( function Trig_Katon_Conditions ) )
call TriggerAddAction( gg_trg_Katon, function Trig_Katon_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_KatonBuff_Actions takes nothing returns nothing
local unit a = GetAttacker()
local boolean Vzryv = false // Катон должен взрываться вам рещать
if GetRandomReal(1,100) <= 20 then
call KT(a,'h000',50,650,"Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl",100,180,GetUnitFacing(a),Vzryv)
endif
set a = null
endfunction
function Trig_Katon_Buff_Conditions takes nothing returns boolean
return (GetUnitAbilityLevel(GetAttacker(), 'B015') > 0)
endfunction
//===========================================================================
function InitTrig_KatonBuff takes nothing returns nothing
set gg_trg_KatonBuff = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_KatonBuff, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(gg_trg_KatonBuff, Condition( function Trig_Katon_Buff_Conditions ) )
call TriggerAddAction( gg_trg_KatonBuff, function Trig_KatonBuff_Actions )
endfunction