mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-04-26 12:01:43 +00:00
avoid pushing objects that are despawned
This commit is contained in:
parent
d6ce716809
commit
46a12cef9b
1 changed files with 39 additions and 23 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue