Hello everyone, it really has been a while.
大家好啊,离上次发帖已经有段时间了。
Been busy both online as offline, and trying to spend more time offline with my family and friends.
我不管是线上线下都挺忙的,还在试着跟我的家人朋友们一起度过更多的线下闲暇时光。
This post will be a quite technical since a lot of complicated issues have been going on behind the scenes.
由于幕后工作很多的原因,这帖子技术性会比较强。
Sorry for the delay!
久等啦!
Before we get started
正事开始之前:
Since I haven't done this for a while, here is a song recommendation that I've been listening to on repeat while programming Haru: https://www.youtube.com/watch?v=kJ-HzCOOfLY
我很久没写这样的帖子了,而这个链接里有我编写Haru时单曲循环的歌:https://www.youtube.com/watch?v=kJ-HzCOOfLY
SPT-AKI
While the current SPT-AKI team was working on the server, it became very clear that development could not continue without migration to TypeScript.
现有的SPT-AKI团队开发服务器时清楚地意识到,代码不迁移到TypeScript的话开发几乎无法继续进行。
JavaScript itself has many quirks that are great for simple scripts, but not for big applications like the SPT-AKI Server.
JavaScript本身有很多适合简单脚本的小特点,但是这些小特点对于SPT-AKI这样的大架构来说并不好用。
The project has reached a state where the source code became unmaintainable, and this needs an immediate fix.
项目本身已经到了源代码无法维护的地步,而这种情况亟需补救。
The migration towards TypeScript has been successful, but there is plenty of unstable and untested code, as well as a lot of duplication.
迁移到TypeScript的工作目前都很成功,但是未经测试、不稳定还重复的代码可以说是不少了。
When will the server be stable enough? No clue since my involvemnt with SPT-AKI is very limited, but I know for sure that it won't be early.
那服务器什么时候会稳定呢?不知道,因为我现在和SPT-AKI的关联非常有限,但是我知道短时间内是不可能的。
CRYPT 秘谜系统
It won't be happening. After the SPT-AKI team moved to BepInEx, I could no longer reliably protect the bundle loading mechanism due to BepInEx's feature of assembly prepatching (meaning my security can get patched out before I get a chance to validate it).
取消了——在SPT-AKI项目组迁移到BepInEx之后,由于BepInEx内置的编译文件预补丁功能,我不再能可靠地保护bundle文件加载过程(因为我的安全措施可以在我验证之前就被补丁打掉)。
I've considered: 我考虑过如下的备选方案:
– implementing request counting
-增设请求计数
– server masking with request piping (running a hidden server so modders can't modify it)
-掩盖服务器,所有请求通过隧道方式传达(即跑一个隐藏服务器,这样就不能直接做改动了)
– runtime compilation of C# scripts sent over by the server (dropped because its a huge security risk)
-由服务器发送对C#脚本进行runtime编译(风险巨大,所以放弃了)
– improving the existing login system to block requests from outside the game
-改进现有的登录系统以屏蔽游戏外的请求
– server endpoint randomization to prevent endpoints from being discovered
-服务器末端随机化以防止末端被发现
– using C++ to directly inject bundles into Unity (very difficult)
-用C++直接朝Unity注入bundle文件(非常困难)
While this all combined would make for a very hardened loading mechanism, it has a glaring issue:
虽然这一套组合拳能让加载系统变得固若金汤,但是依然有一个很明显的问题存在:
NinjaRipper could just be used to extract the models and textures.
我完全可以用NinjaRipper把模型和材质直接提取出来。
There is no way I can detect this program reliably.
我还没有办法稳定检测这东西在没在运行。
And thus, I dropped it.
所以我放弃了。
It can reliably encrypt JavaScript and JSON source however, so if there is interests I can release this portion of the mod.
但是这套系统可以有效加密JavaScript和JSON源码,所以如果有人感兴趣的话我可以放出这套系统的这一部分。
Haru
In the past 3 weeks I've been working on the project (mostly) in silence, with guiding advice of the SPT-AKI team.
过去三周我都在(大部分时候)默默开发这个项目,并有SPT-AKI项目组的支持。
After many long nights of hard work and many energy drinks, the project has reached the major milestone of being able to boot into the game and reaching the main menu.
在度过了很多个爆肝代码的夜晚和很多罐能量饮料之后,Haru项目已经能成功进入游戏主菜单的阶段了
This is quite a feat since I am writing everything from scratch, no previous code is being borrowed or reused.
这非常重要,因为Haru的代码都是我从零开始编写的,没有沿用任何先前的代码。
Currently I am refactoring the server together with Shirito with the
advice from Alex and Waffle.Lord to conform to more enterprise-level
programming standards, such as usage of Dependency Injection (DI),
seperation of concerns, following SOLID principles and the likes.
目前我在和Shirito一起,借助Alex和Waffle.Lord的建议将服务器的代码重新编写得更符合业界标准一些,比如使用依赖项注入(DI),关注点分离(SOC),遵循SOLID原则等等。
After pondering for a long time and discussing these issues with members from the SPT-AKI team, I decided to go for the following principles:
在自己思考了很久,还和SPT-AKI项目组讨论之后,我决定遵循如下的原则:
– run the server embedded into the client (users don't need to start the server anymore)
-让服务器嵌入到游戏内部(用户不需要分开启动服务器)
– use enterprise patterns and principles (avoid architecture mistakes of SPT-AKI)
-使用业界标准的模式和原则(防止重蹈SPT-AKI架构问题的覆辙)
– load data from memory, not disk (improves performance heavily)
-从内存而不是硬盘装载数据(显著提升性能)
– core project is self-contained (only rely on EFT assemblies)
-核心项目自成一体(只依赖塔科夫本身的编译文件)
– only provide the bare minimum (allow others to write plugins to expand on functionality)
-只提供最基础的功能性(其他人可以编写插件拓宽功能)
– use testing to ensure stability
-用测试的方法保证稳定性
– no backwards compatability with Aki (reduces complexity)
-不对Aki提供任何反向兼容性(减少复杂度)
These have been (partially) implemented and are functional.
这些已经(部分)实装,功能性良好。
As impressive as all of these points sound, it has impact on the end-user in significant ways:
但是就算这些听着很帅,这一决定对末端用户而言的影响也非常大:
– Haru is never going to reach feature-parity with Aki. Modders will have to port over functionality or write an even better system than Aki provides. This is a concious decision to reduce complexity (Aki is tremendously complex!) and allow further customization of the experience.
-Haru的功能性不可能达到和Aki一样的水平。模组作者只能要么把功能迁移到新架构上,要么写一套比Aki更好的功能。这是为了减少复杂度(Aki真的很复杂!)作出的有意决定。
– Save files cannot be transfered over (incompatible data layout)
-存档不能迁移(数据布局不同)
– Complex mods will be much easier to write, but simple mods will require more effort (C# vs JS)
-复杂的模组编写会更简单,但是简单的模组编写会更困难一些(C# vs JS)
Will Haru be open-source? I do not know.
Haru会开源么?我不知道。
To be frank, the contributions made on Aki are… always appriciated but rarely of good quality which adds up over time.
说实话,我们…一直欢迎社区对Aki的贡献,但是这些贡献的质量通常都良莠不齐。
I don't like having my code stolen either, so I'll have to enforce signed commits before releasing it so I can prove all the hard work I've done to be mine.
我也不喜欢看到我的代码被偷走,所以在我放出Haru之前我会设置强制所有人作出代码贡献时署名,这样我就能证明我一路下来编写的代码都是我自己写的。
For now, the license is CC BY-NC-ND 4.0, you can see on Creative Commons official website ( https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh ) what this encompasses.
目前,Haru的许可证是CC BY-NC-ND 4.0, 具体可以在Creative Commons官网[链接]查看该许可证具体囊括什么。
SPT项目组测试员:Sarix 提供翻译
Welcome home, I Mengxin hope you can be happy and healthy
666
百度翻译,可能不准确请大家见谅
Baidu translation may not be accurate. Please forgive me if so.
大家好,真的有一段时间了。无论是在线还是离线,我都很忙,并且试图花更多的时间与家人和朋友离线。这篇文章将是一篇相当技术性的文章,因为很多复杂的问题都发生在幕后。抱歉耽搁了!在我们开始之前,因为我已经有一段时间没有这样做了,这里有一首歌曲推荐,我在为Haru编程时一直在重复听:链接SPT-AKI当当前的SPT-AKI团队在服务器上工作时,很明显,如果不迁移到TypeScript,开发就无法继续。JavaScript本身就有很多怪癖,这些怪癖对于简单的脚本来说是非常好的,但对于SPT-AKI服务器这样的大型应用程序来说则不然。该项目已达到源代码无法维护的状态,这需要立即修复。向TypeScript的迁移是成功的,但是存在大量不稳定和未经测试的代码,以及大量重复。服务器何时才能足够稳定?没有任何线索,因为我与SPT-AKI的关系非常有限,但我确信不会太早。但这不会发生。SPT-AKI团队搬到BepInEx后,由于BepInEx的组装预配功能,我无法再可靠地保护捆绑包加载机制(这意味着我的安全性可以在我有机会验证之前得到修补)。我考虑过:–实现请求计数–使用请求管道屏蔽服务器(运行一个隐藏的服务器,以便修改者无法修改它)–运行时编译服务器发送的C#脚本(由于存在巨大的安全风险而放弃)–改进现有登录系统以阻止来自游戏外部的请求–服务器端点随机化以防止端点被删除发现——使用C++直接将捆绑包注入Unity(非常困难),虽然这一切结合起来会形成一个非常坚固的加载机制,但它有一个明显的问题:NinjaRipper只能用于提取模型和纹理。我无法可靠地检测到这个程序。就这样,我把它扔了。不过,它可以可靠地加密JavaScript和JSON源代码,所以如果有兴趣,我可以发布mod的这一部分。HaruIn在过去的三周里,在SPT-AKI团队的指导意见下,我一直在默默地(大部分时间)进行这个项目。经过许多漫长的夜晚的艰苦工作和大量的能量饮料,该项目已经达到了能够进入游戏并进入主菜单的重要里程碑。这是一个了不起的壮举,因为我从零开始编写所有代码,没有借用或重用以前的代码。目前,我正在与Shirito一起重构服务器,并听取Alex和Waffle的建议。Lord需要遵守更多的企业级编程标准,比如依赖注入(DI)的使用、关注点分离、遵循可靠的原则等等。在与SPT-AKI团队的成员思考了很长时间并讨论了这些问题后,我决定遵循以下原则:–运行嵌入客户端的服务器(用户不再需要启动服务器)–使用企业模式和原则(避免SPT-AKI的架构错误)–从内存加载数据,不是磁盘(极大地提高了性能)-核心项目是自包含的(仅依赖于EFT组件)-只提供最低限度(允许其他人编写插件以扩展功能)-使用测试确保稳定性-与Aki没有向后兼容性(降低复杂性)。这些已经(部分)实现,并且是功能性的。尽管所有这些观点听起来都令人印象深刻,但它对最终用户有着重要的影响:–Haru永远无法与Aki实现功能对等。Modders将不得不移植功能,或者编写一个比Aki提供的更好的系统。这是一个降低复杂性的简洁决定(Aki非常复杂!)并允许进一步定制体验无法传输保存文件(不兼容的数据布局)——复杂的MOD将更容易编写,但简单的MOD将需要更多的工作(C#vs JS)Haru是开源的吗?我不知道。坦率地说,对Aki的贡献……总是值得赞赏的,但很少有高质量的,随着时间的推移,这些贡献会增加。我也不喜欢我的代码被盗,所以我必须在发布之前强制执行签名提交,这样我才能证明我所做的所有努力都是我的。目前,许可证是CC BY-NC-ND 4.0,你可以在知识共享的官方网站(链接 ) 这包括什么。转载请附上原文链接:https://sns.oddba.cn/26776.html