Уважаемые гости и новички, приветствуем Вас на нашем форуме
Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».
Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Gratt, я заметил такую вещь, что в Видео 2 для объекта миниатюры вызывается Release(). Но те Вобы, которые мы получаем через GetXXX() из других мест, вызова Release() не требуют. Подсчёт ссылок получается реализован наполовину. Я бы следовал концепции целиком, надо прибавлять счётчик на Get()'ах и требовать вызывать Release(). Я бы ещё вместо new использовал Create()'ы как DirectX например. Или можно разрешить new но использовать std::shared_ptr и не использовать счётчик ссылок внутри классов. Жалко что из движка это уже не выпилить.
Как рисовать 3D объекты в интерфейсе? Чтоб как в инвентаре.
Я не нашёл где в иерархии View'ов можно прикрепить Vob или Visual.
Есть какая-то функция oCItem::RenderItem(zCWorld*, zCViewBase*, float) но она вешает игру.
Смысла нет, так как часто приходится взаимодействовать с движком, а там нет смартпоинтеров.
Основное правило простое: если создаёшь объект или вызываешь функцию с таким предназначением, то нужно вызывать Release(). А иначе - нет.
Хотя есть и исключения. Например, если передаёшь сообщение в zCEventManager::OnMessage(zCEventMessage*, zCVob*), то релизить не надо. Пираньи сами путались в подсчете ссылок...
Slavemaster, спасибо, в целом работает. Хотя m_bIsInventoryWorld есть только в Gothic_II_Addon. Я пробую делать в Gothic_I_Classic. Без этой переменной объекты рисуются в целом так-же как в инвентаре.
Теперь задача этот объект вращать и приближать/удалять.
Я видел есть oCItem::RenderItemPlaceCamera().
Но вот получается я использую один и тот же объект в инвентаре и в своём окне который рисуется два раза по разному.
Может имеет смысл как-то копировать объект в свой zCWorld, в котором выставлена камера и можно выставить объект как надо (и освещение настроить) и затем рисовать весь мир в zCView как в рендер таргет? Или это требует много лишних действий?
Slavemaster, код то что нужно. Он работает, но вот объект теперь рисуется за view'ом. Если view не прозрачный то он закрывает собой объект. Я подумал может хотя бы родительский view будет под ним, но нет, он тоже сверху. Объект получается под всеми нарисованными окнами.
Перед отрисовкой надо для zCView вызвать Blit, чтобы заматчить буфер. Тогда при отрисовке объекта его модель будет сверху.
Однако после блита невозможно будет рисовать текст, поэтому те же пираньи выводят инвентарь в самом конце фрейма.
neromont, ну типа у dx есть буфер выводимого изображения и при рендере объекта в него заносится новая информация, как бы наслаиваясь поверх существующей.
zeratul47, тут подход требует комплексных решений. Главная проблема в том, что oCItem в первой готике не имеет части полей, пришедших в ночи ворона. И тут два варианта. Либо написать производный от oCItem, либо немного изменить поля существующего.
Последний чуть быстрее в реализации. Смотри, в скриптах никогда не используются C_ITEM.nameID и C_ITEM.weight, поэтому забираем их в свои нужды.
Создаем какую-нибудь инстанцию эффекта и присваиваем предмету
А в плагине делаем привязку эффекта к экземпляру предмета.
Для функций oCItem::ThisVobAddedToWorld и oCItem::ThisVobRemovedFromWorld определяем хуки, чтобы произвести создание эффекта в момент вставки объекта в мир
Вооот, это программа минимум. Но когда надеваешь предмет на персонажа, там нужно сделать все тоже самое, но из функций экипировки. Правда есть нюанс, в г1 матрица предмета в слоте всегда будет возвращать 0 0 0, из-за чего эффект будет всегда висеть в нулевой точке координат локации. Сравнивать движки мне пока некогда, возможно Saturas поищет разницу.
И да, важное замечание. Существуют эффекты, частицы которых порождаются на полигонах модели, в г1 такое возможно только для 3ds моделей.
Да, принципиален, поскольку для сиквела я данного отдела в систем паке ини не нахожу.
Даже если из системпака первой готики выдергнуть эту строку ничего не изменится, я проверял.
Значит объясняю. Читать патч через нотпад++ с установленным синтаксисом из менеджера ресурсов.
Все функции, на которые ссылается патч, абсолютно идентичны что в одном движке, что в другом, поэтому просто ищем теже самые места и подставляем новые адреса.
Все байткоды - это обычные условные джампы внутри одной процедуры, поэтому логично что их не трогаем.
А вот последний байткод - это вызов другой процедуры, поэтому смещение придется высчитать по формуле 0x00476038 - (0x006CD0AC + 0x5) = 0xFFDA8F87 , чтобы смещение уткнулось сразу в ее конец и завершилась ничего не делая.
Можете подсказать как в 1.0h провернуть это (https://worldofplayers.ru/threads/41484/ )? Собственно, хочу пошаманить с боевкой: подцепить класс oCNpcMessages, добавить туда своих ивентов, переписать существующие, ну и добавить пару новых полей в oCNpc. Как понимаю, в тестовой сборке этот процесс изменился (по крайней мере на zCLASS_UNION_DEFINITION ругается), так что прошу хотя бы небольшого разъяснения как нынче все работает, или куда копать. Спасибо .
p.s. Я понимаю, что oCNpcMessages в боевке это больше аним контроль и управление, но мне это и нужно.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.