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

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

    Ссылка на конкурсную тему - тык

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.439
Благодарности
4.789
Баллы
625
  • Первое сообщение
  • #1
1767600363729.png

RU EN

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

Grif1998

Участник форума
Регистрация
4 Ноя 2020
Сообщения
5
Благодарности
0
Баллы
55
А что делать, если Union не устанавливается? Скачиваю Player Kit и Юнион 1.0, но не могу их установить. Нажимаю установить, но не происходит выбор папки для установки, просто высвечивается уведомление "Завершено успешно - продолжить".
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.688
Благодарности
7.425
Баллы
1.910
Удалить папку C:\ProgramData\Union
 

spadling1

Участник форума
Регистрация
17 Апр 2024
Сообщения
3
Благодарности
0
Баллы
5
Usuń folder C:\ProgramData\Union
У меня такая же проблема, не могу изменить, playerkit и Union установлены в programdata/union, я удаляю эту папку, но всякий раз, когда я пытаюсь установить ее снова, эта папка продолжает создаваться, и я не могу выбрать gog/ готика. Вы можете помочь мне? Я борюсь с этим и, к сожалению, ничего не помогает. С уважением
 
Последнее редактирование:

Antramentor

Участник форума
Регистрация
25 Июл 2018
Сообщения
7
Благодарности
2
Баллы
150
Такая же проблема, что и у людей сверху. Нажимаю скачать/установить player kit и union, появляется окно "установка прошла успешно", но окон с выбором папки и ничего иного нет. Как решить проблему? Удалял папку юнион в програм дата и пробовал по новой, не помогло
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
parser->AddClassOffset(Z "C_NPC", sizeof(oCVob));
Подскажите, а где это прописывать?
Пост автоматически объединён:

alexeich2019, ну смысл тут такой. Добавить с C_NPC конечно же не сможешь, поскольку C_NPC - это кусок памяти внутри объекта NPC. Скриптовый класс имеет специальное смещение, равное началу первого скриптового поля (для C_ITEM сделано также).
C++:
// Пример как это сделано в классе NPC
parser->AddClassOffset(Z "C_NPC", sizeof(oCVob));


Ты можешь реализовать похожую махинацию, но непосредственно в новой области oCNpcEX двумя способами:
C++:
// Первый - это если у тебя скриптовые поля будут
// начинаться в самом начале класса, тогда
// достаточно выровняться по размеру oCNpc
parser->AddClassOffset(Z "C_NPCEX", sizeof(oCNpc));


// Либо, если твои поля не в начале нового класса, то как вариант:
class oCNpcEx : public oCNpc {
  ...
  int firstScriptVar;
  ...
};

oCNpcEx* npc = Null;
int offset = (int)&npc->firstScriptVar;
parser->AddClassOffset(Z "C_NPCEX", offset);

Посмотреть вложение 94191

И далее в скриптах уже по месту кастуешься между C_NPC и C_NPCEX
Daedalus:
var C_NPC focusNpc; focusNpc = Npc_GetFocusNpc();
focusNpc.guild = GIL_PAL;
var C_NPCEX focusNpcEx; focusNpcEx = focusNpc;
focusNpcEx.firstScriptVar = 10;
Если напрямую не сможешь кастануть, смотри в сторону Cast_* в zParserExtender.
Это из вот этого ответа. Хотелось бы чуток конкретнее.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.688
Благодарности
7.425
Баллы
1.910

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
СырGuy,
Скачай какой-нить маленький плагин из этой темы

И посмотри его исходники.
Можешь еще вот это посмотреть
Если не сложно, то могли бы подсказать, где конкретно реализовано такое? Я знаю, как работать с union. Просто тут не особо понятно, куда вставлять этот метод.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.688
Благодарности
7.425
Баллы
1.910
СырGuy, не совсем удобно писать.
В кратце:
Ставим визуал с++
через ресурменеджер ставим сдк
И начинаем кодить.
В уроках по юнион есть тема для начинающих.
Там уроки в виде видосов, но все вполне понятно и доступно.
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
СырGuy, не совсем удобно писать.
В кратце:
Ставим визуал с++
через ресурменеджер ставим сдк
И начинаем кодить.
В уроках по юнион есть тема для начинающих.
Там уроки в виде видосов, но все вполне понятно и доступно.
Я же, вроде, написал, что уже пользуюсь union. Хотелось бы конкретики, куда вставлять метод указанный? Может нужно функцию какую-то перехватывать или в Game_Loop() вставлять (В чем я сомневаюсь) или что? Или в классе наследнике oCNpcEx в конструкторе писать? Где этот метод писать?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.688
Благодарности
7.425
Баллы
1.910
СырGuy, если ты уже кодишь на этом, тогда я не понимаю вопроса:
Куда писать
"parser->абракадабра"?
Просто, если уже кодишь, и пара функций уже были созданы. Тогда нужна конкретика, что именно ты хочешь сделать? что именно не получается?
*sorry*
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
СырGuy, если ты уже кодишь на этом, тогда я не понимаю вопроса:
Куда писать
"parser->абракадабра"?
Просто, если уже кодишь, и пара функций уже были созданы. Тогда нужна конкретика, что именно ты хочешь сделать? что именно не получается?
*sorry*
Мне нужно тоже, что требовалось человеку, которому ответил Gratt: Ему нужно было из oCNpcEx поле int foo[20], которое он добавил в класс наследник в юнионе, добавить в скриптовый класс C_NPC, на что было отвечено, что так нельзя делать. Необходимо выполнить смещение определенное в юнионе для парсера и в дедалусе постараться присвоить переменной класса C_NPCEX переменную класса C_NPC и изменить для этого объекта уже поле, которое мы добавили новое в oCNpcEx. Как это сделать? В каком месте то самое смещение "parser->абракадабра" писать? Или ссылочку можно на тему, где эта ситуация реализована или в каком плагине реализовано?
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.688
Благодарности
7.425
Баллы
1.910

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.147
Благодарности
2.021
Баллы
320
СырGuy,
C++:
// Первый - это если у тебя скриптовые поля будут
// начинаться в самом начале класса, тогда
// достаточно выровняться по размеру oCNpc
parser->AddClassOffset(Z "C_NPCEX", sizeof(oCNpc));
Это после хука oCGame :: LoadParserFile. Скриптовый класс C_NPCEX должен содержать только новые поля.

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

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
СырGuy,
C++:
// Первый - это если у тебя скриптовые поля будут
// начинаться в самом начале класса, тогда
// достаточно выровняться по размеру oCNpc
parser->AddClassOffset(Z "C_NPCEX", sizeof(oCNpc));
Это после хука oCGame :: LoadParserFile. Скриптовый класс C_NPCEX должен содержать только новые поля.

Если немного заморочиться, то можно и в C_NPC полей добавить, как мне кажется.
Вот, спасибо. Будем пробовать )
Пост автоматически объединён:

Slavemaster,
Я так понимаю, что должно получиться что-то такое?

C++:
HOOK Hook_oCGame_LoadParserFile_Union AS(&oCGame::LoadParserFile, &oCGame::LoadParserFile_Union);

    int __thiscall oCGame::LoadParserFile_Union(zSTRING const& parserfile)
    {
        int res = THISCALL(Hook_oCGame_LoadParserFile_Union)(parserfile);
        oCNpcEx* npc = Null;
        int offset = (int)&npc->inst;
        parser->AddClassOffset(Z "C_NPCEX", offset);
        return res;
    }

Daedalus:
// classes.d

class C_NPCEX
{
    var int inst;
};

//func.d

func void blabla()
{
    var C_NPCEX NpcEx;
    NpcEx = Hlp_GetNpc(hero);
    NpcEx.inst = 10;
}
 
Последнее редактирование:

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
29
Благодарности
5
Баллы
45
Так-с, вроде, получилось )

C++:
HOOK Hook_zCParser_CreatePCode_Union AS(&zCParser::CreatePCode, &zCParser::CreatePCode_Union);

    void __thiscall zCParser::CreatePCode_Union(void)
    {
 
        oCNpcEx* npc = Null;
        int offset = (int)(&npc->inst);
        zCPar_Symbol* sym = parser->GetSymbol("C_NPCEX");

         // если поле в начале класса, то пишем в двух нижележащих методах sizeof(oCNpc) вместо offset
        if ((sym) && (sym->type == zPAR_TYPE_CLASS)) sym->SetClassOffset(offset);
        parser->AddClassOffset(Z "C_NPCEX", offset);

        THISCALL(Hook_zCParser_CreatePCode_Union)();
    }


Daedalus:
// classes.d



class C_NPCEX

{

    var int inst;

};



//func.d



func void blabla()

{

    var C_NPCEX NpcEx;

    NpcEx = Hlp_GetNpc(hero); // вместо hero свою инстанцию, если надо

    NpcEx.inst = 10;

}


Пробуйте :). Всем спасибо большое за подсказки)
Пост автоматически объединён:

А можно ли таким способом передавать поле C_ITEM в класс С_NPCEX?
 
Последнее редактирование:

CloserPopcorn20

Участник форума
Регистрация
13 Авг 2024
Сообщения
2
Благодарности
0
Баллы
5
При запуске Steam-версии Union в Wine, он выдаёт эту ошибку. Такое случается именно с Готикой 2, потому что с Готикой 1 всё в порядке. Может быть где-нибудь что-нибудь прописать, чтобы можно было отключить этот "Event object"?
 

Вложения

  • 1000222239.jpg
    1000222239.jpg
    510,2 KB · Просмотры: 110
Последнее редактирование модератором:
Сверху Снизу