avoid pushing objects that are despawned

This commit is contained in:
Isaac0-dev 2025-03-04 09:16:43 +10:00
parent d6ce716809
commit 46a12cef9b

View file

@ -114,20 +114,45 @@ struct Object *obj_get_first(enum ObjectList objList) {
if (gObjectLists && objList >= 0 && objList < NUM_OBJ_LISTS) {
struct Object *head = (struct Object *) &gObjectLists[objList];
struct Object *obj = (struct Object *) head->header.next;
if (obj != head) {
return obj;
while (obj != head) {
if (obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) {
return obj;
}
obj = (struct Object *) obj->header.next;
}
}
return NULL;
}
static struct Object *obj_get_next_internal(struct Object *o, enum ObjectList objList) {
if (gObjectLists && o) {
struct Object *head = (struct Object *) &gObjectLists[objList];
struct Object *next = (struct Object *) o->header.next;
while (next != head) {
if (next->activeFlags != ACTIVE_FLAG_DEACTIVATED) {
return next;
}
next = (struct Object *) o->header.next;
}
}
return NULL;
}
struct Object *obj_get_next(struct Object *o) {
if (gObjectLists && o) {
enum ObjectList objList = get_object_list_from_behavior(o->behavior);
return obj_get_next_internal(o, objList);
}
return NULL;
}
struct Object *obj_get_first_with_behavior_id(enum BehaviorId behaviorId) {
const BehaviorScript* behavior = get_behavior_from_id(behaviorId);
u32 sanityDepth = 0;
behavior = smlua_override_behavior(behavior);
if (behavior) {
enum ObjectList objList = get_object_list_from_behavior(behavior);
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) {
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (++sanityDepth > 10000) { break; }
if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) {
return obj;
@ -144,7 +169,7 @@ struct Object *obj_get_first_with_behavior_id_and_field_s32(enum BehaviorId beha
behavior = smlua_override_behavior(behavior);
if (behavior) {
enum ObjectList objList = get_object_list_from_behavior(behavior);
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) {
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (++sanityDepth > 10000) { break; }
if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_S32(fieldIndex) == value) {
return obj;
@ -160,7 +185,7 @@ struct Object *obj_get_first_with_behavior_id_and_field_f32(enum BehaviorId beha
behavior = smlua_override_behavior(behavior);
if (behavior) {
enum ObjectList objList = get_object_list_from_behavior(behavior);
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) {
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_F32(fieldIndex) == value) {
return obj;
}
@ -177,7 +202,7 @@ struct Object *obj_get_nearest_object_with_behavior_id(struct Object *o, enum Be
if (behavior) {
enum ObjectList objList = get_object_list_from_behavior(behavior);
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) {
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) {
f32 objDist = dist_between_objects(o, obj);
if (objDist < minDist) {
@ -197,29 +222,18 @@ s32 obj_count_objects_with_behavior_id(enum BehaviorId behaviorId) {
if (behavior) {
enum ObjectList objList = get_object_list_from_behavior(behavior);
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) {
if (obj->behavior == behavior) { count++; }
for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { count++; }
}
}
return count;
}
struct Object *obj_get_next(struct Object *o) {
if (gObjectLists && o) {
enum ObjectList objList = get_object_list_from_behavior(o->behavior);
struct Object *head = (struct Object *) &gObjectLists[objList];
struct Object *next = (struct Object *) o->header.next;
if (next != head) {
return next;
}
}
return NULL;
}
struct Object *obj_get_next_with_same_behavior_id(struct Object *o) {
if (o) {
for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) {
enum ObjectList objList = get_object_list_from_behavior(o->behavior);
for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) {
return obj;
}
@ -231,7 +245,8 @@ struct Object *obj_get_next_with_same_behavior_id(struct Object *o) {
struct Object *obj_get_next_with_same_behavior_id_and_field_s32(struct Object *o, s32 fieldIndex, s32 value) {
if (fieldIndex < 0 || fieldIndex >= OBJECT_NUM_FIELDS) { return NULL; }
if (o) {
for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) {
enum ObjectList objList = get_object_list_from_behavior(o->behavior);
for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_S32(fieldIndex) == value) {
return obj;
}
@ -243,7 +258,8 @@ struct Object *obj_get_next_with_same_behavior_id_and_field_s32(struct Object *o
struct Object *obj_get_next_with_same_behavior_id_and_field_f32(struct Object *o, s32 fieldIndex, f32 value) {
if (fieldIndex < 0 || fieldIndex >= OBJECT_NUM_FIELDS) { return NULL; }
if (o) {
for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) {
enum ObjectList objList = get_object_list_from_behavior(o->behavior);
for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) {
if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_F32(fieldIndex) == value) {
return obj;
}