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

Редактирование движка X-Ray


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

Доброго времени.
Исходный код ЗП.

Файл EntityCondition.cpp

Функция CEntityCondition::UpdateCondition()

Внутри функции необходимо выполнить проверку на то, что текущий апдейт относится к актору. Как это можно сделать?

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

@Suhar_, В ТЧ, в  EntityCondition.h есть переменная

    CEntityAlive    *m_object;

Из названия, думаю, понятно для чего она. В коде можно проверить

    if (m_object->ID() == 0)

объект с ID'ом "0" у нас всегда один - актер. Думаю в ЗП эта переменная осталась...

  • Спасибо 1
Ссылка на комментарий

Всем привет! Я решил перенести имя денег в конфиг, и вот что я сделал (пример ниже) во всех файлах CPP (а именно: UIActorMenuTrade.cpp, UIItemInfo.cpp, UIRankingWnd.cpp и UIActorMenu.cpp) в которых объявляется имя денег. Все остальные файлы понимают что такое translate и CStringTable, кроме одного UIActorMenu.cpp.

 

Вот пример кода из файла UIActorMenu.cpp:

LPCSTR currency_str = CStringTable().translate( "st_currency" ).c_str();
xr_sprintf( buf, "%d %s", money, currency_str );
m_ActorMoney->SetText( buf );

При комплилации возникают следующие ошибки:

20>.\ui\UIActorMenu.cpp(851) : error C2228: left of '.translate' must have class/struct/union
20> type is ''unknown-type''
20>.\ui\UIActorMenu.cpp(851) : error C2228: left of '.c_str' must have class/struct/union
20>.\ui\UIActorMenu.cpp(851) : error C3861: 'CStringTable': identifier not found

В других файлах штуки типа:  "LPCSTR kg_str= CStringTable().translate( "st_kg" ).c_str();" работают, при чём в коде перед этим они не инициализированы, сколько раз я не искал в include файлах и прочее. Я явно что-то упускаю. Вопрос такой: как инициализировать этои "идентификаторы"?

И ещё вопрос, но скорее это уже для какого-нибудь гуру кода. В файле Inventory.cpp есть такая переменная

bool CInventory::CanTakeItem(CInventoryItem *inventory_item) const

В которой есть такие строки:

//актер всегда может взять вещь
    if(!pActor && (TotalWeight() + inventory_item->Weight() > m_pOwner->MaxCarryWeight()))
  return    false;

Я хотел сделать так, чтобы при достижении максимально веса, ГГ не смог бы брать предметы, и я поставил true вместо false. После компиляции в игре при достижении максимального веса (при чём ГГ всё таки взял предмет) игра вылетела со следующим логом:

Expression : !m_error_code
Function : raii_guard::~raii_guard
File : ..\xrServerEntities\script_storage.cpp
Line : 748
Description : ...- stalker\gamedata\scripts\xr_corpse_detection.script:337: bad argument #1 to 'random' (interval is empty)

Как сделать правильно, так чтобы вообще не срабатывала функция на поднятие предмета? Огромное спасибо за ваши ответы.  Используется двиг 1.6.02.

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

Вопрос такой: как инициализировать эти "идентификаторы"?

Где нить в начале UIActorMenu.cpp попробовать добавить

#include "string_table.h"

Цитата

В файле Inventory.cpp есть такая переменная

Это функция...

gamedata\scripts\xr_corpse_detection.script - Открыть этот скрипт-файл на 337 строке и разбираться с кодом.

Ссылка на комментарий
3 часа назад, AndreySol сказал:

Где нить в начале UIActorMenu.cpp попробовать добавить

#include "string_table.h"

Большое спасибо за подсказку. Как раз этого include в этих файлах не было. Но посколько эти файлы находятся в папке ui, то необходимо было написать так: 

#include "../string_table.h"

Всё прекрасно сработало. Но не знаете ли как создать запрет на подбор предмета в движке? Я знаю что в скриптах есть callback "on_item_take" но это событие уже произошедшее, то есть, то чего мне по сути не нужно допустить.

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

[ ЗП_1.6.02 / СоС_1.4/1.5 ]

В каком порядке движок "читает" db-файлы?

Как влияет расположение папок с ресурсами игры на это "чтение"?

Знаю только, что распакованную "gamedata" в последнюю очередь.

 

Интересуют как оригинальный двиг, так и от СоС.

Смотрел исходники, но не разобрался.

Заранее признателен.

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

Решил написать сюда...

Движок ТЧ 1.0006 + X-Ray extensions.

Давал свой мод тестить и столкнулся с очень интересными ошибками:

  1. Спонтанная ошибка, я думаю связана со смещениями в движке и (или) его процессе при работе.  Суть в том, что строки относящиеся к названиям квестов, строки сообщений для db.actor:give_game_news(...)   каким-то образом попадают в метод(ы) класса CMapLocation::LoadSpot
    Пример вылета:
    Expression : g_uiSpotXml->NavigateToNode(path_base,0)
    Function : CMapLocation::LoadSpot
    File : E:\stalker\sources\trunk\xr_3da\xrGame\map_location.cpp
    Line : 78
    Description : XML node not found in file map_spots.xml
    Arguments : 60,160]Задание выполнено:\n%c[default]Побег
    Данная ошибка сохраняется в сейвах!
  2. Не ездят машины под собственной логикой, но начинают ехать если включена программа записи видео и нажать кнопку записи...
    Все эти ошибки были у тестера с Win10, у меня Win7 и их не было...
Ссылка на комментарий
В 04.06.2018 в 20:07, Graff46 сказал:

+ X-Ray extensions

Я не шарю в этом вопросе и видимо предложу глупость, но может стоит попробовать пропатчить движок до той версии X-Ray extensions, что у Вас используется, но под Win10(и лучше той сборки, что у тестера).

 

У меня такой вопрос: кто подскажет, в каком классе(классах) смотреть то, что касается взаимодействия актера с шейпами объектов(с аномалиями\рестрикторами\переходами) ?

 

 

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

Тут вот такая проблема всплыла. Может кто сталкивался/занимался. Допустим у нас имеется рестриктор или его наследник с шейпом в виде сферы радиусом 0.1. Если мы этот рестриктор добавим мобу в restrictions, движок попытается определить границы этого рестриктора в левел вертексах. Т.е. какие левел вертексы составляют границу. Ну, это насколько я понял всю эту машинерию. Так вот, судя по всему, он не может это сделать для такой маленькой сферы. Насколько я понимаю, для определения, принадлежит ли вертекс границе, берутся пять точек, т.е. четыре угла вертекса и точка в центре, представляются в виде сферы радиусом 0.001 и проверяются на пересечение со сферой рестриктора, которая, напомню, имеет радиус 0.1. И тут, похоже, получается так, что при определенном положении рестриктора относительно вертекса ни одного пересечения не будет. Т.е. все эти алгоритмы рассчитаны на проверку шейпов радиусом не меньше некоторого, похоже. И что тут сделать, кроме как не делать таких шейпов? Как алгоритм можно поменять? Там, по идее, не хватает еще проверки, что часть или вся окружность шейпа находится внутри квадрата левел вертекса.

 

Ссылка на комментарий
1 час назад, dsh сказал:

И что тут сделать, кроме как не делать таких шейпов?

Проверять границу при добалении мобам в рестрикторы и не добавлять? :)

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

Заменить проверку вертексов на таки проверку расстояния ?

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

@abramcumner, ага, это была моя первая мысль. Только там чёрт ногу сломит. CAnomalyDetector имеет дело с CCustomZone. Расчет границы происходит где-то в CSpaceRestriction, по памяти пишу. Что бы этот самый Restriction появился, нужно в restriction_manager добавить эту аномалию, потом вытащить откуда-то соотв. Restriction, а потом удалить эту аномалию из менеджера, если у этого Restriction border().empty(). Бррр...

Ссылка на комментарий
5 часов назад, dsh сказал:

рестриктор или его наследник с шейпом в виде сферы радиусом 0.1

Чисто по интересу - для чего нужны такие шейпы в игре ?

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

@AndreySol, в моем случае это были аномалии костров. Я их создавал со сферой такого радиуса и не указал им eRestrictorTypeNone, что бы CAnomalyDetector их игнорировал.

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

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

 

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

Использовал 0 там, где нужна просто фиговина с партклями. Позже осознал, что "фиговина с партиклями" сама по себе не нужна, но я с этим легко справлюсь, а вот люди, которым проще олспавн пересобрать, чем при загрузке сказать p = particles_object(); p:play_at_pos() - им что делать ?

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

@abramcumner, сначала подумал эту проверку в CAnomalyDetector добавить, добавил, посмотрел и решил, что более общее решение наверное будет лучше. В итоге остановился на таком:

https://github.com/dsh2dsh/OGSR-Engine/commit/378a34414c26a58c4422536dfbdbb84f0f8c8adc

 

Все равно костыль, на моя взгляд, но вроде работает.

 

  • Спасибо 1
  • Нравится 1
  • Полезно 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

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

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