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

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

Закрытая тема
 
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Триггерный базис v1.4 [14/04/2008]
Собственно, здесь размещается стандартный код, которого следует придерживаться в триггерной работе, написании спеллов и прочего. По мере продвижения проекта список может обновляться.

v1.4 (14/04/2008)

Код:
// --------------------------------------------------
//   >>  LIBRARY  >>  Shadow Storage v0.4 
//   >>  Simple data holding system. Attaches integer value to handle.
//   >>  by Shadow Daemon (С) 2008
// --------------------------------------------------
library ShadowStorage
    globals
        private constant integer ARRAY_SIZE = 0x1FFF
        private constant integer OFFSET     = 0x100000
        private integer array I
    endglobals
    
    private function H2I takes handle h returns integer
        return h
        return 0
    endfunction

    function SetInt takes handle h, integer i returns nothing
        local integer j = H2I(h) - OFFSET
        if j < ARRAY_SIZE then
            set I[j] = i
        endif
    endfunction
     
    function GetInt takes handle h returns integer
        local integer j = H2I(h) - OFFSET
        if j < ARRAY_SIZE then
            return I[j]
        endif
        return 0
    endfunction
    
    function RemoveInt takes handle h returns nothing
        local integer j = H2I(h) - OFFSET
        if j < ARRAY_SIZE then
            set I[j] = 0
        endif
    endfunction
endlibrary
// --------------------------------------------------
//   >>  END OF LIBRARY  >>  Shadow Storage v0.4  
// --------------------------------------------------

function H2I takes handle h returns integer
    return h
    return 0
endfunction

// --------------------------------------------------
//      Event Registration for User Players
// --------------------------------------------------
function TriggerRegisterEvent takes trigger tr, playerunitevent e returns nothing
    call TriggerRegisterPlayerUnitEvent(tr, Player(0),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(1),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(2),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(3),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(4),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(5),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(6),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(7),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(8),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(9),  e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(10), e, null)
    call TriggerRegisterPlayerUnitEvent(tr, Player(11), e, null)
endfunction

// --------------------------------------------------
//      Dummy Creation
// --------------------------------------------------
function DummySet takes nothing returns nothing
    local unit u = bj_lastCreatedUnit
    call TriggerSleepAction (0.11)
    call SetUnitScale(u, 0, 0, 0)
    set u = null
endfunction

function CreateDummy takes player p, real x, real y, real time returns unit
    local unit u = CreateUnit(p, 'ewsp', 0, 0, 0)
    call SetUnitAnimation  (u, "death")
    call SetUnitTimeScale  (u, 100)
    call UnitAddAbility    (u, 'Aloc')
    call UnitAddAbility    (u, 'AIbm')
    call UnitAddAbility    (u, 'AImb')
    call SetUnitState      (u, UNIT_STATE_MANA, 400)
    call UnitApplyTimedLife(u, 0, time)
    call UnitRemoveType    (u, UNIT_TYPE_PEON)
    call SetUnitUseFood    (u, false)
    call SetUnitPathing    (u, false)
    call SetUnitX          (u, x)
    call SetUnitY          (u, y)
    set bj_lastCreatedUnit = u
    call ExecuteFunc("DummySet")  
    return u
endfunction

function CreateMissile takes player p, real x, real y, real face, real time returns unit
    local unit u = CreateUnit(p, 'ewsp', x, y, face)
    call SetUnitAnimation  (u, "death")
    call SetUnitTimeScale  (u, 100)
    call UnitAddAbility    (u, 'Aloc')
    call UnitRemoveType    (u, UNIT_TYPE_PEON)
    call SetUnitUseFood    (u, false)
    call SetUnitPathing    (u, false)
    call UnitApplyTimedLife(u, 0, time)
    call SetUnitX          (u, x)
    call SetUnitY          (u, y)
    return u
endfunction

function I2FX takes integer i returns effect
    return i
    return null
endfunction

// --------------------------------------------------
//      Creating Temporary Effect
// --------------------------------------------------
function effect_destroy takes nothing returns nothing
    local timer t = GetExpiredTimer()
    call DestroyEffect(I2FX(GetInt(t)))
    call RemoveInt   (t)
    call DestroyTimer(t)
    set t = null
endfunction

function AddTimedEffect takes effect fx, real dur returns nothing
    local timer t = CreateTimer()
    call SetInt(t, H2I(fx))
    call TimerStart(t, dur, false, function effect_destroy)
    set t = null
endfunction

// --------------------------------------------------
//      Temporary Ability Level Changing
// --------------------------------------------------
struct abil
    unit    u
    integer id
    integer lvl
endstruct

function AddAbility_OnTime takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local abil  a = GetInt(t)
    if GetWidgetLife(a.u) > 0 then
        if a.lvl > 0 then
            call SetUnitAbilityLevel(a.u, a.id, a.lvl)
        elseif a.lvl == 0 then
            call UnitRemoveAbility(a.u, a.id)
        endif
    endif
    call a.destroy()
    call RemoveInt(t)
    call DestroyTimer(t)
    set t = null
endfunction

function AddTimedAbility takes unit u, integer id, integer lvl, real dur returns nothing
    local timer t = CreateTimer()
    local abil  a = abil.create()
    set a.u   = u
    set a.id  = id
    set a.lvl = GetUnitAbilityLevel(u, id)
    if a.lvl == 0 and lvl > 0 then
        call UnitAddAbility(u, id)
    endif
    call SetInt(t, a)
    call SetUnitAbilityLevel(u, id, lvl)
    call TimerStart(t, dur, false, function AddAbility_OnTime)
    set t = null
endfunction

// --------------------------------------------------
//      Dummy Casting
// --------------------------------------------------
function CastSpell takes unit Who, widget WTarget, location LTarget, integer SpellId, integer Level, string Cmd, real x, real y returns nothing
    local unit u = CreateDummy(GetOwningPlayer(Who), x, y, 3)
    call UnitAddAbility     (u, SpellId)
    call SetUnitAbilityLevel(u, SpellId, Level)
    if WTarget == null then
        if LTarget == null then
            call IssueImmediateOrderById(u, OrderId(Cmd))
        else
            call IssuePointOrderByIdLoc(u, OrderId(Cmd), LTarget)
        endif
    else
        call IssueTargetOrderById(u, OrderId(Cmd), WTarget)
    endif
    call UnitApplyTimedLife(u, 'BTLF', 3)
    set u = null
endfunction


Если что-то непонятно, спрашивайте.

Отредактировано ShadoW DaemoN, 14.04.2008 в 15:19.
Старый 08.06.2007, 18:47
MbYte
Tirael
offline
Опыт: 3,617
Активность:
ShadoW DaemoN, а почему тема называется "триггерный базис", если ты выложил джасс?)
Старый 10.06.2007, 19:23
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
ShadoW DaemoN, хороший код. Мне он полностью понятен.MbYte, потому что это одно и то же.
Старый 11.06.2007, 01:02
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
ShadoW DaemoN, если что-то добавляете в первом посте, то вы пишите, что добавили и что эти функции делают.
Старый 13.06.2007, 09:43
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
Shadow Daemon, оказывается, что мой мобильник в тот день выдал не все функции, и теперь оказалось, что я не всё понимаю. Не могли бы Вы разъяснить, что делают функции, начинающиеся с SCV и до конца...?
А также попрошу Вас написать общую схему реализации заклинаний, чтобы в будущем всё выглядело в "одном стиле".
Кроме того, я также дарю вам (+10) баллов за написание этих вспомогательных функций.
Старый 14.06.2007, 10:50
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sargeras, про SCV можете прочитать в статьях.
Config Access Functions - функции для записи/чтения настроек спеллов.
Debug Output - функция для вывода отладочной информации (если способность работает некорректно).
Polar Function - служебная функция для вычисления полярных координат. Все интерфейсные функции должны убирать точку, которая она создает.
Create Timed Effect - две интерфейсных функции для создания эффекта на время (EffectLoc - для точки, EffectUnit - для юнита соответственно).

Есть предложение использовать текст-таги ("плавающий текст" в Редакторе), чтобы показывать нанесенный урон, полученную ману и прочее.
Старый 16.06.2007, 13:57
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
Shadow Daemon, предлагаю добавить в триггерный базис следующую функцию, так я пользовался ею для реализации способностей героев людей:
Код:
constant function S2H takes string str returns handle
    return str
    return null
endfunction

Что она делает - думаю понятно, куда добавлять - думаю, тоже понятно. На самом деле я ввёл эту функцию как дополнительную... на тот случай, если будут возникать проблемы с игровым кешем и SCV-функциями. Добавление оставляю на ваше усмотрение.
Ах, да. Забыл. Также добавьте, пожалуйста, вот эту функцию:
Код:
constant function I2L takes integer i returns location
    return i
    return null
endfunction

Цитата:
Есть предложение использовать текст-таги ("плавающий текст" в Редакторе), чтобы показывать нанесенный урон, полученную ману и прочее.

Одобряю.
Старый 19.06.2007, 08:30
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sargeras, S2H пускай висит (для отладки), после тестирования удалю скорее всего.
I2L добавил.
Системой текст-тагов займусь на днях.
Старый 19.06.2007, 12:03
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Так, от применения локаций в эффектах решил отказаться. Соорудил новые полярные функции (в частности, для применения в EffectXY). В качестве параметра принимается объект, для которого в кэше записаны параметры для вычисления координат.
Плюс добавил функцию для вычисления шанса.
Старый 24.06.2007, 13:46
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
ShadoW DaemoN, конечно извините, но как насчёт того, чтобы добавить в свою подпись кроме Murloc Expansion информацию о нашем проекте?)))
Старый 25.06.2007, 09:16
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Обновление!
- Убрал функцию I2L, ибо локации - это зло.
- Изменил функцию временного эффекта.
- Изменил полярные функции.
- Добавил систему текст-тагов.
Старый 07.07.2007, 15:06
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
ShadoW DaemoN, спасибо за то, что не теряете мобилизации.
Старый 08.07.2007, 09:17
w3soft
ТГБ тим
offline
Опыт: 1,769
Активность:
Пипл, добавьте эти функции:

Код:
function IsDead takes unit whichUnit returns boolean
  return GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
endfunction
 
function IsAlive takes unit whichUnit returns boolean
  return GetUnitState(whichUnit, UNIT_STATE_LIFE) > 0
endfunction
 
function HasBuff takes unit whichUnit, integer buffcode returns boolean
  return (GetUnitAbilityLevel(whichUnit, buffcode) > 0)
endfunction
 
function HasAbil takes unit whichUnit, integer abilcode returns boolean
  return (GetUnitAbilityLevel(whichUnit, abilcode) > 0)
endfunction
 
function LevelOf takes unit whichUnit, integer abilcode returns integer
  return (GetUnitAbilityLevel(whichUnit, abilcode))
endfunction

function Ang takes location locA, location locB returns real
  return 57.2957 * Atan2(GetLocationY(locB) - GetLocationY(locA), GetLocationX(locB) - GetLocationX(locA))
endfunction

function Dst takes location locA, location locB returns real
  return SquareRoot(GetLocationX(locB) - GetLocationX(locA) * GetLocationX(locB) - GetLocationX(locA) + GetLocationY(locB) - GetLocationY(locA) * GetLocationY(locB) - GetLocationY(locA))
endfunction

function RemoveBuff takes unit whichUnit, integer buffcode returns boolean
  return UnitRemoveAbility(whichUnit, buffcode)
endfunction

function MyCos takes real angle returns real
 return Cos(angle * 0.01745329)
endfunction

function MySin takes real angle returns real
 return Sin(angle * 0.01745329)
endfunction

function Effect takes string Ef, unit u, string Attach, real x, real y returns nothing
  if u == null then
    call DestroyEffect(AddSpecialEffect(Ef,x,y))
  else
    call DestroyEffect(AddSpecialEffectTarget(Ef,u,Attach))
  endif
endfunction

function ForceAlly takes force sourceForce, force targetForce, boolean IsAllyy returns nothing
 local integer i = 0
 local integer j = 0
 loop
  exitwhen i == 12
  if IsPlayerInForce(Player(i),sourceForce) then
   loop
    exitwhen j == 12
    if IsPlayerInForce(Player(j),targetForce) then
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_PASSIVE,IsAllyy)
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_HELP_REQUEST, IsAllyy)
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_HELP_RESPONSE, IsAllyy)
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_SHARED_XP, IsAllyy)
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_SHARED_SPELLS, IsAllyy)
     call SetPlayerAlliance(Player(i), Player(j), ALLIANCE_SHARED_VISION, IsAllyy)
    endif
    set j = j + 1
   endloop
  endif
  set i = i + 1
 endloop
 set i = 0
 set j = 0
endfunction

function TextToForce takes force whichforce, string message returns nothing
 local integer i = 0
 loop
 exitwhen i > 9
 if IsPlayerInForce(Player(i), whichforce) then
  call DisplayTextToPlayer(Player(i),0,0,message)
 endif
 set i = i + 1
 endloop
 set i = 0
endfunction
 
//Динамический Ñ‚Ñ?иггеÑ?
function InitLocalTrigger takes code act, code con returns trigger
  local trigger t = CreateTrigger()
  if con != null then
    call TriggerAddCondition(t, Condition(con))
  endif
  call TriggerAddAction(t, act)
  return t
endfunction

//Шанс
function Sca takes integer i1 returns boolean
  return GetRandomInt(1,100) <= i1 
endfunction

//Кастовые
function CastSpell takes unit Who, widget WTarget, location LTarget, integer SpellId, string Cmd, integer Level, location from returns unit
  local unit u = CreateUnit(GetOwningPlayer(Who), 'npng', GetLocationX(from), GetLocationY(from), 0)
  call UnitAddAbility(u, SpellId)
  call SetUnitAbilityLevel(u, SpellId, Level)
  if WTarget == null and LTarget == null  then
    call IssueImmediateOrderById(u, OrderId(Cmd))
  elseif WTarget != null then
    call IssueTargetOrderById(u, OrderId(Cmd), WTarget)
  else
    call IssuePointOrderByIdLoc(u, OrderId(Cmd), LTarget)
  endif
  call UnitApplyTimedLife( u, 'BTLF',10)
  return u
endfunction

function CastMass takes unit who, location target, real radius, boolean IsEnemy, integer ID, string command, integer level, location from returns nothing
 local group tgroup = CreateGroup()
 local unit tunit = null
 call GroupEnumUnitsInRangeOfLoc(tgroup,target,radius,null)
 loop
  set tunit = FirstOfGroup(tgroup)
  exitwhen tunit == null
  if IsUnitEnemy(tunit,GetOwningPlayer(who)) == IsEnemy then
    call CastSpell(who,tunit,null,ID,command,level,from)
  endif
  call GroupRemoveUnit(tgroup,tunit)
  endloop
  call DestroyGroup(tgroup)
  set tgroup = null
  set tunit = null
endfunction
 
function ModUnitState takes unit whichunit, unitstate whichstate, real amount returns nothing
  call SetUnitState(whichunit, whichstate, GetUnitState(whichunit, whichstate) + amount)
endfunction

function RefreshAbil takes unit whichunit, integer whichID returns nothing
  local integer i = GetUnitAbilityLevel(whichunit, whichID)
  if i > 0 then
    call UnitRemoveAbility(whichunit, whichID)
    call UnitAddAbility(whichunit, whichID)
    call SetUnitAbilityLevel(whichunit, whichID, i)
  endif
  set i = 0
endfunction

function Polar takes location loc, real angle, real radius returns location
  return Location(GetLocationX(loc) + radius * MyCos(angle), GetLocationY(loc) + radius * MySin(angle))
endfunction

function W takes real r returns nothing
  call TriggerSleepAction(r)
endfunction

function SpellWait takes string command, unit who, real period returns nothing
 loop
  exitwhen GetUnitCurrentOrder(who) != OrderId(command)
  call W(period)
 endloop
endfunction

function Damage takes unit whichUnit, unit target, real damage returns boolean
  return UnitDamageTarget(whichUnit, target, damage, true, false, ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
endfunction


Мне без них очень тяжело...

w3soft добавил:
ЗАЧЕМ УБРАЛ I2L????
Как же без него???
Старый 08.10.2007, 18:22
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
w3soft, omg, хлам. Половина функций создана для того, чтобы было короче имя функции... Некоторые есть в моем базисе (но по-другому называются).
Не советую юзать локации - потом можно запутаться в хендлах и их чистке.
CastSpell и CastMass - нужные вещи.
Старый 09.10.2007, 06:16
w3soft
ТГБ тим
offline
Опыт: 1,769
Активность:
Хлам? Ну конечно, я делаю карту, где многие фуг=нкции маст хэв. Без InitLocalTrigger ваще жутко неудобно.

w3soft добавил:
Кста, про локации дурь говоришь. Я всё проверял, всё норм работает. Неужели не слышал про removeLocation()???
А ваш поляр ваще неудобный.
Старый 15.10.2007, 14:33
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
w3soft, в общем, делай свою работу, как тебе удобней=), потом сконвертим/оптимизируем.
Старый 16.10.2007, 09:36
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Обновление.
- Добавил функцию ClearTrigger - полная очистка триггера. Допустим, у нас создается триггер в функции, добавляются условия (если необходимо) и действия. Просто записываем в кеш то, что возвращают функции добавления действия/условия, а затем при выходе из триггера вызываем ClearTrigger.
- Изменил функцию CastSpell.
- Убрал функцию CastMass.
- Небольшие изменения в названиях функций.
Старый 13.11.2007, 11:37
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
ShaDoW DaemoN, а как насчёт того, чтобы создать функцию наподобие TimedFX для юнита, где будет отлавливание момента смерти и автоматическое убирание эффекта?
Старый 15.11.2007, 07:27
Freezen
Тут должен быть бред
offline
Опыт: 1,717
Активность:
Я до сих пор не могу понять зачем юзать SCV , если LHV функции намного удобнее читать и ими проще пользоваться вот код LHV:
Код:
// ===========================
function H2I takes handle h returns integer
    return h
    return 0
endfunction

// ===========================
function LocalVars takes nothing returns gamecache
    if udg_handlevars == null then
        call FlushGameCache(InitGameCache("jasslocalvars.w3v"))
        set udg_handlevars = InitGameCache("jasslocalvars.w3v")
    endif
    return udg_handlevars
endfunction

function SetHandleHandle takes handle subject, string name, handle value returns nothing
    if value==null then
        call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
    else
        call StoreInteger(LocalVars(), I2S(H2I(subject)), name, H2I(value))
    endif
endfunction

function SetHandleInt takes handle subject, string name, integer value returns nothing
    if value==0 then
        call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
    else
        call StoreInteger(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction

function SetHandleBoolean takes handle subject, string name, boolean value returns nothing
    if value==false then
        call FlushStoredBoolean(LocalVars(),I2S(H2I(subject)),name)
    else
        call StoreBoolean(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction

function SetHandleReal takes handle subject, string name, real value returns nothing
    if value==0 then
        call FlushStoredReal(LocalVars(), I2S(H2I(subject)), name)
    else
        call StoreReal(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction

function SetHandleString takes handle subject, string name, string value returns nothing
    if value==null then
        call FlushStoredString(LocalVars(), I2S(H2I(subject)), name)
    else
        call StoreString(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction

function GetHandleHandle takes handle subject, string name returns handle
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleInt takes handle subject, string name returns integer
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleBoolean takes handle subject, string name returns boolean
    return GetStoredBoolean(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleReal takes handle subject, string name returns real
    return GetStoredReal(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleString takes handle subject, string name returns string
    return GetStoredString(LocalVars(), I2S(H2I(subject)), name)
endfunction

function GetHandleUnit takes handle subject, string name returns unit
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleTimer takes handle subject, string name returns timer
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleTrigger takes handle subject, string name returns trigger
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleEffect takes handle subject, string name returns effect
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleGroup takes handle subject, string name returns group
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleLightning takes handle subject, string name returns lightning
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleWidget takes handle subject, string name returns widget
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function FlushHandleLocals takes handle subject returns nothing
    call FlushStoredMission(LocalVars(), I2S(H2I(subject)) )
endfunction
Старый 28.01.2008, 13:56
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 17,763
Активность:
Freezen, вглядываясь в код, я нахожу там глобальные переменные. Если честно, то не знаю, что и сказать. Оставлю это на усмотрение Shadow DaemoN'а.
Старый 28.01.2008, 14:05
Закрытая тема

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

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

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

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



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