FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
Утечки в систему CustomHPBars
Сразу скажу что подчищение переменных передаваемых в функции я добавил исключительно из отчаяния, когда пытался понять, что же так нагружает систему.
Суть системы:
• Отображение нестандартных ХП\МП баров • Отображение на героях "спецэффекта" хила и получения урона на хп баре
• HPBar отображается только на тех вражеских юнитах которые в данный момент получают урон.
• Юниты обладают HPBar'ом в виде кубика, постепенно меняющего цвет (герои имеют полоску) Итак, суть и функционал системы я описал, теперь осталось описать реализацию, для того что бы тем, кто решит помочь было несколько проще читать код.
Для каждого игрока создается по 2 группы, привязанные к номеру игрока, первая группа содержит в себе всех юнитов, для которых требуется отображать HPBar для игрока, вторая группа нужна для груплупа в функции GroupBar.
Количество таймеров равно количеству игроков под контролем пользователя, таково же количество групп. Для каждого юнита, при занесении его в группу Х (воизбежание спама хэндлов) создаются два тексттага, в которых будут отображаться полоски здоровья и маны юнита, пока юнит находится в группе. Тоесть для каждого игрока - свои тексттаги. Хэндлтаймер выдает стабильное количество хэндлов в течении теста, однако вес процесса увеличивается с 80МБ до 100МБ спустя всего один "замес".
» API
((код jass
function R2RI takes real r returns integer
local real f=r loop exitwhen f<1.0 set f=f-1.0 endloop if f > 0.5 then
return R2I(r+1) else return R2I(r) endif endfunction function D2H takes integer i returns string
local string abc = "0123456789abcdef" local string s = SubString(abc, i / 16, i / 16 + 1) + SubString(abc, ModuloInteger(i, 16), ModuloInteger(i, 16) + 1) return s endfunction function RGB takes real red, real green, real blue returns string
local string R = D2H(PercentToInt(red,255)) local string G = D2H(PercentToInt(green,255)) local string B = D2H(PercentToInt(blue,255)) return "|c00"+R+G+B endfunction function DamageTooks takes unit u, real dmg returns nothing
local integer ui=GetHandleId(u) call SaveReal(udg_Bars,ui,4,dmg+LoadReal(udg_Bars,ui,4)) call SaveReal(udg_Bars,ui,5,(100+LoadReal(udg_Bars,ui,5))/2) call SaveReal(udg_Bars,ui,6,GetWidgetLife(u)) endfunction function TakeHPBar takes unit u returns string
local real curlife=GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE) local real PercCount=GetUnitState(u,UNIT_STATE_MAX_LIFE)/100 local integer ui = GetHandleId(u) local real damagetaken=LoadReal(udg_Bars,ui,4)/PercCount local real fade =LoadReal(udg_Bars,ui,5) local string s local real array count local integer perc =R2RI(curlife) local boolean b = damagetaken<0 if b then
set curlife = curlife+damagetaken set damagetaken = damagetaken*(0-1) endif set count[1] = I2R(R2RI(curlife))/2.5
if b==false then set count[2] = I2R(R2RI(100-curlife-damagetaken))/2.5 else set count[2] = I2R(R2RI(100-I2R(perc)))/2.5 endif set count[4] = I2R(R2I(damagetaken))/2.5
set count[3] = 0
set s = RGB(100-curlife,curlife,0) if IsUnitType(u,UNIT_TYPE_HERO) then loop
exitwhen count[3] > count[1]-1 set s = s+"("
set count[3]=count[3]+1 endloop
if b then
set count[5] =fade*0.01*curlife set s = s+RGB(100-count[5],100-count[5],0) else set s = s+RGB(fade,0,0) endif set count[3]=0
loop exitwhen count[3] > count[4]-1 set s = s+"(" set count[3]=count[3]+1 endloop set s = s+"|c00000015" set count[3]=0 loop exitwhen count[3] > count[2]-1 set s = s+"(" set count[3]=count[3]+1 endloop if fade>0 then call SaveReal(udg_Bars,ui,5,fade-5) else call SaveReal(udg_Bars,ui,4,0) call SaveReal(udg_Bars,ui,5,0) endif else set s=s+"•" endif return s
endfunction
function TakeMPBar takes unit u returns string
local real lifeperc=GetUnitStatePercent(u,UNIT_STATE_MANA,UNIT_STATE_MAX_MANA) local integer pew = R2RI(lifeperc)/100*255 local string s local real array count local integer perc =R2RI(lifeperc) set s = RGB(0,50-(100-lifeperc)/2,100-(100-lifeperc)/2) set count[1] = I2R(perc)/2.5 number of dots in coloredpart set count[2] = I2R(100-perc)/2.5 number of dots in emptypart set count[3] = 1 if IsUnitType(u,UNIT_TYPE_HERO) then loop exitwhen count[3] > count[1] set s = s+"(" set count[3]=count[3]+1 endloop set s = s+"|c00000015" set count[3]=1 loop exitwhen count[3] > count[2] set s = s+"(" set count[3]=count[3]+1 endloop else set s=s+"•" endif set u=null return s endfunction
function AddBarsTxttg takes boolean b returns texttag
local texttag t = CreateTextTag() call SetTextTagPos(t,0,0,0)
call SetTextTagText(t,"" , TextTagSize2Height(0)) call SetTextTagColorBJ(t, 100., 100., 100., 0.) call ShowTextTagForceBJ( false, t, bj_FORCE_ALL_PLAYERS ) call SetTextTagPermanent( t, b ) return t endfunction function ModBar takes texttag t,unit u,string s, player p, real x,boolean hero returns nothing
if hero then call SetTextTagText(t,s,0.0069) call SetTextTagPos(t,GetWidgetX(u) + 40 * Cos(180 * bj_DEGTORAD),GetWidgetY(u) + 40 * Sin(180 * bj_DEGTORAD), x) else call SetTextTagText(t,s,0.0299) call SetTextTagPos(t,GetWidgetX(u) + 7 * Cos(180 * bj_DEGTORAD),GetWidgetY(u) + 7 * Sin(180 * bj_DEGTORAD), GetUnitFlyHeight(u)+x) endif call ShowTextTagForceBJ(false,t,bj_FORCE_ALL_PLAYERS) if IsUnitVisible(u,p) then call ShowTextTagForceBJ(true,t, bj_FORCE_PLAYER[GetPlayerId(p)]) endif set u =null set p=null endfunction function FadeTT takes texttag t,texttag t2, real x returns nothing
if x < 1.0 then call SetTextTagColorBJ(t,100,100,100,100-x*100) call SetTextTagColorBJ(t2,100,100,100,100-x*100) else call SetTextTagColorBJ(t,100,100,100,0) call SetTextTagColorBJ(t2,100,100,100,0) endif endfunction
function SetTTState takes unit u, texttag t,player p, boolean hero, unitstate state returns nothing
if GetWidgetLife(u) > 0 then if state==UNIT_STATE_LIFE then call ModBar(t,u,TakeHPBar(u),p,140,hero) elseif state==UNIT_STATE_MANA then if GetUnitState(u,UNIT_STATE_MAX_MANA)>0 then if hero == false then call ModBar(t,u,TakeMPBar(u),p,126,hero) else call ModBar(t,u,TakeMPBar(u),p,133,hero) endif else call SetTextTagColorBJ(t,100,100,100,100) endif endif else call SetTextTagColorBJ(t,0,0,0,100) endif set u=null set p=null endfunction function AppearBar takes unit u, player p, group g returns nothing
local integer ui = GetHandleId(u) local boolean permanent = LoadBoolean(udg_Bars,ui,10+GetPlayerId(p)) local real time = LoadReal(udg_Bars,ui,1) local texttag hpbar =LoadTextTagHandle(udg_Bars,ui,2) local texttag mpbar =LoadTextTagHandle(udg_Bars,ui,3) local real lastlife =LoadReal(udg_Bars,ui,6) local real wl = GetWidgetLife(u) local boolean hero = IsUnitType(u,UNIT_TYPE_HERO) if lastlife < wl-20 then
call DamageTooks(u,0-(wl-lastlife)) call SaveReal(udg_Bars,ui,6,wl) endif call SetTTState(u,hpbar,p,hero,UNIT_STATE_LIFE)
call SetTTState(u,mpbar,p,hero,UNIT_STATE_MANA) if permanent == false then call FadeTT(hpbar,mpbar,time) set time=time-0.03 call SaveReal(udg_Bars,ui,1,time) endif if time < 0 or wl<=0 then
if permanent and hero==false and GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)>40 then
call SaveBoolean(udg_Bars,ui,10+GetPlayerId(p),false) endif if permanent==false then
call SetTextTagLifespan(hpbar,0.0) call SetTextTagFadepoint(hpbar,0.0) call SetTextTagLifespan(mpbar,0.0) call SetTextTagFadepoint(mpbar,0.0) call GroupRemoveUnit(g,u) call FlushChildHashtable(udg_Bars,ui) else if hero==false then call SetTextTagLifespan(hpbar,0.0) call SetTextTagFadepoint(hpbar,0.0) call SetTextTagLifespan(mpbar,0.0) call SetTextTagFadepoint(mpbar,0.0) call GroupRemoveUnit(g,u) call FlushChildHashtable(udg_Bars,ui) endif endif endif
set hpbar=null
set mpbar=null set u=null set p=null set g=null endfunction function GroupBar takes nothing returns nothing
local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0))) local group g=LoadGroupHandle(udg_Bars,0,pid) local unit v =null local group x=LoadGroupHandle(udg_Bars,0,30+pid) call GroupAddGroup(g,x)
loop
exitwhen CountUnitsInGroup(x) == 0 set v = FirstOfGroup(x) call AppearBar(v,Player(pid),g)
call GroupRemoveUnit(x,v) set v =null endloop call GroupClear(x)
set g=null set x=null set v=null set t=null endfunction function ShowBar takes unit u, player p, boolean permanent returns nothing
local timer t=CreateTimer() local integer ti=GetHandleId(t) local integer pid=GetPlayerId(p) local integer hi =GetHandleId(u) local group g = LoadGroupHandle(udg_Bars,0,pid) local boolean b = IsUnitInGroup(u,g) if GetPlayerController(p)==MAP_CONTROL_USER then
if b then
call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40)) else call SaveTextTagHandle(udg_Bars,hi,2,AddBarsTxttg(permanent)) call SaveTextTagHandle(udg_Bars,hi,3,AddBarsTxttg(permanent)) call SaveBoolean(udg_Bars,hi,10+pid,permanent) call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40)) call SaveReal(udg_Bars,hi,4,0) call SaveReal(udg_Bars,hi,5,0) call SaveReal(udg_Bars,hi,6,GetWidgetLife(u)) call GroupAddUnit(g,u) endif endif set g=null
set t=null set u=null set p=null endfunction function ShowBarToAll takes unit u returns nothing local integer i=0 loop exitwhen i > 15 if GetPlayerController(Player(i))==MAP_CONTROL_USER then call ShowBar(u,Player(i),true) endif set i=i+1 endloop set u=null endfunction )) прошу помочь устранить загрязнение памяти и сделать систему "легче", желательно еще и объяснив что и где не так.
P.S казалось бы - вроде уже не совсем то и нуб, но тут мои полномочия все. Отредактировано ShadoW DaemoN, 16.05.2011 в 18:55. |
16.05.2011, 18:37 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
16GB
GhostOne User
offline
Опыт:
60,317Активность: |
не увидел где создаётся группа, и ещё про группы игроков (force) мб они вызывают лаги так всё чисто |
16.05.2011, 18:56 | #2
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
16GB, так вот в том то и фишка что утечек нет, фиксированное количество утечных хэндлов
нашел баг - для каждого юнита создаются и\или перезаписываются тексттаги, поправил, однако тормозить меньше не стало.
FKoFF добавил:
» Triggers
((код jass
function f1 takes nothing returns nothing
local player p=GetOwningPlayer(GetEventDamageSource()) local unit u=GetTriggerUnit()
local player p1=GetOwningPlayer(u) call ShowBar(u,p,false) call ShowBar(u,p1,false) call DamageTooks(u,GetEventDamage()) set p=null set u=null set p1=null endfunction ===========================================================================
function InitTrig_f1 takes nothing returns nothing set gg_trg_f1 = CreateTrigger( ) call TriggerAddAction( gg_trg_f1, function f1) endfunction ))
((код jass
function Pew takes nothing returns nothing
local group g=LoadGroupHandle(udg_Bars,0,21) local unit u =GetEnumUnit() if IsUnitInGroup(u,g)==false then if IsUnitType(u,UNIT_TYPE_HERO) then call ShowBar(u,GetOwningPlayer(u),true) endif call GroupAddUnit(g,u) call TriggerRegisterUnitEvent(gg_trg_f1,u,EVENT_UNIT_DAMAGED) endif set g=null set u=null endfunction function Trig_f_Actions takes nothing returns nothing
local group g =LoadGroupHandle(udg_Bars,0,20) local integer l1 = 0 local integer l2 = 1 call GroupEnumUnitsInRect(g,GetWorldBounds(),null)
call ForGroup(g,function Pew) call GroupClear(g) set g=null endfunction ===========================================================================
function InitTrig_f takes nothing returns nothing set gg_trg_f = CreateTrigger( ) call TriggerRegisterTimerEventPeriodic( gg_trg_f, 1.00 )
call TriggerAddAction( gg_trg_f, function Trig_f_Actions ) endfunction ))
((код jass
function PrepareBar takes player p returns nothing
local timer t=CreateTimer() call SaveInteger(udg_Bars,GetHandleId(t),0,GetPlayerId(p)) call TimerStart(t,0.03,true,function GroupBar) set t=null endfunction function Trig_Selected_Actions takes nothing returns nothing
local integer i =0 local player p set udg_Bars=InitHashtable() loop
exitwhen i>15 set p =Player(i) if GetPlayerController(p)==MAP_CONTROL_USER then call PrepareBar(p) call SaveGroupHandle(udg_Bars,0,i,CreateGroup()) call SaveGroupHandle(udg_Bars,0,30+i,CreateGroup()) endif
set i=i+1
endloop call SaveGroupHandle(udg_Bars,0,20,CreateGroup())
call SaveGroupHandle(udg_Bars,0,21,CreateGroup()) call EnablePreSelect( false, false ) endfunction
===========================================================================
function InitTrig_Selected takes nothing returns nothing set gg_trg_Selected = CreateTrigger( ) call TriggerRegisterTimerEventSingle( gg_trg_Selected, 0.1 ) call TriggerAddAction( gg_trg_Selected, function Trig_Selected_Actions ) endfunction )) |
16.05.2011, 19:13 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
16GB
GhostOne User
offline
Опыт:
60,317Активность: |
мб вот это не удаляешь рект
|
16.05.2011, 19:23 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
16GB, пофиксил, лаги в момент схватки не пропали (когда для большого количества юнитов отображаются ХПбары) |
16.05.2011, 19:29 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ShadoW DaemoN
offline
Опыт:
37,078Активность: |
0. Просто...Потратил на данное сообщение около часа. Just in case.
1. Начало!Используйте Script Language Aligner, когда выкладываете код на форум - читать удобнее. Уже пофиксил первое сообщение.
К тому же, вам самому разве не удобно читать хорошо оформленный и выровненный код? 2. Что это такое?((кат за раз по чайной ложке
((код jass
function R2RI takes real r returns integer
local real f=r loop exitwhen f<1.0 set f=f-1.0 endloop if f > 0.5 then
return R2I(r+1) else return R2I(r) endif endfunction )) )) А если в качестве аргумента передадут большое значение? Будет превышен лимит операций и игра "насильно высунет функцию из памяти". Правильней будет так: ((код jass
function R2RI takes real r returns integer
if (r < 0.0) then return R2I(r - 0.5) endif return R2I(r + 0.5) endfunction )) Хотя я не думаю, что в эту функцию в данной системе передаются отрицательные значения, поэтому достаточно будет так: ((код jass
function R2RI takes real r returns integer
return R2I(r + 0.5) endfunction )) 3. Чудеса радуги!((кат трюкачество со стрингами
((код jass
function D2H takes integer i returns string
local string abc = "0123456789abcdef" local string s = SubString(abc, i / 16, i / 16 + 1) + SubString(abc, ModuloInteger(i, 16), ModuloInteger(i, 16) + 1) return s endfunction function RGB takes real red, real green, real blue returns string
local string R = D2H(PercentToInt(red,255)) local string G = D2H(PercentToInt(green,255)) local string B = D2H(PercentToInt(blue,255)) return "|c00"+R+G+B endfunction )) )) Медленно. Быстрее будет использовать уже готовые значения, то есть заполнить ОДИН массив (а не три с одинаковым содержимым, как сделали бы многие трюкачи, услышав похожий совет) и использовать типа так: ((код jass
set Hex[0] = "00"
... set Hex[255] = "FF" function RGB takes real red, real green, real blue returns string
return "|c00"+Hex[R2I(red*2.55)]+Hex[R2I(green*2.55)]+Hex[R2I(blue*2.55)] endfunction )) Лучше было бы вести расчёты процентов не в диапазоне 1..100, а 0..255. Тогда: ((код jass
function RGB takes real red, real green, real blue returns string
return "|c00"+Hex[R2I(red)]+Hex[R2I(green)]+Hex[R2I(blue)] endfunction )) 4. Двойная проверка?Ведь найдётся такой трюкач, который выйдет из игры в аккурат между двумя проверками.
((кат двойной if-then - двойная польза
((код jass
function ShowBar takes unit u, player p, boolean permanent returns nothing
. . . if GetPlayerController(p)==MAP_CONTROL_USER then . . . endfunction function ShowBarToAll takes unit u returns nothing
local integer i=0 loop exitwhen i > 15 if GetPlayerController(Player(i))==MAP_CONTROL_USER then call ShowBar(u,Player(i),true) endif set i=i+1 endloop set u=null endfunction )) )) К тому же, проверка на управление игроком встречается не только здесь. Вероятней всего, лучше будет вынести это отдельно, дабы не проверять лишний раз. Однако, я думаю, что следует сделать проверку на присутствие игрока в игре (и не в каждой функции, как вы понимаете). 5. Внимание, большое бревно на рельсах!((кат бревно
((код jass
function GroupBar takes nothing returns nothing
local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0))) local group g=LoadGroupHandle(udg_Bars,0,pid) local unit v =null local group x=LoadGroupHandle(udg_Bars,0,30+pid) call GroupAddGroup(g,x)
loop
exitwhen CountUnitsInGroup(x) == 0 set v = FirstOfGroup(x) call AppearBar(v,Player(pid),g)
call GroupRemoveUnit(x,v) set v =null endloop call GroupClear(x)
set g=null set x=null set v=null set t=null endfunction function PrepareBar takes player p returns nothing
local timer t=CreateTimer() call SaveInteger(udg_Bars,GetHandleId(t),0,GetPlayerId(p)) call TimerStart(t,0.03,true,function GroupBar) set t=null endfunction )) )) Здесь прекрасно показана ситуация, когда отец, чтобы забрать ребёнка из садика, приводит домой всех детей и каждого проверяет. Используйте ForGroup()! Кроме того, здесь присутствует отличный пример индусского кода, господа: ((код jass
local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0)))
)) 6. BJ-функции?((код jass
GetUnitStatePercent(...)
SetTextTagColorBJ(...) и ещё некоторые функции для текст-тагов )) Я думаю, не нужно объяснять, что с ними нужно сделать. 7. Насчёт читабельности кода!((кат всё просто
((код jass
set count[1] = I2R(R2RI(curlife))/2.5
if b==false then set count[2] = I2R(R2RI(100-curlife-damagetaken))/2.5 else set count[2] = I2R(R2RI(100-I2R(perc)))/2.5 endif set count[4] = I2R(R2I(damagetaken))/2.5
set count[3] = 0
)) )) Непонятно же. Если предпочитаешь использовать массивы, хотя бы напиши комментарий, какое значение хранится в каждой ячейке. Далее... ((кат адик негодует
((код jass
call SaveTextTagHandle(udg_Bars,hi,2,AddBarsTxttg(permanent))
call SaveTextTagHandle(udg_Bars,hi,3,AddBarsTxttg(permanent)) call SaveBoolean(udg_Bars,hi,10+pid,permanent) call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40)) call SaveReal(udg_Bars,hi,4,0) call SaveReal(udg_Bars,hi,5,0) call SaveReal(udg_Bars,hi,6,GetWidgetLife(u)) )) )) 2, 3, 10+pid, 4, 5, 6 - это что? Ключи совершенно не отражают сути содержимого ячеек в хэше. 8. Это выглядит как-то расточительно?((кат и немного жирно
((код jass
function Trig_f_Actions takes nothing returns nothing
local group g =LoadGroupHandle(udg_Bars,0,20) local integer l1 = 0 local integer l2 = 1 call GroupEnumUnitsInRect(g,GetWorldBounds(),null)
call ForGroup(g,function Pew) call GroupClear(g) set g=null endfunction function InitTrig_f takes nothing returns nothing
set gg_trg_f = CreateTrigger( ) call TriggerRegisterTimerEventPeriodic( gg_trg_f, 1.00 )
call TriggerAddAction( gg_trg_f, function Trig_f_Actions ) endfunction )) )) Некорректное добавление/удаление юнитов из обработки. Необходимо использовать события на вход и выход юнита из региона. 9. Это ещё не конец!В целом по коду - плохо. Совсем же недавно статья была, Распространённые ошибки Jass программистов, которая ко всему прочему ПРИКРЕПЛЕНА. Также советую почитать теоретическую информацию в Jass-библиотеке |
16.05.2011, 20:38 | #6
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
ShadoW_DaemoN:
неувязочка - там выбираются все юниты из группы g, просто удалять их из группы g не резон, для этого и есть группа x которая служит для лупа (что бы не выносить в ForGroup()) который, мало того что отдельная функция так и передача туда нужных данных (игрок, группа х) является теми еще танцами с бубном. По крайней мере функции GetCurrentGroup() я не нашел, правда, а перебирать все 2*bj_ALL_PLAYERS_FORCE группы я считаю не более рациональным действием. |
17.05.2011, 02:16 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ShadoW DaemoN
offline
Опыт:
37,078Активность: |
Конкретней про этот отрезок кода:
((код jass
exitwhen CountUnitsInGroup(x) == 0
)) которое будет просчитываться с частотой 33*N раза в секунду (33 = 1/0.03, N - кол-во юнитов в группе). Те, кто используют цикл, обычно пишут так: ((код jass
loop set v = FirstOfGroup(x) exitwhen v == null call GroupRemoveUnit(x, v) действия endloop )) Зачем вы использовали CountUnitsInGroup(...) - неясно.
|
17.05.2011, 09:07 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
долго перло:) Ето перестраховка. (дос) Отредактировано Doc, 17.05.2011 в 11:57. |
17.05.2011, 11:15 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FKoFF
Venomancer 89lvl. Europe
offline
Опыт:
5,975Активность: |
ShadoW_DaemoN:
хм? вместо таймеров переодический триггер? Ну, вы бы могли мне помочь и доработать этот кубик рубик. |
17.05.2011, 18:44 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotaMaster666
Silenced by GadenbIsh
offline
Опыт:
1,259Активность: |
А можно выложить не код, а карту с рабочей системой? И что бы там демо было, как оно да что должно работать. |
18.05.2011, 10:28 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|