Раньше у меня было нормальное воскрешение героев через Хеш, всё работало замечательно без лагов, без глюков, без утечек. Но вот решил попробовать сделать с использованием структур, и так вот код:
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 различных наркотических веществ чтобы сделать подобное
код
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
}

}
в глобалки занеси координаты стартовых позиций
1
28
11 лет назад
1
таймер убери из структуры и структуру вешай на таймер
или если героев больше 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
}

}
в глобалки занеси координаты стартовых позиций
Принятый ответ
1
32
11 лет назад
1
и чему я научился с твоего кода? как всё усложнять и превратить 4 строчки из гуи в набор бреда где все даже функции по 1 букве а не переменные, я даже не пойму где у тебя эндлайбери, ендметод и энд стракт, вообще решил взорвать мне мозг.
я ничему не научился, лучше скажи что у меня за ошибка была почему у меня время не правльно на респ получалось, я не правльно перебирал струтуру?
НАХРЕНА защита от переполнения если всего 12 элементов, это что надо курить чтобы додуматься до такого, и у тебя сделано кажется под 1 героя у игрока .d=GetPlayerId(GetOwningPlayer(a)) - это разве не оно..
nvc123, конечно спасибо что ты постарался что потратил время, но я нихрена не понял, вообще ничего...
0
28
11 лет назад
0
Bergi_Bear, сразу видно новичка на xgm
цель кода не объяснить тебе то что ты не знаешь а сделать то что ты не смог сделать
объясняют статьи которые советую прочитать
1
32
11 лет назад
1
уговорил
Чтобы оставить комментарий, пожалуйста, войдите на сайт.