mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	Compare commits
	
		
			3 commits
		
	
	
		
			770d28dcef
			...
			833271d50f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 833271d50f | ||
|   | 3c84097e15 | ||
|   | e9a48ee4f5 | 
					 8 changed files with 40 additions and 5 deletions
				
			
		|  | @ -8123,7 +8123,8 @@ HOOK_MARIO_OVERRIDE_FLOOR_CLASS             = 56 --- @type LuaHookedEventType | |||
| HOOK_ON_ADD_SURFACE                         = 57 --- @type LuaHookedEventType | ||||
| HOOK_ON_CLEAR_AREAS                         = 58 --- @type LuaHookedEventType | ||||
| HOOK_ON_PACKET_BYTESTRING_RECEIVE           = 59 --- @type LuaHookedEventType | ||||
| HOOK_MAX                                    = 60 --- @type LuaHookedEventType | ||||
| HOOK_OBJECT_UPDATE                          = 60 --- @type LuaHookedEventType | ||||
| HOOK_MAX                                    = 61 --- @type LuaHookedEventType | ||||
| 
 | ||||
| --- @alias LuaHookedEventType | ||||
| --- | `HOOK_UPDATE` | ||||
|  | @ -8186,6 +8187,7 @@ HOOK_MAX                                    = 60 --- @type LuaHookedEventType | |||
| --- | `HOOK_ON_ADD_SURFACE` | ||||
| --- | `HOOK_ON_CLEAR_AREAS` | ||||
| --- | `HOOK_ON_PACKET_BYTESTRING_RECEIVE` | ||||
| --- | `HOOK_OBJECT_UPDATE` | ||||
| --- | `HOOK_MAX` | ||||
| 
 | ||||
| HUD_DISPLAY_LIVES         = 0 --- @type HudDisplayValue | ||||
|  |  | |||
|  | @ -3523,7 +3523,8 @@ | |||
| | HOOK_ON_ADD_SURFACE | 57 | | ||||
| | HOOK_ON_CLEAR_AREAS | 58 | | ||||
| | HOOK_ON_PACKET_BYTESTRING_RECEIVE | 59 | | ||||
| | HOOK_MAX | 60 | | ||||
| | HOOK_OBJECT_UPDATE | 60 | | ||||
| | HOOK_MAX | 61 | | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
|  |  | |||
|  | @ -151,7 +151,7 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh | |||
| | HOOK_MARIO_OVERRIDE_FLOOR_CLASS | Called when Mario's floor class logic updates, return a `SURFACE_CLASS_*` constant to override the type. | [MarioState](../structs.md#MarioState) mario, `integer` surfaceClass | | ||||
| | HOOK_ON_ADD_SURFACE | Called when collision surfaces are added. | [Surface](../structs.md#Surface) surface, `boolean` dynamic | | ||||
| | HOOK_ON_CLEAR_AREAS | Called when a level's areas are unloaded. | None | | ||||
| 
 | ||||
| | HOOK_OBJECT_UPDATE | Called once per object per frame | [Object](../structs.md#Object) obj | | ||||
| ### Parameters | ||||
| 
 | ||||
| | Field | Type | | ||||
|  |  | |||
|  | @ -1380,7 +1380,7 @@ cur_obj_update_begin:; | |||
| 
 | ||||
|     smlua_call_behavior_hook(&gCurBhvCommand, gCurrentObject, false); | ||||
|     gCurrentObject->curBhvCommand = gCurBhvCommand; | ||||
| 
 | ||||
|      | ||||
|     // Increment the object's timer.
 | ||||
|     if (gCurrentObject->oTimer < 0x3FFFFFFF) { | ||||
|         gCurrentObject->oTimer++; | ||||
|  | @ -1457,6 +1457,8 @@ cur_obj_update_begin:; | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     smlua_call_event_hooks(HOOK_OBJECT_UPDATE, gCurrentObject); | ||||
| 
 | ||||
|     // call the network area timer's run-once callback
 | ||||
| cur_obj_update_end:; | ||||
|     if (gCurrentObject->areaTimerType != AREA_TIMER_TYPE_NONE) { | ||||
|  |  | |||
|  | @ -3487,7 +3487,8 @@ char gSmluaConstants[] = "" | |||
| "HOOK_ON_ADD_SURFACE=57\n" | ||||
| "HOOK_ON_CLEAR_AREAS=58\n" | ||||
| "HOOK_ON_PACKET_BYTESTRING_RECEIVE=59\n" | ||||
| "HOOK_MAX=60\n" | ||||
| "HOOK_OBJECT_UPDATE=60\n" | ||||
| "HOOK_MAX=61\n" | ||||
| "HUD_DISPLAY_LIVES=0\n" | ||||
| "HUD_DISPLAY_COINS=1\n" | ||||
| "HUD_DISPLAY_STARS=2\n" | ||||
|  |  | |||
|  | @ -58,3 +58,4 @@ SMLUA_EVENT_HOOK(HOOK_MARIO_OVERRIDE_FLOOR_CLASS, HOOK_RETURN_ON_OUTPUT_SET, str | |||
| SMLUA_EVENT_HOOK(HOOK_ON_ADD_SURFACE, HOOK_RETURN_NEVER, struct Surface *surface, bool dynamic) | ||||
| SMLUA_EVENT_HOOK(HOOK_ON_CLEAR_AREAS, HOOK_RETURN_NEVER) | ||||
| SMLUA_EVENT_HOOK(HOOK_ON_PACKET_BYTESTRING_RECEIVE, HOOK_RETURN_NEVER, s32 modIndex, s32 valueIndex) | ||||
| SMLUA_EVENT_HOOK(HOOK_OBJECT_UPDATE, HOOK_RETURN_NEVER, struct Object *obj) | ||||
|  |  | |||
|  | @ -1863,3 +1863,30 @@ bool smlua_call_event_hooks_HOOK_ON_PACKET_BYTESTRING_RECEIVE(s32 modIndex, s32 | |||
|     } | ||||
|     return hookResult; | ||||
| } | ||||
| 
 | ||||
| bool smlua_call_event_hooks_HOOK_OBJECT_UPDATE(struct Object *obj) { | ||||
|     lua_State *L = gLuaState; | ||||
|     if (L == NULL) { return false; } | ||||
|     bool hookResult = false; | ||||
| 
 | ||||
|     struct LuaHookedEvent *hook = &sHookedEvents[HOOK_OBJECT_UPDATE]; | ||||
|     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 obj | ||||
|         smlua_push_object(L, LOT_OBJECT, obj, NULL); | ||||
| 
 | ||||
|         // call the callback | ||||
|         if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) { | ||||
|             LOG_LUA("Failed to call the callback for hook %s", sLuaHookedEventTypeName[HOOK_OBJECT_UPDATE]); | ||||
|             continue; | ||||
|         } | ||||
|         hookResult = true; | ||||
| 
 | ||||
|         lua_settop(L, prevTop); | ||||
|     } | ||||
|     return hookResult; | ||||
| } | ||||
|  |  | |||
|  | @ -74,6 +74,7 @@ enum LuaHookedEventType { | |||
|     HOOK_ON_ADD_SURFACE, | ||||
|     HOOK_ON_CLEAR_AREAS, | ||||
|     HOOK_ON_PACKET_BYTESTRING_RECEIVE, | ||||
|     HOOK_OBJECT_UPDATE, | ||||
|     HOOK_MAX, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue