temp pointer fix

This commit is contained in:
PeachyPeachSM64 2026-03-12 19:13:15 +01:00
parent 006fc1dcd2
commit 296fffa60b
28 changed files with 365 additions and 441 deletions

View file

@ -137,7 +137,6 @@ override_disallowed_functions = {
"src/pc/lua/utils/smlua_gfx_utils.h": [ "gfx_allocate_internal", "vtx_allocate_internal", "gfx_get_length_no_sentinel" ],
"src/pc/network/lag_compensation.h": [ "lag_compensation_clear" ],
"src/game/first_person_cam.h": [ "first_person_update" ],
"src/pc/lua/utils/smlua_collision_utils.h": [ "collision_find_surface_on_ray" ],
"src/engine/behavior_script.h": [ "stub_behavior_script_2", "cur_obj_update" ],
"src/pc/mods/mod_storage.h": [ "mod_storage_shutdown" ],
"src/pc/mods/mod_fs.h": [ "mod_fs_read_file_from_uri", "mod_fs_shutdown" ],
@ -229,7 +228,6 @@ manual_index_documentation = """
- [level_script_parse](#level_script_parse)
- [log_to_console](#log_to_console)
- [add_scroll_target](#add_scroll_target)
- [collision_find_surface_on_ray](#collision_find_surface_on_ray)
- [cast_graph_node](#cast_graph_node)
- [get_uncolored_string](#get_uncolored_string)
- [gfx_set_command](#gfx_set_command)
@ -522,34 +520,6 @@ Registers a vertex buffer to be used for a scrolling texture. Should be used wit
<br />
## [collision_find_surface_on_ray](#collision_find_surface_on_ray)
Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`.
### Lua Example
`collision_find_surface_on_ray(0, 0, 0, 50, 100, 50)`
### Parameters
| Field | Type |
| ----- | ---- |
| startX | `number` |
| startY | `number` |
| startZ | `number` |
| dirX | `number` |
| dirY | `number` |
| dirZ | `number` |
| precision (optional) | `number` |
### Returns
- [RayIntersectionInfo](structs.md#RayIntersectionInfo)
### C Prototype
`struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision);`
[:arrow_up_small:](#)
<br />
## [set_exclamation_box_contents](#set_exclamation_box_contents)
Sets the contents that the exclamation box spawns. A single content has 5 keys: `id`, `unused`, `firstByte`, `model`, and `behavior`.
@ -867,7 +837,15 @@ def build_return_value(id, rtype):
lvt = translate_type_to_lvt(rtype)
return ' smlua_push_pointer(L, %s, (void*)%s, NULL);\n' % (lvt, id)
elif '???' not in lot and lot != 'LOT_NONE':
return ' smlua_push_object(L, %s, %s, NULL);\n' % (lot, id)
if '*' in rtype:
return ' smlua_push_object(L, %s, %s, NULL, false);\n' % (lot, id)
else:
return '''
%s *p = malloc(sizeof(%s));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%%s'", "%s"); return 0; }
*p = %s;
smlua_push_object(L, %s, p, NULL, true);
''' % (rtype, rtype, id[:id.find('(')], id, lot)
return ' %s(L, %s);\n' % (lfunc, id)

View file

@ -196,7 +196,7 @@ def init():
SMLUA_TYPES[typename] = {
"input": """
// push {name}
smlua_push_object(L, %s, {name}, NULL);
smlua_push_object(L, %s, {name}, NULL, false);
""" % (lot)
}

View file

@ -10635,6 +10635,19 @@ function camera_set_checking_surfaces(value)
-- ...
end
--- @param startX number
--- @param startY number
--- @param startZ number
--- @param dirX number
--- @param dirY number
--- @param dirZ number
--- @param precision? number
--- @return RayIntersectionInfo
--- Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`, with a non-zero `precision`
function collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ, precision)
-- ...
end
--- @param x number
--- @param y number
--- @param z number
@ -11136,20 +11149,6 @@ function get_area_update_counter()
-- ...
end
--- @param initialValue integer
--- @return Pointer_integer
--- Returns a temporary signed 32-bit integer pointer with its value set to `initialValue`
function get_temp_s32_pointer(initialValue)
-- ...
end
--- @param pointer Pointer_integer
--- @return integer
--- Gets the signed 32-bit integer value from `pointer`
function deref_s32_pointer(pointer)
-- ...
end
--- @param message string
--- @param lines integer
--- Creates a DJUI popup that is broadcasted to every client

View file

@ -351,19 +351,6 @@ function add_scroll_target(index, name)
-- ...
end
--- @param startX number Start position X
--- @param startY number Start position Y
--- @param startZ number Start position Z
--- @param dirX number Direction X
--- @param dirY number Direction Y
--- @param dirZ number Direction Z
--- @param precision? number Optional; How precise the raycast should be. The default value is 3.0, the higher the number, the more precise.
--- @return RayIntersectionInfo
--- Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`
function collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ, precision)
-- ...
end
--- @param contents ExclamationBoxContent[]
--- Sets the contents that the exclamation box spawns.
--- A single content has 5 keys: `id`, `unused`, `firstByte`, `model`, and `behavior`

View file

@ -2870,7 +2870,7 @@ Gets the current DJUI HUD color
- [DjuiColor](structs.md#DjuiColor)
### C Prototype
`struct DjuiColor* djui_hud_get_color(void);`
`struct DjuiColor djui_hud_get_color(void);`
[:arrow_up_small:](#)

View file

@ -7171,6 +7171,35 @@ Sets if the camera should account for surfaces
<br />
## [collision_find_surface_on_ray](#collision_find_surface_on_ray)
### Description
Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`, with a non-zero `precision`
### Lua Example
`local rayIntersectionInfoValue = collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ, precision)`
### Parameters
| Field | Type |
| ----- | ---- |
| startX | `number` |
| startY | `number` |
| startZ | `number` |
| dirX | `number` |
| dirY | `number` |
| dirZ | `number` |
| precision | `number` |
### Returns
- [RayIntersectionInfo](structs.md#RayIntersectionInfo)
### C Prototype
`struct RayIntersectionInfo collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, OPTIONAL f32 precision);`
[:arrow_up_small:](#)
<br />
## [collision_find_floor](#collision_find_floor)
### Description
@ -7280,7 +7309,7 @@ Returns a temporary wall collision data pointer
- [WallCollisionData](structs.md#WallCollisionData)
### C Prototype
`struct WallCollisionData* collision_get_temp_wall_collision_data(void);`
`struct WallCollisionData collision_get_temp_wall_collision_data(void);`
[:arrow_up_small:](#)

View file

@ -343,52 +343,6 @@ Gets the area update counter incremented when objects are updated
<br />
## [get_temp_s32_pointer](#get_temp_s32_pointer)
### Description
Returns a temporary signed 32-bit integer pointer with its value set to `initialValue`
### Lua Example
`local pointerValue = get_temp_s32_pointer(initialValue)`
### Parameters
| Field | Type |
| ----- | ---- |
| initialValue | `integer` |
### Returns
- `Pointer` <`integer`>
### C Prototype
`s32* get_temp_s32_pointer(s32 initialValue);`
[:arrow_up_small:](#)
<br />
## [deref_s32_pointer](#deref_s32_pointer)
### Description
Gets the signed 32-bit integer value from `pointer`
### Lua Example
`local integerValue = deref_s32_pointer(pointer)`
### Parameters
| Field | Type |
| ----- | ---- |
| pointer | `Pointer` <`integer`> |
### Returns
- `integer`
### C Prototype
`s32 deref_s32_pointer(s32* pointer);`
[:arrow_up_small:](#)
<br />
## [djui_popup_create_global](#djui_popup_create_global)
### Description
@ -1683,7 +1637,7 @@ Gets the system clock's date and time
- [DateTime](structs.md#DateTime)
### C Prototype
`struct DateTime* get_date_and_time(void);`
`struct DateTime get_date_and_time(void);`
[:arrow_up_small:](#)
@ -3185,7 +3139,7 @@ Returns a temporary particle spawn info pointer with its model loaded in from `m
- [SpawnParticlesInfo](structs.md#SpawnParticlesInfo)
### C Prototype
`struct SpawnParticlesInfo* obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId);`
`struct SpawnParticlesInfo obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId);`
[:arrow_up_small:](#)
@ -3209,7 +3163,7 @@ Returns a temporary water droplet params pointer with its model and behavior loa
- [WaterDropletParams](structs.md#WaterDropletParams)
### C Prototype
`struct WaterDropletParams* obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId);`
`struct WaterDropletParams obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId);`
[:arrow_up_small:](#)
@ -3230,7 +3184,7 @@ Returns a temporary object hitbox pointer
- [ObjectHitbox](structs.md#ObjectHitbox)
### C Prototype
`struct ObjectHitbox* get_temp_object_hitbox(void);`
`struct ObjectHitbox get_temp_object_hitbox(void);`
[:arrow_up_small:](#)

View file

@ -21,7 +21,6 @@
- [level_script_parse](#level_script_parse)
- [log_to_console](#log_to_console)
- [add_scroll_target](#add_scroll_target)
- [collision_find_surface_on_ray](#collision_find_surface_on_ray)
- [cast_graph_node](#cast_graph_node)
- [get_uncolored_string](#get_uncolored_string)
- [gfx_set_command](#gfx_set_command)
@ -1905,6 +1904,7 @@
<br />
- smlua_collision_utils.h
- [collision_find_surface_on_ray](functions-6.md#collision_find_surface_on_ray)
- [collision_find_floor](functions-6.md#collision_find_floor)
- [collision_find_ceil](functions-6.md#collision_find_ceil)
- [get_water_surface_pseudo_floor](functions-6.md#get_water_surface_pseudo_floor)
@ -1992,8 +1992,6 @@
- smlua_misc_utils.h
- [get_network_area_timer](functions-7.md#get_network_area_timer)
- [get_area_update_counter](functions-7.md#get_area_update_counter)
- [get_temp_s32_pointer](functions-7.md#get_temp_s32_pointer)
- [deref_s32_pointer](functions-7.md#deref_s32_pointer)
- [djui_popup_create_global](functions-7.md#djui_popup_create_global)
- [djui_is_popup_disabled](functions-7.md#djui_is_popup_disabled)
- [djui_set_popup_disabled_override](functions-7.md#djui_set_popup_disabled_override)
@ -2520,34 +2518,6 @@ Registers a vertex buffer to be used for a scrolling texture. Should be used wit
<br />
## [collision_find_surface_on_ray](#collision_find_surface_on_ray)
Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`.
### Lua Example
`collision_find_surface_on_ray(0, 0, 0, 50, 100, 50)`
### Parameters
| Field | Type |
| ----- | ---- |
| startX | `number` |
| startY | `number` |
| startZ | `number` |
| dirX | `number` |
| dirY | `number` |
| dirZ | `number` |
| precision (optional) | `number` |
### Returns
- [RayIntersectionInfo](structs.md#RayIntersectionInfo)
### C Prototype
`struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision);`
[:arrow_up_small:](#)
<br />
## [set_exclamation_box_contents](#set_exclamation_box_contents)
Sets the contents that the exclamation box spawns. A single content has 5 keys: `id`, `unused`, `firstByte`, `model`, and `behavior`.

View file

@ -1042,7 +1042,7 @@ static s32 bhv_cmd_call_native_ext(void) {
lua_rawgeti(gLuaState, LUA_REGISTRYINDEX, funcRef);
// Push object
smlua_push_object(gLuaState, LOT_OBJECT, gCurrentObject, NULL);
smlua_push_object(gLuaState, LOT_OBJECT, gCurrentObject, NULL, false);
// Call the callback
if (0 != smlua_call_hook(gLuaState, 1, 0, 0, mod, modFile)) {

View file

@ -916,7 +916,7 @@ Gfx *geo_process_lua_function(s32 callContext, struct GraphNode *node, UNUSED Ma
// Push the callback, the graph node and the current matrix stack index
lua_rawgeti(L, LUA_REGISTRYINDEX, funcRef);
smlua_push_object(L, LOT_GRAPHNODE, node, NULL);
smlua_push_object(L, LOT_GRAPHNODE, node, NULL, false);
lua_pushinteger(L, gMatStackIndex);
// Call the callback

View file

@ -62,8 +62,6 @@ static struct HudUtilsState sHudUtilsState = {
},
};
static struct DjuiColor sRefColor = { 255, 255, 255, 255 };
f32 gDjuiHudUtilsZ = 0;
bool gDjuiHudLockMouse = false;
@ -315,12 +313,8 @@ void djui_hud_set_font(s8 fontType) {
sHudUtilsState.font = fontType;
}
struct DjuiColor* djui_hud_get_color(void) {
sRefColor.r = sHudUtilsState.color.r;
sRefColor.g = sHudUtilsState.color.g;
sRefColor.b = sHudUtilsState.color.b;
sRefColor.a = sHudUtilsState.color.a;
return &sRefColor;
struct DjuiColor djui_hud_get_color(void) {
return sHudUtilsState.color;
}
void djui_hud_set_color(u8 r, u8 g, u8 b, u8 a) {

View file

@ -75,7 +75,7 @@ s8 djui_hud_get_font(void);
/* |description|Sets the current DJUI HUD font|descriptionEnd| */
void djui_hud_set_font(s8 fontType);
/* |description|Gets the current DJUI HUD color|descriptionEnd| */
struct DjuiColor* djui_hud_get_color(void);
struct DjuiColor djui_hud_get_color(void);
/* |description|Sets the current DJUI HUD color|descriptionEnd| */
void djui_hud_set_color(u8 r, u8 g, u8 b, u8 a);
/* |description|Resets the current DJUI HUD color|descriptionEnd| */

View file

@ -407,8 +407,10 @@ void smlua_update(void) {
// doing incremental garbage collection.
// The real fix would be to make smlua produce less
// garbage.
// lua_gc(L, LUA_GCSTOP, 0);
// lua_gc(L, LUA_GCCOLLECT, 0);
// EDIT²: smlua is so lazy during its GC that userdata is
// never garbage collected. Perform a GC cycle at the end
// of each frame to make sure it doesn't "forget" about it.
lua_gc(L, LUA_GCSTEP, 0);
}
void smlua_shutdown(void) {

View file

@ -364,25 +364,25 @@ struct LuaObjectField* smlua_get_custom_field(lua_State* L, u32 lot, int keyInde
return &lof;
}
/////////////////////
// CObject get/set //
/////////////////////
/////////////
// CObject //
/////////////
static bool smlua_push_field(lua_State* L, u8* p, struct LuaObjectField *data) {
static bool smlua_cobject_get_field(lua_State* L, u8* p, struct LuaObjectField *data) {
switch (data->valueType) {
case LVT_BOOL: lua_pushboolean(L, *(u8* )p); break;
case LVT_U8: lua_pushinteger(L, *(u8* )p); break;
case LVT_U16: lua_pushinteger(L, *(u16*)p); break;
case LVT_U32: lua_pushinteger(L, *(u32*)p); break;
case LVT_S8: lua_pushinteger(L, *(s8* )p); break;
case LVT_S16: lua_pushinteger(L, *(s16*)p); break;
case LVT_S32: lua_pushinteger(L, *(s32*)p); break;
case LVT_F32: lua_pushnumber( L, *(f32*)p); break;
case LVT_U64: lua_pushinteger(L, *(u64*)p); break;
case LVT_COBJECT: smlua_push_object(L, data->lot, p, NULL); break;
case LVT_COBJECT_P: smlua_push_object(L, data->lot, *(u8**)p, NULL); break;
case LVT_STRING: lua_pushstring(L, (char*)p); break;
case LVT_STRING_P: lua_pushstring(L, *(char**)p); break;
case LVT_BOOL: lua_pushboolean(L, *(u8* )p); break;
case LVT_U8: lua_pushinteger(L, *(u8* )p); break;
case LVT_U16: lua_pushinteger(L, *(u16*)p); break;
case LVT_U32: lua_pushinteger(L, *(u32*)p); break;
case LVT_S8: lua_pushinteger(L, *(s8* )p); break;
case LVT_S16: lua_pushinteger(L, *(s16*)p); break;
case LVT_S32: lua_pushinteger(L, *(s32*)p); break;
case LVT_F32: lua_pushnumber( L, *(f32*)p); break;
case LVT_U64: lua_pushinteger(L, *(u64*)p); break;
case LVT_COBJECT: smlua_push_object(L, data->lot, p, NULL, false); break;
case LVT_COBJECT_P: smlua_push_object(L, data->lot, *(u8**)p, NULL, false); break;
case LVT_STRING: lua_pushstring(L, (char*)p); break;
case LVT_STRING_P: lua_pushstring(L, *(char**)p); break;
// pointers
case LVT_BOOL_P:
@ -409,7 +409,7 @@ static bool smlua_push_field(lua_State* L, u8* p, struct LuaObjectField *data) {
return false;
}
static bool smlua_set_field(lua_State* L, u8* p, struct LuaObjectField *data) {
static bool smlua_cobject_set_field(lua_State* L, u8* p, struct LuaObjectField *data) {
void* valuePointer = NULL;
switch (data->valueType) {
case LVT_BOOL:*(u8*) p = smlua_to_boolean(L, 3); break;
@ -465,7 +465,7 @@ static bool smlua_set_field(lua_State* L, u8* p, struct LuaObjectField *data) {
return false;
}
static int smlua__get_field(lua_State* L) {
static int smlua_cobject_get(lua_State* L) {
LUA_STACK_CHECK_BEGIN_NUM(L, 1);
const CObject *cobj = lua_touserdata(L, 1);
@ -514,7 +514,7 @@ static int smlua__get_field(lua_State* L) {
}
u8* p = ((u8*)(intptr_t)pointer) + (key * data->size);
if (smlua_push_field(L, p, data)) {
if (smlua_cobject_get_field(L, p, data)) {
LOG_LUA_LINE("_get_field on unimplemented type '%d', key '%u'", data->valueType, key);
return 0;
}
@ -560,12 +560,12 @@ static int smlua__get_field(lua_State* L) {
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
if (data->count == 1) {
if (smlua_push_field(L, p, data)) {
if (smlua_cobject_get_field(L, p, data)) {
LOG_LUA_LINE("_get_field on unimplemented type '%d', key '%s'", data->valueType, key);
return 0;
}
} else {
smlua_push_object(L, LOT_ARRAY, p, data);
smlua_push_object(L, LOT_ARRAY, p, data, false);
if (!gSmLuaConvertSuccess) {
LOG_LUA_LINE("_set_field failed to retrieve value type '%d', key '%s'", data->valueType, key);
return 0;
@ -576,7 +576,7 @@ static int smlua__get_field(lua_State* L) {
return 1;
}
static int smlua__set_field(lua_State* L) {
static int smlua_cobject_set(lua_State* L) {
LUA_STACK_CHECK_BEGIN(L);
const CObject *cobj = lua_touserdata(L, 1);
@ -608,7 +608,7 @@ static int smlua__set_field(lua_State* L) {
}
u8* p = ((u8*)(intptr_t)pointer) + (key * data->size);
if (smlua_set_field(L, p, data)) {
if (smlua_cobject_set_field(L, p, data)) {
LOG_LUA_LINE("_set_field on unimplemented type '%d', key '%u'", data->valueType, key);
return 0;
}
@ -639,7 +639,7 @@ static int smlua__set_field(lua_State* L) {
}
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
if (smlua_set_field(L, p, data)) {
if (smlua_cobject_set_field(L, p, data)) {
LOG_LUA_LINE("_set_field on unimplemented type '%d', key '%s'", data->valueType, key);
return 0;
}
@ -652,19 +652,33 @@ static int smlua__set_field(lua_State* L) {
return 1;
}
int smlua__eq(lua_State *L) {
static int smlua_cobject_eq(lua_State* L) {
const CObject *a = lua_touserdata(L, 1);
const CObject *b = lua_touserdata(L, 2);
lua_pushboolean(L, a && b && a->lot == b->lot && a->pointer == b->pointer);
return 1;
}
int smlua__bnot(lua_State *L) {
static int smlua_cobject_bnot(lua_State* L) {
const CObject *a = lua_touserdata(L, 1);
lua_pushboolean(L, !a || a->freed);
return 1;
}
static int smlua_cobject_gc(lua_State* L) {
CObject *cobj = lua_touserdata(L, 1);
if (cobj && cobj->dynamic) {
free(cobj->pointer);
cobj->pointer = NULL;
cobj->freed = true;
}
return 0;
}
//////////////
// CPointer //
//////////////
static int smlua_cpointer_get(lua_State* L) {
const CPointer *cptr = lua_touserdata(L, 1);
const char *key = lua_tostring(L, 2);
@ -684,7 +698,23 @@ static int smlua_cpointer_get(lua_State* L) {
return 0;
}
static int smlua_cpointer_set(UNUSED lua_State* L) { return 0; }
static int smlua_cpointer_set(UNUSED lua_State* L) {
return 0;
}
static int smlua_cpointer_eq(lua_State* L) {
const CPointer *a = lua_touserdata(L, 1);
const CPointer *b = lua_touserdata(L, 2);
lua_pushboolean(L, a && b && a->lvt == b->lvt && a->pointer == b->pointer);
return 1;
}
static int smlua_cpointer_bnot(lua_State* L) {
const CPointer *a = lua_touserdata(L, 1);
lua_pushboolean(L, !a || a->freed);
return 1;
}
//////////
// bind //
@ -702,10 +732,11 @@ void smlua_cobject_init_globals(void) {
// Create metatables
luaL_newmetatable(L, "CObject");
luaL_Reg cObjectMethods[] = {
{ "__index", smlua__get_field },
{ "__newindex", smlua__set_field },
{ "__eq", smlua__eq },
{ "__bnot", smlua__bnot },
{ "__index", smlua_cobject_get },
{ "__newindex", smlua_cobject_set },
{ "__eq", smlua_cobject_eq },
{ "__bnot", smlua_cobject_bnot },
{ "__gc", smlua_cobject_gc },
{ "__metatable", NULL },
{ NULL, NULL }
};
@ -715,8 +746,8 @@ void smlua_cobject_init_globals(void) {
luaL_Reg cPointerMethods[] = {
{ "__index", smlua_cpointer_get },
{ "__newindex", smlua_cpointer_set },
{ "__eq", smlua__eq },
{ "__bnot", smlua__bnot },
{ "__eq", smlua_cpointer_eq },
{ "__bnot", smlua_cpointer_bnot },
{ "__metatable", NULL },
{ NULL, NULL }
};
@ -729,15 +760,15 @@ void smlua_cobject_init_globals(void) {
int t = lua_gettop(gLuaState); \
for (s32 i = 0; i < iterator; i++) { \
lua_pushinteger(L, i); \
smlua_push_object(L, lot, &ptr[i], NULL); \
smlua_push_object(L, lot, &ptr[i], NULL, false); \
lua_settable(L, t); \
} \
lua_setglobal(L, #ptr); \
} \
#define EXPOSE_GLOBAL(lot, ptr) smlua_push_object(L, lot, &ptr, NULL); lua_setglobal(L, #ptr);
#define EXPOSE_GLOBAL_PTR(lot, ptr) smlua_push_object(L, lot, ptr, NULL); lua_setglobal(L, #ptr);
#define EXPOSE_GLOBAL_WITH_NAME(lot, ptr, name) smlua_push_object(L, lot, ptr, NULL); lua_setglobal(L, name);
#define EXPOSE_GLOBAL(lot, ptr) smlua_push_object(L, lot, &ptr, NULL, false); lua_setglobal(L, #ptr);
#define EXPOSE_GLOBAL_PTR(lot, ptr) smlua_push_object(L, lot, ptr, NULL, false); lua_setglobal(L, #ptr);
#define EXPOSE_GLOBAL_WITH_NAME(lot, ptr, name) smlua_push_object(L, lot, ptr, NULL, false); lua_setglobal(L, name);
// Array structs
@ -750,7 +781,7 @@ void smlua_cobject_init_globals(void) {
int t = lua_gettop(gLuaState);
for (s32 i = 0; i < gActiveMods.entryCount; i++) {
lua_pushinteger(L, i);
smlua_push_object(L, LOT_MOD, gActiveMods.entries[i], NULL);
smlua_push_object(L, LOT_MOD, gActiveMods.entries[i], NULL, false);
lua_settable(L, t);
}
lua_setglobal(L, "gActiveMods");

View file

@ -60,6 +60,7 @@ typedef struct {
u16 lot;
bool freed;
void *info;
bool dynamic;
} CObject;
typedef struct {

View file

@ -840,34 +840,6 @@ int smlua_func_add_scroll_target(lua_State* L) {
return 1;
}
/////////////
// raycast //
/////////////
int smlua_func_collision_find_surface_on_ray(lua_State* L) {
if (!smlua_functions_valid_param_range(L, 6, 7)) { return 0; }
int paramCount = lua_gettop(L);
f32 startX = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 1"); return 0; }
f32 startY = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 2"); return 0; }
f32 startZ = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 3"); return 0; }
f32 dirX = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 4"); return 0; }
f32 dirY = smlua_to_number(L, 5);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 5"); return 0; }
f32 dirZ = smlua_to_number(L, 6);
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 6"); return 0; }
f32 precision = paramCount == 7 ? smlua_to_number(L, 7) : 3.0f;
if (!gSmLuaConvertSuccess) { LOG_LUA("collision_find_surface_on_ray: Failed to convert parameter 7"); return 0; }
smlua_push_object(L, LOT_RAYINTERSECTIONINFO, collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ, precision), NULL);
return 1;
}
////////////////
// graph node //
////////////////
@ -927,7 +899,7 @@ int smlua_func_cast_graph_node(lua_State* L) {
return 0;
}
smlua_push_object(L, lot, graphNode, NULL);
smlua_push_object(L, lot, graphNode, NULL, false);
// Register this graph node as modified so it can be reset later
dynos_actor_register_modified_graph_node(graphNode);
@ -1027,7 +999,6 @@ void smlua_bind_functions(void) {
smlua_bind_function(L, "smlua_anim_util_register_animation", smlua_func_smlua_anim_util_register_animation);
smlua_bind_function(L, "log_to_console", smlua_func_log_to_console);
smlua_bind_function(L, "add_scroll_target", smlua_func_add_scroll_target);
smlua_bind_function(L, "collision_find_surface_on_ray", smlua_func_collision_find_surface_on_ray);
smlua_bind_function(L, "cast_graph_node", smlua_func_cast_graph_node);
smlua_bind_function(L, "get_uncolored_string", smlua_func_get_uncolored_string);
smlua_bind_function(L, "gfx_set_command", smlua_func_gfx_set_command);

View file

@ -474,7 +474,7 @@ int smlua_func_area_get_warp_node(lua_State* L) {
u8 id = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "area_get_warp_node"); return 0; }
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_warp_node(id), NULL);
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_warp_node(id), NULL, false);
return 1;
}
@ -489,7 +489,7 @@ int smlua_func_area_get_any_warp_node(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_any_warp_node(), NULL);
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_any_warp_node(), NULL, false);
return 1;
}
@ -506,7 +506,7 @@ int smlua_func_area_get_warp_node_from_params(lua_State* L) {
struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "area_get_warp_node_from_params"); return 0; }
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_warp_node_from_params(o), NULL);
smlua_push_object(L, LOT_OBJECTWARPNODE, area_get_warp_node_from_params(o), NULL, false);
return 1;
}
@ -9746,7 +9746,7 @@ int smlua_func_spawn_default_star(lua_State* L) {
f32 z = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "spawn_default_star"); return 0; }
smlua_push_object(L, LOT_OBJECT, spawn_default_star(x, y, z), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_default_star(x, y, z), NULL, false);
return 1;
}
@ -9767,7 +9767,7 @@ int smlua_func_spawn_red_coin_cutscene_star(lua_State* L) {
f32 z = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "spawn_red_coin_cutscene_star"); return 0; }
smlua_push_object(L, LOT_OBJECT, spawn_red_coin_cutscene_star(x, y, z), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_red_coin_cutscene_star(x, y, z), NULL, false);
return 1;
}
@ -9788,7 +9788,7 @@ int smlua_func_spawn_no_exit_star(lua_State* L) {
f32 z = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "spawn_no_exit_star"); return 0; }
smlua_push_object(L, LOT_OBJECT, spawn_no_exit_star(x, y, z), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_no_exit_star(x, y, z), NULL, false);
return 1;
}
@ -12006,7 +12006,7 @@ int smlua_func_get_character(lua_State* L) {
struct MarioState* m = (struct MarioState*)smlua_to_cobject(L, 1, LOT_MARIOSTATE);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_character"); return 0; }
smlua_push_object(L, LOT_CHARACTER, get_character(m), NULL);
smlua_push_object(L, LOT_CHARACTER, get_character(m), NULL, false);
return 1;
}
@ -12275,7 +12275,11 @@ int smlua_func_djui_hud_get_color(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_DJUICOLOR, djui_hud_get_color(), NULL);
struct DjuiColor *p = malloc(sizeof(struct DjuiColor));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "djui_hud_get_color"); return 0; }
*p = djui_hud_get_color();
smlua_push_object(L, LOT_DJUICOLOR, p, NULL, true);
return 1;
}
@ -14930,7 +14934,7 @@ int smlua_func_mario_get_collided_object(lua_State* L) {
u32 interactType = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mario_get_collided_object"); return 0; }
smlua_push_object(L, LOT_OBJECT, mario_get_collided_object(m, interactType), NULL);
smlua_push_object(L, LOT_OBJECT, mario_get_collided_object(m, interactType), NULL, false);
return 1;
}
@ -15093,7 +15097,7 @@ int smlua_func_lag_compensation_get_local_state(lua_State* L) {
struct NetworkPlayer* otherNp = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "lag_compensation_get_local_state"); return 0; }
smlua_push_object(L, LOT_MARIOSTATE, lag_compensation_get_local_state(otherNp), NULL);
smlua_push_object(L, LOT_MARIOSTATE, lag_compensation_get_local_state(otherNp), NULL, false);
return 1;
}
@ -15286,7 +15290,7 @@ int smlua_func_area_create_warp_node(lua_State* L) {
struct Object* o = (struct Object*)smlua_to_cobject(L, 6, LOT_OBJECT);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "area_create_warp_node"); return 0; }
smlua_push_object(L, LOT_OBJECTWARPNODE, area_create_warp_node(id, destLevel, destArea, destNode, checkpoint, o), NULL);
smlua_push_object(L, LOT_OBJECTWARPNODE, area_create_warp_node(id, destLevel, destArea, destNode, checkpoint, o), NULL, false);
return 1;
}
@ -15356,7 +15360,7 @@ int smlua_func_get_instant_warp(lua_State* L) {
u8 index = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_instant_warp"); return 0; }
smlua_push_object(L, LOT_INSTANTWARP, get_instant_warp(index), NULL);
smlua_push_object(L, LOT_INSTANTWARP, get_instant_warp(index), NULL, false);
return 1;
}
@ -15371,7 +15375,7 @@ int smlua_func_get_painting_warp_node(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_WARPNODE, get_painting_warp_node(), NULL);
smlua_push_object(L, LOT_WARPNODE, get_painting_warp_node(), NULL, false);
return 1;
}
@ -16530,7 +16534,7 @@ int smlua_func_resolve_and_return_wall_collisions(lua_State* L) {
f32 radius = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "resolve_and_return_wall_collisions"); return 0; }
smlua_push_object(L, LOT_SURFACE, resolve_and_return_wall_collisions(pos, offset, radius), NULL);
smlua_push_object(L, LOT_SURFACE, resolve_and_return_wall_collisions(pos, offset, radius), NULL, false);
smlua_push_vec3f(pos, 1);
@ -16584,7 +16588,7 @@ int smlua_func_vec3f_find_ceil(lua_State* L) {
lua_pushnumber(L, vec3f_find_ceil(pos, height, &ceil));
smlua_push_object(L, LOT_SURFACE, ceil, NULL);
smlua_push_object(L, LOT_SURFACE, ceil, NULL, false);
return 2;
}
@ -16609,7 +16613,7 @@ int smlua_func_vec3f_mario_ceil(lua_State* L) {
lua_pushnumber(L, vec3f_mario_ceil(pos, height, &ceil));
smlua_push_object(L, LOT_SURFACE, ceil, NULL);
smlua_push_object(L, LOT_SURFACE, ceil, NULL, false);
return 2;
}
@ -17053,7 +17057,7 @@ int smlua_func_get_mario_state_from_object(lua_State* L) {
struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_mario_state_from_object"); return 0; }
smlua_push_object(L, LOT_MARIOSTATE, get_mario_state_from_object(o), NULL);
smlua_push_object(L, LOT_MARIOSTATE, get_mario_state_from_object(o), NULL, false);
return 1;
}
@ -19184,7 +19188,7 @@ int smlua_func_geo_get_mario_state(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_MARIOSTATE, geo_get_mario_state(), NULL);
smlua_push_object(L, LOT_MARIOSTATE, geo_get_mario_state(), NULL, false);
return 1;
}
@ -19199,7 +19203,7 @@ int smlua_func_geo_get_body_state(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_MARIOBODYSTATE, geo_get_body_state(), NULL);
smlua_push_object(L, LOT_MARIOBODYSTATE, geo_get_body_state(), NULL, false);
return 1;
}
@ -22397,7 +22401,7 @@ int smlua_func_mod_fs_get(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_fs_get"); return 0; }
}
smlua_push_object(L, LOT_MODFS, mod_fs_get(modPath), NULL);
smlua_push_object(L, LOT_MODFS, mod_fs_get(modPath), NULL, false);
return 1;
}
@ -22417,7 +22421,7 @@ int smlua_func_mod_fs_reload(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_fs_reload"); return 0; }
}
smlua_push_object(L, LOT_MODFS, mod_fs_reload(modPath), NULL);
smlua_push_object(L, LOT_MODFS, mod_fs_reload(modPath), NULL, false);
return 1;
}
@ -22432,7 +22436,7 @@ int smlua_func_mod_fs_create(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_MODFS, mod_fs_create(), NULL);
smlua_push_object(L, LOT_MODFS, mod_fs_create(), NULL, false);
return 1;
}
@ -22470,7 +22474,7 @@ int smlua_func_mod_fs_get_file(lua_State* L) {
const char* filepath = smlua_to_string(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mod_fs_get_file"); return 0; }
smlua_push_object(L, LOT_MODFSFILE, mod_fs_get_file(modFs, filepath), NULL);
smlua_push_object(L, LOT_MODFSFILE, mod_fs_get_file(modFs, filepath), NULL, false);
return 1;
}
@ -22491,7 +22495,7 @@ int smlua_func_mod_fs_create_file(lua_State* L) {
bool text = smlua_to_boolean(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "mod_fs_create_file"); return 0; }
smlua_push_object(L, LOT_MODFSFILE, mod_fs_create_file(modFs, filepath, text), NULL);
smlua_push_object(L, LOT_MODFSFILE, mod_fs_create_file(modFs, filepath, text), NULL, false);
return 1;
}
@ -23275,7 +23279,7 @@ int smlua_func_network_player_from_global_index(lua_State* L) {
u8 globalIndex = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_from_global_index"); return 0; }
smlua_push_object(L, LOT_NETWORKPLAYER, network_player_from_global_index(globalIndex), NULL);
smlua_push_object(L, LOT_NETWORKPLAYER, network_player_from_global_index(globalIndex), NULL, false);
return 1;
}
@ -23296,7 +23300,7 @@ int smlua_func_get_network_player_from_level(lua_State* L) {
s16 levelNum = smlua_to_integer(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "get_network_player_from_level"); return 0; }
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_from_level(courseNum, actNum, levelNum), NULL);
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_from_level(courseNum, actNum, levelNum), NULL, false);
return 1;
}
@ -23319,7 +23323,7 @@ int smlua_func_get_network_player_from_area(lua_State* L) {
s16 areaIndex = smlua_to_integer(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "get_network_player_from_area"); return 0; }
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_from_area(courseNum, actNum, levelNum, areaIndex), NULL);
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_from_area(courseNum, actNum, levelNum, areaIndex), NULL, false);
return 1;
}
@ -23334,7 +23338,7 @@ int smlua_func_get_network_player_smallest_global(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_smallest_global(), NULL);
smlua_push_object(L, LOT_NETWORKPLAYER, get_network_player_smallest_global(), NULL, false);
return 1;
}
@ -23938,7 +23942,7 @@ int smlua_func_nearest_mario_state_to_object(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "nearest_mario_state_to_object"); return 0; }
extern struct MarioState* nearest_mario_state_to_object(struct Object *obj);
smlua_push_object(L, LOT_MARIOSTATE, nearest_mario_state_to_object(obj), NULL);
smlua_push_object(L, LOT_MARIOSTATE, nearest_mario_state_to_object(obj), NULL, false);
return 1;
}
@ -23956,7 +23960,7 @@ int smlua_func_nearest_possible_mario_state_to_object(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "nearest_possible_mario_state_to_object"); return 0; }
extern struct MarioState* nearest_possible_mario_state_to_object(struct Object *obj);
smlua_push_object(L, LOT_MARIOSTATE, nearest_possible_mario_state_to_object(obj), NULL);
smlua_push_object(L, LOT_MARIOSTATE, nearest_possible_mario_state_to_object(obj), NULL, false);
return 1;
}
@ -23974,7 +23978,7 @@ int smlua_func_nearest_player_to_object(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "nearest_player_to_object"); return 0; }
extern struct Object* nearest_player_to_object(struct Object *obj);
smlua_push_object(L, LOT_OBJECT, nearest_player_to_object(obj), NULL);
smlua_push_object(L, LOT_OBJECT, nearest_player_to_object(obj), NULL, false);
return 1;
}
@ -23992,7 +23996,7 @@ int smlua_func_nearest_interacting_mario_state_to_object(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "nearest_interacting_mario_state_to_object"); return 0; }
extern struct MarioState *nearest_interacting_mario_state_to_object(struct Object *obj);
smlua_push_object(L, LOT_MARIOSTATE, nearest_interacting_mario_state_to_object(obj), NULL);
smlua_push_object(L, LOT_MARIOSTATE, nearest_interacting_mario_state_to_object(obj), NULL, false);
return 1;
}
@ -24010,7 +24014,7 @@ int smlua_func_nearest_interacting_player_to_object(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "nearest_interacting_player_to_object"); return 0; }
extern struct Object *nearest_interacting_player_to_object(struct Object *obj);
smlua_push_object(L, LOT_OBJECT, nearest_interacting_player_to_object(obj), NULL);
smlua_push_object(L, LOT_OBJECT, nearest_interacting_player_to_object(obj), NULL, false);
return 1;
}
@ -25269,7 +25273,7 @@ int smlua_func_obj_spit_fire(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 8, "obj_spit_fire"); return 0; }
extern struct Object* obj_spit_fire(s16 relativePosX, s16 relativePosY, s16 relativePosZ, f32 scale, s32 model, f32 startSpeed, f32 endSpeed, s16 movePitch);
smlua_push_object(L, LOT_OBJECT, obj_spit_fire(relativePosX, relativePosY, relativePosZ, scale, model, startSpeed, endSpeed, movePitch), NULL);
smlua_push_object(L, LOT_OBJECT, obj_spit_fire(relativePosX, relativePosY, relativePosZ, scale, model, startSpeed, endSpeed, movePitch), NULL, false);
return 1;
}
@ -25885,7 +25889,7 @@ int smlua_func_spawn_water_droplet(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "spawn_water_droplet"); return 0; }
extern struct Object *spawn_water_droplet(struct Object *parent, struct WaterDropletParams *params);
smlua_push_object(L, LOT_OBJECT, spawn_water_droplet(parent, params), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_water_droplet(parent, params), NULL, false);
return 1;
}
@ -26531,7 +26535,7 @@ int smlua_func_cur_obj_nearest_object_with_behavior(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "cur_obj_nearest_object_with_behavior"); return 0; }
extern struct Object *cur_obj_nearest_object_with_behavior(const BehaviorScript *behavior);
smlua_push_object(L, LOT_OBJECT, cur_obj_nearest_object_with_behavior(behavior), NULL);
smlua_push_object(L, LOT_OBJECT, cur_obj_nearest_object_with_behavior(behavior), NULL, false);
return 1;
}
@ -26565,7 +26569,7 @@ int smlua_func_cur_obj_find_nearest_pole(UNUSED lua_State* L) {
extern struct Object* cur_obj_find_nearest_pole(void);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearest_pole(), NULL);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearest_pole(), NULL, false);
return 1;
}
@ -26585,7 +26589,7 @@ int smlua_func_cur_obj_find_nearest_object_with_behavior(lua_State* L) {
f32 dist;
extern struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *behavior, RET f32 *dist);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearest_object_with_behavior(behavior, &dist), NULL);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearest_object_with_behavior(behavior, &dist), NULL, false);
lua_pushnumber(L, dist);
@ -26623,7 +26627,7 @@ int smlua_func_find_unimportant_object(UNUSED lua_State* L) {
extern struct Object *find_unimportant_object(void);
smlua_push_object(L, LOT_OBJECT, find_unimportant_object(), NULL);
smlua_push_object(L, LOT_OBJECT, find_unimportant_object(), NULL, false);
return 1;
}
@ -26675,7 +26679,7 @@ int smlua_func_find_object_with_behavior(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "find_object_with_behavior"); return 0; }
extern struct Object *find_object_with_behavior(const BehaviorScript *behavior);
smlua_push_object(L, LOT_OBJECT, find_object_with_behavior(behavior), NULL);
smlua_push_object(L, LOT_OBJECT, find_object_with_behavior(behavior), NULL, false);
return 1;
}
@ -26695,7 +26699,7 @@ int smlua_func_cur_obj_find_nearby_held_actor(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "cur_obj_find_nearby_held_actor"); return 0; }
extern struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f32 maxDist);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearby_held_actor(behavior, maxDist), NULL);
smlua_push_object(L, LOT_OBJECT, cur_obj_find_nearby_held_actor(behavior, maxDist), NULL, false);
return 1;
}
@ -27157,7 +27161,7 @@ int smlua_func_cur_obj_update_floor_height_and_get_floor(UNUSED lua_State* L) {
extern struct Surface *cur_obj_update_floor_height_and_get_floor(void);
smlua_push_object(L, LOT_SURFACE, cur_obj_update_floor_height_and_get_floor(), NULL);
smlua_push_object(L, LOT_SURFACE, cur_obj_update_floor_height_and_get_floor(), NULL, false);
return 1;
}
@ -28838,7 +28842,7 @@ int smlua_func_spawn_star_with_no_lvl_exit(lua_State* L) {
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "spawn_star_with_no_lvl_exit"); return 0; }
extern struct Object *spawn_star_with_no_lvl_exit(s32 sp20, s32 sp24);
smlua_push_object(L, LOT_OBJECT, spawn_star_with_no_lvl_exit(sp20, sp24), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_star_with_no_lvl_exit(sp20, sp24), NULL, false);
return 1;
}
@ -30341,7 +30345,7 @@ int smlua_func_get_mario_vanilla_animation(lua_State* L) {
u16 index = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_mario_vanilla_animation"); return 0; }
smlua_push_object(L, LOT_ANIMATION, get_mario_vanilla_animation(index), NULL);
smlua_push_object(L, LOT_ANIMATION, get_mario_vanilla_animation(index), NULL, false);
return 1;
}
@ -30436,7 +30440,7 @@ int smlua_func_audio_stream_load(lua_State* L) {
const char* filename = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "audio_stream_load"); return 0; }
smlua_push_object(L, LOT_MODAUDIO, audio_stream_load(filename), NULL);
smlua_push_object(L, LOT_MODAUDIO, audio_stream_load(filename), NULL, false);
return 1;
}
@ -30690,7 +30694,7 @@ int smlua_func_audio_sample_load(lua_State* L) {
const char* filename = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "audio_sample_load"); return 0; }
smlua_push_object(L, LOT_MODAUDIO, audio_sample_load(filename), NULL);
smlua_push_object(L, LOT_MODAUDIO, audio_sample_load(filename), NULL, false);
return 1;
}
@ -31573,6 +31577,42 @@ int smlua_func_camera_set_checking_surfaces(lua_State* L) {
// smlua_collision_utils.h //
/////////////////////////////
int smlua_func_collision_find_surface_on_ray(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top < 6 || top > 7) {
LOG_LUA_LINE("Improper param count for '%s': Expected between %u and %u, Received %u", "collision_find_surface_on_ray", 6, 7, top);
return 0;
}
f32 startX = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "collision_find_surface_on_ray"); return 0; }
f32 startY = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "collision_find_surface_on_ray"); return 0; }
f32 startZ = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "collision_find_surface_on_ray"); return 0; }
f32 dirX = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "collision_find_surface_on_ray"); return 0; }
f32 dirY = smlua_to_number(L, 5);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "collision_find_surface_on_ray"); return 0; }
f32 dirZ = smlua_to_number(L, 6);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "collision_find_surface_on_ray"); return 0; }
f32 precision = (f32) 0;
if (top >= 7) {
precision = smlua_to_number(L, 7);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 7, "collision_find_surface_on_ray"); return 0; }
}
struct RayIntersectionInfo *p = malloc(sizeof(struct RayIntersectionInfo));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "collision_find_surface_on_ray"); return 0; }
*p = collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ, precision);
smlua_push_object(L, LOT_RAYINTERSECTIONINFO, p, NULL, true);
return 1;
}
int smlua_func_collision_find_floor(lua_State* L) {
if (L == NULL) { return 0; }
@ -31589,7 +31629,7 @@ int smlua_func_collision_find_floor(lua_State* L) {
f32 z = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "collision_find_floor"); return 0; }
smlua_push_object(L, LOT_SURFACE, collision_find_floor(x, y, z), NULL);
smlua_push_object(L, LOT_SURFACE, collision_find_floor(x, y, z), NULL, false);
return 1;
}
@ -31610,7 +31650,7 @@ int smlua_func_collision_find_ceil(lua_State* L) {
f32 z = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "collision_find_ceil"); return 0; }
smlua_push_object(L, LOT_SURFACE, collision_find_ceil(x, y, z), NULL);
smlua_push_object(L, LOT_SURFACE, collision_find_ceil(x, y, z), NULL, false);
return 1;
}
@ -31625,7 +31665,7 @@ int smlua_func_get_water_surface_pseudo_floor(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_SURFACE, get_water_surface_pseudo_floor(), NULL);
smlua_push_object(L, LOT_SURFACE, get_water_surface_pseudo_floor(), NULL, false);
return 1;
}
@ -31657,7 +31697,11 @@ int smlua_func_collision_get_temp_wall_collision_data(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_WALLCOLLISIONDATA, collision_get_temp_wall_collision_data(), NULL);
struct WallCollisionData *p = malloc(sizeof(struct WallCollisionData));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "collision_get_temp_wall_collision_data"); return 0; }
*p = collision_get_temp_wall_collision_data();
smlua_push_object(L, LOT_WALLCOLLISIONDATA, p, NULL, true);
return 1;
}
@ -31676,7 +31720,7 @@ int smlua_func_get_surface_from_wcd_index(lua_State* L) {
s8 index = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "get_surface_from_wcd_index"); return 0; }
smlua_push_object(L, LOT_SURFACE, get_surface_from_wcd_index(wcd, index), NULL);
smlua_push_object(L, LOT_SURFACE, get_surface_from_wcd_index(wcd, index), NULL, false);
return 1;
}
@ -32294,7 +32338,7 @@ int smlua_func_gfx_get_display_list(lua_State* L) {
Gfx * cmd = (Gfx *)smlua_to_cobject(L, 1, LOT_GFX);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "gfx_get_display_list"); return 0; }
smlua_push_object(L, LOT_GFX, gfx_get_display_list(cmd), NULL);
smlua_push_object(L, LOT_GFX, gfx_get_display_list(cmd), NULL, false);
return 1;
}
@ -32311,7 +32355,7 @@ int smlua_func_gfx_get_vertex_buffer(lua_State* L) {
Gfx * cmd = (Gfx *)smlua_to_cobject(L, 1, LOT_GFX);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "gfx_get_vertex_buffer"); return 0; }
smlua_push_object(L, LOT_VTX, gfx_get_vertex_buffer(cmd), NULL);
smlua_push_object(L, LOT_VTX, gfx_get_vertex_buffer(cmd), NULL, false);
return 1;
}
@ -32364,7 +32408,7 @@ int smlua_func_gfx_get_from_name(lua_State* L) {
u32 length;
smlua_push_object(L, LOT_GFX, gfx_get_from_name(name, &length), NULL);
smlua_push_object(L, LOT_GFX, gfx_get_from_name(name, &length), NULL, false);
lua_pushinteger(L, length);
@ -32419,7 +32463,7 @@ int smlua_func_gfx_get_command(lua_State* L) {
u32 offset = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "gfx_get_command"); return 0; }
smlua_push_object(L, LOT_GFX, gfx_get_command(gfx, offset), NULL);
smlua_push_object(L, LOT_GFX, gfx_get_command(gfx, offset), NULL, false);
return 1;
}
@ -32436,7 +32480,7 @@ int smlua_func_gfx_get_next_command(lua_State* L) {
Gfx * gfx = (Gfx *)smlua_to_cobject(L, 1, LOT_GFX);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "gfx_get_next_command"); return 0; }
smlua_push_object(L, LOT_GFX, gfx_get_next_command(gfx), NULL);
smlua_push_object(L, LOT_GFX, gfx_get_next_command(gfx), NULL, false);
return 1;
}
@ -32476,7 +32520,7 @@ int smlua_func_gfx_create(lua_State* L) {
u32 length = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "gfx_create"); return 0; }
smlua_push_object(L, LOT_GFX, gfx_create(name, length), NULL);
smlua_push_object(L, LOT_GFX, gfx_create(name, length), NULL, false);
return 1;
}
@ -32546,7 +32590,7 @@ int smlua_func_vtx_get_from_name(lua_State* L) {
u32 count;
smlua_push_object(L, LOT_VTX, vtx_get_from_name(name, &count), NULL);
smlua_push_object(L, LOT_VTX, vtx_get_from_name(name, &count), NULL, false);
lua_pushinteger(L, count);
@ -32601,7 +32645,7 @@ int smlua_func_vtx_get_vertex(lua_State* L) {
u32 offset = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "vtx_get_vertex"); return 0; }
smlua_push_object(L, LOT_VTX, vtx_get_vertex(vtx, offset), NULL);
smlua_push_object(L, LOT_VTX, vtx_get_vertex(vtx, offset), NULL, false);
return 1;
}
@ -32618,7 +32662,7 @@ int smlua_func_vtx_get_next_vertex(lua_State* L) {
Vtx * vtx = (Vtx *)smlua_to_cobject(L, 1, LOT_VTX);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "vtx_get_next_vertex"); return 0; }
smlua_push_object(L, LOT_VTX, vtx_get_next_vertex(vtx), NULL);
smlua_push_object(L, LOT_VTX, vtx_get_next_vertex(vtx), NULL, false);
return 1;
}
@ -32658,7 +32702,7 @@ int smlua_func_vtx_create(lua_State* L) {
u32 count = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "vtx_create"); return 0; }
smlua_push_object(L, LOT_VTX, vtx_create(name, count), NULL);
smlua_push_object(L, LOT_VTX, vtx_create(name, count), NULL, false);
return 1;
}
@ -32747,7 +32791,7 @@ int smlua_func_smlua_level_util_get_info(lua_State* L) {
s16 levelNum = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "smlua_level_util_get_info"); return 0; }
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info(levelNum), NULL);
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info(levelNum), NULL, false);
return 1;
}
@ -32764,7 +32808,7 @@ int smlua_func_smlua_level_util_get_info_from_short_name(lua_State* L) {
const char* shortName = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "smlua_level_util_get_info_from_short_name"); return 0; }
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info_from_short_name(shortName), NULL);
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info_from_short_name(shortName), NULL, false);
return 1;
}
@ -32781,7 +32825,7 @@ int smlua_func_smlua_level_util_get_info_from_course_num(lua_State* L) {
u8 courseNum = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "smlua_level_util_get_info_from_course_num"); return 0; }
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info_from_course_num(courseNum), NULL);
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info_from_course_num(courseNum), NULL, false);
return 1;
}
@ -32976,40 +33020,6 @@ int smlua_func_get_area_update_counter(UNUSED lua_State* L) {
return 1;
}
int smlua_func_get_temp_s32_pointer(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 1) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_temp_s32_pointer", 1, top);
return 0;
}
s32 initialValue = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_temp_s32_pointer"); return 0; }
smlua_push_pointer(L, LVT_S32_P, (void*)get_temp_s32_pointer(initialValue), NULL);
return 1;
}
int smlua_func_deref_s32_pointer(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 1) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "deref_s32_pointer", 1, top);
return 0;
}
s32* pointer = (s32*)smlua_to_cpointer(L, 1, LVT_S32_P);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "deref_s32_pointer"); return 0; }
lua_pushinteger(L, deref_s32_pointer(pointer));
return 1;
}
int smlua_func_djui_popup_create_global(lua_State* L) {
if (L == NULL) { return 0; }
@ -33161,7 +33171,7 @@ int smlua_func_djui_menu_get_theme(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_DJUITHEME, djui_menu_get_theme(), NULL);
smlua_push_object(L, LOT_DJUITHEME, djui_menu_get_theme(), NULL, false);
return 1;
}
@ -33991,7 +34001,11 @@ int smlua_func_get_date_and_time(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_DATETIME, get_date_and_time(), NULL);
struct DateTime *p = malloc(sizeof(struct DateTime));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "get_date_and_time"); return 0; }
*p = get_date_and_time();
smlua_push_object(L, LOT_DATETIME, p, NULL, true);
return 1;
}
@ -34296,7 +34310,7 @@ int smlua_func_get_active_mod(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_MOD, get_active_mod(), NULL);
smlua_push_object(L, LOT_MOD, get_active_mod(), NULL, false);
return 1;
}
@ -34358,7 +34372,7 @@ int smlua_func_geo_get_current_root(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_GRAPHNODEROOT, geo_get_current_root(), NULL);
smlua_push_object(L, LOT_GRAPHNODEROOT, geo_get_current_root(), NULL, false);
return 1;
}
@ -34373,7 +34387,7 @@ int smlua_func_geo_get_current_master_list(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_GRAPHNODEMASTERLIST, geo_get_current_master_list(), NULL);
smlua_push_object(L, LOT_GRAPHNODEMASTERLIST, geo_get_current_master_list(), NULL, false);
return 1;
}
@ -34388,7 +34402,7 @@ int smlua_func_geo_get_current_perspective(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_GRAPHNODEPERSPECTIVE, geo_get_current_perspective(), NULL);
smlua_push_object(L, LOT_GRAPHNODEPERSPECTIVE, geo_get_current_perspective(), NULL, false);
return 1;
}
@ -34403,7 +34417,7 @@ int smlua_func_geo_get_current_camera(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_GRAPHNODECAMERA, geo_get_current_camera(), NULL);
smlua_push_object(L, LOT_GRAPHNODECAMERA, geo_get_current_camera(), NULL, false);
return 1;
}
@ -34418,7 +34432,7 @@ int smlua_func_geo_get_current_held_object(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_GRAPHNODEHELDOBJECT, geo_get_current_held_object(), NULL);
smlua_push_object(L, LOT_GRAPHNODEHELDOBJECT, geo_get_current_held_object(), NULL, false);
return 1;
}
@ -34523,7 +34537,7 @@ int smlua_func_spawn_sync_object(lua_State* L) {
LuaFunction objSetupFunction = smlua_to_lua_function(L, 6);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "spawn_sync_object"); return 0; }
smlua_push_object(L, LOT_OBJECT, spawn_sync_object(behaviorId, modelId, x, y, z, objSetupFunction), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_sync_object(behaviorId, modelId, x, y, z, objSetupFunction), NULL, false);
return 1;
}
@ -34550,7 +34564,7 @@ int smlua_func_spawn_non_sync_object(lua_State* L) {
LuaFunction objSetupFunction = smlua_to_lua_function(L, 6);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "spawn_non_sync_object"); return 0; }
smlua_push_object(L, LOT_OBJECT, spawn_non_sync_object(behaviorId, modelId, x, y, z, objSetupFunction), NULL);
smlua_push_object(L, LOT_OBJECT, spawn_non_sync_object(behaviorId, modelId, x, y, z, objSetupFunction), NULL, false);
return 1;
}
@ -34656,7 +34670,7 @@ int smlua_func_geo_get_current_object(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECT, geo_get_current_object(), NULL);
smlua_push_object(L, LOT_OBJECT, geo_get_current_object(), NULL, false);
return 1;
}
@ -34671,7 +34685,7 @@ int smlua_func_get_current_object(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECT, get_current_object(), NULL);
smlua_push_object(L, LOT_OBJECT, get_current_object(), NULL, false);
return 1;
}
@ -34686,7 +34700,7 @@ int smlua_func_get_dialog_object(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECT, get_dialog_object(), NULL);
smlua_push_object(L, LOT_OBJECT, get_dialog_object(), NULL, false);
return 1;
}
@ -34701,7 +34715,7 @@ int smlua_func_get_cutscene_focus(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECT, get_cutscene_focus(), NULL);
smlua_push_object(L, LOT_OBJECT, get_cutscene_focus(), NULL, false);
return 1;
}
@ -34716,7 +34730,7 @@ int smlua_func_get_secondary_camera_focus(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECT, get_secondary_camera_focus(), NULL);
smlua_push_object(L, LOT_OBJECT, get_secondary_camera_focus(), NULL, false);
return 1;
}
@ -34767,7 +34781,7 @@ int smlua_func_obj_get_first(lua_State* L) {
int objList = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "obj_get_first"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_first(objList), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_first(objList), NULL, false);
return 1;
}
@ -34784,7 +34798,7 @@ int smlua_func_obj_get_first_with_behavior_id(lua_State* L) {
int behaviorId = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "obj_get_first_with_behavior_id"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id(behaviorId), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id(behaviorId), NULL, false);
return 1;
}
@ -34805,7 +34819,7 @@ int smlua_func_obj_get_first_with_behavior_id_and_field_s32(lua_State* L) {
s32 value = smlua_to_integer(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "obj_get_first_with_behavior_id_and_field_s32"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id_and_field_s32(behaviorId, fieldIndex, value), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id_and_field_s32(behaviorId, fieldIndex, value), NULL, false);
return 1;
}
@ -34826,7 +34840,7 @@ int smlua_func_obj_get_first_with_behavior_id_and_field_f32(lua_State* L) {
f32 value = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "obj_get_first_with_behavior_id_and_field_f32"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id_and_field_f32(behaviorId, fieldIndex, value), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_first_with_behavior_id_and_field_f32(behaviorId, fieldIndex, value), NULL, false);
return 1;
}
@ -34843,7 +34857,7 @@ int smlua_func_obj_get_next(lua_State* L) {
struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "obj_get_next"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_next(o), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_next(o), NULL, false);
return 1;
}
@ -34860,7 +34874,7 @@ int smlua_func_obj_get_next_with_same_behavior_id(lua_State* L) {
struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "obj_get_next_with_same_behavior_id"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id(o), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id(o), NULL, false);
return 1;
}
@ -34881,7 +34895,7 @@ int smlua_func_obj_get_next_with_same_behavior_id_and_field_s32(lua_State* L) {
s32 value = smlua_to_integer(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "obj_get_next_with_same_behavior_id_and_field_s32"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id_and_field_s32(o, fieldIndex, value), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id_and_field_s32(o, fieldIndex, value), NULL, false);
return 1;
}
@ -34902,7 +34916,7 @@ int smlua_func_obj_get_next_with_same_behavior_id_and_field_f32(lua_State* L) {
f32 value = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "obj_get_next_with_same_behavior_id_and_field_f32"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id_and_field_f32(o, fieldIndex, value), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_next_with_same_behavior_id_and_field_f32(o, fieldIndex, value), NULL, false);
return 1;
}
@ -34921,7 +34935,7 @@ int smlua_func_obj_get_nearest_object_with_behavior_id(lua_State* L) {
int behaviorId = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "obj_get_nearest_object_with_behavior_id"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_nearest_object_with_behavior_id(o, behaviorId), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_nearest_object_with_behavior_id(o, behaviorId), NULL, false);
return 1;
}
@ -34957,7 +34971,7 @@ int smlua_func_obj_get_collided_object(lua_State* L) {
s16 index = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "obj_get_collided_object"); return 0; }
smlua_push_object(L, LOT_OBJECT, obj_get_collided_object(o, index), NULL);
smlua_push_object(L, LOT_OBJECT, obj_get_collided_object(o, index), NULL, false);
return 1;
}
@ -35138,7 +35152,11 @@ int smlua_func_obj_get_temp_spawn_particles_info(lua_State* L) {
int modelId = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "obj_get_temp_spawn_particles_info"); return 0; }
smlua_push_object(L, LOT_SPAWNPARTICLESINFO, obj_get_temp_spawn_particles_info(modelId), NULL);
struct SpawnParticlesInfo *p = malloc(sizeof(struct SpawnParticlesInfo));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "obj_get_temp_spawn_particles_info"); return 0; }
*p = obj_get_temp_spawn_particles_info(modelId);
smlua_push_object(L, LOT_SPAWNPARTICLESINFO, p, NULL, true);
return 1;
}
@ -35157,7 +35175,11 @@ int smlua_func_obj_get_temp_water_droplet_params(lua_State* L) {
int behaviorId = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "obj_get_temp_water_droplet_params"); return 0; }
smlua_push_object(L, LOT_WATERDROPLETPARAMS, obj_get_temp_water_droplet_params(modelId, behaviorId), NULL);
struct WaterDropletParams *p = malloc(sizeof(struct WaterDropletParams));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "obj_get_temp_water_droplet_params"); return 0; }
*p = obj_get_temp_water_droplet_params(modelId, behaviorId);
smlua_push_object(L, LOT_WATERDROPLETPARAMS, p, NULL, true);
return 1;
}
@ -35172,7 +35194,11 @@ int smlua_func_get_temp_object_hitbox(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_OBJECTHITBOX, get_temp_object_hitbox(), NULL);
struct ObjectHitbox *p = malloc(sizeof(struct ObjectHitbox));
if (!p) { LOG_LUA("Cannot allocate pointer for the return value of function '%s'", "get_temp_object_hitbox"); return 0; }
*p = get_temp_object_hitbox();
smlua_push_object(L, LOT_OBJECTHITBOX, p, NULL, true);
return 1;
}
@ -35516,7 +35542,7 @@ int smlua_func_smlua_text_utils_dialog_get(lua_State* L) {
int dialogId = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "smlua_text_utils_dialog_get"); return 0; }
smlua_push_object(L, LOT_DIALOGENTRY, smlua_text_utils_dialog_get(dialogId), NULL);
smlua_push_object(L, LOT_DIALOGENTRY, smlua_text_utils_dialog_get(dialogId), NULL, false);
return 1;
}
@ -36351,7 +36377,7 @@ int smlua_func_find_ceil(lua_State* L) {
lua_pushnumber(L, find_ceil(posX, posY, posZ, &pceil));
smlua_push_object(L, LOT_SURFACE, pceil, NULL);
smlua_push_object(L, LOT_SURFACE, pceil, NULL, false);
return 2;
}
@ -36443,7 +36469,7 @@ int smlua_func_find_floor(lua_State* L) {
lua_pushnumber(L, find_floor(xPos, yPos, zPos, &pfloor));
smlua_push_object(L, LOT_SURFACE, pfloor, NULL);
smlua_push_object(L, LOT_SURFACE, pfloor, NULL, false);
return 2;
}
@ -36598,7 +36624,7 @@ int smlua_func_load_static_object_collision(UNUSED lua_State* L) {
}
smlua_push_object(L, LOT_STATICOBJECTCOLLISION, load_static_object_collision(), NULL);
smlua_push_object(L, LOT_STATICOBJECTCOLLISION, load_static_object_collision(), NULL, false);
return 1;
}
@ -36636,7 +36662,7 @@ int smlua_func_get_static_object_surface(lua_State* L) {
u32 index = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "get_static_object_surface"); return 0; }
smlua_push_object(L, LOT_SURFACE, get_static_object_surface(col, index), NULL);
smlua_push_object(L, LOT_SURFACE, get_static_object_surface(col, index), NULL, false);
return 1;
}
@ -36655,7 +36681,7 @@ int smlua_func_obj_get_surface_from_index(lua_State* L) {
u32 index = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "obj_get_surface_from_index"); return 0; }
smlua_push_object(L, LOT_SURFACE, obj_get_surface_from_index(o, index), NULL);
smlua_push_object(L, LOT_SURFACE, obj_get_surface_from_index(o, index), NULL, false);
return 1;
}
@ -36693,7 +36719,7 @@ int smlua_func_sync_object_get_object(lua_State* L) {
u32 syncId = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "sync_object_get_object"); return 0; }
smlua_push_object(L, LOT_OBJECT, sync_object_get_object(syncId), NULL);
smlua_push_object(L, LOT_OBJECT, sync_object_get_object(syncId), NULL, false);
return 1;
}
@ -38521,6 +38547,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_set_checking_surfaces", smlua_func_camera_set_checking_surfaces);
// smlua_collision_utils.h
smlua_bind_function(L, "collision_find_surface_on_ray", smlua_func_collision_find_surface_on_ray);
smlua_bind_function(L, "collision_find_floor", smlua_func_collision_find_floor);
smlua_bind_function(L, "collision_find_ceil", smlua_func_collision_find_ceil);
smlua_bind_function(L, "get_water_surface_pseudo_floor", smlua_func_get_water_surface_pseudo_floor);
@ -38606,8 +38633,6 @@ void smlua_bind_functions_autogen(void) {
// smlua_misc_utils.h
smlua_bind_function(L, "get_network_area_timer", smlua_func_get_network_area_timer);
smlua_bind_function(L, "get_area_update_counter", smlua_func_get_area_update_counter);
smlua_bind_function(L, "get_temp_s32_pointer", smlua_func_get_temp_s32_pointer);
smlua_bind_function(L, "deref_s32_pointer", smlua_func_deref_s32_pointer);
smlua_bind_function(L, "djui_popup_create_global", smlua_func_djui_popup_create_global);
smlua_bind_function(L, "djui_is_popup_disabled", smlua_func_djui_is_popup_disabled);
smlua_bind_function(L, "djui_set_popup_disabled_override", smlua_func_djui_set_popup_disabled_override);

View file

@ -319,7 +319,7 @@ bool smlua_call_event_hooks_HOOK_ALLOW_INTERACT(struct MarioState *m, struct Obj
lua_remove(L, -2);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// push interactType
lua_pushinteger(L, interactType);
@ -360,7 +360,7 @@ bool smlua_call_event_hooks_HOOK_ON_INTERACT(struct MarioState *m, struct Object
lua_remove(L, -2);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// push interactType
lua_pushinteger(L, interactType);
@ -495,7 +495,7 @@ bool smlua_call_event_hooks_HOOK_ON_OBJECT_UNLOAD(struct Object *obj) {
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
@ -522,7 +522,7 @@ bool smlua_call_event_hooks_HOOK_ON_SYNC_OBJECT_UNLOAD(struct Object *obj) {
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
@ -609,7 +609,7 @@ bool smlua_call_event_hooks_HOOK_ON_SET_CAMERA_MODE(struct Camera *c, s16 mode,
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push c
smlua_push_object(L, LOT_CAMERA, c, NULL);
smlua_push_object(L, LOT_CAMERA, c, NULL, false);
// push mode
lua_pushinteger(L, mode);
@ -647,7 +647,7 @@ bool smlua_call_event_hooks_HOOK_ON_OBJECT_RENDER(struct Object *obj) {
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
@ -909,7 +909,7 @@ bool smlua_call_event_hooks_HOOK_OBJECT_SET_MODEL(struct Object *obj, s32 modelI
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// push modelID
lua_pushinteger(L, modelID);
@ -1045,7 +1045,7 @@ bool smlua_call_event_hooks_HOOK_ON_OBJECT_ANIM_UPDATE(struct Object *obj) {
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
@ -1195,7 +1195,7 @@ bool smlua_call_event_hooks_HOOK_MIRROR_MARIO_RENDER(struct GraphNodeObject *mir
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push mirrorMario
smlua_push_object(L, LOT_GRAPHNODEOBJECT, mirrorMario, NULL);
smlua_push_object(L, LOT_GRAPHNODEOBJECT, mirrorMario, NULL, false);
// push playerIndex
lua_pushinteger(L, playerIndex);
@ -1259,7 +1259,7 @@ bool smlua_call_event_hooks_HOOK_ON_OBJECT_LOAD(struct Object *obj) {
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
@ -1366,7 +1366,7 @@ bool smlua_call_event_hooks_HOOK_ON_ATTACK_OBJECT(struct MarioState *m, struct O
lua_remove(L, -2);
// push obj
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
// push interaction
lua_pushinteger(L, interaction);
@ -1471,7 +1471,7 @@ bool smlua_call_event_hooks_HOOK_ON_GEO_PROCESS(struct GraphNode *node, s32 matS
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push node
smlua_push_object(L, LOT_GRAPHNODE, node, NULL);
smlua_push_object(L, LOT_GRAPHNODE, node, NULL, false);
// push matStackIndex
lua_pushinteger(L, matStackIndex);
@ -1501,7 +1501,7 @@ bool smlua_call_event_hooks_HOOK_BEFORE_GEO_PROCESS(struct GraphNode *node, s32
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push node
smlua_push_object(L, LOT_GRAPHNODE, node, NULL);
smlua_push_object(L, LOT_GRAPHNODE, node, NULL, false);
// push matStackIndex
lua_pushinteger(L, matStackIndex);
@ -1531,7 +1531,7 @@ bool smlua_call_event_hooks_HOOK_ON_GEO_PROCESS_CHILDREN(struct GraphNode *paren
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push parent
smlua_push_object(L, LOT_GRAPHNODE, parent, NULL);
smlua_push_object(L, LOT_GRAPHNODE, parent, NULL, false);
// push matStackIndex
lua_pushinteger(L, matStackIndex);
@ -1795,7 +1795,7 @@ bool smlua_call_event_hooks_HOOK_ON_ADD_SURFACE(struct Surface *surface, bool dy
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push surface
smlua_push_object(L, LOT_SURFACE, surface, NULL);
smlua_push_object(L, LOT_SURFACE, surface, NULL, false);
// push dynamic
lua_pushboolean(L, dynamic);

View file

@ -689,7 +689,7 @@ bool smlua_call_behavior_hook(const BehaviorScript** behavior, struct Object* ob
lua_rawgeti(L, LUA_REGISTRYINDEX, reference);
// push object
smlua_push_object(L, LOT_OBJECT, object, NULL);
smlua_push_object(L, LOT_OBJECT, object, NULL, false);
// call the callback
if (0 != smlua_call_hook(L, 1, 0, 0, hooked->mod, hooked->modFile)) {

View file

@ -408,7 +408,7 @@ inline static uintptr_t smlua_get_pointer_key(void *ptr, u16 lt) {
return (lt * 0x9E3779B97F4A7C15) ^ ((uintptr_t) ptr >> 3);
}
CObject *smlua_push_object(lua_State* L, u16 lot, void* p, void *extraInfo) {
CObject *smlua_push_object(lua_State* L, u16 lot, void* p, void *extraInfo, bool dynamic) {
if (p == NULL) {
lua_pushnil(L);
return NULL;
@ -433,11 +433,17 @@ CObject *smlua_push_object(lua_State* L, u16 lot, void* p, void *extraInfo) {
cobject->lot = lot;
cobject->freed = false;
cobject->info = extraInfo;
cobject->dynamic = dynamic;
lua_rawgeti(L, LUA_REGISTRYINDEX, gSmLuaCObjectMetatable);
lua_setmetatable(L, -2);
lua_pushinteger(L, key);
lua_pushvalue(L, -2); // Duplicate userdata
lua_settable(L, -4);
// Don't push the cobject to the gSmLuaCObjects table if it's dynamic allocation
// Its data pointer is never the same and it will prevent the GC to collect it
if (!dynamic) {
lua_pushinteger(L, key);
lua_pushvalue(L, -2); // Duplicate userdata
lua_settable(L, -4);
}
lua_remove(L, -2); // Remove gSmLuaCObjects table
LUA_STACK_CHECK_END(L);

View file

@ -38,7 +38,7 @@ struct TextureInfo *smlua_to_texture_info(lua_State *L, int index);
bool packet_write_lnt(struct Packet* p, struct LSTNetworkType* lnt);
bool packet_read_lnt(struct Packet* p, struct LSTNetworkType* lnt);
CObject *smlua_push_object(lua_State* L, u16 lot, void* p, void *extraInfo);
CObject *smlua_push_object(lua_State* L, u16 lot, void* p, void *extraInfo, bool dynamic);
CPointer *smlua_push_pointer(lua_State* L, u16 lvt, void* p, void *extraInfo);
void smlua_push_integer_field(int index, const char* name, lua_Integer val);
void smlua_push_number_field(int index, const char* name, lua_Number val);

View file

@ -159,12 +159,13 @@ struct GlobalObjectCollisionData gGlobalObjectCollisionData = {
.wooden_signpost_seg3_collision_0302DD80 = (Collision*) wooden_signpost_seg3_collision_0302DD80,
};
struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision) {
static struct RayIntersectionInfo info = { 0 };
struct RayIntersectionInfo collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, OPTIONAL f32 precision) {
if (precision <= 0.f) { precision = 3.f; }
struct RayIntersectionInfo info = { 0 };
Vec3f orig = { startX, startY, startZ };
Vec3f dir = { dirX, dirY, dirZ };
find_surface_on_ray(orig, dir, &info.surface, info.hitPos, precision);
return &info;
return info;
}
struct Surface* collision_find_floor(f32 x, f32 y, f32 z) {
@ -187,10 +188,9 @@ Collision* smlua_collision_util_get(const char* name) {
return dynos_collision_get(name);
}
struct WallCollisionData* collision_get_temp_wall_collision_data(void) {
static struct WallCollisionData sTmpWcd = { 0 };
memset(&sTmpWcd, 0, sizeof(struct WallCollisionData));
return &sTmpWcd;
struct WallCollisionData collision_get_temp_wall_collision_data(void) {
struct WallCollisionData wcd = { 0 };
return wcd;
}
struct Surface* get_surface_from_wcd_index(struct WallCollisionData* wcd, s8 index) {

View file

@ -114,7 +114,9 @@ struct GlobalObjectCollisionData {
extern struct GlobalObjectCollisionData gGlobalObjectCollisionData;
struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision);
/* |description|Shoots a raycast from `startX`, `startY`, and `startZ` in the direction of `dirX`, `dirY`, and `dirZ`, with a non-zero `precision`|descriptionEnd| */
struct RayIntersectionInfo collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, OPTIONAL f32 precision);
/* |description|Finds a potential floor at the given `x`, `y`, and `z` values|descriptionEnd| */
struct Surface* collision_find_floor(f32 x, f32 y, f32 z);
@ -128,7 +130,7 @@ struct Surface* get_water_surface_pseudo_floor(void);
Collision* smlua_collision_util_get(const char* name);
/* |description|Returns a temporary wall collision data pointer|descriptionEnd| */
struct WallCollisionData* collision_get_temp_wall_collision_data(void);
struct WallCollisionData collision_get_temp_wall_collision_data(void);
/* |description|Gets the surface corresponding to `index` from `wcd`|descriptionEnd| */
struct Surface* get_surface_from_wcd_index(struct WallCollisionData* wcd, s8 index);

View file

@ -192,7 +192,7 @@ void gfx_parse(Gfx* cmd, LuaFunction func) {
default:
lua_rawgeti(L, LUA_REGISTRYINDEX, func);
smlua_push_object(L, LOT_GFX, cmd, NULL);
smlua_push_object(L, LOT_GFX, cmd, NULL, false);
lua_pushinteger(L, op);
if (smlua_pcall(L, 2, 1, 0) != 0) {
LOG_LUA("Failed to call the gfx_parse callback: %u", func);

View file

@ -40,8 +40,6 @@
#include "pc/network/coopnet/coopnet.h"
#endif
static struct DateTime sDateTime;
///
u32 get_network_area_timer(void) {
@ -54,22 +52,6 @@ u16 get_area_update_counter(void) {
///
s32* get_temp_s32_pointer(s32 initialValue) {
static s32 value = 0;
value = initialValue;
return &value;
}
s32 deref_s32_pointer(s32* pointer) {
if (pointer == NULL) {
LOG_LUA_LINE("Tried to dereference null pointer!");
return 0;
}
return *pointer;
}
///
void djui_popup_create_global(const char* message, int lines) {
djui_popup_create(message, lines);
network_send_global_popup(message, lines);
@ -452,18 +434,19 @@ s64 get_time(void) {
return time(NULL);
}
struct DateTime* get_date_and_time(void) {
struct DateTime get_date_and_time(void) {
time_t currentTime;
time(&currentTime);
struct tm *lt = localtime(&currentTime);
sDateTime.year = lt->tm_year;
sDateTime.month = lt->tm_mon;
sDateTime.day = lt->tm_mday;
sDateTime.hour = lt->tm_hour;
sDateTime.minute = lt->tm_min;
sDateTime.second = lt->tm_sec;
return &sDateTime;
struct DateTime dt = {0};
dt.year = lt->tm_year;
dt.month = lt->tm_mon;
dt.day = lt->tm_mday;
dt.hour = lt->tm_hour;
dt.minute = lt->tm_min;
dt.second = lt->tm_sec;
return dt;
}
///

View file

@ -57,11 +57,6 @@ u32 get_network_area_timer(void);
/* |description|Gets the area update counter incremented when objects are updated|descriptionEnd| */
u16 get_area_update_counter(void);
/* |description|Returns a temporary signed 32-bit integer pointer with its value set to `initialValue`|descriptionEnd| */
s32* get_temp_s32_pointer(s32 initialValue);
/* |description|Gets the signed 32-bit integer value from `pointer`|descriptionEnd| */
s32 deref_s32_pointer(s32* pointer);
/* |description|Creates a DJUI popup that is broadcasted to every client|descriptionEnd| */
void djui_popup_create_global(const char* message, int lines);
/* |description|Returns if popups are disabled|descriptionEnd| */
@ -199,7 +194,7 @@ void set_ttc_speed_setting(s16 speed);
/* |description|Gets the Unix Timestamp|descriptionEnd| */
s64 get_time(void);
/* |description|Gets the system clock's date and time|descriptionEnd| */
struct DateTime* get_date_and_time(void);
struct DateTime get_date_and_time(void);
/* |description|Gets the non overridden environment effect (e.g. snow)|descriptionEnd| */
u16 get_envfx(void);

View file

@ -56,7 +56,7 @@ static struct Object* spawn_object_internal(enum BehaviorId behaviorId, enum Mod
if (objSetupFunction != 0) {
lua_State* L = gLuaState;
lua_rawgeti(L, LUA_REGISTRYINDEX, objSetupFunction);
smlua_push_object(L, LOT_OBJECT, obj, NULL);
smlua_push_object(L, LOT_OBJECT, obj, NULL, false);
if (0 != smlua_pcall(L, 1, 0, 0)) {
LOG_LUA("Failed to call the object setup callback: %u", objSetupFunction);
}
@ -357,34 +357,31 @@ void obj_set_field_s16(struct Object *o, s32 fieldIndex, s32 fieldSubIndex, s16
// Misc object helpers
//
struct SpawnParticlesInfo* obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId) {
static struct SpawnParticlesInfo sTmpSpi = { 0 };
memset(&sTmpSpi, 0, sizeof(struct SpawnParticlesInfo));
struct SpawnParticlesInfo obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId) {
struct SpawnParticlesInfo spi = { 0 };
u16 loadedModelId = smlua_model_util_load(modelId);
sTmpSpi.model = loadedModelId;
spi.model = loadedModelId;
return &sTmpSpi;
return spi;
}
struct WaterDropletParams* obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId) {
static struct WaterDropletParams sTmpWdp = { 0 };
memset(&sTmpWdp, 0, sizeof(struct WaterDropletParams));
struct WaterDropletParams obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId) {
struct WaterDropletParams wdp = { 0 };
s16 loadedModelId = smlua_model_util_load(modelId);
sTmpWdp.model = loadedModelId;
wdp.model = loadedModelId;
const BehaviorScript *behavior = get_behavior_from_id(behaviorId);
behavior = smlua_override_behavior(behavior);
sTmpWdp.behavior = behavior;
wdp.behavior = behavior;
return &sTmpWdp;
return wdp;
}
struct ObjectHitbox* get_temp_object_hitbox(void) {
static struct ObjectHitbox sTmpHitbox = { 0 };
memset(&sTmpHitbox, 0, sizeof(struct ObjectHitbox));
return &sTmpHitbox;
struct ObjectHitbox get_temp_object_hitbox(void) {
struct ObjectHitbox hitbox = { 0 };
return hitbox;
}
bool obj_is_attackable(struct Object *o) {

View file

@ -117,11 +117,11 @@ void obj_set_field_s16(struct Object *o, s32 fieldIndex, s32 fieldSubIndex, s16
//
/* |description|Returns a temporary particle spawn info pointer with its model loaded in from `modelId`|descriptionEnd| */
struct SpawnParticlesInfo* obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId);
struct SpawnParticlesInfo obj_get_temp_spawn_particles_info(enum ModelExtendedId modelId);
/* |description|Returns a temporary water droplet params pointer with its model and behavior loaded in from `modelId` and `behaviorId`|descriptionEnd| */
struct WaterDropletParams* obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId);
struct WaterDropletParams obj_get_temp_water_droplet_params(enum ModelExtendedId modelId, enum BehaviorId behaviorId);
/* |description|Returns a temporary object hitbox pointer|descriptionEnd| */
struct ObjectHitbox* get_temp_object_hitbox(void);
struct ObjectHitbox get_temp_object_hitbox(void);
/* |description|Checks if `o` is attackable|descriptionEnd| */
bool obj_is_attackable(struct Object *o);