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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Внимание!
    — Требуется примерно по 3-5 человек на каждую из версий ОС:: - Windows® XP SP3, Windows® Vista SP2, Windows® 7 SP1, Windows® 8, Windows® 8.1, Windows® 10(build 10 1607) и Windows® 10(build 10 1703). Для стационарных ПК и ноутбуков. Заявку на участие можно оставить здесь...
  • Внимание!
    — Требуется примерно 2-3 человека для теста неофициального патча для игры "Корсары: Город потерянных кораблей". Заявку на участие можно оставить здесь...
  • Друзья, доброго времени суток!
    Хотелось бы посоветовать вам ознакомиться с творчеством наших форумчан, посвященным серии игр "Готика". При желании прочесть конкурсные работы и оценить их. Данный конкурс у нас проходит ежегодно. Ждем именно вас.

    Ссылка на конкурсную тему - тык
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

    Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в следующих номинациях:
    "Знаток года по игровым разделам", "Знаток года по НЕ игровым разделам", "Литератор года", "Лучший ведущий темы", "Шутник года", "Новостник года", "Модостроитель года", "Модератор года", "Редактор года", "Машинима-режиссёр года", "Мастер скринов года", "Форумчанин года" и др.
    Также проводится выбор лучших раздела/подраздела, темы/цикла тем и мода (вышедшего в этом году)

    По желанию, аргументировать свой выбор можете в теме обсуждения голосования.

AST SDK - Помощь по работе

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.548
Благодарности
1.842
Баллы
320
  • Первое сообщение
  • #1
В комплекте с AST идет API, который необходимо поместить в папку с исходниками плагина.

Прежде всего, с гордостью заявляю, что это более чем полноценный SDK не только для AST, но и на игру Gothic в целом. Возможности пакета позволяют гибко и комфортно работать с движком, изменяя, добавляя или дополняя его стандартный функционал.

Что необходимо знать о C/C++ для работы с SDK:

0. Рекомендуется использовать Visual Studio 2012. бегло пробежаться по синтаксису С/С++ и заострить внимание на вещах, представленных ниже.

1. Работа начинается с подключения заголовочных файлов. Необходимо понимать что они из себя представляют и как работают, поскольку их будет катастрофически много. Об этом можно спокойно почитать в интернете, однако кратко опишу некоторые грабли новичков:
Первое, на что я обращаю внимание, в заголовочных файлах рекомендуется использовать только статические данные (static, const, extern), либо их прототипы (объявление без кода реализации). В противном случае, если производить вызов заголовочника из разных файлов исходного кода (.cpp), выскочит ошибка о переопределении данных.

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

2. Далее следует понять что такое указатели. об этом тоже можно почитаете в интернете. для справки поясню:
Указатель - это ссылка на объект в памяти. наглядно показываю задачкой как оно работает:
int A; // Переменная типа int
int* B = &A; // Указатель на переменную типа int
int** C = &B; // Указатель на указатель на переменную типа int
A = 10; // присваиваем A значение 10
// Рассмотрим результаты вывода задачи

Print(A); // Результат = 10
Print(*B); // Результат = 10
Print(**C); // Результат = 10
Print(&A); // Результат = адрес расположения элемента A
Print(B); // Результат = адрес расположения элемента A
Print(*C); // Результат = адрес расположения элемента A
Print(&B); // Результат = адрес расположения указателя B
Print(C); // Результат = адрес расположения указателя B
Print(&C); // Результат = адрес расположения указателя C
A, к примеру, имеет адрес 0x00000700. (& (амперсанд) получает адрес объекта в памяти)
B ссылается на адрес 0x00000700, в котором находится объект A.
соответственно, C ссылается на адрес B, по которому лежит адрес A.

3. Классы. все построено на классах и структурах. частично скриптеры с ними уже знакомы, так что особых проблем тут не возникнет.
основные понятия, которые следует изучить для написания своих нормальных классов:
  1. конструкторы и деструкторы.
  2. уровни доступности: public, private, protected...
  3. статический метод(функция)/свойство(переменная)
  4. виртуальный метод. отличие от обычного. абстрактный класс. (по желанию)
  5. соответственно почитать о наследовании (по желанию)
4. От себя советую изучить макросы #define. очень простая и удобная штука

В остальном многие понятия вам уже знакомы, если приходилось копаться в скриптах (дедал по синтаксису нечто между Паскалем и Си)

-------

Определить путь выходного файла можно заранее определить в системную папку игры, пройдя в меню Проект->Свойства->Общие->Выходной каталог & Наименование. (хоткей компиляции F7 на 2012 студии)

-------

Плагины уже имеют все необходимые настройки и основные функции событий (Покадровый цикл, второстепенный поток, инициализация плагина...), найти их можно в фильтре Source
 

Вложения

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

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
165
Благодарности
44
Баллы
175
Есть еще вопрос - Готика же не просчитывает логику и все остальное, что касается NPC за пределами видимости ГГ. Реально ли как-то в AST это изменить? Может если рендерить не всех NPC (во избежании перенагрузки) можно зарендерить близ определенных координат? Например игрок находится в башне ксардаса, но вокруг позиции 0.0.0 в радиусе 2500 рендерятся NPC, у них выполняется рутина и т.п.
Насколько я знаю, нпц вставляются в радиусе 3500 от гг, а исчезают - если он отойдет на 4000 от героя. Но это не точно) Может у вас значения другие. Если есть желание - смотрите и изменяйте как вам надо.

C++:
float& SPAWN_INSERTRANGE = *(float*)0x008BACD0;
float& SPAWN_REMOVERANGE = *(float*)0x008BACD4;
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
41
Благодарности
59
Баллы
85
Насколько я знаю, нпц вставляются в радиусе 3500 от гг, а исчезают - если он отойдет на 4000 от героя. Но это не точно) Может у вас значения другие. Если есть желание - смотрите и изменяйте как вам надо.

C++:
float& SPAWN_INSERTRANGE = *(float*)0x008BACD0;
float& SPAWN_REMOVERANGE = *(float*)0x008BACD4;
Спасибо, то что искал. А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
165
Благодарности
44
Баллы
175
А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
Т.е. совсем в конкретном радиусе, а не в радиусе от героя ?
Технически, аст для этого не нужен - нужно просто вставить нпц в этом радиусе, и нигде больше.

На счет Аст - не скажу, я не понимаю ТЗ, что-бы сказать, как это сделать.
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.548
Благодарности
1.842
Баллы
320
Спасибо, то что искал. А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
Прежде всего надо понимать что конкретно ты хочешь. Есть большая вероятность поломать AI неписей. Резкие изменения радиуса отрисовки/исполнения циклофункций крайне нежелательны.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
41
Благодарности
59
Баллы
85
Мне необходимо сделать хук функций _Forward и JumpForward (методы oCAniCtrl_Human), но появилась проблема. По отдельности эти хуки работают, а вот вместе - нет. При запуске получаю ошибку (скрин прикреплен). Может кто помочь разобраться? Код прикрепляю. Я бы может и избежал проблемы через пару часов методом тыка, но хочется конкретно понять в чем проблема, чтобы в будущем не допускать :)

C++:
int wmode = -1;
// 0 - stay
// 1 - fwd
// 2 - bwd
// 3 - jmp

void __fastcall Hook_JMPFWD(oCAniCtrl_Human* _this, void* vtable);
CInvoke <void(__thiscall*) (oCAniCtrl_Human* _this)> pHook_JMPFWD(0x006B21E0, Hook_JMPFWD, IVK_AUTO);

void __fastcall Hook_JMPFWD(oCAniCtrl_Human* _this, void* vtable) {
    if (wmode != 3) {
        Say::Box("Jump");
        wmode = 3;
    }
    pHook_JMPFWD(_this);
};

//------------------------------------------------------------------------------------

void __fastcall Hook_FWD(oCAniCtrl_Human* _this, void* vtable);
CInvoke <void(__thiscall*) (oCAniCtrl_Human* _this)> pHook_FWD(0x006B7900, Hook_FWD, IVK_AUTO);

void __fastcall Hook_FWD(oCAniCtrl_Human* _this, void* _vtable) {
    if (wmode != 1) {
        Say::Box("Forward");
        wmode = 1;
    }
    pHook_FWD(_this);
};
 

Вложения

  • 7,1 KB Просмотры: 18

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
165
Благодарности
44
Баллы
175
@OsmithREV,
Первое что бросается в глаза
0x006B21E0 public: int __thiscall oCAniCtrl_Human::JumpForward(void)
0x006B7900 public: void __thiscall oCAniCtrl_Human::_Forward(void)
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
41
Благодарности
59
Баллы
85
@OsmithREV,
Первое что бросается в глаза
0x006B21E0 public: int __thiscall oCAniCtrl_Human::JumpForward(void)
0x006B7900 public: void __thiscall oCAniCtrl_Human::_Forward(void)
Понял, я невнимательный. Все теперь работает правильно. Спасибо.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
41
Благодарности
59
Баллы
85
Реально ли как-то узнать длительность анимации? Желательно в миллисекундах. Вроде видел что-то на уровне numFrames в zCModelAni, но не уверен, что это нужное.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
500
Благодарности
193
Баллы
220
Реально ли как-то узнать длительность анимации
C++:
   zCModel* pModel = player->GetModel();
    if (!pModel)
        return;
    int aniID = pModel->GetAniIDFromAniName("S_RUN");
    zCModelAni* pAni = pModel->GetAniFromAniID(aniID);
    if (!pAni)
        return;

    screen->Print(100, 150 * 1, zSTRING(pAni->fpsRate, 5));    // (25 кадров / сек)
    screen->Print(100, 150 * 2, zSTRING(pAni->numFrames)); // (50 кадров анимации)
    screen->Print(100, 150 * 3, zSTRING(pAni->numFrames * 1000 / pAni->fpsRate, 5)); // выполнится за (50 / 25 = 2 сек или 2000 мсек)
Ps: Исправлено. Ошибочка была, тысячу в левую сторону нужно было перенести, а не в правую по отношению к делению.
 
Последнее редактирование:

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
41
Благодарности
59
Баллы
85
Вопрос - можно ли как-то правильно идентифицировать все объекты в мире? Имя может быть не всегда установлено, а просто простой список может быть не точен даже если сортировать его по имени 3ds файла, т.к. весь список может быть бесполезен при дропе предмета и т.п. Может у объектов есть какой-то уникальный ID или что-то вроде того?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.548
Благодарности
1.842
Баллы
320
Вопрос - можно ли как-то правильно идентифицировать все объекты в мире? Имя может быть не всегда установлено, а просто простой список может быть не точен даже если сортировать его по имени 3ds файла, т.к. весь список может быть бесполезен при дропе предмета и т.п. Может у объектов есть какой-то уникальный ID или что-то вроде того?
Нет. Прямого способа идентифицировать объект не существует. Не сложно реализовать свой, но придется немного изменить формат архиватора.

при дропе предмета
Отслеживай событие дропа, так или иначе это будет намного правильнее перебора объектов из общего списка.
 

DAMROCK

Участник форума
Регистрация
23 Янв 2017
Сообщения
7
Благодарности
1
Баллы
40
Всем привет. Мало помалу начал изучать методы движка. И задумал изменить максимальное количество атрибутов для oCNpc, поставив m_nAttribute[9], также прописал const int NPC_ATR_STAMINA = 8;
в файле скрипта констант добавил новую строчку. Скомпилировал плагин и скрипты, последовательно разместив их в пригодные им папки.
Однако, при загрузке новой игры она вылетела и выдало сообщение
Error-M_SNCpng.png
Что мне делать дальше и в чем моя ошибка?:confused:
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.548
Благодарности
1.842
Баллы
320
Всем привет. Мало помалу начал изучать методы движка. И задумал изменить максимальное количество атрибутов для oCNpc, поставив m_nAttribute[9], также прописал const int NPC_ATR_STAMINA = 8;
в файле скрипта констант добавил новую строчку. Скомпилировал плагин и скрипты, последовательно разместив их в пригодные им папки.
Однако, при загрузке новой игры она вылетела и выдало сообщение Что мне делать дальше и в чем моя ошибка?:confused:
Вопрос очень простой, если понимать что такое класс и объект класса. Попробую очень кратко:
int m_nAttribute[8] - поля класса размера sizeof(int) * 8 = 32байта. Столько памяти в объекте будет выделено под массив. А смещение к этому массиву будет рассчитываться исходя из размеров всех полей ранее.
Допустим есть такой класс
C++:
class CMyClasss {
    int m_nVar1; // 4 байта
    float m_fVar2; // 4 байта
    double m_dVar3; // 8 байт
};
его размер будет равен сумме объектов внутри него - 4+4+8 = 16 байт. Смещение к m_dVar3 будет равно 8 байт.
Возвращаемся к вопросу. Ты изменил размер массива, тем самым исказив размер класса oCNpc и смещения ко всем свойствам после m_nAttribute. Плюс не учел того, что эти размеры меняются только в плагине. Движковая же реализация остается неизменной и получается несовместимость твоего типа oCNpc с оригиналом.
В сообщении об ошибке говорится о второй проблеме, которая является следствием предыдущей. Ты также изменил поле C_NPC::m_nAttribute[8], которое теперь не совпадает с движком, а значит не может работать корректно.

В качестве решения мы можем обмануть движок. Скормим ему переменные в неюзабельные поля. К примеру массив m_sName используется не полностью. Усечем массив с [4] до [3] и получим свободные 20 байт (проверь меня через sizeof(string)). Эти байты можно представить как 5 переменных типа int т.к. sizeof(string)/sizeof(int)=5.
Daedalus:
C_NPC {
...
    string m_sName[3];
    int m_nNewVar1;
    int m_nNewVar2;
    int m_nNewVar3;
    int m_nNewVar4;
    int m_nNewVar5;
...
};
Для решения твоей задачи такой вариант будет избыточен, но если вдруг его будет мало, то рекомендую попробовать поиграть с указателями на структуры. В полях oCNpc есть свойства что-то типа askBoxYes/No. Они не используются. Можешь вместо них приколхозить любой указатель, так как размер указателя всегда равен 4м байтам.


Для более полного представления как можно реализовать любую структуру уложившись в 4 байта в полях класса:
C++:
// Ваирант 1
struct TMyStruct { // итого 16 байт
    double m_dVar1; // 8 байт
    double m_dVar2; // 8 байт
};

class CMyClass { // итого 32 байта
    int m_nVar1; // 4 байта
    TMyStruct m_mVar2; // 16 байт
    float m_fVar3; // 4 байта
    double m_dVar4; // 8 байт
};

// Ваирант 2
struct TMyStruct { // итого 16 байт
    double m_dVar1; // 8 байт
    double m_dVar2; // 8 байт
};

class CMyClass { // 20 байт
    int m_nVar1; // 4 байта
    TMyStruct* m_mVar2; // 4 байт (16 в памяти)
    float m_fVar3; // 4 байта
    double m_dVar4; // 8 байт
};
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
375
Благодарности
106
Баллы
210
Здравствуйте. Попробовал скомпилить чистый AST, выдало следующую ошибку:
1>------ Build started: Project: AST_Plugin_V1.003.07_Snapshot, Configuration: Release Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets(44,5): error MSB8020: The builds tools for v110_xp (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v110_xp to build using the v110_xp build tools.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Проблема в том, что предлагаемого пункта меню - "Update VC++ Projects...", или чего-то похожего, у меня просто нет. Подскажите, кто знает, как это правильно лечить?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
165
Благодарности
44
Баллы
175
STARK, установите VS 2012, компилятор идет вместе с ним. После, Проект, свойства и ставите нужный набор инструментов. Установка нужна чисто ради компилятора. Работать можно в любой версии VS.

Если мне память не отшибло, то 110_xp идет с VS 2012, update 4.

7am3B[1].jpg
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
375
Благодарности
106
Баллы
210
Решил попробовать повторить некоторые примеры, приведенные здесь:
AST/AST SDK - Уроки и примеры использования

И с первым же примером - телепортом, возникли проблемы.
Похоже, структура кода плагина AST версии 1.003 притерпела существенные изменения, относительно версии 2016 года.

В самом начале говорится перейти в файл PluginLoop. Но такого файла в 1.003 нет, зато есть файл dllLoop. Функции Loop в нем нет, зато есть функция PluginLoop. Решил писать код с неё, но тут же возникла новая проблема. Студия не видет перименные _player , _zinput , _screen и т.д.

Вопрос в том, как правильно написать этот код для новой версии?
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
375
Благодарности
106
Баллы
210
Добился отрисовки прицела, но когда добавил оставшуюся часть кода, ошибок лишь прибавилось.
#include "AST.h"

// Контейнер таймеров.
aCTimer MyTimer;

// Преобразования относительных координат в пиксели
#define anx(a) screen->anx(a)
#define any(a) screen->any(a)

// Центр объекта zCView
const int nCentre = 8192 / 2;


// Таргетный метод перемещения персонажа
void Teleport()
{
// Проверяем состояние правой кнопки мыши
if(zinput->GetMouseButtonPressedRight())
{ // Нарисуем на экране прицел, посредством которого будем перемещаться из точки в точку.
screen->Line( nCentre - anx(20), nCentre, nCentre + anx(20), nCentre, zCOLOR(255,100,100));
screen->Line( nCentre, nCentre - any(20), nCentre, nCentre + any(20), zCOLOR(255,100,100));

// При нажатии на лкм вызываем событие перемещения персонажа в цель
if(zinput->GetMouseButtonPressedLeft())
{
// Для того, чтобы наш персонаж не изменял свое положение каждый кадр (иначе он будет буквально летать по локации),
// необходимо ограничить выполнение функции по частоте выполнения. В данном случае воспользуемся таймером. Установим
// задержку не чаще 500 мс. А чтобы не ждать пол секунды после клика мыши, сообщим таймеру, что нам необходимо выполнить
// функцию уже на моменте его регистрации. в этом нам поможет Флаг T_PRIMARY.
if(MyTimer(10,500,T_PRIMARY))
{
// Получаем указатель на рабочую камеру
zCVob* pCam = ogame->GetCamera()->m_pVob;

// Чтобы получить точку, в которую целимся, укажем первоначальные данные.
// Начнем с указания позиции, в которой находится камера.
zVEC3 vCamPos = pCam->GetPositionWorld();

// Затем следует получить значения направляющего вектора от камеры.
zVEC3 vVector = pCam->GetAtVectorWorld();

// Далее необходимо построить луч вдоль прицела и найти его пересечения с миром.
// Получаем указатель на мир, в котором зарегистрирован персонаж.
zCWorld* pWorld = player->GetHomeWorld();

// Вызываем метод трассировки лучей для поиска пересечений с полигонами.
// Первый аргумент - начальная позиция поиска. Второй - луч, который будет строиться относительно первой точки.
// Поскольку наш вектор изначально ограничен отрезком в 1м, увеличиваем это значение, например, до 10к. Третий
// аргумент - игнорируемые вобы. В нашем случае их нет, по этому возвращаем пустое значение. Четвертый аргумент -
// - параметры поиска. Нас интересует рельеф локации.
if(pWorld->TraceRayFirstHit(vCamPos, vVector * 10000, (zCVob*)NULL, zTRACERAY_VOB_CHECK_COLLDET | zTRACERAY_IGNORE_CHARACTERS))
{
// Запишем искомую точку, если она существует
zVEC3 vTarget = pWorld->m_RayReport.m_vIntersect;
// Перемещаем персонажа на указанную координату с небольшим смещением от земли, чтобы он не застрял или не провалился в полигон.
player->SetPositionWorld(vTarget + zVEC3(0,100,0));
}
}
}
else
// После того, как мы отжали лкм, необходимо удалить таймер с id 10 (принудительно).
// Это позволит нам без ожидания в пол секунды закликивать функцию каждым новым нажатием кнопки.
MyTimer.Delete(10);

}
}

void SafeLoop()
{ // Вызываем нашу функцию
Teleport();
}

void PluginLoop ()
{ // Подготовим таймер к работе с циклом.
MyTimer.Attach();
// Вызываем безопасный для работы с объектами цикл, работающий только при наличии главного персонажа.
if(player)
SafeLoop();
}
1>------ Build started: Project: AST_Plugin_V1.003.07_Snapshot, Configuration: Release Win32 ------
1> dllLoop.cpp
1>dllLoop.cpp(4): error C2146: syntax error : missing ';' before identifier 'MyTimer'
1>dllLoop.cpp(4): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>dllLoop.cpp(30): error C2065: 'T_PRIMARY' : undeclared identifier
1>dllLoop.cpp(33): error C2039: 'm_pVob' : is not a member of 'zCCamera'
1> d:\_vcprg2012\ast_teleport_exp1\G2API\zccamera.h(99) : see declaration of 'zCCamera'
1>dllLoop.cpp(54): error C2039: 'm_RayReport' : is not a member of 'zCWorld'
1> d:\_vcprg2012\ast_teleport_exp1\g2api\zcworld.h(58) : see declaration of 'zCWorld'
1>dllLoop.cpp(54): error C2228: left of '.m_vIntersect' must have class/struct/union
1>dllLoop.cpp(63): error C2228: left of '.Delete' must have class/struct/union
1> type is 'int'
1>dllLoop.cpp(75): error C2228: left of '.Attach' must have class/struct/union
1> type is 'int'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Проблемы с записью aCTimer MyTimer; , а так же программа не видет определения переменных T_PRIMARY, m_pVob, m_RayReport.m_vIntersect.
Как с этим быть?
И как отключить вывод системной информации в левом верхнем углу?
 
Последнее редактирование:

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
165
Благодарности
44
Баллы
175
Добился отрисовки прицела, но когда добавил оставшуюся часть кода, ошибок лишь прибавилось.

Проблемы с записью aCTimer MyTimer; , а так же программа не видет определения переменных T_PRIMARY, m_pVob, m_RayReport.m_vIntersect.
Как с этим быть?
Скорее всего aCTimer = CTimer. T_PRIMARY= zTM_PRIMARY; m_pVob = connectedVob; m_RayReport.m_vIntersect = traceRayReport.m_vIntersect.

Как с этим быть? Искать. Гуглить. Просмотреть проект, у вас там много классов.

Для примера. У нас есть код...
E5b28[1].jpg


Нажимаем пкм на zCWorld, Перейти к определению. Вы перешли к классу, смотрите поля класса, ищете похожее на m_RayReport.

По факту, в проекте просто немного изменились названия полей классов.


И как отключить вывод системной информации в левом верхнем углу?
в _cb_Game_Init
_CFG::DisableAll();
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
375
Благодарности
106
Баллы
210
Haart, спасибо, все работает.

А как отключить увеличение иконок инвентаря?
 
Последнее редактирование:
Сверху Снизу