Slavemaster
Модостроитель
- Регистрация
- 10 Июн 2019
- Сообщения
- 1.086
- Благодарности
- 1.910
- Баллы
- 320
Жду пример такого патчапатч "DeadGoblinFix.patch", загружающий её
Жду пример такого патчапатч "DeadGoblinFix.patch", загружающий её
#include "UnionAfx.h"
namespace Gothic_I_Classic {
//********************************************************************
// Чтение свойств НПС из архива (для Г1)
//********************************************************************
//0x006A31E0 protected: virtual void __thiscall oCNpc::Unarchive(class zCArchiver &)
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar);
static CInvoke <void(__thiscall*)(oCNpc*, zCArchiver&)> pNpc_Unarchive(0x006A31E0, Npc_Unarchive, Union.GetEngineVersion() == TEngineVersion::Engine_G1 ? IVK_AUTO : IVK_DISABLED);
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar)
{
// Сначала вызываем оригинальную функцию
pNpc_Unarchive(_this, ar);
// Если _this - это мёртвый гоблин
if (_this && (_this->guild == NPC_GIL_GOBBO || _this->guild == NPC_GIL_SKELETON) && _this->attribute[NPC_ATR_HITPOINTS] == 0)
{
// берём указатель на модель гоблина
zCModel* pModel = _this->GetModel();
// если указателя нет, то выходим
if (!pModel) return;
// получаем указатель на узел правой руки
zCModelNodeInst* pNodeInst = pModel->SearchNode(NPC_NODE_RIGHTHAND);
// если указателя нет, то выходим
if (!pNodeInst) return;
// иначе, стираем визуал узла
pModel->SetNodeVisual(pNodeInst, NULL, FALSE);
}
}
}
namespace Gothic_I_Addon {
// 0x006D5AD0 protected: virtual void __thiscall oCNpc::Unarchive(class zCArchiver &)
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar);
static CInvoke <void(__thiscall*)(oCNpc*, zCArchiver&)> pNpc_Unarchive(0x006D5AD0, Npc_Unarchive, Union.GetEngineVersion() == TEngineVersion::Engine_G1A ? IVK_AUTO : IVK_DISABLED);
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar)
{
pNpc_Unarchive(_this, ar);
if (_this && (_this->guild == NPC_GIL_GOBBO || _this->guild == NPC_GIL_SKELETON) && _this->attribute[NPC_ATR_HITPOINTS] == 0)
{
zCModel* pModel = _this->GetModel();
if (!pModel)
return;
zCModelNodeInst* pNodeInst = pModel->SearchNode(NPC_NODE_RIGHTHAND);
if (!pNodeInst)
return;
pModel->SetNodeVisual(pNodeInst, NULL, FALSE);
}
}
}
namespace Gothic_II_Classic {
// 0x006E8790 protected: virtual void __thiscall oCNpc::Unarchive(class zCArchiver &)
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar);
static CInvoke <void(__thiscall*)(oCNpc*, zCArchiver&)> pNpc_Unarchive(0x006E8790, Npc_Unarchive, Union.GetEngineVersion() == TEngineVersion::Engine_G2 ? IVK_AUTO : IVK_DISABLED);
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar)
{
pNpc_Unarchive(_this, ar);
if (_this && (_this->guild == NPC_GIL_GOBBO || _this->guild == NPC_GIL_GOBBO_SKELETON || _this->guild == NPC_GIL_SUMMONED_GOBBO_SKELETON) && _this->attribute[NPC_ATR_HITPOINTS] == 0)
{
zCModel* pModel = _this->GetModel();
if (!pModel)
return;
// объявляем пустой указатель на узел
zCModelNodeInst* pNodeInst = NULL;
// пробегаемся по всем узлам модели
for(int i = 0; i < pModel->nodeList.GetNum(); i++)
{
// проверяем указатель на прототип узла, если в порядке, то продолжаем
if (pModel->nodeList[i]->protoNode)
{
// извлекаем название узла
string nodeName = pModel->nodeList[i]->protoNode->nodeName;
// если это узел правой руки (сравниваются названия)
if (nodeName.Compare(NPC_NODE_RIGHTHAND))
{
// запоминаем указатель на узел
pNodeInst = pModel->nodeList[i];
// выходим из цикла
break;
}
}
}
// если указатель на узел правой руки не найден
if (!pNodeInst)
// выходим из функции
return;
// иначе, стираем визуал узла
pModel->SetNodeVisual(pNodeInst, NULL, FALSE);
}
}
}
namespace Gothic_II_Addon {
// 0x00747230 protected: virtual void __thiscall oCNpc::Unarchive(class zCArchiver &)
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar);
static CInvoke <void(__thiscall*)(oCNpc*, zCArchiver&)> pNpc_Unarchive(0x00747230, Npc_Unarchive, Union.GetEngineVersion() == TEngineVersion::Engine_G2A ? IVK_AUTO : IVK_DISABLED);
static void __fastcall Npc_Unarchive(oCNpc* _this, void* vt, zCArchiver& ar)
{
pNpc_Unarchive(_this, ar);
if (_this && (_this->guild == NPC_GIL_GOBBO || _this->guild == NPC_GIL_GOBBO_SKELETON || _this->guild == NPC_GIL_SUMMONED_GOBBO_SKELETON) && _this->attribute[NPC_ATR_HITPOINTS] == 0)
{
zCModel* pModel = _this->GetModel();
if (!pModel)
return;
zCModelNodeInst* pNodeInst = pModel->SearchNode(NPC_NODE_RIGHTHAND);
if (!pNodeInst)
return;
pModel->SetNodeVisual(pNodeInst, NULL, FALSE);
}
}
}
// G1
#engine [0x225BA11E]
#patch [Fix]
LoadLibrary ("DeadGoblinFix.dll")
#/patch
#/engine
// G1A
#engine [0x02648DED]
#patch [Fix]
LoadLibrary ("DeadGoblinFix.dll")
#/patch
#/engine
// G2
#engine [0xA2EE682C]
#patch [Fix]
LoadLibrary ("DeadGoblinFix.dll")
#/patch
#/engine
// G2A
#engine [0x2BCD7E30]
#patch [Fix]
LoadLibrary ("DeadGoblinFix.dll")
#/patch
#/engine
Естественно, интересно, если осваивать, то на примерах лучше учиться. Спасибо.Для справки:
Главное, чтобы это НЕ пугало игроков. СистемПак сейчас уверенно занимает категорию "мастхэв". А вот по поводу Юни не знаю, насколько она популярна у игроков, и насколько охотно они переходят на эту платформу. Предполагаю, что Юня станет наследницй СистемПака. В будущем.Тебя же это не пугает? Тот же сп, только умеет в разы больше.
Имеются в виду скелеты из Г1, которые вооружаются аналогично гоблинам. Но анимация смерти у них такова, что появившегося в слоте оружия практически не видно.Насчет скелетов, никто не замечал у них оружия в слоте после смерти... Узнал новенькое
Как только станет популярна у мододелов, станет популярна и у игроков. Оно же несложно ставится: ставишь готику и через ресурс менеджер ставишь патч и сам юнион. Всё.не знаю, насколько она популярна у игроков
насколько она популярна у игроков
FUNC VOID AI_PlayAniWithItems (VAR C_NPC n0, VAR STRING s0, VAR C_ITEM i1, VAR INT num1, VAR STRING "ZS_RIGHTHAND" VAR C_ITEM i2, VAR INT num2, VAR STRING "ZS_LEFTHAND", VAR INT num3, VAR INT num4) { };
n0 - инстанция нпс, s0 - название анимации, i1 - первый предмет, который будет добавлен в правую руку в num1 кадре анимации, i2 - второй предмет, который будет добавлен в левую руку в num2 кадре анимации, num3 - кадр удаления первого предмета от правой руки, num4 - кадр удаления второго предмета от левой руки.
Ну ты для начала дай анимации, а дальше там делов минут на 5-10Как насчёт реализации такой внутренней функции движка на базе юниона?
Гм. Вот Ведьмак 3, вроде бы, довольно продвинутая игра в плане анимаций. По сравнению с Готикой, уж точно. Но даже там нет такого. Думаю, реализация плавной передачи предмета из слота в слот - непростая задача. Нужно в процессе проигрывания анимации передачи как-то совместить в одной точке два слота с полным совпадением координат и ориентации в пространстве. Не уверен, что это реализуемо на готическом движке.она нужна для нормальной визуализации процесса передачи предмета между нпс
А здесь, как мне кажется, задача ещё более сложная, чем в предыдущем случае. При нормальной реализации.и визуализации сбора пищи в короб
Декомпиляция анимаций с таким ключом, к сожалению, часто приводит к тому, что исходник оказывается повреждённым. То ли кадры там перепутаны местами, то ли попытка восстановить отсутствующие кадры глючит.FPS:10
//функция, чтобы считывать значения из выбранного пункта из меню
func void logentry_func()
{
//новая переменная
var string newlogentry;
//считываем эту переменную из меню
newlogentry = mem_getgothopt("MOD_PREDO", "LOG_ENTRY");
//дальше необходимо проверить выбранное значение и произнести необходимые настройки,
//если выбрано выкл, то будет старая система вывода, в другом случае новая
if(hlp_strcmp(newlogentry, "0") && (!hlp_strcmp(newlogentry, "1")))
{
newlogentrys = FALSE;
oldlogentrys = TRUE;
return 1;
}
else if(hlp_strcmp(newlogentry, "1") && (!hlp_strcmp(newlogentry, "0")))
{
newlogentrys = TRUE;
oldlogentrys = FALSE;
return 1;
};
return 0;
};