182 lines
6.5 KiB
C#
182 lines
6.5 KiB
C#
|
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.key:3+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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|