Edited/reorganized some code.

Updated proto offsets in define_extra.h.
This commit is contained in:
NovaRain
2019-04-10 09:46:31 +08:00
parent 3e49922898
commit 5c3f10db91
6 changed files with 132 additions and 111 deletions
+31 -13
View File
@@ -105,17 +105,22 @@
#define RMOBJ_THROW 4266040
#define RMOBJ_SUB_CONTAINER 4683191 // search and remove the item from a container inside of an inventory
// offsets for get_proto_data
// common prototype offsets for get/set_proto_data
#define PROTO_PID (1)
#define PROTO_TEXTID (4)
#define PROTO_FID (8)
#define PROTO_LDIST (12)
#define PROTO_LINT (16)
#define PROTO_FLAG (20)
#define PROTO_FLAG_EXT (24)
#define PROTO_SCRIPTID (28)
// items
#define PROTO_IT_LDIST (12)
#define PROTO_IT_LINT (16)
#define PROTO_IT_FLAG (20)
#define PROTO_IT_FLAGS (24)
#define PROTO_IT_SCRIPTID (28)
#define PROTO_IT_LDIST PROTO_LDIST
#define PROTO_IT_LINT PROTO_LINT
#define PROTO_IT_FLAG PROTO_FLAG
#define PROTO_IT_FLAGS PROTO_FLAG_EXT
#define PROTO_IT_SCRIPTID PROTO_SCRIPTID
#define PROTO_IT_TYPE (32)
#define PROTO_IT_MATERIAL (108)
#define PROTO_IT_SIZE (112)
@@ -200,18 +205,31 @@
#define PROTO_DR_ADDICT_DELAY (100)
// critters
#define PROTO_CR_LDIST (20)
#define PROTO_CR_LINT (24)
#define PROTO_CR_FLAG (28)
#define PROTO_CR_FLAGS (32) // Critter Flags
#define PROTO_CR_SCRIPTID (36)
#define PROTO_CR_HEAD_FID (40)
#define PROTO_CR_AI_PACKET (44)
#define PROTO_CR_TEAM_NUM (48)
#define PROTO_CR_BONUS_SRENGTH (176)
#define PROTO_CR_BONUS_PRCEPTION (180)
#define PROTO_CR_BONUS_ENDURANCE (184)
#define PROTO_CR_BONUS_CHARISMA (188)
#define PROTO_CR_BONUS_INTELLIGENCE (192)
#define PROTO_CR_BONUS_AGILITY (196)
#define PROTO_CR_BONUS_LUCK (200)
#define PROTO_CR_BONUS_HP (204)
#define PROTO_CR_BONUS_AP (208)
#define PROTO_CR_BONUS_AC (212)
#define PROTO_CR_BONUS_UNARMED_DAMAGE (216)
#define PROTO_CR_BONUS_MELEE_DAMAGE (220)
#define PROTO_CR_BONUS_CARRY_WEIGHT (224)
#define PROTO_CR_BONUS_SEQUENCE (228)
#define PROTO_CR_BONUS_HEALING_RATE (232)
#define PROTO_CR_BONUS_CRITICAL_CHANCE (236)
#define PROTO_CR_BONUS_BETTER_CRITICALS (240)
#define PROTO_CR_BODY_TYPE (388)
#define PROTO_CR_KILL_EXP (392)
#define PROTO_CR_KILL_TYPE (396)
#define PROTO_CR_DMG_TYPE (400)
#define PROTO_CR_HEAD_FID (404)
#define PROTO_CR_AI_PACKET (408)
#define PROTO_CR_TEAM_NUM (412)
// weapon calibers
#define CALIBER_NONE (0)
+1 -1
View File
@@ -31,7 +31,7 @@ static int initCount = 5; // init config counter (5 - vanilla bo
static int sizeBox, setBoxIndex = 5;
static long newBoxSlot[16];
static long maxSlots; // maximum number of slots for the current game window resolution
static long maxSlots = 6; // maximum number of slots for the current game window resolution
static long ifaceWidth;
#define sSize (12)
+3
View File
@@ -130,6 +130,9 @@ void _stdcall RunHookScript(DWORD hook) {
}
} else {
cArg = 0;
#ifndef NDEBUG
dlog_f(">>> Try running hook ID: %d\n", DL_HOOK, hook);
#endif
}
}
+82 -82
View File
@@ -90,6 +90,85 @@ static void __declspec(naked) OverrideCost_BarterPriceHack() {
}
}
static fo::GameObject* sourceSkillOn = nullptr;
void SourceUseSkillOnInit() { sourceSkillOn = fo::var::obj_dude; }
static char resultSkillOn;
static long bakupCombatState;
static void __fastcall UseSkillOnHook_Script(DWORD source, DWORD target, register DWORD skillId) {
BeginHook();
argCount = 3;
args[0] = source; // user
args[1] = target; // target
args[2] = skillId; // skill id
sourceSkillOn = fo::var::obj_dude;
resultSkillOn = 0;
bakupCombatState = -1;
RunHookScript(HOOK_USESKILLON);
if (skillId != fo::Skill::SKILL_STEAL && cRet > 0) { // not work for steal skill
if (rets[0] != 0) {
resultSkillOn = (rets[0] == -1) ? -1 : 1;
if (resultSkillOn == 1) {
sourceSkillOn = (fo::GameObject*)rets[0];
}
}
if (resultSkillOn != -1 && cRet > 1 && rets[1] == 1) {
bakupCombatState = fo::var::combat_state;
fo::var::combat_state = 0;
}
}
EndHook();
}
static void __declspec(naked) UseSkillOnHook() {
__asm {
push eax;
push ecx;
push edx;
push ebx; // skill id
mov ecx, eax; // user
call UseSkillOnHook_Script; // edx - target
pop edx;
pop ecx;
pop eax;
cmp resultSkillOn, -1; // skip handler
jnz handler;
retn;
handler:
jmp fo::funcoffs::action_use_skill_on_;
}
}
static void __declspec(naked) UseSkillOnHack() {
__asm {
cmp bakupCombatState, -1;
jz skip;
mov ebp, bakupCombatState;
mov dword ptr ds:[FO_VAR_combat_state], ebp;
skip:
cmp resultSkillOn, 0;
jz default;
mov edi, sourceSkillOn;
retn; // flag ZF = 0
default:
// engine code
cmp eax, dword ptr ds:[FO_VAR_obj_dude];
retn;
}
}
static void __declspec(naked) skill_use_hack() {
__asm {
cmp ebp, dword ptr ds:[FO_VAR_obj_dude];
setnz al;
retn;
}
}
static void __declspec(naked) UseSkillHook() {
__asm {
HookBegin;
@@ -125,14 +204,14 @@ static void __declspec(naked) StealCheckHook() {
mov args[4], edx; // target
mov args[8], ebx; // item
mov args[12], ecx; // is planting
pushad;
pushadc;
}
argCount = 4;
RunHookScript(HOOK_STEAL);
__asm {
popad;
popadc;
cmp cRet, 1;
jb defaultHandler;
cmp rets[0], -1;
@@ -415,84 +494,6 @@ end:
}
}
static fo::GameObject* sourceSkillOn = nullptr;
void SourceUseSkillOnInit() { sourceSkillOn = fo::var::obj_dude; }
static char resultSkillOn;
static long bakupCombatState;
static void __fastcall UseSkillOnHook_Script(DWORD source, DWORD target, register DWORD skillId) {
BeginHook();
argCount = 3;
args[0] = source; // user
args[1] = target; // target
args[2] = skillId; // skill id
sourceSkillOn = fo::var::obj_dude;
resultSkillOn = 0;
bakupCombatState = -1;
RunHookScript(HOOK_USESKILLON);
if (skillId != fo::Skill::SKILL_STEAL && cRet > 0) { // not work for steal skill
if (rets[0] != 0) {
resultSkillOn = (rets[0] == -1) ? -1 : 1;
if (resultSkillOn == 1) {
sourceSkillOn = (fo::GameObject*)rets[0];
}
}
if (resultSkillOn != -1 && cRet > 1 && rets[1] == 1) {
bakupCombatState = fo::var::combat_state;
fo::var::combat_state = 0;
}
}
EndHook();
}
static void __declspec(naked) UseSkillOnHook() {
__asm {
push eax;
push ecx;
push edx;
push ebx; // skill id
mov ecx, eax; // user
call UseSkillOnHook_Script; // edx - target
pop edx;
pop ecx;
pop eax;
cmp resultSkillOn, -1; // skip handler
jnz handler;
retn;
handler:
jmp fo::funcoffs::action_use_skill_on_;
}
}
static void __declspec(naked) UseSkillOnHack() {
__asm {
cmp bakupCombatState, -1;
jz skip;
mov ebp, bakupCombatState;
mov dword ptr ds:[FO_VAR_combat_state], ebp;
skip:
cmp resultSkillOn, 0;
jz default;
mov edi, sourceSkillOn;
retn; // flag ZF = 0
default:
// engine code
cmp eax, dword ptr ds:[FO_VAR_obj_dude];
retn;
}
}
static void __declspec(naked) skill_use_hack() {
__asm {
cmp ebp, dword ptr ds:[FO_VAR_obj_dude];
setnz al;
retn;
}
}
void Inject_BarterPriceHook() {
HookCalls(BarterPriceHook, {
@@ -553,8 +554,8 @@ void Inject_UseSkillOnHook() {
}
void InitMiscHookScripts() {
LoadHookScript("hs_barterprice", HOOK_BARTERPRICE);
LoadHookScript("hs_useskillon", HOOK_USESKILLON);
LoadHookScript("hs_useskill", HOOK_USESKILL);
LoadHookScript("hs_steal", HOOK_STEAL);
LoadHookScript("hs_withinperception", HOOK_WITHINPERCEPTION);
@@ -562,7 +563,6 @@ void InitMiscHookScripts() {
LoadHookScript("hs_setglobalvar", HOOK_SETGLOBALVAR);
LoadHookScript("hs_resttimer", HOOK_RESTTIMER);
LoadHookScript("hs_explosivetimer", HOOK_EXPLOSIVETIMER);
LoadHookScript("hs_useskillon", HOOK_USESKILLON);
}
}
+1 -1
View File
@@ -6,6 +6,7 @@ namespace sfall
void SourceUseSkillOnInit();
void Inject_BarterPriceHook();
void Inject_UseSkillOnHook();
void Inject_UseSkillHook();
void Inject_StealCheckHook();
void Inject_WithinPerceptionHook();
@@ -13,5 +14,4 @@ namespace sfall
void Inject_SetGlobalVarHook();
void Inject_RestTimerHook();
void Inject_ExplosiveTimerHook();
void Inject_UseSkillOnHook();
}