Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Редактирование движка
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
abramcumner
Цитата(buffy @ 25.09.2018, 14:37) *
причём даже если все нужные её библиотеки собраны с такой-же конфигурацией.

Настрой зависимости у проектов, чтобы библиотеки нормально пересобирались. Например, чтобы можно было собирать xrGame, а она уже остальные библиотеки тянула.

Цитата
Также какая-то чехорда творится с конфигурациями.

Настрой конфигурации smile.gif В релизе микседы вообще не нужны.

Еще папки для выходных файлов лучше разделить для релиза/дебага/миксед.
atanda
Цитата(abramcumner @ 25.09.2018, 16:59) *
Настрой зависимости у проектов, чтобы библиотеки нормально пересобирались. Например, чтобы можно было собирать xrGame, а она уже остальные библиотеки тянула.


Ну вот смотри xrLua зависит от xrCore, он в свою очередь от багтрепа, а багтреп от минизип и злиб - всё настроено и все галочки поставлены wink.gif

Цитата(abramcumner @ 25.09.2018, 16:59) *
Настрой конфигурации В релизе микседы вообще не нужны.

Угу, постараюсь сам разобраться чего наворотил. Кстати, а чем отличается дебаг конфигурация от миксед - в моём случае я разницы не заметил(первый раз когда наконец собрал была конфигурация дебаг, во втором миксед, но разницы не нашёл [даже логи сравнивал biggrin.gif ])?

Цитата(abramcumner @ 25.09.2018, 16:59) *
Еще папки для выходных файлов лучше разделить для релиза/дебага/миксед.

Кстати, а как лучше ..\$(Configuration)\$(ProjectName) или ..\$(ProjectName)\$(Configuration)? Вдруг в будущем такая чехарда с файловой сист. сотворится)
И ещё, как Solution Configuration влияет на Project Configuration?

abramcumner, вот, например, сейчас нажимаю Configuration Manager в нём под xr_3da стоит Mixed, а в Configuration стоит Релиз....
abramcumner
Цитата(buffy @ 25.09.2018, 17:35) *
Ну вот смотри xrLua зависит от xrCore, он в свою очередь от багтрепа, а багтреп от минизип и злиб - всё настроено и все галочки поставлены wink.gif

А дальше? xrLua не конечная станция же. От xrLua зависят xrEngine, xrGame, xrRender. А вот они уже линкуются с xrLua через #pragma comment(lib), то есть просто с каким-то файлом, который нашелся в путях поиска либ. А от какой конфигурации он там валяется и сколько ему лет линковщик не волнует. Отсюда и ошибки.
Я бы первым делом удалил из *.cpp все "#pragma comment(lib" и сделал зависимости явными через Project Dependencies.

Цитата
Кстати, а чем отличается дебаг конфигурация от миксед

Ну ты должен был заметить разницу в производительности. В микседе половина длл релизные(например, рендеры).

Цитата
Кстати, а как лучше ..\$(Configuration)\$(ProjectName) или ..\$(ProjectName)\$(Configuration)?

1. Выносишь настройки папок в отдельный файл свойств(условно xray.props). В нем прописываешь Intermediate и Output Directories. У меня сейчас:
Output = $(SolutionDir)intermediate\$(Platform)-$(Configuration)\
Intermediate= $(SolutionDir)intermediate\$(Platform)-$(Configuration)\$(ProjectName)\
раньше еще добавлял версию студии.
2. Ко всем проектам добавляешь через View/Other Windows/Property Manager этот файл настроек. А в самих проектах ставишь пути по умолчанию.

Тогда сможешь изменить пути на любые понравившиеся в одном месте и в любое время.

Цитата
вот, например, сейчас нажимаю Configuration Manager в нём под xr_3da стоит Mixed, а в Configuration стоит Релиз....

А они никак и не связаны эти окна.
На тулбаре конфигурация солюшена. В окне ты можешь выбрать какие конфигурации проекта будет соответствовать конфигурации солюшена. Миксед как раз хороший пример такой настройки smile.gif

Ну и это все ты можешь посмотреть в существующих репозиториях. Вроде в OGSR-engine такое тоже проделали.
KrivoRuk
Всем привет. Кто может напомнить, как исправить крякозябры в окне вывода студии?
ForserX
KrivoRuk, что ж у вас всё с языковыми пакетами плохо. На инглиш переключи.
atanda
ForserX, мб что-то не так с кодировкой?
ForserX
buffy, тут проблема в ЯП пакете. Вроде, если выпадает какое-то предупреждение при сборке в 2017 студии, то вся кодировка лога летит к чертям, но это обычно на линковке. А тут просто сборка в .obj. Я уже не помню, что там было, в окси всё пофиксили.

Ай, стоп. Я тупой: включи в Свойствах проекта "Оптимизация всей программы". И всё станет нормально.
KrivoRuk
Цитата(buffy @ 27.09.2018, 19:26) *
мб что-то не так с кодировкой?

Проверял, пробовал менять - дело не в кодировке.
Цитата(ForserX @ 27.09.2018, 23:30) *
включи в Свойствах проекта "Оптимизация всей программы". И всё станет нормально.

Так включено -
Помню была такая проблема, то ли мне подсказали, то ли где на форумах прочитал - и исправил, но вот как, на каком проекте, и в какой студии, уже не помню...
Hargriev
С этим экзешником не будет конфликтов со Стим версией игры?
AndreySol
В xrGame\clsid_game.h регистрируются сеты типа
#define CLSID_DETECTOR_SIMPLE        MK_CLSID('D','_','S','I','M','D','E','T')
Если требуется проверить принадлежность инвентарного предмета к определенному классу, например к вышеозначенным детекторам, то что нужно получить от объекта и с чем сравнить ?
ForserX
AndreySol, я стараюсь проверять по dynamic_cast(аля smart_cast), но если хочется через CLSID, то:

CODE
 l_pIItem->object().CLS_ID == CLSID_DETECTOR_SIMPLE
AndreySol
В чем может быть причина несоответствия CLSID прописанного в clsid_game.h и реального CLSID инвентарного объекта ?
Добавил новый инвентарный объект, все сделал по образу и подобию уже существующих, но CLSID получаемый в игре через pIItem->object().CLS_ID не соответствует прописанному в clsid_game.h.
ForserX
AndreySol, юзай касты. Не заморачивайся.
Marafonec
Господа движкоправы, можете подсказать что делает вот этот код:
\trunk\xr_3da\xrGame\xrServer_Objects_ALife_Monsters.cpp
Код
    ////////////// Import dead body ////////////////////
    Msg    ("A mi ni hera tut ne chitaem (m_u16NumItems == %d)",m_u16NumItems);
    {
        m_BoneDataSize = tNetPacket.r_u8();
        u32 BodyDataSize = 24 + m_BoneDataSize*m_u16NumItems;
        tNetPacket.r(m_DeadBodyData, BodyDataSize);
    };

И не может ли он являться причиной подобного вылета:
Код
Expression : fatal error
Function : CInifile::r_section
File : E:\stalker\sources\trunk\xrCore\Xr_ini.cpp
Line : 342
Description : <no expression>
Arguments : Can't open section 'ac'
ForserX
Marafonec, навряд ли
AndreySol
Цитата
юзай касты. Не заморачивайся.

А по существу вопроса есть что нить ?
atanda
Цитата(buffy @ 25.09.2018, 14:37) *
Также какая-то чехорда творится с конфигурациями.

На днях решил проблемы. Понял что от чего зависит, а также разобрался в сути проблем unresolved external symbol на стадии линковки. Проблема заключалась в том, что я пытался собрать проекты с разными конфигурациями т.е. xrCore - релиз, а xrCDB - дебаг или миксед. biggrin.gif

Не повторяйте моих ошибок yes1.gif
xrModder
Цитата
Правленный xrGame для SoC 1.0004 от Kolmogor
Изменения:
1. Добавлена консольная команда fov [5.0, 180.0] - изменяет
глобальный FOV камеры.
2. Добавлена консольная команда k_ammo_on_belt [on\off] -
включает\выключает использование патронов с пояса.
3. Артефакты работают из рюкзака, а пояс служит контейнером.
Ссылка: http://rusfolder.com/42636653

Ссылка не рабочая. У кого-нибудь остались в файлах?
Cossack-HD
Классический нубский вопрос: какой самый актуальный репо под ТЧ (желательно чтобы работал с ванильными ресурсами) и с какой версией VS его есть?
RayTwitty
Цитата(xrModder @ 13.10.2018, 22:29) *
Ссылка не рабочая. У кого-нибудь остались в файлах?

Вроде бы у меня в старом архиве было:
https://yadi.sk/d/ntr7J3rMz5gso/Моды

Сборка фич.rar.
Отдельно у меня нет.
atanda
Cossack-HD, из живых вроде только огсе'шный форк. kozak.gif В принципе, не должно составить особого труда перенести на 2013 студию, в 2005 студии возможно будет собираться без правок biggrin.gif
abramcumner
buffy, ты про этот репозиторий: https://github.com/KRodinn/OGSR-Engine ?
Здесь 2017 студия.
atanda
Цитата(abramcumner @ 16.10.2018, 13:47) *
Здесь 2017 студия

Не, я, т.к. набрался опыта, теперь советую оригинальные исходники собирать z_lol1.gif
Cossack-HD
https://github.com/KRodinn/OGSR-Engine/releases/tag/1.0.318

Это я кривожопый, или этот x64 релиз неcтабилен на русской GOG версии?
Я сначала скомпилил исходники (кроме рендера, памяти не хватило) и докинул dll'ок и словил вылеты при выдаче оружия Волком и при сохранении игры. Потом полностью заюзал всё скомпилированное и несколько раз попробовал - чё-то всё нестабильно работает.

Куча невалидных обьектов в логе, а потом вот это:
log

[16.10.18 16:24:28.758] * MEMORY USAGE: 1000884 K
[16.10.18 16:24:28.758] - r__tf_aniso 16
[16.10.18 16:24:28.758] - r2_tf_mipbias 0.
[16.10.18 16:24:55.757] ##['OGSR_MEMORY_CONTROL'] MEMORY USAGE: [17320 KB]
[16.10.18 16:24:58.201] xrServer::Process_event_reject: no entity object! ID 845
[16.10.18 16:25:09.289]
FATAL ERROR

[error]exp​ression : FATAL ERROR
[error]Function : CLevel::Objects_net_Save
[error]File : c:\projects\ogsr-engine\ogsr_engine\xrgame\level_network.cpp
[error]Line : 194
[error]Description : Object [single_player][0] exceed network-data limit: size = [16778748], Pend = [16778754], Pstart = [4]


x86 тоже не пашет 3:

ЗЫ: Я хочу поиграться с формулами рассчёта урона огнестрелом и рассчёта зрения NPC, есть идеи как запилить ностоящий стелс.
Cossack-HD
Попробовал OGSR на другой машине, вроде всё норм. Накатываю студию 17.

Интересно, в чём разница между теми сборками ТЧ. Обе GOG'овские.
Cossack-HD
Где искать настройку, в какую кость целятся NPC при стрельбе?

sight_action_inline.h
"m_torso_look"
Ну вот, смотрим в торс. Как поменять? По хорошему нужен список возможных целей, чтобы NPC не пытались целиться в пупок, если у врага торчит пол туловища.

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

Предлагаю такую логику:
Можно сделать список костей по индексам, начиная с головы и заканчивая мелкими конечностями.
NPC увидел цель и перебирает все кости из списка, отсеивает невалидные и невидимые, создаёт список видимых костей.
Дальше можно сделать фильтрацию и рендомизацию для выбора самой подходящей кости.
Делать выстрел по кости.

Если ресурсоёмко, то ограничиться просто стрельбой по первой попавшейся кости из хардкодного списка.
atanda
Цитата(Cossack-HD @ 17.10.2018, 20:24) *
Где искать настройку, в какую кость целятся NPC при стрельбе?

sight_action_inline.h
"m_torso_look"
Ну вот, смотрим в торс. Как поменять? По хорошему нужен список возможных целей, чтобы NPC не пытались целиться в пупок, если у врага торчит пол туловища.

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


всё что тебе нужно находится в CSightAction::execute_object.
atanda
Тут у меня шестой билдер тупит... При попытке сборки сдк говорит, что нету пути X:\intermediate_ed\core, но путь есть. Может быть это потому что диск то у меня виртуальный, т.е. создан досовской subst?
Diesel
Цитата(buffy @ 21.10.2018, 14:00) *
Тут у меня шестой билдер тупит... При попытке сборки сдк говорит, что нету пути X:\intermediate_ed\core, но путь есть. Может быть это потому что диск то у меня виртуальный, т.е. создан досовской subst?

У этого Борланда пути коверкаются. Попробуй так путь написать:
X:/intermediate_ed/core
Типа решил Эдиторы пособирать? У нас человек-молния этим занимается, к нему за помощью надо. А я тупень в этой проге.

Компиляторы все можно в визуалке собрать, если что.
atanda
В общем, разобрался.
Да как ни странно билдер почему-то не видит виртуальные диски, но ладно прописал реальный путь - пошло билдиться(к слову говоря редакторам нужна оригинальная пысовская сборка dxsdk9).

.
.
.
.
.
.
Теперь требует D3DX_Wrapper.h где его достать - ума не приложу. Ни в оригинальном 3rd_party его нет, ни в сдк за июнь 10. Где брать?
UPD: нашёл - это файл проекта ETools - просто я неверно прописал путь к проекту. wallbash.gif

Цитата(Expropriator @ 21.10.2018, 12:04) *
А я тупень в этой проге.

Кстати, мне интерфейс борланда показался более юзер-френдли чем интерфейс студии totstalkir.gif
atanda
Цитата(Expropriator @ 21.10.2018, 12:04) *
Компиляторы все можно в визуалке собрать, если что.

Да, но у меня там проблемы со сборкой dxt.



Цитата(Expropriator @ 21.10.2018, 12:04) *
У этого Борланда пути коверкаются. Попробуй так путь написать:
X:/intermediate_ed/core

Кстати, если написать так, то при включении, например, файла bla-bla.h из директории, например, D:/prj/bla-prj, то борланд будет искать его по пути D:/prj/bla-prjbla-bla.h т.е. не поставит разделитель.
Diesel
Цитата(buffy @ 21.10.2018, 15:00) *
Да, но у меня там проблемы со сборкой dxt.

Что собираешь? ЧН точно собирается в путь. Есть там малость ньюансов в компиляторах, но выправимо.

Значит надо так:
D:/intermediate_ed/core/

Визуалка 2008 по-моему, тоже не видит виртуальные диски.
Молния в вакууме
Цитата(buffy @ 21.10.2018, 12:29) *
Да как ни странно билдер почему-то не видит виртуальные диски

Цитата(Expropriator @ 21.10.2018, 13:22) *
Визуалка 2008 по-моему, тоже не видит виртуальные диски.

Всё они видят. У вас скорее всего диски замонтированы от одного пользователя, а иде запущена от другого.
Если запускаете борланд или студию с правами администратора, диски должны быть созданы от имени администратора.

Цитата(Expropriator @ 21.10.2018, 12:04) *
У этого Борланда пути коверкаются. Попробуй так путь написать:
X:/intermediate_ed/core

О мой бог. Не надо так писать, так пишут линуксоиды. И у борланда и у студии от такого сносит башню.

Цитата(buffy @ 21.10.2018, 12:29) *
(к слову говоря редакторам нужна оригинальная пысовская сборка dxsdk9).

Официальный тоже можно использовать. Даже самый последний для DX11 за июнь 2010. Только в борланд нужно будет файлик sal.h докинуть, не помню откуда именно я его брал, думаю от студии подойдёт.
atanda
Цитата(Молния в вакууме @ 21.10.2018, 13:59) *
диски должны быть созданы от имени администратора

Я плохо прошарен в досовских командах и ключах исполнения не подскажешь как это провернуть? rolleyes.gif

Цитата(Молния в вакууме @ 21.10.2018, 13:59) *
И у борланда и у студии от такого сносит башню.

У пысов вообще некоторые пути прописаны так: dir\dir1/di2\dir3/.file и студияс всё прекрасно видит(ввс* 2013). dry.gif


*здесь и далее ввс = во всяком случае biggrin.gif
Молния в вакууме
Цитата(buffy @ 21.10.2018, 14:07) *
Я плохо прошарен в досовских командах и ключах исполнения не подскажешь как это провернуть? rolleyes.gif

Батником диск создаешь? Самое простое что могу предложить это в борланде в меню File -> Open и оттуда запустить батник (ПКМ по нему, а потом вместо пункта "Выбрать" Нажать на пункт "Открыть"). Там же можно посмотреть появился ли диск X в моём компьютере.
Можно ещё попробовать батник запустить от имени администратора.
Или командную строку от имени администратора, и там вручную subst набрать.
Вариантов куча.

Цитата(buffy @ 21.10.2018, 14:07) *
У пысов вообще некоторые пути прописаны так: dir\dir1/di2\dir3/.file и студияс всё прекрасно видит(ввс* 2013). dry.gif


*здесь и далее ввс = во всяком случае biggrin.gif

Ну смотри. В 2008 было такое, что в файле проекта xrServerEntities были неправильные слеши в путях к .obj-шкам, из за чего студия не могла его скомпилировать. Приходилось вручную проект править блокнотом.
Diesel
Цитата(Молния в вакууме @ 21.10.2018, 16:24) *
в файле проекта xrServerEntities были неправильные слеши в путях к .obj-шкам

Один из ньюансов. Там еще идентификатор левый (название не помню, что то с логикой) - второй ньюанс.
atanda
Цитата(Молния в вакууме @ 21.10.2018, 14:24) *
Ну смотри. В 2008 было такое, что в файле проекта xrServerEntities были неправильные слеши в путях к .obj-шкам, из за чего студия не могла его скомпилировать. Приходилось вручную проект править блокнотом.

Так ты про msbuild, я думал про vcpp - сорян. laugh.gif
Diesel
buffy, он про визуалку 2008
Neadez
Всем привет, я тута типа новенький)
Вопрос, наверное, заезженный, но как сделать квадратную миникарту в ЗП?
Какие файлы в xrGame редактировать и как?
Diesel
Neadez, первый раз слышу такой интересный вопрос. Найди участок кода в ранних исходниках или ЧН и ТЧ.
ForserX
Цитата(Neadez @ 21.10.2018, 17:52) *
Всем привет, я тута типа новенький)
Вопрос, наверное, заезженный, но как сделать квадратную миникарту в ЗП?
Какие файлы в xrGame редактировать и как?

В окси по экстрафитчам пройдись.
Neadez
ForserX, дык смотрел уже, но ничего не понял smile.gif

Expropriator, а где именно искать?
xrModder
Цитата(Neadez @ 21.10.2018, 20:52) *
Всем привет, я тута типа новенький)
Вопрос, наверное, заезженный, но как сделать квадратную миникарту в ЗП?
Какие файлы в xrGame редактировать и как?

Тоже самое, но наоборот.
Neadez
Как я понял, надо редактировать файл UIMap.cpp
xrModder
Цитата(Neadez @ 21.10.2018, 21:17) *
Как я понял, надо редактировать файл UIMap.cpp

Скорее UIZoneMap.cpp
Diesel
Цитата(Neadez @ 21.10.2018, 20:13) *
Expropriator, а где именно искать?


Это всё лишнее.
void CUIMiniMap::Draw()
{
u32 segments_count = 20;

UIRender->SetShader (*m_UIStaticItem.GetShader());
UIRender->StartPrimitive (segments_count*3, IUIRender::ptTriList, UI().m_currentPointType);

u32 color = m_UIStaticItem.GetTextureColor();
float angle = GetHeading();



float kx = UI().get_current_kx();

// clip poly
sPoly2D S;
S.resize (segments_count);
float segment_ang = PI_MUL_2/segments_count;
float pt_radius = WorkingArea().width()/2.0f;
Fvector2 center;
WorkingArea().getcenter (center);

float tt_radius = pt_radius/GetWidth();
float k_tt_height = GetWidth()/GetHeight();

Fvector2 tt_offset;
tt_offset.set (m_UIStaticItem.vHeadingPivot);
tt_offset.x /= GetWidth();
tt_offset.y /= GetHeight();

Fvector2 m_scale_;
m_scale_.set ( float(Device.dwWidth)/UI_BASE_WIDTH, float(Device.dwHeight)/UI_BASE_HEIGHT );

for(u32 idx=0; idx<segments_count;++idx)
{
float cosPT = _cos(segment_ang*idx + angle);
float sinPT = _sin(segment_ang*idx + angle);

float cosTX = _cos(segment_ang*idx);
float sinTX = _sin(segment_ang*idx);

S[idx].pt.set (pt_radius*cosPT*kx, -pt_radius*sinPT);
S[idx].uv.set (tt_radius*cosTX, -tt_radius*sinTX*k_tt_height);
S[idx].uv.add (tt_offset);
S[idx].pt.add (center);

S[idx].pt.x *= m_scale_.x;
S[idx].pt.y *= m_scale_.y;
}

for (u32 idx=0; idx<segments_count-2; ++idx)
{
UIRender->PushPoint(S[0+0].pt.x, S[0+0].pt.y, 0, color, S[0+0].uv.x, S[0+0].uv.y);
UIRender->PushPoint(S[idx+2].pt.x, S[idx+2].pt.y, 0, color, S[idx+2].uv.x, S[idx+2].uv.y);
UIRender->PushPoint(S[idx+1].pt.x, S[idx+1].pt.y, 0, color, S[idx+1].uv.x, S[idx+1].uv.y);
}

UIRender->FlushPrimitive ();


//------------
CUIWindow::Draw(); //draw childs
}

bool CUIMiniMap::GetPointerTo(const Fvector2& src, float item_radius, Fvector2& pos, float& heading)
{
Fvector2 clip_center = GetStaticItem()->GetHeadingPivot();
float map_radius = WorkingArea().width()/2.0f;
Fvector2 direction;

direction.sub (clip_center, src);
heading = -direction.getH();

float kx = UI().get_current_kx();
float cosPT = _cos(heading);
float sinPT = _sin(heading);
pos.set (-map_radius*sinPT*kx, -map_radius*cosPT);
pos.add (clip_center);

return true;
}

bool CUIMiniMap::NeedShowPointer(Frect r)
{
Fvector2 clip_center = GetStaticItem()->GetHeadingPivot();

Fvector2 spot_pos;
r.getcenter (spot_pos);
float dist =clip_center.distance_to(spot_pos);
float spot_radius = r.width() / 2.0f;
return (dist+spot_radius > WorkingArea().width()/2.0f);
}

bool CUIMiniMap::IsRectVisible(Frect r)
{
Fvector2 clip_center = GetStaticItem()->GetHeadingPivot();
float vis_radius = WorkingArea().width() / 2.0f;
Fvector2 rect_center;
r.getcenter (rect_center);
float spot_radius = r.width() / 2.0f;
return clip_center.distance_to(rect_center)+spot_radius < vis_radius; //assume that all minimap spots are circular
}


И еще в начале документа много надо чистить.
Neadez
Expropriator, т.е. это всё надо удалить?
Diesel
Neadez, ну вы даёте. Что бы это удалить надо еще кучу файлов перелопатить.

Проще оттолкнуться от ЧН карты.
Neadez
Тогда что с этим делать?
Diesel
Neadez, найди исходники ЧН и сравнивай. Там дофига работы, делать мало кто согласиться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.