private bool CheckInfoAttribute(ref MelonInfoAttribute infoAttribute) { infoAttribute = MelonUtils.PullAttributeFromAssembly <MelonInfoAttribute>(Assembly); // Legacy Support if (infoAttribute == null) { infoAttribute = MelonUtils.PullAttributeFromAssembly <MelonModInfoAttribute>(Assembly)?.Convert(); } if (infoAttribute == null) { infoAttribute = MelonUtils.PullAttributeFromAssembly <MelonPluginInfoAttribute>(Assembly)?.Convert(); } if ((infoAttribute == null) || (infoAttribute.SystemType == null)) { MelonLogger.Error($"No {((infoAttribute == null) ? "MelonInfoAttribute Found" : "Type given to MelonInfoAttribute")} in {FilePath}"); return(false); } is_plugin = infoAttribute.SystemType.IsSubclassOf(typeof(MelonPlugin)); bool is_mod_subclass = infoAttribute.SystemType.IsSubclassOf(typeof(MelonMod)); if (!is_plugin && !is_mod_subclass) { MelonLogger.Error($"Type Specified {infoAttribute.SystemType.AssemblyQualifiedName} is not a Subclass of MelonPlugin or MelonMod in {FilePath}"); return(false); } bool nullcheck_name = string.IsNullOrEmpty(infoAttribute.Name); bool nullcheck_version = string.IsNullOrEmpty(infoAttribute.Version); if (nullcheck_name || nullcheck_version) { MelonLogger.Error($"No {(nullcheck_name ? "Name" : (nullcheck_version ? "Version" : ""))} given to MelonInfoAttribute in {FilePath}"); return(false); } if (is_plugin ? MelonHandler.IsPluginAlreadyLoaded(infoAttribute.Name) : MelonHandler.IsModAlreadyLoaded(infoAttribute.Name)) { MelonLogger.Error($"Duplicate {(is_plugin ? "Plugin" : "Mod")} {infoAttribute.Name}: {FilePath}"); return(false); } return(true); }
private bool CheckPlatformDomainAttribute() { MelonPlatformDomainAttribute platformDomainAttribute = MelonUtils.PullAttributeFromAssembly <MelonPlatformDomainAttribute>(Assembly); if ((platformDomainAttribute == null) || (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.UNIVERSAL)) { return(true); } bool is_il2cpp_expected_mono = (MelonUtils.IsGameIl2Cpp() && (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.MONO)); bool is_mono_expected_il2cpp = (!MelonUtils.IsGameIl2Cpp() && (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.IL2CPP)); if (is_il2cpp_expected_mono || is_mono_expected_il2cpp) { MelonLogger.Error($"Incompatible Platform Domain for {(is_plugin ? "Plugin" : "Mod")}: {FilePath}"); return(false); } return(true); }
private bool CheckVerifyLoaderVersionAttribute() { VerifyLoaderVersionAttribute verifyLoaderVersionAttribute = MelonUtils.PullAttributeFromAssembly <VerifyLoaderVersionAttribute>(Assembly); if (verifyLoaderVersionAttribute == null) { return(true); } bool is_acceptable = verifyLoaderVersionAttribute.IsMinimum ? (verifyLoaderVersionAttribute.SemVer <= BuildInfo.Version) : (verifyLoaderVersionAttribute.SemVer == BuildInfo.Version); if (!is_acceptable) { MelonLogger.Error($"Incompatible MelonLoader Version for {(is_plugin ? "Plugin" : "Mod")}: {FilePath}"); return(false); } return(true); }
private bool CheckVerifyLoaderBuildAttribute() { VerifyLoaderBuildAttribute verifyLoaderBuildAttribute = MelonUtils.PullAttributeFromAssembly <VerifyLoaderBuildAttribute>(Assembly); if ((verifyLoaderBuildAttribute == null) || string.IsNullOrEmpty(verifyLoaderBuildAttribute.HashCode)) { return(true); } string currentHashCode = MelonUtils.HashCode; if (string.IsNullOrEmpty(currentHashCode)) { return(true); } if (!currentHashCode.Equals(verifyLoaderBuildAttribute.HashCode)) { MelonLogger.Error($"Incompatible MelonLoader Build for {(is_plugin ? "Plugin" : "Mod")}: {FilePath}"); return(false); } return(true); }
private bool CheckPlatformDomainAttribute() { MelonPlatformDomainAttribute platformDomainAttribute = MelonUtils.PullAttributeFromAssembly <MelonPlatformDomainAttribute>(Assembly); if ((platformDomainAttribute == null) || (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.UNIVERSAL)) { return(true); } bool is_acceptable = MelonUtils.IsGameIl2Cpp() ? (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.IL2CPP) : (platformDomainAttribute.Domain == MelonPlatformDomainAttribute.CompatibleDomains.MONO); if (!is_acceptable) { MelonLogger.Error($"Incompatible Platform Domain for {(is_plugin ? "Plugin" : "Mod")}: {FilePath}"); return(false); } return(true); }
public override void CheckAndCreate(ref List <MelonBase> melonTbl) { MelonInfoAttribute infoAttribute = null; if (!CheckInfoAttribute(ref infoAttribute)) { return; } List <MelonGameAttribute> gameAttributes = null; if (!CheckGameAttributes(ref gameAttributes)) { return; } if (!CheckProcessAttributes()) { return; } if (!CheckGameVersionAttribute()) { return; } if (!CheckPlatformAttribute()) { return; } if (!CheckPlatformDomainAttribute()) { return; } if (!CheckVerifyLoaderVersionAttribute()) { return; } if (!CheckVerifyLoaderBuildAttribute()) { return; } MelonColorAttribute coloratt = MelonUtils.PullAttributeFromAssembly <MelonColorAttribute>(Assembly); MelonPriorityAttribute priorityatt = MelonUtils.PullAttributeFromAssembly <MelonPriorityAttribute>(Assembly, true); MelonBase instance = new MelonCompatibilityLayer.WrapperData() { Assembly = Assembly, Info = infoAttribute, Games = gameAttributes.ToArray(), OptionalDependencies = MelonUtils.PullAttributeFromAssembly <MelonOptionalDependenciesAttribute>(Assembly), ConsoleColor = (coloratt == null) ? MelonLogger.DefaultMelonColor : coloratt.Color, Priority = (priorityatt == null) ? 0 : priorityatt.Priority, Location = FilePath }.CreateMelon(); if (instance == null) { return; } melonTbl.Add(instance); }