当前位置:魔兽基地 > 魔兽攻略秘籍 > 浏览信息

【触发】一键移植通用版-电脑英雄自动施放技能

更新时间:2025年09月20日信息来源:魔兽基地信息作者:金皮凤凰蛋

感谢小伙伴“月夜星歌”的分享!

这个系统使得电脑的英雄能够自动集火敌方英雄并且先手施放技能,适合绝大部分地图

一键移植,用法极其方便,只需直接复制这个触发到地图即可,无需修改

支持包括通魔在内的几乎所有的英雄技能模板

对于自定义通魔技能的话,将基础命令ID改成常用的英雄技能模板的命令就可以了,例如风暴之锤(单体目标)、战争践踏(无目标)、烈焰风暴(点目标)

dcf77b8b4710b9127aa83080c9fdfc039345224d.gif

触发脚本如下:

//==================================================================

//电脑英雄自动施放技能系统V1.3 BY 金皮蛋

//使得电脑英雄能够自动对附近的敌方英雄集火并且使用技能

//支持包括通魔在内的绝大部分英雄技能模板

//一键移植,用法极其方便

//==================================================================

library GoldenEggAISettings

globals

public real Range = 1600//AI进攻范围

public real Ratio = 1//AI技能施放范围系数

public boolean Lock = true//true为锁定血量最少的目标,false为不锁定

public boolean OnlyHero = true//true为只对英雄有效,false为对所有单位有效

public boolean CreepAI = false//true为对野怪玩家有效,false为对野怪玩家无效

public boolean HumanAI = false//true为对人类玩家有效,false为对人类玩家无效

endglobals

endlibrary

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

//==================================================================

library HeroSpellSystemAI initializer Init needs GoldenEggAISettings

globals

private integer Top = 0

private boolean AB = false

private unit array Hero

private unit array Htu

private real array Htx

private real array Hty

private integer array LastOI

private integer array OT

private integer array TYPE

private boolean array GUARD

private timer array HT

private group AG = null

private region RR = null

private trigger TE = null

private real Range = 1600

private real Ratio = 1.

private boolean OnlyHero = true

private boolean CreepAI = false

private boolean HumanAI = false

private boolean Lock = true

endglobals

private function DistanceBetweenUnits takes unit u1, unit u2 returns real

return SquareRoot(( GetUnitX(u1)-GetUnitX(u2))*(GetUnitX(u1)-GetUnitX(u2))+(GetUnitY(u1)-GetUnitY(u2))*(GetUnitY(u1)-GetUnitY(u2)))

endfunction

private function IsPlayerComputer takes player p returns boolean

if GetPlayerController(p)==MAP_CONTROL_COMPUTER /*

*/or (GetPlayerController(p)==MAP_CONTROL_USER and HumanAI) /*

*/or (GetPlayerController(p)==MAP_CONTROL_CREEP and CreepAI) then

return true

endif

return false

endfunction

private function IsUnitUseAI takes unit u returns boolean

if IsUnitType(u,UNIT_TYPE_HERO) or OnlyHero==false then

return true

endif

return false

endfunction

private function IsUnitVisibleToEnemy takes unit u returns boolean

local integer i = 0

loop

if IsUnitVisible(u,Player(i)) and IsUnitEnemy(u,Player(i)) then

return true

endif

set i = i + 1

exitwhen i > 15

endloop

return false

endfunction

private function GetHeroId takes unit u returns integer

local integer i = 1

loop

exitwhen i > Top

if u==Hero[i] then

return i

endif

set i = i + 1

endloop

return 0

endfunction

private function GetTimerId takes timer t returns integer

local integer i = 1

loop

exitwhen i > Top

if t==HT[i] then

return i

endif

set i = i + 1

endloop

return 0

endfunction

private function IsFree takes integer OI returns boolean

if OI==0 or OI==851972 or OI==851983 or OI == 852128 then

return true

endif

return false

endfunction

private function IS takes unit AU returns boolean

local integer OI = GetUnitCurrentOrder(AU)

if OI == 0/*

*/or OI == 851972/*

*/or OI == 851993/*

*/or OI == 851983/*

*/or OI == 851984/*

*/or OI == 851988/*

*/or OI == 851990/*

*/or OI == 851983/*

*/or OI == 851985/*

*/or OI == 851986/*

*/or OI == 851988/*

*/or OI == 851990/*

*/or OI == 999999 then

return true

endif

return false

endfunction

private function IC takes unit u, integer i returns boolean

if AB==false and GetUnitCurrentOrder(u)!=i and i!=LastOI[GetHeroId(u)] then

return true

endif

return false

endfunction

private function SD takes unit u, integer i returns nothing

local integer id = GetHeroId(u)

set AB = true

set LastOI[id] = i

set OT[id] = 5

endfunction

private function IO takes unit AU, integer AI returns nothing

if IC(AU,AI) then

if IssueImmediateOrderById( AU, AI ) then

call SD(AU,AI)

endif

endif

endfunction

private function IL takes unit AU, integer AI, real x, real y returns nothing

if IC(AU,AI) then

if IssuePointOrderById( AU, AI ,x ,y ) then

call SD(AU,AI)

endif

endif

endfunction

private function IU takes unit AU, integer AI, unit AT returns nothing

if IC(AU,AI) then

if IssueTargetOrderById( AU, AI , AT ) then

call SD(AU,AI)

endif

endif

endfunction

private function SO1 takes unit AU, real R returns nothing//无目标

local real H = GetUnitLifePercent(AU)

call IO( AU, 852129 )

if R<=800*Ratio then

call IO( AU, 852097 )

call IO( AU, 852489 )

call IO( AU, 852126 )

call IO( AU, 852503 )

call IO( AU, 852100 )

call IO( AU, 852528 )

call IO( AU, 852184 )

call IO( AU, 852164 )

call IO( AU, 852180 )

call IO( AU, 852554 )

call IO( AU, 852200 )

call IO( AU, 852594 )

call IO( AU, 852595 )

call IO( AU, 852596 )

call IO( AU, 852667 )

call IO( AU, 852663 )

call IO( AU, 852598 )

call IO( AU, 852599 )

call IO( AU, 852600 )

if H<=50. then

call IO( AU, 852586 )

endif

endif

if R<=400*Ratio then

call IO( AU, 852096 )

call IO( AU, 852086 )

call IO( AU, 852090 )

call IO( AU, 852094 )

call IO( AU, 852127 )

call IO( AU, 852128 )

call IO( AU, 852526 )

call IO( AU, 852181 )

call IO( AU, 852183 )

call IO( AU, 852556 )

call IO( AU, 852217 )

call IO( AU, 852588 )

call IO( AU, 852253 )

call IO( AU, 852246 )

endif

if R<=100*Ratio then

call IO( AU, 852123 )

endif

//激活

call IO( AU, 852174 )

call IO( AU, 852552 )

call IO( AU, 852458 )

call IO( AU, 852656 )

call IO( AU, 852589 )

call IO( AU, 852244 )

call IO( AU, 852578 )

call IO( AU, 852671 )

call IO( AU, 852244 )

call IO( AU, 852602 )

call IO( AU, 852212 )

call IO( AU, 852522 )

call IO( AU, 852150 )

call IO( AU, 852133 )

call IO( AU, 852102 )

call IO( AU, 852249 )

if R<=200*Ratio then

call IO( AU, 852177 )

endif

endfunction

private function SO2 takes unit AU, real x, real y, real R returns nothing//点目标

if R>1200 then

call IL( AU, 852093, x, y )

endif

call IL( AU, 852089, x, y )

call IL( AU, 852488, x, y )

call IL( AU, 852121, x, y )

call IL( AU, 852504, x, y )

call IL( AU, 852125, x, y )

call IL( AU, 852555, x, y )

call IL( AU, 852218, x, y )

call IL( AU, 852224, x, y )

call IL( AU, 852221, x, y )

call IL( AU, 852593, x, y )

call IL( AU, 852592, x, y )

call IL( AU, 852597, x, y )

call IL( AU, 852580, x, y )

call IL( AU, 852238, x, y )

call IL( AU, 852652, x, y )

call IL( AU, 852658, x, y )

call IL( AU, 852669, x, y )

call IL( AU, 852229, x, y )

call IL( AU, 852237, x, y )

call IL( AU, 852560, x, y )

call IL( AU, 852591, x, y )

call IL( AU, 852238, x, y )

if R>800 then

call IL( AU, 852122, x, y )

endif

if R>400 then

call IL( AU, 852525, x, y )

endif

if R<200*Ratio then

call IL( AU, 852664, x, y )

endif

call IL( AU, 852600, x, y )

endfunction

private function SO3 takes unit AU, unit AT, boolean Ally returns nothing//单位目标

// 敌

//if Ally == false then

call IU( AU, 852095, AT )

call IU( AU, 852119, AT )

call IU( AU, 852502, AT )

call IU( AU, 852179, AT )

call IU( AU, 852171, AT )

call IU( AU, 852527, AT )

call IU( AU, 852555, AT )

call IU( AU, 852227, AT )

call IU( AU, 852226, AT )

call IU( AU, 852587, AT )

call IU( AU, 852585, AT )

call IU( AU, 852583, AT )

call IU( AU, 852662, AT )

call IU( AU, 852665, AT )

call IU( AU, 852668, AT )

call IU( AU, 852670, AT )

call IU( AU, 852230, AT )

call IU( AU, 852480, AT )

call IU( AU, 852106, AT )

call IU( AU, 852487, AT )

call IU( AU, 852487, AT )

call IU( AU, 852243, AT )

call IU( AU, 852560, AT )

call IU( AU, 852231, AT )

call IU( AU, 852252, AT )

//else

// 友

call IU( AU, 852501, AT )

call IU( AU, 852225, AT )

//endif

// 任意

call IU( AU, 852092, AT )

call IU( AU, 852222, AT )

call IU( AU, 852274, AT )

call IU( AU, 852600, AT )

endfunction

private function HeroSpell takes integer id returns nothing

local unit hero = Hero[id]

local real r = DistanceBetweenUnits(hero,Htu[id])

if IS(hero) and IsUnitVisibleToEnemy(hero) then

set AB = false

if TYPE[id] == 1 then

call SO3(hero,Htu[id],false)

elseif TYPE[id] == 2 then

call SO2(hero,Htx[id],Hty[id],r)

elseif TYPE[id] == 3 then

call SO1(hero,r)

endif

endif

set hero = null

endfunction

private function GetTargetHero takes integer id returns nothing

local unit u = null

local unit WT = null

local unit hero = Hero[id]

local real HPmin = 10000000000.

local real Dismin = 10000000000.

local real HP = 0.

local real Dis = 0.

local real x = GetUnitX(hero)

local real y = GetUnitY(hero)

local group G = CreateGroup()

local player p = GetOwningPlayer(hero)

local integer OI = GetUnitCurrentOrder(hero)

call GroupEnumUnitsInRange(G,x,y,Range,null)

loop

set u = FirstOfGroup(G)

if IsUnitUseAI(u) then

set HP = GetUnitState(u,UNIT_STATE_LIFE)

if HP > 0. and IsUnitEnemy(u,p) then

if Lock == false then

set Dis = DistanceBetweenUnits(hero,u)

if Dis < Dismin then

set Dismin = Dis

set WT = u

endif

else

if HP < HPmin then

set HPmin = HP

set WT = u

endif

endif

endif

endif

call GroupRemoveUnit(G,u)

exitwhen u==null

endloop

call GroupClear(G)

call DestroyGroup(G)

if WT != null then

set Htu[id] = WT

set Htx[id] = GetUnitX(WT)

set Hty[id] = GetUnitY(WT)

if IsFree(OI) then

if not IssueTargetOrderById( hero, 851983, WT ) or TYPE[id]!=1 then

call IssuePointOrderById( hero, 851983, Htx[id], Hty[id] )

endif

endif

call HeroSpell(id)

endif

set u = null

set WT = null

set hero = null

set p = null

set G = null

endfunction

private function SetGuardPosition takes integer id returns nothing

if IsUnitVisibleToEnemy(Hero[id]) then

if GUARD[id] == false then

call RecycleGuardPosition(Hero[id])

endif

set GUARD[id] = true

else

if GUARD[id] == true then

call RemoveGuardPosition(Hero[id])

endif

set GUARD[id] = false

endif

endfunction

private function TimerLoop takes nothing returns nothing

local integer id = GetTimerId(GetExpiredTimer())

if IsUnitType(Hero[id],UNIT_TYPE_HERO)==false and GetUnitState(Hero[id],UNIT_STATE_LIFE)<=0 then

call DestroyTimer(HT[id])

call GroupRemoveUnit(AG,Hero[id])

set Hero[id] = Hero[Top]

set HT[id] = HT[Top]

set OT[id] = OT[Top]

set TYPE[id] = TYPE[Top]

set GUARD[id] = GUARD[Top]

set Hero[Top] = null

set Top = Top - 1

else

if OT[id] > 0 then

set OT[id] = OT[id] - 1

else

set LastOI[id] = 0

endif

set TYPE[id] = TYPE[id] + 1

if TYPE[id] > 3 then

set TYPE[id] = 0

endif

call SetGuardPosition(id)

call GetTargetHero(id)

endif

endfunction

private function HC takes unit u returns boolean

if IsUnitUseAI(u) /*

*/and IsUnitIllusion(u)==false /*

*/and IsUnitInGroup(u,AG)==false /*

*/and GetUnitAbilityLevel(u,'Aloc')==0/*

*/and IsUnitType(u,UNIT_TYPE_PEON)==false /*

*/and IsUnitType(u,UNIT_TYPE_STRUCTURE)==false /*

*/and IsPlayerComputer(GetOwningPlayer(u)) then

call GroupAddUnit(AG,u)

return true

endif

return false

endfunction

private function Reg takes unit u returns nothing

set Top = Top + 1

set Hero[Top] = u

set HT[Top] = CreateTimer()

set OT[Top] = 0

set TYPE[Top] = 0

set GUARD[Top] = true

call TimerStart(HT[Top],1.11,true,function TimerLoop)

endfunction

private function Trg01 takes nothing returns nothing

local unit u = GetTriggerUnit()

if HC(u) then

call Reg(u)

endif

set u = null

endfunction

private function Init takes nothing returns nothing

local unit u = null

local group g = CreateGroup()

set Range = GoldenEggAISettings_Range

set Ratio = GoldenEggAISettings_Ratio

set OnlyHero = GoldenEggAISettings_OnlyHero

set CreepAI = GoldenEggAISettings_CreepAI

set HumanAI = GoldenEggAISettings_HumanAI

set Lock = GoldenEggAISettings_Lock

set AG = CreateGroup()

set TE = CreateTrigger()

set RR = CreateRegion()

call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,null)

loop

set u = FirstOfGroup(g)

if HC(u) then

call Reg(u)

endif

call GroupRemoveUnit(g,u)

exitwhen u==null

endloop

call GroupClear(g)

call DestroyGroup(g)

call RegionAddRect(RR,bj_mapInitialPlayableArea)

call TriggerAddAction(TE,function Trg01)

call TriggerRegisterEnterRegion(TE,RR,null)

set u = null

set g = null

endfunction

endlibrary


相关攻略秘籍

魔兽攻略秘籍阅读排行

魔兽专题更多>

魔兽生存恐怖解密地图合集四方阵FootmenFrenzy合集

魔兽攻略秘籍| 魔兽工具补丁| 魔兽视频录像| 标签tag| 网站地图