offline
Опыт:
888
Активность:
|
Код:
library AssistanceSystem initializer Init_AssistanceSystem
globals
// Настройки
private constant real Time = 10. // Время от последнего удара, после которого не засчитывается
private constant integer Award = 200 // Бонус за помощь
private constant boolean Split = true // Делить ли награду
private constant string Msg1 = "Принимал участие " // Фраза кто помогал
private constant string Msg2 = " золота!" // Фраза полного выигрыша
private constant string Msg3 = " часть золота!" // Фраза, если выигрыш делится
private constant string GoldColor = "|c00FFDE00" // Цвет золота
//=====Ничё не менять!=====\\
private unit array Targets
private timer array Timers
private timer array T
private trigger Trigger1 = CreateTrigger()
private trigger Trigger2 = CreateTrigger()
private group Heroes = CreateGroup()
private integer Skip
private integer Total
public integer array Assists
endglobals
//*************************************************************************
function GetPlayerNameColored takes player id returns string
local playercolor col = GetPlayerColor(id)
local string r = GetPlayerName(id)
if col == PLAYER_COLOR_RED then
set r="|cffff0000"+r+"|r"
elseif col == PLAYER_COLOR_BLUE then
set r="|cff0000ff"+r+"|r"
elseif col == PLAYER_COLOR_CYAN then
set r="|cff93ffc9"+r+"|r"
elseif col == PLAYER_COLOR_PURPLE then
set r="|cff400080"+r+"|r"
elseif col == PLAYER_COLOR_YELLOW then
set r="|cffffff00"+r+"|r"
elseif col == PLAYER_COLOR_ORANGE then
set r="|cffff8000"+r+"|r"
elseif col == PLAYER_COLOR_GREEN then
set r="|cff00c400"+r+"|r"
elseif col == PLAYER_COLOR_PINK then
set r="|cffff80c0"+r+"|r"
elseif col == PLAYER_COLOR_LIGHT_GRAY then
set r="|cff808080"+r+"|r"
elseif col == PLAYER_COLOR_LIGHT_BLUE then
set r="|cffc1c1ff"+r+"|r"
elseif col == PLAYER_COLOR_AQUA then
set r="|cff5e5e2f"+r+"|r"
elseif col == PLAYER_COLOR_BROWN then
set r="|cff004000"+r+"|r"
else
set r="|cff000000"+r+"|r"
endif
return r
endfunction
function GetPlayerColorS takes player id returns string
local playercolor col = GetPlayerColor(id)
local string r = ""
if col == PLAYER_COLOR_RED then
set r="|cffff0000"
elseif col == PLAYER_COLOR_BLUE then
set r="|cff0000ff"
elseif col == PLAYER_COLOR_CYAN then
set r="|cff93ffc9"
elseif col == PLAYER_COLOR_PURPLE then
set r="|cff400080"
elseif col == PLAYER_COLOR_YELLOW then
set r="|cffffff00"
elseif col == PLAYER_COLOR_ORANGE then
set r="|cffff8000"
elseif col == PLAYER_COLOR_GREEN then
set r="|cff00c400"
elseif col == PLAYER_COLOR_PINK then
set r="|cffff80c0"
elseif col == PLAYER_COLOR_LIGHT_GRAY then
set r="|cff808080"
elseif col == PLAYER_COLOR_LIGHT_BLUE then
set r="|cffc1c1ff"
elseif col == PLAYER_COLOR_AQUA then
set r="|cff5e5e2f"
elseif col == PLAYER_COLOR_BROWN then
set r="|cff004000"
else
set r="|cff000000"
endif
return r
endfunction
private function Reset takes nothing returns nothing
local integer i = 0
local timer t = GetExpiredTimer()
loop
exitwhen Timers[i]==t
if i>Total then
call BJDebugMsg("AS Error: |cffff0000Таймер не найден.")
set t = null
return
endif
set i = i + 1
endloop
call PauseTimer(t)
set t = null
set Timers[i] = null
set Targets[i] = null
endfunction
private function Timer takes nothing returns nothing
local unit dam = GetEventDamageSource()
local player pdam = GetOwningPlayer(dam)
local unit targ = GetTriggerUnit()
local player ptarg = GetOwningPlayer(targ)
local integer i = GetPlayerId(ptarg)+(Skip*GetPlayerId(pdam))
if not IsUnitEnemy(dam,ptarg) or pdam==ptarg or GetEventDamage()<.1 or IsUnitType(dam,UNIT_TYPE_HERO) then
set targ = null
set dam = null
return
endif
if Timers[i]==null then
if T[i]==null then
set T[i] = CreateTimer()
endif
set Timers[i] = T[i]
set Targets[i] = targ
call TimerStart(Timers[i],Time,false,function Reset)
else
call PauseTimer(Timers[i])
call TimerStart(Timers[i],Time,false,function Reset)
endif
set dam = null
set targ = null
endfunction
private function Death takes nothing returns nothing
local unit killer = GetKillingUnit()
local player pkill = GetOwningPlayer(killer)
local unit dieer = GetTriggerUnit()
local integer i = GetPlayerId(GetOwningPlayer(dieer))
local integer id = i
local player array pa
local integer count = 0
local integer playid
local string msg
local string endmsg = Msg2
local integer gold = Award
local integer killergold = GetHeroLevel(dieer)*GetRandomInt(8,12) + GetRandomInt(180,260)
local string mess = GetPlayerNameColored(pkill) + " убил " + GetPlayerNameColored(Player(i)) + ". +" + GoldColor + I2S(killergold)+"|r золота!"
loop
exitwhen i>Total
if Targets[i]==dieer then
if pkill!=Player((i-id)/Skip) then
set count = count + 1
set playid = (i-id)/Skip
set pa[count] = Player(playid)
set Assists[playid] = Assists[playid] + 1
endif
set Targets[i] = null
call PauseTimer(Timers[i])
set Timers[i] = null
endif
set i = i + Skip
endloop
if count==0 then
set killer = null
set dieer = null
return
elseif count>1 then
set endmsg = Msg3
endif
if Split then
set gold = Award/count
endif
set i = 1
set msg = Msg1 + GetPlayerNameColored(pa[i])
set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
//set mess = I2S(GetPlayerId(pa[i])+1)
//call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
//call ConditionalTriggerExecute( gg_trg_UpdateMultiBoard )
//call MultiboardSetItemValueBJ( GetLastCreatedMultiboard(), 6, udg_Players[pa[i]], ( " " + I2S(udg_Assists[GetForLoopIndexA()]) ) )
loop
exitwhen i>count
call SetPlayerState(pa[i], ConvertPlayerState(1), GetPlayerState(pa[i], ConvertPlayerState(1)) + gold)
set i = i + 1
endloop
set i = 2
set count = count - 1
loop
exitwhen i>count
set msg = msg + ", " + GetPlayerNameColored(pa[i])
set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
set i = i + 1
endloop
if count>0 then
set msg = msg + " и " + GetPlayerNameColored(pa[i])
set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
//set mess = I2S(GetPlayerId(pa[i])+1)
//call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
endif
set msg = msg + ". +"+GoldColor+I2S(gold)+"|r"+endmsg
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,msg)
call ConditionalTriggerExecute( gg_trg_UpdateMultiBoard )
set killer = null
set dieer = null
endfunction
// Start the system for the unit
public function Register takes unit u returns nothing
if IsUnitInGroup(u,Heroes) then
call BJDebugMsg("AS Error: |cffff0000"+GetUnitName(u)+"Уже внесён в систему. Проваливай.")
return
endif
call GroupAddUnit(Heroes,u)
call TriggerRegisterUnitEvent(Trigger1, u, EVENT_UNIT_DAMAGED)
call TriggerRegisterUnitEvent(Trigger2, u, EVENT_UNIT_DEATH)
endfunction
private function Init_AssistanceSystem takes nothing returns nothing
local integer i = GetPlayers()-1
call TriggerAddAction( Trigger1, function Timer)
call TriggerAddAction( Trigger2, function Death)
set Skip = i+1
set Total = (Skip*i)+i-1
endfunction
endlibrary
Собственно вот эта библиотека. Но у меня баг в том, что если героя убьют, а после этот умерший герой надумает отомстить, то система проигнорирует его и не засчитает. Не могу найти багу.
|