Опять же, mud-freak это давно сделал для всех на патче Ninjaк пожеланиям - очень был бы полезным плагин, который бы не позволял торговцам одевать лучшее оружие после продажи им этого оружия.
/*
* This script is taken from https://forum.worldofplayers.de/forum/threads/?p=25954713
*/
/*
* Intercept default equipping of best ranged and melee weapons of NPCs. Best weapons will now only be equipped if no
* weapon of respective type is not already equipped. This will prevent trading NPCs to block the best weapon.
*
* - Requires Ikarus, LeGo (HookEngine)
* - Compatible with Gothic 1 and Gothic 2
*
* Call FixEquipBestWeapons_Init from Init_Global.
*/
func void FixEquipBestWeapons_Init() {
const int once = 0;
if (!once) {
MEM_InitAll();
const int oCNpc__Enable_equipBestWeapons_G1 = 6955616; //0x6A2260
const int oCNpc__Enable_equipBestWeapons_G2 = 7626662; //0x745FA6
var int addr; addr = MEMINT_SwitchG1G2(oCNpc__Enable_equipBestWeapons_G1, oCNpc__Enable_equipBestWeapons_G2);
// Remove default equipping of best melee and ranged weapon to add more conditions
const int nop20Bytes[5] = { -1869574000, -1869574000, -1869574000, -1869574000, -1869574000 }; //0x90 * 20
MemoryProtectionOverride(addr, 18);
MEM_CopyBytes(_@(nop20Bytes), addr, 18);
HookEngineF(addr, 5, _FixEquipBestWeapons);
once = 1;
};
};
func void NpcEquipBestWeaponByType(var C_Npc npc, var int type) {
const int oCNpc__EquipBestWeapon_G1 = 6988320; //0x6AA220
const int oCNpc__EquipBestWeapon_G2 = 7663408; //0x74EF30
var int npcPtr; npcPtr = _@(npc);
const int call = 0;
if (CALL_Begin(call)) {
CALL_IntParam(_@(type));
CALL__thiscall(_@(npcPtr), MEMINT_SwitchG1G2(oCNpc__EquipBestWeapon_G1, oCNpc__EquipBestWeapon_G2));
call = CALL_End();
};
};
func void _FixEquipBestWeapons() {
var C_Npc npc; npc = _^(ESI);
if (!Npc_HasEquippedMeleeWeapon(npc))
&& (!Npc_HasReadiedMeleeWeapon(npc)) {
NpcEquipBestWeaponByType(npc, ITEM_KAT_NF);
};
if (!Npc_HasEquippedRangedWeapon(npc))
&& (!Npc_HasReadiedRangedWeapon(npc)) {
NpcEquipBestWeaponByType(npc, ITEM_KAT_FF);
};
};
А в чём проблема? Продают обычно неактуальное для гг оружие.к пожеланиям - очень был бы полезным плагин, который бы не позволял торговцам одевать лучшее оружие после продажи им этого оружия.
// Supported with union (c) 2020 Union team
// User API for oCNpc
// Add your methods here
void EquipBestWeaponNew(int);
void EquipBestArmorNew();
// Supported with union (c) 2020 Union team
// Union SOURCE file
namespace GOTHIC_ENGINE {
// Add your code here . . .
bool isNeedDisableBestWeapons() {
return zoptions->ReadBool("myplugin", "isNeedDisableBestWeapons", 0);
}
bool isNeedDisableBestArmor() {
return zoptions->ReadBool("myplugin", "isNeedDisableBestArmor", 0);
}
HOOK Ivk_oCNpc_EquipBestWeaponNew PATCH_IF(&oCNpc::EquipBestWeapon, &oCNpc::EquipBestWeaponNew, isNeedDisableBestWeapons());
void oCNpc::EquipBestWeaponNew(int v) {
if (this == player) {
THISCALL(EquipBestWeaponNew)(v);
}
}
HOOK Ivk_oCNpc_EquipBestArmorNew PATCH_IF(&oCNpc::EquipBestArmor, &oCNpc::EquipBestArmorNew, isNeedDisableBestArmor());
void oCNpc::EquipBestArmorNew() {
if (this == player) {
THISCALL(EquipBestArmorNew)();
}
}
}
второе. Точнее он одевает лучшее оружие из тех что ему продали.А в чём проблема? Продают обычно неактуальное для гг оружие.
Или из-за этого он одевает - то, которое он продаёт сам?
Trazege, на юне вроде так получается. Доп. условия в хуках можно сделать какие нужно.
C++:// Supported with union (c) 2020 Union team // User API for oCNpc // Add your methods here void EquipBestWeaponNew(int); void EquipBestArmorNew();
C++:// Supported with union (c) 2020 Union team // Union SOURCE file namespace GOTHIC_ENGINE { // Add your code here . . . bool isNeedDisableBestWeapons() { return zoptions->ReadBool("myplugin", "isNeedDisableBestWeapons", 0); } bool isNeedDisableBestArmor() { return zoptions->ReadBool("myplugin", "isNeedDisableBestArmor", 0); } HOOK Ivk_oCNpc_EquipBestWeaponNew PATCH_IF(&oCNpc::EquipBestWeapon, &oCNpc::EquipBestWeaponNew, isNeedDisableBestWeapons()); void oCNpc::EquipBestWeaponNew(int v) { if (this == player) { THISCALL(EquipBestWeaponNew)(v); } } HOOK Ivk_oCNpc_EquipBestArmorNew PATCH_IF(&oCNpc::EquipBestArmor, &oCNpc::EquipBestArmorNew, isNeedDisableBestArmor()); void oCNpc::EquipBestArmorNew() { if (this == player) { THISCALL(EquipBestArmorNew)(); } } }
Это нормально. Кроме гг ему никто оружие не продаёт. Было такое, что он одевал оружие которое у него появлялось в продаже без участия ггвторое. Точнее он одевает лучшее оружие из тех что ему продали.
Trazege, EquipBestWeapon и EquipBestArmor будут выполнятся только для игрока, для всех остальных не будет вызываться и соответственно броня и оружие не будут выбираться.
Ну если в таком виде, то да. Тут будет работать только для игрока, все остальные отдыхают. Но можно в плагине нужную логику попробовать и прикрутить, что бы это не для всех NPC работало и не всегда. Как со скриптами подружить не подскажу, может через zParserExtender как-нибудь. Не сталкивался.а вот какая логика..ясно ) а если мне надо экипировать скриптово лучшее оружие неписю в конкретном месте, то я получу от осла уши? )
Уже нет свободных. Все заняты.Trazege, сейчас подумал что один из вариантов как подружить напрямую, это задействовать неиспользуемые флаги/поля у нпс, управлять ими в скриптах, а в хуке просто по ним принимать решение разрешать или нет одевать оружие/броню. Возможно не совсем красиво или правильно, но по идее должно работать.
Я бы пошел дальше и отрегулировал бы эффект крови для разного уровня хп. А вот снижение здоровья как то не очень смотрится.Приветствую всех.
Возможно ли составить плагин, форсирующий включение "максимального эффекта жестокости" (чтобы начиналось кровотечение, при снижении здоровья ниже 50%, для всех "живых" существ), который будет добавлять к визуальному эффекту ещё и снижение здоровья на 1 ед./сек? И добавить запрет на сон, пока действует данный эффект?
Короче, внедрить в игру элемент "тяжелого ранения", который НЕ будет позволять ГГ, и прочим, свободно разгуливать с низким уровнем здоровья, обливая мир кровью.
Согласен, было бы здорово.Я бы пошел дальше и отрегулировал бы эффект крови для разного уровня хп.
Почему? Существо истекает кровью, т.е. вполне заметно "теряет здоровье".А вот снижение здоровья как то не очень смотрится.
Тогда интервал потери хп должен быть большеСогласен, было бы здорово.
Почему? Существо истекает кровью, т.е. вполне заметно "теряет здоровье".
Это процесс можно спокойно прервать, подлечившись до 50%+.
Не совсем понял, какой именно интервал?Тогда интервал потери хп должен быть больше
через какое время будет происходить очередная потеря ХП, пока происходит кровотечение.Не совсем понял, какой именно интервал?
Не думал об этом, но если так ставить вопрос, то через 12 игровых часов, например?через какое время будет происходить очередная потеря ХП, пока происходит кровотечение.