From 480466bb44c5b7587ab7a2047637b5ae7065e207 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Tue, 31 Mar 2020 17:21:30 +1100 Subject: [PATCH] Fixed crash where existing source buffer would be unloaded by an entity when setting a new source buffer causing a crash if the source buffer was still in use by another entity --- src/common/version.h | 2 +- src/game/event.c | 6 ++++-- src/game/event.h | 3 ++- src/game/sound_source.c | 3 --- src/game/trigger.c | 1 + todo.txt | 1 - 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index 5c3f8a8..d3fdcdb 100755 --- a/src/common/version.h +++ b/src/common/version.h @@ -4,7 +4,7 @@ /* Auto generated version file. DO NOT MODIFY */ #define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MINOR 1 -#define SYMMETRY_VERSION_REVISION 350 +#define SYMMETRY_VERSION_REVISION 351 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/event.c b/src/game/event.c index f90f7bc..2762e41 100644 --- a/src/game/event.c +++ b/src/game/event.c @@ -24,6 +24,7 @@ void event_manager_init(struct Event_Manager* event_manager) struct Event* event = &event_manager->event_pool[i]; memset(event, '\0', sizeof(struct Event)); event->type = EVT_NONE; + event->sender = NULL; } event_manager->sdl_event_id = SDL_RegisterEvents(1); @@ -246,7 +247,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager) subscription->Subscription_Without_Objects.handler(user_event); break; case EST_SENDER: - if(subscription->Subscription_Sender.handler) + if(subscription->Subscription_Sender.handler && user_event->sender == subscription->Subscription_Sender.sender) subscription->Subscription_Sender.handler(user_event, subscription->Subscription_Sender.sender); break; case EST_SUBSCRIBER: @@ -254,7 +255,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager) subscription->Subscription_Subscriber.handler(user_event, subscription->Subscription_Subscriber.subscriber); break; case EST_SUBSCRIBER_SENDER: - if(subscription->Subscription_Subscriber_Sender.handler) + if(subscription->Subscription_Subscriber_Sender.handler && user_event->sender == subscription->Subscription_Sender.sender) subscription->Subscription_Subscriber_Sender.handler(user_event, subscription->Subscription_Subscriber_Sender.subscriber, subscription->Subscription_Subscriber_Sender.sender); break; } @@ -264,6 +265,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager) //return event to the pool now that it is consumed memset(user_event, '\0', sizeof(*user_event)); user_event->type = EVT_NONE; + user_event->sender = NULL; } } break; diff --git a/src/game/event.h b/src/game/event.h index af1cde3..5a5861a 100755 --- a/src/game/event.h +++ b/src/game/event.h @@ -103,7 +103,8 @@ struct Trigger_Event struct Event { - int type; + int type; + void* sender; union { struct Key_Event key; diff --git a/src/game/sound_source.c b/src/game/sound_source.c index 42e66c5..3132eae 100644 --- a/src/game/sound_source.c +++ b/src/game/sound_source.c @@ -65,9 +65,6 @@ void sound_source_buffer_set(struct Sound* sound, struct Sound_Source* entity, c if(new_buffer) { sound_source_instance_destroy(sound, entity->source_instance); - if(entity->source_buffer) - sound_source_buffer_destroy(sound, entity->source_buffer); - entity->source_buffer = new_buffer; entity->type = type; entity->source_instance = sound_source_instance_create(sound, entity->source_buffer, true); diff --git a/src/game/trigger.c b/src/game/trigger.c index b945958..5d4122f 100644 --- a/src/game/trigger.c +++ b/src/game/trigger.c @@ -95,6 +95,7 @@ void trigger_update_physics(struct Trigger* trigger, struct Scene* scene, float struct Event* trigger_event = event_manager_create_new_event(event_manager); trigger_event->type = EVT_TRIGGER; trigger_event->trigger.sender = trigger; + trigger_event->sender = trigger; event_manager_send_event(event_manager, trigger_event); if(trigger->type == TRIG_ONE_SHOT) scene_trigger_remove(scene, trigger); diff --git a/todo.txt b/todo.txt index 5e1e3ef..bf97782 100644 --- a/todo.txt +++ b/todo.txt @@ -2,7 +2,6 @@ Todo: - Win/fail States - Save scene init/cleanup funcs if there are any assigned when saving scene - Save case sensitive file names when scene entity entries - - Investigate whether toggle trigger is working properly - Player/enemies getting hit by bullets - Remove excessive repitition in scene and editor code that handles multiple entity types - Allow switching to editor mode when game is in pause mode