XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
SRes
1110101000
offline
Опыт: 9,997
Активность:
Утечки
Хочу спросить у jass'еров XGM : есть ли в моем коде утечки ? (про TriggerRegisterAnyUnitEventBJ я знаю)
Спасибо.
» Код
Код:
globals

timer t
effect ef1
effect ef2
effect ef3
effect ef4
location loc
real angle
real rast
unit caster
integer i

endglobals
//===========================================================================
function Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction
//===========================================================================
function Eff takes nothing returns nothing

if i < 45 then
set loc = GetUnitLoc(caster)
set ef1 = AddSpecialEffect("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" ,GetLocationX(loc) + rast * Cos(angle * bj_DEGTORAD),GetLocationY(loc) + rast * Sin(angle* bj_DEGTORAD))
set ef2 = AddSpecialEffect("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" ,GetLocationX(loc) + rast * Cos((angle + 90.00) * bj_DEGTORAD) ,GetLocationY(loc) + rast * Sin((angle + 90.00) * bj_DEGTORAD))
set ef3 = AddSpecialEffect("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" ,GetLocationX(loc) + rast * Cos((angle + 180.00) * bj_DEGTORAD),GetLocationY(loc) + rast * Sin((angle + 180.00) * bj_DEGTORAD))
set ef4 = AddSpecialEffect("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" ,GetLocationX(loc) + rast * Cos((angle + 270.00) * bj_DEGTORAD),GetLocationY(loc) + rast * Sin((angle + 270.00) * bj_DEGTORAD))
set angle = angle + 10.00
set rast = rast - 10
call RemoveLocation(loc)
set loc = null
set i = i +1
call DestroyEffect(ef1)
call DestroyEffect(ef2)
call DestroyEffect(ef3)
call DestroyEffect(ef4)
set ef1 = null
set ef2 = null
set ef3 = null
set ef4 = null
   else
set caster = null
call RemoveLocation(loc)
set loc = null
call DestroyTimer(t)
endif

endfunction
//===========================================================================
function Main takes nothing returns nothing
set angle = 0
set rast = 600
set i = 1
set caster = GetSpellAbilityUnit()
set t = CreateTimer()
call TimerStart(t,0.05,true,function Eff)
endfunction
//===========================================================================
function InitTrig_ImbaSpell takes nothing returns nothing
    set gg_trg_ImbaSpell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ImbaSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_ImbaSpell, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ImbaSpell, function Main)
endfunction

Отредактировано DFlyer, 30.12.2008 в 01:02.
Старый 29.12.2008, 23:43
agentex

offline
Опыт: 34,834
Активность:
Код:
function Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction

это нада заменить на
Код:
function Conditions takes nothing returns boolean
  return GetSpellAbilityId() == 'A000'
endfunction

(это не утечка, просто оптимизация)

Цитата:
set loc = null

все обнуления провдятся в ф-ии 1 раз, и в ее конце
Цитата:
set ef1 = null
...

обнулять глобалки не нужно (это кстати относится и к loc)

ну вроде утечек нету, но вот точки лучше не юзать, они медленные

agentex добавил:
Цитата:
(про TriggerRegisterAnyUnitEventBJ я знаю)

эта функция не вызывает утечек.
Старый 30.12.2008, 00:29
SRes
1110101000
offline
Опыт: 9,997
Активность:
agentex, Спасибо. Буду знать. Насчет условия тоже знаю, т.к. просто не было смысла переделывать. И вопрос : как лучше заменить точки... юзать
» GetUnitX
Код:
constant native GetUnitX takes unit whichUnit returns real
и
» GetUnitY
Код:
constant native GetUnitY takes unit whichUnit returns real
в моем случае, а в общем ?
Старый 30.12.2008, 00:34
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
SRes, и в общем тоже.
Старый 30.12.2008, 00:40
ScorpioT1000
Работаем
offline
Опыт: отключен
TriggerRegisterAnyUnitEventBJ не утечка сам юзаю, если потребности в импорте bj нету то можно юзать

ScorpioT1000 добавил:
Код:
globals
    timer t
    effect array ef
    real x
    real y
    real angle
    real dist
    unit caster
    integer i

    integer MySpell_ID = 'A000'
    string EfPatch1 = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
endglobals
//===========================================================================

function Trig1_Eff takes nothing returns nothing
    local integer j = 1
    if i < 45 then
        set x = GetUnitX(caster)
        set y = GetUnitX(caster)
        loop
            exitwhen j > 4
            set ef[j] = AddSpecialEffect(EfPatch1, (x+ dist * Cos( (angle+j*90) * bj_DEGTORAD )) ,  (y + dist * Sin((angle+j*90)* bj_DEGTORAD)) )
            set j = j+1
        endloop 
        set angle = angle + 10.00
        set dist = dist - 10
        set i=i+1
        set j = 1
        loop
            exitwhen j > 4
            call DestroyEffect(ef[j])
            set ef[j] = null
            set j=j+1
        endloop
    else
        set caster = null
        call DestroyTimer(t)
    endif
endfunction

function Trig1_Main takes nothing returns nothing  //correct name!
    set angle = 0
    set dist = 600
    set i = 1
    set caster = GetSpellAbilityUnit()
    set t = CreateTimer()
    call TimerStart(t,0.05,true,function Trig1_Eff)
endfunction
//===========================================================================
function Trig1_Conditions takes nothing returns boolean //correct name!
    return GetSpellAbilityId() == MySpell_ID
endfunction
function InitTrig_ImbaSpell takes nothing returns nothing
    set gg_trg_ImbaSpell = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ImbaSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_ImbaSpell, Condition( function Trig1_Conditions ) )
    call TriggerAddAction( gg_trg_ImbaSpell, function Trig1_Main)
endfunction

Оптимизировал.
В работе спелла(логике) не разбирался.
Старый 30.12.2008, 01:02
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
1. Все постоянные значения (например, равкод спелла, путь к эффекту) лучше выносить в константы - так легче будет редактировать код.

2. Из неэффективных конструкций - создание и удаление точки, а также использование переменных для хранения эффектов (в данном случае это бессмысленно, в любом из приведенных вариантов эффекты создадутся и сразу удалятся).

3. По возможности в тригонометрических операциях пользоваться значениями в радианах. По сути, почти все функции, работающие с поворотами, принимают значение угла в радианах, кроме GetUnitFacing и SetUnitFacing (они возвращают значение в градусах).

4. Каждый раз создавать и удалять таймер не очень эффективно. Лучше стартовать и паузить.

Учитывая вышеприведенные тезисы, код должен получиться примерно таким:
Код:
scope ImbaSpell

globals
  private constant string FX = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
  private constant integer SPELL_ID = 'A000'
  // -----
  private timer t = null
  private real angle
  private real rast
  private unit caster = null
  private real x
  private real y
  private integer i
endglobals
//===========================================================================
private function Conditions takes nothing returns boolean
  return GetSpellAbilityId() == SPELL_ID
endfunction
//===========================================================================
private function Eff takes nothing returns nothing
  if i < 45 then
    set x = GetUnitX(caster)
    set y = GetUnitY(caster)
    call DestroyEffect(AddSpecialEffect(FX, x + rast * Cos(angle),        y + rast * Sin(angle))
    call DestroyEffect(AddSpecialEffect(FX, x + rast * Cos(angle + 1.57), y + rast * Sin(angle + 1.57))
    call DestroyEffect(AddSpecialEffect(FX, x + rast * Cos(angle + 3.14), y + rast * Sin(angle + 3.14))
    call DestroyEffect(AddSpecialEffect(FX, x + rast * Cos(angle + 4.71), y + rast * Sin(angle + 4.71))
    set angle = angle + 0.1745  // angle = angle + 10.0 * bj_DEGTORAD
    set rast  = rast  - 10.0
    set i = i + 1
  else
    set caster = null
    call PauseTimer(t)
  endif
endfunction
//===========================================================================
private function Main takes nothing returns nothing
  set caster = GetSpellAbilityUnit()
  set angle = 0.0
  set rast = 600.0
  set i = 1
  call TimerStart(t, 0.05, true, function Eff)
endfunction
//===========================================================================
function InitTrig_ImbaSpell takes nothing returns nothing
  local trigger tr = CreateTrigger()
  call TriggerAddAction   (tr, function Main)
  call TriggerAddCondition(tr, Condition(function Conditions))
  // --->>
  call TriggerRegisterAnyUnitEventBJ(tr, EVENT_PLAYER_UNIT_SPELL_CAST)
  // <<---
  set t = CreateTimer()
endfunction

endscope

5. И, кстати, спелл у тебя не MUI. Проще говоря, если два юнита одновременно применят спелл, то будут глюки. Как решить? Забивать данные в параллельные массивы, в лупе (который в таймере) пробегаться по элементам параллельных массивов и делать нужные действия с объектами.
Старый 30.12.2008, 10:58
SRes
1110101000
offline
Опыт: 9,997
Активность:
Намудрили... Ладно буду разбиратся.
P.S. Это не спел. Это я от нефиг делать взялся перевести работу друга которая убивала вар за 4 юза этого спела в jass с оптимизацией
Вот,если кому интересно то чего я добился...
Прикрепленные файлы
Тип файла: w3x 12345.w3x (22.3 Кбайт, 16 просмотров )

Отредактировано SRes, 30.12.2008 в 12:02.
Старый 30.12.2008, 11:12
ScorpioT1000
Работаем
offline
Опыт: отключен
ShadoW DaemoN, ты бред сделал) там можно норм циклом разумней как у мну не мог мой код исправить
Старый 30.12.2008, 14:14
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
SC, я за аргументацию, а ты видно не только против, да еще и не шаришь. И в следующий раз попробуй расставлять запятые в предложениях.
Цитата:
Оптимизировал.
В работе спелла(логике) не разбирался.
  • У тебя оптимизация поверхностная.
  • Не понимаю, зачем делать цикл, если вместо цикла можно написать 4 строчки?
  • Вопрос лично тебе - зачем эффекты заносить в массив, а после нескольких арифметических действий убирать? То же самое будет, если написать 4 строчки (см. мой пост). Если почти нет разницы, зачем писать больше?

SRes, хмм... Я бы сказал, что ты делаешь успехи =)
Некоторые замечания:
  • Зачем функции SinX и CosX, если SinBJ и CosBJ делают то же самое? Это пара ненужных функций из серии DoNothingBJ(). Лучше инлайнить.
  • Зачем параллельные массивы, если все равно можно запустить одновременно только 1 спелл?

Я, к примеру, делаю MUI примерно так:
Код:
struct myspell
  static myspell array spells
  static integer count = 0
  integer a
  boolean b
  real c
  // . . .
endstruct

globals
endglobals

function OnTimer takes nothing returns nothing
  local integer i = myspell.count
  loop
    exitwhen i == 0

    // действия спелла
    set myspell.spells[i].a = myspell.spells[i].a + 1
    set myspell.spells[i].c = myspell.spells[i].c + (myspell.spells[i].a / 2.0)
    set myspell.spells[i].b = myspell.spells[i].c > 1.0

    // условие прекращения действия спелла
    if myspell.spells[i].b then
      // здесь очищаются объекты (группы, эффекты), использованные в спелле
      // . . .

      // упаковка массива
      set myspell.spells[i] = myspell.spells[myspell.count]
      set myspell.count = myspell.count - 1

      // чтобы обработался экземпляр, которым заменили удаленный элемент
      set i = i + 1
    endif

    set i = i - 1
  endloop
endfunction

function Actions takes nothing returns nothing
  // выделение места в массиве для данных спелла
  set myspell.count = myspell.count + 1
  set myspell.spells[myspell.count] = myspell.create()

  // задание начальных параметров спелла
  set myspell.spells[myspell.count].a = -10
  set myspell.spells[myspell.count].b = false
  set myspell.spells[myspell.count].c = 0.0
endfunction

Отредактировано ShadoW DaemoN, 30.05.2009 в 18:26.
Старый 30.12.2008, 17:56
SRes
1110101000
offline
Опыт: 9,997
Активность:
ShadoW DaemoN, Удобно. Надо попробывать использовать структуры
Спел можно запустить и 2 раза в одно время,но нельзя миллисекунда в миллисекунду, т.е. конфликтуют где-то переменные...
У меня ошибка... при проверке Jass Helper'ом Expected [size] . Указывает на переменные в структуре.

Отредактировано SRes, 30.12.2008 в 19:39.
Старый 30.12.2008, 19:25
SRes
1110101000
offline
Опыт: 9,997
Активность:
Прошу подсказать где я допустил ошибку...
Цитата:
при проверке Jass Helper'ом Expected [size] . Указывает на переменные в структуре.
Старый 31.12.2008, 11:42
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
SRes, код в студию.

Хмм... хотя я рискну предположить, что у тебя написано что-то вроде:
Код:
struct imbaspell
  unit array caster
  real array x
  real array y
  // . . .
endstruct

Структура, грубо говоря, это одна ячейка в массиве. Так что не нужно вкладывать туда массивы, если ты конечно не хочешь сэкономить место. Плюс, массивы не получится вложить в структуру, если неизвестен их размер.
Старый 01.01.2009, 12:09
SRes
1110101000
offline
Опыт: 9,997
Активность:
ShadoW DaemoN, Да, предположил ты верно
Код:
struct st
    timer array t
    real array angle
    real array rast
    unit array caster
    integer array i
endstruct

Так... значит структуры между собой не будут конфликтовать ? Это хорошо... Щас проверим.
Add : JassHelper говорит :"caster is not an static member of st"
Код:
local real x = GetUnitX(st.caster)

» Полный код
Код:
struct st
    timer t
    real angle
    real rast
    unit caster
    integer i
endstruct

globals

st array spell
integer count = 0
string effect_fx = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
integer SPELL_ID = 'A000'

endglobals
//===========================================================================
function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SPELL_ID
endfunction
//===========================================================================
            function Eff takes nothing returns nothing
local real x = GetUnitX(st.caster)
local real y = GetUnitY(st.caster)
set can_use = 1
if st.i < 45 then
    call DestroyEffect(AddSpecialEffect(effect_fx ,x+ st.rast * CosBJ(st.angle),y + st.rast * SinBJ(st.angle)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + st.rast * CosBJ(st.angle + 90.00) ,y + st.rast * SinBJ(st.angle + 90.00)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + st.rast * CosBJ(st.angle + 180.00),y + st.rast * SinBJ(st.angle + 180.00)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + st.rast * CosBJ(st.angle + 270.00),y + st.rast * SinBJ(st.angle + 270.00)))
    set st.angle = st.angle + 10.00
    set st.rast = st.rast - 10
    set st.i = st.i +1
else
    call DestroyTimer(st.t)
endif

            endfunction
//===========================================================================
function Main takes nothing returns nothing

    set count = count + 1
    set spell[count] = st.create()
    set st.angle= 0
    set st.rast= 600
    set st.i = 1
    set st.caster = GetSpellAbilityUnit()
    set st.t = CreateTimer()
    call TimerStart(st.t,0.05,true,function Eff)
    
endfunction
//===========================================================================
function InitTrig_ImbaSpell takes nothing returns nothing
    set gg_trg_ImbaSpell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ImbaSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_ImbaSpell, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ImbaSpell, function Main)
endfunction
Старый 01.01.2009, 15:36
J
expert
offline
Опыт: 48,447
Активность:
SRes, caster - это не статичная переменая, получать к ней доступ нужно через экзепляр структуры, а не через саму структуру...
Старый 01.01.2009, 16:28
SRes
1110101000
offline
Опыт: 9,997
Активность:
Короче.. бред какой-то
» Код
Код:
struct st
    timer t
    real angle
    real rast
    unit caster
    integer i
endstruct

globals

st array spell
integer count = 0
string effect_fx = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
integer SPELL_ID = 'A000'

endglobals
//===========================================================================
function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SPELL_ID
endfunction
//===========================================================================
            function Eff takes nothing returns nothing
local real x = GetUnitX(spell[count].caster)
local real y = GetUnitY(spell[count].caster)
if spell[count].i < 45 then
    call DestroyEffect(AddSpecialEffect(effect_fx ,x+ spell[count].rast * CosBJ(spell[count].angle),y + spell[count].rast * SinBJ(spell[count].angle)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[count].rast * CosBJ(spell[count].angle + 90.00) ,y + spell[count].rast * SinBJ(spell[count].angle + 90.00)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[count].rast * CosBJ(spell[count].angle + 180.00),y + spell[count].rast * SinBJ(spell[count].angle + 180.00)))
    call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[count].rast * CosBJ(spell[count].angle + 270.00),y + spell[count].rast * SinBJ(spell[count].angle + 270.00)))
    set spell[count].angle = spell[count].angle + 10.00
    set spell[count].rast = spell[count].rast - 10
    set spell[count].i = spell[count].i +1
else
    call DestroyTimer(spell[count].t)
endif

            endfunction
//===========================================================================
function Main takes nothing returns nothing

    set count = count + 1
    set spell[count] = st.create()
    set spell[count].angle= 0
    set spell[count].rast= 600
    set spell[count].i = 1
    set spell[count].caster = GetSpellAbilityUnit()
    set spell[count].t = CreateTimer()
    call TimerStart(spell[count].t,0.05,true,function Eff)
    
endfunction
//===========================================================================
function InitTrig_ImbaSpell takes nothing returns nothing
    set gg_trg_ImbaSpell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEcountentBJ( gg_trg_ImbaSpell, EcountENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_ImbaSpell, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ImbaSpell, function Main)
endfunction

Ругается на syntax error в первой строчке и после пошло поехало еще ошибки...
Старый 01.01.2009, 18:10
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Я вижу здесь только одну ошибку:
Код:
call TriggerRegisterAnyUnitEcountentBJ(gg_trg_ImbaSpell, EcountENT_PLAYER_UNIT_SPELL_CAST)
// <><><><><>
call TriggerRegisterAnyUnitEventBJ(gg_trg_ImbaSpell, EVENT_PLAYER_UNIT_SPELL_CAST)

Проверь, включен ли у тебя JassHelper (JassHelper => Enable JassHelper)


Scorpio, рано радуешься =), цикл совсем по другому поводу там.


Что касается кода, то здесь опять не все гладко...
Код:
struct st
    // создавать и удалять таймер для каждого примененного спелла неэффективно
    //timer t
    real angle
    real rast
    unit caster
    integer i

    // данный метод будет вызываться при вызове метода .destroy()
    method onDestroy takes nothing returns nothing
      set .caster = null
    endmethod
endstruct

globals
  st array spell
  integer count = 0
  // лучше использовать один таймер и в нем перебирать все запущенные спеллы
  timer t = null
  string effect_fx = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
  integer SPELL_ID = 'A000'
endglobals
//===========================================================================
function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SPELL_ID
endfunction
//===========================================================================
function Eff takes nothing returns nothing
  local real x = 0.0
  local real y = 0.0
  local integer i = count
  
  loop
    exitwhen i == 0
    // условие продолжения действия спелла
    if spell[i].i < 45 then
      // спелл продолжает работать
      set x = GetUnitX(spell[i].caster)
      set y = GetUnitY(spell[i].caster)
      call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[i].rast * CosBJ(spell[i].angle),         y + spell[i].rast * SinBJ(spell[i].angle)))
      call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[i].rast * CosBJ(spell[i].angle + 90.00) ,y + spell[i].rast * SinBJ(spell[i].angle + 90.00)))
      call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[i].rast * CosBJ(spell[i].angle + 180.00),y + spell[i].rast * SinBJ(spell[i].angle + 180.00)))
      call DestroyEffect(AddSpecialEffect(effect_fx ,x + spell[i].rast * CosBJ(spell[i].angle + 270.00),y + spell[i].rast * SinBJ(spell[i].angle + 270.00)))
      set spell[i].angle = spell[i].angle + 10.00
      set spell[i].rast = spell[i].rast - 10
      set spell[i].i = spell[i].i + 1
    else
      // подчищаем
      call spell[i].destroy()
      set spell[i] = spell[count]
      set count = count - 1
      set i = i + 1

      // если нет запущенных спеллов, поставить таймер на паузу
      if count == 0 then
        call PauseTimer(t)
      endif

    endif

    set i = i - 1
  endloop
  
endfunction
//===========================================================================
function Main takes nothing returns nothing
    // если запущенных ранее спеллов не было, запускаем таймер
    if count == 0 then
      call TimerStart(t, 0.05, true, function Eff)
    endif
    set count = count + 1
    set spell[count] = st.create()
    set spell[count].angle = 0
    set spell[count].rast = 600
    set spell[count].i = 1
    set spell[count].caster = GetSpellAbilityUnit()
    //set spell[count].t = CreateTimer()
    //call TimerStart(spell[count].t, 0.05, true, function Eff)
endfunction
//===========================================================================
function InitTrig_ImbaSpell takes nothing returns nothing
    set gg_trg_ImbaSpell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ImbaSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_ImbaSpell, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ImbaSpell, function Main)
    
    set t = CreateTimer()
endfunction
Старый 01.01.2009, 18:57
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 18:51.