Files
Main/Assets/Code/Logic/_Required/Lua/BetterLua.cs

182 lines
6.5 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Core.Base;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using System.Text;
using PathUtils = UnityEngine.Gonbest.MagicCube.PathUtils;
using UnityEngine.Gonbest.MagicCube;
namespace Thousandto.Code.Logic
{
public class BetterLua
{
//key秘钥
private static string key = "BgIAAACkAABSU0ExAAQAAAEAAQBtKN";
//所有lua脚本
private static Dictionary<string, byte[]> allLuaFile = new Dictionary<string, byte[]>();
//bytes整体偏移
private static int offset = 1;
private static int _loadCnt = 0;
public static bool IsLoaded()
{
return _loadCnt >= 2;
}
//初始化
public static void Init(string lan = null)
{
Debug.LogError("开始初始化Lua代码....");
_loadCnt = 0;
var BetterLuaPath = PathUtils.GetConfigFilePath("Lua.bytes");
var StringDefinesPath = PathUtils.GetConfigFilePath(string.Format("LuaData_{0}.bytes", (lan == null ? LanguageSystem.Lang : lan)));
#if UNITY_WEBGL
//if (Application.platform == RuntimePlatform.WebGLPlayer)
{
//WebUtils.ReadBytes(BetterLuaPath, x =>
FFileReader.ReadBytesAsync(BetterLuaPath, x =>
{
if (x != null)
{
using (MemoryStream stream = new MemoryStream(x))
{
ReadFile(stream);
stream.Close();
}
_loadCnt++;
}
else
{
Debug.LogError("Lua1文件加载失败!:"+ BetterLuaPath);
}
});
//WebUtils.ReadBytes(StringDefinesPath, x =>
FFileReader.ReadBytesAsync(StringDefinesPath, x =>
{
if (x != null)
{
using (MemoryStream stream = new MemoryStream(x))
{
ReadFile(stream);
stream.Close();
}
_loadCnt++;
}
else
{
Debug.LogError("Lua2文件加载失败!:" + StringDefinesPath);
}
});
}
//else
#else
{
if (File.Exists(BetterLuaPath))
{
using (FileStream stream = new FileStream(BetterLuaPath, FileMode.Open, FileAccess.Read))
{
ReadFile(stream);
stream.Close();
}
_loadCnt++;
}
if (File.Exists(StringDefinesPath))
{
using (FileStream stream = new FileStream(StringDefinesPath, FileMode.Open, FileAccess.Read))
{
ReadFile(stream);
stream.Close();
}
_loadCnt++;
}
}
#endif
}
//1.内容长度4个字节 2.key长度4个字节 3.key3+keyLength 4.lua内容
//lua内容 1>title总长度8个字节 2>所有lua文件总览,用分隔符分开每3个一组【文件路径文件开始位置文件长度】 3>所有lua文件内容
private static void ReadFile(Stream stream)
{
using (BinaryReader reader = new BinaryReader(stream))
{
int contentLength = reader.ReadInt32();
int keyLength = reader.ReadInt32();
//key
stream.Seek(11, SeekOrigin.Begin);
var keyBytes = new byte[keyLength - 3];
stream.Read(keyBytes, 0, keyLength - 3);
DecryptKey(ref keyBytes);
//秘钥是否正确
if (Encoding.UTF8.GetString(keyBytes) == key)
{
offset = 8 + keyLength;
var titleCountBytes = new byte[8];
stream.Seek(offset, SeekOrigin.Begin);
stream.Read(titleCountBytes, 0, 8);
DecryptContent(ref titleCountBytes);
int titleCount = int.Parse(Encoding.UTF8.GetString(titleCountBytes));
var titleBytes = new byte[titleCount];
stream.Seek(offset + 8, SeekOrigin.Begin);
stream.Read(titleBytes, 0, titleCount);
var titleStrArr = Encoding.UTF8.GetString(titleBytes).Split(';');
var titleStrArrLength = titleStrArr.Length;
for (int i = 0; i < titleStrArrLength - 1; i += 3)
{
var startIndex = int.Parse(titleStrArr[i + 1]) + offset;
var length = int.Parse(titleStrArr[i + 2]);
var bytes = new byte[length];
stream.Seek(startIndex, SeekOrigin.Begin);
stream.Read(bytes, 0, length);
DecryptContent(ref bytes);
allLuaFile.Add(titleStrArr[i], bytes);
}
}
reader.Close();
}
}
//解密key
public static void DecryptKey(ref byte[] bytes)
{
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = (byte)(bytes[i] ^ -82);
bytes[i] += 106;
}
}
//解密文本
public static void DecryptContent(ref byte[] bytes)
{
var bytesLength = bytes.Length;
for (int i = 0; i < bytesLength; i++)
{
bytes[i] = (byte)(bytes[i] ^ -74);
//bytes[i] += 95;
}
}
//加载lua文件
public static byte[] BetterLuaLoader(ref string fileName)
{
if (allLuaFile.ContainsKey(fileName))
{
var bytes = allLuaFile[fileName];
//配置表lua加载以后,这里可以把内存腾出来
if (fileName.StartsWith("config/data/"))
{
allLuaFile.Remove(fileName);
}
return bytes;
}
else
{
Debug.LogError("no file :" + fileName);
return null;
}
}
}
}