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

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

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

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

Файл EntityCondition.cpp

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

    CEntityAlive    *m_object;

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Suhar_, всё намного проще - для актора есть своя переопределённая функция в файле ActorCondition.cpp. И не надо ничего определять, всё уже сделано.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет! Я решил перенести имя денег в конфиг, и вот что я сделал (пример ниже) во всех файлах 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" но это событие уже произошедшее, то есть, то чего мне по сути не нужно допустить.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, AndreySol сказал:

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

 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

[ ЗП_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 их игнорировал.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

@dsh

И, типа, проще движок править, чем поменять размеры шейпов\сменить тип рестриктора ???

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

AMK-Team.ru

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