|
个人函数(修正和补充)发布一些常用的函数,有自己做的,也有收集来的(主要还是自己做的,没有全部测试,有错误希望大家提出来)
这次主要是补充一些函数
欢迎各位继续添加
[codes=jass]globals
//创建游戏缓存GC
gamecache udg_GC
//以下是为了减少游戏缓存的使用做的全局变量和攻击类函数的攻击系数和防御系数,有利于使用者利用
//攻击系数
real array udg_AbilityAttackCoefficient
//防御系数
real array udg_AbilityRrcoveryCoefficient
//全局变量(只用于瞬间的计算)
group array udg_Instantaneous_group
real array udg_Instantaneous_real
integer array udg_Instantaneous_integer
location array udg_Instantaneous_piont
unit array udg_Instantaneous_unit
endglobals
function InitGlobals takes nothing returns nothing
local integer i = 0
set i = 0
loop
exitwhen (i > 12)
set udg_AbilityAttackCoefficient = 1.00
set i = i + 1
endloop set i = 0
loop
exitwhen (i > 12)
set udg_AbilityRrcoveryCoefficient = 0
set i = i + 1
endloop set i = 0
loop
exitwhen (i > 3)
set udg_Instantaneous_group = CreateGroup()
set i = i + 1
endloop set i = 0
loop
exitwhen (i > 3)
set udg_Instantaneous_real = 0
set i = i + 1
endloop set i = 0
loop
exitwhen (i > 3)
set udg_Instantaneous_integer = 0
set i = i + 1
endloop
endfunction
//转型函数
function H2I takes handle h returns integer
return h
return 0
endfunction
function I2H takes integer h returns handle
return h
return null
endfunction
function H2S takes handle h returns string
return I2S(H2I(h))
return null
endfunction
function S2I2 takes string s returns integer
return s
return 0
endfunction
function I2S2 takes integer s returns string
return s
return null
endfunction
function I2U takes integer i returns unit
return i
return null
endfunction
function I2Tr takes integer i returns trigger
return i
return null
endfunction
function I2Tm takes integer i returns timer
return i
return null
endfunction
function I2It takes integer i returns item
return i
return null
endfunction
function I2Te takes integer i returns texttag
return i
return null
endfunction
function I2G takes integer i returns group
return i
return null
endfunction
function I2TC takes integer i returns triggercondition
return i
return null
endfunction
function I2TA takes integer i returns triggeraction
return i
return null
endfunction
function C2I takes code c returns integer
return c
return 0
endfunction
function B2S takes boolean c returns string
return c
return null
endfunction
//游戏缓存相关
function SetData takes string lable,string key,integer value returns nothing
call StoreInteger(udg_GC,lable,key,value)
endfunction
function GetData takes string lable,string key returns integer
return GetStoredInteger(udg_GC,lable,key)
endfunction
function SetHandle takes handle subject,string name,handle value returns nothing
call StoreInteger(udg_GC,H2S(subject),"handle"+name,H2I(value))
endfunction
function GetHandle takes handle subject,string name returns handle
return I2H(GetStoredInteger(udg_GC,H2S(subject),"handle"+name))
endfunction
function FlushTable takes handle lable returns nothing
call FlushStoredMission(udg_GC,H2S(lable))
endfunction
function FlushKey takes handle lable,string key returns nothing
call FlushStoredInteger(udg_GC,H2S(lable),key)
endfunctionfunction SetInt takes handle lable,string key,integer value returns nothing
call StoreInteger(udg_GC,H2S(lable),key,value)
endfunction
function GetInt takes handle lable,string key returns integer
return GetStoredInteger(udg_GC,H2S(lable),key)
endfunction
function SetReal takes handle lable,string key,real value returns nothing
call StoreReal(udg_GC,H2S(lable),key,value)
endfunction
function GetReal takes handle lable,string key returns real
return GetStoredReal(udg_GC,H2S(lable),key)
endfunction
function SetStr takes handle lable,string key,string value returns nothing
call StoreInteger(udg_GC,H2S(lable),key,S2I2(value))
endfunction
function GetStr takes handle lable,string key returns string
return I2S2(GetStoredInteger(udg_GC,H2S(lable),key))
endfunctionfunction SetUnit takes handle lable,string key,unit u returns nothing
call StoreInteger(udg_GC,H2S(lable),"unit"+key,H2I(u))
endfunction
function GetUnit takes handle lable,string key returns unit
return GetStoredInteger(udg_GC,H2S(lable),"unit"+key)
return null
endfunction
function RecoredUnitPosition takes unit u returns nothing
call SetReal( u, "UnitX", GetUnitX(u) )
call SetReal( u, "UnitY", GetUnitY(u) )
endfunction
function SetTimer takes handle lable,string key,timer u returns nothing
call StoreInteger(udg_GC,H2S(lable),"timer"+key,H2I(u))
endfunction
function GetTimer takes handle lable,string key returns timer
return GetStoredInteger(udg_GC,H2S(lable),"timer"+key)
return null
endfunctionfunction SetItem takes handle lable,string key,item u returns nothing
call StoreInteger(udg_GC,H2S(lable),"item"+key,H2I(u))
endfunction
function GetItem takes handle lable,string key returns item
return GetStoredInteger(udg_GC,H2S(lable),"item"+key)
return null
endfunction
function SetLightning takes handle lable,string key,lightning u returns nothing
call StoreInteger(udg_GC,H2S(lable),"lightning"+key,H2I(u))
endfunction
function GetLightning takes handle lable,string key returns lightning
return GetStoredInteger(udg_GC,H2S(lable),"lightning"+key)
return null
endfunction
function SetEffect takes handle lable,string key,effect u returns nothing
call StoreInteger(udg_GC,H2S(lable),"effect"+key,H2I(u))
endfunction
function GetEffect takes handle lable,string key returns effect
return GetStoredInteger(udg_GC,H2S(lable),"effect"+key)
return null
endfunction
//其他支撑函数
function IsUnitMoved takes unit u returns boolean
local real x = GetReal( u, "UnitX" )
local real y = GetReal( u, "UnitY" )
local boolean b = false
if x == 0.00 and y == 0.00 then
call RecoredUnitPosition( u )
endif
if GetUnitX(u) != x and GetUnitY(u) != y then
set b = true
endif
return b
endfunction
function ShodowTransparencyActions takes nothing returns nothing
local unit u = GetUnit(GetExpiredTimer(),"Unit" )
local integer a = GetInt(GetExpiredTimer(),"Integer" )
set a = a - 10
call SetInt( GetExpiredTimer(), "Integer", a )
call SetUnitVertexColor( u, 255,255,255, a )
if a <= 50 or GetUnitState(u,UNIT_STATE_LIFE) <= 0 then
call RemoveUnit( u )
call FlushTable( GetExpiredTimer() )
call DestroyTimer( GetExpiredTimer() )
endif
set u = null
endfunction
function ShodowTransparency takes unit u, integer initvar returns nothing
local timer t = null
if GetUnitState( u, UNIT_STATE_LIFE ) > 0 and initvar > 50 then
set t = CreateTimer()
call SetUnit( t, "Unit", u )
call SetInt( t, "Integer", initvar )
call TimerStart( t, TimerGetTimeout(GetExpiredTimer()), true, function ShodowTransparencyActions )
endif
set t = null
endfunction
function IsUseableX takes real x returns real
if x <= GetRectMinX(bj_mapInitialPlayableArea) then
return GetRectMinX(bj_mapInitialPlayableArea)
elseif x >= GetRectMaxX(bj_mapInitialPlayableArea) then
return GetRectMaxX(bj_mapInitialPlayableArea)
endif
return x
endfunction
function IsUseableY takes real y returns real
if y <= GetRectMinY(bj_mapInitialPlayableArea) then
return GetRectMinY(bj_mapInitialPlayableArea)
elseif y >= GetRectMaxY(bj_mapInitialPlayableArea) then
return GetRectMaxY(bj_mapInitialPlayableArea)
endif
return y
endfunction
function Debug takes string s returns nothing
local integer a = 0
loop
call DisplayTimedTextToPlayer( Player(a), 0, 0, 60.00, s )
set a = a + 1
exitwhen a == 11
endloop
set a = 0
endfunction
//漂浮文字(单位) UnitTextTag(单位,文字,红色0-255,绿色0-255,蓝色0-255)
function PointTextTag takes string text, real x, real y, integer red, integer green,integer blue returns texttag
local texttag gt_textgag=CreateTextTag()
local integer bi=H2I(gt_textgag)
call SetTextTagText(gt_textgag, text, 0.023)
call SetTextTagPos(gt_textgag, x, y, 0.0)
call SetTextTagColor(gt_textgag, red, green, blue, 255)
call SetTextTagVelocity(gt_textgag, 0, 0.03)
call SetTextTagVisibility(gt_textgag, true)
call SetTextTagFadepoint(gt_textgag, 2)
call SetTextTagLifespan(gt_textgag, 3)
call SetTextTagPermanent(gt_textgag, false)
set gt_textgag=null
return I2Te(bi)
endfunction
function UnitTextTag takes unit u,string text,integer r,integer g,integer b returns nothing
local texttag gt_textgag=PointTextTag(text,0,0,r,g,b)
call SetTextTagPosUnit(gt_textgag,u,100)
set gt_textgag=null
endfunction
//在单位组中选取随机单位,之后清除这个单位组 GroupPickRandomUnitFlush(单位组)[会返回单位]
function GroupPickRandomUnitFlush takes group g returns unit
local integer index
local integer gta_length=0
local unit array gta_unit
local unit gt_unit
local integer int
loop
set gt_unit=FirstOfGroup(g)
exitwhen gt_unit==null
set gta_unit[gta_length]=gt_unit
set gta_length=gta_length+1
call GroupRemoveUnit(g,gt_unit)
endloop
set index=GetRandomInt(0,gta_length-1)
call DestroyGroup(g)
set int=H2I(gta_unit[index])
set gt_unit=null
set index=0
loop
set gta_unit[index]=null
set index=index+1
exitwhen index==gta_length
endloop
return I2U(int)
endfunction
//周期运行一个函数,不必创建自己创建计时器,直接调用这个函数就可以了
//想结束这个记时器,记时器的动作函数里面调用EndTimer
//TimerRun(代码,实数 间隔时间,是否循环 布尔值)返回计时器
//EndTimer 无参数,消除到时间的计时器(包括缓存)
function TimerRun takes code func,real timeout,boolean periodic returns timer
local timer gt_timer=CreateTimer()
local integer int=H2I(gt_timer)
call TimerStart(gt_timer,timeout,periodic,func)
set gt_timer=null
return I2Tm(int)
endfunction
function EndTimer takes nothing returns nothing
local timer gt_timer=GetExpiredTimer()
if gt_timer!=null then
call PauseTimer(gt_timer)
call FlushTable(gt_timer)
call DestroyTimer(gt_timer)
endif
set gt_timer=null
endfunction
//在单位的头上,产生一个持续时间可以设置的特效 AddTimedEffectPosUnit(单位,附着位点,特效代码,持续时间)
function AddTimedEffectPosUnit_Child takes nothing returns nothing
local timer gt_timer=GetExpiredTimer()
local effect gt_effect=GetEffect(gt_timer,"effect_to_destroy")
if gt_effect!=null then
call DestroyEffect(gt_effect)
endif
call FlushStoredMission(udg_GC,H2S(gt_timer))
call DestroyTimer(gt_timer)
set gt_timer=null
set gt_effect=null
endfunction
function AddTimedEffectPosUnit takes unit u,string point,string modelname,real time returns nothing
local timer gt_timer=TimerRun(function AddTimedEffectPosUnit_Child,time,false)
local effect gt_effect=AddSpecialEffectTarget(modelname, u,point)
call SetEffect(gt_timer,"effect_to_destroy",gt_effect)
set gt_timer=null
set gt_effect=null
endfunction
//等待 Wait(时间)已修正PolledWait函数的内存泄漏问题
//也可以直接用 TriggerSleepAction(等待时间) 来暂停动作
function Wait takes real duration returns nothing
local timer t= CreateTimer()
local real timeRemaining if (duration > 0) then
call TimerStart(t, duration, false, null)
loop
set timeRemaining = TimerGetRemaining(t)
exitwhen timeRemaining <= 0 // If we have a bit of time left, skip past 104534630f the remaining
// duration instead of checking every interval, to minimize the
// polling on long waits.
if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
call TriggerSleepAction(0.1 * timeRemaining)
else
call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
endif
endloop
endif
call PauseTimer(t)
call DestroyTimer(t)
set t=null
endfunction
//击退类
//Mov(被击退单位,击退速度 实数,击退距离 实数,角度 实数,是否暂停单位 布尔值,特效路径【注意要用\\】)
//UnitMove(被击退单位 ,击退时间,每次移动时间,每次移动距离,角度)
function MovUnit takes nothing returns nothing
local effect speaff
local timer tm= GetExpiredTimer()
local unit u = GetUnit(tm,"u")
local real pt =GetStoredReal(udg_GC,H2S(tm),"pt")
local real s =GetStoredReal(udg_GC,H2S(tm),"s")
local string spadd=GetStoredString(udg_GC,H2S(tm),"spadd")
if (GetUnitX(u)+s*Cos(pt*bj_DEGTORAD))<GetRectMaxX(bj_mapInitialPlayableArea) then
if (GetUnitX(u)+s*Cos(pt*bj_DEGTORAD))>GetRectMinX(bj_mapInitialPlayableArea) then
call SetUnitX(u,GetUnitX(u)+s*Cos(pt*bj_DEGTORAD))
endif
endif
if (GetUnitY(u)+s*Sin(pt*bj_DEGTORAD))<GetRectMaxY(bj_mapInitialPlayableArea) and (GetUnitY(u)+s*Sin(pt*bj_DEGTORAD))>GetRectMinY(bj_mapInitialPlayableArea) then
call SetUnitY(u,GetUnitY(u)+s*Sin(pt*bj_DEGTORAD))
endif
if spadd != null then
set speaff=AddSpecialEffect(spadd,GetUnitX(u),GetUnitY(u))
call DestroyEffect(speaff)
set speaff = null
endif
set tm=null
set u=null
set spadd=null
endfunction
function Mov takes unit u,real v,real sc,real pt,boolean p,string spadd returns nothing
local timer tm = TimerRun(function MovUnit,0.02,true)
local real tim = (sc/v)
local real s = (0.02*v)
call SetUnit(tm,"u",u)
call StoreReal(udg_GC,H2S(tm),"pt",pt)
call StoreReal(udg_GC,H2S(tm),"s",s)
call StoreString(udg_GC,H2S(tm),"spadd",spadd)
if p==true then
call PauseUnit(u,true)
endif
call TimerStart(tm,0.02,true,function MovUnit)
call Wait(tim)
if p==true then
call PauseUnit(u,false)
endif
call FlushTable(tm)
call PauseTimer(tm)
call DestroyTimer(tm)
set tm=null
endfunction
function Move_LOOP takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i=0
local unit orderUnit=I2U(GetStoredInteger(udg_GC,I2S(H2I(t)),"orderUnit"))
local real UnitLocX = GetStoredReal(udg_GC,I2S(H2I(t)),"X")
local real UnitLocY = GetStoredReal(udg_GC,I2S(H2I(t)),"Y")
local real tempLocX
local real tempLocY
local real angle = GetStoredReal(udg_GC,I2S(H2I(t)),"angle")
local real dis = GetStoredReal(udg_GC,I2S(H2I(t)),"distance")
local integer steps= GetStoredInteger(udg_GC,I2S(H2I(t)),"steps")
local integer Max= GetStoredInteger(udg_GC,I2S(H2I(t)),"Max")
if steps>0 then
set steps=steps-1
call StoreInteger(udg_GC,I2S(H2I(t)),"steps",steps)
set tempLocX = UnitLocX + dis*Cos(angle*bj_DEGTORAD)*(Max-steps)
set tempLocY = UnitLocY + dis*Sin(angle*bj_DEGTORAD)*(Max-steps)
if tempLocX > GetRectMaxX(bj_mapInitialPlayableArea) then
set tempLocX = GetRectMaxX(bj_mapInitialPlayableArea)
endif
if tempLocX < GetRectMinX(bj_mapInitialPlayableArea) then
set tempLocX = GetRectMinX(bj_mapInitialPlayableArea)
endif
if tempLocY > GetRectMaxY(bj_mapInitialPlayableArea) then
set tempLocY = GetRectMaxY(bj_mapInitialPlayableArea)
endif
if tempLocY < GetRectMinY(bj_mapInitialPlayableArea) then
set tempLocY = GetRectMinY(bj_mapInitialPlayableArea)
endif
call SetUnitX(orderUnit,tempLocX)
call SetUnitY(orderUnit,tempLocY)
else
set i=0
call FlushStoredMission(udg_GC,I2S(H2I(t)))
call DestroyTimer(t)
endif
set orderUnit=null
endfunctionfunction UnitMove takes unit orderUnit,real lasttime,real interval,real dis,real angle returns nothing
local real UnitLocX = GetUnitX(orderUnit)
local real UnitLocY = GetUnitY(orderUnit)
local timer t=CreateTimer()
local integer steps=R2I(lasttime/interval)
call StoreReal(udg_GC,I2S(H2I(t)),"X",UnitLocX)
call StoreReal(udg_GC,I2S(H2I(t)),"Y",UnitLocY)
call StoreInteger(udg_GC,I2S(H2I(t)),"steps",steps)
call StoreInteger(udg_GC,I2S(H2I(t)),"Max",steps)
call StoreReal(udg_GC,I2S(H2I(t)),"angle",angle)
call StoreReal(udg_GC,I2S(H2I(t)),"distance",dis)
call StoreInteger(udg_GC,I2S(H2I(t)),"orderUnit",H2I(orderUnit))
call TimerStart(t,interval,true,function Move_LOOP)
set t=null
endfunction
// 可以让指定的单位做抛物线移动,堪称精典(比如剑圣的跳砍就是抛物移动).
//ParabolaToMoveUnit(单位,高度,距离,速度,角度)
function ParabolaToMoveUnitActions takes nothing returns nothing
local integer i = GetInt( GetExpiredTimer(), "Integer" )
local real angle = GetReal( GetExpiredTimer(),"Angle" )
local real m = GetReal( GetExpiredTimer(),"Speed" ) / 50
local real a = GetReal( GetExpiredTimer(),"Distance" ) / 2
local real b = GetReal( GetExpiredTimer(),"High" )
local real A = b/(a*a)
local real x
local real y
local unit u = GetUnit( GetExpiredTimer(),"Unit")
local real tempx
local real tempy
set i = i + 1
set x = m*i
set y = -A*(x-a)*(x-a)+b
set tempx = GetUnitX(u) + m * Cos(angle*bj_DEGTORAD)
set tempy = GetUnitY(u) + m * Sin(angle*bj_DEGTORAD)
call SetUnitX( u, IsUseableX(tempx) )
call SetUnitY( u, IsUseableY(tempy) )
call SetUnitFacing( u, angle )
call SetUnitFlyHeight( u, y, 0.00 )
call SetInt( GetExpiredTimer(), "Integer", i )
if x>=(2*a) then
call SetUnitFlyHeight( u, GetUnitDefaultFlyHeight(u), 0.00 )
call FlushTable( GetExpiredTimer() )
call DestroyTimer( GetExpiredTimer() )
call FlushTable( u )
endif
endfunctionfunction ParabolaToMoveUnit takes unit u,real high,real distance,real speed,real angel returns nothing
local timer t = null
if GetUnitState(u,UNIT_STATE_LIFE) > 0.00 and distance > 0.00 and speed > 0.00 then
set t = CreateTimer()
call UnitAddAbility( u,'Arav' )
call UnitRemoveAbility( u,'Arav' )
call SetReal( t, "Angle", angel )
call SetReal( t, "High", high )
call SetReal( t, "Distance", distance )
call SetReal( t, "Speed", speed )
call SetUnit( t ,"Unit",u )
call TimerStart( t, 0.02, true, function ParabolaToMoveUnitActions )
set bj_lastStartedTimer=t
else
call FlushTable(t)
call DestroyTimer(t)
call Debug( "Error!")
endif
set t = null
endfunction
// 可以创建N个单位旋转跟随指定单位
//TimerLoopRoundUnit(创建个数,创建单位种类,半径,围绕单位,总时间,每步时间间隔,速度)
function TimerLoopRoundUnitActions takes nothing returns nothing
local unit array tempUnit
local real array angle
local integer i = 0
local integer N = GetInt( GetExpiredTimer(),"Number" )
local integer steps = GetInt( GetExpiredTimer(), "Integer" )
local unit orderUnit=GetUnit(GetExpiredTimer(),"Unit")
local real radius = GetReal( GetExpiredTimer(), "Radius" )
local real S = GetReal( GetExpiredTimer(), "Speed" )
if steps > 0 and GetUnitState(orderUnit,UNIT_STATE_LIFE) > 0.00 then
set steps = steps - 1
call SetInt( GetExpiredTimer(), "Integer", steps )
loop
exitwhen i > N
set i = i + 1
set tempUnit = GetUnit( GetExpiredTimer(), I2S(1000+i) )
set angle = GetReal( GetExpiredTimer(), I2S(2000+i) )
set angle = angle + S
call SetUnitX( tempUnit , IsUseableX(GetUnitX(orderUnit) + radius*CosBJ(angle)) )
call SetUnitY( tempUnit , IsUseableY(GetUnitY(orderUnit) + radius*SinBJ(angle)) )
call SetReal( GetExpiredTimer(), I2S(2000+i),angle )
set tempUnit=null
set angle=0.00
endloop
else
set i = 0
loop
set i = i + 1
exitwhen i > N
call RemoveUnit( GetUnit( GetExpiredTimer(),I2S(1000+i)) )
endloop
call FlushTable( GetExpiredTimer() )
call DestroyTimer( GetExpiredTimer() )
endif
set orderUnit=null
endfunction
function TimerLoopRoundUnit takes integer N,integer ewsp,real R,unit Hero,real T,real I,real S returns nothing
local unit array tempUnit
local timer t=CreateTimer()
local real tempLocX
local real tempLocY
local real array angle
local integer i=0
if GetUnitState(Hero,UNIT_STATE_LIFE) > 0.00 and N > 0 and ewsp != 0 then
call SetInt( t, "Integer", R2I(T/I) )
call SetInt( t, "Number",N )
call SetReal( t, "Radius", R )
call SetReal( t, "Speed", S )
loop
set i = i + 1
exitwhen i > N
set tempLocX = GetUnitX(Hero) + R*Cos(2*i*bj_PI/N)
set tempLocY = GetUnitY(Hero) + R*Sin(2*i*bj_PI/N)
set angle = 180*Atan2(GetUnitY(Hero) - tempLocY, GetUnitX(Hero) - tempLocX)/bj_PI
set tempUnit=CreateUnit(GetOwningPlayer(Hero),ewsp,tempLocX,tempLocY,angle)
call SetUnit( t, I2S(1000+i),tempUnit )
call UnitGenerateAlarms( tempUnit, false )
call SetReal( t, I2S(2000+i),angle )
set tempUnit=null
endloop
call SetUnit( t,"Unit", Hero)
call TimerStart(t,I,true,function TimerLoopRoundUnitActions)
set bj_lastStartedTimer=t
else
loop
set i = i + 1
exitwhen i > N
call RemoveUnit( GetUnit( t,I2S(1000+i)) )
endloop
call FlushTable( t )
call DestroyTimer( t )
endif
set t = null
endfunction
// 开启之个功能,当单位移动时,可以创建幻影跟随单位.
//TimerShadowForUnit(跟随单位ID,跟随动作 字符串,跟随目标单位,幻影间隔时间,幻影总时间)
function StopTimerShadowForUnit takes timer t returns nothing
call FlushTable( t )
call DestroyTimer( t )
endfunctionfunction TimerShadowForUnitActions takes nothing returns nothing
local unit u = GetUnit( GetExpiredTimer(), "Unit")
local unit n = null
if IsUnitMoved(u)==true then
set n = CreateUnit( GetOwningPlayer(u),GetInt( GetExpiredTimer(), "Unit" ),GetReal( u, "UnitX" ),GetReal( u, "UnitY" ),GetUnitFacing(u))
call ShodowTransparency( n, 160 )
call SetUnitPathing( n, false )
call PauseUnit( n, true )
call SetUnitAnimation( n, GetStr( GetExpiredTimer(), "Index" ) )
call SetUnitTimeScale( n, 0.618 )
call UnitApplyTimedLife( n, 'BHwe', 5.00 )
call SetUnitX( n, GetReal( u, "UnitX" ) )
call SetUnitY( n, GetReal( u, "UnitY" ) )
if GetUnitFlyHeight(u) != 0.00 then
call UnitAddAbility(n, 'Arav' )
call UnitRemoveAbility( n, 'Arav' )
call SetUnitFlyHeight( n, GetUnitFlyHeight(u), 0.00 )
endif
call RecoredUnitPosition( u )
set n = null
endif
if GetUnitState(u,UNIT_STATE_LIFE) == 0.00 or GetReal( GetExpiredTimer(), "Limit" ) >= GetReal( GetExpiredTimer(), "Real" ) then
call StopTimerShadowForUnit( GetExpiredTimer() )
call FlushTable(u)
else
call SetReal( GetExpiredTimer(), "Limit", GetReal( GetExpiredTimer(), "Limit" )+TimerGetTimeout(GetExpiredTimer()) )
endif
set u = null
set n = null
endfunction
function TimerShadowForUnit takes integer id, string an, unit u, real ti, real lt returns nothing
local timer t = null
if GetUnitState(u,UNIT_STATE_LIFE) > 0.00 and id != 0 and ti > 0.01 and lt >= ti then
call RecoredUnitPosition( u )
set t = CreateTimer()
call SetInt( t, "Unit", id )
call SetUnit( t, "Unit", u )
call SetStr( t, "Index", an )
call SetReal( t, "Real", lt )
call SetTimer( u, "ShadowTimer", t )
call TimerStart( t, ti, true, function TimerShadowForUnitActions )
set bj_lastStartedTimer = t
else
call StopTimerShadowForUnit( t )
endif
set t = null
endfunction
//触发器注册与删除
//使用:local trigger trg=CreateTrigger;call 注册事件;call AddTrigger_Con_Act(trg,条件,事件)
//删除:call DestroyTrg(trg);set trg = null
function AddTrigger_Con_Act takes trigger trg,code con,code act returns nothing
call StoreInteger(udg_GC,I2S(H2I(trg)),"condition",H2I(TriggerAddCondition(trg,Condition(con))))
call StoreInteger(udg_GC,I2S(H2I(trg)),"action",H2I(TriggerAddAction(trg,act)))
endfunction
function DestroyTrg takes trigger trg returns nothing
call TriggerRemoveCondition(trg,I2TC(GetStoredInteger(udg_GC,I2S(H2I(trg)),"condition")))
call TriggerRemoveAction(trg,I2TA(GetStoredInteger(udg_GC,I2S(H2I(trg)),"action")))
call FlushStoredMission(udg_GC,I2S(H2I(trg)))
call DestroyTrigger(trg)
endfunction
//简化用函数区
//在一个规则区域内创建几个单位并发布命令
//创建几个单位对点发布命令(如果目标是区域中心,可以用区域内的点的坐标来发布命令)
//用法:CreateUnitAndDoToPoint(创建单位的区域,单位玩家 ,单位种类 ,数量,目标X坐标,目标Y坐标,单位面向角度,命令)
function CreateUnitAndDoToPoint takes rect cr,player whichplayer,integer unitname,integer unitnumber,real x,real y,real face,string order returns nothing
local real crX=GetRectCenterX(cr)
local real crY=GetRectCenterY(cr)
local integer index=0
local unit u
loop
exitwhen index>=unitnumber
set u=CreateUnit(whichplayer,unitname,crX,crY,face)
call IssuePointOrder(u,order,x,y)
set index=index+1
endloop
set u=null
endfunction
//任意玩家输入信息做动作(可在一定时间后删除)(0为不删除)
//用法:CreateTriggerForEveryPlayer(输入的字串符,动作函数,是否完全匹配,触发器持续时间)(0为不删除)
function CreateTriggerForEveryPlayer takes string str,code func,boolean yon,real tim returns nothing
local integer index=0
local trigger array tg
local triggeraction array tga
loop
exitwhen index>=12
set tg[index]=CreateTrigger()
call TriggerRegisterPlayerChatEvent(tg[index],Player(index),str,yon)
set tga[index]= TriggerAddAction(tg[index],func)
set index=index+1
endloop
call Wait(tim)
set index=0
loop
exitwhen index>=12
if tim != 0 then
call TriggerRemoveAction(tg[index],tga[index])
call DestroyTrigger(tg[index])
endif
set tg[index]=null
set tga[index]=null
set index=index+1
endloop
endfunction
//返回距离 角度
//GetUnitDistance(单位,单位)返回距离
//GetUnitPointDistance(单位,点,是否删除点 布尔值)返回距离
//GetPointDistance(点,点,是否删除点 布尔值)返回距离
//GetUnitAngle(单位,单位)返回角度
//GetUnitPointAngle(单位,点,是否删除点 布尔值)返回角度
//GetPointAngle(点,点,是否删除点 布尔值)返回角度
function GetUnitDistance takes unit a,unit b returns real
local real dx = GetUnitX(a) - GetUnitX(b)
local real dy = GetUnitY(a) - GetUnitY(b)
return SquareRoot(dx * dx + dy * dy)
endfunction
function GetUnitPointDistance takes unit a,location b,boolean c returns real
local real dx = GetUnitX(a) - GetLocationX(b)
local real dy = GetUnitY(a) - GetLocationY(b)
if c==true then
call RemoveLocation(b)
endif
return SquareRoot(dx * dx + dy * dy)
endfunction
function GetPointDistance takes location a,location b,boolean c returns real
local real dx = GetLocationX(a) - GetLocationX(b)
local real dy = GetLocationY(a) - GetLocationY(b)
if c==true then
call RemoveLocation(a)
call RemoveLocation(b)
endif
return SquareRoot(dx * dx + dy * dy)
endfunction
function GetUnitAngle takes unit a,unit b returns real
local real dx = GetUnitX(a) - GetUnitX(b)
local real dy = GetUnitY(a) - GetUnitY(b)
return Atan(dy/dx)
endfunction
function GetUnitPointAngle takes unit a,location b,boolean c returns real
local real dx = GetUnitX(a) - GetLocationX(b)
local real dy = GetUnitY(a) - GetLocationY(b)
if c==true then
call RemoveLocation(b)
endif
return Atan(dy/dx)
endfunction
function GetPointAngle takes location a,location b,boolean c returns real
local real dx = GetLocationX(a) - GetLocationX(b)
local real dy = GetLocationY(a) - GetLocationY(b)
if c==true then
call RemoveLocation(a)
call RemoveLocation(b)
endif
return Atan(dy/dx)
endfunction
[/codes] |
|