Раньше у меня было нормальное воскрешение героев через Хеш, всё работало замечательно без лагов, без глюков, без утечек. Но вот решил попробовать сделать с использованием структур, и так вот код:
globals
integer c=0
endglobals
struct HeroResp
unit u
method ClearRespHero takes nothing returns nothing
.u=null
.destroy()
c--
endmethod
endstruct
function respawn takes nothing returns nothing
HeroResp A=c
ReviveHero( A.u, GetStartLocationX(GetPlayerStartLocation(GetOwningPlayer(A.u))),GetStartLocationY(GetPlayerStartLocation(GetOwningPlayer(A.u))), true )
UnitAddItem(A.u,CreateItem('I00A',0,0))
BotMoveSimple(A.u)//функция движения после респауна для ботов
DestroyTimer(GetExpiredTimer())
A.ClearRespHero()
endfunction
function Trig_recre_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction
function Trig_recre_Actions takes nothing returns nothing
HeroResp A=HeroResp.create()
timer t=CreateTimer()
A.u=GetTriggerUnit()
TimerStart( t, 1*GetHeroLevel(A.u),false, function respawn)
t = null
c++
endfunction
//===========================================================================
function InitTrig_RespawnHeroTank_Struct takes nothing returns nothing
set gg_trg_RespawnHeroTank_Struct = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_RespawnHeroTank_Struct, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_RespawnHeroTank_Struct,function Trig_recre_Conditions )
call TriggerAddAction( gg_trg_RespawnHeroTank_Struct, function Trig_recre_Actions )
endfunction
Герои воскрешаются нормально но время воскрешения не нормальное а вообще я не понимаю от чего зависящее, иногда герой 20 уровня воскрешается за 3 секунды или героя 7 уровня приходится ждать минуту
Принятый ответ
таймер убери из структуры и структуру вешай на таймер
или если героев больше 10 то делай через 1 апдейт
а вобще код полный бред,мне придётся принять одновременно как минимум 5 различных наркотических веществ чтобы сделать подобное
или если героев больше 10 то делай через 1 апдейт
а вобще код полный бред,мне придётся принять одновременно как минимум 5 различных наркотических веществ чтобы сделать подобное
код
library resp{
private real array sx
private real array sy
struct rhero{
unit a
integer b
boolean c
integer d
static nothing new(unit a,integer b){
rhero this=rhero.create()
.a=a
.b=b
.c=true
.d=GetPlayerId(GetOwningPlayer(a))
}
nothing up(){
if .b==0{
ReviveHero(.a,sx[.d],sy[.d],true)
.a=null
.c=false
.d=0
}
.b--
}
}
private nothing act1(){
unit a=GetTriggerUnit()
rhero b=rhero.new(a,GetHeroLevel(a))
a=null
}
private boolean cond1(){
return IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO)
}
private nothing update(){
rhero a=12
loop{
if a.c{
a.up
}
exitwhen a==1
a--
}
}
private nothing init(){
trigger a=CreateTrigger()
timer b=CreateTimer()
TriggerRegisterAnyUnitEventBJ(a,EVENT_PLAYER_UNIT_DEATH)
TriggerAddAction(a,function act1)
TriggerAddCondition(a,function cond1)
TimerStart(b,1,true,function update)
a=null
b=null
}
}
в глобалки занеси координаты стартовых позиций
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
или если героев больше 10 то делай через 1 апдейт
а вобще код полный бред,мне придётся принять одновременно как минимум 5 различных наркотических веществ чтобы сделать подобное
я ничему не научился, лучше скажи что у меня за ошибка была почему у меня время не правльно на респ получалось, я не правльно перебирал струтуру?
НАХРЕНА защита от переполнения если всего 12 элементов, это что надо курить чтобы додуматься до такого, и у тебя сделано кажется под 1 героя у игрока .d=GetPlayerId(GetOwningPlayer(a)) - это разве не оно..
nvc123, конечно спасибо что ты постарался что потратил время, но я нихрена не понял, вообще ничего...
цель кода не объяснить тебе то что ты не знаешь а сделать то что ты не смог сделать
объясняют статьи которые советую прочитать