• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте

Вопросы по union

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
там отдельно dll собирается что бы получить эту информацию. но я попробовал использовать относительные пути и всё заработало.

***

Другой, старый вопрос: как получить имя файла ини с которым игра была запущена?
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Slavemaster а есть ли вызов какой то функции перед сменой мира?
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
460
Благодарности
282
Баллы
230
Я хочу попробовать добавить серебро в экономику, возникшие проблемы: 1) жёсткая привязка обменной валюты к C_ITEM, не могу понять какую функцию хукать. 2) нужно добавить в инвентарь строку кол-ва серебра, проблема заключается в том, что отрисовка текста надписи при рендере происходит раньше наложения рамки и в итоге текст выходит тёмный. 3) не понимаю какие функции соотносятся к отображению инвентаря игрока, а какие торговые и контейнера. P.S. для меня инвентарь это какая-то дремучая штуковина и если есть какие-нибудь исходники с его работой, или более полная инфа по работе с ним, было бы просто шикарно.

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

Ну, например, такие идеи по разработке:
1) Нужна торговля за разные типы монет: золото, серебро, стар. монеты.

2) Нужно как-то запомнить, какие предметы за какие монеты продаются.
И поскольку в классе 'C_ITEM' уже нет свободных полей, то нужно создать массив для хранения структур данных, внутри плагина.
Допустим нам нужна функция регистрации, типа:
Daedalus:
// какой предмет, за какую валюту продаётся
RegTradeItemInfo(ItRw_Arrow,    ITMI_GOLD);

Но чтобы не описывать всю кучу предметов, сократим работу, введя новую функцию назначения основной валюты, например:
Daedalus:
// устанавливаем серебро в качестве основной валюты 
SetMainCoin(ITMI_SILVER);
Получается, что нам нужно будет обозначить лишь предметы, торгуемые за золото и за старинные монеты.
Если предмета нет в нашей базе данных о предметах, значит он торгуется за основную валюту, т.е. за серебро.

3) Торговля активируется через диалог, например:
ГГ: Покажи мне свои товары.
НПС: А что конкретно тебя интересует?

Выбор 1: Редкие вещи(за золото - 5 шт)
Выбор 2: Обычные вещи(за серебро - 23 шт)

Выбор 1 -> Покажи редкие вещи. -> Выбирай.
Выбор 2 -> Мне нужны обычные вещи. -> Выбирай.
В обоих случаях открывается режим торговли, но с разными типами торговых валют.
Например, при выборе 1, так:
Daedalus:
SetCurrentTradeCoin(ITMI_GOLD);
А при выборе 2, так:
Daedalus:
SetCurrentTradeCoin(ITMI_SILVER);
SetCurrentTradeCoin - это новая функция назначения текущей валюты для торговли.
Также перед началом торговли нужно временно перенести в некую базу данных, лишь те предметы, что не подходят под выбранную валюту (причём у обоих НПС).
Ну, т.е. если выбрали 'Редкие вещи', то у торговца и у ГГ тоже, остаются только те предметы, что торгуются за золото, всё остальное - отправляется на склад хранения.
Затем после окончания торговли, нужно будет вернуть предметы обратно.
Таким образом мы получаем сортированную торговлю.

4) Если же торговля осуществляется без предварительной сортировки, в так называемом 'киш-миш' режиме.
Это когда все предметы торговца и ГГ имеют разную ценность в разных типах валют.
Тогда придётся выводить информацию о кошельке ГГ, например так:
TestTitle3.jpg

И постоянно подменять текущую валюту.
Как видим, на низком разрешении информация о монетах смотрится "не в тему". Две ещё как-то можно уместить, но три уже лишку.
Или же нужно вместо заголовка контейнера ГГ, написать например: "Мой кошелёк", и дать возможность наводить на него фокус, и в этом случае в окне информации о предмете, выводить именно информацию о денежных запасах ГГ:
TradeMulti.jpg

Но это может быть неудобным решением.

5) Также неизвестно, как лучше обозначить тип монет и цену предмета (через иконки или текстом).
Нужно понимать, что иконка золотой монеты и старой - похожи. А размером в 10х10 пикселей, они сливаются почти в одну цветную точку.
Мелкая серебряная также может напрягать глаза.

6) Также нужно учесть то, что будет отображаться в заголовке контейнера ГГ в свободном режиме, т.е. вне режима торговли.

7) Ещё нужна будет функция регистрации названия монет, при выводе их заголовке контейнера, что-то типа:
Daedalus:
RegInvTitleItem("Золото: ", ITMI_GOLD);
RegInvTitleItem("Серебро: ", ITMI_SILVER);
RegInvTitleItem("Стар. монеты: ", ITMI_OLDCOIN);

И так далее...
Т.е. нужен полный обзор работы системы.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.221
Благодарности
3.447
Баллы
485
Если подразумевается простая замена золота на серебро, то это делается несколькими строчками в файле .d в папке system/autorun (или в скриптах).
Пример замены золота на руду:

Daedalus:
//замена предмета-валюты с ITMI_GOLD
const string TRADE_CURRENCY_INSTANCE = "ITMI_NUGGET";

//замена текста (для кириллицы файл сохранять в кодировке ANSI)
const string NAME_Currency = "Руда: ";
const string PRINT_Trade_Not_Enough_Gold = "У вас недостаточно руды для покупки этого предмета.";

Untitled.jpg
 
Последнее редактирование:

Maksh

Участник форума
Регистрация
11 Дек 2024
Сообщения
5
Благодарности
0
Баллы
10
Добрый день! Подскажите, пожалуйста, есть ли возможность добавлять свой плагин поверх установленного Нового баланса (на стим версии готики)?
С чистой готикой плагины работают, с новым балансом - нет. Для совместимости можно использовать zParserExtender?
У меня есть цель создать мод с квестами по отрисовке картин (с созданием скриншота в игре и дальнейшим появлением его на холсте). Важно, чтобы этот мод работал вместе с установленным новым балансом.
Если кто-то сможет пнуть в нужном направлении, буду очень благодарна.
 
Последнее редактирование:

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
460
Благодарности
282
Баллы
230
Для совместимости можно использовать zParserExtender?
Ну, он скорей не для совместимости, а для внедрения/изменения скриптов. Про его возможности можешь почитать в соотв. теме:
https://worldofplayers.ru/threads/41999/#post-1086550
А так, просто пишешь отдельный d-скрипт с НПС, его диалогами и прочей логикой вставки на локацию. Затем сохраняешь этот скрипт в папке "Gothic2\System\autorun\". Потом, после успешных испытаний можешь его упаковать в отдельный мод-том и распространять как угодно.

У меня есть цель создать мод с квестами по отрисовке картин (с созданием скриншота в игре и дальнейшим появлением его на холсте). Важно, чтобы этот мод работал вместе с установленным новым балансом.
По плагину скажу так. На стандартном рендере DX7 возможно сделать скриншот экрана, преобразовать его в текстуру, изменить пиксели, альфа-канал и прочее. Затем естественно сохранить в папку с текстурами. Принцип работы такой же, как во время сохранения превью картинки для файла сохранения.
Ну и в последующем уже - можно загружать эту текстуру и накладывать на любые поверхности. Или просто поиском найти материал, той же самой картины, и заменить его текстуру на текстуру скриншота. Но этот вопрос скорей для тех, кто очень знаком с движком и его функционалом.
MakeScreen2.png
MakeScreen3.png
MakeScreen1.jpg
MakeScreen4.jpg

С включённым враппером DX11 (для Готики) будут проблемы при создании скриншотов. Максимально возможный скриншот 256х256.
Судя по откликам, проблема актуальна и по сей день:
https://github.com/kirides/GD3D11/issues/125
 
Последнее редактирование:

ang1

Участник форума
Регистрация
6 Июн 2010
Сообщения
608
Благодарности
61
Баллы
200
Добрый день! Подскажите, пожалуйста, есть ли возможность добавлять свой плагин поверх установленного Нового баланса (на стим версии готики)?
С чистой готикой плагины работают, с новым балансом - нет. Для совместимости можно использовать zParserExtender?
У меня есть цель создать мод с квестами по отрисовке картин (с созданием скриншота в игре и дальнейшим появлением его на холсте). Важно, чтобы этот мод работал вместе с установленным новым балансом.
Если кто-то сможет пнуть в нужном направлении, буду очень благодарна.
Ты имеешь в виду блокировка в НБ?
 

Maksh

Участник форума
Регистрация
11 Дек 2024
Сообщения
5
Благодарности
0
Баллы
10
Спасибо за ответ!
А так, просто пишешь отдельный d-скрипт с НПС, его диалогами и прочей логикой вставки на локацию
Да, про это знаю, тут проблем нет.
Я правильно понимаю, что если восстановлю совместимость моей игры (с установленным новым балансом) с DX7, то возникнут проблемы с производительностью, всякие баги и прочие неприятные вещи?
Скрипты НБ зашифрованы, как я понимаю. Могу ли я внедрить свой плагин в игру с установленным новым балансом при помощи zParserExtender? Или это можно сделать каким-то другим способом?
Пост автоматически объединён:

Ты имеешь в виду блокировка в НБ?
Да, она не позволяет привычным способом внедрять в игру плагины.
 

ang1

Участник форума
Регистрация
6 Июн 2010
Сообщения
608
Благодарности
61
Баллы
200
Спасибо за ответ!

Да, про это знаю, тут проблем нет.
Я правильно понимаю, что если восстановлю совместимость моей игры (с установленным новым балансом) с DX7, то возникнут проблемы с производительностью, всякие баги и прочие неприятные вещи?
Скрипты НБ зашифрованы, как я понимаю. Могу ли я внедрить свой плагин в игру с установленным новым балансом при помощи zParserExtender? Или это можно сделать каким-то другим способом?
Пост автоматически объединён:


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

DAMROCK

Участник форума
Регистрация
23 Янв 2017
Сообщения
23
Благодарности
6
Баллы
160
Получилось ли что-то сделать по этой теме? Если нет, то:
Есть ли концепция/наброски твоей задумки? Интересует описание и желательно со схемами или картинками.
Если не хочешь афишировать наброски, можешь написать в личку.

Ну, например, такие идеи по разработке:
1) Нужна торговля за разные типы монет: золото, серебро, стар. монеты.

2) Нужно как-то запомнить, какие предметы за какие монеты продаются.
И поскольку в классе 'C_ITEM' уже нет свободных полей, то нужно создать массив для хранения структур данных, внутри плагина.
Допустим нам нужна функция регистрации, типа:
Daedalus:
// какой предмет, за какую валюту продаётся
RegTradeItemInfo(ItRw_Arrow,    ITMI_GOLD);

Но чтобы не описывать всю кучу предметов, сократим работу, введя новую функцию назначения основной валюты, например:
Daedalus:
// устанавливаем серебро в качестве основной валюты
SetMainCoin(ITMI_SILVER);
Получается, что нам нужно будет обозначить лишь предметы, торгуемые за золото и за старинные монеты.
Если предмета нет в нашей базе данных о предметах, значит он торгуется за основную валюту, т.е. за серебро.

3) Торговля активируется через диалог, например:
ГГ: Покажи мне свои товары.
НПС: А что конкретно тебя интересует?

Выбор 1: Редкие вещи(за золото - 5 шт)
Выбор 2: Обычные вещи(за серебро - 23 шт)

Выбор 1 -> Покажи редкие вещи. -> Выбирай.
Выбор 2 -> Мне нужны обычные вещи. -> Выбирай.
В обоих случаях открывается режим торговли, но с разными типами торговых валют.
Например, при выборе 1, так:
Daedalus:
SetCurrentTradeCoin(ITMI_GOLD);
А при выборе 2, так:
Daedalus:
SetCurrentTradeCoin(ITMI_SILVER);
SetCurrentTradeCoin - это новая функция назначения текущей валюты для торговли.
Также перед началом торговли нужно временно перенести в некую базу данных, лишь те предметы, что не подходят под выбранную валюту (причём у обоих НПС).
Ну, т.е. если выбрали 'Редкие вещи', то у торговца и у ГГ тоже, остаются только те предметы, что торгуются за золото, всё остальное - отправляется на склад хранения.
Затем после окончания торговли, нужно будет вернуть предметы обратно.
Таким образом мы получаем сортированную торговлю.

4) Если же торговля осуществляется без предварительной сортировки, в так называемом 'киш-миш' режиме.
Это когда все предметы торговца и ГГ имеют разную ценность в разных типах валют.
Тогда придётся выводить информацию о кошельке ГГ, например так:
Посмотреть вложение 127741
И постоянно подменять текущую валюту.
Как видим, на низком разрешении информация о монетах смотрится "не в тему". Две ещё как-то можно уместить, но три уже лишку.
Или же нужно вместо заголовка контейнера ГГ, написать например: "Мой кошелёк", и дать возможность наводить на него фокус, и в этом случае в окне информации о предмете, выводить именно информацию о денежных запасах ГГ:
Посмотреть вложение 127761
Но это может быть неудобным решением.

5) Также неизвестно, как лучше обозначить тип монет и цену предмета (через иконки или текстом).
Нужно понимать, что иконка золотой монеты и старой - похожи. А размером в 10х10 пикселей, они сливаются почти в одну цветную точку.
Мелкая серебряная также может напрягать глаза.

6) Также нужно учесть то, что будет отображаться в заголовке контейнера ГГ в свободном режиме, т.е. вне режима торговли.

7) Ещё нужна будет функция регистрации названия монет, при выводе их заголовке контейнера, что-то типа:
Daedalus:
RegInvTitleItem("Золото: ", ITMI_GOLD);
RegInvTitleItem("Серебро: ", ITMI_SILVER);
RegInvTitleItem("Стар. монеты: ", ITMI_OLDCOIN);

И так далее...
Т.е. нужен полный обзор работы системы.
Благодарю за отличный пример! я задумывался над реализацией системы, но ещё не так глубоко, по части экономики) Пришёл к выводу, что было бы интересно проработать инвентарь и предоставить его немного в другом свете.

Сейчас разбираюсь с камерой, в частности с кватернионами, так как хочу акцентировать внимание на работе с курсором мыши, в режиме инвентаря вращать камеру вокруг героя только при необходимости, нажатием ЛКМ.


Так я начал работать над инвентарём с нуля, однако, пока что не могу понять как выключить старый совсем.
По части монет и экономики- очень сложный момент с различными вариантами исполнения, на данный момент, я это воспринимаю как некий экспериментальный полигон, но я склоняюсь к тому, чтобы сделать гибридную систему как в Готике 3.


Основной валютой сделать серебро, так наличие золота может стать, своего рода, требованием финансового уровня, для более серьёзного крафта и обучения, учитывая моё желание- попробовать сделать динамическую экономику.


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

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
460
Благодарности
282
Баллы
230
Вроде помогает плагин от поляков, называется zBlockerFucker качать на миртане
Можно ещё прикинуться одним из разрешённых плагинов, например, "zTest.dll". Хотя их там целый список...
И когда новый плагин получит разрешение на загрузку, тогда он уже сможет загружать и остальные целевые плагины из списка, через функцию LoadLibrary().
Как вариант.

Благодарю за отличный пример! я задумывался над реализацией системы, но ещё не так глубоко, по части экономики)
Да не за что... Просто у меня были некоторые мысли на этот счёт и немного наработок, решил поделиться.
Мой выбор пал на сортированный режим торговли. Первые тесты прошли успешно. Последней проблемой было найти наиболее удобную систему отображения монет.
В принципе, мысленно, я пришёл к нескольким техническим решениям:
C++:
// примеры режимов отображения монет в заголовке контейнера:
enum eShowCoinsInTitleState
{
    SHOW_ONLY_MAIN_CURRENCY,  // показывать только основную валюту
    SHOW_ONLY_MANY_CURRENCY,  // показывать только те монеты, которых больше всех
    SHOW_EVERY_TIMED,         // показывать каждую зарегистрированную, по очереди, временно (на 2 сек)
    SHOW_TABLE_CURRENCY,      // показывать таблицу монет, с названиями и иконками (до 4х максимум)
    SHOW_CUSTOM               // кастомный выбор (ручное управление по флагам)
};
Первые 3 режима - почти тоже самое, что и оригинал, только с небольшими изменениями. Например, можно ещё добавить иконку типа монет.
Есть набросок режима "SHOW_TABLE_CURRENCY" (это рисунок):
TradeMulti_ListCoins.jpg

Последний режим - это чисто ручное управление содержимым заголовка. Например, можно вывести только один/два определённых вида монет (в строчку или в таблицу). Этот режим можно вообще не использовать.

Нужно сначала сделать всё в общем виде, а потом уже управлять всеми этими настройками по желанию:
1) в скриптах, через функции
2) или в меню, через специальный блок настроек плагина.


Иконку монеты в описании предмета можно использовать, а можно - не использовать.
Как вариант, использовать текст, как в Г3: "Цена в золоте/серебре/старинных монетах" и т.д. С текстом было бы проще, не нужно ничего выравнивать или подгонять. Да и изначальный стиль не сильно пострадает.
В общем, если сильно не заморачиваться и не углубляться в перфекционизм, опустив некоторые решения, то вполне можно сделать примитивную торговлю в нескольких денежных единицах. Это реально может работать.

Так я начал работать над инвентарём с нуля, однако, пока что не могу понять как выключить старый совсем.
Как вариант, попробуй перехватить нажатие логической клавиши, отвечающей за откр/закр. инвентаря:
C++:
//0x006FC170 private: virtual int __thiscall oCGame::HandleEvent(int)
static int __fastcall Game_HandleEvent(oCGame* _this, void* vt, int key);
static CInvoke <int(__thiscall*)(oCGame*, int)> pGame_HandleEvent(0x006FC170, Game_HandleEvent, IVK_AUTO);
static int __fastcall Game_HandleEvent(oCGame* _this, void* vt, int key)
{
    if (!player)
        return FALSE;

    if (_this && _this->world && _this->world->csPlayer && _this->world->csPlayer->GetPlayingGlobalCutscene())
        return FALSE;
 
    zWORD LogicalKey = zinput->GetFirstBindedLogicalKey(key);

    if (LogicalKey == GAME_INVENTORY)
    {
        cmd << "Произошла попытка открыть инвентарь." << endl;
        return TRUE;
    }

    pGame_HandleEvent(_this, key);
}

я склоняюсь к тому, чтобы сделать гибридную систему как в Готике 3.
А как там было?

Основной валютой сделать серебро, так наличие золота может стать, своего рода, требованием финансового уровня, для более серьёзного крафта и обучения, учитывая моё желание- попробовать сделать динамическую экономику.
Можно сделать ещё такой обмен. Золотую можно обменять, например, условно, на 100 серебряных монет. Т.е. от золота ГГ избавят легко. А вот наоборот поменять серебро на золото - это проблема. Никто не хочет этого делать, либо цена обмена: 1 зол. за 1000 серебра. Правда, нужно взвесить за и против. Потому что может быть, что один из обменов не будет иметь смысла.

но есть некоторые нюансы с отрисовкой предметов в инвентаре, например подсчёт выделяемой памяти.
что ты имеешь в виду под "подсчётом выделяемой памяти"?
 
Последнее редактирование:
Сверху Снизу