Перейти к контенту
Zeka1996Korneev

Уроки по модостроению

Рекомендуемые сообщения

Наткнулся на такую вот обучалочку по восстановлению вырезанных мутантов в зове припяти:

 

Новые монстры


Введение
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.
Для примера возьму кошек (уж очень они мне нравятся)
Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().
Вылет при появлении
Обычно сопровождается сообщением в логе:
Arguments : Can't open section 'cat_weak'
Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция
[m_cat_e]:monster_base
Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида
[cat_weak]:m_cat_e
то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:
Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak]
Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:
smart_terrain_choose_interval = 00:15:00
Запускаем, вылетаем с ошибкой:
Arguments : Can't find variable satiety_threshold in [cat_weak]
Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.
Ну, на всякий случай, нужно добавить еще две строчки:
critical_wound_threshold = 0.4
critical_wound_decrease_quant = 0.
После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит
Вылет при убийстве
Это знаменитая ошибка:
Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........
Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.
Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной
local killCountProps = {...}
в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:
cat_weak = 1, cat_normal = 2, cat_strong = 3,
Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:
monster_classes = {
кошек нет и здесь, добавляем:
[clsid.cat_s] = "cat",
Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.
Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:
· is_object_monster(obj)
кошек нет, добавляем рядом с собаками:
otype == clsid.cat or
· IsMonster (object, class_id)
кошки есть, ничего не трогаем.
Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку
cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")
и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился
Вылет при обыске
Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.
Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.
Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки )
Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем
icon = ui_frame_error_sign_red
Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.
Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.
Внимание!!!
Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет

 

Изменено пользователем HellRatz
Ссылка на комментарий

Два подобных урока по распаковке ресурсов Крайэнгине.

Смотреть на облаке.

Прошу не ругать за не совсем сталкеровскую тему, но это поможет подготовить модели и текстуры к работе в редакторах.

 

Ну, и пара уроков для Сталкера.

Изменено пользователем Дизель

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

Пытался создать спальный мешок согласно посту http://www.amk-team.ru/forum/topic/6458-uroki-po-modostroeniiu/?p=645126

При попытке использовать мешок ловлю вылет с вот таким логом:

Expression : fatal error

 

Function : CScriptEngine::lua_error

 

File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

 

Line : 73

 

Description : <no expression>

 

Arguments : LUA error: ... \gamedata\scripts\bind_stalker.script:192: attempt to index global 'main_sleep' (a nil value)

Похоже в скрипте main_sleep.script где то автором закралась ошибка.

Кто не будь тэстил сей пример?

Моя нычка номер 1, Нычка номер 2

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

@UriZzz, скорее не автором, а тем, кто оформлял статью. Нужно убрать лишние теги code (строка 107) и \code (в конце) из портянки про main_sleep.script.

Ссылка на комментарий
@Charsi, сработало благодарю:), как я понимаю это просто мод на каратание времени. Но как можно реализовать сон как потребность, что бы гг через некоторое время захотелось спать (начало двоится в глазах, в углу появилась иконка сигнализирующая о том что мол пора баиньки) в этом скрипте как я понимаю, такого нет? Изменено пользователем UriZzz

Моя нычка номер 1, Нычка номер 2

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

Доброго времени суток, кто нибудь пож. ткните меня носом в урок, где полностью расписаны смарт-каверы, то что имеется на "сталкерине" не подxодит, я xочу полностью разобраться в принципе его работы... Заранее спасибо.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

СОЗДАНИЕ РАДИО ДЛЯ ЗОВ ПРИПЯТИ .

Этот метод работает на всех версиях ЗП а также и в модификациях ЗП .

Работа в Level Editore( sdk-07)
1.Открываем локацию и камерой ищем место для приёмника(радио)
2.В Level Editore жмём вкладку spawn element , ищем пункт elektrotexnika и в этом пункте ищем priemnik_gorizont.
Жмём мышкой на priemnik_gorizont, потом мышкой на чайник который находится в верхнем левом углу Level Editor, когда нажали чайник потом мышкой жмём на то место где должен стоять приёмник , нажали и он появился и нажимаем клавишу enter , откроются опции приёмника.
В опциях приёмника в разделе Custom data , пишем ссылку на логику радио.
[logic]
cfg=scripts\mar_baz_mafon.ltx

А также в опциях приёмника в разделе Fixed bones , выбрать (link) это означает что приёмник не движим.

И так приёмник поставили и прописали в Level Editore работа оканчена , жмём save потом жмём MakeGame и соберётся спавн и на этом LevelEditor закрываем.
Потом батник компиляции спавна запускаем и когда он отработал надо скопировать спавн локации и вставить в игру и переименовать в all.spawn.

Создаём файл логики для нашего приёмника (радио).
1.Открываем папки (или создаём) gamedata\configs\scripts:
Вот в папке scripts и создаём файл логики:
mar_baz_mafon.ltx. Создали и открываем и пишем ему логику , день \ночь тоесть днём играют дневные мелодии а ночью ночьные, это
Сделано для того что днём играет весёлая и.т.д
А ночью спокойная ведь спят сталкера.

Открыли файл (mar_baz_mafon.ltx)
И пишем.
[logic]
active=sr_idle@day

[sr_idle@day]
on_info = ℅=play_sound(day_muzic_baz)%
on_info = sound_end| {!is_day}sr_idle@night

active = sr_idle@night

[sr_idle@night]
on_info = %=play_sound(night_music_baz)%
on_signal = sound_end| {=is_day}sr_idle@day

Вот и написали логику ,сохраняем файл и закрываем.

Регистрируем мелодии.
Открываем папки (или создаём)
gamedata\configs\misc:
Открываем папку misc и ищем файл script_sound.ltx (если нет его, то можно его взять из оригинала игры ,gamedataUE)
Открываем файл script_sound.ltx и вверху допишем ссылку на файл
#include"script_sound_имя вашей локации.ltx"
Потом после строчки wait пишем имя наших файлов
wait

day_muzic_baz
night_music_baz

Потом ниже пишем вот это
[day_music_baz]
type = 3d
path = music\day_music_baz_
shuffle = rnd
idle = 0,0,100

[night_music_baz]
type = 3d
path = music\night_music_baz_
shuffle = rnd
idle = 0,0,100

В папке misc:
Открываем файл script_sound_имя вашей локации.ltx (или создаём и открываем)
И пропишем количество ваших милодий
Вот так и пишем:
[list_script_sound_имя вашей локации]
day_music_baz_1
day_music_baz_2
day_music_baz_3
night_music_baz_1
night_music_baz_2
night_music_baz_3

Открываем папки gamedata\sounds\music: (или создаём)
Вот в папку music и надо вставить ваши музыкальные файлы в формате (ogg)

Открыли папку music и вставили файлы
day_music_baz_1.ogg
day_music_baz_2.ogg
day_music_baz_3.ogg
Это и есть дневные файлы мелодий
night_music_baz_1.ogg
night_music_baz_2.ogg
night_music_baz_3.ogg
Это и есть ночьные файлы мелодий
Добавить можно сколько захотите , главное соблюдать номерацию 1,2,3,4,5,6 и.т.д
Всё заходим в игру и слушаем радио

.

post-43423-0-06431400-1485849907_thumb.jpg

Изменено пользователем BFG
Добавлено  BFG,

Под спойлер такие посты !!!

Ссылка на комментарий

Оффтоп переехал в эту тему. В шапке красным по белому написано для чего эта тема и куда обращаться с вопросами.

GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Куча раритетных модов на моем облаке — на память о былом.

JNCR — Coming Soon...

i5-10400F / RAM 16GB / GTX 1660 Super / 1TB HDD+256GB SSDm2 / Win 11 PRO x64 / Samsung Curved 27" x2

Ссылка на комментарий

Всем привет! Когда я только начинал моддинг я много не знал и мне приходилось тратить дни на поиск в оригинале и делать все под себя. А речь пойдет о том как сделать рабочую дверь, для опытных модостроителей это проше просто но это статья для новичков, опытные можете уходить тут не чего интересного не будет. Спавн двери это очень просто, приступим

 

Чтобы заспавнить нашу дверь, надо зайти в spawn_element\physics\door

 

После спавна, нажимаем на наш объект и жмем Enter в Custom Date пишем:

Скрытый текст

 

[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = configs\scripts\chast_voinay\cha_door_kpp.ltx    - здесь указан путь до нашей логики, меняем ее на нашу. ОБЯЗАТЕЛЬНО С  LTX !!

 

 

С сдк все, теперь с самой логикой для новичков постараюсь описать каждый параметр 

Скрытый текст

 

[logic]
active = ph_door@closed - Активная секция

[ph_door@closed] - название секции
closed = true - подтверждает что дверь будет закрыта
locked = false  - отвергает что дверь будет открыта
on_use = ph_door@open - после конца этой секции активирует секцию под именем ph_door@open
snd_open_start = trader_door_open_start - это знать не обязательно
snd_close_start = trader_door_close_start - это знать не обязательно
snd_close_stop = trader_door_close_stop - это знать не обязательно

[ph_door@open]
closed = false - все тоже самое
locked = false - все тоже самое
on_game_timer = 50 | ph_door@closed - через 5 секунд логика перейдет на секцию ph_door@closed
snd_open_start = trader_door_open_start - это знать не обязательно
snd_close_start = trader_door_close_start - это знать не обязательно
snd_close_stop = trader_door_close_stop - это знать не обязательно

 

 

Сохраняем, компилируем спавн и идем проверять в игре.

 

 

Изменено пользователем HellRatz
Ссылка на комментарий

Может кому и пригодиться. Скажу сразу, я скачал эти скрипты очень давно и автора не помню, просто решил залить.

 

https://pastebin.com/HZmycLBW

 

Изменено пользователем HellRatz
Убрал ахтунг
Добавлено  HellRatz,

Не знаю что это за чудо-юдо было на пол страницы, перетащил это все на пастебин. Остальные посты не понятно к чему - снес.

Ссылка на комментарий

Внесу свою толику. Карты локаций из СГМ 2.2

Смарты на картах пронумерованы, описание и координаты записаны в текстовиках. Может пригодиться для модов на основе СГМ или чистой ЗП (смарты на локациях из ЗП точно не изменялись) для настройки телепортов и заселения локаций. 

Скачать

Ссылка на комментарий
В 23.07.2013 в 11:12, Сталкер Лом сказал:

Так что новой вкладки мы не получим - только кнопочка. Даже не расскажу, как это окно сделать, т.к. я пробовал и у меня, пока, ничего не вышло. Будем пытаться, а пока - всё.

Скажите пожалуйста, ув. Сталкер Лом, появилось ли какое-либо решение данной проблемы (добавление gui поверх предыдущего в пда) до сегодняшнего дня? Если да, был бы очень признателен узнать об этом подробнее. А также хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры. Заранее спасибо.

Ссылка на комментарий
17 часов назад, Den “Angry Wolf” Koslov сказал:

...хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры

В дополнении к тому, что я вам черканул в ЛС :)
Сам я правку не смотрел, но, предполагаю, что в движке подправились данные о количестве правок и, по большому счёту, всё. Эти правки очень старые. Может быть, сегодня уже есть что-то посерьёзнее увеличения количества (а не функционала) вкладок, но я не знаю - давно уже этой темой не интересовался.

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий

Внесу свою скромную лепту в пользу новисам и не только:)

Скрытый текст

Наверное многие из вас знают, что в ваниле На свалке и Арм. складах сталкеры часто помирали в кострах, в связи с чем такие песы как бес, волк и юрик покидали нас:(

Так вот, чтобы этого не было, надо сделать следующее:

1. Распаковать all.spawm или открыть уровень в level editor-e

2. Найти среди спавн объектов space_restrictor-ы с именем camp_fire_номер.

3. Смотрим и видим (restrictor_type = 3)!!! В чём суть спрсите вы?. А вот в чём - в игре есть несколько типов рестрикторов и всё они имеют разную функцию

(инфа взята с сайта http://stalkerin.gameru.net.

Скрытый текст

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



restrictor_type = 0      ;eDefaultRestrictorTypeOut
restrictor_type = 3      :eRestrictorTypeNone

Эти два типа - простые рестрикторы. В чем их отличие - непонятно. "restrictor_type = 0" - в зоне этого рестриктора нпс не подчиняются логике просто будут стоять на месте, лучше этот тип вообще не использовать



restrictor_type = 1      ;eDefaultRestrictorTypeOut
restrictor_type = 5      ;eRestrictorTypeOut

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



restrictor_type = 2      ;eDefaultRestrictorTypeIn
restrictor_type = 4      ;eRestrictorTypeIn

Эти два типа имеют смысл для движка и подразумевают собой зону, куда нельзя войти. Такими зонами накрывают костры и арену в баре

И помните IN и OUT рестрикторы (типы 1,2,4,5) имеют смысл только для НПС

Как вы уже прочли, костер накрыт не тем рестриктором. 

4.Меняем restrictor_type с  3 на 2 (или в редакторе ставим IN defoult resrtictor). 

5. Пакуем спавн и вуаля! - стакеры в костре не мрут!!!!:D

Главное, чтобы рестриктор был достаточно большим,чтобы накрыть костёр и область вокруг него, дабы в случае толкучки боты не затолкали себя в костёр сами.

Всем удачи в создании лагерей и посиделок у костра;)

 

Добавлено  HellRatz,

А почему бы просто не убрать урон от костра в конфиге в одной строке (ну или паре) ? :)

Лучше сделать мод с 0, чем пытаться залатать багованный.

Ссылка на комментарий
Цитата

А почему бы просто не убрать урон от костра в конфиге в одной строке (ну или паре) ? 

Тогда ГГ не получит урон,а это же нереалистично!)

 

Скрытый текст

пардон, по ходу тут нельзя отвечать в этой теме... Слышу как за мной вылетели админы на черных вертолетах. Просьба не пинать ногами)

 

Изменено пользователем BeeRseK

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий
Скрытый текст

Всем привет!

В этой теме есть замечательный скрипт на пост-еффект при критическом попадании за авторством АМК Team

Скрытый текст

Создаем файл effect_blood.script и записываем туда следующее:

lite_treshold = 0.05 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб экран окрасился в красный crit_treshold = 0.30 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать drop_item_on_crit_prob = 0.20 -- вероятность того что ГГ выронит оружие effector_power_coeff = 0.7 prev_health = -1 chk_h_t = 0 function wounded_pp_update()   if (chk_h_t or 0) < time_global() then     chk_h_t = time_global()+1000     if prev_health > (db.actor.health + lite_treshold) then       level.add_pp_effector("fire_hit.ppe", 2011, false)       local effector_power = (prev_health - db.actor.health)*100*effector_power_coeff       level.set_pp_effector_factor(2011, effector_power)       if prev_health > db.actor.health + crit_treshold then         level.add_cam_effector("camera_effects\\fusker.anm", 999, false, "")             local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])         snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)         if math.random() < drop_item_on_crit_prob then           local active_item = db.actor:active_item()           if active_item and active_item:section() ~= "bolt" and active_item:section()~= "wpn_knife" then             db.actor:drop_item(active_item)           end         end       end     end     prev_health = db.actor.health   end end

2. Далее открываем bind_stalker.script:
после строчек:

 

function actor_binder:update(delta)   object_binder.update(self, delta)   local time = time_global()   game_stats.update (delta, self.object)

пишем:

effect_blood.wounded_pp_update()

У этого скрипта есть один недостаток: проблема в том что скрипт порой срабатывает с запозданием где то в пол секунды (или около того) после получения хита, смотрится ужасно. Я думаю (поправьте если ошибаюсь) это из-за того что скрипт повешен на апдейт и скорость срабатывания зависит от частоты апдейта. Что бы решить эту проблему без какой нибудь скриптовой чёрной магии придется править движок. Спокойно, не каких тут разборов языка C++ небудет, обойдёмся без взрыва мозга и воспользуемся самым доступным вариантом - X-Ray extensions. Скачать последнюю сборку от @НаноБот можно От сюда. Конкретно нам нужен кэлбэк на хит актора, в чистом движке ТЧ его нет, за то он есть в XRay ext и в большинстве сборок седьмого патча. С помощью xray ext пропатчиваем (мудрить с корректен листом не обязательно, достаточно пропатчить на дефолтных настройках) файл xrGame.dll (он уже есть в 230й сборке),  кидаем dllку в папку bin в корне игры и подтверждаем замену ( внимание! Сохраните резервную копию чистой dllки где нибудь во избежании возможных проблем).

И так мы имеем пропатчиный двигло но этого мало. Прежде чем использовать кэлбэк ещё нужно активировать. Для этого нам понадобится файл bind_stalker.script из распакованных ресурсов игры. Открываем его блокнотом и среди всего безобразия ищим вот такую строчку:

 function actor_binder:reinit()

Ниже видим такие строки:

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

Это доступные кэлбэки.

В самом низу этого списка пишим

self.object:set_callback(callback.hit, self.actor_hit_callback, self)           -- хит актору
это новоиспечённый кэлбэк.

Далее ищим:

function actor_binder:net_destroy()

И ниже:

self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

И в самом низу этого списка дописываем:

self.object:set_callback(callback.hit, nil)

Сие есть отригистрация кэлбэка.

Далее где нибудь среди функций, на пример под:

 function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

Пишим как то так:

function actor_binder:actor_hit_callback(obj)
    effect_blood.wounded_pp_update() – это файл скрипта пост- эффекта и функция пост-эффекта в нём
end

Ииии всё!

Теперь когда мы повесили скрипт на кэлбэк хита автору он:

А. Не будет постоянно висеть на апдейте а срабатывать только когда ГГ получает по щам.

Б. Будет срабатывать мгновенно при крит.хите.

Приятной игры.

(Принцип активации кэлбэка подсмотрен в ОГСЕ)

 

Изменено пользователем UriZzz

Моя нычка номер 1, Нычка номер 2

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

Присоединиться к обсуждению

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

Гость
К сожалению, ваш пост содержит слова, запрещенные в нашем сообществе. Пожалуйста, измените ваш текст так, чтобы в нем не оставалось слов, указанных ниже. Помните, что публикация вами даже видоизмененного запрещенного слова может нарушать законодательство РФ и Правила форума.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...