1using System.Reflection;
12 public Dictionary<string, ZipArchiveEntry>
ModFiles = [];
19 public static HashSet<string>
InvalidDllNames = [
"Survivalcraft.dll",
"Engine.dll",
"EntitySystem.dll"];
20 public const string fName =
"ModEntity";
54 public virtual void GetFiles(
string extension, Action<string, Stream> action) {
57 Loader?.GetModFiles(extension, action, out skip);
63 MemoryStream stream =
new();
64 ModArchive.ExtractFile(zipArchiveEntry, stream);
70 Log.
Error($
"Get file [{zipArchiveEntry.FilenameInZip}] failed: {e}");
82 public virtual bool GetFilesAndExist(
string extension, Action<string, Stream> action) {
96 public virtual bool GetFile(
string filename, Action<Stream> stream) {
98 bool loaderReturns =
false;
99 Loader?.GetModFile(filename, stream, out skip, out loaderReturns);
101 return loaderReturns;
104 using MemoryStream ms =
new();
110 catch (Exception e) {
118 public virtual bool GetAssetsFile(
string filename, Action<Stream> stream) =>
GetFile($
"Assets/{filename}", stream);
132 if (language ==
"en-US") {
136 $
"Lang/{language}.json",
160 List<ZipArchiveEntry> entries =
ModArchive.ReadCentralDir();
174 catch (Exception e) {
175 Log.
Error($
"Deserialize modinfo.json from [{Storage.GetFileName(ModFilePath)}] failed: {e}");
183 if (
string.IsNullOrEmpty(
modInfo.PackageName)
185 ||
modInfo.PackageName.Contains(
';')
186 ||
modInfo.PackageName.Contains(
'\n')) {
192 && disabledVersions.Contains(
modInfo.Version)) {
197 foreach (KeyValuePair<string, ZipArchiveEntry> c
in ModFiles) {
203 $
"[{modInfo.Name}] The file name [{zipArchiveEntry.FilenameInZip}] is not encoded in UTF-8, need to be corrected."
207 if (filename.StartsWith(
"Assets/")) {
208 MemoryStream memoryStream =
new();
209 ContentInfo contentInfo =
new(filename.Substring(7));
210 ModArchive.ExtractFile(zipArchiveEntry, memoryStream);
239 public virtual void LoadXdb(ref XElement xElement) {
241 XElement element = xElement;
252 Loader?.OnXdbLoad(xElement);
265 XElement element = xElement;
282 public virtual void LoadCr(ref XElement xElement) {
284 XElement element = xElement;
302 List<Assembly> assemblies =
new();
305 (filename, stream) => {
310 if (!filename.StartsWith(
"Assets/")) {
313#pragma warning disable IL2026
315#pragma warning restore IL2026
320 return [.. assemblies];
324 List<Type> blockTypes =
new();
325#pragma warning disable IL2026
326 Type[] types = assembly.GetTypes();
327#pragma warning restore IL2026
328 for (
int i = 0; i < types.Length; i++) {
329 Type type = types[i];
331 && !type.IsAbstract) {
332#pragma warning disable IL2062
333 if (Activator.CreateInstance(types[i]) is
ModLoader modLoader) {
334#pragma warning disable IL2062
335 modLoader.Entity =
this;
337 modLoader.__ModInitialize();
343#pragma warning disable IL2062
345#pragma warning restore IL2062
348 if (type.IsSubclassOf(typeof(
Block))
349 && !type.IsAbstract) {
350 blockTypes.Add(type);
384 if (
modInfo.DependencyRanges.Count == 0) {
386 modEntities.Add(
this);
391 foreach ((
string name, VersionRange range) in
modInfo.DependencyRanges) {
393 && px.modInfo !=
null
394 && px.modInfo.PackageName == name
395 && ((px.modInfo.NuGetVersion !=
null && range.Satisfies(px.modInfo.NuGetVersion)) || range.Equals(VersionRange.All) || px.modInfo.Version == range.OriginalString)
397 if (entity !=
null) {
400 throw new Exception($
"[{modInfo.Name}] Dependency {name} is dependent on {modInfo.Name}, which is not allowed.");
408 throw new Exception($
"[{modInfo.Name}] Failed to find dependency {name}");
412 modEntities.Add(
this);
421 Loader?.SaveSettings(xElement);
429 Loader?.LoadSettings(xElement);
437 Loader?.BlocksInitalized();
451 public override bool Equals(
object obj) {
453 return px.modInfo.PackageName == modInfo.PackageName && px.modInfo.NuGetVersion.Equals(
modInfo.NuGetVersion);
static Texture2D Load(LegacyImage image, int mipLevelsCount=1)
static void Error(object message)
static string GetExtension(string path)
static string GetFileName(string path)
static long GetFileSize(string path)
static void LoadBlocksData(string blocksDataString)
void SetContentStream(Stream stream)
static void Add(ContentInfo contentInfo)
static Dictionary< string, IContentReader.IContentReader > ReaderList
static void Execute(string str)
static void loadJson(Stream stream)
static void LoadEnglishJson(Stream stream)
static void Info(string mesg)
static void Error(string mesg)
ModEntity(string FileName, ZipArchive zipArchive)
ModEntity(ZipArchive zipArchive)
virtual void ModInitialize()
Mod初始化
virtual bool GetFile(string filename, Action< Stream > stream)
获取指定文件
virtual bool GetFilesAndExist(string extension, Action< string, Stream > action)
virtual void InitResources()
初始化Content资源
virtual bool GetAssetsFile(string filename, Action< Stream > stream)
virtual void CheckDependencies(List< ModEntity > modEntities=null)
检查依赖项
ModDisableReason DisableReason
virtual void LoadBlocksData()
初始化BlocksData资源
virtual void LoadSettings(XElement xElement)
加载设置
virtual Assembly[] GetAssemblies()
加载mod程序集
virtual void LoadXdb(ref XElement xElement)
初始化Database数据
static HashSet< string > InvalidDllNames
virtual void HandleAssembly(Assembly assembly)
virtual void SaveSettings(XElement xElement)
保存设置
virtual void LoadClo(ClothingBlock block, ref XElement xElement)
初始化Clothing数据
virtual void GetFiles(string extension, Action< string, Stream > action)
获取模组的文件时调用。
virtual void OnBlocksInitalized()
BlocksManager初始化完毕
override int GetHashCode()
Dictionary< string, ZipArchiveEntry > ModFiles
virtual void LoadIcon(Stream stream)
virtual void LoadCr(ref XElement xElement)
初始化CraftingRecipe
override bool Equals(object obj)
virtual void LoadLauguage()
初始化语言包
Dictionary< string, VersionRange > DependencyRanges
static List< ModLoader > ModLoaders
static ModInfo DeserializeJson(string json)
static byte[] StreamToBytes(Stream stream)
将 Stream 转成 byte[]
static void AddException(Exception e, bool AllowContinue_=false)
static Dictionary< string, ModEntity > PackageNameToModEntity
含所有已启用的模组
static void CombineClo(XElement clothesRoot, Stream toCombineStream)
static void CombineCr(XElement xElement, Stream cloorcr)
static List< ModEntity > ModList
所有已启用的模组
static Dictionary< string, HashSet< string > > DisabledMods
static void CombineDataBase(XElement databaseRoot, Stream toCombineStream)
static Dictionary< string, string > Configs
static List< ModEntity > ModListAll
所有模组,含禁用的
static string StreamToString(Stream stream)