Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!

> Помощь по разделу

Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов

> Редактирование движка
RayTwitty
сообщение 22.01.2016, 17:18
Сообщение #3021


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа



Редактирование собранного движка
Проект X-Ray extensions и его вики
Lua-перехватчик от alpet
xrLuaFix от RvP
xrLuaFix в редакции от Artos
xrLuaFix в редакции от svarog2741
LuaXML библиотека парсинга xml-файлов из скриптов (подключается при помощи функции require, которая есть в xrLuaFix)
NoProtect 1.0006 исполнительные файлы из Steam-версии без защиты
Документация к X-Ray (11.10.2004)
Файл заголовков от отладочного 6 патча
Cut X-Ray
Цель проекта - создание отдельных изменений движка игры с их последующей комбинацией с другими правками.
Авторы: SkyLoader, _призрак_
Для платформ: ТЧ 1.0004 и 1.0006, ЧН 1.5.10, ЗП 1.6.02
Адрес проекта на Google Code: https://code.google.com/p/cut-x-ray-project/
Страница на Moddb: http://www.moddb.com/mods/cut-x-ray-project-soc-cs-cop
Пак 1
1. Исправление вылета "can't find rank" для оружий.

2. Смерть от первого лица.
Видео: https://www.youtube.com/watch?v=c-4dNyvizxY

3. Collide
Возвращена коллизия мертвых тел с неписями и актором, как она сделана в старой физике билдов.
Видео: https://www.youtube.com/watch?v=1xNn04f3djc

4. Круглый прицел.
Возвращен круглый прицел вместо перекрестья, как билдах.

5. Исправление вида от 3-го лица.
Изменено положение камеры от 3-го лица (1). Стрельба идет по перекрестью, а не по направлению актора. Если включить вид от 3-го лица (1) и удерживать Shift, то ГГ будет автоматически целиться в ближайшего непися или монстра.
Проблемы: Стрельба по перекрестью идет также при виде от 3-го лица (2). Если при автоматическом нацеливании непись/монстр удалится или перейдет в оффлайн, будет движковый безлоговый вылет. Я думал вырезать это нацеливание, но решил оставить.
Пак 2
1. Luminosity progress (только ТЧ)
Возвращение шкалы освещения вместо шкалы "заметности" ГГ, как в билдах.

2. Запрет на доставание оружия в машине (только ТЧ и ЧН) и на лестнице (ТЧ, ЧН, ЗП).

3. Руки на руле в машине. (только ТЧ и ЧН)
Видео: https://www.youtube.com/watch?v=nYrnrfGkO7Y

4. Отсутствие распознавания неписей перекрестием:
При наведении на непися перекрестье имеет дефолтный цвет. Также не показывает информацию о неписе, если смотреть на него.

5. Bind_object:
Возможность использовать скрипты в мультиплеере.

6. Из оружия на классе бинокля можно стрелять (только ТЧ)
Пак 3
1. Включение некоторых команд без использования ярлыка. Можно патчить по отдельности. Команды: -smap_4096 (максимально улучшенные карты теней), -mblur (включение блюра).

2. Измененная анимация безоружного гг.

3. Увеличение дистанции диалога с неписями (для создания сценок на расстоянии)

4. Исправление вылета при использовании предметов из трупов неписей.
В отличии от версии Kolmogor'а, здесь отключено само меню использования.

5. Возможность поднимать болты как обычные инвентарные предметы (комбинировать с модом Charsi "Заканчивающиеся болты")
Скачать все паки
Правки от RayTwitty aka Shadows
Geometry LOD fix (CS 1.5.10) – расширение диапазона консольной команды r__geometry_lod
Camblu crosshair for build 1865 – замена перекрестия прицела на кружок в билде 1865
Vertex buffer fix for NC Project – исправление вылета по переполнению буфера в NC Project
NO 100 sovetov fix (COP 1.6.02) – убирает надписи "100 советов" с экрана загрузки
Demo Record fix (SOC 1.0006) – убирает красные надписи в режиме demo_record
Weapon Bobbing Beta (SOC 1.0006) – раскачка оружия при ходьбе (бета-версия)
Build Loadscreen (SOC 1.0006) – билдовский экран загрузки со статичным изображением
Detail Density fix (SOC 1.0006) – расширение диапазона консольной команды r__detail_density
Mipbias fix (SOC 1.0006) – расширение диапазона консольных команд r1_tf_mipbias и r2_tf_mipbias
No Quick Use fix (SOC 1.0006) – запрет на использование аптечек и бинтов по быстрым клавишам
Sun Near fix (SOC 1.0006) – расширение диапазона консольной команды r2_sun_near
Target Font (SOC 1.0006) – замена шрифта под перекрестием прицела на шрифт DI
Unload Magazine fix (SOC 1.0006) – фикс скриптовой функции unload_magazine - теперь патроны разряжаются в инвентарь
PNG Screenshots (SOC 1.0006) – игра теперь делает качественные скриншоты в формате png

Скачать все правки
Правки от K.D.
xrPatch v0.8 – патчер для увеличения радиуса прорисовки травы
detail radius+density fix [SOC 1.0006] – добавляет регулировку радиуса отрисовки травы через консольную команду и расширяет диапазон регулировки плотности травы до 0.02
Правки от macron
Исправленный экзешник для SoC 1.0006
Доработанный и исправленный экзешник для ТЧ 1.0006 (на основе Steam-версии без защиты)
Включает в себя исправления вылетов, а также очистку лога игры от засоряющих сообщений. Более подробное описание внутри архива.

Ссылка: https://yadi.sk/d/At9Tw0ueSaDyS
X-Ray extensions portable
Портативная версия расширений движка "X-Ray extensions"
Платформы: ТЧ 1.0006, ЧН 1.5.10, ЗП 1.6.02
Эта версия имеет все нужные библиотеки и патчеры, а также настроенные bat-файлы для успешной компиляции. Более подробное описание внутри архива.

Ссылка: https://yadi.sk/d/OLYPbDXWjyEkH
Правки от Kolmogor
Правленный xrGame для SoC 1.0004
Изменения:
1. Добавлена консольная команда fov [5.0, 180.0] - изменяет глобальный FOV камеры.
2. Добавлена консольная команда k_ammo_on_belt [on\off] - включает\выключает использование патронов с пояса.
3. Артефакты работают из рюкзака, а пояс служит контейнером.

Ссылка: http://rusfolder.com/42636653
Правки от Kontro-zzz
Изменение значения hud_fov
Правки фиксированных значений параметра hud_fov - 0.37 либо 0.53, для CS 1.5.10 и для билда 3120.
Должно работать на GOG версии и no DVD.
Редактирование исходников
Скачать все исходники отсюда или с оригинальных постов SoC 1.0007rc1 SoC и CS CoP X-Ray 2
Репозитории

[SoC]
() Alpet & KD / оригинальное репо [Архивная ценность]
() xrDev [Архивная ценность]
() CleanXR [Архивная ценность]
() KRoddin [Архивная ценность][/b]
() Lost Alpha old [Архивная ценность]
() Репозиторий OGSE | Самый актуальный форк (KRoddin) | Версия от Abramcumner с небольшими исправлениями
() 1exx [Архивная ценность]
() Shkiper2012 [Архивная ценность]
() Morrey (dx10) [Архивная ценность]
() OP Engine (Winsor)
() Kondr48 [Архивная ценность]

[CS]
() RedPython [Архивная ценность]
() xrDev [Архивная ценность]
() OpenXRay [Архивная ценность]
() Charsi82 [Архивная ценность]
() Abramcumner | drksnc (MP) [Архивная ценность]
() RainbowZerg [Архивная ценность]

[CoP]
() Forser
() OpenXRay
() CoC | Demosfen | Last Day
() Abramcumner
() Im-Dex [Архивная ценность]
() xrDev [Архивная ценность]
() Tron [Архивная ценность]
() mrmnwar [Архивная ценность]
() Avo [Архивная ценность]
() vincent-t [Архивная ценность] | Старый репозиторий
() Shoкer
() Morrey CS-COP [Архивная ценность]
() Morrey [Архивная ценность]

[2.0]
() Saas
() xrOxy
Компиляторы x64: SoC CS CoP
NDA GSC
Оригинальные версии движков
Могут понадобиться для восстановления оригинальных библиотек.
SoC SoC ENG CS CoP
GOG version [1.0006, 1.5.10, 1.6.02]
Multi-patch version [1.0006, 1.5.10, 1.6.02]
Официальный мультиплеерный (невышедший) патч для SoC 1.0007rc1.
Уроки
Изменение плотности травы и создание патча через IDA Pro
Автор: _призрак_
edited by: RayTwitty aka Shadows

Для редактирования нам понадобится программа IDA Pro.

1. Запускаем IDA Pro.
2. Загружаем бинарник рендера xrRender_R1.dll или xrRender_R2.dll.
3. Теперь необходимо найти, где регистрируется консольная команда. Жмем Ctrl+T и вводим r__detail_density.
4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, только укажу, где задаются параметры:
Код регистрации консольной команды
Код
fld ds:flt_10064400 -- нижнее ограничение равное 0.6
or dword_1007CACC, 8
sub esp, 8
fstp [esp+30h+var_2C]
mov ecx, offset unk_1007CA9C
fld ds:flt_10064380 -- верхнее ограничение равное 0.2
fstp [esp+30h+var_30]
push offset aSs; "ЪЩЩ>"
push offset aR__detail_dens; "r__detail_density"
call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float)
push offset sub_1005E080; void (__cdecl *)()
call _atexit
add esp, 4
Если вы заметили, чтобы трава стала плотней нужно уменьшить параметр, а чтобы травы стало меньше, нужно параметр увеличить
5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть три варианта:

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

Второй: взять другую, уже существующую переменную с подходящим значением. Хороший вариант которым я и воспользовался. Но и тут есть недостаток - переменных в бинарнике не так уж и много и можно просто не найти нужную.

Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать smile.gif

Я пошел по второму пути. Два раза щелкнув на ds:flt_10064380, IDA отправила меня в дебри под названием .rdata. Там я нашел переменную, которая называлась - flt_1006452C и которая имела значение 0.0720999.
Насколько я понял, flt_1006452C - не является названием переменной, это сборка из двух показателей - (тип числа)_(смещение). В нашем случае это число типа float, которое находится по адресу 1006452C. Ну что же, приступим к редактированию!
6. Отправляемся в самое начало файла. Как? Сверху есть что-то типа статус-бара - строка состоящая из синего, серого, черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца.
7. Опять ищем r__detail_density. Находим в этой функции строку fld ds:flt_10064338. Дальше самое интересное - жмем на вкладку Hex View и там у нас выделяются какие-то цифры. Это наша переменная 10064338, только написано наоборот. Сравните:
Код
38 43 06 10
10 06 43 38
Похоже, не правда ли? smile.gif
8. Начинаем редактировать. Нам нужно поменять 4338 на 452C (т.е. заменить ссылку с одной переменной на другую). Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где-нибудь в коде (это нужно сделать обязательно!).
9. После этого жмем правой кнопкой мыши и выбираем commit changes. Таким образом, мы поменяли ссылку на переменную и теперь верхнее ограничение будет равно значению из другой переменной.
Но IDA не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так: File -> Produce file -> Create DIF file. Назовем его test. Этот файл можно открыть при помощи блокнота и посмотреть, что получилось.
10. Теперь необходимо внести изменения из этого файла в движок. Это можно сделать при помощи патчера bpatch. Качаем, смотрим и запускаем bpatch.cmd. Я думаю, что батник вы сможете изменить самостоятельно (настроить пути файлов и т.п.) - там все элементарно.
11. Все! Изменения внесены в движок, можно тестировать smile.gif

Огромное спасибо Kolmogor'у и malandrinus'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз.
Спасибо и Rolan'у, с которым я очень много беседовал и тоже узнал много чего smile.gif




Сообщение отредактировал RayTwitty - 27.08.2021, 00:15
Перейти в начало страницы
 
242 страниц V  « < 150 151 152 153 154 > »   
Начать новую тему
Ответов
v2v3v4
сообщение 16.12.2017, 20:53
Сообщение #3022


Опытный Игрок
****

Репутация:   5  
Группа: Участник
Сообщений: 65
Награды: 2
Регистрация: 03.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(andreyholkin @ 16.12.2017, 22:02) *
Для управления БТРом нужны еще и скрипты, которых нет в оригинале.

У меня в оригинале актер катается и после правки можно юзать пулемёт, если вы о стрельбе через логику без актора то я хз что там еще не копался.
Перейти в начало страницы
 
Diesel
сообщение 16.12.2017, 21:04
Сообщение #3023


Почти Мастер
***********

Репутация:   111  
Группа: Участник
Сообщений: 1158
Награды: 3
Регистрация: 07.08.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(v2v3v4 @ 16.12.2017, 22:53) *
Цитата(andreyholkin @ 16.12.2017, 22:02) *
Для управления БТРом нужны еще и скрипты, которых нет в оригинале.

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

В ЗП вырезано. Первые скрипты в ЗП я увидел у makdm в Время Альянса-2. Были и раньше правки до Альянса, потому как сам makdm их скомуниздил.
Камикадзе зачинал их. А до него кто бинд в ЗП делал, хрен его знает.
Перейти в начало страницы
 
NanoBot-AMK
сообщение 16.12.2017, 21:18
Сообщение #3024


Почти Мастер
***********

Репутация:   75  
Группа: Участник
Сообщений: 1168
Награды: 4
Регистрация: 10.11.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


А вспомнил, я же свою реализацию стрельбы из БТР-90 сделал, забыл в релиз выложить, сделал ещё года два назад, использовал старую XRayExt с колбеками на нажатия клавиш, дистанция до цели и получить владельца холдера, т.е. скрипт почти на любой версии ХЕ работал. Хотя не... у меня же БТР-90 из 30-мм пушки стреляет, значит надо ревизия где работает трассировка, плюс моя правка к ней, получить флаги геометрии и простреливаемости. Но это мод у меня не в релизном состоянии, что бы его вылаживать, в нём куча всякой экспериментальной фигни.

Сообщение отредактировал NanoBot-AMK - 16.12.2017, 21:20


--------------------
СТАЛКЕР только для ПК!
Перейти в начало страницы
 
KrivoRuk
сообщение 17.12.2017, 02:31
Сообщение #3025


Игрок
***

Репутация:   1  
Группа: Участник
Сообщений: 37
Награды: 1
Регистрация: 15.06.2017




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 02.12.2017, 23:29) *
Цитата(KrivoRuk @ 21.11.2017, 10:36) *
Как я понял - надо смотреть в "xrGame\ui\UIXmlInit.cpp" функция:

Не только здесь - UIXmlInit просто читает xml и создает объект, передавая в конструктор (или через методы класса) прочитанные данные. То есть, таким образом производится первоначальная установка параметров.
Сама реализация различных фич, как правило, находится внутри конкретного класса. Тебе нужно написать код, который при инициализации окна будет запускать рандом, после чего искать и устанавливать текстуру по шаблону: <путь_до_текстуры>_<сгенерированное_число>.

Там кстати могут быть нюансы, насколько я помню, объекты в главном меню создаются один раз при старте игры. Тогда придется тоже самое делать на события показа меню (метод Show).

Не, всё оказалось гораздо проще, ну не для меня - спасибо Charsi помог, и он код так написал, что стало ещё лучше выглядеть, чем было. И дело именно в "UIXmlInit.cpp", функция инициализации текстуры, и больше ничего лишнего. Получилось как то так:


Сообщение отредактировал KrivoRuk - 17.12.2017, 02:31
Перейти в начало страницы
 
AndreySol
сообщение 19.12.2017, 22:13
Сообщение #3026


Опытный Геймер
*******

Репутация:   3  
Группа: Участник
Сообщений: 150
Награды: 3
Регистрация: 16.02.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Два вопроса:

1). в xr_src\xrCore\_color.h
IC SelfRef lerp(SelfCRef c1, SelfCRef c2, T t)
{
T invt = 1.f-t;
r = c1.r*invt + c2.r*t;
g = c1.g*invt + c2.g*t;
b = c1.b*invt + c2.b*t;
a = c1.a*invt + c2.a*t;
return *this;
}
Пример использования:
void CUIProgressBar::UpdateProgressBar()
{
..........................
if(m_bUseColor)
{
Fcolor curr;
curr.lerp(m_minColor,m_maxColor,fCurrentLength);
m_UIProgressItem.GetStaticItem()->SetColor(curr);
}
}

Что делает эта ф-ция? Если я правильно понял - это уменьшение яркости полоски прогресса при приближении к мин. значению ?

2). А что это ? В чем смысл ?
UI()->PushScissor(rect);
m_UIBackgroundItem.Draw();
UI()->PopScissor();

Сообщение отредактировал AndreySol - 19.12.2017, 22:13
Перейти в начало страницы
 
autistic
сообщение 19.12.2017, 22:20
Сообщение #3027


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(AndreySol @ 20.12.2017, 00:13) *
А что это ? В чем смысл ?

Ну в исходниках хрея я не силен, но судя по всему это обрезка (scissor), где rect - прямоугольная область по которой производится обрезка.


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 19.12.2017, 22:22
Сообщение #3028


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(AndreySol @ 19.12.2017, 22:13) *
Что делает эта ф-ция? Если я правильно понял - это уменьшение яркости полоски прогресса при приближении к мин. значению ?

Почему яркости? Все четыре компонента же интерполируются. Задаешь 0% - красный, 100% зеленый. А прогресс бар автоматически красит промежуточные значения в желтый, оранжевый и т.д.
Перейти в начало страницы
 
ForserX
сообщение 19.12.2017, 23:26
Сообщение #3029


Почти Игроман
*********

Репутация:   91  
Группа: Модератор
Сообщений: 516
Награды: 4
Регистрация: 19.07.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


https://github.com/xrOxygen/ - переезд оксиджена.

И несколько интересных форков репозитория OGSE:
https://github.com/KRodinn/OGSR-Engine
https://github.com/KRodinn/OGSE_0693_Optimized


--------------------

В армии по 01.07.2020.
Перейти в начало страницы
 
Winsor
сообщение 21.12.2017, 18:00
Сообщение #3030


Геймер
******

Репутация:   4  
Группа: Участник
Сообщений: 108
Награды: 3
Регистрация: 02.02.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Небольшой опрос - каким образом лучше обновить состояние серверного класса при обновлении клиентского?
1) net_Export/UPDATE_Read- тут есть проблема с поддержкой старых сейвов, где хранятся еще старые состояния КО. можно извернуться через
#define ALIFE_VERSION 0x0006
и его проверкой - но как то коряво, и не очень практично. да и вызов на каждом фрейме - как то не очень нравиться.
2) через Level().Send() - этот способ тянет за собой создание ID событий либо для каждого свойства, либо каждый раз нужно передавать весь "срез" состояния КО.
3) CSE_ALifeDynamicObject* seObj= ai().alife().objects().object(ID(),true) - прямое получение серверного объекта и изменение его свойств. С этим способом есть странная магия. у меня было пару раз, когда seObj==nullptr, а КО при этом существует... Это происходит, кажется, в момент первого спавна объекта и это нужно проверять отдельно.

А каким образом это делаете Вы?

Перейти в начало страницы
 
Zagolski
сообщение 22.12.2017, 13:43
Сообщение #3031


Почти Игроман
*********

Репутация:   59  
Группа: Участник
Сообщений: 629
Награды: 1
Регистрация: 13.12.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Может кто-то из профи подскажет, почему добавление строчки кода:

memset(_ptr, 238, size);

в mem_alloc в конце убивает работу солнечных лучей и только на дх11? (в игре они выглядят как яркий белый свет)

Сообщение отредактировал Zagolski - 22.12.2017, 14:42
Перейти в начало страницы
 
Zagolski
сообщение 22.12.2017, 14:47
Сообщение #3032


Почти Игроман
*********

Репутация:   59  
Группа: Участник
Сообщений: 629
Награды: 1
Регистрация: 13.12.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Уже редактировать не могу...
Если нулями заполнить, то проблем нет.
Перейти в начало страницы
 
Карлан
сообщение 23.12.2017, 16:26
Сообщение #3033


Геймер
******

Репутация:   9  
Группа: Участник
Сообщений: 110
Награды: 2
Регистрация: 21.09.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Нужна помощь знатоков времени и сети. Года полтора назад у меня появился вопрос, и я так и не нашел на него ответа. Тогда делалось для ЗП, сейчас, когда бывает нечем заняться, все тоже самое делаю для ТЧ, и тут вспомнил этот вопрос вновь, это чтобы было понятнее. В общем вопрос про типы времени в движке и как они между собой взаимодействуют. Время это которое создается в игровых классах и потом происходит клиент-серверный пинг-понг этих всех данных. Я осознал, что я вообще слабо пониманию что это за разные временя, для чего они делались и за что они в конечном итоге отвечают. Как они работают я могу объяснить только приведя код, и сказать что вот так работает, а так нет, но реального понимания так и нет. Т.е. отвечающему код приводить мне не нужно, на практике все что я хотел сделать я сделал и проблем никаких нет, но объяснить почему именно такой способ прошел, а другой нет я совершенно не могу. Очень интересно понять что это такое, в ЗП из-за сноса вообще всех игр и уничтожения клиент-серверного пинг-понга пришлось зацепить всякого полуненужного хлама из дебага. Но если в ЗП делалось с расчетом на запуск и сохранение/загрузку, то в ТЧ мне нужно уже нечто большее (может кому-то потребуются эти функции, а я их снесу), и тут я должен все же понимать что я делаю и смочь объяснить все что я делаю.

Чтобы было понятно о чем я, посмотрите различия моих xrServer.cpp под ТЧ и ЗП:
ТЧ:
Код
// xrServer.cpp: implementation of the xrServer class.
//
//////////////////////////////////////////////////////////////////////

#include "pch_script.h"
#include "xrServer.h"
#include "xrMessages.h"
#include "xrServer_Objects_ALife_All.h"
#include "level.h"
#include "ai_space.h"
#include "alife_simulator.h"
#include "object_broker.h"
#include "../IGame_Persistent.h"
#include "xrServer_process_helpers.h"

xrServer::xrServer()
{
    m_as        = NULL;
    SV_Client    = NULL;
}
void xrServer::Init(shared_str &session_name)
{
    m_as = xr_new<CALifeSimulator>(this, session_name.c_str());
}
xrServer::~xrServer()
{
    R_ASSERT(SV_Client);
    m_entities.clear();
}



CSE_Abstract* xrServer::ID_to_entity(u16 ID)
{    
    if (0xffff==ID)                return 0;
    xrS_entities::iterator    I    = m_entities.find    (ID);
    if (m_entities.end()!=I)        return I->second;
    else                        return 0;
}

void xrServer::SV_Update()
{
    NET_Packet    P;
    P.w_begin(M_UPDATE);
    sv_game->net_Export_GameTime(P);
    SendTo(P);
    VERIFY(verify_entities());
}

u32 xrServer::OnMessage    (NET_Packet& P)
{
    u16            type;
    P.r_begin    (type);
    VERIFY                            (verify_entities());
    switch (type)
    {
    case M_UPDATE:    
        {
            Process_update            (P);
            VERIFY                    (verify_entities());
        }break;
    case M_SPAWN:    
        {
            Process_spawn        (P);
            VERIFY                    (verify_entities());
        }break;
    case M_EVENT:    
        {
            Process_event            (P);
            VERIFY                    (verify_entities());
        }break;
    case M_EVENT_PACK:
        {
            NET_Packet    tmpP;
            while (!P.r_eof())
            {
                tmpP.B.count        = P.r_u8();
                P.r                    (&tmpP.B.data, tmpP.B.count);
                OnMessage            (tmpP);
            };            
        }break;
    case M_SWITCH_DISTANCE:
        {
            ::g_switch_distance(P);
            VERIFY                    (verify_entities());
        }break;
    case M_CHANGE_LEVEL:
        {
            if (g_change_level(P))
                SendTo(P);
            VERIFY                    (verify_entities());
        }break;
    case M_SAVE_GAME:
        {
            g_save_game(P);
            VERIFY                    (verify_entities());
        }break;
    case M_LOAD_GAME:
        {
            g_load_game(P);
            SendTo(P);
            VERIFY                    (verify_entities());
        }break;
    case M_SAVE_PACKET:
        {
            Process_save            (P);
            VERIFY                    (verify_entities());
        }break;
    default:
        {
            FATAL("xrServer::OnMessage - Unknown message %d", type);
            break;
        }
    }
    VERIFY                            (verify_entities());
    return                            0;
}

void xrServer::SendTo(NET_Packet& P)
{
    if(SV_Client) Level().OnMessage(P.B.data, P.B.count); // Karlan: снести проверку после удаления игры! Пока сделано воизбежание пролета "пустых" пакетов.
}
//--------------------------------------------------------------------
void            xrServer::entity_Destroy    (CSE_Abstract *&P)
{
#ifdef PROSECTORS_DEBUG
    if( dbg_net_Draw_Flags.test( dbg_destroy ) )
        Msg                            ("xrServer::entity_Destroy : [%d][%s][%s]",P->ID,P->name(),P->name_replace());
#elif defined(LUAICP_COMPAT)
    MsgCB                        ("xrServer::entity_Destroy : [%d][%s][%s]",P->ID,P->name(),P->name_replace());    
#endif


    R_ASSERT                    (P);
    m_entities.erase                (P->ID);
    m_tID_Generator.vfFreeID    (P->ID,Device.TimerAsync());

    if(P->owner_client && P->owner_client->cl_owner==P)
        P->owner_client->cl_owner        = NULL;

    P->owner_client = NULL;
    if (!ai().get_alife() || !P->m_bALifeControl)
    {
        F_entity_Destroy        (P);
    }
}

#ifdef PROSECTORS_DEBUG

static    BOOL    _ve_initialized            = FALSE;
static    BOOL    _ve_use                    = TRUE;

bool xrServer::verify_entities                () const
{
    if (!_ve_initialized)    {
        _ve_initialized                    = TRUE;
        if (strstr(Core.Params,"-~ve"))    _ve_use=FALSE;
    }
    if (!_ve_use)                        return true;

    xrS_entities::const_iterator        I = m_entities.begin();
    xrS_entities::const_iterator        E = m_entities.end();
    for (; I != E; ++I) {
        VERIFY2                            ((*I).first != 0xffff,"SERVER : Invalid entity id as a map key - 0xffff");
        VERIFY2                            ((*I).second,"SERVER : Null entity object in the map");
        VERIFY3                            ((*I).first == (*I).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*I).second->name_replace());
        verify_entity                    ((*I).second);
    }
    return                                (true);
}

void xrServer::verify_entity                (const CSE_Abstract *entity) const
{
    VERIFY(entity->m_wVersion!=0);
    if (entity->ID_Parent != 0xffff) {
        xrS_entities::const_iterator    J = m_entities.find(entity->ID_Parent);
        VERIFY2                            (J != m_entities.end(),
            make_string("SERVER : Cannot find parent in the map [%s][%s]",entity->name_replace(),
            entity->name()).c_str());
        VERIFY3                            ((*J).second,"SERVER : Null entity object in the map",entity->name_replace());
        VERIFY3                            ((*J).first == (*J).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*J).second->name_replace());
        VERIFY3                            (std::find((*J).second->children.begin(),(*J).second->children.end(),entity->ID) != (*J).second->children.end(),"SERVER : Parent/Children relationship mismatch - Object has parent, but corresponding parent doesn't have children",(*J).second->name_replace());
    }


    xr_vector<u16>::const_iterator        I = entity->children.begin();
    xr_vector<u16>::const_iterator        E = entity->children.end();
    for (; I != E; ++I) {
        VERIFY3                            (*I != 0xffff,"SERVER : Invalid entity children id - 0xffff",entity->name_replace());
        xrS_entities::const_iterator    J = m_entities.find(*I);
        VERIFY3                            (J != m_entities.end(),"SERVER : Cannot find children in the map",entity->name_replace());
        VERIFY3                            ((*J).second,"SERVER : Null entity object in the map",entity->name_replace());
        VERIFY3                            ((*J).first == (*J).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*J).second->name_replace());
        VERIFY3                            ((*J).second->ID_Parent == entity->ID,"SERVER : Parent/Children relationship mismatch - Object has children, but children doesn't have parent",(*J).second->name_replace());
    }
}

#endif // PROSECTORS_DEBUG

shared_str xrServer::level_name                () const
{
    const CALifeSimulator *m_alife_simulator = ai().get_alife();
    return m_alife_simulator->level_name();
}

#include "../x_ray.h"

void xrServer::restart_simulator(LPCSTR saved_game_name)
{
    shared_str options = ai().alife().server_command_line();

    delete_data(m_as);
    clear_ids();

    xr_strcpy(g_pGamePersistent->m_game_params.m_game_or_spawn,saved_game_name);
    xr_strcpy(g_pGamePersistent->m_game_params.m_new_or_load,"load");


    pApp->LoadBegin            ();
    m_as = xr_new<CALifeSimulator>(this, options.c_str());
//    g_pGamePersistent->LoadTitle        ("st_client_synchronising");
    g_pGamePersistent->LoadTitle        ();
    Device.PreCache(60, true, true);
    pApp->LoadEnd();
}

ЗП:
Код
// xrServer.cpp: implementation of the xrServer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "xrServer.h"
#include "xrMessages.h"
#include "xrServer_Objects_ALife_All.h"
#include "level.h"
#include "ai_space.h"
#include "alife_simulator.h"
#include "object_broker.h"
#include "IGame_Persistent.h"
#include "xrServer_process_helpers.h"

xrServer::xrServer()
{
    m_as        = NULL;
    SV_Client    = NULL;
}
void xrServer::Init(shared_str &session_name)
{
    m_as = xr_new<CALifeSimulator>(this, session_name.c_str());
    ai().alife().update_switch();
}
xrServer::~xrServer()
{
    R_ASSERT(SV_Client);
    m_entities.clear();
}
CSE_Abstract*    xrServer::ID_to_entity        (u16 ID)
{
    if (0xffff==ID)                return 0;
    xrS_entities::iterator    I    = m_entities.find    (ID);
    if (m_entities.end()!=I)        return I->second;
    else                        return 0;
}

u32 xrServer::OnMessage    (NET_Packet& P)            // Non-Zero means broadcasting with "flags" as returned
{
    u16            type;
    P.r_begin    (type);

    VERIFY                            (verify_entities());

    switch (type)
    {
    case M_UPDATE:    
        {
            Msg("xrServer::OnMessage - M_UPDATE");
            Process_update            (P);                        // No broadcast
            VERIFY                    (verify_entities());
        }break;
    case M_SPAWN:    
        {
            Process_spawn            (P);    
            VERIFY                    (verify_entities());
        }break;
    case M_EVENT:
        {
            Process_event            (P);
            VERIFY                    (verify_entities());
        }break;
    case M_EVENT_PACK:
        {
            NET_Packet    tmpP;
            while (!P.r_eof())
            {
                tmpP.B.count        = P.r_u8();
                P.r                    (&tmpP.B.data, tmpP.B.count);

                OnMessage            (tmpP);
            };            
        }break;
    case M_CHANGE_LEVEL:
        {
            if (g_change_level(P))
                SendTo(P);
            VERIFY                    (verify_entities());
        }break;
    case M_LOAD_GAME:
        {
            g_load_game(P);
            SendTo(P);
            VERIFY                    (verify_entities());
        }break;
    default:
        {
            FATAL("xrServer::OnMessage - Unknown message %d", type);
            break;
        }
    }
    VERIFY                            (verify_entities());
    return 0;
}
void xrServer::SendTo(NET_Packet& P)
{
    Level().OnMessage(P.B.data, P.B.count);
}

//--------------------------------------------------------------------
void            xrServer::entity_Destroy    (CSE_Abstract *&P)
{
#ifdef PROSECTORS_DEBUG
if( dbg_net_Draw_Flags.test( dbg_destroy ) )
        Msg    ("xrServer::entity_Destroy : [%d][%s][%s]",P->ID,P->name(),P->name_replace());
#endif
    R_ASSERT                    (P);
    m_entities.erase                (P->ID);
    m_tID_Generator.vfFreeID    (P->ID,Device.TimerAsync());

    if(P->owner_client && P->owner_client->cl_owner==P)
        P->owner_client->cl_owner        = NULL;

    P->owner_client = NULL;
    if (!ai().get_alife() || !P->m_bALifeControl)
    {
        F_entity_Destroy        (P);
    }
}

#ifdef PROSECTORS_DEBUG

static    BOOL    _ve_initialized            = FALSE;
static    BOOL    _ve_use                    = TRUE;

bool xrServer::verify_entities                () const
{
    if (!_ve_initialized)    {
        _ve_initialized                    = TRUE;
        if (strstr(Core.Params,"-~ve"))    _ve_use=FALSE;
    }
    if (!_ve_use)                        return true;

    xrS_entities::const_iterator        I = m_entities.begin();
    xrS_entities::const_iterator        E = m_entities.end();
    for (; I != E; ++I) {
        VERIFY2                            ((*I).first != 0xffff,"SERVER : Invalid entity id as a map key - 0xffff");
        VERIFY2                            ((*I).second,"SERVER : Null entity object in the map");
        VERIFY3                            ((*I).first == (*I).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*I).second->name_replace());
        verify_entity                    ((*I).second);
    }
    return                                (true);
}

void xrServer::verify_entity                (const CSE_Abstract *entity) const
{
    VERIFY(entity->m_wVersion!=0);
    if (entity->ID_Parent != 0xffff) {
        xrS_entities::const_iterator    J = m_entities.find(entity->ID_Parent);
        VERIFY2                            (J != m_entities.end(),
            make_string("SERVER : Cannot find parent in the map [%s][%s]",entity->name_replace(),
            entity->name()).c_str());
        VERIFY3                            ((*J).second,"SERVER : Null entity object in the map",entity->name_replace());
        VERIFY3                            ((*J).first == (*J).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*J).second->name_replace());
        VERIFY3                            (std::find((*J).second->children.begin(),(*J).second->children.end(),entity->ID) != (*J).second->children.end(),"SERVER : Parent/Children relationship mismatch - Object has parent, but corresponding parent doesn't have children",(*J).second->name_replace());
    }


    xr_vector<u16>::const_iterator        I = entity->children.begin();
    xr_vector<u16>::const_iterator        E = entity->children.end();
    for (; I != E; ++I) {
        VERIFY3                            (*I != 0xffff,"SERVER : Invalid entity children id - 0xffff",entity->name_replace());
        xrS_entities::const_iterator    J = m_entities.find(*I);
        VERIFY3                            (J != m_entities.end(),"SERVER : Cannot find children in the map",entity->name_replace());
        VERIFY3                            ((*J).second,"SERVER : Null entity object in the map",entity->name_replace());
        VERIFY3                            ((*J).first == (*J).second->ID,"SERVER : ID mismatch - map key doesn't correspond to the real entity ID",(*J).second->name_replace());
        VERIFY3                            ((*J).second->ID_Parent == entity->ID,"SERVER : Parent/Children relationship mismatch - Object has children, but children doesn't have parent",(*J).second->name_replace());
    }
}

#endif // PROSECTORS_DEBUG

shared_str xrServer::level_name() const
{
    const CALifeSimulator *m_alife_simulator = ai().get_alife();
    return m_alife_simulator->level_name();
}


#include "x_ray.h"

void xrServer::restart_simulator(LPCSTR saved_game_name)
{
    shared_str options = ai().alife().server_command_line();

    delete_data(m_as);
    clear_ids();

    xr_strcpy(g_pGamePersistent->m_game_params.m_game_or_spawn,saved_game_name);
    xr_strcpy(g_pGamePersistent->m_game_params.m_new_or_load,"load");

    pApp->ls_header[0] = '\0';
    pApp->ls_tip_number[0] = '\0';
    pApp->ls_tip[0] = '\0';
    pApp->LoadBegin            ();
    m_as = xr_new<CALifeSimulator>(this, options.c_str());
//    g_pGamePersistent->LoadTitle        ("st_client_synchronising");
    g_pGamePersistent->LoadTitle        ();
    Device.PreCache(60, true, true);
    pApp->LoadEnd();
}


Возможно я как-то косноязычно задал вопрос, если что-то не ясно, то уточните.


--------------------
Перейти в начало страницы
 
mortan
сообщение 23.12.2017, 17:38
Сообщение #3034


Продвинутый геймер
********

Репутация:   16  
Группа: Участник
Сообщений: 222
Награды: 3
Регистрация: 28.06.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Карлан, спойлеры для слабаков, да?)
Перейти в начало страницы
 
AndreySol
сообщение 23.12.2017, 19:22
Сообщение #3035


Опытный Геймер
*******

Репутация:   3  
Группа: Участник
Сообщений: 150
Награды: 3
Регистрация: 16.02.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Подскажите, кто в курсе для ТЧ 1.0007rc1: для оружия, откуда брать боеприпасы для зарядки\перезарядки - это где-то в базовом классе прописано или раскидано по разным классам. Где конкретно ?
Перейти в начало страницы
 
NanoBot-AMK
сообщение 24.12.2017, 20:34
Сообщение #3036


Почти Мастер
***********

Репутация:   75  
Группа: Участник
Сообщений: 1168
Награды: 4
Регистрация: 10.11.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Столкнулся с одним багом. В классе CExplosive метод UpdateCL вызывается не каждый фрейм, через раз, работает как метод shedule_Update, в результате свет не гаснет через m_fExplodeDurationMax. Так и не понял почему, метод виртуальный и вызывается из нескольких точек. Вызываться должен вроде из модуля xr_object.cpp


--------------------
СТАЛКЕР только для ПК!
Перейти в начало страницы
 
Карлан
сообщение 25.12.2017, 01:07
Сообщение #3037


Геймер
******

Репутация:   9  
Группа: Участник
Сообщений: 110
Награды: 2
Регистрация: 21.09.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

По клиент-серверу, если у кого-то есть желание или может кто-то уже занимается я предлагаю свои ресурсы для того что-бы попытаться все это переделать. Еще хочется затронуть память. Мне как минимум нужен человек который хорошо разбирается с пысовским менеджером памяти. Присоединюсь к любой команде. Если у вас сделано меньше, чем у меня, предлагаю отталкиваться от моего проекта под ТЧ или ЗП. Код я стараюсь писать кроссплатформенный, так как везде одно и тоже (практически я это подтвердил перенеся большую часть правок с ЗП на ТЧ), мне не принципиально, но лучше все-таки ТЧ, он как-то лучше всех смотрится, или хотя-бы ЧН. Если интересно, пишите в личку, пообщаемся.

mortan, я не сразу понял как тут спойлеры делать. Извиняюсь, исправить я уже не могу. В принципе могу ссылки с github/pastebin засылать, если можно, как удобнее. Мне главное разобраться.


--------------------
Перейти в начало страницы
 
mortan
сообщение 26.12.2017, 03:13
Сообщение #3038


Продвинутый геймер
********

Репутация:   16  
Группа: Участник
Сообщений: 222
Награды: 3
Регистрация: 28.06.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Может мне кто ответить что означает вот эта строчка в логе - Starting rendering as 2-GPU.
То что игра думает что у меня две видеокарты или два графических чипа?) Я в этом плохо понимаю, просто эта строчка есть у всех походу, без разницы обычная видяха или как у меня ( gtx 690 ). Это нормально или так не должно быть?
Перейти в начало страницы
 
Zagolski
сообщение 26.12.2017, 12:30
Сообщение #3039


Почти Игроман
*********

Репутация:   59  
Группа: Участник
Сообщений: 629
Награды: 1
Регистрация: 13.12.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Похоже, все в непонятках насчет моего предыдущего поста: https://www.gameru.net/forum/index.php?s=&a...t&p=1629598

А меж тем, добавление этой строчки кода в менеджере памяти, о которой я писал выше:

memset(_ptr, 0, size);

исправляет проблему с солнечными лучами на дх11. Т.е. неработоспособность лучей при настройках качества солнца ниже максимальных. Об этом, наверное, все в курсе.

Да и не только это, в других узлах могут идти сбои из-за отсутствия начальной инициализации каких-то свойств (мусор в них) и подобное. Заполнение нулями при выделении решает и эту проблему.
Но все же хочется разобраться, найти косяк в дх11 с солнечнми лучами. Где косячит, в каком месте?

Сообщение отредактировал Zagolski - 26.12.2017, 12:31
Перейти в начало страницы
 
abramcumner
сообщение 26.12.2017, 12:36
Сообщение #3040


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Zagolski @ 26.12.2017, 12:30) *
Похоже, все в непонятках насчет моего предыдущего поста: https://www.gameru.net/forum/index.php?s=&a...t&p=1629598

Нет smile.gif Просто и так понятно, что где-то используется неинициализированная переменная. Попробуй прогнать PVS-studio. Он вроде как хорошо их отслеживает.
Перейти в начало страницы
 
Winsor
сообщение 26.12.2017, 16:07
Сообщение #3041


Геймер
******

Репутация:   4  
Группа: Участник
Сообщений: 108
Награды: 3
Регистрация: 02.02.2016




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(AndreySol @ 23.12.2017, 19:22) *
Подскажите, кто в курсе для ТЧ 1.0007rc1: для оружия, откуда брать боеприпасы для зарядки\перезарядки - это где-то в базовом классе прописано или раскидано по разным классам. Где конкретно ?

void CWeaponMagazined::Reload()
не смотрели?

Цитата(mortan @ 26.12.2017, 03:13) *
Может мне кто ответить что означает вот эта строчка в логе - Starting rendering as 2-GPU.

"второй" GPU. у Вас сколько карточек в устройстве?
Цитата(NanoBot-AMK @ 24.12.2017, 20:34) *
Столкнулся с одним багом. В классе CExplosive метод UpdateCL вызывается не каждый фрейм

Смотря из какого класса вызывается UpdateCL. в ТЧ есть еще CExplosiveRocket, а есть еще CExplosiveItem. проще отладчиком посмотреть откуда оно вообще вызывается, а потом уже разбираться почему не каждый фрейм.




Сообщение отредактировал Winsor - 26.12.2017, 16:08
Перейти в начало страницы
 

242 страниц V  « < 150 151 152 153 154 > » 
Ответить в данную темуНачать новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29.03.2024, 17:44