mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
HOOK_ON_INSTANT_WARP (#747)
* make HOOK_ON_WARP trigger on instant warps * oops * HOOK_ON_INSTANT_WARP * make the displacement a Vec3s, hooks.md * fix hooks.md oversight * get rid of this
This commit is contained in:
parent
15d6f6ae07
commit
ea353af5c9
8 changed files with 53 additions and 15 deletions
|
|
@ -7815,7 +7815,8 @@ HOOK_MARIO_OVERRIDE_GEOMETRY_INPUTS = 51 --- @type LuaHookedEventType
|
||||||
HOOK_ON_INTERACTIONS = 52 --- @type LuaHookedEventType
|
HOOK_ON_INTERACTIONS = 52 --- @type LuaHookedEventType
|
||||||
HOOK_ALLOW_FORCE_WATER_ACTION = 53 --- @type LuaHookedEventType
|
HOOK_ALLOW_FORCE_WATER_ACTION = 53 --- @type LuaHookedEventType
|
||||||
HOOK_BEFORE_WARP = 54 --- @type LuaHookedEventType
|
HOOK_BEFORE_WARP = 54 --- @type LuaHookedEventType
|
||||||
HOOK_MAX = 55 --- @type LuaHookedEventType
|
HOOK_ON_INSTANT_WARP = 55 --- @type LuaHookedEventType
|
||||||
|
HOOK_MAX = 56 --- @type LuaHookedEventType
|
||||||
|
|
||||||
--- @alias LuaHookedEventType
|
--- @alias LuaHookedEventType
|
||||||
--- | `HOOK_UPDATE`
|
--- | `HOOK_UPDATE`
|
||||||
|
|
@ -7873,6 +7874,7 @@ HOOK_MAX = 55 --- @type LuaHookedEventType
|
||||||
--- | `HOOK_ON_INTERACTIONS`
|
--- | `HOOK_ON_INTERACTIONS`
|
||||||
--- | `HOOK_ALLOW_FORCE_WATER_ACTION`
|
--- | `HOOK_ALLOW_FORCE_WATER_ACTION`
|
||||||
--- | `HOOK_BEFORE_WARP`
|
--- | `HOOK_BEFORE_WARP`
|
||||||
|
--- | `HOOK_ON_INSTANT_WARP`
|
||||||
--- | `HOOK_MAX`
|
--- | `HOOK_MAX`
|
||||||
|
|
||||||
ACTION_HOOK_EVERY_FRAME = 0 --- @type LuaActionHookType
|
ACTION_HOOK_EVERY_FRAME = 0 --- @type LuaActionHookType
|
||||||
|
|
|
||||||
|
|
@ -3441,7 +3441,8 @@
|
||||||
| HOOK_ON_INTERACTIONS | 52 |
|
| HOOK_ON_INTERACTIONS | 52 |
|
||||||
| HOOK_ALLOW_FORCE_WATER_ACTION | 53 |
|
| HOOK_ALLOW_FORCE_WATER_ACTION | 53 |
|
||||||
| HOOK_BEFORE_WARP | 54 |
|
| HOOK_BEFORE_WARP | 54 |
|
||||||
| HOOK_MAX | 55 |
|
| HOOK_ON_INSTANT_WARP | 55 |
|
||||||
|
| HOOK_MAX | 56 |
|
||||||
|
|
||||||
### [enum LuaActionHookType](#LuaActionHookType)
|
### [enum LuaActionHookType](#LuaActionHookType)
|
||||||
| Identifier | Value |
|
| Identifier | Value |
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,8 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh
|
||||||
| HOOK_MARIO_OVERRIDE_GEOMETRY_INPUTS | Called before running Mario's geometry input logic, return `false` to not run it. | [MarioState](../structs.md) m |
|
| HOOK_MARIO_OVERRIDE_GEOMETRY_INPUTS | Called before running Mario's geometry input logic, return `false` to not run it. | [MarioState](../structs.md) m |
|
||||||
| HOOK_ON_INTERACTIONS | Called when the Mario interactions are processed | [MarioState](../structs.md#MarioState) mario |
|
| HOOK_ON_INTERACTIONS | Called when the Mario interactions are processed | [MarioState](../structs.md#MarioState) mario |
|
||||||
| HOOK_ALLOW_FORCE_WATER_ACTION | Called when executing a non-water action while under the water's surface, or vice versa. Return `false` to prevent the player from being forced out of the action at the water's surface | [MarioState](../structs.md#MarioState) mario, `boolean` isInWaterAction |
|
| HOOK_ALLOW_FORCE_WATER_ACTION | Called when executing a non-water action while under the water's surface, or vice versa. Return `false` to prevent the player from being forced out of the action at the water's surface | [MarioState](../structs.md#MarioState) mario, `boolean` isInWaterAction |
|
||||||
| HOOK_BEFORE_WARP | Called before the local player warps. Return a table with `destLevel`, `destArea`, `destWarpNode`, and `arg` to override the warp | `integer` destLevel, `integer` destArea, `integer` destWarpNode, `integer` arg |
|
| HOOK_BEFORE_WARP | Called before the local player warps. Return a table with `destLevel`, `destArea`, `destAreaWarpNode`, and `arg` to override the warp | `integer` destLevel, `integer` destArea, `integer` destAreaWarpNode, `integer` arg |
|
||||||
|
| HOOK_ON_INSTANT_WARP | Called when the local player goes through an instant warp.| `integer` area, `integer` id, `Vec3s` displacement|
|
||||||
|
|
||||||
### Parameters
|
### Parameters
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,6 @@
|
||||||
|
|
||||||
struct SavedWarpValues gReceiveWarp = { 0 };
|
struct SavedWarpValues gReceiveWarp = { 0 };
|
||||||
extern s8 sReceivedLoadedActNum;
|
extern s8 sReceivedLoadedActNum;
|
||||||
u8 gRejectInstantWarp = 0;
|
|
||||||
u16 gFanFareDebounce = 0;
|
u16 gFanFareDebounce = 0;
|
||||||
|
|
||||||
s16 gChangeLevel = -1;
|
s16 gChangeLevel = -1;
|
||||||
|
|
@ -647,10 +646,6 @@ void check_instant_warp(void) {
|
||||||
s16 cameraAngle;
|
s16 cameraAngle;
|
||||||
struct Surface *floor;
|
struct Surface *floor;
|
||||||
|
|
||||||
if (gRejectInstantWarp > 0) {
|
|
||||||
gRejectInstantWarp--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gCurrLevelNum == LEVEL_CASTLE
|
if (gCurrLevelNum == LEVEL_CASTLE
|
||||||
&& save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= gLevelValues.infiniteStairsRequirement) {
|
&& save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= gLevelValues.infiniteStairsRequirement) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -661,11 +656,6 @@ void check_instant_warp(void) {
|
||||||
if (index >= INSTANT_WARP_INDEX_START && index < INSTANT_WARP_INDEX_STOP && gCurrentArea->instantWarps != NULL) {
|
if (index >= INSTANT_WARP_INDEX_START && index < INSTANT_WARP_INDEX_STOP && gCurrentArea->instantWarps != NULL) {
|
||||||
struct InstantWarp *warp = &gCurrentArea->instantWarps[index];
|
struct InstantWarp *warp = &gCurrentArea->instantWarps[index];
|
||||||
if (warp->id != 0) {
|
if (warp->id != 0) {
|
||||||
if (gRejectInstantWarp > 0) {
|
|
||||||
vec3f_copy(gMarioStates[0].pos, gMarioStates[0].nonInstantWarpPos);
|
|
||||||
//vec3f_mul(gMarioStates[0].vel, -0.8f);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mario_drop_held_object(&gMarioStates[0]);
|
mario_drop_held_object(&gMarioStates[0]);
|
||||||
u8 changeOfArea = (gCurrAreaIndex != warp->area);
|
u8 changeOfArea = (gCurrAreaIndex != warp->area);
|
||||||
|
|
@ -695,6 +685,8 @@ void check_instant_warp(void) {
|
||||||
skip_camera_interpolation();
|
skip_camera_interpolation();
|
||||||
gMarioStates[0].area->camera->yaw = cameraAngle;
|
gMarioStates[0].area->camera->yaw = cameraAngle;
|
||||||
|
|
||||||
|
smlua_call_event_hooks_instant_warp_params(HOOK_ON_INSTANT_WARP, warp->area, warp->id, warp->displacement);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,6 @@ struct SavedWarpValues {
|
||||||
|
|
||||||
extern struct WarpDest sWarpDest;
|
extern struct WarpDest sWarpDest;
|
||||||
extern s8 sWarpCheckpointActive;
|
extern s8 sWarpCheckpointActive;
|
||||||
extern u8 gRejectInstantWarp;
|
|
||||||
extern u16 gFanFareDebounce;
|
extern u16 gFanFareDebounce;
|
||||||
|
|
||||||
extern s16 D_80339EE0;
|
extern s16 D_80339EE0;
|
||||||
|
|
|
||||||
|
|
@ -3288,7 +3288,8 @@ char gSmluaConstants[] = ""
|
||||||
"HOOK_ON_INTERACTIONS=52\n"
|
"HOOK_ON_INTERACTIONS=52\n"
|
||||||
"HOOK_ALLOW_FORCE_WATER_ACTION=53\n"
|
"HOOK_ALLOW_FORCE_WATER_ACTION=53\n"
|
||||||
"HOOK_BEFORE_WARP=54\n"
|
"HOOK_BEFORE_WARP=54\n"
|
||||||
"HOOK_MAX=55\n"
|
"HOOK_ON_INSTANT_WARP=55\n"
|
||||||
|
"HOOK_MAX=56\n"
|
||||||
"ACTION_HOOK_EVERY_FRAME=0\n"
|
"ACTION_HOOK_EVERY_FRAME=0\n"
|
||||||
"ACTION_HOOK_GRAVITY=1\n"
|
"ACTION_HOOK_GRAVITY=1\n"
|
||||||
"ACTION_HOOK_MAX=2\n"
|
"ACTION_HOOK_MAX=2\n"
|
||||||
|
|
|
||||||
|
|
@ -656,6 +656,45 @@ void smlua_call_event_hooks_warp_params(enum LuaHookedEventType hookType, u8 typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smlua_call_event_hooks_instant_warp_params(enum LuaHookedEventType hookType, u8 area, u8 warpId, Vec3s displacement) {
|
||||||
|
lua_State* L = gLuaState;
|
||||||
|
if (L == NULL) { return; }
|
||||||
|
struct LuaHookedEvent* hook = &sHookedEvents[hookType];
|
||||||
|
for (int i = 0; i < hook->count; i++) {
|
||||||
|
s32 prevTop = lua_gettop(L);
|
||||||
|
|
||||||
|
// push the callback onto the stack
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
|
||||||
|
|
||||||
|
// push params
|
||||||
|
lua_pushinteger(L, area);
|
||||||
|
lua_pushinteger(L, warpId);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
int tbl = lua_gettop(L);
|
||||||
|
|
||||||
|
lua_pushstring(L, "x");
|
||||||
|
lua_pushinteger(L, displacement[0]);
|
||||||
|
lua_settable(L, tbl);
|
||||||
|
|
||||||
|
lua_pushstring(L, "y");
|
||||||
|
lua_pushinteger(L, displacement[1]);
|
||||||
|
lua_settable(L, tbl);
|
||||||
|
|
||||||
|
lua_pushstring(L, "z");
|
||||||
|
lua_pushinteger(L, displacement[2]);
|
||||||
|
lua_settable(L, tbl);
|
||||||
|
|
||||||
|
// call the callback
|
||||||
|
if (0 != smlua_call_hook(L, 3, 0, 0, hook->mod[i])) {
|
||||||
|
LOG_LUA("Failed to call the callback: %u", hookType);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_settop(L, prevTop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void smlua_call_event_hooks_int_params_ret_string(enum LuaHookedEventType hookType, s32 param, char** returnValue) {
|
void smlua_call_event_hooks_int_params_ret_string(enum LuaHookedEventType hookType, s32 param, char** returnValue) {
|
||||||
lua_State* L = gLuaState;
|
lua_State* L = gLuaState;
|
||||||
if (L == NULL) { return; }
|
if (L == NULL) { return; }
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ enum LuaHookedEventType {
|
||||||
HOOK_ON_INTERACTIONS,
|
HOOK_ON_INTERACTIONS,
|
||||||
HOOK_ALLOW_FORCE_WATER_ACTION,
|
HOOK_ALLOW_FORCE_WATER_ACTION,
|
||||||
HOOK_BEFORE_WARP,
|
HOOK_BEFORE_WARP,
|
||||||
|
HOOK_ON_INSTANT_WARP,
|
||||||
HOOK_MAX,
|
HOOK_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -126,6 +127,7 @@ static const char* LuaHookedEventTypeName[] = {
|
||||||
"HOOK_ON_INTERACTIONS",
|
"HOOK_ON_INTERACTIONS",
|
||||||
"HOOK_ALLOW_FORCE_WATER_ACTION",
|
"HOOK_ALLOW_FORCE_WATER_ACTION",
|
||||||
"HOOK_BEFORE_WARP",
|
"HOOK_BEFORE_WARP",
|
||||||
|
"HOOK_ON_INSTANT_WARP"
|
||||||
"HOOK_MAX"
|
"HOOK_MAX"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -208,6 +210,7 @@ void smlua_call_event_hooks_graph_node_and_int_param(enum LuaHookedEventType hoo
|
||||||
void smlua_call_event_hooks_on_seq_load(enum LuaHookedEventType hookType, u32 player, u32 seqId, s32 loadAsync, s16* returnValue);
|
void smlua_call_event_hooks_on_seq_load(enum LuaHookedEventType hookType, u32 player, u32 seqId, s32 loadAsync, s16* returnValue);
|
||||||
void smlua_call_event_hooks_before_warp(enum LuaHookedEventType hookType, s16 *destLevel, s16 *destArea, s16 *destWarpNode, s32 *arg);
|
void smlua_call_event_hooks_before_warp(enum LuaHookedEventType hookType, s16 *destLevel, s16 *destArea, s16 *destWarpNode, s32 *arg);
|
||||||
void smlua_call_event_hooks_warp_params(enum LuaHookedEventType hookType, u8 type, s16 levelNum, u8 areaIdx, u8 nodeId, u32 arg);
|
void smlua_call_event_hooks_warp_params(enum LuaHookedEventType hookType, u8 type, s16 levelNum, u8 areaIdx, u8 nodeId, u32 arg);
|
||||||
|
void smlua_call_event_hooks_instant_warp_params(enum LuaHookedEventType hookType, u8 area, u8 warpId, Vec3s displacement);
|
||||||
const char *smlua_call_event_hooks_int_ret_bool_and_string(enum LuaHookedEventType hookType, s32 param, bool* returnValue);
|
const char *smlua_call_event_hooks_int_ret_bool_and_string(enum LuaHookedEventType hookType, s32 param, bool* returnValue);
|
||||||
void smlua_call_event_hooks_string_param(enum LuaHookedEventType hookType, const char* string);
|
void smlua_call_event_hooks_string_param(enum LuaHookedEventType hookType, const char* string);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue