mirror of
				https://github.com/N64Recomp/N64ModernRuntime.git
				synced 2025-10-30 08:02:29 +00:00 
			
		
		
		
	Fix handling of mod callbacks for events in optional dependencies (#121)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				validate / windows (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Release) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	validate / windows (x64, Debug) (push) Has been cancelled
				
			validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			validate / ubuntu (x64, Release) (push) Has been cancelled
				
			validate / windows (x64, Release) (push) Has been cancelled
				
			validate / macos (arm64, Debug) (push) Has been cancelled
				
			validate / macos (arm64, Release) (push) Has been cancelled
				
			validate / macos (x64, Debug) (push) Has been cancelled
				
			validate / macos (x64, Release) (push) Has been cancelled
				
			This commit is contained in:
		
							parent
							
								
									df547d2c06
								
							
						
					
					
						commit
						83891b4231
					
				
					 1 changed files with 27 additions and 9 deletions
				
			
		|  | @ -2447,6 +2447,7 @@ recomp::mods::CodeModLoadError recomp::mods::ModContext::resolve_code_dependenci | |||
|         GenericFunction func = mod.code_handle->get_function_handle(callback.function_index); | ||||
|         size_t event_index = 0; | ||||
|         bool did_find_event = false; | ||||
|         bool optional = false; | ||||
| 
 | ||||
|         if (dependency_id == N64Recomp::DependencyBaseRecomp) { | ||||
|             event_index = recomp::overlays::get_base_event_index(dependency_event.event_name); | ||||
|  | @ -2458,23 +2459,40 @@ recomp::mods::CodeModLoadError recomp::mods::ModContext::resolve_code_dependenci | |||
|             did_find_event = mod.get_global_event_index(dependency_event.event_name, event_index); | ||||
|         } | ||||
|         else { | ||||
|             // Check if the dependency is optional.
 | ||||
|             auto find_mod_it = loaded_mods_by_id.find(dependency_id); | ||||
|             if (find_mod_it == loaded_mods_by_id.end()) { | ||||
|                 error_param = "Failed to find callback dependency while loading code: " + dependency_id; | ||||
|                 // This should never happen, as dependencies are scanned before mod code is loaded and the symbol dependency list
 | ||||
|                 // is validated against the manifest's. 
 | ||||
|                 return CodeModLoadError::InternalError; | ||||
|                 // Get the manifest's version of the dependency.
 | ||||
|                 auto find_manifest_dep = mod.manifest.dependencies_by_id.find(dependency_id); | ||||
|                 // This should always be found, but just in case validate that the find was successful.
 | ||||
|                 // This will get treated as an error if it wasn't found in the manifest.
 | ||||
|                 if (find_manifest_dep != mod.manifest.dependencies_by_id.end()) { | ||||
|                     const auto& manifest_dep = mod.manifest.dependencies[find_manifest_dep->second]; | ||||
|                     if (manifest_dep.optional) { | ||||
|                         optional = true; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 if (!optional) { | ||||
|                     error_param = "Failed to find callback dependency while loading code: " + dependency_id; | ||||
|                     // This should never happen, as dependencies are scanned before mod code is loaded and the symbol dependency list
 | ||||
|                     // is validated against the manifest's. 
 | ||||
|                     return CodeModLoadError::InternalError; | ||||
|                 } | ||||
|             } | ||||
|             else { | ||||
|                 const auto& dependency_mod = opened_mods[find_mod_it->second]; | ||||
|                 did_find_event = dependency_mod.get_global_event_index(dependency_event.event_name, event_index); | ||||
|             } | ||||
|             const auto& dependency_mod = opened_mods[find_mod_it->second]; | ||||
|             did_find_event = dependency_mod.get_global_event_index(dependency_event.event_name, event_index); | ||||
|         } | ||||
| 
 | ||||
|         if (!did_find_event) { | ||||
|         if (did_find_event) { | ||||
|             recomp::mods::register_event_callback(event_index, mod_index, func); | ||||
|         } | ||||
|         else if (!optional) { | ||||
|             error_param = dependency_id + ":" + dependency_event.event_name; | ||||
|             return CodeModLoadError::InvalidCallbackEvent; | ||||
|         } | ||||
| 
 | ||||
|         recomp::mods::register_event_callback(event_index, mod_index, func); | ||||
|     } | ||||
| 
 | ||||
|     // Register hooks.
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Wiseguy
						Wiseguy