Repository: LiteLDev/LeviLamina (cpp)

Issue:
Crash on server startup when CrashLogger loading
### Exceptions module

Core

### Operating System

Windows 10

### LiteLoader version

Actions#2351 39f9366

### BDS version

1.19.10.03

### What happened?

After commit 39f9366 server crashes when trying to load CrashLogger. As far as I have noticed, this happens when a Logger variable is accessed - for example, here:
```cpp
crashLogger.error("Could not Create CrashLogger Daemon Process!");
```

### Steps to reproduce?

_No response_

### Relevant log output

_No response_

### Plugin list

_No response_


Discussion:

Patch:
diff --git a/.clang-format b/.clang-format
--- a/.clang-format
+++ b/.clang-format
@@ -6,18 +6,25 @@ AlignAfterOpenBracket: Align
 AlignConsecutiveAssignments: false
 AlignConsecutiveDeclarations: false
 AlignEscapedNewlinesLeft: true
-AlignOperands: true
+AlignOperands: Align
+AlwaysBreakTemplateDeclarations : true
 AlignTrailingComments: true
+AllowAllArgumentsOnNextLine : true
 AllowAllParametersOfDeclarationOnNextLine: true
 AllowShortBlocksOnASingleLine : true
-AllowShortCaseLabelsOnASingleLine: true
+AllowShortCaseLabelsOnASingleLine: false
 AllowShortFunctionsOnASingleLine: Inline
-AllowShortIfStatementsOnASingleLine: true
-AllowShortLoopsOnASingleLine: true 
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
 AllowShortFunctionsOnASingleLine: false
 AllowShortLambdasOnASingleLine: true
+AllowShortEnumsOnASingleLine: false
 AlwaysBreakAfterDefinitionReturnType: None
-ColumnLimit: 120
+BinPackArguments: true
+BinPackParameters: true
+ConstructorInitializerIndentWidth: 0
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ColumnLimit: 0
 CommentPragmas: '^ IWYU pragma:'
 PointerAlignment: Left
 IndentWidth: 4
@@ -31,7 +38,7 @@ IndentWrappedFunctionNames: true
 KeepEmptyLinesAtTheStartOfBlocks: true
 BreakConstructorInitializersBeforeComma: true
 SpaceAfterCStyleCast: false
-IndentCaseLabels: true 
+IndentCaseLabels: true
 TabWidth: 4
 UseTab: Never
 
diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml
--- a/.github/ISSUE_TEMPLATE/bug_report_en.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml
@@ -87,7 +87,7 @@ body:
   id: plugins
   attributes:
     label: Plugin list
-    description: Please copy the command output of `ll list`. 
+    description: Please copy the command output of `ll list`.
     render: shell
 - type: markdown
   attributes:
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,22 @@
+## Description
+
+Please carefully read the [Contributing note](https://github.com/LiteLDev/LiteLoaderBDS/discussions/546) before making any pull requests.
+And, **Do not make a pull request to merge into main branch unless it is a hotfix. Use the beta branch instead.**
+## Issues fixed by this PR
+
+<!--- Put the links of issues that may be fixed by this PR here (if any). -->
+## Type of changes
+
+<!--- Put an `x` in all the boxes that apply your changes. -->
+
+- [ ] Bug fix
+- [ ] New feature 
+- [ ] Enhancement
+- [ ] Documentation
+
+## Checklist:
+
+- [ ] My code follows the style guidelines of this project
+- [ ] My pull request is unique and no other pull requests have been opened for these changes
+- [ ] I have read the [Contributing note](https://github.com/LiteLDev/LiteLoaderBDS/discussions/546)
+- [ ] I am responsible for any copyright issues with my code if it occurs in the future.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -54,7 +54,7 @@ jobs:
 
       - name: Add MSBuild to PATH
         uses: microsoft/setup-msbuild@v1.1
-        
+
       - name: Change LITELOADER_VERSION_STATUS_BETA
         working-directory: ${{env.GITHUB_WORKSPACE}}
         if: false == startsWith(github.ref, 'refs/tags/')
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,25 +1,26 @@
-## [New Forum]
-[https://forum.litebds.com/](https://forum.litebds.com/)
-
 ## [LiteLoader Release Note]
-LiteLoaderBDS-2.4.0 update has been released, adapted to BDS-1.19.10, ProtocolVersion 534
+LiteLoaderBDS-2.4.1 update has been released, adapted to BDS-1.19.10, ProtocolVersion 534
 
 ## [New features]
-- Support BDS 1.19.10, by @QingYu,@WangYneos
-- New I18N api(Provided for small plugins), by @Jasonzyt
-  - `Please wait for the next version for large plugins`
-- Config add enableTpdimCommand, enableForceUtf8Input by @QingYu
-- Better PlayerPlaceBlockEvent, by @Redbeanw44602
-- Add Vec3 for onUseItemOn event, #523 by @OEOTYAN
-
-## [Change]
-- PlayerMoveEvent/OnMove Will be abandoned in the future.(Please revise other programs as soon as possible)
+- LL API
+  - Add `Player::getLastPacketLoss`, By @StarsDream00
+  - Add Event `BlockPlacedByPlayerEvent`, By @StarsDream00
+  - Add ModalForm in FormUI,(#554) By @S3v3Nice
+- LLSE API
+  - Add `pl.lastDeathPos`,(#551) By @StarsDream00
+  - Add `pl.isLoading`, By @StarsDream00
+  - Add `dv.lastPacketLoss`, By @StarsDream00
+  - Add `dv.lastPing`, By @StarsDream00
+  - Add `dv.serverAddress`, By @StarsDream00
+  - Add `bl.destroy(drop)`, By @StarsDream00
+  - Add Event `onExperienceAdd`, By @StarsDream00
+  - Add Event `onBedEnter`, By @StarsDream00
+  - Add Event `afterPlaceBlock`, By @Redbeanw44602
 
 ## [Bug Fixes]
 - Fix LL bugs:
-  - Don't load plugins with the same file name as a registered plugin, #510 by @Jasonzyt
-  - Molang API(MC/ExpressionNode.hpp) syntax error, #524 by @LazuliKao
-  - PlayerMoveEvent bugs, #530 by @Redbeanw44602
-  - distanceToSqr API, by @QingYu
-- Fix LLSE bugs:
-  - The default value of parameter `perm` in `mc.newCommand` is not correct, #517 by @StarsDream00
\ No newline at end of file
+  - Fix AntiGive not working, By @dreamguxiang
+  - Fix Vec3 some problems, By @OEOTYAN
+
+## [New Forum]
+[https://forum.litebds.com/](https://forum.litebds.com/)
\ No newline at end of file
diff --git a/Licenses/ChakraCore.txt b/Licenses/ChakraCore.txt
deleted file mode 100644
--- a/Licenses/ChakraCore.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Microsoft Corporation
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/LiteLoader/Header/AllowListAPI.h b/LiteLoader/Header/AllowListAPI.h
--- a/LiteLoader/Header/AllowListAPI.h
+++ b/LiteLoader/Header/AllowListAPI.h
@@ -11,25 +11,23 @@
 // AllowListManager().add("alex"[, "11451419", true]).reload();
 // AllowListManager().remove("mojang"[, "233333"]).reload();
 // AllowListManager().add(...).remove(...).reload();
-// 
+//
 // [Note]
-// 
-// If you don't call reload after add/remove, the changes will only write to file 
+//
+// If you don't call reload after add/remove, the changes will only write to file
 //   but it will not take effect in the game.
 // This means the player you added won't be able to join the game until reloading
-// 
+//
 // 如果你在使用add/remove成员之后不调用reload函数, 这些更改将只会写入文件而不会在游戏中生效
 // 这意味着你添加到白名单的玩家将不能加入游戏, 直到重载白名单
 //
 //////////////////////////////////////////////////////
 
-class AllowListManager
-{
+class AllowListManager {
 
     void save();
 
 public:
-
     nlohmann::json allowList;
 
     LIAPI AllowListManager();
@@ -41,7 +39,7 @@ class AllowListManager
     // @summary Return whether the player in the allowlist
     // @param index If exists, index will be set to the array index
     LIAPI bool has(const std::string& name, const xuid_t& xuid, size_t& index);
-    
+
     // @summary Add a player to allowlist
     LIAPI AllowListManager& add(const std::string& name, const xuid_t& xuid = "", bool ignore = false);
 
@@ -50,5 +48,4 @@ class AllowListManager
 
     // @summary Reload the allowlist(Making changes effective)
     LIAPI void reload();
-    
 };
diff --git a/LiteLoader/Header/DynamicCommandAPI.h b/LiteLoader/Header/DynamicCommandAPI.h
--- a/LiteLoader/Header/DynamicCommandAPI.h
+++ b/LiteLoader/Header/DynamicCommandAPI.h
@@ -117,8 +117,7 @@ class Player;
 
 #define AllResultType bool const*, int const*, float const*, std::string const*, CommandSelector<Actor> const*, CommandSelector<Player> const*, CommandPosition const*, CommandPositionFloat const*, CommandRawText const*, CommandMessage const*, Json::Value const*, CommandItem const*, Block const* const*, MobEffect const* const*, ActorDefinitionIdentifier const* const*, std::unique_ptr<Command> const*
 
-class DynamicCommand : public Command
-{
+class DynamicCommand : public Command {
     template <typename _Ty, class... _Types>
     static constexpr bool is_one_of_v = std::_Meta_find_unique_index<std::variant<_Types...>, std::add_pointer_t<std::add_const_t<_Ty>>>::value < sizeof...(_Types);
     template <typename _Ty>
@@ -127,8 +126,7 @@ class DynamicCommand : public Command
     using enable_if_supported_t = std::enable_if_t<is_supported_result_type_v<_Ty>, Type>;
 
 public:
-    enum class ParameterType
-    {
+    enum class ParameterType {
         Bool,             // bool
         Int,              // int
         Float,            // float
@@ -154,8 +152,7 @@ class DynamicCommand : public Command
     };
     struct ParameterPtr;
 
-    struct Result
-    {
+    struct Result {
         ParameterType const type;
         size_t const offset;
         bool const isSet;
@@ -173,24 +170,18 @@ class DynamicCommand : public Command
         LIAPI DynamicCommandInstance const* getInstance() const;
 
         template <typename T>
-        inline enable_if_supported_t<T, T const&> getRaw() const
-        {
+        inline enable_if_supported_t<T, T const&> getRaw() const {
 #ifdef USE_PARSE_ENUM_STRING
-            if (type == ParameterType::Enum)
-            {
+            if (type == ParameterType::Enum) {
                 auto& val = dAccess<std::pair<std::string, int>>(command, offset);
-                if constexpr (std::is_same_v<std::remove_cv_t<T>, int> || std::is_enum_v<T>)
-                {
+                if constexpr (std::is_same_v<std::remove_cv_t<T>, int> || std::is_enum_v<T>) {
                     return static_cast<T const&>(val.second);
-                }
-                else if constexpr (std::is_same_v<std::remove_cv_t<T>, std::string>)
-                {
+                } else if constexpr (std::is_same_v<std::remove_cv_t<T>, std::string>) {
                     return static_cast<T const&>(val.first);
                 }
             }
 #else
-            if constexpr (std::is_same_v<std::remove_cv_t<T>, std::string>)
-            {
+            if constexpr (std::is_same_v<std::remove_cv_t<T>, std::string>) {
                 if (type == ParameterType::Enum)
                     return getEnumValue();
             }
@@ -201,8 +192,7 @@ class DynamicCommand : public Command
         }
 
         template <typename T>
-        inline enable_if_supported_t<T, T const&> value_or(T const& defaultValue)
-        {
+        inline enable_if_supported_t<T, T const&> value_or(T const& defaultValue) {
             if (isSet)
                 return getRaw<T>();
             return defaultValue;
@@ -210,8 +200,7 @@ class DynamicCommand : public Command
 
         template <typename T>
         inline std::conditional_t<std::is_lvalue_reference_v<T>, std::add_lvalue_reference_t<std::add_const_t<std::remove_reference_t<T>>>, T>
-            get() const
-        {
+            get() const {
             static_assert(is_supported_result_type_v<T> || (std::is_lvalue_reference_v<T> && is_supported_result_type_v<std::remove_reference_t<T>>),
                           "Unsupported Result Type in " __FUNCTION__);
             if constexpr (std::is_lvalue_reference_v<T>)
@@ -221,43 +210,36 @@ class DynamicCommand : public Command
         }
 
         template <>
-        inline std::vector<Actor*> get<std::vector<Actor*>>() const
-        {
+        inline std::vector<Actor*> get<std::vector<Actor*>>() const {
             if (type == ParameterType::Player)
                 return (std::vector<Actor*>&)get<std::vector<Player*>>();
             std::vector<Actor*> rtn;
-            for (auto& result : getRaw<CommandSelector<Actor>>().results(*origin))
-            {
+            for (auto& result : getRaw<CommandSelector<Actor>>().results(*origin)) {
                 rtn.push_back(result);
             }
             return rtn;
         }
         template <>
-        inline std::vector<Player*> get<std::vector<Player*>>() const
-        {
+        inline std::vector<Player*> get<std::vector<Player*>>() const {
             std::vector<Player*> rtn;
-            for (auto& result : getRaw<CommandSelector<Player>>().results(*origin))
-            {
+            for (auto& result : getRaw<CommandSelector<Player>>().results(*origin)) {
                 rtn.push_back(result);
             }
             return rtn;
         }
         template <>
-        inline BlockPos get<BlockPos>() const
-        {
+        inline BlockPos get<BlockPos>() const {
             auto& pos = getRaw<CommandPosition>();
             return pos.getBlockPos(*origin, Vec3::ZERO);
         }
         template <>
-        inline Vec3 get<Vec3>() const
-        {
+        inline Vec3 get<Vec3>() const {
             auto& pos = getRaw<CommandPositionFloat>();
             return pos.getPosition(*origin, Vec3::ZERO);
         }
     };
 
-    struct ParameterPtr
-    {
+    struct ParameterPtr {
         ParameterType type;
 
     private:
@@ -270,14 +252,12 @@ class DynamicCommand : public Command
         LIAPI bool isValueSet(DynamicCommand const* command) const;
         LIAPI Result getResult(DynamicCommand const* command, CommandOrigin const* origin) const;
 
-        inline size_t getOffset() const
-        {
+        inline size_t getOffset() const {
             return offset;
         }
     };
 
-    struct ParameterData
-    {
+    struct ParameterData {
     protected:
         DynamicCommand::ParameterType type;
         size_t offset = -1;
@@ -298,8 +278,7 @@ class DynamicCommand : public Command
         friend class DynamicCommand;
 
         template <ParameterType type>
-        inline static constexpr CommandParameterDataType getCommandParameterDataType()
-        {
+        inline static constexpr CommandParameterDataType getCommandParameterDataType() {
             if constexpr (type == ParameterType::Enum)
                 return CommandParameterDataType::ENUM;
             else if constexpr (type == ParameterType::SoftEnum)
@@ -310,8 +289,7 @@ class DynamicCommand : public Command
                 return CommandParameterDataType::NORMAL;
         }
         template <ParameterType type, typename T>
-        CommandParameterData makeParameterData() const
-        {
+        CommandParameterData makeParameterData() const {
             CommandParameterData param{
                 type == ParameterType::Enum ? typeid_t<CommandRegistry>::count++ : type_id<CommandRegistry, T>(),
                 type == ParameterType::Enum ? &CommandRegistry::fakeParse<T> : CommandRegistry::getParseFn<T>(),
@@ -326,24 +304,21 @@ class DynamicCommand : public Command
             return std::move(param);
         }
 
-        inline void setOptional(bool optional)
-        {
+        inline void setOptional(bool optional) {
             this->optional = optional;
         }
-        inline bool setEnumOptions(std::string const& enumOptions)
-        {
+        inline bool setEnumOptions(std::string const& enumOptions) {
             if (type != DynamicCommand::ParameterType::Enum && type != DynamicCommand::ParameterType::SoftEnum)
                 return false;
             this->description = enumOptions;
             return true;
         }
-        inline bool setParameterOption(CommandParameterOption parameterOption)
-        {
+        inline bool setParameterOption(CommandParameterOption parameterOption) {
             this->option = parameterOption;
         }
 
         inline ParameterData(std::string const& name, ParameterType type, const char* enumOptions = "", std::string const& identifer = "", CommandParameterOption parameterOption = (CommandParameterOption)0)
-            : ParameterData(name, type, (std::string const&)enumOptions, identifer, parameterOption){};
+        : ParameterData(name, type, (std::string const&)enumOptions, identifer, parameterOption){};
     };
 
     using CallBackFn = std::function<void(DynamicCommand const& cmd, CommandOrigin const& origin, CommandOutput& output, std::unordered_map<std::string, Result>& results)>;
@@ -351,10 +326,8 @@ class DynamicCommand : public Command
 
 private:
     template <typename _Ty>
-    inline static enable_if_supported_t<_Ty, bool> checkTempateType(ParameterType type)
-    {
-        switch (type)
-        {
+    inline static enable_if_supported_t<_Ty, bool> checkTempateType(ParameterType type) {
+        switch (type) {
             case ParameterType::Bool:
                 return std::is_same_v<bool, std::remove_cv_t<_Ty>>;
             case ParameterType::Int:
@@ -407,7 +380,7 @@ class DynamicCommand : public Command
     static bool onServerCommandsRegister(CommandRegistry& registry);
 
     friend class DynamicCommandInstance;
-    
+
 public:
     /*0*/ virtual ~DynamicCommand();
     /*1*/ virtual void execute(class CommandOrigin const& origin, class CommandOutput& output) const;
@@ -436,8 +409,7 @@ class DynamicCommand : public Command
         CommandPermissionLevel permission = CommandPermissionLevel::GameMasters,
         CommandFlag flag1 = {(CommandFlagValue)0x80},
         CommandFlag flag2 = {(CommandFlagValue)0},
-        HMODULE handle = GetCurrentModule())
-    {
+        HMODULE handle = GetCurrentModule()) {
         return setup(createCommand(name, description, std::move(enums), std::move(params), std::move(overloads), std::move(callback), permission, flag1, flag2, handle));
     };
 
@@ -451,26 +423,21 @@ class DynamicCommand : public Command
     LIAPI static DynamicCommandInstance const* getInstance(std::string const& commandName);
 };
 
-class DynamicCommandInstance
-{
+class DynamicCommandInstance {
 public:
-    struct ParameterIndex
-    {
+    struct ParameterIndex {
         DynamicCommandInstance* instance;
         size_t index;
         ParameterIndex(DynamicCommandInstance* instance, size_t index)
-            : instance(instance)
-            , index(index){};
-        inline operator size_t() const
-        {
+        : instance(instance)
+        , index(index){};
+        inline operator size_t() const {
             return index;
         }
-        inline DynamicCommand::ParameterData& operator->()
-        {
+        inline DynamicCommand::ParameterData& operator->() {
             return instance->parameterDatas.at(index);
         }
-        inline bool isValid() const
-        {
+        inline bool isValid() const {
             size_t size = instance->parameterDatas.size();
             return index >= 0 && index < size;
         }
@@ -550,41 +517,34 @@ class DynamicCommandInstance
 
     template <typename T>
     inline std::enable_if_t<fmt::v8::detail::is_string<T>::value, ParameterIndex>
-        toIndex(T const& arg)
-    {
+        toIndex(T const& arg) {
         return findParameterIndex(arg);
     }
     template <typename T>
     inline std::enable_if_t<!fmt::v8::detail::is_string<T>::value, ParameterIndex>
         toIndex(T const& arg) = delete;
     template <>
-    inline ParameterIndex toIndex(ParameterIndex const& arg)
-    {
+    inline ParameterIndex toIndex(ParameterIndex const& arg) {
         return arg;
     }
     template <>
-    inline ParameterIndex toIndex(DynamicCommand::ParameterData const& arg)
-    {
+    inline ParameterIndex toIndex(DynamicCommand::ParameterData const& arg) {
         return newParameter(DynamicCommand::ParameterData(arg));
     }
     template <typename... Args>
-    inline bool addOverload(Args const&... args)
-    {
+    inline bool addOverload(Args const&... args) {
         return addOverload(std::vector<ParameterIndex>{toIndex(args)...});
     }
 
     template <typename T>
-    inline bool addOverload(std::initializer_list<T>&& params)
-    {
+    inline bool addOverload(std::initializer_list<T>&& params) {
         return addOverload((std::vector<T>)params);
     }
     LIAPI std::string const& getCommandName() const;
-    inline ParameterIndex newParameter(std::string const& name, DynamicCommand::ParameterType type, const char* description, std::string const& identifier, CommandParameterOption parameterOption = (CommandParameterOption)0)
-    {
+    inline ParameterIndex newParameter(std::string const& name, DynamicCommand::ParameterType type, const char* description, std::string const& identifier, CommandParameterOption parameterOption = (CommandParameterOption)0) {
         return newParameter(name, type, false, (std::string const&)description, identifier, parameterOption);
     };
-    inline bool hasRegistered() const
-    {
+    inline bool hasRegistered() const {
         return DynamicCommand::getInstance(getCommandName()) != nullptr;
     };
     inline void onExecute(DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output) const {
diff --git a/LiteLoader/Header/EventAPI.h b/LiteLoader/Header/EventAPI.h
--- a/LiteLoader/Header/EventAPI.h
+++ b/LiteLoader/Header/EventAPI.h
@@ -59,39 +59,36 @@ class ArmorStand;
 class Objective;
 struct ScoreboardId;
 
-namespace Event
-{
+namespace Event {
 ///////////////////////////// Impl /////////////////////////////
 
 constexpr bool Ok = true;
 constexpr bool Cancel = false;
 
-template<typename EVENT>
-class EventManager
-{
+template <typename EVENT>
+class EventManager {
 public:
     LIAPI static int addEventListener(std::string name, std::function<bool(EVENT)> callback);
     LIAPI static int addEventListenerRef(std::string name, std::function<bool(EVENT&)> callback);
     LIAPI static bool removeEventListener(int id);
     LIAPI static bool hasListener();
-    LIAPI static bool call(EVENT &ev);
+    LIAPI static bool call(EVENT& ev);
     LIAPI static bool callToPlugin(std::string pluginName, EVENT& ev);
 };
 
 template <typename EVENT>
-class EventListener
-{
+class EventListener {
 private:
     int listenerId;
     bool deleted = false;
 
 public:
-    EventListener(int id) : listenerId(id) {}
+    EventListener(int id)
+    : listenerId(id) {
+    }
 
-    void remove()
-    {
-        if (!deleted)
-        {
+    void remove() {
+        if (!deleted) {
             deleted = true;
             EventManager<EVENT>::removeEventListener(listenerId);
         }
@@ -99,26 +96,31 @@ class EventListener
 };
 
 template <typename EVENT>
-class EventTemplate
-{
+class EventTemplate {
 public:
-    static EventListener<EVENT> subscribe(std::function<bool(EVENT)> callback)
-    {
+    static EventListener<EVENT> subscribe(std::function<bool(EVENT)> callback) {
         auto plugin = LL::getPlugin(GetCurrentModule());
         return EventListener<EVENT>(EventManager<EVENT>::addEventListener(plugin ? plugin->name : "", callback));
     }
 
-    static EventListener<EVENT> subscribe_ref(std::function<bool(EVENT&)> callback)
-    {
+    static EventListener<EVENT> subscribe_ref(std::function<bool(EVENT&)> callback) {
         auto plugin = LL::getPlugin(GetCurrentModule());
         return EventListener<EVENT>(EventManager<EVENT>::addEventListenerRef(plugin ? plugin->name : "", callback));
     }
 
-    static void unsubscribe(const EventListener<EVENT>& listener) { listener.remove(); }
-    static bool hasListener() { return EventManager<EVENT>::hasListener(); }
+    static void unsubscribe(const EventListener<EVENT>& listener) {
+        listener.remove();
+    }
+    static bool hasListener() {
+        return EventManager<EVENT>::hasListener();
+    }
 
-    bool call() { return EventManager<EVENT>::call(*(EVENT*)this); }
-    bool callToPlugin(std::string pluginName) { return EventManager<EVENT>::callToPlugin(pluginName, *(EVENT*)this); }
+    bool call() {
+        return EventManager<EVENT>::call(*(EVENT*)this);
+    }
+    bool callToPlugin(std::string pluginName) {
+        return EventManager<EVENT>::callToPlugin(pluginName, *(EVENT*)this);
+    }
 
 
     ////////////////////// For compatibility DO NOT UPDATE //////////////////////
@@ -132,42 +134,36 @@ class EventTemplate
 
 ///////////////////////////// Player Events /////////////////////////////
 
-class PlayerPreJoinEvent : public EventTemplate<PlayerPreJoinEvent>
-{
+class PlayerPreJoinEvent : public EventTemplate<PlayerPreJoinEvent> {
 public:
     Player* mPlayer;
     string mIP;
     string mXUID;
 };
 
-class PlayerJoinEvent : public EventTemplate<PlayerJoinEvent>
-{
+class PlayerJoinEvent : public EventTemplate<PlayerJoinEvent> {
 public:
     Player* mPlayer;
 };
 
-class PlayerLeftEvent : public EventTemplate<PlayerLeftEvent>
-{
+class PlayerLeftEvent : public EventTemplate<PlayerLeftEvent> {
 public:
     Player* mPlayer;
     string mXUID;
 };
 
-class PlayerRespawnEvent : public EventTemplate<PlayerRespawnEvent>
-{
+class PlayerRespawnEvent : public EventTemplate<PlayerRespawnEvent> {
 public:
     Player* mPlayer;
 };
 
-class PlayerUseItemEvent : public EventTemplate<PlayerUseItemEvent>
-{
+class PlayerUseItemEvent : public EventTemplate<PlayerUseItemEvent> {
 public:
     Player* mPlayer;
     ItemStack* mItemStack;
 };
 
-class PlayerUseItemOnEvent : public EventTemplate<PlayerUseItemOnEvent>
-{
+class PlayerUseItemOnEvent : public EventTemplate<PlayerUseItemOnEvent> {
 public:
     Player* mPlayer;
     ItemStack* mItemStack;
@@ -176,104 +172,89 @@ class PlayerUseItemOnEvent : public EventTemplate<PlayerUseItemOnEvent>
     Vec3 mClickPos;
 };
 
-class PlayerChatEvent : public EventTemplate<PlayerChatEvent>
-{
+class PlayerChatEvent : public EventTemplate<PlayerChatEvent> {
 public:
     Player* mPlayer;
     string mMessage;
 };
 
-class PlayerChangeDimEvent : public EventTemplate<PlayerChangeDimEvent>
-{
+class PlayerChangeDimEvent : public EventTemplate<PlayerChangeDimEvent> {
 public:
     Player* mPlayer;
     int mToDimensionId;
 };
 
-class PlayerJumpEvent : public EventTemplate<PlayerJumpEvent>
-{
+class PlayerJumpEvent : public EventTemplate<PlayerJumpEvent> {
 public:
     Player* mPlayer;
 };
 
-class EntityTransformEvent : public EventTemplate<EntityTransformEvent>
-{
+class EntityTransformEvent : public EventTemplate<EntityTransformEvent> {
 public:
     ActorUniqueID* mBeforeEntityUniqueId;
     Actor* mAfterEntity;
 };
 
-class PlayerSneakEvent : public EventTemplate<PlayerSneakEvent>
-{
+class PlayerSneakEvent : public EventTemplate<PlayerSneakEvent> {
 public:
     Player* mPlayer;
     bool mIsSneaking;
 };
 
-class PlayerAttackEvent : public EventTemplate<PlayerAttackEvent>
-{
+class PlayerAttackEvent : public EventTemplate<PlayerAttackEvent> {
 public:
     Player* mPlayer;
     Actor* mTarget;
     int mAttackDamage;
 };
 
-class PlayerAttackBlockEvent : public EventTemplate<PlayerAttackBlockEvent>
-{
+class PlayerAttackBlockEvent : public EventTemplate<PlayerAttackBlockEvent> {
 public:
     Player* mPlayer;
     ItemStack* mItemStack;
     BlockInstance mBlockInstance;
 };
 
-class PlayerDieEvent : public EventTemplate<PlayerDieEvent>
-{
+class PlayerDieEvent : public EventTemplate<PlayerDieEvent> {
 public:
     Player* mPlayer;
     ActorDamageSource* mDamageSource;
 };
 
-class PlayerPickupItemEvent : public EventTemplate<PlayerPickupItemEvent>
-{
+class PlayerPickupItemEvent : public EventTemplate<PlayerPickupItemEvent> {
 public:
     Player* mPlayer;
     Actor* mItemEntity;
     ItemStack* mItemStack;
 };
 
-class PlayerDropItemEvent : public EventTemplate<PlayerDropItemEvent>
-{
+class PlayerDropItemEvent : public EventTemplate<PlayerDropItemEvent> {
 public:
     Player* mPlayer;
     ItemStack* mItemStack;
 };
 
-class PlayerEatEvent : public EventTemplate<PlayerEatEvent>
-{
+class PlayerEatEvent : public EventTemplate<PlayerEatEvent> {
 public:
     Player* mPlayer;
     ItemStack* mFoodItem;
 };
 
-class PlayerConsumeTotemEvent : public EventTemplate<PlayerConsumeTotemEvent>
-{
+class PlayerConsumeTotemEvent : public EventTemplate<PlayerConsumeTotemEvent> {
 public:
     Player* mPlayer;
 };
 
-class PlayerCmdEvent : public EventTemplate<PlayerCmdEvent>
-{
+class PlayerCmdEvent : public EventTemplate<PlayerCmdEvent> {
 public:
     Player* mPlayer;
     string mCommand;
     MCRESULT* mResult;
 };
 
-class PlayerEffectChangedEvent : public EventTemplate<PlayerEffectChangedEvent>
-{
+class PlayerEffectChangedEvent : public EventTemplate<PlayerEffectChangedEvent> {
 public:
-    enum class EventType
-    {
+    enum class EventType {
         Add,
         Remove,
         Update
@@ -283,45 +264,45 @@ class PlayerEffectChangedEvent : public EventTemplate<PlayerEffectChangedEvent>
     MobEffectInstance* mEffect;
 };
 
-class PlayerStartDestroyBlockEvent : public EventTemplate<PlayerStartDestroyBlockEvent>
-{
+class PlayerStartDestroyBlockEvent : public EventTemplate<PlayerStartDestroyBlockEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
 };
 
-class PlayerDestroyBlockEvent : public EventTemplate<PlayerDestroyBlockEvent>
-{
+class PlayerDestroyBlockEvent : public EventTemplate<PlayerDestroyBlockEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
 };
 
-class PlayerPlaceBlockEvent : public EventTemplate<PlayerPlaceBlockEvent>
-{
+class PlayerPlaceBlockEvent : public EventTemplate<PlayerPlaceBlockEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
 };
 
-class PlayerOpenContainerEvent : public EventTemplate<PlayerOpenContainerEvent>
-{
+class BlockPlacedByPlayerEvent : public EventTemplate<BlockPlacedByPlayerEvent> {
+public:
+    Player* mPlayer;
+    BlockInstance mBlockInstance;
+};
+
+class PlayerOpenContainerEvent : public EventTemplate<PlayerOpenContainerEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
     Container* mContainer;
 };
 
-class PlayerCloseContainerEvent : public EventTemplate<PlayerCloseContainerEvent>
-{
+class PlayerCloseContainerEvent : public EventTemplate<PlayerCloseContainerEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
     Container* mContainer;
 };
 
-class PlayerInventoryChangeEvent : public EventTemplate<PlayerInventoryChangeEvent>
-{
+class PlayerInventoryChangeEvent : public EventTemplate<PlayerInventoryChangeEvent> {
 public:
     Player* mPlayer;
     int mSlot;
@@ -329,46 +310,39 @@ class PlayerInventoryChangeEvent : public EventTemplate<PlayerInventoryChangeEve
     ItemStack* mNewItemStack;
 };
 
-class PlayerMoveEvent : public EventTemplate<PlayerMoveEvent>
-{
+class PlayerMoveEvent : public EventTemplate<PlayerMoveEvent> {
 public:
     Player* mPlayer;
     Vec3 mPos;
 };
 
-class PlayerSprintEvent : public EventTemplate<PlayerSprintEvent>
-{
+class PlayerSprintEvent : public EventTemplate<PlayerSprintEvent> {
 public:
     Player* mPlayer;
     bool mIsSprinting;
 };
 
-class PlayerSetArmorEvent : public EventTemplate<PlayerSetArmorEvent>
-{
+class PlayerSetArmorEvent : public EventTemplate<PlayerSetArmorEvent> {
 public:
     Player* mPlayer;
     int mSlot;
     ItemStack* mArmorItem;
 };
 
-class PlayerUseRespawnAnchorEvent : public EventTemplate<PlayerUseRespawnAnchorEvent>
-{
+class PlayerUseRespawnAnchorEvent : public EventTemplate<PlayerUseRespawnAnchorEvent> {
 public:
     Player* mPlayer;
     BlockInstance mBlockInstance;
 };
 
-class PlayerOpenContainerScreenEvent : public EventTemplate<PlayerOpenContainerScreenEvent>
-{
+class PlayerOpenContainerScreenEvent : public EventTemplate<PlayerOpenContainerScreenEvent> {
 public:
     Player* mPlayer;
 };
 
-class PlayerUseFrameBlockEvent : public EventTemplate<PlayerUseFrameBlockEvent>
-{
+class PlayerUseFrameBlockEvent : public EventTemplate<PlayerUseFrameBlockEvent> {
 public:
-    enum class Type
-    {
+    enum class Type {
         Use,
         Attack
     };
@@ -377,8 +351,7 @@ class PlayerUseFrameBlockEvent : public EventTemplate<PlayerUseFrameBlockEvent>
     BlockInstance mBlockInstance;
 };
 
-class PlayerScoreChangedEvent : public EventTemplate<PlayerScoreChangedEvent>
-{
+class PlayerScoreChangedEvent : public EventTemplate<PlayerScoreChangedEvent> {
 public:
     Player* mPlayer;
     int mScore;
@@ -386,8 +359,7 @@ class PlayerScoreChangedEvent : public EventTemplate<PlayerScoreChangedEvent>
     ScoreboardId* mScoreboardId;
 };
 
-class PlayerExperienceAddEvent : public EventTemplate<PlayerExperienceAddEvent>
-{
+class PlayerExperienceAddEvent : public EventTemplate<PlayerExperienceAddEvent> {
 public:
     Player* mPlayer;
     int mExp;
@@ -396,36 +368,31 @@ class PlayerExperienceAddEvent : public EventTemplate<PlayerExperienceAddEvent>
 
 ///////////////////////////// Block Events /////////////////////////////
 
-class BlockInteractedEvent : public EventTemplate<BlockInteractedEvent>
-{
+class BlockInteractedEvent : public EventTemplate<BlockInteractedEvent> {
 public:
     BlockInstance mBlockInstance;
     Player* mPlayer;
 };
 
-class BlockChangedEvent : public EventTemplate<BlockChangedEvent>
-{
+class BlockChangedEvent : public EventTemplate<BlockChangedEvent> {
 public:
     BlockInstance mPreviousBlockInstance;
     BlockInstance mNewBlockInstance;
 };
 
-class BlockExplodedEvent : public EventTemplate<BlockExplodedEvent>
-{
+class BlockExplodedEvent : public EventTemplate<BlockExplodedEvent> {
 public:
     BlockInstance mBlockInstance;
     Actor* mExplodeSource;
 };
 
-class FireSpreadEvent : public EventTemplate<FireSpreadEvent>
-{
+class FireSpreadEvent : public EventTemplate<FireSpreadEvent> {
 public:
     BlockPos mTarget;
     int mDimensionId;
 };
 
-class ContainerChangeEvent : public EventTemplate<ContainerChangeEvent>
-{
+class ContainerChangeEvent : public EventTemplate<ContainerChangeEvent> {
 public:
     Player* mPlayer;
     Actor* mActor;
@@ -436,23 +403,20 @@ class ContainerChangeEvent : public EventTemplate<ContainerChangeEvent>
     ItemStack* mNewItemStack;
 };
 
-class ProjectileHitBlockEvent : public EventTemplate<ProjectileHitBlockEvent>
-{
+class ProjectileHitBlockEvent : public EventTemplate<ProjectileHitBlockEvent> {
 public:
     BlockInstance mBlockInstance;
     Actor* mSource;
 };
 
-class RedStoneUpdateEvent : public EventTemplate<RedStoneUpdateEvent>
-{
+class RedStoneUpdateEvent : public EventTemplate<RedStoneUpdateEvent> {
 public:
     BlockInstance mBlockInstance;
     int mRedStonePower;
     bool mIsActivated;
 };
 
-class HopperSearchItemEvent : public EventTemplate<HopperSearchItemEvent>
-{
+class HopperSearchItemEvent : public EventTemplate<HopperSearchItemEvent> {
 public:
     bool isMinecart;
     BlockInstance mHopperBlock;
@@ -460,44 +424,38 @@ class HopperSearchItemEvent : public EventTemplate<HopperSearchItemEvent>
     int mDimensionId;
 };
 
-class HopperPushOutEvent : public EventTemplate<HopperPushOutEvent>
-{
+class HopperPushOutEvent : public EventTemplate<HopperPushOutEvent> {
 public:
     Vec3 mPos;
     int mDimensionId;
 };
 
-class PistonTryPushEvent : public EventTemplate<PistonTryPushEvent>
-{
+class PistonTryPushEvent : public EventTemplate<PistonTryPushEvent> {
 public:
     BlockInstance mPistonBlockInstance;
     BlockInstance mTargetBlockInstance;
 };
 
-class PistonPushEvent : public EventTemplate<PistonPushEvent>
-{
+class PistonPushEvent : public EventTemplate<PistonPushEvent> {
 public:
     BlockInstance mPistonBlockInstance;
     BlockInstance mTargetBlockInstance;
 };
 
-class FarmLandDecayEvent : public EventTemplate<FarmLandDecayEvent>
-{
+class FarmLandDecayEvent : public EventTemplate<FarmLandDecayEvent> {
 public:
     BlockInstance mBlockInstance;
     Actor* mActor;
 };
 
-class LiquidSpreadEvent : public EventTemplate<LiquidSpreadEvent>
-{
+class LiquidSpreadEvent : public EventTemplate<LiquidSpreadEvent> {
 public:
     BlockInstance mBlockInstance;
     BlockPos mTarget;
     int mDimensionId;
 };
 
-class CmdBlockExecuteEvent : public EventTemplate<CmdBlockExecuteEvent>
-{
+class CmdBlockExecuteEvent : public EventTemplate<CmdBlockExecuteEvent> {
 public:
     string mCommand;
     bool mIsMinecart;
@@ -505,8 +463,7 @@ class CmdBlockExecuteEvent : public EventTemplate<CmdBlockExecuteEvent>
     Actor* mMinecart;
 };
 
-class BlockExplodeEvent : public EventTemplate<BlockExplodeEvent>
-{
+class BlockExplodeEvent : public EventTemplate<BlockExplodeEvent> {
 public:
     BlockInstance mBlockInstance;
     float mRadius;
@@ -518,8 +475,7 @@ class BlockExplodeEvent : public EventTemplate<BlockExplodeEvent>
 
 ///////////////////////////// Entity Events /////////////////////////////
 
-class EntityExplodeEvent : public EventTemplate<EntityExplodeEvent>
-{
+class EntityExplodeEvent : public EventTemplate<EntityExplodeEvent> {
 public:
     Actor* mActor;
     Vec3 mPos;
@@ -530,82 +486,71 @@ class EntityExplodeEvent : public EventTemplate<EntityExplodeEvent>
     bool mFire;
 };
 
-class MobHurtEvent : public EventTemplate<MobHurtEvent>
-{
+class MobHurtEvent : public EventTemplate<MobHurtEvent> {
 public:
     Mob* mMob;
     ActorDamageSource* mDamageSource;
     float mDamage;
 };
 
-class MobDieEvent : public EventTemplate<MobDieEvent>
-{
+class MobDieEvent : public EventTemplate<MobDieEvent> {
 public:
     Mob* mMob;
     ActorDamageSource* mDamageSource;
 };
 
-class ProjectileHitEntityEvent : public EventTemplate<ProjectileHitEntityEvent>
-{
+class ProjectileHitEntityEvent : public EventTemplate<ProjectileHitEntityEvent> {
 public:
     Actor* mTarget;
     Actor* mSource;
 };
 
-class WitherBossDestroyEvent : public EventTemplate<WitherBossDestroyEvent>
-{
+class WitherBossDestroyEvent : public EventTemplate<WitherBossDestroyEvent> {
 public:
     WitherBoss* mWitherBoss;
     AABB mDestroyRange = {{}, {}};
 };
 
-class EntityRideEvent : public EventTemplate<EntityRideEvent>
-{
+class EntityRideEvent : public EventTemplate<EntityRideEvent> {
 public:
     Actor* mRider;
     Actor* mVehicle;
 };
 
-class EntityStepOnPressurePlateEvent : public EventTemplate<EntityStepOnPressurePlateEvent>
-{
+class EntityStepOnPressurePlateEvent : public EventTemplate<EntityStepOnPressurePlateEvent> {
 public:
     Actor* mActor;
     BlockInstance mBlockInstance;
 };
 
-class NpcCmdEvent : public EventTemplate<NpcCmdEvent>
-{
+class NpcCmdEvent : public EventTemplate<NpcCmdEvent> {
 public:
     Actor* mNpc;
     std::string mCommand;
     Player* mPlayer;
 };
 
-class ProjectileSpawnEvent : public EventTemplate<ProjectileSpawnEvent>
-{
+class ProjectileSpawnEvent : public EventTemplate<ProjectileSpawnEvent> {
 public:
     Actor* mShooter;
     ActorDefinitionIdentifier* mIdentifier;
     std::string mType;
 };
 
-class ProjectileCreatedEvent : public EventTemplate<ProjectileCreatedEvent>
-{
+class ProjectileCreatedEvent : public EventTemplate<ProjectileCreatedEvent> {
 public:
     Actor* mShooter;
     Actor* mProjectile;
 };
 
-class ArmorStandChangeEvent : public EventTemplate<ArmorStandChangeEvent>
-{
+class ArmorStandChangeEvent : public EventTemplate<ArmorStandChangeEvent> {
 public:
     ArmorStand* mArmorStand;
     Player* mPlayer;
     int mSlot;
 };
 
-class ItemUseOnActorEvent : public EventTemplate<ItemUseOnActorEvent>
-{
+class ItemUseOnActorEvent : public EventTemplate<ItemUseOnActorEvent> {
 public:
     ActorRuntimeID mTarget;
     int mInteractiveMode;
@@ -613,48 +558,43 @@ class ItemUseOnActorEvent : public EventTemplate<ItemUseOnActorEvent>
 
 ///////////////////////////// Other Events /////////////////////////////
 
-class PostInitEvent : public EventTemplate<PostInitEvent>
-{
+class PostInitEvent : public EventTemplate<PostInitEvent> {
 };
 
-class ServerStartedEvent : public EventTemplate<ServerStartedEvent>
-{
+class ServerStartedEvent : public EventTemplate<ServerStartedEvent> {
 };
 
-class ServerStoppedEvent : public EventTemplate<ServerStoppedEvent>
-{
+class ServerStoppedEvent : public EventTemplate<ServerStoppedEvent> {
 };
 
-class ConsoleCmdEvent : public EventTemplate<ConsoleCmdEvent>
-{
+class ConsoleCmdEvent : public EventTemplate<ConsoleCmdEvent> {
 public:
     std::string mCommand;
 };
 
-class RegCmdEvent : public EventTemplate<RegCmdEvent>
-{
+class RegCmdEvent : public EventTemplate<RegCmdEvent> {
 public:
     CommandRegistry* mCommandRegistry;
 };
 
-class ConsoleOutputEvent : public EventTemplate<ConsoleOutputEvent>
-{
+class ConsoleOutputEvent : public EventTemplate<ConsoleOutputEvent> {
 public:
     std::string mOutput;
 };
-    
-class PlayerBedEnterEvent : public EventTemplate<PlayerBedEnterEvent>
-{
+
+class PlayerBedEnterEvent : public EventTemplate<PlayerBedEnterEvent> {
 public:
     Player* mPlayer;
     BlockInstance* mBlockInstance;
 };
 
-class ScriptPluginManagerEvent : public EventTemplate<ScriptPluginManagerEvent>
-{
+class ScriptPluginManagerEvent : public EventTemplate<ScriptPluginManagerEvent> {
 public:
-    enum class Operation
-    { Load, Unload, Reload };
+    enum class Operation {
+        Load,
+        Unload,
+        Reload
+    };
 
     Operation operation;
     std::string target;
@@ -664,13 +604,11 @@ class ScriptPluginManagerEvent : public EventTemplate<ScriptPluginManagerEvent>
     bool success = false;
 };
 
-class MobSpawnEvent : public EventTemplate<MobSpawnEvent>
-{
+class MobSpawnEvent : public EventTemplate<MobSpawnEvent> {
 public:
     string mTypeName;
     Vec3 mPos;
     int mDimensionId;
-	
 };
 
 }; // namespace Event
diff --git a/LiteLoader/Header/FormUI.h b/LiteLoader/Header/FormUI.h
--- a/LiteLoader/Header/FormUI.h
+++ b/LiteLoader/Header/FormUI.h
@@ -4,11 +4,11 @@
 //
 //  [Example - Simple Form]
 //  - Form that contains several buttons (with optional image)
-//  - Let the player to choose one option
+//  - Let the player choose an option from multiple options
 //
 //  SimpleForm form("Welcome to shop", "Choose what you want to do...");     // Initialize the form with title and content
 //  form.addButton("Buy", "textures/items/apple",                            // Add a button "Buy" with texture image
-//      [](Player* pl) { pl->sendText("To buy something..."); })			 // Buy's callback function
+//      [](Player* pl) { pl->sendText("To buy something..."); })             // Buy's callback function
 //
 //      .addButton("Sell", "https://xxx.com/xxx.png",                        // Add a button "Sell" with online image
 //          [](Player* pl) { pl->sendText("To sell something..."); })        // Sell's callback function
@@ -16,35 +16,50 @@
 //      .addButton("Settings", "",                                           // Add a button "Settings" with no image
 //          [](Player* pl) { pl->sendText("Get into settings..."); })        // Settings's callback function
 //
-//      .addButton("Exit")                                                   // Add a single button "Exit" 
-//      .sendTo(Level::getPlayer("John"));                   // Send the form to a player called "Jim"
+//      .addButton("Exit")                                                   // Add a single button "Exit"
+//      .sendTo(Level::getPlayer("John"));                                   // Send the form to a player called "John"
+//
+//
+//  [Example - Modal Form]
+//  - Form with Confirm and Cancel buttons
+//  - Let the player confirm or cancel an action
+//
+//  ModalForm form("Confirm the action", "Do you want that?", "Yes", "Nope");     // Initialize the form with title, content and two buttons ("Yes", "Nope")
+//  form.sendTo(Level::getPlayer("S3v3N1ce"),                                     // Send the form to a player called "S3v3N1ce"
+//      [](Player* player, bool isConfirm)                                        // Callback function to process the result
+//          {
+//              if (isConfirm)                                                    // Player pressed button "Yes"
+//                  player->sendText("Okay, let's go");
+//              else                                                              // Player pressed button "Nope"
+//                  player->sendText("Hm, suit yourself");
+//          });                                    
 //
 //
 //  [Example - Custom Form]
 //  - Form that contains some kinds of elements (like input line, toggle, dropdown, ....)
-//  - Let the player to provide some detailed information
+//  - Let the player provide some detailed information
 //
-//  CustomForm form2("Information Collection Form");                            // Initialize the form with title
-//  form2.addLabel("label1", "Personal Information")                            // Add a label shows "Personal Information"
-//      .addInput("username", "Your Name")                                      // Add an input line to gather player's name
-//      .addDropdown("sex", "Your Sex", { "Male","Female","Secret" })           // Add a dropdown to gather player's sex
-//      .addSlider("age", "Your Age", 3, 100)                                   // Add a slider to gather player's age
-//  
-//      .addLabel("label2", "MC Information")                                   // Add a label shows "MC Information"
-//      .addToggle("licensed", "Purchased a licensed Minecraft?", true)         // Add a toggle about whether he buys a licensed mc or not
-//      .addStepSlider("ability", "MC Ability", { "Beginner", "Experienced", "Master" })      // Add a step slider shows his game ability
-//  
-//      .sendTo(Level::getPlayer("yqs112358"),                                  // Send the form to a player called "John"
-//          [](Player* player, auto result)                                     // Callback function to process the result
+//  CustomForm form2("Information Collection Form");                               // Initialize the form with title
+//  form2.addLabel("label1", "Personal Information")                               // Add a label shows "Personal Information"
+//      .addInput("username", "Your Name")                                         // Add an input line to gather player's name
+//      .addDropdown("sex", "Your Sex", { "Male","Female","Secret" })              // Add a dropdown to gather player's sex
+//      .addSlider("age", "Your Age", 3, 100)                                      // Add a slider to gather player's age
+//
+//      .addLabel("label2", "MC Information")                                      // Add a label shows "MC Information"
+//      .addToggle("licensed", "Purchased a licensed Minecraft?", true)            // Add a toggle about whether he buys a licensed mc or not
+//      .addStepSlider("skill", "Skill Lvl", { "Beginner", "Amateur", "Pro" })     // Add a step slider shows his game skill level
+//
+//      .sendTo(Level::getPlayer("yqs112358"),                                     // Send the form to a player called "yqs112358"
+//          [](Player* player, auto result)                                        // Callback function to process the result
 //          {
-//              if (result.empty())                                             // He cancelled the form
+//              if (result.empty())                                                // Player cancelled the form
 //                  return;
 //              player->sendText("You have commited the form.");
 //              player->sendFormattedText("Your name: {}", result["username"]->getString());
 //              player->sendFormattedText("Your sex: {}", result["sex"]->getString());
 //              player->sendFormattedText("Your age: {}", result["age"]->getNumber());
 //              player->sendFormattedText("Your license: {}", result["licensed"]->getBool() ? "yes" : "no");
-//              player->sendFormattedText("Your ability: {}:", result["ability"]->getString());
+//              player->sendFormattedText("Your skill level: {}:", result["skill"]->getString());
 //          });
 //
 //
@@ -61,386 +76,357 @@ class ServerPlayer;
 class Player;
 
 
-namespace Form
-{
+namespace Form {
 //////////////////////////////// Simple Form Elements ////////////////////////////////
-    class SimpleFormElement
-    {
-    protected:
-        virtual string serialize() = 0;
-        friend class SimpleForm;
-    };
-
-    class Button : public SimpleFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        using ButtonCallback = std::function<void(Player*)>;
-        string text, image;
-        ButtonCallback callback;
-
-    public:
-        inline explicit Button(string text, string image = "", ButtonCallback callback = ButtonCallback())
-            : text(std::move(text))
-            , image(std::move(image))
-            , callback(std::move(callback))
-        {
-        }
-        inline void setText(const string& _text)
-        {
-            this->text = _text;
-        }
-        inline void setImage(const string& _image)
-        {
-            this->image = _image;
-        }
-        inline void setCallback(ButtonCallback _callback)
-        {
-            this->callback = std::move(_callback);
-        }
-    };
-
-    //////////////////////////////// Custom Form Elements ////////////////////////////////
-    class CustomFormElement
-    {
-    protected:
-        LIAPI virtual string serialize() = 0;
-        friend class CustomForm;
-
-    public:
-        enum class Type
-        {
-            Label,
-            Input,
-            Toggle,
-            Dropdown,
-            Slider,
-            StepSlider
-        };
-        string name;
-        string value;
-        Type type{};
-        inline void setName(const string& _name)
-        {
-            this->name = _name;
-        }
-        inline virtual Type getType() = 0;
-        LIAPI std::string getString();
-        LIAPI int getNumber();
-        LIAPI bool getBool();
-    };
-
-    class Label : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        string text;
-
-    public:
-        inline Label(const string& name, string text)
-            : text(std::move(text))
-        {
-            setName(name);
-        }
-        inline Type getType() override
-        {
-            return Type::Label;
-        }
-        inline void setText(const string& _text)
-        {
-            this->text = _text;
-        }
-    };
-
-    class Input : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        string title, placeholder, def;
-        inline Input(const string& name, string title, string placeholder = "", string def = "")
-            : title(std::move(title))
-            , placeholder(std::move(placeholder))
-            , def(std::move(def))
-        {
-            setName(name);
-        }
-        inline Type getType() override
-        {
-            return Type::Input;
-        }
-        inline void setTitle(const string& _title)
-        {
-            this->title = _title;
-        }
-        inline void setPlaceHolder(const string& _placeholder)
-        {
-            this->placeholder = _placeholder;
-        }
-        inline void setDefault(const string& _def)
-        {
-            this->def = _def;
-        }
-    };
-
-    class Toggle : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-    public:
-        string title;
-        bool def;
-
-    public:
-        inline Toggle(const string& name, string title, bool def = false)
-            : title(std::move(title))
-            , def(def)
-        {
-            setName(name);
-        }
-        inline virtual Type getType() override
-        {
-            return Type::Toggle;
-        }
-        inline void setTitle(const string& _title)
-        {
-            this->title = _title;
-        }
-        inline void setDefault(bool _def)
-        {
-            this->def = _def;
-        }
-    };
-
-    class Dropdown : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        string title;
-        vector<string> options;
-        int def;
-
-    public:
-        inline Dropdown(const string& name, string title, const vector<string>& options, int defId = 0)
-            : title(std::move(title))
-            , options(options)
-            , def(defId)
-        {
-            setName(name);
-        }
-        inline Type getType() override
-        {
-            return Type::Dropdown;
-        }
-        inline void setTitle(const string& _title)
-        {
-            this->title = _title;
-        }
-        inline void setOptions(const vector<string>& _options)
-        {
-            this->options = _options;
-        }
-        inline void addOption(const string& option)
-        {
-            options.push_back(option);
-        }
-        inline void setDefault(int defId)
-        {
-            this->def = defId;
-        }
-    };
-
-    class Slider : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        string title;
-        int minValue, maxValue, step, def;
-
-    public:
-        inline Slider(const string& name, string title, int minValue, int maxValue, int step = 1, int def = 0)
-            : title(std::move(title))
-            , minValue(minValue)
-            , maxValue(maxValue)
-            , step(step)
-            , def(def)
-        {
-            setName(name);
-        }
-        inline Type getType() override
-        {
-            return Type::Slider;
-        }
-        inline void setTitle(const string& _title)
-        {
-            this->title = _title;
-        }
-        inline void setMin(int _minValue)
-        {
-            this->minValue = _minValue;
-        }
-        inline void setMax(int _maxValue)
-        {
-            this->maxValue = _maxValue;
-        }
-        inline void setStep(int _step)
-        {
-            this->step = _step;
-        }
-        inline void setDefault(int _def)
-        {
-            this->def = _def;
-        }
-    };
-
-    class StepSlider : public CustomFormElement
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        string title;
-        vector<string> options;
-        int def;
-
-    public:
-        inline StepSlider(const string& name, string title, const vector<string>& options, int defId = 0)
-            : title(std::move(title))
-            , options(options)
-            , def(defId)
-        {
-            setName(name);
-        }
-        inline Type getType() override
-        {
-            return Type::StepSlider;
-        }
-        inline void setTitle(const string& _title)
-        {
-            this->title = _title;
-        }
-        inline void setOptions(const vector<string>& _options)
-        {
-            this->options = _options;
-        }
-        inline void addOption(const string& option)
-        {
-            options.push_back(option);
-        }
-        inline void setDefault(int defId)
-        {
-            this->def = defId;
-        }
-    };
-
-    //////////////////////////////// Forms ////////////////////////////////
-    class FormImpl
-    {
-    protected:
-        //fifo_json json;
-        virtual string serialize() = 0;
-    };
-
-    class SimpleForm : public FormImpl
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        using Callback = std::function<void(Player*, int)>;
-        string title, content;
-        vector<std::shared_ptr<SimpleFormElement>> elements;
-        Callback callback;
-
-    public:
-        SimpleForm(string title, string content)
-            : title(std::move(title))
-            , content(std::move(content))
-        {
-        }
-        template <typename T, typename... Args>
-        SimpleForm(const string& title, const string& content, T element, Args... args)
-        {
-            append(element);
-            SimpleForm(title, content, args...);
-        }
-        LIAPI SimpleForm& setTitle(const string& title);
-        LIAPI SimpleForm& setContent(const string& content);
-        LIAPI SimpleForm& addButton(string text, string image = "", Button::ButtonCallback callback = Button::ButtonCallback());
-        LIAPI SimpleForm& append(const Button& element);
-        LIAPI bool sendTo(Player* player, Callback callback = Callback());
-    };
-
-    class CustomForm : public FormImpl
-    {
-    protected:
-        LIAPI string serialize() override;
-
-    public:
-        using Callback = std::function<void(Player*, std::map<string, std::shared_ptr<CustomFormElement>>)>;
-        using Callback2 = std::function<void(Player*, std::string)>;
-        string title;
-        std::vector<std::pair<string, std::shared_ptr<CustomFormElement>>> elements;
-        Callback callback;
-
-    public:
-        explicit CustomForm(string title)
-            : title(std::move(title))
-        {
-        }
-        template <typename T, typename... Args>
-        CustomForm(const string& title, T element, Args... args)
-        {
-            append(element);
-            CustomForm(title, args...);
-        }
-        LIAPI CustomForm& setTitle(const string& title);
-
-        LIAPI CustomForm& addLabel(const string& name, string text);
-        LIAPI CustomForm& addInput(const string& name, string title, string placeholder = "", string def = "");
-        LIAPI CustomForm& addToggle(const string& name, string title, bool def = false);
-        LIAPI CustomForm& addDropdown(const string& name, string title, const vector<string>& options, int defId = 0);
-        LIAPI CustomForm& addSlider(const string& name, string title, int min, int max, int step = 1, int def = 0);
-        LIAPI CustomForm& addStepSlider(const string& name, string title, const vector<string>& options, int defId = 0);
-
-        LIAPI CustomForm& append(const Label& element);
-        LIAPI CustomForm& append(const Input& element);
-        LIAPI CustomForm& append(const Toggle& element);
-        LIAPI CustomForm& append(const Dropdown& element);
-        LIAPI CustomForm& append(const Slider& element);
-        LIAPI CustomForm& append(const StepSlider& element);
-
-        LIAPI bool sendTo(Player* player, Callback callback);
-        LIAPI bool sendToForRawJson(Player* player, Callback2 callback);
-        LIAPI CustomFormElement::Type getType(int index);
-
-        LIAPI string getString(const string& name);
-        LIAPI int getNumber(const string& name);
-        LIAPI bool getBool(const string& name);
-        LIAPI string getString(int index);
-        LIAPI int getNumber(int index);
-        LIAPI bool getBool(int index);
-
-        // Tool Functions
-        template <typename T>
-        inline void setValue(int index, T value)
-        {
-            elements[index].second->value = to_string(value);
-        }
-        inline void setValue(int index, string value)
-        {
-            elements[index].second->value = value;
-        }
+class SimpleFormElement {
+protected:
+    virtual string serialize() = 0;
+    friend class SimpleForm;
+};
+
+class Button : public SimpleFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    using ButtonCallback = std::function<void(Player*)>;
+    string text, image;
+    ButtonCallback callback;
+
+public:
+    inline explicit Button(string text, string image = "", ButtonCallback callback = ButtonCallback())
+    : text(std::move(text))
+    , image(std::move(image))
+    , callback(std::move(callback)) {
+    }
+    inline void setText(const string& _text) {
+        this->text = _text;
+    }
+    inline void setImage(const string& _image) {
+        this->image = _image;
+    }
+    inline void setCallback(ButtonCallback _callback) {
+        this->callback = std::move(_callback);
+    }
+};
+
+//////////////////////////////// Custom Form Elements ////////////////////////////////
+class CustomFormElement {
+protected:
+    LIAPI virtual string serialize() = 0;
+    friend class CustomForm;
+
+public:
+    enum class Type {
+        Label,
+        Input,
+        Toggle,
+        Dropdown,
+        Slider,
+        StepSlider
     };
+    string name;
+    string value;
+    Type type{};
+    inline void setName(const string& _name) {
+        this->name = _name;
+    }
+    inline virtual Type getType() = 0;
+    LIAPI std::string getString();
+    LIAPI int getNumber();
+    LIAPI bool getBool();
+};
+
+class Label : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    string text;
+
+public:
+    inline Label(const string& name, string text)
+    : text(std::move(text)) {
+        setName(name);
+    }
+    inline Type getType() override {
+        return Type::Label;
+    }
+    inline void setText(const string& _text) {
+        this->text = _text;
+    }
+};
+
+class Input : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    string title, placeholder, def;
+    inline Input(const string& name, string title, string placeholder = "", string def = "")
+    : title(std::move(title))
+    , placeholder(std::move(placeholder))
+    , def(std::move(def)) {
+        setName(name);
+    }
+    inline Type getType() override {
+        return Type::Input;
+    }
+    inline void setTitle(const string& _title) {
+        this->title = _title;
+    }
+    inline void setPlaceHolder(const string& _placeholder) {
+        this->placeholder = _placeholder;
+    }
+    inline void setDefault(const string& _def) {
+        this->def = _def;
+    }
+};
+
+class Toggle : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+public:
+    string title;
+    bool def;
+
+public:
+    inline Toggle(const string& name, string title, bool def = false)
+    : title(std::move(title))
+    , def(def) {
+        setName(name);
+    }
+    inline virtual Type getType() override {
+        return Type::Toggle;
+    }
+    inline void setTitle(const string& _title) {
+        this->title = _title;
+    }
+    inline void setDefault(bool _def) {
+        this->def = _def;
+    }
+};
+
+class Dropdown : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    string title;
+    vector<string> options;
+    int def;
+
+public:
+    inline Dropdown(const string& name, string title, const vector<string>& options, int defId = 0)
+    : title(std::move(title))
+    , options(options)
+    , def(defId) {
+        setName(name);
+    }
+    inline Type getType() override {
+        return Type::Dropdown;
+    }
+    inline void setTitle(const string& _title) {
+        this->title = _title;
+    }
+    inline void setOptions(const vector<string>& _options) {
+        this->options = _options;
+    }
+    inline void addOption(const string& option) {
+        options.push_back(option);
+    }
+    inline void setDefault(int defId) {
+        this->def = defId;
+    }
+};
+
+class Slider : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    string title;
+    int minValue, maxValue, step, def;
+
+public:
+    inline Slider(const string& name, string title, int minValue, int maxValue, int step = 1, int def = 0)
+    : title(std::move(title))
+    , minValue(minValue)
+    , maxValue(maxValue)
+    , step(step)
+    , def(def) {
+        setName(name);
+    }
+    inline Type getType() override {
+        return Type::Slider;
+    }
+    inline void setTitle(const string& _title) {
+        this->title = _title;
+    }
+    inline void setMin(int _minValue) {
+        this->minValue = _minValue;
+    }
+    inline void setMax(int _maxValue) {
+        this->maxValue = _maxValue;
+    }
+    inline void setStep(int _step) {
+        this->step = _step;
+    }
+    inline void setDefault(int _def) {
+        this->def = _def;
+    }
+};
+
+class StepSlider : public CustomFormElement {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    string title;
+    vector<string> options;
+    int def;
+
+public:
+    inline StepSlider(const string& name, string title, const vector<string>& options, int defId = 0)
+    : title(std::move(title))
+    , options(options)
+    , def(defId) {
+        setName(name);
+    }
+    inline Type getType() override {
+        return Type::StepSlider;
+    }
+    inline void setTitle(const string& _title) {
+        this->title = _title;
+    }
+    inline void setOptions(const vector<string>& _options) {
+        this->options = _options;
+    }
+    inline void addOption(const string& option) {
+        options.push_back(option);
+    }
+    inline void setDefault(int defId) {
+        this->def = defId;
+    }
+};
+
+//////////////////////////////// Forms ////////////////////////////////
+class FormImpl {
+protected:
+    // fifo_json json;
+    virtual string serialize() = 0;
+};
+
+class SimpleForm : public FormImpl {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    using Callback = std::function<void(Player*, int)>;
+    string title, content;
+    vector<std::shared_ptr<SimpleFormElement>> elements;
+    Callback callback;
+
+public:
+    SimpleForm(string title, string content)
+    : title(std::move(title))
+    , content(std::move(content)) {
+    }
+    template <typename T, typename... Args>
+    SimpleForm(const string& title, const string& content, T element, Args... args) {
+        append(element);
+        SimpleForm(title, content, args...);
+    }
+    LIAPI SimpleForm& setTitle(const string& title);
+    LIAPI SimpleForm& setContent(const string& content);
+    LIAPI SimpleForm& addButton(string text, string image = "", Button::ButtonCallback callback = Button::ButtonCallback());
+    LIAPI SimpleForm& append(const Button& element);
+    LIAPI bool sendTo(Player* player, Callback callback = Callback());
+};
+
+class ModalForm : public FormImpl {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    using Callback = std::function<void(Player*, bool)>;
+    string title, content, confirmButton, cancelButton;
+    Callback callback;
+
+public:
+    ModalForm(string title, string content, string button1, string button2)
+    : title(std::move(title))
+    , content(std::move(content))
+    , confirmButton(std::move(button1))
+    , cancelButton(std::move(button2)) {
+    }
+    template <typename T, typename... Args>
+    ModalForm(const string& title, const string& content, const string& confirmButton, const string& cancelButton, Args... args) {
+        ModalForm(title, content, confirmButton, cancelButton, args...);
+    }
+    LIAPI ModalForm& setTitle(const string& title);
+    LIAPI ModalForm& setContent(const string& content);
+    LIAPI ModalForm& setConfirmButton(const string& text);
+    LIAPI ModalForm& setCancelButton(const string& text);
+    LIAPI bool sendTo(Player* player, Callback callback = Callback());
+};
+
+class CustomForm : public FormImpl {
+protected:
+    LIAPI string serialize() override;
+
+public:
+    using Callback = std::function<void(Player*, std::map<string, std::shared_ptr<CustomFormElement>>)>;
+    using Callback2 = std::function<void(Player*, std::string)>;
+    string title;
+    std::vector<std::pair<string, std::shared_ptr<CustomFormElement>>> elements;
+    Callback callback;
+
+public:
+    explicit CustomForm(string title)
+    : title(std::move(title)) {
+    }
+    template <typename T, typename... Args>
+    CustomForm(const string& title, T element, Args... args) {
+        append(element);
+        CustomForm(title, args...);
+    }
+    LIAPI CustomForm& setTitle(const string& title);
+
+    LIAPI CustomForm& addLabel(const string& name, string text);
+    LIAPI CustomForm& addInput(const string& name, string title, string placeholder = "", string def = "");
+    LIAPI CustomForm& addToggle(const string& name, string title, bool def = false);
+    LIAPI CustomForm& addDropdown(const string& name, string title, const vector<string>& options, int defId = 0);
+    LIAPI CustomForm& addSlider(const string& name, string title, int min, int max, int step = 1, int def = 0);
+    LIAPI CustomForm& addStepSlider(const string& name, string title, const vector<string>& options, int defId = 0);
+
+    LIAPI CustomForm& append(const Label& element);
+    LIAPI CustomForm& append(const Input& element);
+    LIAPI CustomForm& append(const Toggle& element);
+    LIAPI CustomForm& append(const Dropdown& element);
+    LIAPI CustomForm& append(const Slider& element);
+    LIAPI CustomForm& append(const StepSlider& element);
+
+    LIAPI bool sendTo(Player* player, Callback callback);
+    LIAPI bool sendToForRawJson(Player* player, Callback2 callback);
+    LIAPI CustomFormElement::Type getType(int index);
+
+    LIAPI string getString(const string& name);
+    LIAPI int getNumber(const string& name);
+    LIAPI bool getBool(const string& name);
+    LIAPI string getString(int index);
+    LIAPI int getNumber(int index);
+    LIAPI bool getBool(int index);
+
+    // Tool Functions
+    template <typename T>
+    inline void setValue(int index, T value) {
+        elements[index].second->value = to_string(value);
+    }
+    inline void setValue(int index, string value) {
+        elements[index].second->value = value;
+    }
+};
 } // namespace Form
diff --git a/LiteLoader/Header/GlobalServiceAPI.h b/LiteLoader/Header/GlobalServiceAPI.h
--- a/LiteLoader/Header/GlobalServiceAPI.h
+++ b/LiteLoader/Header/GlobalServiceAPI.h
@@ -1,6 +1,6 @@
 #pragma once
 
-//Types
+// Types
 namespace RakNet {
 class RakPeer;
 };
diff --git a/LiteLoader/Header/HookAPI.h b/LiteLoader/Header/HookAPI.h
--- a/LiteLoader/Header/HookAPI.h
+++ b/LiteLoader/Header/HookAPI.h
@@ -39,15 +39,13 @@ inline const T& dAccess(void const* ptr, uintptr_t off) {
 
 #if _HAS_CXX20
 template <size_t N>
-struct FixedString
-{
+struct FixedString {
     char buf[N + 1]{};
-    constexpr FixedString(char const* s)
-    {
-        for (unsigned i = 0; i != N; ++i) buf[i] = s[i];
+    constexpr FixedString(char const* s) {
+        for (unsigned i = 0; i != N; ++i)
+            buf[i] = s[i];
     }
-    constexpr operator char const*() const
-    {
+    constexpr operator char const*() const {
         return buf;
     }
 };
@@ -59,8 +57,7 @@ __declspec(selectany) void* __dlsym_ptr_cache = dlsym_real(Fn);
 
 #define VA_EXPAND(...) __VA_ARGS__
 template <FixedString Fn, typename ret, typename... p>
-static inline auto __imp_Call()
-{
+static inline auto __imp_Call() {
     return ((ret(*)(p...))(__dlsym_ptr_cache<Fn>));
 }
 
@@ -72,10 +69,8 @@ static inline auto __imp_Call()
 template <CHash, CHash>
 __declspec(selectany) void* __ptr_cache;
 template <CHash hash, CHash hash2>
-inline static void* dlsym_cache(const char* fn)
-{
-    if (!__ptr_cache<hash, hash2>)
-    {
+inline static void* dlsym_cache(const char* fn) {
+    if (!__ptr_cache<hash, hash2>) {
         __ptr_cache<hash, hash2> = dlsym_real(fn);
     }
     return __ptr_cache<hash, hash2>;
@@ -83,8 +78,7 @@ inline static void* dlsym_cache(const char* fn)
 
 #define VA_EXPAND(...) __VA_ARGS__
 template <CHash hash, CHash hash2, typename ret, typename... p>
-static inline auto __imp_Call(const char* fn)
-{
+static inline auto __imp_Call(const char* fn) {
     return ((ret(*)(p...))(dlsym_cache<hash, hash2>(fn)));
 }
 
@@ -106,8 +100,7 @@ class THookRegister {
             printf("FailedToHook: %p\n", sym);
         } else {
             auto ret = HookFunction(found, org, hook);
-            if (ret != 0)
-            {
+            if (ret != 0) {
                 printf("FailedToHook: %s\n", sym);
             }
         }
diff --git a/LiteLoader/Header/I18nAPI.h b/LiteLoader/Header/I18nAPI.h
--- a/LiteLoader/Header/I18nAPI.h
+++ b/LiteLoader/Header/I18nAPI.h
@@ -17,16 +17,16 @@
 //          "...": "..."
 //      }
 //  }
-// 
-// 
+//
+//
 // [Usage - Text Encoding]
-// 
+//
 //  Encoding local = TextEncoding::getLocalEncoding();                      // Get local encoding
 //  Encoding code = TextEncoding::detectEncoding("你好吗？");                // Detect the encoding of text
-// 
+//
 //  string hello = TextEncoding::fromUnicode(L"Hello");                     // Convert Unicode wstring -> MBCS string
 //  wstring world = TextEncoding::toUnicode("World");                       // Convert MBCS string -> Unicode wstring
-// 
+//
 //  string tomorrow = TextEncoding::toUTF8("明天");                          // Convert MBCS string of any encoding to UTF8 string
 //  string tonight = TextEncoding::convert("今天晚上", Encoding::CHINESE_GB, Encoding::UTF8);
 //                                                                          // Convert from one MBCS encoding to another
@@ -77,9 +77,9 @@ class I18N {
      */
     I18N(const std::string& filePath, const std::string& defaultLangCode = "en_US",
          const LangData& defaultLangData = {}, const HMODULE& hModule = nullptr)
-        : filePath(filePath)
-        , defaultLangCode(defaultLangCode)
-        , defaultLangData(defaultLangData) {
+    : filePath(filePath)
+    , defaultLangCode(defaultLangCode)
+    , defaultLangData(defaultLangData) {
         if (hModule)
             curModule = hModule;
         else
@@ -103,7 +103,6 @@ class I18N {
     LIAPI std::string get(const std::string& key, const std::string& langCode = "");
 
     static const constexpr char* POD_KEY = "ll_plugin_i18n"; ///< PluginOwnData key
-
 };
 
 #ifdef UNICODE
@@ -114,98 +113,99 @@ class I18N {
 #endif
 
 namespace Translation {
-    template <bool B, class T = void>
-    using enable_if_t = typename std::enable_if<B, T>::type;
+template <bool B, class T = void>
+using enable_if_t = typename std::enable_if<B, T>::type;
 
-    ///////////////// tr Impl /////////////////
-    template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
-    inline std::string trImpl(HMODULE hPlugin, const S& formatStr, const Args&... args) {
-        std::string realFormatStr = formatStr;
-        if (PluginOwnData::hasImpl(hPlugin, I18N::POD_KEY)) {
-            auto& i18n = PluginOwnData::getImpl<I18N>(hPlugin, I18N::POD_KEY);
-            realFormatStr = i18n.get(formatStr);
-        }
-        // realFormatStr = FixCurlyBracket(realFormatStr);
-        if constexpr (0 == sizeof...(args)) {
-            // Avoid fmt if only one argument
-            return realFormatStr;
-        } else {
-            return fmt::format(realFormatStr, args...);
-        }
+///////////////// tr Impl /////////////////
+template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
+inline std::string trImpl(HMODULE hPlugin, const S& formatStr, const Args&... args) {
+    std::string realFormatStr = formatStr;
+    if (PluginOwnData::hasImpl(hPlugin, I18N::POD_KEY)) {
+        auto& i18n = PluginOwnData::getImpl<I18N>(hPlugin, I18N::POD_KEY);
+        realFormatStr = i18n.get(formatStr);
     }
-    template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
-    inline std::string trlImpl(HMODULE hPlugin, const std::string& langCode, const S& formatStr, const Args&... args) {
-        std::string realFormatStr = formatStr;
-        if (PluginOwnData::hasImpl(hPlugin, I18N::POD_KEY)) {
-            auto& i18n = PluginOwnData::getImpl<I18N>(hPlugin, I18N::POD_KEY);
-            realFormatStr = i18n.get(formatStr, langCode);
-        }
-        // realFormatStr = FixCurlyBracket(realFormatStr);
-        if constexpr (0 == sizeof...(args)) {
-            // Avoid fmt if only one argument
-            return realFormatStr;
-        } else {
-            return fmt::format(realFormatStr, args...);
-        }
+    // realFormatStr = FixCurlyBracket(realFormatStr);
+    if constexpr (0 == sizeof...(args)) {
+        // Avoid fmt if only one argument
+        return realFormatStr;
+    } else {
+        return fmt::format(realFormatStr, args...);
     }
-
-    ///////////////// trc Impl /////////////////
-    template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
-    [[deprecated("Use trImpl(...).c_str() instead")]] inline const char* trcImpl(HMODULE hPlugin, const S& formatStr,
-                                                                                 const Args&... args) {
-        std::string res = trImpl(hPlugin, formatStr, args...);
-        std::string name =
-            std::string(I18N::POD_KEY) + "_translation_" + fmt::v8::detail::to_string_view<S>(formatStr).data();
-        auto& str = PluginOwnData::setImpl<std::string>(hPlugin, name, res);
-        return str.c_str();
+}
+template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
+inline std::string trlImpl(HMODULE hPlugin, const std::string& langCode, const S& formatStr, const Args&... args) {
+    std::string realFormatStr = formatStr;
+    if (PluginOwnData::hasImpl(hPlugin, I18N::POD_KEY)) {
+        auto& i18n = PluginOwnData::getImpl<I18N>(hPlugin, I18N::POD_KEY);
+        realFormatStr = i18n.get(formatStr, langCode);
+    }
+    // realFormatStr = FixCurlyBracket(realFormatStr);
+    if constexpr (0 == sizeof...(args)) {
+        // Avoid fmt if only one argument
+        return realFormatStr;
+    } else {
+        return fmt::format(realFormatStr, args...);
     }
+}
 
-    [[deprecated]] LIAPI bool loadImpl(HMODULE hPlugin, const std::string& filePath); // For compatibility
-    LIAPI I18N* loadImpl(HMODULE hPlugin, const std::string& filePath, const std::string& defaultLangCode,
-                         const I18N::LangData& defaultLangData);
+///////////////// trc Impl /////////////////
+template <typename S, typename... Args, Translation::enable_if_t<(fmt::v8::detail::is_string<S>::value), int> = 0>
+[[deprecated("Use trImpl(...).c_str() instead")]] inline const char* trcImpl(HMODULE hPlugin, const S& formatStr,
+                                                                             const Args&... args) {
+    std::string res = trImpl(hPlugin, formatStr, args...);
+    std::string name =
+        std::string(I18N::POD_KEY) + "_translation_" + fmt::v8::detail::to_string_view<S>(formatStr).data();
+    auto& str = PluginOwnData::setImpl<std::string>(hPlugin, name, res);
+    return str.c_str();
+}
 
-    LIAPI I18N* loadFromImpl(HMODULE hPlugin, HMODULE hTarget);
+[[deprecated]] LIAPI bool loadImpl(HMODULE hPlugin, const std::string& filePath); // For compatibility
+LIAPI I18N* loadImpl(HMODULE hPlugin, const std::string& filePath, const std::string& defaultLangCode,
+                     const I18N::LangData& defaultLangData);
 
-    /**
-     * @brief Load translation from a file.
-     *
-     * @param  filePath         The path to the i18n file(json)
-     * @param  defaultLangCode  The default language code(if no lang code is specified, it will use this)
-     * @param  defaultLangData  The default translation data
-     * @return I18N*            The pointer to the I18N object in PluginOwnData, null if failed
-     */
-    inline I18N* load(const std::string& filePath, const std::string& defaultLangCode = "en_US",
-                     const I18N::LangData& defaultLangData = {}) {
-        return loadImpl(GetCurrentModule(), filePath, defaultLangCode, defaultLangData);
-    }
+LIAPI I18N* loadFromImpl(HMODULE hPlugin, HMODULE hTarget);
 
-    /**
-     * @brief Load translation from another plugin.
-     * 
-     * @param  plugin  The plugin name.
-     * @return I18N*   The pointer to the I18N object in PluginOwnData, null if failed
-     */
-    inline I18N* loadFrom(const std::string& plugin) {
-        if (LL::hasPlugin(plugin)) {
-            auto p = LL::getPlugin(plugin);
-            if (p) return loadFromImpl(GetCurrentModule(), p->handle);
-        }
-        return nullptr;
+/**
+ * @brief Load translation from a file.
+ *
+ * @param  filePath         The path to the i18n file(json)
+ * @param  defaultLangCode  The default language code(if no lang code is specified, it will use this)
+ * @param  defaultLangData  The default translation data
+ * @return I18N*            The pointer to the I18N object in PluginOwnData, null if failed
+ */
+inline I18N* load(const std::string& filePath, const std::string& defaultLangCode = "en_US",
+                  const I18N::LangData& defaultLangData = {}) {
+    return loadImpl(GetCurrentModule(), filePath, defaultLangCode, defaultLangData);
+}
+
+/**
+ * @brief Load translation from another plugin.
+ *
+ * @param  plugin  The plugin name.
+ * @return I18N*   The pointer to the I18N object in PluginOwnData, null if failed
+ */
+inline I18N* loadFrom(const std::string& plugin) {
+    if (LL::hasPlugin(plugin)) {
+        auto p = LL::getPlugin(plugin);
+        if (p)
+            return loadFromImpl(GetCurrentModule(), p->handle);
     }
+    return nullptr;
+}
 
-    /**
-     * @brief Get the I18N object of a certain plugin.
-     *
-     * @param  hPlugin              The plugin handle(nullptr -> GetCurrentModule())
-     * @return std::optional<I18N>  The I18N object
-     */
-    inline std::optional<I18N> getI18N(HMODULE hPlugin = nullptr) {
-        auto handle = (hPlugin == nullptr ? GetCurrentModule() : hPlugin);
-        if (handle && PluginOwnData::hasImpl(handle, I18N::POD_KEY)) {
-            return PluginOwnData::getImpl<I18N>(handle, I18N::POD_KEY);
-        }
-        return std::optional<I18N>();
+/**
+ * @brief Get the I18N object of a certain plugin.
+ *
+ * @param  hPlugin              The plugin handle(nullptr -> GetCurrentModule())
+ * @return std::optional<I18N>  The I18N object
+ */
+inline std::optional<I18N> getI18N(HMODULE hPlugin = nullptr) {
+    auto handle = (hPlugin == nullptr ? GetCurrentModule() : hPlugin);
+    if (handle && PluginOwnData::hasImpl(handle, I18N::POD_KEY)) {
+        return PluginOwnData::getImpl<I18N>(handle, I18N::POD_KEY);
     }
+    return std::optional<I18N>();
+}
 
 }; // namespace Translation
 
@@ -330,13 +330,13 @@ inline std::string trl(const std::string& langCode, const char* formatStr, const
 
 // For text encoding
 namespace TextEncoding {
-    LIAPI Encoding getLocalEncoding();
-    LIAPI Encoding detectEncoding(const std::string& text, bool* isReliable = nullptr);
+LIAPI Encoding getLocalEncoding();
+LIAPI Encoding detectEncoding(const std::string& text, bool* isReliable = nullptr);
 
-    LIAPI std::string fromUnicode(const std::wstring& text, Encoding to = Encoding::UTF8);
-    LIAPI std::wstring toUnicode(const std::string& text, Encoding from = Encoding::UTF8);
-    LIAPI std::string toUTF8(const std::string& text);
-    LIAPI std::string toUTF8(const std::string& text, Encoding from);
+LIAPI std::string fromUnicode(const std::wstring& text, Encoding to = Encoding::UTF8);
+LIAPI std::wstring toUnicode(const std::string& text, Encoding from = Encoding::UTF8);
+LIAPI std::string toUTF8(const std::string& text);
+LIAPI std::string toUTF8(const std::string& text, Encoding from);
 
-    LIAPI std::string convert(const std::string& text, Encoding from, Encoding to);
-} // namespace TextEncoding
+LIAPI std::string convert(const std::string& text, Encoding from, Encoding to);
+} // namespace TextEncoding
\ No newline at end of file
diff --git a/LiteLoader/Header/Impl/FormPacketHelper.h b/LiteLoader/Header/Impl/FormPacketHelper.h
--- a/LiteLoader/Header/Impl/FormPacketHelper.h
+++ b/LiteLoader/Header/Impl/FormPacketHelper.h
@@ -15,6 +15,8 @@ LIAPI void SetCustomFormPacketCallback(unsigned formId, std::function<void(Playe
 
 LIAPI void SetSimpleFormBuilderData(unsigned formId, std::shared_ptr<Form::SimpleForm> data);
 
+LIAPI void SetModalFormBuilderData(unsigned formId, std::shared_ptr<Form::ModalForm> data);
+
 LIAPI void SetCustomFormBuilderData(unsigned formId, std::shared_ptr<Form::CustomForm> data);
 
-LIAPI void HandleFormPacket(Player *player, unsigned formId, const string &data);
+LIAPI void HandleFormPacket(Player* player, unsigned formId, const string& data);
diff --git a/LiteLoader/Header/KVDBAPI.h b/LiteLoader/Header/KVDBAPI.h
--- a/LiteLoader/Header/KVDBAPI.h
+++ b/LiteLoader/Header/KVDBAPI.h
@@ -10,8 +10,7 @@
 #include <unordered_map>
 using std::string_view, std::string;
 
-class KVDB
-{
+class KVDB {
     leveldb::DB* db;
     leveldb::ReadOptions rdopt;
     leveldb::WriteOptions wropt;
@@ -22,11 +21,10 @@ class KVDB
     void _init(const char* path, bool create, bool read_cache, int cache_sz, int Bfilter_bit);
 
 public:
-
     LIAPI static std::unique_ptr<KVDB> create(const std::string& path, bool read_cache = true, int cache_sz = 0, int Bfilter_bit = 0);
     LIAPI static std::unique_ptr<KVDB> open(const std::string& path, bool create = true, bool read_cache = true, int cache_sz = 0, int Bfilter_bit = 0);
     LIAPI ~KVDB();
-    
+
     KVDB() = default;
     KVDB(KVDB const&) = delete;
     KVDB& operator=(KVDB const&) = delete;
@@ -43,5 +41,7 @@ class KVDB
     LIAPI operator bool();
 
     // For Compatibility
-    inline bool put(std::string_view key, std::string_view val) { return set(key, val); }
+    inline bool put(std::string_view key, std::string_view val) {
+        return set(key, val);
+    }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/LLAPI.h b/LiteLoader/Header/LLAPI.h
--- a/LiteLoader/Header/LLAPI.h
+++ b/LiteLoader/Header/LLAPI.h
@@ -18,13 +18,10 @@
 #include "Utils/PluginOwnData.h"
 
 // LL types
-namespace LL
-{
+namespace LL {
 
-struct Version
-{
-    enum Status
-    {
+struct Version {
+    enum Status {
         Dev,
         Beta,
         Release
@@ -44,18 +41,16 @@ struct Version
     LIAPI static Version parse(const std::string& str);
 };
 
-struct Plugin
-{
+struct Plugin {
     std::string name;
-    std::string desc;  // `introduction` before
+    std::string desc; // `introduction` before
     Version version;
-    std::map<std::string, std::string> others;  // `otherInformation` before
+    std::map<std::string, std::string> others; // `otherInformation` before
 
     std::string filePath;
     HMODULE handle;
 
-    enum class PluginType
-    {
+    enum class PluginType {
         DllPlugin,
         ScriptPlugin
     };
@@ -64,27 +59,22 @@ struct Plugin
 
     // Call a Function by Symbol String
     template <typename ReturnType = void, typename... Args>
-    inline ReturnType callFunction(const char* functionName, Args... args)
-    {
+    inline ReturnType callFunction(const char* functionName, Args... args) {
         void* address = GetProcAddress(handle, functionName);
         if (!address)
             return ReturnType();
         return reinterpret_cast<ReturnType (*)(Args...)>(address)(std::forward<Args>(args)...);
     }
-
 };
 
 } // namespace LL
-inline bool operator<=(LL::Version a, LL::Version b)
-{
+inline bool operator<=(LL::Version a, LL::Version b) {
     return a < b || a == b;
 }
-inline bool operator>(LL::Version a, LL::Version b)
-{
+inline bool operator>(LL::Version a, LL::Version b) {
     return b < a;
 }
-inline bool operator>=(LL::Version a, LL::Version b)
-{
+inline bool operator>=(LL::Version a, LL::Version b) {
     return b < a || b == a;
 }
 
@@ -93,8 +83,7 @@ LIAPI bool RegisterPlugin(HMODULE hPlugin, std::string name, std::string desc, L
                           std::map<std::string, std::string> others);
 
 // Loader APIs
-namespace LL
-{
+namespace LL {
 
 /**
  * @brief Get the loader version as a string
@@ -104,20 +93,20 @@ namespace LL
 LIAPI std::string getLoaderVersionString();
 /**
  * @brief Get the loader version as a Version object
- * 
+ *
  * @return LL::Version  The loader version
  */
 LIAPI Version getLoaderVersion();
 /**
  * @brief Get whether LiteLoader is in debug mode
- * 
+ *
  * @return bool  True if it is in debug mode
  */
 LIAPI bool isDebugMode();
 
 /**
  * @brief Get the data path of the plugin
- * 
+ *
  * @param  pluginName   The name of the plugin
  * @return std::string  The data path of the plugin
  */
@@ -125,7 +114,7 @@ LIAPI std::string getDataPath(const std::string& pluginName);
 
 /**
  * @brief Register a plugin
- * 
+ *
  * @param  name     The name of the plugin
  * @param  desc     The description(introduction) of the plugin
  * @param  version  The version of the plugin(LL::Version)
@@ -136,46 +125,47 @@ LIAPI std::string getDataPath(const std::string& pluginName);
  * @note   The implementation of this function must be in header file(because of `GetCurrentModule`)
  */
 inline bool registerPlugin(std::string name, std::string desc, LL::Version version,
-                           std::string git = "", std::string license = "", std::string website = "")
-{
+                           std::string git = "", std::string license = "", std::string website = "") {
     std::map<std::string, std::string> others;
-    if (!git.empty()) others.emplace("Git", git);
-    if (!license.empty()) others.emplace("License", license);
-    if (!website.empty()) others.emplace("Website", website);
+    if (!git.empty())
+        others.emplace("Git", git);
+    if (!license.empty())
+        others.emplace("License", license);
+    if (!website.empty())
+        others.emplace("Website", website);
     return ::RegisterPlugin(GetCurrentModule(), name, desc, version, others);
 }
 
 /**
  * @brief Register a plugin
- * 
+ *
  * @param  name     The name of the plugin
  * @param  desc     The descirption(introduction) of the plugin
  * @param  version  The version of the plugin(LL::Version)
  * @param  others   The other information of the plugin(key-value)
  * @return bool     True if the plugin is registered successfully
  * @note   The implementation of this function must be in header file(because of `GetCurrentModule`)
- * 
+ *
  * @par Example
  * @code
  * LL::registerPlugin("Test", "A test plugin", Version(0, 0, 1, Version::Dev), {{"Note","This is Note"}});
  * @endcode
  */
 inline bool registerPlugin(std::string name, std::string desc, LL::Version version,
-                           std::map<std::string, std::string> others)
-{
+                           std::map<std::string, std::string> others) {
     return ::RegisterPlugin(GetCurrentModule(), name, desc, version, others);
 }
 
 /**
  * @brief Get a loaded plugin by name
- * 
+ *
  * @param  name         The name of the plugin
  * @return LL::Plugin*  The plugin(nullptr if not found)
  */
 LIAPI LL::Plugin* getPlugin(std::string name);
 /**
  * @brief Get a loaded plugin by HMODULE handle
- * 
+ *
  * @param  name         The name of the plugin
  * @return LL::Plugin*  The plugin(nullptr if not found)
  */
@@ -183,7 +173,7 @@ LIAPI LL::Plugin* getPlugin(HMODULE handle);
 
 /**
  * @brief Get whether the plugin is loaded
- * 
+ *
  * @param  name  The name of the plugin
  * @return bool  True if the plugin is loaded
  */
@@ -191,21 +181,20 @@ LIAPI bool hasPlugin(std::string name);
 
 /**
  * @brief Get the All the loaded plugins
- * 
+ *
  * @return std::unordered_map<std::string, LL::Plugin*>  The loaded plugins(name-plugin)
  */
 LIAPI std::unordered_map<std::string, LL::Plugin*> getAllPlugins();
 
 /**
  * @breif Get the handle of LiteLoader.dll.
- * 
+ *
  * @return HMODULE  The handle
  */
 LIAPI HMODULE getLoaderHandle();
 
 /// Server Status
-enum class ServerStatus
-{
+enum class ServerStatus {
     Starting,
     Running,
     Stopping
diff --git a/LiteLoader/Header/LoggerAPI.h b/LiteLoader/Header/LoggerAPI.h
--- a/LiteLoader/Header/LoggerAPI.h
+++ b/LiteLoader/Header/LoggerAPI.h
@@ -2,25 +2,25 @@
 //  Logger System - Log text to console, file and player easily
 //  - Created by RimuruChan on 2021/12/11.
 //
-// 
+//
 //  [Create Logger]
-// 
+//
 //  Logger logger("MyPlugin");                  // Create a logger (default: only log to console)
 //  logger.setFile("logs/MyPlugin.log");        // Optional, also record log to File
-// 
+//
 //  auto pl = mc.getPlayer("Jim");
 //  if(pl)
 //      logger.setPlayer(pl);                   // Optional, also record log to a Player
 //  ......
 //  logger.setFile(nullptr);                    // Stop record log to File (Passing nullptr to setPlayer works like this)
-//  
-// 
+//
+//
 //  [Use Logger]
-// 
+//
 //  logger.info("Infomation");                                  // Common
 //  logger.error("Error! Code:{}",GetLastError());              // FMT Format
 //  logger.warn << "Warning! Fail to do sth." << logger.endl;   // STL Format
-// 
+//
 ////////////////////////////////////////////////////////////////////////
 
 #pragma once
@@ -52,15 +52,14 @@ using std::string;
 
 #define LOGGER_CURRENT_FILE "ll_plugin_logger_file"
 
-template<bool B, class T = void>
+template <bool B, class T = void>
 using enable_if_type = typename std::enable_if<B, T>::type;
 
 HMODULE GetCurrentModule();
 
 class Logger {
 public:
-    class OutputStream
-    {
+    class OutputStream {
         friend class Logger;
 
     protected:
@@ -75,18 +74,12 @@ class Logger {
         fmt::text_style style;
         std::string levelPrefix;
         std::ostringstream os;
-        bool locked = false; //Deprecated
+        bool locked = false; // Deprecated
 
-        LIAPI explicit OutputStream(Logger* logger, int level,
-                                    std::string&& consoleFormat,
-                                    std::string&& fileFormat,
-                                    std::string&& playerFormat,
-                                    fmt::text_style&& style,
-                                    std::string&& mode);
+        LIAPI explicit OutputStream(Logger* logger, int level, std::string&& consoleFormat, std::string&& fileFormat, std::string&& playerFormat, fmt::text_style&& style, std::string&& mode);
 
         template <typename T>
-        OutputStream& operator<<(T t)
-        {
+        OutputStream& operator<<(T t) {
             logger->lock();
             os << t;
             logger->unlock();
@@ -94,16 +87,14 @@ class Logger {
         }
 
         template <>
-        OutputStream& operator<<(std::wstring wstr)
-        {
+        OutputStream& operator<<(std::wstring wstr) {
             logger->lock();
             os << wstr2str(wstr);
             logger->unlock();
             return *this;
         }
         template <>
-        OutputStream& operator<<(const wchar_t* wstr)
-        {
+        OutputStream& operator<<(const wchar_t* wstr) {
             logger->lock();
             os << wstr2str(wstr);
             logger->unlock();
@@ -111,45 +102,36 @@ class Logger {
         }
 
         template <>
-        OutputStream& operator<<(void (*t)(OutputStream&))
-        {
+        OutputStream& operator<<(void (*t)(OutputStream&)) {
             t(*this);
             return *this;
         }
 
         template <typename S, typename... Args, enable_if_type<(fmt::v8::detail::is_string<S>::value), int> = 0>
-        void operator()(const S& formatStr, const Args&... args)
-        {
+        void operator()(const S& formatStr, const Args&... args) {
             if (PluginOwnData::has(I18N::POD_KEY)) {
                 *this << tr(formatStr, args...) << endl;
                 return;
             }
-            if constexpr (0 == sizeof...(args))
-            {
+            if constexpr (0 == sizeof...(args)) {
                 // Avoid fmt if only one argument
                 *this << formatStr << endl;
-            }
-            else
-            {
+            } else {
                 std::string str = fmt::format(formatStr, args...);
                 *this << str << endl;
             }
         }
 
         template <typename... Args>
-        void operator()(const char* formatStr, const Args&... args)
-        {
+        void operator()(const char* formatStr, const Args&... args) {
             if (PluginOwnData::has(I18N::POD_KEY)) {
                 *this << tr(formatStr, args...) << endl;
                 return;
             }
-            if constexpr (0 == sizeof...(args))
-            {
+            if constexpr (0 == sizeof...(args)) {
                 // Avoid fmt if only one argument
                 *this << formatStr << endl;
-            }
-            else 
-            {
+            } else {
                 std::string str = fmt::format(std::string(formatStr), args...);
                 *this << str << endl;
             }
@@ -157,7 +139,6 @@ class Logger {
     };
 
 private:
- 
     LIAPI static bool setDefaultFileImpl(HMODULE hPlugin, const std::string& logFile, bool appendMode);
     LIAPI static bool setDefaultFileImpl(HMODULE hPlugin, nullptr_t);
 
@@ -165,29 +146,25 @@ class Logger {
 
 public:
     std::string title;
-    std::ofstream ofs ;
+    std::ofstream ofs;
     Player* player = nullptr;
     int consoleLevel = -1;
     int fileLevel = -1;
     int playerLevel = -1;
 
-    ~Logger()
-    {
+    ~Logger() {
         setFile(nullptr);
     }
 
-    inline static bool setDefaultFile(const std::string& logFile, bool appendMode)
-    {
+    inline static bool setDefaultFile(const std::string& logFile, bool appendMode) {
         return setDefaultFileImpl(GetCurrentModule(), logFile, appendMode);
     };
 
-    inline static bool setDefaultFile(nullptr_t a0)
-    {
+    inline static bool setDefaultFile(nullptr_t a0) {
         return setDefaultFileImpl(GetCurrentModule(), a0);
     };
 
-    inline static void endl(OutputStream& o)
-    {
+    inline static void endl(OutputStream& o) {
         return endlImpl(GetCurrentModule(), o);
     };
 
@@ -204,17 +181,18 @@ class Logger {
     OutputStream error;
     OutputStream fatal;
 
-    inline Logger(): Logger("") {}
-    LIAPI explicit Logger(const std::string &title);
+    inline Logger()
+    : Logger("") {
+    }
+    LIAPI explicit Logger(const std::string& title);
 
 private:
     LIAPI CsLock& getLocker();
 
 
-    //For compatibility
+    // For compatibility
 private:
     LIAPI static void initLockImpl(HMODULE hPlugin);
     LIAPI static void lockImpl(HMODULE hPlugin);
     LIAPI static void unlockImpl(HMODULE hPlugin);
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/AABB.hpp b/LiteLoader/Header/MC/AABB.hpp
--- a/LiteLoader/Header/MC/AABB.hpp
+++ b/LiteLoader/Header/MC/AABB.hpp
@@ -8,9 +8,7 @@ class AABB {
     Vec3 max;
 
 public:
-    inline AABB(class AABB const& k)
-        : min(k.min)
-        , max(k.max){};
+    inline AABB(class AABB const& k) : min(k.min), max(k.max){};
     // inline AABB(Vec3 const& p1, Vec3 const& p2)
     //     : min(p1)
     //     , max(p2){};
@@ -20,51 +18,51 @@ class AABB {
     // inline AABB(Vec3 const& p1, float size)
     //     : min(p1)
     //     , max(p1 + size){};
-    inline AABB()
-        : min(Vec3::MIN)
-        , max(Vec3::MIN){};
-    
-    MCAPI AABB(class Vec3 const &, class Vec3 const &);
-    MCAPI AABB(class Vec3 const &, float);
+    inline AABB() : min(Vec3::MIN), max(Vec3::MIN){};
+
+    MCAPI AABB(class Vec3 const&, class Vec3 const&);
+    MCAPI AABB(class Vec3 const&, float);
     MCAPI AABB(float, float, float, float, float, float);
-    MCAPI class Vec3 axisInside(class AABB const &, class Vec3) const;
-    MCAPI class HitResult clip(class Vec3 const &, class Vec3 const &) const;
-    MCAPI class Vec3 clipCollide(class AABB const &, class Vec3 const &, bool, float *) const;
-    MCAPI class AABB cloneAndExpandAlongDirection(class Vec3 const &) const;
+    MCAPI class Vec3 axisInside(class AABB const&, class Vec3) const;
+    MCAPI class HitResult clip(class Vec3 const&, class Vec3 const&) const;
+    MCAPI class Vec3 clipCollide(class AABB const&, class Vec3 const&, bool, float*) const;
+    MCAPI class AABB cloneAndExpandAlongDirection(class Vec3 const&) const;
     MCAPI class AABB cloneAndFloor(float, float) const;
     MCAPI class AABB cloneAndFloorMinAndCeilingMax() const;
-    MCAPI class AABB cloneAndGrow(class Vec3 const &) const;
-    MCAPI class AABB cloneAndShrink(class Vec3 const &) const;
-    MCAPI class AABB cloneAndTransformByMatrix(class Matrix const &) const;
-    MCAPI bool contains(class AABB const &) const;
-    MCAPI bool contains(class Vec3 const &) const;
-    MCAPI float distanceTo(class AABB const &) const;
-    MCAPI float distanceTo(class Vec3 const &) const;
-    MCAPI float distanceToSqr(class AABB const &) const;
+    MCAPI class AABB cloneAndGrow(class Vec3 const&) const;
+    MCAPI class AABB cloneAndShrink(class Vec3 const&) const;
+    MCAPI class AABB cloneAndTransformByMatrix(class Matrix const&) const;
+    MCAPI bool contains(class AABB const&) const;
+    MCAPI bool contains(class Vec3 const&) const;
+    MCAPI float distanceTo(class AABB const&) const;
+    MCAPI float distanceTo(class Vec3 const&) const;
+    MCAPI float distanceToSqr(class AABB const&) const;
     MCAPI class Vec3 getBounds() const;
     MCAPI class Vec3 getCenter() const;
     MCAPI float getSize() const;
     MCAPI float getVolume() const;
-    MCAPI bool intersectSegment(class Vec3 const &, class Vec3 const &, class Vec3 &, class Vec3 &) const;
-    MCAPI bool intersects(class AABB const &) const;
-    MCAPI bool intersects(class Vec3 const &, class Vec3 const &) const;
-    MCAPI bool intersectsInner(class AABB const &) const;
+    MCAPI bool intersectSegment(class Vec3 const&, class Vec3 const&, class Vec3&, class Vec3&) const;
+    MCAPI bool intersects(class AABB const&) const;
+    MCAPI bool intersects(class Vec3 const&, class Vec3 const&) const;
+    MCAPI bool intersectsInner(class AABB const&) const;
     MCAPI bool isValid() const;
-    MCAPI bool operator!=(class AABB const &) const;
-    MCAPI bool operator==(class AABB const &) const;
-    MCAPI class AABB & set(float, float, float, float, float, float);
-    MCAPI class AABB & set(class AABB const &);
-    MCAPI class AABB & set(class Vec3 const &, class Vec3 const &);
-    MCAPI class AABB & shrink(class Vec3 const &);
+    MCAPI bool operator!=(class AABB const&) const;
+    MCAPI bool operator==(class AABB const&) const;
+    MCAPI class AABB& set(float, float, float, float, float, float);
+    MCAPI class AABB& set(class AABB const&);
+    MCAPI class AABB& set(class Vec3 const&, class Vec3 const&);
+    MCAPI class AABB& shrink(class Vec3 const&);
     MCAPI std::string toString() const;
-    MCAPI class AABB & translateCenterTo(class Vec3 const &);
+    MCAPI class AABB& translateCenterTo(class Vec3 const&);
     MCAPI static class AABB const BLOCK_SHAPE;
     MCAPI static class AABB const BOX_AT_ORIGIN_WITH_NO_VOLUME;
 
     LIAPI class BoundingBox toBoundingBox() const;
 
     inline Vec3& operator[](int index) {
-        if (index < 0 || index > 1) { return (&min)[0]; }
+        if (index < 0 || index > 1) {
+            return (&min)[0];
+        }
         return (&min)[index];
     }
 
diff --git a/LiteLoader/Header/MC/Actor.hpp b/LiteLoader/Header/MC/Actor.hpp
--- a/LiteLoader/Header/MC/Actor.hpp
+++ b/LiteLoader/Header/MC/Actor.hpp
@@ -26,7 +26,7 @@ class Actor {
 #define AFTER_EXTRA
 // Add new members to class
 public:
-	enum InitializationMethod;
+    enum InitializationMethod;
 
     LIAPI std::string getTypeName() const;
     LIAPI Vec3 getFeetPosition() const;
@@ -38,21 +38,21 @@ class Actor {
     LIAPI std::vector<std::string> getAllTags();
     LIAPI BlockInstance getBlockFromViewVector(bool includeLiquid = false, bool solidOnly = false, float maxDistance = 5.25f, bool ignoreBorderBlocks = true, bool fullOnly = false) const;
     LIAPI BlockInstance getBlockFromViewVector(FaceID& face, bool includeLiquid = false, bool solidOnly = false, float maxDistance = 5.25f, bool ignoreBorderBlocks = true, bool fullOnly = false) const;
-	LIAPI UserEntityIdentifierComponent* getUserEntityIdentifierComponent() const;
+    LIAPI UserEntityIdentifierComponent* getUserEntityIdentifierComponent() const;
     LIAPI Actor* getActorFromViewVector(float maxDistance);
     LIAPI BlockPos getBlockPos();
     LIAPI BlockInstance getBlockStandingOn() const;
 
-	LIAPI bool isSimulatedPlayer() const;
+    LIAPI bool isSimulatedPlayer() const;
     LIAPI bool isPlayer(bool allowSimulatedPlayer = true) const;
     LIAPI bool isItemActor() const;
     LIAPI bool isOnGround() const;
     LIAPI bool setOnFire(int time, bool isEffect);
     LIAPI bool stopFire();
     LIAPI bool hasTag(const string& tag);
-	LIAPI bool hurtEntity(float damage);
+    LIAPI bool hurtEntity(float damage);
     LIAPI bool teleport(Vec3 to, int dimID, float x, float y);
-	LIAPI bool teleport(Vec3 pos,int dimid);
+    LIAPI bool teleport(Vec3 pos,int dimid);
     LIAPI ItemStack* getHandSlot();
     LIAPI bool rename(const string& name);
     LIAPI std::unique_ptr<CompoundTag> getNbt();
@@ -70,7 +70,7 @@ class Actor {
     {
         return getPosPrev();
     }
-	
+
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_ACTOR
diff --git a/LiteLoader/Header/MC/Automation.hpp b/LiteLoader/Header/MC/Automation.hpp
--- a/LiteLoader/Header/MC/Automation.hpp
+++ b/LiteLoader/Header/MC/Automation.hpp
@@ -12,7 +12,7 @@ namespace Automation {
 
 #define AFTER_EXTRA
 // Add Member There
-	class AutomationClient;
+    class AutomationClient;
     enum MessagePurpose;
 #undef AFTER_EXTRA
     MCAPI extern char const * BodyData;
diff --git a/LiteLoader/Header/MC/Biome.hpp b/LiteLoader/Header/MC/Biome.hpp
--- a/LiteLoader/Header/MC/Biome.hpp
+++ b/LiteLoader/Header/MC/Biome.hpp
@@ -6,13 +6,13 @@
 #define BEFORE_EXTRA
 // Include Headers or Declare Types Here
 enum VanillaBiomeTypes;
-    
+
 #undef BEFORE_EXTRA
 
 class Biome {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 public:
     enum BiomeTempCategory;
     LIAPI int getId() const;
@@ -25,8 +25,8 @@ class Biome {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_BIOME
 public:
-    class Biome& operator=(class Biome const &) = delete;
-    Biome(class Biome const &) = delete;
+    class Biome& operator=(class Biome const&) = delete;
+    Biome(class Biome const&) = delete;
     Biome() = delete;
 #endif
 
@@ -35,48 +35,45 @@ class Biome {
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_BIOME
 #endif
     MCAPI Biome(int);
-    MCAPI class Biome & addTag(class HashedString, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> &);
-    MCAPI bool canHaveSnowfall(class BlockSource const &, class BlockPos const &) const;
+    MCAPI class Biome& addTag(class HashedString, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>>&);
+    MCAPI bool canHaveSnowfall(class BlockSource const&, class BlockPos const&) const;
     MCAPI enum VanillaBiomeTypes getBiomeType() const;
-    MCAPI int getBirchFoliageColor(class BlockPos const &) const;
+    MCAPI int getBirchFoliageColor(class BlockPos const&) const;
     MCAPI float getDefaultBiomeTemperature() const;
     MCAPI float getDownfall() const;
-    MCAPI int getEvergreenFoliageColor(class BlockPos const &) const;
-    MCAPI int getFoliageColor(class BlockPos const &) const;
-    MCAPI int getMapBirchFoliageColor(class BlockPos const &) const;
-    MCAPI int getMapEvergreenFoliageColor(class BlockPos const &) const;
-    MCAPI int getMapFoliageColor(class BlockPos const &) const;
-    MCAPI int getMapGrassColor(class BlockPos const &) const;
-    MCAPI std::vector<class MobSpawnerData> const & getMobs() const;
-    MCAPI std::vector<class MobSpawnerData> & getMobsMutable();
+    MCAPI int getEvergreenFoliageColor(class BlockPos const&) const;
+    MCAPI int getFoliageColor(class BlockPos const&) const;
+    MCAPI int getMapBirchFoliageColor(class BlockPos const&) const;
+    MCAPI int getMapEvergreenFoliageColor(class BlockPos const&) const;
+    MCAPI int getMapFoliageColor(class BlockPos const&) const;
+    MCAPI int getMapGrassColor(class BlockPos const&) const;
+    MCAPI std::vector<class MobSpawnerData> const& getMobs() const;
+    MCAPI std::vector<class MobSpawnerData>& getMobsMutable();
     MCAPI int getSnowAccumulationLayers() const;
-    MCAPI float getTemperature(class BlockSource const &, class BlockPos const &) const;
+    MCAPI float getTemperature(class BlockSource const&, class BlockPos const&) const;
     MCAPI enum Biome::BiomeTempCategory getTemperatureCategory() const;
-    MCAPI float getTemperatureWorldGen(class BlockPos const &, short) const;
-    MCAPI bool hasTag(struct IDType<struct BiomeTagIDType> const &, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> const &) const;
-    MCAPI bool hasTag(class WellKnownTagID const &) const;
-    MCAPI bool hasTag(unsigned __int64, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> const &) const;
-    MCAPI void initEntity(class EntityRegistry &);
+    MCAPI float getTemperatureWorldGen(class BlockPos const&, short) const;
+    MCAPI bool hasTag(struct IDType<struct BiomeTagIDType> const&, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> const&) const;
+    MCAPI bool hasTag(class WellKnownTagID const&) const;
+    MCAPI bool hasTag(unsigned __int64, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> const&) const;
+    MCAPI void initEntity(class EntityRegistry&);
     MCAPI bool isHumid() const;
     MCAPI bool isSnowCovered() const;
-    MCAPI class Biome & setColor(int);
-    MCAPI class Biome & setColor(int, bool);
-    MCAPI class Biome & setDepthAndScale(struct BiomeHeight const &);
-    MCAPI class Biome & setMapWaterColor(int);
-    MCAPI class Biome & setName(std::string const &);
-    MCAPI class Biome & setNoRain();
-    MCAPI class Biome & setOceanRuinConfig(struct OceanRuinConfiguration const &);
-    MCAPI class Biome & setOddColor(int);
-    MCAPI class Biome & setSnowAccumulation(float, float);
-    MCAPI void writePacketData(class CompoundTag &, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>> &);
+    MCAPI class Biome& setColor(int);
+    MCAPI class Biome& setColor(int, bool);
+    MCAPI class Biome& setDepthAndScale(struct BiomeHeight const&);
+    MCAPI class Biome& setMapWaterColor(int);
+    MCAPI class Biome& setName(std::string const&);
+    MCAPI class Biome& setNoRain();
+    MCAPI class Biome& setOceanRuinConfig(struct OceanRuinConfiguration const&);
+    MCAPI class Biome& setOddColor(int);
+    MCAPI class Biome& setSnowAccumulation(float, float);
+    MCAPI void writePacketData(class CompoundTag&, class TagRegistry<struct IDType<struct BiomeTagIDType>, struct IDType<struct BiomeTagSetIDType>>&);
     MCAPI static class gsl::basic_string_span<char const, -1> const BACKCOMPAT_FOG_NAME;
     MCAPI static class mce::Color const DEFAULT_FOG_COLOR;
     MCAPI static class gsl::basic_string_span<char const, -1> const DEFAULT_FOG_ID;
     MCAPI static class mce::Color const DEFAULT_UNDERWATER_COLOR;
     MCAPI static class mce::Color const DEFAULT_WATER_COLOR;
     MCAPI static float const RAIN_TEMP_THRESHOLD;
-    MCAPI static void buildCachedTemperatureNoise(class LevelChunk &);
-
-
-
+    MCAPI static void buildCachedTemperatureNoise(class LevelChunk&);
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/Block.hpp b/LiteLoader/Header/MC/Block.hpp
--- a/LiteLoader/Header/MC/Block.hpp
+++ b/LiteLoader/Header/MC/Block.hpp
@@ -12,14 +12,14 @@
 class Block {
 
 #define AFTER_EXTRA
-// Add new members to class
+    // Add new members to class
 public:
-	LIAPI static Block* create(const string& str, unsigned short tileData);
-	LIAPI static Block* create(CompoundTag* nbt);
+    LIAPI static Block* create(const string& str, unsigned short tileData);
+    LIAPI static Block* create(CompoundTag* nbt);
 
     LIAPI string getTypeName() const;
-	LIAPI int getId() const;
-	LIAPI unsigned short getTileData();
+    LIAPI int getId() const;
+    LIAPI unsigned short getTileData();
     LIAPI std::unique_ptr<CompoundTag> getNbt();
     LIAPI bool setNbt(CompoundTag* nbt);
 
@@ -27,17 +27,17 @@ class Block {
         __int64 v2; // r8
         __int64 v3; // rax
         v2 = *(__int64*)(this + 16);
-        if (!v2 || (v3 = *(__int64*)(&a2 + 16)) == 0) 
+        if (!v2 || (v3 = *(__int64*)(&a2 + 16)) == 0)
             return false;
         return v2 == v3 && *(unsigned short*)(this + 8) == *(unsigned short*)(&a2 + 8);
     }
-	
+
     inline bool operator!=(class Block const& a2) const {
         __int64 v2; // r8
         __int64 v3; // rax
 
         v2 = *(__int64*)(this + 16);
-        if (!v2 || (v3 = *(__int64*)(&a2 + 16)) == 0) 
+        if (!v2 || (v3 = *(__int64*)(&a2 + 16)) == 0)
             return false;
         return v2 != v3 || *(unsigned short*)(this + 8) != *(unsigned short*)(&a2 + 8);
     }
@@ -45,8 +45,8 @@ class Block {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_BLOCK
 public:
-    class Block& operator=(class Block const &) = delete;
-    Block(class Block const &) = delete;
+    class Block& operator=(class Block const&) = delete;
+    Block(class Block const&) = delete;
     Block() = delete;
 #endif
 
@@ -56,25 +56,25 @@ class Block {
     /*1*/ virtual enum BlockRenderLayer getRenderLayer() const;
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_BLOCK
 #endif
-    MCAPI Block(unsigned short, class gsl::not_null<class BlockLegacy *>);
-    MCAPI Block(unsigned short, class gsl::not_null<class BlockLegacy *>, class CompoundTag, unsigned int const &);
-    MCAPI void addAABBs(class BlockSource const &, class BlockPos const &, class AABB const *, std::vector<class AABB> &) const;
-    MCAPI bool addCollisionShapes(class BlockSource const &, class BlockPos const &, class AABB const *, std::vector<class AABB> &, class optional_ref<class GetCollisionShapeInterface const>) const;
-    MCAPI class Block & addTag(class HashedString const &);
-    MCAPI void animateTick(class BlockSource &, class BlockPos const &, class Random &) const;
-    MCAPI class ItemInstance asItemInstance(class BlockSource &, class BlockPos const &) const;
-    MCAPI bool attack(class Player *, class BlockPos const &) const;
+    MCAPI Block(unsigned short, class gsl::not_null<class BlockLegacy*>);
+    MCAPI Block(unsigned short, class gsl::not_null<class BlockLegacy*>, class CompoundTag, unsigned int const&);
+    MCAPI void addAABBs(class BlockSource const&, class BlockPos const&, class AABB const*, std::vector<class AABB>&) const;
+    MCAPI bool addCollisionShapes(class BlockSource const&, class BlockPos const&, class AABB const*, std::vector<class AABB>&, class optional_ref<class GetCollisionShapeInterface const>) const;
+    MCAPI class Block& addTag(class HashedString const&);
+    MCAPI void animateTick(class BlockSource&, class BlockPos const&, class Random&) const;
+    MCAPI class ItemInstance asItemInstance(class BlockSource&, class BlockPos const&) const;
+    MCAPI bool attack(class Player*, class BlockPos const&) const;
     MCAPI bool breaksFallingBlocks(class BaseGameVersion) const;
     MCAPI std::string buildDescriptionId() const;
     MCAPI std::string buildDescriptionName() const;
     MCAPI void cacheComponentData();
-    MCAPI float calcGroundFriction(struct IMobMovementProxy const &, class BlockPos const &) const;
+    MCAPI float calcGroundFriction(struct IMobMovementProxy const&, class BlockPos const&) const;
     MCAPI bool canBeBrokenFromFalling() const;
-    MCAPI bool canBeBuiltOver(class BlockSource &, class BlockPos const &) const;
-    MCAPI bool canBeBuiltOver(class BlockSource &, class BlockPos const &, class BlockItem const &) const;
-    MCAPI bool canBeFertilized(class BlockSource &, class BlockPos const &, class Block const &) const;
+    MCAPI bool canBeBuiltOver(class BlockSource&, class BlockPos const&) const;
+    MCAPI bool canBeBuiltOver(class BlockSource&, class BlockPos const&, class BlockItem const&) const;
+    MCAPI bool canBeFertilized(class BlockSource&, class BlockPos const&, class Block const&) const;
     MCAPI bool canBeOriginalSurface() const;
-    MCAPI bool canConnect(class Block const &, unsigned char, class Block const &) const;
+    MCAPI bool canConnect(class Block const&, unsigned char, class Block const&) const;
     MCAPI bool canDamperVibrations() const;
     MCAPI bool canHaveExtraData() const;
     MCAPI bool canHurtAndBreakItem() const;
@@ -83,75 +83,75 @@ class Block {
     MCAPI bool canProvideFullSupport(unsigned char) const;
     MCAPI bool canProvideMultifaceSupport(unsigned char) const;
     MCAPI bool canProvideSupport(unsigned char, enum BlockSupportType) const;
-    MCAPI bool canSlide(class BlockSource &, class BlockPos const &) const;
-    MCAPI bool canSurvive(class BlockSource &, class BlockPos const &) const;
+    MCAPI bool canSlide(class BlockSource&, class BlockPos const&) const;
+    MCAPI bool canSurvive(class BlockSource&, class BlockPos const&) const;
     MCAPI bool causesFreezeEffect() const;
-    MCAPI bool checkIsPathable(class Actor &, class BlockPos const &, class BlockPos const &) const;
-    MCAPI class HitResult clip(class BlockSource const &, class BlockPos const &, class Vec3 const &, class Vec3 const &, bool) const;
-    MCAPI class HitResult clip(class BlockSource const &, class BlockPos const &, class Vec3 const &, class Vec3 const &, bool, class AABB const &) const;
-    MCAPI class Block const & copyState(class Block const &, class ItemState const &) const;
-    MCAPI bool dealsContactDamage(class Actor const &, bool) const;
-    MCAPI void destroy(class BlockSource &, class BlockPos const &, class Actor *) const;
-    MCAPI void entityInside(class BlockSource &, class BlockPos const &, class Actor &) const;
-    MCAPI void executeEvent(std::string const &, class RenderParams &) const;
-    MCAPI void executeItemEvent(class ItemStackBase &, std::string const &, class BlockSource &, class BlockPos const &, class Actor *) const;
-    MCAPI bool executeTrigger(class DefinitionTrigger const &, class RenderParams &) const;
-    MCAPI class AABB const & getAABB(class IConstBlockSource const &, class BlockPos const &, class AABB &, bool) const;
+    MCAPI bool checkIsPathable(class Actor&, class BlockPos const&, class BlockPos const&) const;
+    MCAPI class HitResult clip(class BlockSource const&, class BlockPos const&, class Vec3 const&, class Vec3 const&, bool) const;
+    MCAPI class HitResult clip(class BlockSource const&, class BlockPos const&, class Vec3 const&, class Vec3 const&, bool, class AABB const&) const;
+    MCAPI class Block const& copyState(class Block const&, class ItemState const&) const;
+    MCAPI bool dealsContactDamage(class Actor const&, bool) const;
+    MCAPI void destroy(class BlockSource&, class BlockPos const&, class Actor*) const;
+    MCAPI void entityInside(class BlockSource&, class BlockPos const&, class Actor&) const;
+    MCAPI void executeEvent(std::string const&, class RenderParams&) const;
+    MCAPI void executeItemEvent(class ItemStackBase&, std::string const&, class BlockSource&, class BlockPos const&, class Actor*) const;
+    MCAPI bool executeTrigger(class DefinitionTrigger const&, class RenderParams&) const;
+    MCAPI class AABB const& getAABB(class IConstBlockSource const&, class BlockPos const&, class AABB&, bool) const;
     MCAPI bool getAllowsRunes() const;
     MCAPI enum BlockActorType getBlockEntityType() const;
     MCAPI int getBurnOdds() const;
-    MCAPI bool getCollisionShape(class AABB &, class IConstBlockSource const &, class BlockPos const &, class optional_ref<class GetCollisionShapeInterface const>) const;
-    MCAPI int getColor(class BlockSource &, class BlockPos const &) const;
+    MCAPI bool getCollisionShape(class AABB&, class IConstBlockSource const&, class BlockPos const&, class optional_ref<class GetCollisionShapeInterface const>) const;
+    MCAPI int getColor(class BlockSource&, class BlockPos const&) const;
     MCAPI int getColor() const;
-    MCAPI int getComparatorSignal(class BlockSource &, class BlockPos const &, unsigned char) const;
-    MCAPI void getConnectedDirections(class BlockPos const &, class BlockSource &, bool &, bool &, bool &, bool &) const;
+    MCAPI int getComparatorSignal(class BlockSource&, class BlockPos const&, unsigned char) const;
+    MCAPI void getConnectedDirections(class BlockPos const&, class BlockSource&, bool&, bool&, bool&, bool&) const;
     MCAPI enum CreativeItemCategory getCreativeCategory() const;
     MCAPI class gsl::basic_string_span<char const, -1> getCreativeGroup() const;
-    MCAPI void getDebugText(std::vector<std::string> &, class BlockPos const &) const;
-    MCAPI class Block const & getDefaultState() const;
+    MCAPI void getDebugText(std::vector<std::string>&, class BlockPos const&) const;
+    MCAPI class Block const& getDefaultState() const;
     MCAPI std::string getDescriptionId() const;
     MCAPI float getDestroySpeed() const;
-    MCAPI int getDirectSignal(class BlockSource &, class BlockPos const &, int) const;
-    MCAPI class EntityContext & getEntityForModification() const;
-    MCAPI float getExplosionResistance(class Actor *) const;
+    MCAPI int getDirectSignal(class BlockSource&, class BlockPos const&, int) const;
+    MCAPI class EntityContext& getEntityForModification() const;
+    MCAPI float getExplosionResistance(class Actor*) const;
     MCAPI int getFlameOdds() const;
     MCAPI float getFriction() const;
-    MCAPI bool getIgnoresDestroyPermissions(class Actor &, class BlockPos const &) const;
-    MCAPI class BlockLegacy const & getLegacyBlock() const;
+    MCAPI bool getIgnoresDestroyPermissions(class Actor&, class BlockPos const&) const;
+    MCAPI class BlockLegacy const& getLegacyBlock() const;
     MCAPI struct Brightness getLight() const;
     MCAPI struct Brightness getLightEmission() const;
-    MCAPI class mce::Color getMapColor(class BlockSource &, class BlockPos const &) const;
-    MCAPI class Material const & getMaterial() const;
-    MCAPI class MobSpawnerData const * getMobToSpawn(class SpawnConditions const &, class BlockSource &) const;
-    MCAPI class HashedString const & getName() const;
-    MCAPI class Block const & getPlacementBlock(class Actor &, class BlockPos const &, unsigned char, class Vec3 const &, int) const;
-    MCAPI int getResourceCount(class Randomize &, int) const;
-    MCAPI unsigned int const & getRuntimeId() const;
-    MCAPI bool getSecondPart(class BlockSource const &, class BlockPos const &, class BlockPos &) const;
-    MCAPI class CompoundTag const & getSerializationId() const;
+    MCAPI class mce::Color getMapColor(class BlockSource&, class BlockPos const&) const;
+    MCAPI class Material const& getMaterial() const;
+    MCAPI class MobSpawnerData const* getMobToSpawn(class SpawnConditions const&, class BlockSource&) const;
+    MCAPI class HashedString const& getName() const;
+    MCAPI class Block const& getPlacementBlock(class Actor&, class BlockPos const&, unsigned char, class Vec3 const&, int) const;
+    MCAPI int getResourceCount(class Randomize&, int) const;
+    MCAPI unsigned int const& getRuntimeId() const;
+    MCAPI bool getSecondPart(class BlockSource const&, class BlockPos const&, class BlockPos&) const;
+    MCAPI class CompoundTag const& getSerializationId() const;
     MCAPI class ItemInstance getSilkTouchItemInstance() const;
     MCAPI float getThickness() const;
     MCAPI float getTranslucency() const;
     MCAPI int getVariant() const;
-    MCAPI class AABB const & getVisualShape(class AABB &, bool) const;
-    MCAPI class AABB const & getVisualShapeInWorld(class BlockSource &, class BlockPos const &, class AABB &, bool) const;
+    MCAPI class AABB const& getVisualShape(class AABB&, bool) const;
+    MCAPI class AABB const& getVisualShapeInWorld(class BlockSource&, class BlockPos const&, class AABB&, bool) const;
     MCAPI bool hasBlockEntity() const;
     MCAPI bool hasComparatorSignal() const;
     MCAPI bool hasProperty(enum BlockProperty) const;
     MCAPI bool hasPropertyNoLock(enum BlockProperty) const;
     MCAPI bool const hasRuntimeId() const;
-    MCAPI bool hasState(class ItemState const &) const;
-    MCAPI bool hasTag(class HashedString const &) const;
-    MCAPI bool hasTag(unsigned __int64 const &) const;
+    MCAPI bool hasState(class ItemState const&) const;
+    MCAPI bool hasTag(class HashedString const&) const;
+    MCAPI bool hasTag(unsigned __int64 const&) const;
     MCAPI bool ignoreEntitiesOnPistonMove() const;
-    MCAPI void initEntity(class EntityRegistry &);
-    MCAPI void initParams(class RenderParams &, class BlockSource &, class BlockPos const &, class Actor *) const;
+    MCAPI void initEntity(class EntityRegistry&);
+    MCAPI void initParams(class RenderParams&, class BlockSource&, class BlockPos const&, class Actor*) const;
     MCAPI bool isAir() const;
-    MCAPI bool isAttachedTo(class BlockSource &, class BlockPos const &, class BlockPos &) const;
+    MCAPI bool isAttachedTo(class BlockSource&, class BlockPos const&, class BlockPos&) const;
     MCAPI bool isAuxValueRelevantForPicking() const;
     MCAPI bool isBounceBlock() const;
     MCAPI bool isButtonBlock() const;
-    MCAPI bool isClimbable(struct IActorMovementProxy const &) const;
+    MCAPI bool isClimbable(struct IActorMovementProxy const&) const;
     MCAPI bool isContainerBlock() const;
     MCAPI bool isCropBlock() const;
     MCAPI bool isDoorBlock() const;
@@ -164,9 +164,9 @@ class Block {
     MCAPI bool isLeverBlock() const;
     MCAPI bool isMotionBlockingBlock() const;
     MCAPI bool isMultifaceBlock() const;
-    MCAPI bool isObstructingChests(class BlockSource &, class BlockPos const &) const;
-    MCAPI bool isPartialBlock(class BlockSource const &, class BlockPos const &) const;
-    MCAPI bool isPreservingMediumWhenPlaced(class Block const &) const;
+    MCAPI bool isObstructingChests(class BlockSource&, class BlockPos const&) const;
+    MCAPI bool isPartialBlock(class BlockSource const&, class BlockPos const&) const;
+    MCAPI bool isPreservingMediumWhenPlaced(class Block const&) const;
     MCAPI bool isRailBlock() const;
     MCAPI bool isSignalSource() const;
     MCAPI bool isSlabBlock() const;
@@ -177,75 +177,72 @@ class Block {
     MCAPI bool isStandingSign() const;
     MCAPI bool isStemBlock() const;
     MCAPI bool isThinFenceBlock() const;
-    MCAPI bool isTopPartialBlock(class BlockSource const &, class BlockPos const &) const;
+    MCAPI bool isTopPartialBlock(class BlockSource const&, class BlockPos const&) const;
     MCAPI bool isUnbreakable() const;
     MCAPI bool isWallBlock() const;
     MCAPI bool isWaterBlocking() const;
-    MCAPI class Block const & keepState(class ItemState const &) const;
-    MCAPI bool mayConsumeFertilizer(class BlockSource &) const;
-    MCAPI bool mayPick(class BlockSource const &, bool) const;
+    MCAPI class Block const& keepState(class ItemState const&) const;
+    MCAPI bool mayConsumeFertilizer(class BlockSource&) const;
+    MCAPI bool mayPick(class BlockSource const&, bool) const;
     MCAPI bool mayPick() const;
-    MCAPI bool mayPlace(class BlockSource &, class BlockPos const &) const;
-    MCAPI bool mayPlace(class BlockSource &, class BlockPos const &, unsigned char) const;
-    MCAPI bool mayPlaceOn(class BlockSource &, class BlockPos const &) const;
-    MCAPI void movedByPiston(class BlockSource &, class BlockPos const &) const;
-    MCAPI void neighborChanged(class BlockSource &, class BlockPos const &, class BlockPos const &) const;
-    MCAPI void onExploded(class BlockSource &, class BlockPos const &, class Actor *) const;
-    MCAPI void onFallOn(class BlockSource &, class BlockPos const &, class Actor &, float) const;
-    MCAPI bool onFertilized(class BlockSource &, class BlockPos const &, class Actor *, enum FertilizerType) const;
-    MCAPI void onLightningHit(class BlockSource &, class BlockPos const &) const;
-    MCAPI void onPlace(class BlockSource &, class BlockPos const &, class Block const &) const;
-    MCAPI void onPlayerPlacing(class BlockSource &, class BlockPos const &, class Actor &, unsigned char) const;
-    MCAPI void onProjectileHit(class BlockSource &, class BlockPos const &, class Actor const &) const;
-    MCAPI void onRemove(class BlockSource &, class BlockPos const &) const;
-    MCAPI void onStandOn(class EntityContext &, class BlockPos const &) const;
-    MCAPI void onStepOff(class Actor &, class BlockPos const &) const;
-    MCAPI void onStepOn(class Actor &, class BlockPos const &) const;
-    MCAPI void onStructureBlockPlace(class BlockSource &, class BlockPos const &) const;
-    MCAPI void onStructureNeighborBlockPlace(class BlockSource &, class BlockPos const &) const;
-    MCAPI void playerDestroy(class Player &, class BlockPos const &) const;
-    MCAPI bool playerWillDestroy(class Player &, class BlockPos const &) const;
-    MCAPI class ItemActor * popResource(class BlockSource &, class BlockPos const &, class ItemInstance const &) const;
+    MCAPI bool mayPlace(class BlockSource&, class BlockPos const&) const;
+    MCAPI bool mayPlace(class BlockSource&, class BlockPos const&, unsigned char) const;
+    MCAPI bool mayPlaceOn(class BlockSource&, class BlockPos const&) const;
+    MCAPI void movedByPiston(class BlockSource&, class BlockPos const&) const;
+    MCAPI void neighborChanged(class BlockSource&, class BlockPos const&, class BlockPos const&) const;
+    MCAPI void onExploded(class BlockSource&, class BlockPos const&, class Actor*) const;
+    MCAPI void onFallOn(class BlockSource&, class BlockPos const&, class Actor&, float) const;
+    MCAPI bool onFertilized(class BlockSource&, class BlockPos const&, class Actor*, enum FertilizerType) const;
+    MCAPI void onLightningHit(class BlockSource&, class BlockPos const&) const;
+    MCAPI void onPlace(class BlockSource&, class BlockPos const&, class Block const&) const;
+    MCAPI void onPlayerPlacing(class BlockSource&, class BlockPos const&, class Actor&, unsigned char) const;
+    MCAPI void onProjectileHit(class BlockSource&, class BlockPos const&, class Actor const&) const;
+    MCAPI void onRemove(class BlockSource&, class BlockPos const&) const;
+    MCAPI void onStandOn(class EntityContext&, class BlockPos const&) const;
+    MCAPI void onStepOff(class Actor&, class BlockPos const&) const;
+    MCAPI void onStepOn(class Actor&, class BlockPos const&) const;
+    MCAPI void onStructureBlockPlace(class BlockSource&, class BlockPos const&) const;
+    MCAPI void onStructureNeighborBlockPlace(class BlockSource&, class BlockPos const&) const;
+    MCAPI void playerDestroy(class Player&, class BlockPos const&) const;
+    MCAPI bool playerWillDestroy(class Player&, class BlockPos const&) const;
+    MCAPI class ItemActor* popResource(class BlockSource&, class BlockPos const&, class ItemInstance const&) const;
     MCAPI bool pushesOutItems() const;
     MCAPI bool pushesUpFallingBlocks() const;
-    MCAPI void queuedTick(class BlockSource &, class BlockPos const &, class Random &) const;
-    MCAPI void randomTick(class BlockSource &, class BlockPos const &, class Random &) const;
-    MCAPI class Vec3 randomlyModifyPosition(class BlockPos const &) const;
+    MCAPI void queuedTick(class BlockSource&, class BlockPos const&, class Random&) const;
+    MCAPI void randomTick(class BlockSource&, class BlockPos const&, class Random&) const;
+    MCAPI class Vec3 randomlyModifyPosition(class BlockPos const&) const;
     MCAPI bool shouldRandomTick() const;
     MCAPI bool shouldRandomTickExtraLayer() const;
-    MCAPI bool shouldStopFalling(class Actor &) const;
-    MCAPI void spawnResources(class BlockSource &, class BlockPos const &, class Randomize &, std::vector<class Item const *> *, float, int) const;
-    MCAPI void spawnResources(class BlockSource &, class BlockPos const &, class Block const &, class Randomize &, std::vector<class Item const *> *, float, int, class ItemStack const &) const;
-    MCAPI int telemetryVariant(class BlockSource &, class BlockPos const &) const;
+    MCAPI bool shouldStopFalling(class Actor&) const;
+    MCAPI void spawnResources(class BlockSource&, class BlockPos const&, class Randomize&, std::vector<class Item const*>*, float, int) const;
+    MCAPI void spawnResources(class BlockSource&, class BlockPos const&, class Block const&, class Randomize&, std::vector<class Item const*>*, float, int, class ItemStack const&) const;
+    MCAPI int telemetryVariant(class BlockSource&, class BlockPos const&) const;
     MCAPI std::string toDebugString() const;
-    MCAPI void transformOnFall(class BlockSource &, class BlockPos const &, class Actor *, float) const;
-    MCAPI void triggerEvent(class BlockSource &, class BlockPos const &, int, int) const;
-    MCAPI class CopperBehavior const * tryGetCopperBehavior() const;
-    MCAPI class Block const * tryGetInfested() const;
-    MCAPI class Block const * tryGetUninfested() const;
-    MCAPI void trySpawnResourcesOnExplosion(class BlockSource &, class BlockPos const &, class Block const &, std::vector<class Item const *> *, float, int) const;
-    MCAPI bool tryToPlace(class BlockSource &, class BlockPos const &, struct ActorBlockSyncMessage const *) const;
-    MCAPI bool tryToTill(class BlockSource &, class BlockPos const &, class Actor &, class ItemStack &) const;
-    MCAPI void updateEntityAfterFallOn(class BlockPos const &, struct UpdateEntityAfterFallOnInterface &) const;
-    MCAPI bool updateTallestCollisionShape(class BlockSource const &, class BlockPos const &, class AABB const &, class optional_ref<class GetCollisionShapeInterface const>, class AABB &, class Vec3 const &, float &) const;
-    MCAPI bool use(class Player &, class BlockPos const &, unsigned char) const;
+    MCAPI void transformOnFall(class BlockSource&, class BlockPos const&, class Actor*, float) const;
+    MCAPI void triggerEvent(class BlockSource&, class BlockPos const&, int, int) const;
+    MCAPI class CopperBehavior const* tryGetCopperBehavior() const;
+    MCAPI class Block const* tryGetInfested() const;
+    MCAPI class Block const* tryGetUninfested() const;
+    MCAPI void trySpawnResourcesOnExplosion(class BlockSource&, class BlockPos const&, class Block const&, std::vector<class Item const*>*, float, int) const;
+    MCAPI bool tryToPlace(class BlockSource&, class BlockPos const&, struct ActorBlockSyncMessage const*) const;
+    MCAPI bool tryToTill(class BlockSource&, class BlockPos const&, class Actor&, class ItemStack&) const;
+    MCAPI void updateEntityAfterFallOn(class BlockPos const&, struct UpdateEntityAfterFallOnInterface&) const;
+    MCAPI bool updateTallestCollisionShape(class BlockSource const&, class BlockPos const&, class AABB const&, class optional_ref<class GetCollisionShapeInterface const>, class AABB&, class Vec3 const&, float&) const;
+    MCAPI bool use(class Player&, class BlockPos const&, unsigned char) const;
     MCAPI static std::string const BLOCK_DESCRIPTION_PREFIX;
     MCAPI static float const SIZE_OFFSET;
 
-//protected:
+    // protected:
     MCAPI void buildSerializationId(unsigned int);
-    MCAPI void setRuntimeId(unsigned int const &) const;
+    MCAPI void setRuntimeId(unsigned int const&) const;
 
-//private:
+    // private:
     MCAPI bool _isSolid() const;
     MCAPI class BlockTypeRegistryReadLock _lockRegistryForRead() const;
     MCAPI void _tryInitEntityIfNotInitialized();
-    MCAPI class EntityContext const & getEntity() const;
+    MCAPI class EntityContext const& getEntity() const;
 
 
 protected:
-
 private:
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/BlockActor.hpp b/LiteLoader/Header/MC/BlockActor.hpp
--- a/LiteLoader/Header/MC/BlockActor.hpp
+++ b/LiteLoader/Header/MC/BlockActor.hpp
@@ -15,9 +15,8 @@ class BlockSource;
 class BlockActor {
 
 #define AFTER_EXTRA
-// Add new members to class
+    // Add new members to class
 public:
-    
     LIAPI bool refreshData();
     LIAPI bool refreshData(BlockSource* bs);
     LIAPI std::unique_ptr<CompoundTag> getNbt();
@@ -29,41 +28,41 @@ class BlockActor {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_BLOCKACTOR
 public:
-    class BlockActor& operator=(class BlockActor const &) = delete;
-    BlockActor(class BlockActor const &) = delete;
+    class BlockActor& operator=(class BlockActor const&) = delete;
+    BlockActor(class BlockActor const&) = delete;
     BlockActor() = delete;
 #endif
 
 
 public:
     /*0*/ virtual ~BlockActor();
-    /*1*/ virtual void load(class Level &, class CompoundTag const &, class DataLoadHelper &);
-    /*2*/ virtual bool save(class CompoundTag &) const;
-    /*3*/ virtual bool saveItemInstanceData(class CompoundTag &);
-    /*4*/ virtual void saveBlockData(class CompoundTag &, class BlockSource &) const;
-    /*5*/ virtual void loadBlockData(class CompoundTag const &, class BlockSource &, class DataLoadHelper &);
-    /*6*/ virtual void onCustomTagLoadDone(class BlockSource &);
-    /*7*/ virtual void tick(class BlockSource &);
-    /*8*/ virtual void onChanged(class BlockSource &);
-    /*9*/ virtual bool isMovable(class BlockSource &);
+    /*1*/ virtual void load(class Level&, class CompoundTag const&, class DataLoadHelper&);
+    /*2*/ virtual bool save(class CompoundTag&) const;
+    /*3*/ virtual bool saveItemInstanceData(class CompoundTag&);
+    /*4*/ virtual void saveBlockData(class CompoundTag&, class BlockSource&) const;
+    /*5*/ virtual void loadBlockData(class CompoundTag const&, class BlockSource&, class DataLoadHelper&);
+    /*6*/ virtual void onCustomTagLoadDone(class BlockSource&);
+    /*7*/ virtual void tick(class BlockSource&);
+    /*8*/ virtual void onChanged(class BlockSource&);
+    /*9*/ virtual bool isMovable(class BlockSource&);
     /*10*/ virtual bool isCustomNameSaved();
-    /*11*/ virtual void onPlace(class BlockSource &);
+    /*11*/ virtual void onPlace(class BlockSource&);
     /*12*/ virtual void __unk_vfn_12();
-    /*13*/ virtual void onRemoved(class BlockSource &);
+    /*13*/ virtual void onRemoved(class BlockSource&);
     /*14*/ virtual void triggerEvent(int, int);
     /*15*/ virtual void clearCache();
     /*16*/ virtual void __unk_vfn_16();
-    /*17*/ virtual float getShadowRadius(class BlockSource &) const;
+    /*17*/ virtual float getShadowRadius(class BlockSource&) const;
     /*18*/ virtual bool hasAlphaLayer() const;
-    /*19*/ virtual class BlockActor * getCrackEntity(class BlockSource &, class BlockPos const &);
-    /*20*/ virtual void getDebugText(std::vector<std::string> &, class BlockPos const &);
-    /*21*/ virtual std::string const & getCustomName() const;
-    /*22*/ virtual std::string const & getFilteredCustomName(class UIProfanityContext const &);
+    /*19*/ virtual class BlockActor* getCrackEntity(class BlockSource&, class BlockPos const&);
+    /*20*/ virtual void getDebugText(std::vector<std::string>&, class BlockPos const&);
+    /*21*/ virtual std::string const& getCustomName() const;
+    /*22*/ virtual std::string const& getFilteredCustomName(class UIProfanityContext const&);
     /*23*/ virtual std::string getName() const;
-    /*24*/ virtual void setCustomName(std::string const &);
-    /*25*/ virtual std::string getImmersiveReaderText(class BlockSource &);
+    /*24*/ virtual void setCustomName(std::string const&);
+    /*25*/ virtual std::string getImmersiveReaderText(class BlockSource&);
     /*26*/ virtual int getRepairCost() const;
-    /*27*/ virtual class PistonBlockActor * getOwningPiston(class BlockSource &);
+    /*27*/ virtual class PistonBlockActor* getOwningPiston(class BlockSource&);
     /*28*/ virtual void __unk_vfn_28();
     /*29*/ virtual void __unk_vfn_29();
     /*30*/ virtual void __unk_vfn_30();
@@ -71,50 +70,47 @@ class BlockActor {
     /*32*/ virtual void __unk_vfn_32();
     /*33*/ virtual void __unk_vfn_33();
     /*34*/ virtual void __unk_vfn_34();
-    /*35*/ virtual std::unique_ptr<class BlockActorDataPacket> _getUpdatePacket(class BlockSource &);
-    /*36*/ virtual void _onUpdatePacket(class CompoundTag const &, class BlockSource &);
-    /*37*/ virtual bool _playerCanUpdate(class Player const &) const;
+    /*35*/ virtual std::unique_ptr<class BlockActorDataPacket> _getUpdatePacket(class BlockSource&);
+    /*36*/ virtual void _onUpdatePacket(class CompoundTag const&, class BlockSource&);
+    /*37*/ virtual bool _playerCanUpdate(class Player const&) const;
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_BLOCKACTOR
     MCVAPI void eraseLootTable();
-    MCVAPI void fixupOnLoad(class LevelChunk &);
-    MCVAPI class Container * getContainer();
-    MCVAPI class Container const * getContainer() const;
-    MCVAPI void onChunkLoaded(class LevelChunk &);
-    MCVAPI void onChunkUnloaded(class LevelChunk &);
+    MCVAPI void fixupOnLoad(class LevelChunk&);
+    MCVAPI class Container* getContainer();
+    MCVAPI class Container const* getContainer() const;
+    MCVAPI void onChunkLoaded(class LevelChunk&);
+    MCVAPI void onChunkUnloaded(class LevelChunk&);
     MCVAPI void onMove();
-    MCVAPI void onNeighborChanged(class BlockSource &, class BlockPos const &);
+    MCVAPI void onNeighborChanged(class BlockSource&, class BlockPos const&);
 #endif
-    MCAPI BlockActor(enum BlockActorType, class BlockPos const &, std::string const &);
-    MCAPI void assignBlockIfNotAssigned(class BlockSource &);
-    MCAPI class AABB const & getAABB() const;
-    MCAPI class Block const * getBlock() const;
-    MCAPI class BlockPos const & getPosition() const;
-    MCAPI std::unique_ptr<class BlockActorDataPacket> getServerUpdatePacket(class BlockSource &);
-    MCAPI enum BlockActorType const & getType() const;
+    MCAPI BlockActor(enum BlockActorType, class BlockPos const&, std::string const&);
+    MCAPI void assignBlockIfNotAssigned(class BlockSource&);
+    MCAPI class AABB const& getAABB() const;
+    MCAPI class Block const* getBlock() const;
+    MCAPI class BlockPos const& getPosition() const;
+    MCAPI std::unique_ptr<class BlockActorDataPacket> getServerUpdatePacket(class BlockSource&);
+    MCAPI enum BlockActorType const& getType() const;
     MCAPI bool const ignoreLighting() const;
     MCAPI bool isType(enum BlockActorType) const;
-    MCAPI void moveTo(class BlockPos const &);
-    MCAPI bool onUpdatePacket(class CompoundTag const &, class BlockSource &, class Player const *);
+    MCAPI void moveTo(class BlockPos const&);
+    MCAPI bool onUpdatePacket(class CompoundTag const&, class BlockSource&, class Player const*);
     MCAPI void setBB(class AABB);
     MCAPI void setChanged();
     MCAPI void setCustomNameSaved(bool);
     MCAPI void setIgnoreLighting(bool);
     MCAPI void setMovable(bool);
-    MCAPI static bool isType(class BlockActor &, enum BlockActorType);
-    MCAPI static class std::shared_ptr<class BlockActor> loadStatic(class Level &, class CompoundTag const &, class DataLoadHelper &);
+    MCAPI static bool isType(class BlockActor&, enum BlockActorType);
+    MCAPI static class std::shared_ptr<class BlockActor> loadStatic(class Level&, class CompoundTag const&, class DataLoadHelper&);
 
-//protected:
+    // protected:
     MCAPI void _resetAABB();
 
-//private:
+    // private:
     MCAPI static class std::map<std::string, enum BlockActorType, struct std::less<std::string>, class std::allocator<struct std::pair<std::string const, enum BlockActorType>>> _createIdClassMap();
 
 
 protected:
-
 private:
     MCAPI static class std::map<enum BlockActorType, std::string, struct std::less<enum BlockActorType>, class std::allocator<struct std::pair<enum BlockActorType const, std::string>>> const mClassIdMap;
     MCAPI static class std::map<std::string, enum BlockActorType, struct std::less<std::string>, class std::allocator<struct std::pair<std::string const, enum BlockActorType>>> const mIdClassMap;
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/BlockPos.hpp b/LiteLoader/Header/MC/BlockPos.hpp
--- a/LiteLoader/Header/MC/BlockPos.hpp
+++ b/LiteLoader/Header/MC/BlockPos.hpp
@@ -4,12 +4,8 @@ class Vec3;
 class BlockPos {
 public:
     int x, y, z;
-    inline BlockPos()
-        : BlockPos(0, 0, 0){};
-    inline BlockPos(int mx, int my, int mz)
-        : x(mx)
-        , y(my)
-        , z(mz){};
+    inline BlockPos() : BlockPos(0, 0, 0){};
+    inline BlockPos(int mx, int my, int mz) : x(mx), y(my), z(mz){};
 
     MCAPI BlockPos(class ChunkPos const&, class ChunkBlockPos const&, short);
     MCAPI BlockPos(class ChunkPos const&, int);
@@ -63,7 +59,9 @@ class BlockPos {
 
 
     int& operator[](int index) {
-        if (index < 0 || index > 2) { return (&x)[0]; }
+        if (index < 0 || index > 2) {
+            return (&x)[0];
+        }
         return (&x)[index];
     }
 
diff --git a/LiteLoader/Header/MC/BlockSource.hpp b/LiteLoader/Header/MC/BlockSource.hpp
--- a/LiteLoader/Header/MC/BlockSource.hpp
+++ b/LiteLoader/Header/MC/BlockSource.hpp
@@ -19,7 +19,7 @@ struct ClipParameters
 {
     MCAPI static const std::function<bool(class Block const&)> CHECK_ALL_BLOCKS;
 };
-	LIAPI BlockInstance getBlockInstance(BlockPos);
+    LIAPI BlockInstance getBlockInstance(BlockPos);
 
 #undef AFTER_EXTRA
 
diff --git a/LiteLoader/Header/MC/BoundingBox.hpp b/LiteLoader/Header/MC/BoundingBox.hpp
--- a/LiteLoader/Header/MC/BoundingBox.hpp
+++ b/LiteLoader/Header/MC/BoundingBox.hpp
@@ -14,18 +14,14 @@ class BoundingBox {
     LIAPI class AABB toAABB() const;
 
 
-    inline BoundingBox(class BoundingBox const& k)
-        : min(k.min)
-        , max(k.max){};
-    inline BoundingBox(BlockPos const& p1, BlockPos const& p2)
-        : min(p1)
-        , max(p2){};
-    inline BoundingBox()
-        : min(BlockPos::MIN)
-        , max(BlockPos::MIN){};
+    inline BoundingBox(class BoundingBox const& k) : min(k.min), max(k.max){};
+    inline BoundingBox(BlockPos const& p1, BlockPos const& p2) : min(p1), max(p2){};
+    inline BoundingBox() : min(BlockPos::MIN), max(BlockPos::MIN){};
 
     inline BlockPos& operator[](int index) {
-        if (index < 0 || index > 1) { return (&min)[0]; }
+        if (index < 0 || index > 1) {
+            return (&min)[0];
+        }
         return (&min)[index];
     }
 
@@ -70,9 +66,11 @@ class BoundingBox {
     }
 
     inline void forEachBlockInBox(const std::function<void(const BlockPos&)>& todo) {
-        for (int y = min.y; y <= max.y; y++)
-            for (int x = min.x; x <= max.x; x++)
-                for (int z = min.z; z <= max.z; z++) { todo({x, y, z}); }
+        for (int y = min.y; y <= max.y; ++y)
+            for (int x = min.x; x <= max.x; ++x)
+                for (int z = min.z; z <= max.z; ++z) {
+                    todo({x, y, z});
+                }
     }
 
     inline BoundingBox merge(BoundingBox const& a) {
diff --git a/LiteLoader/Header/MC/ChangeMobPropertyPacket.hpp b/LiteLoader/Header/MC/ChangeMobPropertyPacket.hpp
--- a/LiteLoader/Header/MC/ChangeMobPropertyPacket.hpp
+++ b/LiteLoader/Header/MC/ChangeMobPropertyPacket.hpp
@@ -15,10 +15,10 @@ class ChangeMobPropertyPacket : public Packet {
     ActorUniqueID mUid;
     string mProperty;
     bool mBool;
-	string mString;
-	int mInt;
-	float mFloat;
-	
+    string mString;
+    int mInt;
+    float mFloat;
+
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_CHANGEMOBPROPERTYPACKET
diff --git a/LiteLoader/Header/MC/Command.hpp b/LiteLoader/Header/MC/Command.hpp
--- a/LiteLoader/Header/MC/Command.hpp
+++ b/LiteLoader/Header/MC/Command.hpp
@@ -9,9 +9,8 @@
 #include "CommandParameterData.hpp"
 #include "CommandFlag.hpp"
 class CommandRegistry;
-//class CommandRegistry::Symbol;
-enum CommandPermissionLevel : char
-{
+// class CommandRegistry::Symbol;
+enum CommandPermissionLevel : char {
     Any = 0,
     GameMasters = 1,
     Admin = 2,
@@ -38,7 +37,7 @@ enum class OriginType : char {
     Script = 14,
     ExecuteContext = 15,
 
-    DedicatedServer = 7,//Server
+    DedicatedServer = 7, // Server
 };
 
 class CommandOutput;
@@ -48,19 +47,18 @@ class CommandOutput;
 class Command {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 
 protected:
     int version;                       // 8
     CommandRegistry* registry;         // 16
-    CommandRegistry::Symbol symbol;    // 24, 
+    CommandRegistry::Symbol symbol;    // 24,
     CommandPermissionLevel permission; // 28
     CommandFlag flag;                  // 30
 
 public:
     template <typename T>
-    static bool checkHasTargets(CommandSelectorResults<T> const& a, CommandOutput& b)
-    {
+    static bool checkHasTargets(CommandSelectorResults<T> const& a, CommandOutput& b) {
         bool (*sym)(CommandSelectorResults<T> const& a, CommandOutput& b);
         if constexpr (std::is_same<T, class Actor>()) {
             sym = (decltype(sym))dlsym("??$checkHasTargets@VActor@@@Command@@KA_NAEBV?$CommandSelectorResults@VActor@@@@AEAVCommandOutput@@@Z");
@@ -73,35 +71,33 @@ class Command {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMAND
 public:
-    class Command& operator=(class Command const &) = delete;
-    Command(class Command const &) = delete;
+    class Command& operator=(class Command const&) = delete;
+    Command(class Command const&) = delete;
 #endif
 
 
 public:
     /*0*/ virtual ~Command();
-    /*1*/ virtual void execute(class CommandOrigin const &, class CommandOutput &) const = 0;
+    /*1*/ virtual void execute(class CommandOrigin const&, class CommandOutput&) const = 0;
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_COMMAND
 #endif
     MCAPI Command();
     MCAPI std::string getCommandName() const;
     MCAPI bool hasFlag(struct CommandFlag) const;
-    MCAPI void run(class CommandOrigin const &, class CommandOutput &) const;
+    MCAPI void run(class CommandOrigin const&, class CommandOutput&) const;
     MCAPI static std::string const WILDCARD_TOKEN;
-    MCAPI static bool validRange(int, int, int, class CommandOutput &);
-    MCAPI static bool validRange(float, float, float, class CommandOutput &);
+    MCAPI static bool validRange(int, int, int, class CommandOutput&);
+    MCAPI static bool validRange(float, float, float, class CommandOutput&);
 
-//protected:
-    MCAPI class CommandRegistry const & getRegistry() const;
-    MCAPI void sendTelemetry(class CommandOrigin const &, class CommandOutput &) const;
-    MCAPI bool shouldSendTelemetry(class CommandOrigin const &) const;
-    MCAPI static class Player * getPlayerFromOrigin(class CommandOrigin const &);
-    MCAPI static bool isTemplateLockedAction(class CommandOrigin const &);
-    MCAPI static bool isWildcard(class CommandSelectorBase const &);
-    MCAPI static bool validData(int, unsigned short &, class CommandOutput &);
+    // protected:
+    MCAPI class CommandRegistry const& getRegistry() const;
+    MCAPI void sendTelemetry(class CommandOrigin const&, class CommandOutput&) const;
+    MCAPI bool shouldSendTelemetry(class CommandOrigin const&) const;
+    MCAPI static class Player* getPlayerFromOrigin(class CommandOrigin const&);
+    MCAPI static bool isTemplateLockedAction(class CommandOrigin const&);
+    MCAPI static bool isWildcard(class CommandSelectorBase const&);
+    MCAPI static bool validData(int, unsigned short&, class CommandOutput&);
 
 
 protected:
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/CommandOutput.hpp b/LiteLoader/Header/MC/CommandOutput.hpp
--- a/LiteLoader/Header/MC/CommandOutput.hpp
+++ b/LiteLoader/Header/MC/CommandOutput.hpp
@@ -18,12 +18,11 @@
 class CommandOutput {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 public:
-
     /**
      * @brief Output a message(without I18N).
-     * 
+     *
      * @param str  The message
      */
     LIAPI void addMessage(const std::string& str);
@@ -39,10 +38,10 @@ class CommandOutput {
      * @param str  The message
      */
     LIAPI void error(const string& str);
-    
+
     /**
      * @brief Set the output language code of this CommandOutput object.
-     * 
+     *
      * @param code  The language code
      */
     inline void setLanguageCode(const std::string& code = "") {
@@ -50,7 +49,7 @@ class CommandOutput {
     }
     /**
      * @brief Set the output language code of this CommandOutput object(convenience func).
-     * 
+     *
      * @param ori  The command origin object for the CommandOutput object
      */
     inline void setLanguageCode(const CommandOrigin& ori) {
@@ -58,10 +57,11 @@ class CommandOutput {
         if (PluginOwnData::has(I18N::POD_KEY)) {
             auto& i18n = PluginOwnData::get<I18N>(I18N::POD_KEY);
             switch ((OriginType)ori.getOriginType()) {
-                case OriginType::Player: 
+                case OriginType::Player:
                     code = ori.getPlayer()->getLanguageCode();
                     break;
-                default: code = i18n.defaultLangCode;
+                default:
+                    code = i18n.defaultLangCode;
                     break;
             }
         }
@@ -70,17 +70,18 @@ class CommandOutput {
 
     /**
      * @brief Output a message(I18N, convenience func).
-     * 
+     *
      * @tparam Args    ...
      * @param  format  The str to translate and format
      * @param  args    The format arguments
      * @see    tr
      */
-    template <typename ... Args>
+    template <typename... Args>
     inline void trAddMessage(const std::string& format, const Args&... args) {
         if (PluginOwnData::has(POD_COMMANDOUTPUT_LANGCODE))
             this->addMessage(trl(PluginOwnData::get<std::string>(POD_COMMANDOUTPUT_LANGCODE), format, args...));
-        else this->addMessage(tr(format, args...));
+        else
+            this->addMessage(tr(format, args...));
     }
 
     /**
@@ -95,12 +96,13 @@ class CommandOutput {
     inline void trSuccess(const std::string& format, const Args&... args) {
         if (PluginOwnData::has(POD_COMMANDOUTPUT_LANGCODE))
             this->success(trl(PluginOwnData::get<std::string>(POD_COMMANDOUTPUT_LANGCODE), format, args...));
-        else this->success(tr(format, args...));
+        else
+            this->success(tr(format, args...));
     }
-    
+
     /**
      * @brief Output a error message(I18N, convenience func).
-     * 
+     *
      * @tparam Args    ...
      * @param  format  The str to translate and format
      * @param  args    The format arguments
@@ -110,14 +112,15 @@ class CommandOutput {
     inline void trError(const std::string& format, const Args&... args) {
         if (PluginOwnData::has(POD_COMMANDOUTPUT_LANGCODE))
             this->error(trl(PluginOwnData::get<std::string>(POD_COMMANDOUTPUT_LANGCODE), format, args...));
-        else this->error(tr(format, args...));
+        else
+            this->error(tr(format, args...));
     }
 
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMANDOUTPUT
 public:
-    class CommandOutput& operator=(class CommandOutput const &) = delete;
+    class CommandOutput& operator=(class CommandOutput const&) = delete;
     CommandOutput() = delete;
 #endif
 
@@ -125,30 +128,28 @@ class CommandOutput {
 public:
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_COMMANDOUTPUT
 #endif
-    MCAPI CommandOutput(class CommandOutput const &);
+    MCAPI CommandOutput(class CommandOutput const&);
     MCAPI CommandOutput(enum CommandOutputType);
-    MCAPI void addToResultList(std::string const &, std::string const &);
-    MCAPI void addToResultList(std::string const &, class Actor const &);
+    MCAPI void addToResultList(std::string const&, std::string const&);
+    MCAPI void addToResultList(std::string const&, class Actor const&);
     MCAPI bool empty() const;
-    MCAPI void error(std::string const &, std::vector<class CommandOutputParameter> const &);
-    MCAPI void forceOutput(std::string const &, std::vector<class CommandOutputParameter> const &);
-    MCAPI class CommandPropertyBag const & getData() const;
-    MCAPI std::vector<class CommandOutputMessage> const & getMessages() const;
+    MCAPI void error(std::string const&, std::vector<class CommandOutputParameter> const&);
+    MCAPI void forceOutput(std::string const&, std::vector<class CommandOutputParameter> const&);
+    MCAPI class CommandPropertyBag const& getData() const;
+    MCAPI std::vector<class CommandOutputMessage> const& getMessages() const;
     MCAPI int getSuccessCount() const;
     MCAPI enum CommandOutputType getType() const;
     MCAPI bool hasPlayerText() const;
-    MCAPI void load(enum CommandOutputType, int, std::vector<class CommandOutputMessage> &&, std::unique_ptr<class CommandPropertyBag> &&);
+    MCAPI void load(enum CommandOutputType, int, std::vector<class CommandOutputMessage>&&, std::unique_ptr<class CommandPropertyBag>&&);
     MCAPI void setHasPlayerText();
-    MCAPI void success(std::string const &, std::vector<class CommandOutputParameter> const &);
+    MCAPI void success(std::string const&, std::vector<class CommandOutputParameter> const&);
     MCAPI void success();
     MCAPI bool wantsData() const;
     MCAPI ~CommandOutput();
 
-//private:
-    MCAPI void addMessage(std::string const &, std::vector<class CommandOutputParameter> const &, enum CommandOutputMessageType);
+    // private:
+    MCAPI void addMessage(std::string const&, std::vector<class CommandOutputParameter> const&, enum CommandOutputMessageType);
 
 
 private:
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/CommandRegistry.hpp b/LiteLoader/Header/MC/CommandRegistry.hpp
--- a/LiteLoader/Header/MC/CommandRegistry.hpp
+++ b/LiteLoader/Header/MC/CommandRegistry.hpp
@@ -27,38 +27,35 @@ class CommandParameterData;
 #pragma region typeid
 
 template <typename T>
-class typeid_t
-{
+class typeid_t {
 public:
     inline static unsigned short count = 0;
     unsigned short value;
     typeid_t<T>(typeid_t<T> const& id)
-        : value(id.value){};
+    : value(id.value){};
     typeid_t<T>(unsigned short value)
-        : value(value){};
+    : value(value){};
 };
 template <>
-class typeid_t<CommandRegistry>
-{
+class typeid_t<CommandRegistry> {
 public:
     MCAPI static unsigned short count;
     unsigned short value;
     typeid_t<CommandRegistry>(typeid_t<CommandRegistry> const& id)
-        : value(id.value){};
+    : value(id.value){};
     typeid_t<CommandRegistry>(unsigned short value)
-        : value(value){};
+    : value(value){};
 };
 template <typename T, typename T2>
-typeid_t<T> type_id()
-{
+typeid_t<T> type_id() {
     static typeid_t<T> id = typeid_t<T>::count++;
     return id;
 }
 
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDamageCause>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, AutomaticID<class Dimension, int>>();
-//template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>();
-//template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, bool>();
+// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>();
+// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, bool>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandMessage>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, enum CommandOperator>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandPosition>();
@@ -76,40 +73,36 @@ template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class Relative
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, std::string>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, std::unique_ptr<class Command>>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class WildcardCommandSelector<Actor>>();
-//template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, CommandItem>();
+// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, CommandItem>();
 template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, CommandIntegerRange>();
-//template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>();
+// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>();
 
-template<>
-inline typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>()
-{
+template <>
+inline typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>() {
     static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@PEBUActorDefinitionIdentifier@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
-    //static typeid_t<CommandRegistry> id = ([]() -> typeid_t<CommandRegistry> {
-    //    CommandParameterData data = SymCall("??$mandatory@VRideCommand@@PEBUActorDefinitionIdentifier@@@commands@@YA?AVCommandParameterData@@PEQRideCommand@@PEBUActorDefinitionIdentifier@@PEBDPEQ2@_N@Z",
-    //            CommandParameterData, void*, char const*, uintptr_t)(nullptr, "entityType", 0);
-    //    return data.tid;
-    //    })();
+    // static typeid_t<CommandRegistry> id = ([]() -> typeid_t<CommandRegistry> {
+    //     CommandParameterData data = SymCall("??$mandatory@VRideCommand@@PEBUActorDefinitionIdentifier@@@commands@@YA?AVCommandParameterData@@PEQRideCommand@@PEBUActorDefinitionIdentifier@@PEBDPEQ2@_N@Z",
+    //             CommandParameterData, void*, char const*, uintptr_t)(nullptr, "entityType", 0);
+    //     return data.tid;
+    //     })();
     return id;
 };
 
 template <>
-inline typeid_t<CommandRegistry> type_id<CommandRegistry, CommandItem>()
-{
+inline typeid_t<CommandRegistry> type_id<CommandRegistry, CommandItem>() {
     static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@VCommandItem@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
     return id;
 };
 
 template <>
-inline typeid_t<CommandRegistry> type_id<CommandRegistry, bool>()
-{
+inline typeid_t<CommandRegistry> type_id<CommandRegistry, bool>() {
     static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@_N@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
     return id;
 };
 
 
 template <>
-inline typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>()
-{
+inline typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>() {
     static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@PEBVBlock@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
     return id;
 };
@@ -121,7 +114,7 @@ inline typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>()
 class CommandRegistry {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 
 public:
     struct ParseTable;
@@ -132,28 +125,24 @@ class CommandRegistry {
         MCAPI Symbol(class Symbol const&);
         MCAPI unsigned __int64 toIndex() const;
         MCAPI int value() const;
-        inline bool operator==(Symbol const& right) const
-        {
+        inline bool operator==(Symbol const& right) const {
             return val == right.val;
         }
-        inline std::string toString() const
-        {
+        inline std::string toString() const {
             return Global<CommandRegistry>->symbolToString(*this);
         }
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             return fmt::format("<Symbol {}({})>", toString(), val);
         }
     };
 
-    struct ParseToken
-    {
+    struct ParseToken {
         std::unique_ptr<CommandRegistry::ParseToken> child;
         std::unique_ptr<CommandRegistry::ParseToken> next;
         CommandRegistry::ParseToken* parent;
-        const char* text; //24
-        uint32_t length;  //32
-        Symbol type;      //36
+        const char* text; // 24
+        uint32_t length;  // 32
+        Symbol type;      // 36
         MCAPI std::string toString() const;
         //{
         //    if (text)
@@ -172,8 +161,7 @@ class CommandRegistry {
         //    auto v11 = v8->text;
         //    return std::string(v11, v10 - v11);
         //};
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             return fmt::format("<ParseToken {}>", toString());
         }
     };
@@ -183,7 +171,7 @@ class CommandRegistry {
         std::vector<std::string>&) const;
 
     struct Overload {
-        using FactoryFn = std::unique_ptr<class Command>(*)();
+        using FactoryFn = std::unique_ptr<class Command> (*)();
 
         CommandVersion version;                   // 0
         FactoryFn factory;                        // 8
@@ -192,13 +180,12 @@ class CommandRegistry {
         std::vector<Symbol> syms = {};            // 48
 
         LIAPI Overload(CommandVersion version,
-                        FactoryFn factory,
-                        std::vector<CommandParameterData>&& args);
+                       FactoryFn factory,
+                       std::vector<CommandParameterData>&& args);
 
         LIAPI ~Overload();
 
-        inline std::string toDebugString()
-        {
+        inline std::string toDebugString() {
             return fmt::format("<Overload>");
         }
     };
@@ -217,32 +204,30 @@ class CommandRegistry {
         bool b84;
 
         inline Signature(std::string_view name,
-            std::string_view desc,
-            CommandPermissionLevel perm,
-            Symbol symbol,
-            CommandFlag flag)
-            : name(name), desc(desc), perm(perm), main_symbol(symbol), flag(flag) {}
-
-        inline std::string toDebugString() const
-        {
+                         std::string_view desc,
+                         CommandPermissionLevel perm,
+                         Symbol symbol,
+                         CommandFlag flag)
+        : name(name), desc(desc), perm(perm), main_symbol(symbol), flag(flag) {
+        }
+
+        inline std::string toDebugString() const {
             return fmt::format("<Signature {}>", name);
         }
     };
 
     struct SoftEnum {
-        std::string name;               // 0
-        std::vector<std::string> list;  // 32
+        std::string name;              // 0
+        std::vector<std::string> list; // 32
     };
 
-    struct Enum
-    {
+    struct Enum {
         std::string name;                                                                           // 0
         typeid_t<CommandRegistry> type;                                                             // 32
         ParseFn parse;                                                                              // 40
-        std::vector<std::tuple<unsigned long, unsigned long, unsigned long, unsigned long>> values; //48
+        std::vector<std::tuple<unsigned long, unsigned long, unsigned long, unsigned long>> values; // 48
 
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             return fmt::format("<Enum {}>", name);
         }
     };
@@ -270,10 +255,9 @@ class CommandRegistry {
     };
 
 #ifdef COMMAND_REGISTRY_EXTRA
-    inline static std::string toString(std::vector<Symbol> const& syms)
-    {
+    inline static std::string toString(std::vector<Symbol> const& syms) {
         std::ostringstream oss;
-        bool first=true;
+        bool first = true;
         for (auto& sym : syms) {
             if (!first)
                 oss << ", ";
@@ -282,37 +266,31 @@ class CommandRegistry {
         }
         return oss.str();
     }
-    struct ParseRule
-    {
+    struct ParseRule {
         Symbol sym;
         std::function<ParseToken*(ParseToken&, Symbol)> func;
         std::vector<Symbol> syms;
         CommandVersion version;
-        inline std::string toDebugString() const
-        {
-            
+        inline std::string toDebugString() const {
+
             return fmt::format("<ParseRule {} - [{}]>", sym.toDebugString(), toString(syms));
         }
     };
-    struct ParseTable
-    {
+    struct ParseTable {
         std::map<Symbol, std::vector<Symbol>> first;
         std::map<Symbol, std::vector<Symbol>> follow;
         std::map<std::pair<Symbol, Symbol>, int> predict;
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             std::ostringstream oss;
             bool f = true;
-            for (auto& [k,v] : first)
-            {
+            for (auto& [k, v] : first) {
                 if (!f)
                     oss << ", ";
                 oss << k.toString() << ":[" << toString(v) << "]";
                 f = false;
             }
             oss << "\n";
-            for (auto& [k,v] : follow)
-            {
+            for (auto& [k, v] : follow) {
                 if (!f)
                     oss << ", ";
                 oss << k.toString() << ":[" << toString(v) << "]";
@@ -321,26 +299,21 @@ class CommandRegistry {
             return fmt::format("<ParseTable>[{}]", oss.str());
         }
     };
-    struct OptionalParameterChain
-    {
+    struct OptionalParameterChain {
         int parameterCount;
         int followingRuleIndex;
         Symbol paramSymbol;
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             return fmt::format("<OptionalParameterChain {},{},{}>", parameterCount, followingRuleIndex, paramSymbol.toDebugString());
         }
     };
-    struct Factorization
-    {
+    struct Factorization {
         Symbol sym;
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             return fmt::format("<Factorization {}>", sym.toDebugString());
         }
     };
-    struct RegistryState
-    {
+    struct RegistryState {
         int signatureCount;
         int enumValueCount;
         int postfixCount;
@@ -353,17 +326,14 @@ class CommandRegistry {
         std::vector<unsigned int> constrainedValueCount;
         std::vector<unsigned int> softEnumValuesCount;
     };
-    struct ConstrainedValue
-    {
+    struct ConstrainedValue {
         Symbol mValue;
         Symbol mEnum;
         std::vector<unsigned char> mConstraints;
-        inline std::string toDebugString() const
-        {
+        inline std::string toDebugString() const {
             std::ostringstream oss;
             bool first = true;
-            for (auto& i : mConstraints)
-            {
+            for (auto& i : mConstraints) {
                 if (!first)
                     oss << ", ";
                 oss << (int)i;
@@ -402,13 +372,12 @@ class CommandRegistry {
     std::vector<RegistryState> mStateStack;                                                 // 528
     ParamSymbols mArgs;                                                                     // 552
     CommandOverrideFunctor mCommandOverrideFunctor;                                         // 640
-    //704
+    // 704
 
     inline void printAll() const;
     inline void printSize() const;
 
-    void test()
-    {
+    void test() {
         auto mParseTableMapCopy = mParseTableMap;
         auto mEnumLookupCopy = mEnumLookup;
         auto mEnumValueLookupCopy = mEnumValueLookup;
@@ -468,7 +437,7 @@ class CommandRegistry {
     inline void registerOverload(std::string const& name, Params... params) {
         registerOverload(name, &allocateCommand<T>, {params...});
     }
-    
+
     template <typename Type>
     bool
         fakeParse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector<std::string>&) const {
@@ -561,16 +530,16 @@ class CommandRegistry {
 private:
     template <typename T>
     bool parse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector<std::string>&) const {
-            
+
     };
 
 public:
     template <typename T>
-    inline static ParseFn getParseFn(){
-        if constexpr (!std::is_same_v<enum CommandOperator,T> && std::is_enum_v<T>)
+    inline static ParseFn getParseFn() {
+        if constexpr (!std::is_same_v<enum CommandOperator, T> && std::is_enum_v<T>)
             return &fakeParse<T>;
-        //else
-        //    return &parse<T>;
+        // else
+        //     return &parse<T>;
         bool (CommandRegistry::*ptr)(void*, CommandRegistry::ParseToken const&,
                                      CommandOrigin const&, int, std::string&,
                                      std::vector<std::string>&) const;
@@ -587,8 +556,7 @@ class CommandRegistry {
                       CommandOrigin const&,
                       int,
                       std::string&,
-                      std::vector<std::string>&) const
-    {
+                      std::vector<std::string>&) const {
         auto data = getEnumData(token);
         *(int*)target = (int)data;
         return true;
@@ -598,19 +566,17 @@ class CommandRegistry {
                          CommandOrigin const&,
                          int,
                          std::string&,
-                         std::vector<std::string>&) const
-    {
+                         std::vector<std::string>&) const {
         auto data = token.toString();
         *(std::string*)target = data;
         return true;
     }
     bool parseEnumStringAndInt(void* target,
-                         CommandRegistry::ParseToken const& token,
-                         CommandOrigin const&,
-                         int,
-                         std::string&,
-                         std::vector<std::string>&) const
-    {
+                               CommandRegistry::ParseToken const& token,
+                               CommandOrigin const&,
+                               int,
+                               std::string&,
+                               std::vector<std::string>&) const {
         auto str = token.toString();
         auto data = getEnumData(token);
         *(std::pair<std::string, int>*)target = {str, (int)data};
@@ -620,9 +586,8 @@ class CommandRegistry {
     template <typename Type, typename IDConverter = CommandRegistry::DefaultIdConverter<Type>>
     bool parseEnum(
         void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&,
-        std::vector<std::string>&) const
-    {
-        //fmt::print(token.toString() + '\n');
+        std::vector<std::string>&) const {
+        // fmt::print(token.toString() + '\n');
         auto data = getEnumData(token);
         *(Type*)target = IDConverter{}(data);
         return true;
@@ -648,9 +613,9 @@ class CommandRegistry {
         return _addEnumValuesInternal(name, converted, tid, &CommandRegistry::parseEnumInt).val;
     }
 
-    //inline static typeid_t<CommandRegistry> getNextTypeId() {
-    //    return typeid_t<CommandRegistry>::count++;
-    //}
+    // inline static typeid_t<CommandRegistry> getNextTypeId() {
+    //     return typeid_t<CommandRegistry>::count++;
+    // }
 
     template <typename T>
     CommandRegistry* addEnum(char const* name, std::vector<std::pair<std::string, T>> const& values) {
@@ -666,8 +631,8 @@ class CommandRegistry {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMANDREGISTRY
 public:
-    class CommandRegistry& operator=(class CommandRegistry const &) = delete;
-    CommandRegistry(class CommandRegistry const &) = delete;
+    class CommandRegistry& operator=(class CommandRegistry const&) = delete;
+    CommandRegistry(class CommandRegistry const&) = delete;
 #endif
 
 
@@ -675,93 +640,91 @@ class CommandRegistry {
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_COMMANDREGISTRY
 #endif
     MCAPI CommandRegistry();
-    MCAPI void addEnumValueConstraints(std::string const &, std::vector<std::string> const &, enum SemanticConstraint);
-    MCAPI int addEnumValues(std::string const &, std::vector<std::string> const &);
-    MCAPI int addSoftEnum(std::string const &, std::vector<std::string>);
-    MCAPI void addSoftEnumValues(std::string const &, std::vector<std::string>);
+    MCAPI void addEnumValueConstraints(std::string const&, std::vector<std::string> const&, enum SemanticConstraint);
+    MCAPI int addEnumValues(std::string const&, std::vector<std::string> const&);
+    MCAPI int addSoftEnum(std::string const&, std::vector<std::string>);
+    MCAPI void addSoftEnumValues(std::string const&, std::vector<std::string>);
     MCAPI void addSpectatorModeEnumValue();
-    MCAPI bool buildSelector(struct ActorSelectorArgs const &, class CommandSelectorBase *, std::string &) const;
-    MCAPI std::vector<std::string> getAliases(std::string const &) const;
-    MCAPI std::vector<std::string> getAlphabeticalLookup(class CommandOrigin const &) const;
-    MCAPI std::string getCommandName(std::string const &) const;
-    MCAPI struct CommandSyntaxInformation getCommandOverloadSyntaxInformation(class CommandOrigin const &, std::string const &) const;
-    MCAPI enum CommandStatus getCommandStatus(std::string const &) const;
-    MCAPI bool isCommandOfType(std::string const &, enum CommandTypeFlag) const;
-    MCAPI bool isValidCommand(std::string const &) const;
+    MCAPI bool buildSelector(struct ActorSelectorArgs const&, class CommandSelectorBase*, std::string&) const;
+    MCAPI std::vector<std::string> getAliases(std::string const&) const;
+    MCAPI std::vector<std::string> getAlphabeticalLookup(class CommandOrigin const&) const;
+    MCAPI std::string getCommandName(std::string const&) const;
+    MCAPI struct CommandSyntaxInformation getCommandOverloadSyntaxInformation(class CommandOrigin const&, std::string const&) const;
+    MCAPI enum CommandStatus getCommandStatus(std::string const&) const;
+    MCAPI bool isCommandOfType(std::string const&, enum CommandTypeFlag) const;
+    MCAPI bool isValidCommand(std::string const&) const;
     MCAPI void registerAlias(std::string, std::string);
-    MCAPI void registerCommand(std::string const &, char const *, enum CommandPermissionLevel, struct CommandFlag, struct CommandFlag);
-    MCAPI void removeSoftEnumValues(std::string const &, std::vector<std::string>);
-    MCAPI bool requiresCheatsEnabled(std::string const &) const;
+    MCAPI void registerCommand(std::string const&, char const*, enum CommandPermissionLevel, struct CommandFlag, struct CommandFlag);
+    MCAPI void removeSoftEnumValues(std::string const&, std::vector<std::string>);
+    MCAPI bool requiresCheatsEnabled(std::string const&) const;
     MCAPI class AvailableCommandsPacket serializeAvailableCommands() const;
-    MCAPI void setCommandRegistrationOverride(class std::function<void (struct CommandFlag &, std::string const &)>);
-    MCAPI void setNetworkUpdateCallback(class std::function<void (class Packet const &)>);
-    MCAPI void setScoreCallback(class std::function<int (bool &, std::string const &, class Actor const &)>);
-    MCAPI void setSoftEnumValues(std::string const &, std::vector<std::string>);
+    MCAPI void setCommandRegistrationOverride(class std::function<void(struct CommandFlag&, std::string const&)>);
+    MCAPI void setNetworkUpdateCallback(class std::function<void(class Packet const&)>);
+    MCAPI void setScoreCallback(class std::function<int(bool&, std::string const&, class Actor const&)>);
+    MCAPI void setSoftEnumValues(std::string const&, std::vector<std::string>);
     MCAPI ~CommandRegistry();
-    MCAPI static char const * COMMAND_NAME_ENUM_NAME;
-    MCAPI static char const * FUNCTION_NAME_SOFTENUM_NAME;
-    MCAPI static char const * HASITEM_PARAM_DATA;
-    MCAPI static char const * HASITEM_PARAM_ITEM;
-    MCAPI static char const * HASITEM_PARAM_LOCATION;
-    MCAPI static char const * HASITEM_PARAM_QUANTITY;
-    MCAPI static char const * HASITEM_PARAM_SLOT;
-    MCAPI static char const * TAG_VALUES_SOFTENUM_NAME;
-
-//private:
-    MCAPI void _addEnumValueConstraintsInternal(std::vector<struct std::pair<unsigned __int64, unsigned int>> const &, enum SemanticConstraint);
-    MCAPI class CommandRegistry::Symbol _addEnumValuesInternal(std::string const &, std::vector<struct std::pair<std::string, unsigned __int64>> const &, class typeid_t<class CommandRegistry>, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const);
-    MCAPI class CommandRegistry::Symbol _addEnumValuesInternal(std::string const &, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const &, class typeid_t<class CommandRegistry>, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const);
+    MCAPI static char const* COMMAND_NAME_ENUM_NAME;
+    MCAPI static char const* FUNCTION_NAME_SOFTENUM_NAME;
+    MCAPI static char const* HASITEM_PARAM_DATA;
+    MCAPI static char const* HASITEM_PARAM_ITEM;
+    MCAPI static char const* HASITEM_PARAM_LOCATION;
+    MCAPI static char const* HASITEM_PARAM_QUANTITY;
+    MCAPI static char const* HASITEM_PARAM_SLOT;
+    MCAPI static char const* TAG_VALUES_SOFTENUM_NAME;
+
+    // private:
+    MCAPI void _addEnumValueConstraintsInternal(std::vector<struct std::pair<unsigned __int64, unsigned int>> const&, enum SemanticConstraint);
+    MCAPI class CommandRegistry::Symbol _addEnumValuesInternal(std::string const&, std::vector<struct std::pair<std::string, unsigned __int64>> const&, class typeid_t<class CommandRegistry>, bool (CommandRegistry::*)(void*, struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&) const);
+    MCAPI class CommandRegistry::Symbol _addEnumValuesInternal(std::string const&, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const&, class typeid_t<class CommandRegistry>, bool (CommandRegistry::*)(void*, struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&) const);
     MCAPI class CommandRegistry::Symbol _addFunctionSoftEnum();
     MCAPI class CommandRegistry::Symbol _getConstrainedParamEnumSymbol(class CommandRegistry::Symbol) const;
-    MCAPI bool _isCommandElementValid(std::string const &) const;
-    MCAPI bool _matchesEnumConstraintsSet(class CommandRegistry::Symbol const &, class CommandOrigin const &, class CommandRegistry::Symbol const &, enum SemanticConstraint) const;
-    MCAPI void addEnumValuesToExisting(unsigned int, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const &);
-    MCAPI class CommandRegistry::Symbol addPostfix(std::string const &);
-    MCAPI void addRule(class CommandRegistry::Symbol, std::vector<class CommandRegistry::Symbol> &&, class std::function<struct CommandRegistry::ParseToken * (struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol)>, class CommandVersion);
+    MCAPI bool _isCommandElementValid(std::string const&) const;
+    MCAPI bool _matchesEnumConstraintsSet(class CommandRegistry::Symbol const&, class CommandOrigin const&, class CommandRegistry::Symbol const&, enum SemanticConstraint) const;
+    MCAPI void addEnumValuesToExisting(unsigned int, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const&);
+    MCAPI class CommandRegistry::Symbol addPostfix(std::string const&);
+    MCAPI void addRule(class CommandRegistry::Symbol, std::vector<class CommandRegistry::Symbol>&&, class std::function<struct CommandRegistry::ParseToken*(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol)>, class CommandVersion);
     MCAPI void addSemanticConstraint(enum SemanticConstraint);
-    MCAPI class CommandRegistry::Symbol addSoftTerminal(std::string const &);
-    MCAPI void buildFirstSet(struct CommandRegistry::ParseTable &, class CommandRegistry::Symbol, unsigned int) const;
-    MCAPI void buildFollowSet(struct CommandRegistry::ParseTable &, class CommandRegistry::Symbol, unsigned int, class std::set<class CommandRegistry::Symbol, struct std::less<class CommandRegistry::Symbol>, class std::allocator<class CommandRegistry::Symbol>> &) const;
-    MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const &, std::vector<class CommandParameterData> const &, std::vector<class CommandRegistry::Symbol> const &);
-    MCAPI void buildOverload(struct CommandRegistry::Overload &);
+    MCAPI class CommandRegistry::Symbol addSoftTerminal(std::string const&);
+    MCAPI void buildFirstSet(struct CommandRegistry::ParseTable&, class CommandRegistry::Symbol, unsigned int) const;
+    MCAPI void buildFollowSet(struct CommandRegistry::ParseTable&, class CommandRegistry::Symbol, unsigned int, class std::set<class CommandRegistry::Symbol, struct std::less<class CommandRegistry::Symbol>, class std::allocator<class CommandRegistry::Symbol>>&) const;
+    MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const&, std::vector<class CommandParameterData> const&, std::vector<class CommandRegistry::Symbol> const&);
+    MCAPI void buildOverload(struct CommandRegistry::Overload&);
     MCAPI void buildParseTable(unsigned int) const;
-    MCAPI class CommandRegistry::Symbol buildRules(struct CommandRegistry::Signature &, std::vector<struct CommandRegistry::Overload *> const &, unsigned __int64);
-    MCAPI bool checkOriginCommandFlags(class CommandOrigin const &, struct CommandFlag, enum CommandPermissionLevel) const;
-    MCAPI std::unique_ptr<class Command> createCommand(struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const;
-    MCAPI std::string describe(struct CommandRegistry::Signature const &, std::string const &, struct CommandRegistry::Overload const &, unsigned int, unsigned int *, unsigned int *) const;
-    MCAPI std::string describe(class CommandParameterData const &) const;
+    MCAPI class CommandRegistry::Symbol buildRules(struct CommandRegistry::Signature&, std::vector<struct CommandRegistry::Overload*> const&, unsigned __int64);
+    MCAPI bool checkOriginCommandFlags(class CommandOrigin const&, struct CommandFlag, enum CommandPermissionLevel) const;
+    MCAPI std::unique_ptr<class Command> createCommand(struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&) const;
+    MCAPI std::string describe(struct CommandRegistry::Signature const&, std::string const&, struct CommandRegistry::Overload const&, unsigned int, unsigned int*, unsigned int*) const;
+    MCAPI std::string describe(class CommandParameterData const&) const;
     MCAPI std::string describe(class CommandRegistry::Symbol) const;
-    MCAPI struct CommandRegistry::Signature const * findCommand(std::string const &) const;
-    MCAPI struct CommandRegistry::Signature * findCommand(std::string const &);
-    MCAPI class CommandRegistry::Symbol findEnumValue(std::string const &) const;
-    MCAPI class CommandRegistry::Symbol findIdentifierInfo(std::string const &) const;
-    MCAPI class CommandRegistry::Symbol findPostfix(std::string const &) const;
-    MCAPI std::vector<class CommandRegistry::Symbol> first(struct CommandRegistry::ParseTable &, std::vector<class CommandRegistry::Symbol> const &) const;
-    MCAPI void forEachNonTerminal(class std::function<void (class CommandRegistry::Symbol)>) const;
-    MCAPI unsigned __int64 getEnumData(struct CommandRegistry::ParseToken const &) const;
-    MCAPI struct InvertableFilter<std::string> getInvertableFilter(struct CommandRegistry::ParseToken const &) const;
+    MCAPI struct CommandRegistry::Signature const* findCommand(std::string const&) const;
+    MCAPI struct CommandRegistry::Signature* findCommand(std::string const&);
+    MCAPI class CommandRegistry::Symbol findEnumValue(std::string const&) const;
+    MCAPI class CommandRegistry::Symbol findIdentifierInfo(std::string const&) const;
+    MCAPI class CommandRegistry::Symbol findPostfix(std::string const&) const;
+    MCAPI std::vector<class CommandRegistry::Symbol> first(struct CommandRegistry::ParseTable&, std::vector<class CommandRegistry::Symbol> const&) const;
+    MCAPI void forEachNonTerminal(class std::function<void(class CommandRegistry::Symbol)>) const;
+    MCAPI unsigned __int64 getEnumData(struct CommandRegistry::ParseToken const&) const;
+    MCAPI struct InvertableFilter<std::string> getInvertableFilter(struct CommandRegistry::ParseToken const&) const;
     MCAPI bool isValid(class CommandRegistry::Symbol) const;
-    MCAPI bool originCanRun(class CommandOrigin const &, struct CommandRegistry::Overload const &) const;
-    MCAPI bool originCanRun(class CommandOrigin const &, struct CommandRegistry::Signature const &) const;
-    MCAPI bool parseSelector(struct ActorSelectorArgs &, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const;
-    MCAPI bool parseSelector(class CommandSelectorBase *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &, bool) const;
-    MCAPI void registerOverloadInternal(struct CommandRegistry::Signature &, struct CommandRegistry::Overload &);
-    MCAPI void setupOverloadRules(struct CommandRegistry::Signature &, struct CommandRegistry::Overload &);
+    MCAPI bool originCanRun(class CommandOrigin const&, struct CommandRegistry::Overload const&) const;
+    MCAPI bool originCanRun(class CommandOrigin const&, struct CommandRegistry::Signature const&) const;
+    MCAPI bool parseSelector(struct ActorSelectorArgs&, struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&) const;
+    MCAPI bool parseSelector(class CommandSelectorBase*, struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&, bool) const;
+    MCAPI void registerOverloadInternal(struct CommandRegistry::Signature&, struct CommandRegistry::Overload&);
+    MCAPI void setupOverloadRules(struct CommandRegistry::Signature&, struct CommandRegistry::Overload&);
     MCAPI std::string symbolToString(class CommandRegistry::Symbol) const;
-    MCAPI static std::string _removeStringQuotes(std::string const &);
-    MCAPI static struct CommandRegistry::ParseToken * collapse(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol);
-    MCAPI static struct CommandRegistry::ParseToken * collapseOn(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
-    MCAPI static struct CommandRegistry::ParseToken * expand(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol);
-    MCAPI static struct CommandRegistry::ParseToken * expandExcept(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
-    MCAPI static struct CommandRegistry::ParseToken * fold(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
-    MCAPI static struct CommandRegistry::ParseToken * kill(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol);
-    MCAPI static bool readFloat(float &, struct CommandRegistry::ParseToken const &, std::string &, std::vector<std::string> &);
-    MCAPI static bool readInt(int &, struct CommandRegistry::ParseToken const &, std::string &, std::vector<std::string> &);
-    MCAPI static bool readRelativeCoordinate(bool &, float &, struct CommandRegistry::ParseToken const &, bool, std::string &, std::vector<std::string> &);
+    MCAPI static std::string _removeStringQuotes(std::string const&);
+    MCAPI static struct CommandRegistry::ParseToken* collapse(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol);
+    MCAPI static struct CommandRegistry::ParseToken* collapseOn(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
+    MCAPI static struct CommandRegistry::ParseToken* expand(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol);
+    MCAPI static struct CommandRegistry::ParseToken* expandExcept(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
+    MCAPI static struct CommandRegistry::ParseToken* fold(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol, class CommandRegistry::Symbol);
+    MCAPI static struct CommandRegistry::ParseToken* kill(struct CommandRegistry::ParseToken&, class CommandRegistry::Symbol);
+    MCAPI static bool readFloat(float&, struct CommandRegistry::ParseToken const&, std::string&, std::vector<std::string>&);
+    MCAPI static bool readInt(int&, struct CommandRegistry::ParseToken const&, std::string&, std::vector<std::string>&);
+    MCAPI static bool readRelativeCoordinate(bool&, float&, struct CommandRegistry::ParseToken const&, bool, std::string&, std::vector<std::string>&);
 
 
 private:
-    MCAPI static struct std::pair<bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const, class CommandRegistry::Symbol> const ParseRuleSymbols[];
-
-
+    MCAPI static struct std::pair<bool (CommandRegistry::*)(void*, struct CommandRegistry::ParseToken const&, class CommandOrigin const&, int, std::string&, std::vector<std::string>&) const, class CommandRegistry::Symbol> const ParseRuleSymbols[];
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/CommandVersion.hpp b/LiteLoader/Header/MC/CommandVersion.hpp
--- a/LiteLoader/Header/MC/CommandVersion.hpp
+++ b/LiteLoader/Header/MC/CommandVersion.hpp
@@ -11,18 +11,18 @@
 class CommandVersion {
 
 #define AFTER_EXTRA
-// Add Member There  
+    // Add Member There
 public:
-int Min = 1, Max = 0x7FFFFFFF;
-CommandVersion(){};
+    int Min = 1, Max = 0x7FFFFFFF;
+    CommandVersion(){};
 
 #define DISABLE_CONSTRUCTOR_PREVENTION_COMMANDVERSION
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMANDVERSION
 public:
-    class CommandVersion& operator=(class CommandVersion const &) = delete;
-    CommandVersion(class CommandVersion const &) = delete;
+    class CommandVersion& operator=(class CommandVersion const&) = delete;
+    CommandVersion(class CommandVersion const&) = delete;
     CommandVersion() = delete;
 #endif
 
@@ -31,11 +31,8 @@ CommandVersion(){};
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_COMMANDVERSION
 #endif
     MCAPI CommandVersion(int, int);
-    MCAPI bool covers(class CommandVersion const &) const;
+    MCAPI bool covers(class CommandVersion const&) const;
     MCAPI bool isCompatible(int) const;
     MCAPI static int const CurrentVersion;
-    MCAPI static enum CurrentCmdVersion const getVersionMapping(class SemVersion const &);
-
-
-
+    MCAPI static enum CurrentCmdVersion const getVersionMapping(class SemVersion const&);
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/ConnectionRequest.hpp b/LiteLoader/Header/MC/ConnectionRequest.hpp
--- a/LiteLoader/Header/MC/ConnectionRequest.hpp
+++ b/LiteLoader/Header/MC/ConnectionRequest.hpp
@@ -18,10 +18,10 @@ class ConnectionRequest {
 // Add Member There
 
 public:
-	std::unique_ptr<UnverifiedCertificate> certificateData;
-	std::unique_ptr<Certificate> certificate;
-	std::unique_ptr<WebToken> rawToken;
-	uint8_t clientSubId;
+    std::unique_ptr<UnverifiedCertificate> certificateData;
+    std::unique_ptr<Certificate> certificate;
+    std::unique_ptr<WebToken> rawToken;
+    uint8_t clientSubId;
 
 #undef AFTER_EXTRA
 
diff --git a/LiteLoader/Header/MC/Container.hpp b/LiteLoader/Header/MC/Container.hpp
--- a/LiteLoader/Header/MC/Container.hpp
+++ b/LiteLoader/Header/MC/Container.hpp
@@ -13,17 +13,17 @@ class Container {
 #define AFTER_EXTRA
 // Add new members to class
 public:
-	LIAPI std::string getTypeName();
+    LIAPI std::string getTypeName();
 
-	LIAPI bool addItem_s(ItemStack* item);
-	LIAPI bool addItemToFirstEmptySlot_s(ItemStack* item);
-	LIAPI bool removeItem_s(int slot, unsigned int number);
-	LIAPI ItemStack* getSlot(int slot);
-	LIAPI std::vector<const ItemStack*> getAllSlots();
-	LIAPI int getSize();
+    LIAPI bool addItem_s(ItemStack* item);
+    LIAPI bool addItemToFirstEmptySlot_s(ItemStack* item);
+    LIAPI bool removeItem_s(int slot, unsigned int number);
+    LIAPI ItemStack* getSlot(int slot);
+    LIAPI std::vector<const ItemStack*> getAllSlots();
+    LIAPI int getSize();
 
     // static??
-	LIAPI bool hasContainer(Vec3& pos, int dim);
+    LIAPI bool hasContainer(Vec3& pos, int dim);
     // static??
     LIAPI Container* getContainerAt(Vec3& pos, int dim);
 #undef AFTER_EXTRA
diff --git a/LiteLoader/Header/MC/Core.hpp b/LiteLoader/Header/MC/Core.hpp
--- a/LiteLoader/Header/MC/Core.hpp
+++ b/LiteLoader/Header/MC/Core.hpp
@@ -93,7 +93,7 @@ class PathBuffer
     PathBuffer() = delete;
     PathBuffer(PathBuffer const&) = delete;
     PathBuffer(PathBuffer const&&) = delete;
-	
+
     T value;
     operator T&() noexcept
     {
diff --git a/LiteLoader/Header/MC/DataItem.hpp b/LiteLoader/Header/MC/DataItem.hpp
--- a/LiteLoader/Header/MC/DataItem.hpp
+++ b/LiteLoader/Header/MC/DataItem.hpp
@@ -4,137 +4,136 @@
 
 #define BEFORE_EXTRA
 // Include Headers or Declare Types Here
-enum class ActorDataIDs : unsigned short
-{
-    FLAGS                               = 0,   // Int64
-    HEALTH                              = 1,   // Int
-    VARIANT                             = 2,   // Int
-    COLOR                               = 3,   // Byte
-    NAMETAG                             = 4,   // String
-    OWNER                               = 5,   // Int64
-    TARGET                              = 6,   // Int64
-    AIR                                 = 7,   // Short
-    POTION_COLOR                        = 8,   // Int (ARGB!)
-    POTION_AMBIENT                      = 9,   // Byte
-    JUMP_DURATION                       = 10,  // Byte (not Int64?)
-    HURT_TIME                           = 11,  // Int (minecart/boat)
-    HURT_DIRECTION                      = 12,  // Int (minecart/boat)
-    PADDLE_TIME_LEFT                    = 13,  // Float
-    PADDLE_TIME_RIGHT                   = 14,  // Float
-    EXPERIENCE_VALUE                    = 15,  // Int (xp orb)
-    DISPLAY_ITEM                        = 16,  // Byte    Int    CompoundTag
-    HORSE_FLAGS                         = 16,  // Int, old
-    WITHER_SKULL_IS_DANGEROUS           = 16,  // Byte, old
-    MINECART_DISPLAY_OFFSET             = 17,  // Int    Int64    Vec3
-    ARROW_SHOOTER_ID                    = 17,  // Int64, old
-    MINECART_HAS_DISPLAY                = 18,  // Byte    Int64
-    HORSE_TYPE                          = 19,  // Byte
-    SWELL                               = 19,  // old
-    OLD_SWELL                           = 20,  // old
-    SWELL_DIR                           = 21,  // old
-    CHARGE_AMOUNT                       = 22,  // Byte
-    ENDERMAN_HELD_RUNTIME_ID            = 23,  // Int, (not Short?)
-    ACTOR_AGE                           = 24,  // Byte, (not Short?)
-    //UNKNOWN_25                          = 25,  // 25 Byte Int
-    PLAYER_FLAGS                        = 26,  // Byte
-    PLAYER_INDEX                        = 27,  // Int
-    PLAYER_BED_POSITION                 = 28,  // BlockPos
-    FIREBALL_POWER_X                    = 29,  // Float
-    FIREBALL_POWER_Y                    = 30,  // Float
-    FIREBALL_POWER_Z                    = 31,  // Float
-    AUX_POWER                           = 32,  // old
-    FISH_X                              = 33,  // old
-    FISH_Z                              = 34,  // old
-    FISH_ANGLE                          = 35,  // old
-    POTION_AUX_VALUE                    = 36,  // Short
-    LEAD_HOLDER                         = 37,  // Int64
-    SCALE                               = 38,  // Float
-    INTERACTIVE_TAG                     = 39,  // Byte, (not String?)
-    NPC_SKIN_ID                         = 40,  // String
-    URL_TAG                             = 41,  // String
-    MAX_AIR                             = 42,  // Short
-    MARK_VARIANT                        = 43,  // Int
-    CONTAINER_TYPE                      = 44,  // Byte
-    CONTAINER_BASE_SIZE                 = 45,  // Int
-    CONTAINER_EXTRA_SLOTS_PER_STRENGTH  = 46,  // Int
-    BLOCK_TARGET                        = 47,  // BlockPos (ENDER CRYSTAL)
-    WITHER_INVULNERABLE_TICKS           = 48,  // Int
-    WITHER_TARGET_1                     = 49,  // Int64
-    WITHER_TARGET_2                     = 50,  // Int64
-    WITHER_TARGET_3                     = 51,  // Int64
-    AERIAL_ATTACK                       = 52,  // Short
-    BOUNDING_BOX_WIDTH                  = 53,  // Float
-    BOUNDING_BOX_HEIGHT                 = 54,  // Float
-    FUSE_LENGTH                         = 55,  // Int
-    RIDER_SEAT_POSITION                 = 56,  // Vec3
-    RIDER_ROTATION_LOCKED               = 57,  // Byte
-    RIDER_MAX_ROTATION                  = 58,  // Float
-    RIDER_MIN_ROTATION                  = 59,  // Byte, (not Float?)
-    //UNKNOWN_60                          = 60,  // Float
-    AREA_EFFECT_CLOUD_RADIUS            = 61,  // Float
-    AREA_EFFECT_CLOUD_WAITING           = 62,  // Int
-    AREA_EFFECT_CLOUD_PARTICLE_ID       = 63,  // Int
-    SHULKER_PEEK_ID                     = 64,  // Int
-    SHULKER_ATTACH_FACE                 = 65,  // Byte
-    SHULKER_ATTACHED                    = 66,  // Short
-    SHULKER_ATTACH_POS                  = 67,  // BlockPos
-    TRADING_PLAYER_EID                  = 68,  // Int64
-    TRADING_CAREER                      = 69,
-    HAS_COMMAND_BLOCK                   = 70,  // Byte
-    COMMAND_BLOCK_COMMAND               = 71,  // String
-    COMMAND_BLOCK_LAST_OUTPUT           = 72,  // String
-    COMMAND_BLOCK_TRACK_OUTPUT          = 73,  // Byte
-    CONTROLLING_RIDER_SEAT_NUMBER       = 74,  // Byte
-    STRENGTH                            = 75,  // Int
-    MAX_STRENGTH                        = 76,  // Int
-    SPELL_CASTING_COLOR                 = 77,  // Int
-    LIMITED_LIFE                        = 78,  // Int
-    ARMOR_STAND_POSE_INDEX              = 79,  // Int
-    ENDER_CRYSTAL_TIME_OFFSET           = 80,  // Int
-    ALWAYS_SHOW_NAMETAG                 = 81,  // Byte
-    COLOR_2                             = 82,  // Byte
-    NAME_AUTHOR                         = 83,
-    SCORE_TAG                           = 84,  // String
-    BALLOON_ATTACHED_ENTITY             = 85,  // Int64
-    PUFFERFISH_SIZE                     = 86,  // Byte
-    BUBBLE_TIME                         = 87,
-    AGENT                               = 88,  // Int64
-    SITTING_AMOUNT                      = 89,  // Float
-    SITTING_AMOUNT_PREVIOUS             = 90,  // Float
-    EATING_COUNTER                      = 91,  // Int
-    FLAGS_EXTENDED                      = 92,  // Int64
-    LAYING_AMOUNT                       = 93,  // Float
-    LAYING_AMOUNT_PREVIOUS              = 94,  // Float
-    DURATION                            = 95,
-    SPAWN_TIME                          = 96,
-    CHANGE_RATE                         = 97,
-    CHANGE_ON_PICKUP                    = 98,
-    PICKUP_COUNT                        = 99,
-    INTERACT_TEXT                       = 100, // String
-    TRADE_TIER                          = 101, // Int
-    MAX_TRADE_TIER                      = 102, // Int
-    TRADE_EXPERIENCE                    = 103, // Int
-    SKIN_ID                             = 104, // Int
-    SPAWNING_FRAMES                     = 105, // Int
-    COMMAND_BLOCK_TICK_DELAY            = 106, // Int
+enum class ActorDataIDs : unsigned short {
+    FLAGS = 0,                      // Int64
+    HEALTH = 1,                     // Int
+    VARIANT = 2,                    // Int
+    COLOR = 3,                      // Byte
+    NAMETAG = 4,                    // String
+    OWNER = 5,                      // Int64
+    TARGET = 6,                     // Int64
+    AIR = 7,                        // Short
+    POTION_COLOR = 8,               // Int (ARGB!)
+    POTION_AMBIENT = 9,             // Byte
+    JUMP_DURATION = 10,             // Byte (not Int64?)
+    HURT_TIME = 11,                 // Int (minecart/boat)
+    HURT_DIRECTION = 12,            // Int (minecart/boat)
+    PADDLE_TIME_LEFT = 13,          // Float
+    PADDLE_TIME_RIGHT = 14,         // Float
+    EXPERIENCE_VALUE = 15,          // Int (xp orb)
+    DISPLAY_ITEM = 16,              // Byte    Int    CompoundTag
+    HORSE_FLAGS = 16,               // Int, old
+    WITHER_SKULL_IS_DANGEROUS = 16, // Byte, old
+    MINECART_DISPLAY_OFFSET = 17,   // Int    Int64    Vec3
+    ARROW_SHOOTER_ID = 17,          // Int64, old
+    MINECART_HAS_DISPLAY = 18,      // Byte    Int64
+    HORSE_TYPE = 19,                // Byte
+    SWELL = 19,                     // old
+    OLD_SWELL = 20,                 // old
+    SWELL_DIR = 21,                 // old
+    CHARGE_AMOUNT = 22,             // Byte
+    ENDERMAN_HELD_RUNTIME_ID = 23,  // Int, (not Short?)
+    ACTOR_AGE = 24,                 // Byte, (not Short?)
+    // UNKNOWN_25                          = 25,  // 25 Byte Int
+    PLAYER_FLAGS = 26,                       // Byte
+    PLAYER_INDEX = 27,                       // Int
+    PLAYER_BED_POSITION = 28,                // BlockPos
+    FIREBALL_POWER_X = 29,                   // Float
+    FIREBALL_POWER_Y = 30,                   // Float
+    FIREBALL_POWER_Z = 31,                   // Float
+    AUX_POWER = 32,                          // old
+    FISH_X = 33,                             // old
+    FISH_Z = 34,                             // old
+    FISH_ANGLE = 35,                         // old
+    POTION_AUX_VALUE = 36,                   // Short
+    LEAD_HOLDER = 37,                        // Int64
+    SCALE = 38,                              // Float
+    INTERACTIVE_TAG = 39,                    // Byte, (not String?)
+    NPC_SKIN_ID = 40,                        // String
+    URL_TAG = 41,                            // String
+    MAX_AIR = 42,                            // Short
+    MARK_VARIANT = 43,                       // Int
+    CONTAINER_TYPE = 44,                     // Byte
+    CONTAINER_BASE_SIZE = 45,                // Int
+    CONTAINER_EXTRA_SLOTS_PER_STRENGTH = 46, // Int
+    BLOCK_TARGET = 47,                       // BlockPos (ENDER CRYSTAL)
+    WITHER_INVULNERABLE_TICKS = 48,          // Int
+    WITHER_TARGET_1 = 49,                    // Int64
+    WITHER_TARGET_2 = 50,                    // Int64
+    WITHER_TARGET_3 = 51,                    // Int64
+    AERIAL_ATTACK = 52,                      // Short
+    BOUNDING_BOX_WIDTH = 53,                 // Float
+    BOUNDING_BOX_HEIGHT = 54,                // Float
+    FUSE_LENGTH = 55,                        // Int
+    RIDER_SEAT_POSITION = 56,                // Vec3
+    RIDER_ROTATION_LOCKED = 57,              // Byte
+    RIDER_MAX_ROTATION = 58,                 // Float
+    RIDER_MIN_ROTATION = 59,                 // Byte, (not Float?)
+    // UNKNOWN_60                          = 60,  // Float
+    AREA_EFFECT_CLOUD_RADIUS = 61,      // Float
+    AREA_EFFECT_CLOUD_WAITING = 62,     // Int
+    AREA_EFFECT_CLOUD_PARTICLE_ID = 63, // Int
+    SHULKER_PEEK_ID = 64,               // Int
+    SHULKER_ATTACH_FACE = 65,           // Byte
+    SHULKER_ATTACHED = 66,              // Short
+    SHULKER_ATTACH_POS = 67,            // BlockPos
+    TRADING_PLAYER_EID = 68,            // Int64
+    TRADING_CAREER = 69,
+    HAS_COMMAND_BLOCK = 70,             // Byte
+    COMMAND_BLOCK_COMMAND = 71,         // String
+    COMMAND_BLOCK_LAST_OUTPUT = 72,     // String
+    COMMAND_BLOCK_TRACK_OUTPUT = 73,    // Byte
+    CONTROLLING_RIDER_SEAT_NUMBER = 74, // Byte
+    STRENGTH = 75,                      // Int
+    MAX_STRENGTH = 76,                  // Int
+    SPELL_CASTING_COLOR = 77,           // Int
+    LIMITED_LIFE = 78,                  // Int
+    ARMOR_STAND_POSE_INDEX = 79,        // Int
+    ENDER_CRYSTAL_TIME_OFFSET = 80,     // Int
+    ALWAYS_SHOW_NAMETAG = 81,           // Byte
+    COLOR_2 = 82,                       // Byte
+    NAME_AUTHOR = 83,
+    SCORE_TAG = 84,               // String
+    BALLOON_ATTACHED_ENTITY = 85, // Int64
+    PUFFERFISH_SIZE = 86,         // Byte
+    BUBBLE_TIME = 87,
+    AGENT = 88,                   // Int64
+    SITTING_AMOUNT = 89,          // Float
+    SITTING_AMOUNT_PREVIOUS = 90, // Float
+    EATING_COUNTER = 91,          // Int
+    FLAGS_EXTENDED = 92,          // Int64
+    LAYING_AMOUNT = 93,           // Float
+    LAYING_AMOUNT_PREVIOUS = 94,  // Float
+    DURATION = 95,
+    SPAWN_TIME = 96,
+    CHANGE_RATE = 97,
+    CHANGE_ON_PICKUP = 98,
+    PICKUP_COUNT = 99,
+    INTERACT_TEXT = 100,                       // String
+    TRADE_TIER = 101,                          // Int
+    MAX_TRADE_TIER = 102,                      // Int
+    TRADE_EXPERIENCE = 103,                    // Int
+    SKIN_ID = 104,                             // Int
+    SPAWNING_FRAMES = 105,                     // Int
+    COMMAND_BLOCK_TICK_DELAY = 106,            // Int
     COMMAND_BLOCK_EXECUTE_ON_FIRST_TICK = 107, // Byte
-    AMBIENT_SOUND_INTERVAL              = 108, // Float
-    //UNKNOWN_109                         = 109, // Float
-    //UNKNOWN_110                         = 110, // String
-    //UNKNOWN_111                         = 111, // Float
-    //UNKNOWN_112                         = 112, // String
-    //UNKNOWN_113                         = 113, // Byte
-    //UNKNOWN_114                         = 114, // Int
-    //UNKNOWN_115                         = 115, // Int
-    //UNKNOWN_116                         = 116, // Int
-    //UNKNOWN_117                         = 117, // Int
-    //UNKNOWN_118                         = 118, // CompoundTag
-    //UNKNOWN_119                         = 119, // Byte
-    //UNKNOWN_120                         = 120, // CompoundTag
-    //UNKNOWN_121                         = 121, // Float
-    //UNKNOWN_122                         = 122, // String
-    //UNKNOWN_123                         = 123, // Int
-    //UNKNOWN_124                         = 124, // String     
+    AMBIENT_SOUND_INTERVAL = 108,              // Float
+    // UNKNOWN_109                         = 109, // Float
+    // UNKNOWN_110                         = 110, // String
+    // UNKNOWN_111                         = 111, // Float
+    // UNKNOWN_112                         = 112, // String
+    // UNKNOWN_113                         = 113, // Byte
+    // UNKNOWN_114                         = 114, // Int
+    // UNKNOWN_115                         = 115, // Int
+    // UNKNOWN_116                         = 116, // Int
+    // UNKNOWN_117                         = 117, // Int
+    // UNKNOWN_118                         = 118, // CompoundTag
+    // UNKNOWN_119                         = 119, // Byte
+    // UNKNOWN_120                         = 120, // CompoundTag
+    // UNKNOWN_121                         = 121, // Float
+    // UNKNOWN_122                         = 122, // String
+    // UNKNOWN_123                         = 123, // Int
+    // UNKNOWN_124                         = 124, // String
 
     /*
     AMBIENT_SOUND_EVENT_NAME            = 109,
@@ -142,18 +141,15 @@ enum class ActorDataIDs : unsigned short
     NAME_RAW_TEXT                       = 111,
     CAN_RIDE_TARGET                     = 112,
     */
-   
-
 };
 
-//namespace DataItemTypes
+// namespace DataItemTypes
 //{
-//typedef __int64 FLAGS;
-//typedef int HEALTH;
-//}
+// typedef __int64 FLAGS;
+// typedef int HEALTH;
+// }
 
-enum class DataItemType : unsigned char
-{
+enum class DataItemType : unsigned char {
     Byte = 0,
     Short = 1,
     Int = 2,
@@ -167,15 +163,14 @@ enum class DataItemType : unsigned char
 
 #undef BEFORE_EXTRA
 
-class DataItem
-{
+class DataItem {
 
 #define AFTER_EXTRA
     // Add Member There
 public:
-    DataItemType mType; //8
-    unsigned short mId; //10
-    bool mDirty = true; //12
+    DataItemType mType; // 8
+    unsigned short mId; // 10
+    bool mDirty = true; // 12
 
     template <typename T>
     inline T const& getData() const;
@@ -185,9 +180,8 @@ class DataItem
     inline bool setData(T const& value);
 
     DataItem(DataItemType type, unsigned short id)
-        : mId(id)
-        , mType(type)
-    {
+    : mId(id)
+    , mType(type) {
     }
 
     template <typename T>
@@ -223,26 +217,23 @@ class DataItem
 #include "DataItem2.hpp"
 
 template <typename T>
-inline T const& DataItem::getData() const
-{
+inline T const& DataItem::getData() const {
     if (this->mType == DataItem2<T>::DATA_ITEM_TYPE)
         return ((DataItem2<T>*)this)->mValue;
-    //throw("DataItemType Not Match");
+    // throw("DataItemType Not Match");
     return *(T*)0;
 }
 
 template <typename T>
-inline T& DataItem::getData()
-{
+inline T& DataItem::getData() {
     if (this->mType == DataItem2<T>::DATA_ITEM_TYPE)
         return ((DataItem2<T>*)this)->mValue;
-    //throw("DataItemType Not Match");
+    // throw("DataItemType Not Match");
     return *(T*)0;
 }
 
 template <typename T>
-inline bool DataItem::setData(T const& value)
-{
+inline bool DataItem::setData(T const& value) {
     if (this->mType == DataItem2<T>::DATA_ITEM_TYPE)
         return false;
     ((DataItem2<T>*)this)->setData(value);
@@ -250,13 +241,11 @@ inline bool DataItem::setData(T const& value)
 }
 
 template <typename T>
-inline static std::unique_ptr<DataItem> DataItem::create(unsigned short key, T const& value)
-{
+inline static std::unique_ptr<DataItem> DataItem::create(unsigned short key, T const& value) {
     return std::unique_ptr<DataItem>(new DataItem2(key, value));
 }
 
 template <typename T>
-inline static std::unique_ptr<DataItem> DataItem::create(ActorDataIDs key, T const& value)
-{
+inline static std::unique_ptr<DataItem> DataItem::create(ActorDataIDs key, T const& value) {
     return std::unique_ptr<DataItem>(new DataItem2((unsigned short)key, value));
 }
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/GameMode.hpp b/LiteLoader/Header/MC/GameMode.hpp
--- a/LiteLoader/Header/MC/GameMode.hpp
+++ b/LiteLoader/Header/MC/GameMode.hpp
@@ -13,7 +13,7 @@ class GameMode {
 #define AFTER_EXTRA
 // Add Member There
 public:
-	LIAPI ServerPlayer* getPlayer();
+    LIAPI ServerPlayer* getPlayer();
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_GAMEMODE
diff --git a/LiteLoader/Header/MC/HashedString.hpp b/LiteLoader/Header/MC/HashedString.hpp
--- a/LiteLoader/Header/MC/HashedString.hpp
+++ b/LiteLoader/Header/MC/HashedString.hpp
@@ -12,9 +12,9 @@ class HashedString {
 
 #define AFTER_EXTRA
 // Add Member There
-	uint64_t hash;
-	std::string str;
-	int64_t unk;
+    uint64_t hash;
+    std::string str;
+    int64_t unk;
 
 public:
     //HashedString(HashedString const& hstr)
diff --git a/LiteLoader/Header/MC/HitResult.hpp b/LiteLoader/Header/MC/HitResult.hpp
--- a/LiteLoader/Header/MC/HitResult.hpp
+++ b/LiteLoader/Header/MC/HitResult.hpp
@@ -50,7 +50,7 @@ class HitResult {
     LIAPI bool isHitLiquid();
     LIAPI bool isEntity();
     LIAPI bool isTile();
-	LIAPI BlockPos getBlockPos();
+    LIAPI BlockPos getBlockPos();
     LIAPI BlockPos getLiquidPos();
     LIAPI FaceID getLiquidFacing();
     //LIAPI Vec3 getLiquidHitPos();
diff --git a/LiteLoader/Header/MC/ItemStack.hpp b/LiteLoader/Header/MC/ItemStack.hpp
--- a/LiteLoader/Header/MC/ItemStack.hpp
+++ b/LiteLoader/Header/MC/ItemStack.hpp
@@ -34,12 +34,12 @@ class ItemStack : public ItemStackBase {
     LIAPI ItemStack* clone_s() const;
     LIAPI static ItemStack fromItemInstance(ItemInstance const& ins);
 
-	LIAPI std::string getTypeName() const;
-	LIAPI int getAux() const;
-	LIAPI int getCount() const;
+    LIAPI std::string getTypeName() const;
+    LIAPI int getAux() const;
+    LIAPI int getCount() const;
 
-	LIAPI bool setItem(ItemStack* newItem);
-	LIAPI bool setLore(const std::vector<std::string>& lores);
+    LIAPI bool setItem(ItemStack* newItem);
+    LIAPI bool setLore(const std::vector<std::string>& lores);
     LIAPI std::unique_ptr<CompoundTag> getNbt();
     LIAPI bool setNbt(CompoundTag* nbt);
     LIAPI string getStandardName(const Localization& language);
diff --git a/LiteLoader/Header/MC/ItemStackNetIdVariant.hpp b/LiteLoader/Header/MC/ItemStackNetIdVariant.hpp
--- a/LiteLoader/Header/MC/ItemStackNetIdVariant.hpp
+++ b/LiteLoader/Header/MC/ItemStackNetIdVariant.hpp
@@ -8,8 +8,7 @@
 struct ItemStackNetIdTag;
 struct ItemStackLegacyRequestIdTag;
 struct ItemStackRequestIdTag;
-enum ItemStackNetIdType : unsigned char
-{
+enum ItemStackNetIdType : unsigned char {
     ItemStackNetId_TypedServerNetId = 0,
     ItemStackRequestId_TypedClientNetId = 1,
     ItemStackLegacyRequestId_TypedClientNetId = 2,
@@ -19,36 +18,34 @@ enum ItemStackNetIdType : unsigned char
 struct ItemStackNetIdVariant {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
     std::variant<
         TypedServerNetId<ItemStackNetIdTag, int, 0>, TypedClientNetId<ItemStackRequestIdTag, int, 0>,
         TypedClientNetId<ItemStackLegacyRequestIdTag, int, 0>>
         id;
-   
-	
+
+
 #undef AFTER_EXTRA
 
 public:
     MCAPI ItemStackNetIdVariant();
-    MCAPI ItemStackNetIdVariant(struct ItemStackNetIdVariant &&);
-    MCAPI ItemStackNetIdVariant(struct ItemStackNetIdVariant const &);
-    MCAPI void deserialize(class ReadOnlyBinaryStream &);
+    MCAPI ItemStackNetIdVariant(struct ItemStackNetIdVariant&&);
+    MCAPI ItemStackNetIdVariant(struct ItemStackNetIdVariant const&);
+    MCAPI void deserialize(class ReadOnlyBinaryStream&);
     MCAPI bool hasServerNetId() const;
     MCAPI bool isValid() const;
-    MCAPI struct ItemStackNetIdVariant & operator=(struct ItemStackNetIdVariant &&);
-    MCAPI struct ItemStackNetIdVariant & operator=(struct ItemStackNetIdVariant const &);
-    MCAPI struct ItemStackNetIdVariant & operator=(class TypedClientNetId<struct ItemStackLegacyRequestIdTag, int, 0> const &);
-    MCAPI struct ItemStackNetIdVariant & operator=(class TypedServerNetId<struct ItemStackNetIdTag, int, 0> const &);
-    MCAPI bool operator==(struct ItemStackNetIdVariant const &) const;
-    MCAPI void serialize(class BinaryStream &) const;
+    MCAPI struct ItemStackNetIdVariant& operator=(struct ItemStackNetIdVariant&&);
+    MCAPI struct ItemStackNetIdVariant& operator=(struct ItemStackNetIdVariant const&);
+    MCAPI struct ItemStackNetIdVariant& operator=(class TypedClientNetId<struct ItemStackLegacyRequestIdTag, int, 0> const&);
+    MCAPI struct ItemStackNetIdVariant& operator=(class TypedServerNetId<struct ItemStackNetIdTag, int, 0> const&);
+    MCAPI bool operator==(struct ItemStackNetIdVariant const&) const;
+    MCAPI void serialize(class BinaryStream&) const;
     MCAPI std::string toString() const;
-    MCAPI class TypedClientNetId<struct ItemStackLegacyRequestIdTag, int, 0> const * tryGetLegacyRequestId() const;
-    MCAPI class TypedClientNetId<struct ItemStackRequestIdTag, int, 0> const * tryGetRequestId() const;
-    MCAPI class TypedServerNetId<struct ItemStackNetIdTag, int, 0> const * tryGetServerNetId() const;
+    MCAPI class TypedClientNetId<struct ItemStackLegacyRequestIdTag, int, 0> const* tryGetLegacyRequestId() const;
+    MCAPI class TypedClientNetId<struct ItemStackRequestIdTag, int, 0> const* tryGetRequestId() const;
+    MCAPI class TypedServerNetId<struct ItemStackNetIdTag, int, 0> const* tryGetServerNetId() const;
     MCAPI ~ItemStackNetIdVariant();
 
 protected:
-
 private:
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/ItemStackRequestAction.hpp b/LiteLoader/Header/MC/ItemStackRequestAction.hpp
--- a/LiteLoader/Header/MC/ItemStackRequestAction.hpp
+++ b/LiteLoader/Header/MC/ItemStackRequestAction.hpp
@@ -11,43 +11,40 @@
 class ItemStackRequestAction {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 public:
     ItemStackRequestActionType mType;
-    
-    static inline std::unordered_map<enum ItemStackRequestActionType, std::string> const& getActionTypeMap()
-    {
+
+    static inline std::unordered_map<enum ItemStackRequestActionType, std::string> const& getActionTypeMap() {
         return actionTypeMap.mMap1;
     }
-    
+
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_ITEMSTACKREQUESTACTION
 public:
-    class ItemStackRequestAction& operator=(class ItemStackRequestAction const &) = delete;
-    ItemStackRequestAction(class ItemStackRequestAction const &) = delete;
+    class ItemStackRequestAction& operator=(class ItemStackRequestAction const&) = delete;
+    ItemStackRequestAction(class ItemStackRequestAction const&) = delete;
     ItemStackRequestAction() = delete;
 #endif
 
 
 public:
     /*0*/ virtual ~ItemStackRequestAction();
-    /*1*/ virtual class ItemStackRequestActionCraftBase const * getCraftAction() const;
+    /*1*/ virtual class ItemStackRequestActionCraftBase const* getCraftAction() const;
     /*2*/ virtual int getFilteredStringIndex() const;
-    /*3*/ virtual void postLoadItems_DEPRECATEDASKTYLAING(class BlockPalette &, bool);
+    /*3*/ virtual void postLoadItems_DEPRECATEDASKTYLAING(class BlockPalette&, bool);
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_ITEMSTACKREQUESTACTION
 #endif
     MCAPI ItemStackRequestAction(enum ItemStackRequestActionType);
     MCAPI enum ItemStackRequestActionType getActionType() const;
-    MCAPI void write(class BinaryStream &) const;
+    MCAPI void write(class BinaryStream&) const;
     MCAPI static std::string const getActionTypeName(enum ItemStackRequestActionType);
-    MCAPI static std::unique_ptr<class ItemStackRequestAction> read(class ReadOnlyBinaryStream &);
+    MCAPI static std::unique_ptr<class ItemStackRequestAction> read(class ReadOnlyBinaryStream&);
 
-//private:
+    // private:
 
 
 private:
     MCAPI static class BidirectionalUnorderedMap<enum ItemStackRequestActionType, std::string> const actionTypeMap;
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/Level.hpp b/LiteLoader/Header/MC/Level.hpp
--- a/LiteLoader/Header/MC/Level.hpp
+++ b/LiteLoader/Header/MC/Level.hpp
@@ -48,7 +48,7 @@ class Level {
     LIAPI static bool createExplosion(Vec3 pos, int dimId, Actor* source, float radius, bool createFire, bool canBreak, float maxResistance = 3.40282347e+38);
     //LIAPI static class MapItemSavedData* getMapSavedData(struct ActorUniqueID a0);
     LIAPI static Actor* cloneMob(Vec3 pos, int dimId, Actor* ac);
-	
+
     //Block
     LIAPI static Block* getBlock(BlockPos* pos, int dimId);
     LIAPI static Block* getBlock(BlockPos* pos, BlockSource* blockSource);
diff --git a/LiteLoader/Header/MC/ListTag.hpp b/LiteLoader/Header/MC/ListTag.hpp
--- a/LiteLoader/Header/MC/ListTag.hpp
+++ b/LiteLoader/Header/MC/ListTag.hpp
@@ -13,9 +13,9 @@
 class ListTag : public Tag {
 
 #define AFTER_EXTRA
-// Add Member There
-std::vector<Tag*> val;
-Tag::Type elementType;
+    // Add Member There
+    std::vector<Tag*> val;
+    Tag::Type elementType;
 
 public:
     LIAPI static std::unique_ptr<ListTag> create();
@@ -44,7 +44,7 @@ Tag::Type elementType;
     LIAPI void addByteArray(char data[], size_t size);
     LIAPI void addIntArray(TagMemoryChunk);
     LIAPI void addIntArray(int data[], size_t size);
-    
+
     LIAPI std::vector<Tag*>::const_iterator begin() const;
     LIAPI std::vector<Tag*>::const_iterator end() const;
 
@@ -52,20 +52,20 @@ Tag::Type elementType;
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_LISTTAG
 public:
-    class ListTag& operator=(class ListTag const &) = delete;
-    ListTag(class ListTag const &) = delete;
+    class ListTag& operator=(class ListTag const&) = delete;
+    ListTag(class ListTag const&) = delete;
 #endif
 
 
 public:
     /*0*/ virtual ~ListTag();
     /*1*/ virtual void deleteChildren();
-    /*2*/ virtual void write(class IDataOutput &) const;
-    /*3*/ virtual void load(class IDataInput &);
+    /*2*/ virtual void write(class IDataOutput&) const;
+    /*3*/ virtual void load(class IDataInput&);
     /*4*/ virtual std::string toString() const;
     /*5*/ virtual enum Tag::Type getId() const;
-    /*6*/ virtual bool equals(class Tag const &) const;
-    /*8*/ virtual void print(std::string const &, class PrintStream &) const;
+    /*6*/ virtual bool equals(class Tag const&) const;
+    /*8*/ virtual void print(std::string const&, class PrintStream&) const;
     /*9*/ virtual std::unique_ptr<class Tag> copy() const;
     /*10*/ virtual unsigned __int64 hash() const;
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_LISTTAG
@@ -74,17 +74,14 @@ Tag::Type elementType;
     MCAPI void add(std::unique_ptr<class Tag>);
     MCAPI std::unique_ptr<class ListTag> copyList() const;
     MCAPI void erase(unsigned __int64);
-    MCAPI void forEachCompoundTag(class std::function<void (class CompoundTag const &)>) const;
-    MCAPI class Tag * get(int) const;
-    MCAPI class CompoundTag * getCompound(unsigned __int64);
-    MCAPI class CompoundTag const * getCompound(unsigned __int64) const;
+    MCAPI void forEachCompoundTag(class std::function<void(class CompoundTag const&)>) const;
+    MCAPI class Tag* get(int) const;
+    MCAPI class CompoundTag* getCompound(unsigned __int64);
+    MCAPI class CompoundTag const* getCompound(unsigned __int64) const;
     MCAPI double getDouble(int) const;
     MCAPI float getFloat(int) const;
     MCAPI int getInt(int) const;
-    MCAPI std::string const & getString(int) const;
+    MCAPI std::string const& getString(int) const;
     MCAPI void popBack();
     MCAPI int size() const;
-
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/MovePlayerPacket.hpp b/LiteLoader/Header/MC/MovePlayerPacket.hpp
--- a/LiteLoader/Header/MC/MovePlayerPacket.hpp
+++ b/LiteLoader/Header/MC/MovePlayerPacket.hpp
@@ -19,7 +19,7 @@ enum TeleportationCause {
 class MovePlayerPacket : public Packet {
 
 #define AFTER_EXTRA
-// Add Member There
+    // Add Member There
 public:
     ActorRuntimeID runtimeId;
     Vec3 position;
@@ -32,18 +32,18 @@ class MovePlayerPacket : public Packet {
     TeleportationCause teleportationCause;
     int entityType;
     long tick;
-    
+
     inline std::string toDebugString() {
         return fmt::format("{}: pos: {}, mode: {}, cause: {}",
-            __super::toDebugString(), position.toString(), (int)mode, int(teleportationCause));
+                           __super::toDebugString(), position.toString(), (int)mode, int(teleportationCause));
     }
 
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_MOVEPLAYERPACKET
 public:
-    class MovePlayerPacket& operator=(class MovePlayerPacket const &) = delete;
-    MovePlayerPacket(class MovePlayerPacket const &) = delete;
+    class MovePlayerPacket& operator=(class MovePlayerPacket const&) = delete;
+    MovePlayerPacket(class MovePlayerPacket const&) = delete;
 #endif
 
 
@@ -51,14 +51,11 @@ class MovePlayerPacket : public Packet {
     /*0*/ virtual ~MovePlayerPacket();
     /*1*/ virtual enum MinecraftPacketIds getId() const;
     /*2*/ virtual std::string getName() const;
-    /*3*/ virtual void write(class BinaryStream &) const;
-    /*6*/ virtual enum StreamReadResult _read(class ReadOnlyBinaryStream &);
+    /*3*/ virtual void write(class BinaryStream&) const;
+    /*6*/ virtual enum StreamReadResult _read(class ReadOnlyBinaryStream&);
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_MOVEPLAYERPACKET
 #endif
-    MCAPI MovePlayerPacket(class Player const &, class Vec3 const &);
-    MCAPI MovePlayerPacket(class Player const &, enum Player::PositionMode, int, int);
+    MCAPI MovePlayerPacket(class Player const&, class Vec3 const&);
+    MCAPI MovePlayerPacket(class Player const&, enum Player::PositionMode, int, int);
     MCAPI MovePlayerPacket();
-
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/NetworkIdentifier.hpp b/LiteLoader/Header/MC/NetworkIdentifier.hpp
--- a/LiteLoader/Header/MC/NetworkIdentifier.hpp
+++ b/LiteLoader/Header/MC/NetworkIdentifier.hpp
@@ -15,7 +15,7 @@ class NetworkIdentifier {
 // Add Member There
     char filler[160];
 public:
-	LIAPI std::string getIP();
+    LIAPI std::string getIP();
 
 #undef AFTER_EXTRA
 
diff --git a/LiteLoader/Header/MC/PackInfoData.hpp b/LiteLoader/Header/MC/PackInfoData.hpp
--- a/LiteLoader/Header/MC/PackInfoData.hpp
+++ b/LiteLoader/Header/MC/PackInfoData.hpp
@@ -16,30 +16,28 @@ static_assert(offsetof(PackIdVersion, mType) == 0x80);
 struct PackInfoData {
 
 #define AFTER_EXTRA
-    PackIdVersion mPackIdVersion;//0
-    uint64_t mPackSize;//0x88
-    std::string mContentKey;//0x90
+    PackIdVersion mPackIdVersion; // 0
+    uint64_t mPackSize;           // 0x88
+    std::string mContentKey;      // 0x90
     std::string mSubpackName;
     ContentIdentity mContentIdentity;
     bool mHasScripts;
-    bool mForceServerPacks; 
+    bool mForceServerPacks;
     bool isRtxCapable;
-	
+
 #undef AFTER_EXTRA
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_PACKINFODATA
 public:
-    struct PackInfoData& operator=(struct PackInfoData const &) = delete;
-    PackInfoData(struct PackInfoData const &) = delete;
+    struct PackInfoData& operator=(struct PackInfoData const&) = delete;
+    PackInfoData(struct PackInfoData const&) = delete;
     PackInfoData() = delete;
 #endif
 
 public:
-    MCAPI PackInfoData(class mce::UUID const &, class SemVersion const &, unsigned __int64, std::string const &, std::string const &, class ContentIdentity const &, bool, bool);
+    MCAPI PackInfoData(class mce::UUID const&, class SemVersion const&, unsigned __int64, std::string const&, std::string const&, class ContentIdentity const&, bool, bool);
     MCAPI ~PackInfoData();
 
 protected:
-
 private:
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/PlayStatusPacket.hpp b/LiteLoader/Header/MC/PlayStatusPacket.hpp
--- a/LiteLoader/Header/MC/PlayStatusPacket.hpp
+++ b/LiteLoader/Header/MC/PlayStatusPacket.hpp
@@ -7,14 +7,14 @@
 #define BEFORE_EXTRA
 // Include Headers or Declare Types Here
 enum PlayStatus : int {
-	PlayStatusLoginSuccess,
-	PlayStatusLoginFailedClient,
-	PlayStatusLoginFailedServer,
-	PlayStatusPlayerSpawn,
-	PlayStatusLoginFailedInvalidTenant,
-	PlayStatusLoginFailedVanillaEdu,
-	PlayStatusLoginFailedEduVanilla,
-	PlayStatusLoginFailedServerFull,
+    PlayStatusLoginSuccess,
+    PlayStatusLoginFailedClient,
+    PlayStatusLoginFailedServer,
+    PlayStatusPlayerSpawn,
+    PlayStatusLoginFailedInvalidTenant,
+    PlayStatusLoginFailedVanillaEdu,
+    PlayStatusLoginFailedEduVanilla,
+    PlayStatusLoginFailedServerFull,
 };
 
 #undef BEFORE_EXTRA
diff --git a/LiteLoader/Header/MC/Player.hpp b/LiteLoader/Header/MC/Player.hpp
--- a/LiteLoader/Header/MC/Player.hpp
+++ b/LiteLoader/Header/MC/Player.hpp
@@ -7,24 +7,24 @@
 
 #define BEFORE_EXTRA
 // Add include headers & pre-declares
-    class ServerPlayer;
-    class Player;
-    class NetworkIdentifier;
-    class Certificate;
-    class Container;
-    class CompoundTag;
-    #include "UserEntityIdentifierComponent.hpp"
-    #include "ScorePacketInfo.hpp"
-    #include "DataItem.hpp"
-    #include "../I18nAPI.h"
+class ServerPlayer;
+class Player;
+class NetworkIdentifier;
+class Certificate;
+class Container;
+class CompoundTag;
+#include "UserEntityIdentifierComponent.hpp"
+#include "ScorePacketInfo.hpp"
+#include "DataItem.hpp"
+#include "../I18nAPI.h"
 #undef BEFORE_EXTRA
 
 class Player : public Mob {
 
 #define AFTER_EXTRA
-// Add new members to class
+    // Add new members to class
 public:
-    enum PositionMode : char{
+    enum PositionMode : char {
         NORMAL,
         RESPAWN,
         TELEPORT,
@@ -46,6 +46,7 @@ class Player : public Mob {
     LIAPI Container* getEnderChestContainer();
     LIAPI std::pair<BlockPos, int> getRespawnPosition();
     LIAPI float getAvgPacketLoss();
+    LIAPI float getLastPacketLoss();
     LIAPI string getClientId();
     LIAPI int getDeviceType();
     LIAPI bool isOperator();
@@ -62,10 +63,10 @@ class Player : public Mob {
 
     // Experience required to upgrade to level from level 0
     LIAPI static size_t getTotalXpNeededForLevel(int level);
-    
+
     /**
      * @brief Translate(localize) a text for the player with provided plugin handle.
-     * 
+     *
      * @param  hPlugin      The plugin handle
      * @param  format       The str to translate and format
      * @param  args         The format arguments
@@ -91,14 +92,14 @@ class Player : public Mob {
     LIAPI bool sendText(const std::string& text, TextType type = TextType::RAW);
     /**
      * @brief Translate(localize) and send a text to the player(convenience func).
-     * 
+     *
      * @tparam ttype  The text type(default RAW)
      * @tparam Args   ...
      * @param  text   The str to translate and format
      * @param  args   The format arguments
      * @return bool   Success or not
      */
-    template <TextType ttype = TextType::RAW, typename ... Args>
+    template <TextType ttype = TextType::RAW, typename... Args>
     inline bool sendText(const std::string& text, const Args&... args) {
         return sendText(this->tr(text, args...), ttype);
     }
@@ -107,15 +108,14 @@ class Player : public Mob {
         if constexpr (0 == sizeof...(args)) {
             // Avoid fmt if only one argument
             return sendText(text);
-        }
-        else
+        } else
             return sendText(fmt::format(text, args...));
     }
 
     LIAPI bool kick(const string& msg);
     LIAPI bool crashClient();
     LIAPI bool talkAs(const string& msg);
-    LIAPI bool giveItem(ItemStack* item); 
+    LIAPI bool giveItem(ItemStack* item);
     LIAPI int clearItem(string typeName);
     LIAPI bool runcmd(const string& cmd);
     LIAPI bool transferServer(const string& address, unsigned short port);
@@ -135,12 +135,12 @@ class Player : public Mob {
     LIAPI bool reduceScore(const string& key, int value);
     LIAPI bool deleteScore(const string& key);
 
-    //Form
+    // Form
     LIAPI bool sendSimpleForm(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(Player*, int)> callback) const;
-    LIAPI bool sendModalForm(const string& title, const string& content, const string& button1, const string& button2, std::function<void(Player*, bool)> callback) const;
+    LIAPI bool sendModalForm(const string& title, const string& content, const string& confirmButton, const string& cancelButton, std::function<void(Player*, bool)> callback) const;
     LIAPI bool sendCustomForm(const std::string& data, std::function<void(Player*, string)> callback) const;
 
-    //Packet
+    // Packet
     LIAPI bool sendTextPacket(string text, TextType Type = TextType::RAW) const;
     LIAPI bool sendTitlePacket(string text, TitleType Type, int FadeInDuration, int RemainDuration, int FadeOutDuration) const;
     LIAPI bool sendNotePacket(unsigned int tone);
@@ -156,15 +156,17 @@ class Player : public Mob {
     LIAPI bool sendBossEventPacket(BossEvent type, string name, float percent, BossEventColour colour, int overlay = 0);
     LIAPI bool sendCommandRequestPacket(const string& cmd);
     LIAPI bool sendTextTalkPacket(const string& msg);
-    LIAPI bool sendTextTalkPacket(const string& msg, Player* target/* = nullptr*/);
+    LIAPI bool sendTextTalkPacket(const string& msg, Player* target /* = nullptr*/);
 
     LIAPI bool sendRawFormPacket(unsigned formId, const string& data) const;
     LIAPI bool sendToastPacket(string title, string msg);
 
     LIAPI static bool isValid(Player* player);
 
-    //For compatibility
-    inline string getDeviceName() { return getDeviceTypeName(); }
+    // For compatibility
+    inline string getDeviceName() {
+        return getDeviceTypeName();
+    }
     LIAPI bool sendSimpleFormPacket(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(int)> callback) const;
     LIAPI bool sendModalFormPacket(const string& title, const string& content, const string& button1, const string& button2, std::function<void(bool)> callback);
     LIAPI bool sendCustomFormPacket(const std::string& data, std::function<void(string)> callback);
@@ -173,32 +175,32 @@ class Player : public Mob {
 
 #ifndef DISABLE_CONSTRUCTOR_PREVENTION_PLAYER
 public:
-    class Player& operator=(class Player const &) = delete;
-    Player(class Player const &) = delete;
+    class Player& operator=(class Player const&) = delete;
+    Player(class Player const&) = delete;
     Player() = delete;
 #endif
 
 
 public:
-    /*8*/ virtual void reloadHardcoded(enum Actor::InitializationMethod, class VariantParameterList const &);
-    /*10*/ virtual void initializeComponents(enum Actor::InitializationMethod, class VariantParameterList const &);
+    /*8*/ virtual void reloadHardcoded(enum Actor::InitializationMethod, class VariantParameterList const&);
+    /*10*/ virtual void initializeComponents(enum Actor::InitializationMethod, class VariantParameterList const&);
     /*12*/ virtual void _serverInitItemStackIds();
     /*14*/ virtual ~Player();
     /*16*/ virtual void resetUserPos(bool);
     /*18*/ virtual void remove();
     /*25*/ virtual class Vec3 getAttachPos(enum ActorLocation, float) const;
-    /*28*/ virtual void move(class Vec3 const &);
-    /*29*/ virtual void move(struct IActorMovementProxy &, class Vec3 const &) const;
+    /*28*/ virtual void move(class Vec3 const&);
+    /*29*/ virtual void move(struct IActorMovementProxy&, class Vec3 const&) const;
     /*39*/ virtual bool isFireImmune() const;
     /*40*/ virtual void __unk_vfn_40();
-    /*43*/ virtual void teleportTo(class Vec3 const &, bool, int, int, bool);
+    /*43*/ virtual void teleportTo(class Vec3 const&, bool, int, int, bool);
     /*47*/ virtual std::unique_ptr<class AddActorBasePacket> tryCreateAddActorPacket();
     /*48*/ virtual void normalTick();
     /*50*/ virtual void passengerTick();
     /*60*/ virtual void __unk_vfn_60();
     /*64*/ virtual std::string getFormattedNameTag() const;
     /*67*/ virtual void __unk_vfn_67();
-    /*75*/ virtual void setBlockMovementSlowdownMultiplier(class BlockLegacy const &, class Vec3 const &);
+    /*75*/ virtual void setBlockMovementSlowdownMultiplier(class BlockLegacy const&, class Vec3 const&);
     /*77*/ virtual float getCameraOffset() const;
     /*79*/ virtual float getShadowRadius() const;
     /*81*/ virtual void __unk_vfn_81();
@@ -211,24 +213,24 @@ class Player : public Mob {
     /*97*/ virtual void setSleeping(bool);
     /*98*/ virtual void __unk_vfn_98();
     /*100*/ virtual bool isBlocking() const;
-    /*101*/ virtual bool isDamageBlocked(class ActorDamageSource const &) const;
+    /*101*/ virtual bool isDamageBlocked(class ActorDamageSource const&) const;
     /*105*/ virtual void __unk_vfn_105();
     /*107*/ virtual void __unk_vfn_107();
     /*108*/ virtual void __unk_vfn_108();
     /*110*/ virtual void __unk_vfn_110();
-    /*115*/ virtual bool attack(class Actor &, enum ActorDamageCause const &);
+    /*115*/ virtual bool attack(class Actor&, enum ActorDamageCause const&);
     /*128*/ virtual bool isJumping() const;
-    /*134*/ virtual bool isInvulnerableTo(class ActorDamageSource const &) const;
-    /*139*/ virtual void onBounceStarted(class BlockPos const &, class Block const &);
+    /*134*/ virtual bool isInvulnerableTo(class ActorDamageSource const&) const;
+    /*139*/ virtual void onBounceStarted(class BlockPos const&, class Block const&);
     /*140*/ virtual void feed(int);
     /*141*/ virtual void handleEntityEvent(enum ActorEvent, int);
-    /*143*/ virtual class HashedString const & getActorRendererId() const;
-    /*151*/ virtual void awardKillScore(class Actor &, int);
-    /*152*/ virtual void setArmor(enum ArmorSlot, class ItemStack const &);
-    /*160*/ virtual void setCarriedItem(class ItemStack const &);
-    /*161*/ virtual class ItemStack const & getCarriedItem() const;
-    /*162*/ virtual void setOffhandSlot(class ItemStack const &);
-    /*163*/ virtual class ItemStack const & getEquippedTotem() const;
+    /*143*/ virtual class HashedString const& getActorRendererId() const;
+    /*151*/ virtual void awardKillScore(class Actor&, int);
+    /*152*/ virtual void setArmor(enum ArmorSlot, class ItemStack const&);
+    /*160*/ virtual void setCarriedItem(class ItemStack const&);
+    /*161*/ virtual class ItemStack const& getCarriedItem() const;
+    /*162*/ virtual void setOffhandSlot(class ItemStack const&);
+    /*163*/ virtual class ItemStack const& getEquippedTotem() const;
     /*164*/ virtual bool consumeTotem();
     /*169*/ virtual enum ActorType getEntityTypeId() const;
     /*173*/ virtual bool canFreeze() const;
@@ -236,15 +238,15 @@ class Player : public Mob {
     /*178*/ virtual int getPortalWaitTime() const;
     /*181*/ virtual void __unk_vfn_181();
     /*190*/ virtual void onSynchedDataUpdate(int);
-    /*191*/ virtual bool canAddPassenger(class Actor &) const;
+    /*191*/ virtual bool canAddPassenger(class Actor&) const;
     /*193*/ virtual bool canBePulledIntoVehicle() const;
     /*195*/ virtual void __unk_vfn_195();
     /*197*/ virtual void sendMotionPacketIfNeeded();
     /*200*/ virtual void startSwimming();
     /*201*/ virtual void stopSwimming();
     /*203*/ virtual enum CommandPermissionLevel getCommandPermissionLevel() const;
-    /*216*/ virtual class AnimationComponent & getAnimationComponent();
-    /*219*/ virtual void useItem(class ItemStackBase &, enum ItemUseMethod, bool);
+    /*216*/ virtual class AnimationComponent& getAnimationComponent();
+    /*219*/ virtual void useItem(class ItemStackBase&, enum ItemUseMethod, bool);
     /*220*/ virtual void __unk_vfn_220();
     /*221*/ virtual void __unk_vfn_221();
     /*223*/ virtual float getMapDecorationRotation() const;
@@ -253,41 +255,41 @@ class Player : public Mob {
     /*230*/ virtual bool isAdventure() const;
     /*231*/ virtual bool isSurvival() const;
     /*232*/ virtual bool isSpectator() const;
-    /*234*/ virtual bool add(class ItemStack &);
-    /*235*/ virtual bool drop(class ItemStack const &, bool);
+    /*234*/ virtual bool add(class ItemStack&);
+    /*235*/ virtual bool drop(class ItemStack const&, bool);
     /*239*/ virtual void setSize(float, float);
     /*243*/ virtual void startSpinAttack();
     /*244*/ virtual void stopSpinAttack();
     /*246*/ virtual void __unk_vfn_246();
     /*249*/ virtual void __unk_vfn_249();
-    /*251*/ virtual void die(class ActorDamageSource const &);
+    /*251*/ virtual void die(class ActorDamageSource const&);
     /*252*/ virtual bool shouldDropDeathLoot() const;
     /*260*/ virtual class std::optional<class BlockPos> getLastDeathPos() const;
     /*261*/ virtual class std::optional<class AutomaticID<class Dimension, int>> getLastDeathDimension() const;
     /*262*/ virtual bool hasDiedBefore() const;
-    /*263*/ virtual bool _shouldProvideFeedbackOnHandContainerItemSet(enum HandSlot, class ItemStack const &) const;
-    /*264*/ virtual bool _shouldProvideFeedbackOnArmorSet(enum ArmorSlot, class ItemStack const &) const;
+    /*263*/ virtual bool _shouldProvideFeedbackOnHandContainerItemSet(enum HandSlot, class ItemStack const&) const;
+    /*264*/ virtual bool _shouldProvideFeedbackOnArmorSet(enum ArmorSlot, class ItemStack const&) const;
     /*267*/ virtual void __unk_vfn_267();
-    /*268*/ virtual bool _hurt(class ActorDamageSource const &, float, bool, bool);
-    /*271*/ virtual void readAdditionalSaveData(class CompoundTag const &, class DataLoadHelper &);
-    /*272*/ virtual void addAdditionalSaveData(class CompoundTag &) const;
+    /*268*/ virtual bool _hurt(class ActorDamageSource const&, float, bool, bool);
+    /*271*/ virtual void readAdditionalSaveData(class CompoundTag const&, class DataLoadHelper&);
+    /*272*/ virtual void addAdditionalSaveData(class CompoundTag&) const;
     /*275*/ virtual void __unk_vfn_275();
     /*283*/ virtual void _onSizeUpdated();
     /*284*/ virtual void __unk_vfn_284();
     /*291*/ virtual float getSpeed() const;
     /*292*/ virtual void setSpeed(float);
     /*296*/ virtual void travel(float, float, float);
-    /*297*/ virtual void travel(struct IMobMovementProxy &, float, float, float) const;
+    /*297*/ virtual void travel(struct IMobMovementProxy&, float, float, float) const;
     /*299*/ virtual void aiStep();
-    /*300*/ virtual void aiStep(struct IMobMovementProxy &) const;
+    /*300*/ virtual void aiStep(struct IMobMovementProxy&) const;
     /*307*/ virtual int getItemUseDuration() const;
     /*308*/ virtual float getItemUseStartupProgress() const;
     /*309*/ virtual float getItemUseIntervalProgress() const;
     /*312*/ virtual void __unk_vfn_312();
     /*316*/ virtual void __unk_vfn_316();
-    /*332*/ virtual std::vector<class ItemStack const *> getAllHand() const;
-    /*333*/ virtual std::vector<class ItemStack const *> getAllEquipment() const;
-    /*335*/ virtual void dropEquipmentOnDeath(class ActorDamageSource const &, int);
+    /*332*/ virtual std::vector<class ItemStack const*> getAllHand() const;
+    /*333*/ virtual std::vector<class ItemStack const*> getAllEquipment() const;
+    /*335*/ virtual void dropEquipmentOnDeath(class ActorDamageSource const&, int);
     /*336*/ virtual void dropEquipmentOnDeath();
     /*337*/ virtual void clearVanishEnchantedItemsOnDeath();
     /*338*/ virtual void sendInventory(bool);
@@ -295,24 +297,24 @@ class Player : public Mob {
     /*350*/ virtual void __unk_vfn_350();
     /*355*/ virtual std::unique_ptr<class BodyControl> initBodyControl();
     /*356*/ virtual void jumpFromGround();
-    /*357*/ virtual void jumpFromGround(struct IMobMovementProxy &) const;
+    /*357*/ virtual void jumpFromGround(struct IMobMovementProxy&) const;
     /*358*/ virtual void updateAi();
     /*363*/ virtual void updateGliding();
     /*364*/ virtual void __unk_vfn_364();
-    /*366*/ virtual void prepareRegion(class ChunkSource &);
+    /*366*/ virtual void prepareRegion(class ChunkSource&);
     /*367*/ virtual void destroyRegion();
     /*368*/ virtual void suspendRegion();
     /*369*/ virtual void resendAllChunks();
     /*370*/ virtual void _fireWillChangeDimension();
     /*371*/ virtual void _fireDimensionChanged();
     /*372*/ virtual void changeDimensionWithCredits(class AutomaticID<class Dimension, int>);
-    /*373*/ virtual void tickWorld(struct Tick const &);
+    /*373*/ virtual void tickWorld(struct Tick const&);
     /*374*/ virtual void __unk_vfn_374() = 0;
-    /*375*/ virtual std::vector<class ChunkPos> const & getTickingOffsets() const;
+    /*375*/ virtual std::vector<class ChunkPos> const& getTickingOffsets() const;
     /*376*/ virtual void moveView();
-    /*377*/ virtual void setName(std::string const &);
+    /*377*/ virtual void setName(std::string const&);
     /*378*/ virtual enum TravelMethod getTravelledMethod() const;
-    /*379*/ virtual void checkMovementStats(class Vec3 const &);
+    /*379*/ virtual void checkMovementStats(class Vec3 const&);
     /*380*/ virtual void __unk_vfn_380();
     /*381*/ virtual void __unk_vfn_381();
     /*382*/ virtual void respawn();
@@ -324,17 +326,17 @@ class Player : public Mob {
     /*388*/ virtual void stopDestroying();
     /*389*/ virtual void __unk_vfn_389();
     /*390*/ virtual void __unk_vfn_390();
-    /*391*/ virtual void openTrading(struct ActorUniqueID const &, bool);
+    /*391*/ virtual void openTrading(struct ActorUniqueID const&, bool);
     /*392*/ virtual bool canOpenContainerScreen();
     /*393*/ virtual void __unk_vfn_393();
     /*394*/ virtual void openNpcInteractScreen(class std::shared_ptr<struct INpcDialogueData>);
     /*395*/ virtual void openInventory();
     /*396*/ virtual void __unk_vfn_396();
     /*397*/ virtual void __unk_vfn_397();
-    /*398*/ virtual void displayTextObjectMessage(class TextObjectRoot const &, std::string const &, std::string const &);
-    /*399*/ virtual void displayTextObjectWhisperMessage(class ResolvedTextObject const &, std::string const &, std::string const &);
-    /*400*/ virtual void displayWhisperMessage(std::string const &, std::string const &, std::string const &, std::string const &);
-    /*401*/ virtual enum BedSleepingResult startSleepInBed(class BlockPos const &);
+    /*398*/ virtual void displayTextObjectMessage(class TextObjectRoot const&, std::string const&, std::string const&);
+    /*399*/ virtual void displayTextObjectWhisperMessage(class ResolvedTextObject const&, std::string const&, std::string const&);
+    /*400*/ virtual void displayWhisperMessage(std::string const&, std::string const&, std::string const&, std::string const&);
+    /*401*/ virtual enum BedSleepingResult startSleepInBed(class BlockPos const&);
     /*402*/ virtual void stopSleepInBed(bool, bool);
     /*403*/ virtual bool canStartSleepInBed();
     /*404*/ virtual int getSleepTimer() const;
@@ -349,44 +351,44 @@ class Player : public Mob {
     /*413*/ virtual void unRegisterTrackedBoss(struct ActorUniqueID);
     /*414*/ virtual void setPlayerGameType(enum GameType);
     /*415*/ virtual void initHUDContainerManager();
-    /*416*/ virtual void _crit(class Actor &);
-    /*417*/ virtual class IMinecraftEventing * getEventing() const;
+    /*416*/ virtual void _crit(class Actor&);
+    /*417*/ virtual class IMinecraftEventing* getEventing() const;
     /*418*/ virtual void __unk_vfn_418();
-    /*419*/ virtual void sendEventPacket(class EventPacket &) const;
+    /*419*/ virtual void sendEventPacket(class EventPacket&) const;
     /*420*/ virtual void addExperience(int);
     /*421*/ virtual void addLevels(int);
-    /*422*/ virtual void setContainerData(class IContainerManager &, int, int) = 0;
-    /*423*/ virtual void slotChanged(class IContainerManager &, class Container &, int, class ItemStack const &, class ItemStack const &, bool) = 0;
-    /*424*/ virtual void inventoryChanged(class Container &, int, class ItemStack const &, class ItemStack const &, bool);
-    /*425*/ virtual void refreshContainer(class IContainerManager &) = 0;
+    /*422*/ virtual void setContainerData(class IContainerManager&, int, int) = 0;
+    /*423*/ virtual void slotChanged(class IContainerManager&, class Container&, int, class ItemStack const&, class ItemStack const&, bool) = 0;
+    /*424*/ virtual void inventoryChanged(class Container&, int, class ItemStack const&, class ItemStack const&, bool);
+    /*425*/ virtual void refreshContainer(class IContainerManager&) = 0;
     /*426*/ virtual void deleteContainerManager();
     /*427*/ virtual void setFieldOfViewModifier(float);
-    /*428*/ virtual bool is2DPositionRelevant(class AutomaticID<class Dimension, int>, class BlockPos const &);
-    /*429*/ virtual bool isActorRelevant(class Actor const &);
+    /*428*/ virtual bool is2DPositionRelevant(class AutomaticID<class Dimension, int>, class BlockPos const&);
+    /*429*/ virtual bool isActorRelevant(class Actor const&);
     /*430*/ virtual bool isTeacher() const = 0;
     /*431*/ virtual void onSuspension();
     /*432*/ virtual void onLinkedSlotsChanged();
-    /*433*/ virtual void startCooldown(class Item const *, bool);
-    /*434*/ virtual int getItemCooldownLeft(class HashedString const &) const;
+    /*433*/ virtual void startCooldown(class Item const*, bool);
+    /*434*/ virtual int getItemCooldownLeft(class HashedString const&) const;
     /*435*/ virtual int getItemCooldownLeft(unsigned __int64) const;
     /*436*/ virtual int getMaxItemCooldownLeft() const;
-    /*437*/ virtual bool isItemOnCooldown(class HashedString const &) const;
-    /*438*/ virtual void sendInventoryTransaction(class InventoryTransaction const &) const = 0;
+    /*437*/ virtual bool isItemOnCooldown(class HashedString const&) const;
+    /*438*/ virtual void sendInventoryTransaction(class InventoryTransaction const&) const = 0;
     /*439*/ virtual void sendComplexInventoryTransaction(std::unique_ptr<class ComplexInventoryTransaction>) const = 0;
-    /*440*/ virtual void sendNetworkPacket(class Packet &) const;
-    /*441*/ virtual class PlayerEventCoordinator & getPlayerEventCoordinator() = 0;
-    /*442*/ virtual class MoveInputHandler * tryGetMoveInputHandler() const = 0;
+    /*440*/ virtual void sendNetworkPacket(class Packet&) const;
+    /*441*/ virtual class PlayerEventCoordinator& getPlayerEventCoordinator() = 0;
+    /*442*/ virtual class MoveInputHandler* tryGetMoveInputHandler() const = 0;
     /*443*/ virtual enum InputMode getInputMode() const = 0;
     /*444*/ virtual enum ClientPlayMode getPlayMode() const = 0;
     /*445*/ virtual void reportMovementTelemetry(enum MovementEventType);
     /*446*/ virtual void __unk_vfn_446();
     /*447*/ virtual std::string getXuid() const;
-    /*448*/ virtual struct PlayerMovementSettings const & getMovementSettings() const;
-    /*449*/ virtual void onMovePlayerPacketNormal(class Vec3 const &, class Vec2 const &, float);
-    /*450*/ virtual class std::shared_ptr<class ChunkViewSource> _createChunkSource(class ChunkSource &);
+    /*448*/ virtual struct PlayerMovementSettings const& getMovementSettings() const;
+    /*449*/ virtual void onMovePlayerPacketNormal(class Vec3 const&, class Vec2 const&, float);
+    /*450*/ virtual class std::shared_ptr<class ChunkViewSource> _createChunkSource(class ChunkSource&);
 #ifdef ENABLE_VIRTUAL_FAKESYMBOL_PLAYER
-    MCVAPI void displayChatMessage(std::string const &, std::string const &);
-    MCVAPI void displayClientMessage(std::string const &);
+    MCVAPI void displayChatMessage(std::string const&, std::string const&);
+    MCVAPI void displayClientMessage(std::string const&);
     MCVAPI bool getAlwaysShowNameTag() const;
     MCVAPI enum StructureFeatureType getCurrentStructureFeature() const;
     MCVAPI unsigned int getUserId() const;
@@ -396,77 +398,77 @@ class Player : public Mob {
     MCVAPI bool isPlayer() const;
     MCVAPI bool isShootable();
     MCVAPI bool isSimulated() const;
-    MCVAPI void openBook(int, bool, int, class BlockActor *);
-    MCVAPI void openChalkboard(class ChalkboardBlockActor &, bool);
+    MCVAPI void openBook(int, bool, int, class BlockActor*);
+    MCVAPI void openChalkboard(class ChalkboardBlockActor&, bool);
     MCVAPI void openPortfolio();
-    MCVAPI void openSign(class BlockPos const &);
-    MCVAPI void playEmote(std::string const &);
+    MCVAPI void openSign(class BlockPos const&);
+    MCVAPI void playEmote(std::string const&);
     MCVAPI void resetRot();
     MCVAPI void stopLoading();
     MCVAPI bool useNewAi() const;
 #endif
-    MCAPI Player(class Level &, class PacketSender &, enum GameType, class NetworkIdentifier const &, unsigned char, class mce::UUID, std::string const &, std::string const &, std::unique_ptr<class Certificate>, class EntityContext &, std::string const &, std::string const &);
-    MCAPI void applyExhaustion(class Vec3 const &);
+    MCAPI Player(class Level&, class PacketSender&, enum GameType, class NetworkIdentifier const&, unsigned char, class mce::UUID, std::string const&, std::string const&, std::unique_ptr<class Certificate>, class EntityContext&, std::string const&, std::string const&);
+    MCAPI void applyExhaustion(class Vec3 const&);
     MCAPI void broadcastPlayerSpawnedMobEvent(enum ActorType, enum MobSpawnMethod);
     MCAPI bool canBeSeenOnMap() const;
-    MCAPI bool canDestroy(class Block const &) const;
+    MCAPI bool canDestroy(class Block const&) const;
     MCAPI bool canSleep() const;
-    MCAPI bool canStackInOffhand(class ItemStack const &) const;
+    MCAPI bool canStackInOffhand(class ItemStack const&) const;
     MCAPI bool canUseAbility(enum AbilitiesIndex) const;
     MCAPI bool canUseOperatorBlocks() const;
     MCAPI void causeFoodExhaustion(float);
     MCAPI void clearRespawnPosition();
-    MCAPI void eat(class ItemStack const &);
+    MCAPI void eat(class ItemStack const&);
     MCAPI void eat(int, float);
-    MCAPI bool equippedArmorItemCanBeMoved(class ItemStack const &) const;
+    MCAPI bool equippedArmorItemCanBeMoved(class ItemStack const&) const;
     MCAPI void fireDimensionChangedEvent(class AutomaticID<class Dimension, int>);
     MCAPI bool forceAllowEating() const;
-    MCAPI class Agent * getAgent() const;
+    MCAPI class Agent* getAgent() const;
     MCAPI struct ActorUniqueID getAgentID() const;
-    MCAPI class Agent * getAgentIfAllowed(bool, struct ActorUniqueID) const;
-    MCAPI class BlockPos const & getBedPosition() const;
+    MCAPI class Agent* getAgentIfAllowed(bool, struct ActorUniqueID) const;
+    MCAPI class BlockPos const& getBedPosition() const;
     MCAPI __int64 getBlockedUsingDamagedShieldTimeStamp() const;
     MCAPI __int64 getBlockedUsingShieldTimeStamp() const;
     MCAPI __int64 getBlockingStartTimeStamp() const;
     MCAPI class Vec3 getCapePos(float);
     MCAPI class std::weak_ptr<class IContainerManager> getContainerManager();
-    MCAPI class ItemStack const & getCurrentActiveShield() const;
-    MCAPI float getDestroyProgress(class Block const &) const;
-    MCAPI float getDestroySpeed(class Block const &) const;
+    MCAPI class ItemStack const& getCurrentActiveShield() const;
+    MCAPI float getDestroyProgress(class Block const&) const;
+    MCAPI float getDestroySpeed(class Block const&) const;
     MCAPI int getDirection() const;
     MCAPI int getEnchantmentSeed() const;
     MCAPI class AutomaticID<class Dimension, int> getExpectedSpawnDimensionId() const;
-    MCAPI class BlockPos const & getExpectedSpawnPosition() const;
+    MCAPI class BlockPos const& getExpectedSpawnPosition() const;
     MCAPI std::string getInteractText() const;
-    MCAPI class Container & getInventory();
-    MCAPI class ItemStack const & getItemInUse() const;
-    MCAPI std::string getItemInteractText(class Item const &) const;
-    MCAPI class ItemStackNetManagerBase * getItemStackNetManager();
-    MCAPI class ItemStackNetManagerBase const * getItemStackNetManager() const;
+    MCAPI class Container& getInventory();
+    MCAPI class ItemStack const& getItemInUse() const;
+    MCAPI std::string getItemInteractText(class Item const&) const;
+    MCAPI class ItemStackNetManagerBase* getItemStackNetManager();
+    MCAPI class ItemStackNetManagerBase const* getItemStackNetManager() const;
     MCAPI float getLuck();
     MCAPI int getMapIndex();
-    MCAPI class MoveInputHandler * getMoveInputHandler() const;
+    MCAPI class MoveInputHandler* getMoveInputHandler() const;
     MCAPI void getNewEnchantmentSeed();
     MCAPI class AABB getPickupArea() const;
     MCAPI enum BuildPlatform getPlatform() const;
-    MCAPI std::string const & getPlatformOnlineId() const;
+    MCAPI std::string const& getPlatformOnlineId() const;
     MCAPI enum GameType getPlayerGameType() const;
     MCAPI int getPlayerIndex() const;
     MCAPI int getPlayerLevel() const;
     MCAPI enum PlayerPermissionLevel getPlayerPermissionLevel() const;
-    MCAPI std::string const & getPlayerSessionId() const;
-    MCAPI class ItemStack const & getPlayerUIItem(enum PlayerUISlot);
-    MCAPI class BlockPos const & getRespawnAnchorPosition() const;
-    MCAPI class ItemStack const & getSelectedItem() const;
+    MCAPI std::string const& getPlayerSessionId() const;
+    MCAPI class ItemStack const& getPlayerUIItem(enum PlayerUISlot);
+    MCAPI class BlockPos const& getRespawnAnchorPosition() const;
+    MCAPI class ItemStack const& getSelectedItem() const;
     MCAPI int getSelectedItemSlot() const;
-    MCAPI class SerializedSkin & getSkin();
-    MCAPI class SerializedSkin const & getSkin() const;
+    MCAPI class SerializedSkin& getSkin();
+    MCAPI class SerializedSkin const& getSkin() const;
     MCAPI float getSleepRotation() const;
     MCAPI class AutomaticID<class Dimension, int> getSpawnDimension() const;
-    MCAPI class BlockPos const & getSpawnPosition() const;
-    MCAPI class PlayerInventory & getSupplies();
-    MCAPI class PlayerInventory const & getSupplies() const;
-    MCAPI std::vector<struct ActorUniqueID> const & getTrackedBosses();
+    MCAPI class BlockPos const& getSpawnPosition() const;
+    MCAPI class PlayerInventory& getSupplies();
+    MCAPI class PlayerInventory const& getSupplies() const;
+    MCAPI std::vector<struct ActorUniqueID> const& getTrackedBosses();
     MCAPI enum GameType getUnmappedPlayerGameType() const;
     MCAPI bool getUsedPotion();
     MCAPI int getXpNeededForNextLevel() const;
@@ -474,13 +476,13 @@ class Player : public Mob {
     MCAPI bool hasOpenContainer() const;
     MCAPI bool hasOpenContainerOfContainerType(enum ContainerType) const;
     MCAPI bool hasOwnedChunkSource() const;
-    MCAPI bool hasResource(class ItemDescriptor const &);
+    MCAPI bool hasResource(class ItemDescriptor const&);
     MCAPI bool hasRespawnAnchorPosition() const;
     MCAPI bool hasRespawnPosition() const;
-    MCAPI bool interact(class Actor &, class Vec3 const &);
+    MCAPI bool interact(class Actor&, class Vec3 const&);
     MCAPI bool isFlying() const;
     MCAPI bool isForcedRespawn() const;
-    MCAPI bool isHiddenFrom(class Mob &) const;
+    MCAPI bool isHiddenFrom(class Mob&) const;
     MCAPI bool isHungry() const;
     MCAPI bool isHurt();
     MCAPI bool isInCreativeMode() const;
@@ -490,47 +492,47 @@ class Player : public Mob {
     MCAPI bool isSlowedByItemUse() const;
     MCAPI bool isSpawned() const;
     MCAPI bool isUsingItem() const;
-    MCAPI void loadLastDeathLocation(class CompoundTag const &);
-    MCAPI void moveSpawnView(class Vec3 const &, class AutomaticID<class Dimension, int>);
+    MCAPI void loadLastDeathLocation(class CompoundTag const&);
+    MCAPI void moveSpawnView(class Vec3 const&, class AutomaticID<class Dimension, int>);
     MCAPI void recheckSpawnPosition();
     MCAPI void releaseUsingItem();
     MCAPI void resetPlayerLevel();
     MCAPI void resetToDefaultGameMode();
-    MCAPI void setAgent(class Agent *);
+    MCAPI void setAgent(class Agent*);
     MCAPI void setAllPlayersSleeping();
-    MCAPI void setBedRespawnPosition(class BlockPos const &);
+    MCAPI void setBedRespawnPosition(class BlockPos const&);
     MCAPI void setBlockRespawnUntilClientMessage(bool);
     MCAPI void setChunkRadius(unsigned int);
     MCAPI void setContainerManager(class std::shared_ptr<class IContainerManager>);
-    MCAPI void setCursorSelectedItem(class ItemStack const &);
-    MCAPI void setCursorSelectedItemGroup(class ItemGroup const &);
+    MCAPI void setCursorSelectedItem(class ItemStack const&);
+    MCAPI void setCursorSelectedItemGroup(class ItemGroup const&);
     MCAPI void setEnchantmentSeed(int);
     MCAPI void setHasDied(bool);
     MCAPI void setHasSeenCredits(bool);
     MCAPI void setLastDeathDimension(class AutomaticID<class Dimension, int>);
     MCAPI void setMapIndex(int);
     MCAPI void setPermissions(enum CommandPermissionLevel);
-    MCAPI void setPlatformOnlineId(std::string const &);
+    MCAPI void setPlatformOnlineId(std::string const&);
     MCAPI void setPlayerIndex(int);
-    MCAPI void setPlayerUIItem(enum PlayerUISlot, class ItemStack const &);
-    MCAPI void setRespawnPosition(class BlockPos const &, class AutomaticID<class Dimension, int>);
+    MCAPI void setPlayerUIItem(enum PlayerUISlot, class ItemStack const&);
+    MCAPI void setRespawnPosition(class BlockPos const&, class AutomaticID<class Dimension, int>);
     MCAPI void setRespawnPositionCandidate();
-    MCAPI void setRespawnReady(class Vec3 const &);
-    MCAPI void setSelectedItem(class ItemStack const &);
-    MCAPI class ItemStack const & setSelectedSlot(int);
-    MCAPI void setSpawnBlockRespawnPosition(class BlockPos const &, class AutomaticID<class Dimension, int>);
+    MCAPI void setRespawnReady(class Vec3 const&);
+    MCAPI void setSelectedItem(class ItemStack const&);
+    MCAPI class ItemStack const& setSelectedSlot(int);
+    MCAPI void setSpawnBlockRespawnPosition(class BlockPos const&, class AutomaticID<class Dimension, int>);
     MCAPI void setUsedPotion(bool);
     MCAPI bool shouldShowCredits() const;
-    MCAPI void spawnExperienceOrb(class Vec3 const &, int);
-    MCAPI void startCooldown(class HashedString const &, int, bool);
+    MCAPI void spawnExperienceOrb(class Vec3 const&, int);
+    MCAPI void startCooldown(class HashedString const&, int, bool);
     MCAPI void startGliding();
-    MCAPI void startUsingItem(class ItemStack const &, int);
+    MCAPI void startUsingItem(class ItemStack const&, int);
     MCAPI void stopGliding();
     MCAPI void stopUsingItem();
-    MCAPI bool take(class Actor &, int, int);
+    MCAPI bool take(class Actor&, int, int);
     MCAPI void updateBlockSourceTick();
     MCAPI void updateInventoryTransactions();
-    MCAPI void updateSkin(class SerializedSkin const &, int);
+    MCAPI void updateSkin(class SerializedSkin const&, int);
     MCAPI void updateSpawnChunkView();
     MCAPI void updateTrackedBosses();
     MCAPI void useSelectedItem(enum ItemUseMethod, bool);
@@ -568,43 +570,40 @@ class Player : public Mob {
     MCAPI static class Attribute const SATURATION;
     MCAPI static unsigned int const SPAWN_CHUNK_LARGE_JUMP;
     MCAPI static unsigned int const SPAWN_CHUNK_RADIUS;
-    MCAPI static void _aiStep(struct IPlayerMovementProxy &);
-    MCAPI static void _travel(struct IPlayerMovementProxy &, float, float, float);
-    MCAPI static bool canJump(struct IPlayerMovementProxy &);
-    MCAPI static bool checkAndFixSpawnPosition(class Vec3 &, std::vector<class gsl::not_null<class BlockSource *>>, class AABB, bool, bool, bool, bool, bool, bool, short);
-    MCAPI static bool checkNeedAutoJump(struct IPlayerMovementProxy *, float, float);
-    MCAPI static void goDownInWater(struct IActorMovementProxy &);
-    MCAPI static void handleJumpEffects(struct IPlayerMovementProxy &);
-    MCAPI static bool isDangerousVolume(class BlockSource &, class AABB const &, bool);
-    MCAPI static class Player * tryGetFromComponent(class FlagComponent<struct PlayerComponentFlag> const &, class ActorOwnerComponent &, bool);
-    MCAPI static class Player * tryGetFromEntity(class EntityContext &, bool);
-    MCAPI static class Player * tryGetFromEntity(class StackRefResultT<struct EntityRefTraits>, bool);
+    MCAPI static void _aiStep(struct IPlayerMovementProxy&);
+    MCAPI static void _travel(struct IPlayerMovementProxy&, float, float, float);
+    MCAPI static bool canJump(struct IPlayerMovementProxy&);
+    MCAPI static bool checkAndFixSpawnPosition(class Vec3&, std::vector<class gsl::not_null<class BlockSource*>>, class AABB, bool, bool, bool, bool, bool, bool, short);
+    MCAPI static bool checkNeedAutoJump(struct IPlayerMovementProxy*, float, float);
+    MCAPI static void goDownInWater(struct IActorMovementProxy&);
+    MCAPI static void handleJumpEffects(struct IPlayerMovementProxy&);
+    MCAPI static bool isDangerousVolume(class BlockSource&, class AABB const&, bool);
+    MCAPI static class Player* tryGetFromComponent(class FlagComponent<struct PlayerComponentFlag> const&, class ActorOwnerComponent&, bool);
+    MCAPI static class Player* tryGetFromEntity(class EntityContext&, bool);
+    MCAPI static class Player* tryGetFromEntity(class StackRefResultT<struct EntityRefTraits>, bool);
 
-//protected:
-    MCAPI bool _checkAndFixSpawnPosition(class Vec3 &, std::vector<class gsl::not_null<class BlockSource *>>, bool, bool, bool, bool, bool) const;
+    // protected:
+    MCAPI bool _checkAndFixSpawnPosition(class Vec3&, std::vector<class gsl::not_null<class BlockSource*>>, bool, bool, bool, bool, bool) const;
     MCAPI void _chooseSpawnArea();
     MCAPI bool _chooseSpawnPositionWithinArea();
     MCAPI void _registerPlayerAttributes();
     MCAPI void _updateInteraction();
-    MCAPI bool _validateSpawnPositionAvailability(class Vec3 const &, class BlockSource *, class Vec3 const *const) const;
-    MCAPI bool checkBed(class BlockSource *, class Vec3 const *const);
-    MCAPI bool checkSpawnBlock(class BlockSource const &) const;
-    MCAPI static bool _isDangerousBlock(class Block const &, bool);
+    MCAPI bool _validateSpawnPositionAvailability(class Vec3 const&, class BlockSource*, class Vec3 const* const) const;
+    MCAPI bool checkBed(class BlockSource*, class Vec3 const* const);
+    MCAPI bool checkSpawnBlock(class BlockSource const&) const;
+    MCAPI static bool _isDangerousBlock(class Block const&, bool);
 
-//private:
+    // private:
     MCAPI void _addLevels(int);
-    MCAPI bool _blockUsingShield(class ActorDamageSource const &, float);
-    MCAPI void _ensureSafeSpawnPosition(class Vec3 &);
-    MCAPI bool _findFallbackSpawnPosition(class Vec3 &, std::vector<class gsl::not_null<class BlockSource *>>, unsigned int);
+    MCAPI bool _blockUsingShield(class ActorDamageSource const&, float);
+    MCAPI void _ensureSafeSpawnPosition(class Vec3&);
+    MCAPI bool _findFallbackSpawnPosition(class Vec3&, std::vector<class gsl::not_null<class BlockSource*>>, unsigned int);
     MCAPI void _handleCarriedItemInteractText();
-    MCAPI bool _isChunkSourceLoaded(class Vec3 const &, class BlockSource const &) const;
+    MCAPI bool _isChunkSourceLoaded(class Vec3 const&, class BlockSource const&) const;
     MCAPI void _registerElytraLoopSound();
-    MCAPI void _sendShieldUpdatePacket(class ShieldItem const &, class ItemStack const &, class ItemStack const &, enum ContainerID, int);
+    MCAPI void _sendShieldUpdatePacket(class ShieldItem const&, class ItemStack const&, class ItemStack const&, enum ContainerID, int);
 
 
 protected:
-
 private:
-
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/ScriptModuleMinecraft.hpp b/LiteLoader/Header/MC/ScriptModuleMinecraft.hpp
--- a/LiteLoader/Header/MC/ScriptModuleMinecraft.hpp
+++ b/LiteLoader/Header/MC/ScriptModuleMinecraft.hpp
@@ -39,7 +39,7 @@ struct ScriptNavigationResult {
 public:
     bool mIsFullPath;
     std::vector<BlockPos> mPath;
-	
+
 public:
     struct ScriptNavigationResult& operator=(struct ScriptNavigationResult const&) = delete;
     ScriptNavigationResult(struct ScriptNavigationResult const&) = delete;
diff --git a/LiteLoader/Header/MC/ServerNetworkHandler.hpp b/LiteLoader/Header/MC/ServerNetworkHandler.hpp
--- a/LiteLoader/Header/MC/ServerNetworkHandler.hpp
+++ b/LiteLoader/Header/MC/ServerNetworkHandler.hpp
@@ -21,11 +21,11 @@ class ServerNetworkHandler {
     {
        return _onClientAuthenticated(a0, a1);
     }
-	
+
     inline class ServerPlayer* getServerPlayer(class NetworkIdentifier const& a0, char a1=0) {
         return _getServerPlayer(a0, a1);
     }
-	
+
     inline int getActiveAndInProgressPlayerCount(class mce::UUID a1)
     {
         return _getActiveAndInProgressPlayerCount(a1);
diff --git a/LiteLoader/Header/MC/SimulatedPlayer.hpp b/LiteLoader/Header/MC/SimulatedPlayer.hpp
--- a/LiteLoader/Header/MC/SimulatedPlayer.hpp
+++ b/LiteLoader/Header/MC/SimulatedPlayer.hpp
@@ -17,7 +17,9 @@ class SimulatedPlayer : public ServerPlayer {
 #define AFTER_EXTRA
 // Add Member There
 public:
+    [[deprecated("This is a typo. Please use simulateDestroy")]]
     LIAPI bool simulateDestory();
+    LIAPI bool simulateDestroy();
     LIAPI bool simulateUseItem();
     LIAPI bool simulateSneak();
     LIAPI bool simulateStopSneaking();
@@ -134,4 +136,4 @@ class SimulatedPlayer : public ServerPlayer {
 private:
 
 
-};
\ No newline at end of file
+};
diff --git a/LiteLoader/Header/MC/Tick.hpp b/LiteLoader/Header/MC/Tick.hpp
--- a/LiteLoader/Header/MC/Tick.hpp
+++ b/LiteLoader/Header/MC/Tick.hpp
@@ -1,26 +1,23 @@
 // This Header is auto generated by BDSLiteLoader Toolchain
 #pragma once
 
-struct Tick
-{
+struct Tick {
     unsigned long long t;
-    
-    constexpr operator unsigned long long() const
-    {
+
+    constexpr operator unsigned long long() const {
         return t;
     }
-    
-    constexpr operator unsigned long long&()
-    {
+
+    constexpr operator unsigned long long&() {
         return t;
     }
-    
+
     constexpr Tick(unsigned long long v)
-        : t(v){};
+    : t(v){};
 
     constexpr Tick(const Tick& v)
-        : t(v.t){};
-    
+    : t(v.t){};
+
     constexpr Tick()
-        : t(0){};
+    : t(0){};
 };
diff --git a/LiteLoader/Header/MC/Types.hpp b/LiteLoader/Header/MC/Types.hpp
--- a/LiteLoader/Header/MC/Types.hpp
+++ b/LiteLoader/Header/MC/Types.hpp
@@ -10,7 +10,7 @@
 #include "ChunkPos.hpp"
 #include "ChunkBlockPos.hpp"
 
-typedef std::string        xuid_t;
+typedef std::string xuid_t;
 typedef unsigned long long QWORD;
 
 namespace mce {
@@ -18,10 +18,10 @@ class UUID {
     uint64_t a, b;
 
 public:
-    MCAPI std::string            asString() const;
-    MCAPI static UUID            fromString(std::string const&);
-    MCAPI bool                   isEmpty() const;
-    MCAPI static UUID            seedFromString(std::string const&);
+    MCAPI std::string asString() const;
+    MCAPI static UUID fromString(std::string const&);
+    MCAPI bool isEmpty() const;
+    MCAPI static UUID seedFromString(std::string const&);
     MCAPI static class mce::UUID EMPTY;
 
     inline operator bool() const {
@@ -34,21 +34,9 @@ class Color {
     float g;
     float b;
     float a;
-    Color()
-        : r(0.0f)
-        , g(0.0f)
-        , b(0.0f)
-        , a(0.0f){};
-    Color(float r, float g, float b, float a = 1)
-        : r(r)
-        , g(g)
-        , b(b)
-        , a(a){};
-    Color(int ir, int ig, int ib, int ia = 255)
-        : r(ir / 255.0f)
-        , g(ig / 255.0f)
-        , b(ib / 255.0f)
-        , a(ia / 255.0f){};
+    Color() : r(0.0f), g(0.0f), b(0.0f), a(0.0f){};
+    Color(float r, float g, float b, float a = 1) : r(r), g(g), b(b), a(a){};
+    Color(int ir, int ig, int ib, int ia = 255) : r(ir / 255.0f), g(ig / 255.0f), b(ib / 255.0f), a(ia / 255.0f){};
 
     inline operator bool() const {
         return !(*this == NIL);
@@ -56,24 +44,24 @@ class Color {
 
     LIAPI double distanceTo(mce::Color const& dst) const;
     LIAPI std::string toConsoleCode(bool foreground = true) const;
-    LIAPI std::string             toNearestColorCode() const;
+    LIAPI std::string toNearestColorCode() const;
     LIAPI static class mce::Color fromConsoleCode(std::string const&);
     LIAPI static class mce::Color fromColorCode(std::string const&);
-    LIAPI class mce::Color        sRGBToLinear() const;
-    LIAPI class mce::Color        LinearTosRGB() const;
-    LIAPI class mce::Color        LinearToXYZ() const;
-    LIAPI class mce::Color        XYZToLinear() const;
-    LIAPI class mce::Color        XYZToLab() const;
-    LIAPI class mce::Color        LabToXYZ() const;
-    LIAPI double                  deltaE76(mce::Color const& dst) const; // 2.3 for JND
-    LIAPI double                  deltaE94(mce::Color const& dst) const; // 1.0 for JND
-    LIAPI double                  deltaE00(mce::Color const& dst) const; // 1.0 for JND
+    LIAPI class mce::Color sRGBToLinear() const;
+    LIAPI class mce::Color LinearTosRGB() const;
+    LIAPI class mce::Color LinearToXYZ() const;
+    LIAPI class mce::Color XYZToLinear() const;
+    LIAPI class mce::Color XYZToLab() const;
+    LIAPI class mce::Color LabToXYZ() const;
+    LIAPI double deltaE76(mce::Color const& dst) const; // 2.3 for JND
+    LIAPI double deltaE94(mce::Color const& dst) const; // 1.0 for JND
+    LIAPI double deltaE00(mce::Color const& dst) const; // 1.0 for JND
 
     MCAPI static mce::Color const NIL;
     MCAPI static class mce::Color fromHexString(std::string const&);
-    MCAPI bool                    operator==(class mce::Color const&) const;
-    MCAPI int                     toABGR(void) const;
-    MCAPI int                     toARGB(void) const;
+    MCAPI bool operator==(class mce::Color const&) const;
+    MCAPI int toABGR(void) const;
+    MCAPI int toARGB(void) const;
     MCAPI std::string toHexString(void) const;
 
     inline Vec3 toVec3() const {
@@ -216,8 +204,7 @@ namespace std {
 template <>
 struct hash<mce::Color> {
     std::size_t operator()(mce::Color const& c) const noexcept {
-        return (std::hash<float>()(c.r) ^ std::hash<float>()(c.g) ^
-                std::hash<float>()(c.b) ^ std::hash<float>()(c.a));
+        return (std::hash<float>()(c.r) ^ std::hash<float>()(c.g) ^ std::hash<float>()(c.b) ^ std::hash<float>()(c.a));
     }
 };
 
@@ -404,7 +391,7 @@ struct SubChunkStorageUnit {
 template <typename T, typename T2, int unk>
 class TypedServerNetId {
 public:
-    T2     netId;
+    T2 netId;
     inline operator T2() {
         return netId;
     }
@@ -517,8 +504,7 @@ template <typename T>
 class ToFloatFunction;
 
 template <typename T>
-class TypedScreenCapabilities {
-};
+class TypedScreenCapabilities {};
 
 template <typename T, typename T2, typename T3, typename T4 = class UNK>
 class ViewedEntityContextT;
@@ -589,7 +575,7 @@ template <typename T1>
 class WildcardCommandSelector;
 
 // enum
-
+// clang-format off
 enum class ContainerType : char {
     INVENTORY              = -1,
     NONE                   = -9,
@@ -1213,10 +1199,10 @@ enum class InventorySourceType {
     UntrackedInteractionUI = 100,
     NONIMPLEMENTEDTODO     = 99999
 };
-
+// clang-format on
 template <typename T>
 struct InvertableFilter {
-    T    value;
+    T value;
     bool inverted;
 };
 
diff --git a/LiteLoader/Header/MC/Vec2.hpp b/LiteLoader/Header/MC/Vec2.hpp
--- a/LiteLoader/Header/MC/Vec2.hpp
+++ b/LiteLoader/Header/MC/Vec2.hpp
@@ -6,27 +6,21 @@ class Vec2 {
 public:
     float x, y;
 
-    Vec2(float a, float b)
-        : x(a)
-        , y(b){};
+    Vec2(float a, float b) : x(a), y(b){};
 
-    inline std::string toString() const
-    {
+    inline std::string toString() const {
         return std::to_string(x) + "," + std::to_string(y);
     }
 
-    inline Vec2 operator*(float num) const
-    {
+    inline Vec2 operator*(float num) const {
         return {x * num, y * num};
     }
 
-    inline Vec2 operator+(const Vec2& b) const
-    {
+    inline Vec2 operator+(const Vec2& b) const {
         return {this->x + b.x, this->y + b.y};
     }
 
-    inline Vec2 operator-(const Vec2& b) const
-    {
+    inline Vec2 operator-(const Vec2& b) const {
         return {this->x - b.x, this->y - b.y};
     }
 
@@ -39,5 +33,4 @@ class Vec2 {
     MCAPI static class Vec2 const UNIT_X;
     MCAPI static class Vec2 const UNIT_Y;
     MCAPI static class Vec2 const ZERO;
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/MC/Vec3.hpp b/LiteLoader/Header/MC/Vec3.hpp
--- a/LiteLoader/Header/MC/Vec3.hpp
+++ b/LiteLoader/Header/MC/Vec3.hpp
@@ -9,33 +9,21 @@ class Vec3 {
 
     inline Vec3() = default;
 
-    inline Vec3(float _x, float _y, float _z)
-        : x(_x)
-        , y(_y)
-        , z(_z){};
-
-    inline explicit Vec3(BlockPos& pos)
-        : x((float)pos.x)
-        , y((float)pos.y)
-        , z((float)pos.z){};
-
-    inline Vec3(double _x, double _y, double _z)
-        : x((float)_x)
-        , y((float)_y)
-        , z((float)_z){};
-
-    inline Vec3(int _x, int _y, int _z)
-        : x((float)_x)
-        , y((float)_y)
-        , z((float)_z){};
+    inline Vec3(float _x, float _y, float _z) : x(_x), y(_y), z(_z){};
+
+    inline explicit Vec3(BlockPos& pos) : x((float)pos.x), y((float)pos.y), z((float)pos.z){};
+
+    inline Vec3(double _x, double _y, double _z) : x((float)_x), y((float)_y), z((float)_z){};
+
+    inline Vec3(int _x, int _y, int _z) : x((float)_x), y((float)_y), z((float)_z){};
 
     MCAPI class Vec3 abs() const;
 
     MCAPI class Vec3 ceil() const;
 
-    MCAPI float distanceToLineSquared(class Vec3 const&, class Vec3 const&) const;
+    MCAPI class Vec3 floor(float l = 1.0f) const;
 
-    MCAPI class Vec3 floor(float) const;
+    MCAPI float distanceToLineSquared(class Vec3 const&, class Vec3 const&) const;
 
     MCAPI bool isNan() const;
 
@@ -79,10 +67,6 @@ class Vec3 {
 
     LIAPI BlockPos toBlockPos() const;
 
-    LIAPI float length() const;
-
-    LIAPI float distanceTo(Vec3 const&) const;
-
     inline std::string toString() const {
         return std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z);
     }
@@ -96,17 +80,27 @@ class Vec3 {
         return {x / l, y / l, z / l};
     }
 
-      inline float distanceToSqr(const struct Vec3& a2) const {
-        return (float)((float)((float)(*((float*)&a2 + 1) - *((float*)this + 1)) *
-                               (float)(*((float*)&a2 + 1) - *((float*)this + 1))) +
-                       (float)((float)(*(float*)&a2 - *(float*)this) * (float)(*(float*)&a2 - *(float*)this))) +
-               (float)((float)(*((float*)&a2 + 2) - *((float*)this + 2)) *
-                       (float)(*((float*)&a2 + 2) - *((float*)this + 2)));
+    inline float length() const {
+        return sqrt(lengthSqr());
+    }
+
+    inline float lengthSqr() const {
+        return this->dot(*this);
+    }
+
+    inline float distanceTo(Vec3 const& b) const {
+        return (*this - b).length();
+    }
+
+    inline float distanceToSqr(Vec3 const& b) const {
+        return (*this - b).lengthSqr();
     }
 
 
     float& operator[](int index) {
-            if (index < 0 || index > 2) { return (&x)[0]; }
+        if (index < 0 || index > 2) {
+            return (&x)[0];
+        }
         return (&x)[index];
     }
 
@@ -225,7 +219,8 @@ class Vec3 {
 
 namespace std {
 
-template <> struct hash<Vec3> {
+template <>
+struct hash<Vec3> {
     std::size_t operator()(Vec3 const& pos) const noexcept {
         return (std::hash<float>()(pos.x) ^ std::hash<float>()(pos.y) ^ std::hash<float>()(pos.z));
     }
diff --git a/LiteLoader/Header/MC/WebToken.hpp b/LiteLoader/Header/MC/WebToken.hpp
--- a/LiteLoader/Header/MC/WebToken.hpp
+++ b/LiteLoader/Header/MC/WebToken.hpp
@@ -15,11 +15,11 @@ class WebToken {
 // Add Member There
 
 public:
-	std::string header;
-	Json::Value headerInfo;
-	std::string data;
-	Json::Value dataInfo;
-	std::string signature;
+    std::string header;
+    Json::Value headerInfo;
+    std::string data;
+    Json::Value dataInfo;
+    std::string signature;
 
 #undef AFTER_EXTRA
 
diff --git a/LiteLoader/Header/PlayerInfoAPI.h b/LiteLoader/Header/PlayerInfoAPI.h
--- a/LiteLoader/Header/PlayerInfoAPI.h
+++ b/LiteLoader/Header/PlayerInfoAPI.h
@@ -8,4 +8,4 @@ LIAPI std::string getUUID(std::string name);
 LIAPI std::string fromXuid(std::string xuid);
 LIAPI std::string fromUUID(std::string uuid);
 LIAPI void forEachInfo(std::function<bool(std::string_view name, std::string_view xuid, std::string_view uuid)> callback);
-} // namespace PlayerDB
\ No newline at end of file
+} // namespace PlayerInfo
\ No newline at end of file
diff --git a/LiteLoader/Header/RegCommandAPI.h b/LiteLoader/Header/RegCommandAPI.h
--- a/LiteLoader/Header/RegCommandAPI.h
+++ b/LiteLoader/Header/RegCommandAPI.h
@@ -42,8 +42,7 @@ static CommandParameterData makeMandatory(Type Command::*field, std::string name
 }
 template <CommandParameterDataType DataType, typename Command, typename Type>
 static CommandParameterData
-    makeMandatory(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr)
-{
+    makeMandatory(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) {
     return {
         type_id<CommandRegistry, Type>(),
         CommandRegistry::getParseFn<Type>(),
diff --git a/LiteLoader/Header/RemoteCallAPI.h b/LiteLoader/Header/RemoteCallAPI.h
--- a/LiteLoader/Header/RemoteCallAPI.h
+++ b/LiteLoader/Header/RemoteCallAPI.h
@@ -24,28 +24,25 @@
 // // in other plugin
 // auto strSize = RemoteCall::importAs<int(std::string const& arg)>("TestNameSpace", "strSize");
 // logger.info("Size of str: {}", strSize("12345678"));
-// 
+//
 // // in js plugin
 // const strSize = ll.import("TestNameSpace", "strSize");
 // logger.info(`Size of str: ${strSize("12345678")}`);
 //
 /////////////////////////////////////////////////////
-namespace RemoteCall
-{
+namespace RemoteCall {
 #ifdef TEST_NEW_VALUE_TYPE
 // .....
-struct NbtType
-{
+struct NbtType {
     CompoundTag const* ptr = nullptr;
     bool own = false;
     NbtType(std::unique_ptr<CompoundTag> tag)
-        : ptr(tag.release())
-        , own(true){};
+    : ptr(tag.release())
+    , own(true){};
     NbtType(CompoundTag const* ptr)
-        : ptr(ptr)
-        , own(false){};
-    inline std::unique_ptr<CompoundTag> tryGetUniquePtr()
-    {
+    : ptr(ptr)
+    , own(false){};
+    inline std::unique_ptr<CompoundTag> tryGetUniquePtr() {
         if (!own)
             return {};
         own = false;
@@ -56,34 +53,29 @@ struct NbtType
     template <typename RTN>
     inline RTN get() = delete;
     template <>
-    inline CompoundTag const* get()
-    {
+    inline CompoundTag const* get() {
         return ptr;
     };
     template <>
-    inline CompoundTag* get()
-    {
+    inline CompoundTag* get() {
         return const_cast<CompoundTag*>(ptr);
     };
     template <>
-    inline std::unique_ptr<CompoundTag> get()
-    {
+    inline std::unique_ptr<CompoundTag> get() {
         return tryGetUniquePtr();
     };
 };
 
-struct ItemType
-{
+struct ItemType {
     ItemStack const* ptr = nullptr;
     bool own = false;
     ItemType(std::unique_ptr<ItemStack> tag)
-        : ptr(tag.release())
-        , own(true){};
+    : ptr(tag.release())
+    , own(true){};
     ItemType(ItemStack const* ptr)
-        : ptr(ptr)
-        , own(false){};
-    inline std::unique_ptr<ItemStack> tryGetUniquePtr()
-    {
+    : ptr(ptr)
+    , own(false){};
+    inline std::unique_ptr<ItemStack> tryGetUniquePtr() {
         if (!own)
             return {};
         own = false;
@@ -94,162 +86,142 @@ struct ItemType
     template <typename RTN>
     inline RTN get() = delete;
     template <>
-    inline ItemStack const* get()
-    {
+    inline ItemStack const* get() {
         return ptr;
     };
     template <>
-    inline ItemStack* get()
-    {
+    inline ItemStack* get() {
         return const_cast<ItemStack*>(ptr);
     };
     template <>
-    inline std::unique_ptr<ItemStack> get()
-    {
+    inline std::unique_ptr<ItemStack> get() {
         return tryGetUniquePtr();
     };
 };
 
-struct BlockType
-{
+struct BlockType {
     BlockInstance instance;
     BlockType(BlockInstance instance)
-        : instance(instance){};
+    : instance(instance){};
     BlockType(Block const* ptr)
-        : instance(BlockInstance::createBlockInstance(const_cast<Block*>(ptr), BlockPos::ZERO, -1)){};
+    : instance(BlockInstance::createBlockInstance(const_cast<Block*>(ptr), BlockPos::ZERO, -1)){};
     template <typename RTN>
     inline RTN get() = delete;
     template <>
-    inline Block const* get()
-    {
+    inline Block const* get() {
         return instance.getBlock();
     };
     template <>
-    inline BlockInstance get()
-    {
+    inline BlockInstance get() {
         return instance;
     };
 };
 
-struct NumberType
-{
+struct NumberType {
     __int64 i = 0;
     double f = 0;
     NumberType(__int64 i, double f)
-        : i(i)
-        , f(f){};
+    : i(i)
+    , f(f){};
     template <typename T>
-    std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, NumberType&> operator=(T v)
-    {
+    std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, NumberType&> operator=(T v) {
         i = static_cast<__int64>(v);
         f = static_cast<double>(v);
     }
     NumberType(double v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(float v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(__int64 v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(int v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(short v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(char v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(unsigned __int64 v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(unsigned int v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(unsigned short v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     NumberType(unsigned char v)
-        : i(static_cast<__int64>(v))
-        , f(static_cast<double>(v)){};
+    : i(static_cast<__int64>(v))
+    , f(static_cast<double>(v)){};
     template <typename RTN>
-    inline std::enable_if_t<std::is_integral_v<RTN>, RTN> get()
-    {
+    inline std::enable_if_t<std::is_integral_v<RTN>, RTN> get() {
         return static_cast<RTN>(i);
     };
     template <typename RTN>
-    inline std::enable_if_t<std::is_floating_point_v<RTN>, RTN> get()
-    {
+    inline std::enable_if_t<std::is_floating_point_v<RTN>, RTN> get() {
         return static_cast<RTN>(f);
     };
 };
 
-struct WorldPosType
-{
+struct WorldPosType {
     Vec3 pos = Vec3::ZERO;
     int dimId = 3; // VanillaDimensions::Undefined;
     WorldPosType(Vec3 const& pos, int dimId = 3)
-        : pos(pos)
-        , dimId(dimId){};
+    : pos(pos)
+    , dimId(dimId){};
     WorldPosType(std::pair<Vec3, int> const& pos)
-        : pos(pos.first)
-        , dimId(pos.second){};
+    : pos(pos.first)
+    , dimId(pos.second){};
     template <typename RTN>
     inline RTN get() = delete;
     template <>
-    inline Vec3 get()
-    {
+    inline Vec3 get() {
         return pos;
     };
     template <>
-    inline BlockPos get()
-    {
+    inline BlockPos get() {
         return BlockPos(pos);
     };
     template <>
-    inline std::pair<Vec3, int> get()
-    {
+    inline std::pair<Vec3, int> get() {
         return std::make_pair(pos, dimId);
     };
     template <>
-    inline std::pair<BlockPos, int> get()
-    {
+    inline std::pair<BlockPos, int> get() {
         return std::make_pair(BlockPos(pos), dimId);
     };
 };
 
-struct BlockPosType
-{
+struct BlockPosType {
     BlockPos pos = BlockPos::ZERO;
     int dimId = 0;
     BlockPosType(BlockPos const& pos, int dimId = 0)
-        : pos(pos)
-        , dimId(dimId){};
+    : pos(pos)
+    , dimId(dimId){};
     BlockPosType(std::pair<BlockPos, int> const& pos)
-        : pos(pos.first)
-        , dimId(pos.second){};
+    : pos(pos.first)
+    , dimId(pos.second){};
     template <typename RTN>
     inline RTN get() = delete;
     template <>
-    inline BlockPos get()
-    {
+    inline BlockPos get() {
         return pos;
     };
     template <>
-    inline std::pair<BlockPos, int> get()
-    {
+    inline std::pair<BlockPos, int> get() {
         return std::make_pair(pos, dimId);
     };
     template <>
-    inline Vec3 get()
-    {
+    inline Vec3 get() {
         return pos.toVec3();
     };
     template <>
-    inline std::pair<Vec3, int> get()
-    {
+    inline std::pair<Vec3, int> get() {
         return std::make_pair(pos.toVec3(), dimId);
     };
 };
@@ -313,29 +285,28 @@ using Value = std::variant<ElementType>;
 //         return value;
 //     }
 // };
-struct ValueType
-{
+struct ValueType {
     using ArrayType = std::vector<ValueType>;
     using ObjectType = std::unordered_map<std::string, ValueType>;
     using Type = std::variant<Value, ArrayType, ObjectType>;
     Type value;
     ValueType()
-        : value({}){};
+    : value({}){};
     // ValueType(ValueType const& v) = delete;
     // ValueType(Value const& v) = delete;
     ValueType(Value&& v)
-        : value(std::move(v)){};
+    : value(std::move(v)){};
     ValueType(Value v)
-        : value(std::move(v)){};
+    : value(std::move(v)){};
     // ValueType(ValueType&& v) noexcept
     //     : value(std::move(v.value)){};
     ValueType(std::vector<ValueType>&& v)
-        : value(std::move(v)){};
+    : value(std::move(v)){};
     ValueType(std::unordered_map<std::string, ValueType>&& v)
-        : value(std::move(v)){};
+    : value(std::move(v)){};
     template <typename T>
     ValueType(T const& v)
-        : value(Value(v)){};
+    : value(Value(v)){};
 };
 
 template <typename _Ty>
@@ -356,8 +327,7 @@ template <typename T>
 ValueType pack(T val);
 
 template <typename RTN>
-RTN extractValue(Value&& value)
-{
+RTN extractValue(Value&& value) {
     using Type = std::remove_const_t<std::remove_reference_t<RTN>>;
     static_assert(is_supported_type_v<Type>, "Unsupported Type:");
     if constexpr (is_one_of_v<Type, ElementType>)
@@ -385,20 +355,16 @@ RTN extractValue(Value&& value)
 }
 
 template <typename RTN>
-bool extractValue(std::vector<ValueType>& value, std::vector<RTN>& rtn)
-{
-    for (ValueType& val : value)
-    {
+bool extractValue(std::vector<ValueType>& value, std::vector<RTN>& rtn) {
+    for (ValueType& val : value) {
         rtn.emplace_back(std::move(extract<RTN>(std::move(val))));
     }
     return true;
 }
 
 template <typename RTN>
-bool extractValue(std::unordered_map<std::string, ValueType>& value, std::unordered_map<std::string, RTN>& rtn)
-{
-    for (auto& [key, val] : value)
-    {
+bool extractValue(std::unordered_map<std::string, ValueType>& value, std::unordered_map<std::string, RTN>& rtn) {
+    for (auto& [key, val] : value) {
         rtn.emplace(key, std::move(extract<RTN>(std::move(val))));
     }
     return true;
@@ -406,28 +372,22 @@ bool extractValue(std::unordered_map<std::string, ValueType>& value, std::unorde
 
 
 template <typename RTN>
-RTN extract(ValueType&& val)
-{
-    if constexpr (is_vector_v<RTN>)
-    {
+RTN extract(ValueType&& val) {
+    if constexpr (is_vector_v<RTN>) {
         RTN rtn{};
         extractValue(std::get<std::vector<ValueType>>(val.value), rtn);
         return std::move(rtn);
-    }
-    else if constexpr (is_map_v<RTN>)
-    {
+    } else if constexpr (is_map_v<RTN>) {
         RTN rtn{};
         extractValue(std::get<std::unordered_map<std::string, ValueType>>(val.value), rtn);
         return std::move(rtn);
-    }
-    else
+    } else
         return extractValue<RTN>(std::move(std::get<Value>(val.value)));
 }
 
 
 template <typename T>
-ValueType packValue(T val)
-{
+ValueType packValue(T val) {
     using RawType = std::remove_reference_t<std::remove_const_t<T>>;
     static_assert(is_supported_type_v<RawType>, "Unsupported Type");
     if constexpr (is_one_of_v<RawType, ElementType>)
@@ -454,39 +414,30 @@ ValueType packValue(T val)
     return ValueType();
 }
 template <typename T>
-std::vector<ValueType> packArray(std::vector<T> const& val)
-{
+std::vector<ValueType> packArray(std::vector<T> const& val) {
     std::vector<ValueType> result;
-    for (auto& v : val)
-    {
+    for (auto& v : val) {
         result.emplace_back(pack(v));
     }
     return result;
 }
 template <typename T>
-std::unordered_map<std::string, ValueType> packObject(std::unordered_map<std::string, T> const& val)
-{
+std::unordered_map<std::string, ValueType> packObject(std::unordered_map<std::string, T> const& val) {
     std::unordered_map<std::string, ValueType> result;
-    for (auto& [k, v] : val)
-    {
+    for (auto& [k, v] : val) {
         result.emplace(k, pack(v));
     }
     return result;
 }
 
 template <typename T>
-ValueType pack(T val)
-{
+ValueType pack(T val) {
     using RawType = std::remove_reference_t<std::remove_const_t<T>>;
-    if constexpr (is_vector_v<RawType>)
-    {
+    if constexpr (is_vector_v<RawType>) {
         return packArray(std::forward<T>(val));
-    }
-    else if constexpr (is_map_v<RawType>)
-    {
+    } else if constexpr (is_map_v<RawType>) {
         return packObject(std::forward<T>(val));
-    }
-    else
+    } else
         return packValue(std::forward<T>(val));
 }
 
@@ -497,14 +448,12 @@ ValueType pack(T val)
 using ValueType = std::string; // Json string
 
 template <typename T>
-std::remove_reference_t<T> extract(ValueType const& val)
-{
+std::remove_reference_t<T> extract(ValueType const& val) {
     return nlohmann::json::parse(val).get<std::remove_reference_t<T>>();
 }
 
 template <typename T>
-ValueType pack(T const& val)
-{
+ValueType pack(T const& val) {
     return nlohmann::json(val).dump();
 }
 
@@ -512,8 +461,7 @@ ValueType pack(T const& val)
 
 using CallbackFn = std::function<ValueType(std::vector<ValueType>)>;
 
-struct ExportedFuncData
-{
+struct ExportedFuncData {
     HMODULE handle;
     CallbackFn callback;
 };
@@ -523,25 +471,20 @@ LIAPI bool exportFunc(std::string const& nameSpace, std::string const& funcName,
 LIAPI CallbackFn const& importFunc(std::string const& nameSpace, std::string const& funcName);
 
 
-inline ValueType _expandArg(std::vector<ValueType>& args, int& index)
-{
+inline ValueType _expandArg(std::vector<ValueType>& args, int& index) {
     return std::move(args[--index]);
 }
 
 template <typename RTN, typename... Args>
-inline bool _exportAs(std::string const& nameSpace, std::string const& funcName, std::function<RTN(Args...)>&& callback)
-{
+inline bool _exportAs(std::string const& nameSpace, std::string const& funcName, std::function<RTN(Args...)>&& callback) {
     CallbackFn cb = [callback = std::move(callback)](std::vector<ValueType> args) -> ValueType {
         if (sizeof...(Args) != args.size())
             return std::move(ValueType());
         int index = sizeof...(Args);
-        if constexpr (std::is_void_v<RTN>)
-        {
+        if constexpr (std::is_void_v<RTN>) {
             callback(extract<Args>(_expandArg(args, index))...);
             return std::move(ValueType());
-        }
-        else
-        {
+        } else {
             return pack(callback(extract<Args>(_expandArg(args, index))...));
         }
     };
@@ -555,12 +498,10 @@ LIAPI int removeFuncs(std::vector<std::pair<std::string, std::string>> funcs);
 LIAPI void _onCallError(std::string const& msg, HMODULE handle = GetCurrentModule());
 
 template <typename RTN, typename... Args>
-inline bool _importAs(std::string const& nameSpace, std::string const& funcName, std::function<RTN(Args...)>& func)
-{
+inline bool _importAs(std::string const& nameSpace, std::string const& funcName, std::function<RTN(Args...)>& func) {
     func = [nameSpace, funcName](Args... args) -> RTN {
         auto& rawFunc = importFunc(nameSpace, funcName);
-        if (!rawFunc)
-        {
+        if (!rawFunc) {
             _onCallError(fmt::format("Fail to import! Function [{}::{}] has not been exported", nameSpace, funcName));
             return RTN();
         }
@@ -572,16 +513,14 @@ inline bool _importAs(std::string const& nameSpace, std::string const& funcName,
 }
 
 template <typename CB, typename Func = std::conditional_t<std::is_function_v<CB>, std::function<CB>, CB>>
-inline Func importAs(std::string const& nameSpace, std::string const& funcName)
-{
+inline Func importAs(std::string const& nameSpace, std::string const& funcName) {
     Func callback{};
     bool res = _importAs(nameSpace, funcName, callback);
     return std::move(callback);
 }
 
 template <typename CB>
-inline bool exportAs(std::string const& nameSpace, std::string const& funcName, CB&& callback)
-{
+inline bool exportAs(std::string const& nameSpace, std::string const& funcName, CB&& callback) {
     return _exportAs(nameSpace, funcName, std::function(std::move(callback)));
 }
 
diff --git a/LiteLoader/Header/ScheduleAPI.h b/LiteLoader/Header/ScheduleAPI.h
--- a/LiteLoader/Header/ScheduleAPI.h
+++ b/LiteLoader/Header/ScheduleAPI.h
@@ -7,7 +7,7 @@
 // Schedule future callback plans
 //
 // [Usage]
-// 
+//
 //   Schedule::nextTick([](){
 //      Logger::Error("hello");
 //   }, 20);                        // Delay this callback to next game tick (20 ticks = 1 second)
@@ -30,8 +30,7 @@
 //
 /////////////////////////////////////////////////////
 
-class ScheduleTask
-{
+class ScheduleTask {
     unsigned int taskId;
 
 public:
@@ -39,18 +38,16 @@ class ScheduleTask
     LIAPI ScheduleTask() = default;
     LIAPI ScheduleTask(unsigned int taskId);
 
-    inline unsigned int getTaskId()
-    {
+    inline unsigned int getTaskId() {
         return taskId;
     }
 
     LIAPI bool isFinished() const;
 };
 
-namespace Schedule
-{
-    LIAPI ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay, HMODULE handle = GetCurrentModule());
-    LIAPI ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickInterval, int maxCount = -1, HMODULE handle = GetCurrentModule());
-    LIAPI ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay, unsigned long long tickInterval, int maxCount = -1, HMODULE handle = GetCurrentModule());
-    LIAPI ScheduleTask nextTick(std::function<void(void)> task, HMODULE handle = GetCurrentModule());
+namespace Schedule {
+LIAPI ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay, HMODULE handle = GetCurrentModule());
+LIAPI ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickInterval, int maxCount = -1, HMODULE handle = GetCurrentModule());
+LIAPI ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay, unsigned long long tickInterval, int maxCount = -1, HMODULE handle = GetCurrentModule());
+LIAPI ScheduleTask nextTick(std::function<void(void)> task, HMODULE handle = GetCurrentModule());
 }; // namespace Schedule
\ No newline at end of file
diff --git a/LiteLoader/Header/SendPacketAPI.h b/LiteLoader/Header/SendPacketAPI.h
--- a/LiteLoader/Header/SendPacketAPI.h
+++ b/LiteLoader/Header/SendPacketAPI.h
@@ -10,7 +10,7 @@ class NetworkPacket : public Packet {
         incompressible = compress;
     }
     NetworkPacket(string_view sv)
-        : view(sv) {
+    : view(sv) {
         incompressible = compress;
     }
     inline virtual ~NetworkPacket() {
diff --git a/LiteLoader/Header/ServerAPI.h b/LiteLoader/Header/ServerAPI.h
--- a/LiteLoader/Header/ServerAPI.h
+++ b/LiteLoader/Header/ServerAPI.h
@@ -2,9 +2,8 @@
 #include <string>
 #include <Global.h>
 
-namespace LL
-{
-	LIAPI std::string getBdsVersion();
-	LIAPI int getServerProtocolVersion();
-	LIAPI bool setServerMotd(const std::string& motd);
-}
+namespace LL {
+LIAPI std::string getBdsVersion();
+LIAPI int getServerProtocolVersion();
+LIAPI bool setServerMotd(const std::string& motd);
+} // namespace LL
diff --git a/LiteLoader/Header/Utils/CsLock.h b/LiteLoader/Header/Utils/CsLock.h
--- a/LiteLoader/Header/Utils/CsLock.h
+++ b/LiteLoader/Header/Utils/CsLock.h
@@ -5,10 +5,10 @@
 // ===== Critical Section Locker =====
 // a simple lock which is much faster than std::mutex
 
-class CsLock
-{
+class CsLock {
     bool inited = false;
     CRITICAL_SECTION cslock;
+
 public:
     LIAPI CsLock();
     LIAPI ~CsLock();
@@ -17,10 +17,15 @@ class CsLock
     LIAPI bool unlock();
 };
 
-class CsLockHolder
-{
-    CsLock &locker;
+class CsLockHolder {
+    CsLock& locker;
+
 public:
-    LIAPI CsLockHolder(CsLock &lock) :locker(lock) { locker.lock(); }
-    LIAPI ~CsLockHolder() { locker.unlock(); }
+    LIAPI CsLockHolder(CsLock& lock)
+    : locker(lock) {
+        locker.lock();
+    }
+    LIAPI ~CsLockHolder() {
+        locker.unlock();
+    }
 };
diff --git a/LiteLoader/Header/Utils/FileHelper.h b/LiteLoader/Header/Utils/FileHelper.h
--- a/LiteLoader/Header/Utils/FileHelper.h
+++ b/LiteLoader/Header/Utils/FileHelper.h
@@ -7,7 +7,7 @@
 LIAPI FILE* GetFILEfromFstream(std::fstream& fs);
 LIAPI HANDLE GetHANDLEfromFstream(std::fstream& fs);
 
-LIAPI std::vector<std::string> GetFileNameList (const std::string& dir);
-LIAPI bool CreateDirs (const std::string path);
+LIAPI std::vector<std::string> GetFileNameList(const std::string& dir);
+LIAPI bool CreateDirs(const std::string path);
 LIAPI std::optional<std::string> ReadAllFile(const std::string& filePath, bool isBinary = false);
 LIAPI bool WriteAllFile(const std::string& filePath, const std::string& content, bool isBinary = false);
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/Hash.h b/LiteLoader/Header/Utils/Hash.h
--- a/LiteLoader/Header/Utils/Hash.h
+++ b/LiteLoader/Header/Utils/Hash.h
@@ -37,8 +37,7 @@ constexpr uint64_t do_hash(const char* x, int len) {
 constexpr uint64_t do_hash2(string_view x) {
     // ap hash
     uint64_t rval = 0;
-    for (size_t i = 0; i < x.size(); ++i)
-    {
+    for (size_t i = 0; i < x.size(); ++i) {
         rval *= 128;
         rval += x[i];
         rval += 4;
diff --git a/LiteLoader/Header/Utils/Json.h b/LiteLoader/Header/Utils/Json.h
--- a/LiteLoader/Header/Utils/Json.h
+++ b/LiteLoader/Header/Utils/Json.h
@@ -15,7 +15,7 @@ namespace Json {
 class StaticString {
 public:
     explicit StaticString(const char* czstring)
-        : c_str_(czstring) {
+    : c_str_(czstring) {
     }
     operator const char*() const {
         return c_str_;
@@ -63,15 +63,17 @@ class Value {
 public:
     class CZString {
     public:
-        enum DuplicationPolicy { noDuplication = 0,
-                                 duplicate,
-                                 duplicateOnCopy };
+        enum DuplicationPolicy {
+            noDuplication = 0,
+            duplicate,
+            duplicateOnCopy
+        };
         inline CZString(ArrayIndex index)
-            : cstr_(nullptr)
-            , index_(index) {
+        : cstr_(nullptr)
+        , index_(index) {
         }
         CZString(char const* str, unsigned length, DuplicationPolicy allocate)
-            : cstr_(str) {
+        : cstr_(str) {
             storage_.policy_ = allocate & 0x3;
             storage_.length_ = length & 0x3FFFFFFF;
         }
diff --git a/LiteLoader/Header/Utils/NetworkHelper.h b/LiteLoader/Header/Utils/NetworkHelper.h
--- a/LiteLoader/Header/Utils/NetworkHelper.h
+++ b/LiteLoader/Header/Utils/NetworkHelper.h
@@ -18,4 +18,4 @@ LIAPI bool HttpGet(const std::string& url, const std::function<void(int, std::st
 
 // Http Get (sync)
 // [return] {status, data}
-LIAPI bool HttpGetSync(const std::string& url, int *statusRtn = nullptr, std::string* dataRtn = nullptr, int timeout = -1);
\ No newline at end of file
+LIAPI bool HttpGetSync(const std::string& url, int* statusRtn = nullptr, std::string* dataRtn = nullptr, int timeout = -1);
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/Optional.h b/LiteLoader/Header/Utils/Optional.h
--- a/LiteLoader/Header/Utils/Optional.h
+++ b/LiteLoader/Header/Utils/Optional.h
@@ -5,44 +5,52 @@ struct optional : Ioptional {
     char filler[sizeof(T)];
     using Tval = typename T;
     bool set;
-    T &value() {
+    T& value() {
         if (!set) {
             throw(std::exception("bad optional access"));
         }
-        return *(T *)filler;
+        return *(T*)filler;
     }
-    const T &value() const {
+    const T& value() const {
         if (!set) {
             throw(std::exception("bad optional access"));
         }
-        return *(T *)filler;
+        return *(T*)filler;
     }
-    const T &val() const { return value(); }
-    T &val() { return value(); }
-    inline bool Set() const { return set; }
-    optional(T const &v) {
+    const T& val() const {
+        return value();
+    }
+    T& val() {
+        return value();
+    }
+    inline bool Set() const {
+        return set;
+    }
+    optional(T const& v) {
         new (filler) T(v);
         set = true;
     }
-    optional(T &&v) {
+    optional(T&& v) {
         new (filler) T(std::forward<T>(v));
         set = true;
     }
-    optional() { set = false; }
-    optional(const optional<T> &x) {
+    optional() {
+        set = false;
+    }
+    optional(const optional<T>& x) {
         set = x.set;
         if (set) {
             new (filler) T(x.value());
         }
     }
-    optional(optional<T> &&x) noexcept {
+    optional(optional<T>&& x) noexcept {
         set = x.set;
         if (set) {
             new (filler) T(std::move(x.value()));
         }
         x.set = false;
     }
-    optional<T> &operator=(const optional<T> &x) {
+    optional<T>& operator=(const optional<T>& x) {
         set = x.set;
         if (set) {
             new (filler) T(x.value());
@@ -55,7 +63,7 @@ struct optional : Ioptional {
         }
     }
     template <typename Callable>
-    void then(Callable const &x) {
+    void then(Callable const& x) {
         if (set)
             x(val());
     }
diff --git a/LiteLoader/Header/Utils/PatchHelper.h b/LiteLoader/Header/Utils/PatchHelper.h
--- a/LiteLoader/Header/Utils/PatchHelper.h
+++ b/LiteLoader/Header/Utils/PatchHelper.h
@@ -19,7 +19,9 @@ struct PatchHelper {
     constexpr bool operator!=(PatchHelper ref) const noexcept {
         return memcmp(data, ref.data, sizeof data) != 0;
     }
-    void operator=(ref_t ref) { memcpy(data, ref, sizeof data); }
+    void operator=(ref_t ref) {
+        memcpy(data, ref, sizeof data);
+    }
     void DoPatch(PatchHelper expected, PatchHelper patched) {
         if (*this == expected)
             *this = patched;
@@ -35,7 +37,7 @@ struct PatchHelper {
 
     std::string Dump() const noexcept {
         char buffer[2 * len + 1] = {};
-        char *ptr                = buffer;
+        char* ptr = buffer;
         for (auto ch : data)
             ptr += sprintf(ptr, "%02X", (unsigned)ch);
         return {buffer};
@@ -54,8 +56,10 @@ struct NopFiller {
 struct FailedToPatch : std::exception {
     std::string info;
     template <int len>
-    FailedToPatch(PatchHelper<len> const &current, PatchHelper<len> const &expected) {
+    FailedToPatch(PatchHelper<len> const& current, PatchHelper<len> const& expected) {
         info = "Failed to patch: expected " + expected.Dump() + ", but actual " + current.Dump();
     }
-    const char *what() const noexcept { return info.c_str(); }
+    const char* what() const noexcept {
+        return info.c_str();
+    }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/PlayerMap.h b/LiteLoader/Header/Utils/PlayerMap.h
--- a/LiteLoader/Header/Utils/PlayerMap.h
+++ b/LiteLoader/Header/Utils/PlayerMap.h
@@ -2,32 +2,36 @@
 #include <Global.h>
 class ServerPlayer;
 struct DePlayerCB {
-    void *userdata;
-    void (*cb)(void *, ServerPlayer *);
-    void operator()(ServerPlayer *sp) { cb(userdata, sp); }
+    void* userdata;
+    void (*cb)(void*, ServerPlayer*);
+    void operator()(ServerPlayer* sp) {
+        cb(userdata, sp);
+    }
 };
 
 LIAPI void _regDePlayerCB(DePlayerCB);
 
 template <typename T>
 class playerMap {
-  public:
-    std::unordered_map<ServerPlayer *, T> _map;
+public:
+    std::unordered_map<ServerPlayer*, T> _map;
 
-  private:
-    static void onDelete(playerMap<T> &thi, ServerPlayer *sp) { thi._map.erase(sp); }
+private:
+    static void onDelete(playerMap<T>& thi, ServerPlayer* sp) {
+        thi._map.erase(sp);
+    }
 
-  public:
+public:
     playerMap() {
         DePlayerCB cb;
         cb.userdata = this;
-        cb.cb       = (decltype(cb.cb))(&playerMap<T>::onDelete);
+        cb.cb = (decltype(cb.cb))(&playerMap<T>::onDelete);
         _regDePlayerCB(cb);
     }
-    inline T &get(ServerPlayer *sp) {
+    inline T& get(ServerPlayer* sp) {
         auto it = _map.find(sp);
         if (it == _map.end()) {
-            if constexpr (std::is_constructible<T, ServerPlayer &>()) {
+            if constexpr (std::is_constructible<T, ServerPlayer&>()) {
                 _map.emplace(sp, *sp);
             } else {
                 _map.operator[](sp);
@@ -37,6 +41,10 @@ class playerMap {
             return it->second;
         }
     }
-    T &operator[](ServerPlayer *sp) { return get(sp); }
-    T &operator[](ServerPlayer &sp) { return get(&sp); }
+    T& operator[](ServerPlayer* sp) {
+        return get(sp);
+    }
+    T& operator[](ServerPlayer& sp) {
+        return get(&sp);
+    }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/PluginOwnData.h b/LiteLoader/Header/Utils/PluginOwnData.h
--- a/LiteLoader/Header/Utils/PluginOwnData.h
+++ b/LiteLoader/Header/Utils/PluginOwnData.h
@@ -4,15 +4,15 @@
 //  Must be used header-only!
 //
 //  [Usage]
-// 
+//
 //  PluginOwnData::set<std::string>("name","hello!");
 //  ......
 //  ......
-//  cout << PluginOwnData::get<std::string>("name") << endl;		// "hello!"
+//  cout << PluginOwnData::get<std::string>("name") << endl;        // "hello!"
 //  ......
 //  if(PluginOwnData::has("name"))
 //      PluginOwnData::remove<std::string>("name");
-// 
+//
 ////////////////////////////////////////////////////////////////////////
 
 
@@ -24,57 +24,75 @@
 
 LIAPI extern std::unordered_map<HMODULE, std::unordered_map<std::string, void*>> ll_PluginOwnData;
 
-namespace PluginOwnData
-{
-	inline bool hasImpl(HMODULE hPlugin, const std::string& key)
-	{
-		return ll_PluginOwnData[hPlugin].find(key) != ll_PluginOwnData[hPlugin].end();
-	}
+namespace PluginOwnData {
+inline bool hasImpl(HMODULE hPlugin, const std::string& key) {
+    return ll_PluginOwnData[hPlugin].find(key) != ll_PluginOwnData[hPlugin].end();
+}
+
+template <typename T>
+inline void removeImpl(HMODULE hPlugin, const std::string& key) {
+    if (hasImpl(hPlugin, key)) {
+        delete (T*)ll_PluginOwnData[hPlugin][key];
+    }
+}
+
+template <typename T, typename... Args>
+inline T& setImpl(HMODULE hPlugin, const std::string& key, const Args&... args) {
+    removeImpl<T>(hPlugin, key);
+    T* res = new T(args...);
+    ll_PluginOwnData[hPlugin][key] = res;
+    return *res;
+}
+
+template <typename T>
+inline T& setWithoutNewImpl(HMODULE hPlugin, const std::string& key, T* val) {
+    removeImpl<T>(hPlugin, key);
+    ll_PluginOwnData[hPlugin][key] = val;
+    return *val;
+}
+
+template <typename T>
+inline T& getImpl(HMODULE hPlugin, const std::string& key) {
+    if (!hasImpl(hPlugin, key)) {
+        throw std::out_of_range("The specified key is not found!");
+    }
+    return *(T*)ll_PluginOwnData[hPlugin][key];
+}
 
-	template <typename T>
-	inline void removeImpl(HMODULE hPlugin, const std::string& key)
-	{
-		if (hasImpl(hPlugin, key))
-			delete (T*)ll_PluginOwnData[hPlugin][key];
-	}
+template <typename T, typename... Args>
+inline T& getOrImpl(HMODULE hPlugin, const std::string& key, const Args&... args) {
+    if (!hasImpl(hPlugin, key)) {
+        return setImpl(hPlugin, key, args...);
+    }
+    return *(T*)ll_PluginOwnData[hPlugin][key];
+}
 
-	template <typename T, typename... Args>
-	inline T &setImpl(HMODULE hPlugin, const std::string& key,const Args&... args)
-	{
-		removeImpl<T>(hPlugin, key);
-		T* res = new T(args...);
-		ll_PluginOwnData[hPlugin][key] = res;
-		return *res;
-	}
+template <typename T, typename... Args>
+inline T& set(const std::string& key, const Args&... args) {
+    return setImpl<T, Args...>(GetCurrentModule(), key, args...);
+}
 
-	template <typename T>
-	inline T& getImpl(HMODULE hPlugin, const std::string& key)
-	{
-		if (!hasImpl(hPlugin, key))
-			ll_PluginOwnData[hPlugin][key] = new T;
-		return *(T*)ll_PluginOwnData[hPlugin][key];
-	}
+template <typename T, typename... Args>
+inline T& setWithoutNew(const std::string& key, T* val) {
+    return setWithoutNewImpl(GetCurrentModule(), key, val);
+}
 
-	template <typename T, typename... Args>
-	inline T& set(const std::string& key, const Args&... args)
-	{
-		return setImpl<T,Args...>(GetCurrentModule(), key, args...);
-	}
+template <typename T>
+inline T& get(const std::string& key) {
+    return getImpl<T>(GetCurrentModule(), key);
+}
 
-	template <typename T>
-	inline T& get(const std::string& key)
-	{
-		return getImpl<T>(GetCurrentModule(), key);
-	}
+template <typename T, typename ... Args>
+inline T& getOr(const std::string& key, const Args& ... args) {
+    return getOrImpl<T>(GetCurrentModule(), key, args...);
+}
 
-	inline bool has(const std::string& key)
-	{
-		return hasImpl(GetCurrentModule(), key);
-	}
+inline bool has(const std::string& key) {
+    return hasImpl(GetCurrentModule(), key);
+}
 
-	template <typename T>
-	inline void remove(const std::string& key)
-	{
-        return removeImpl<T>(GetCurrentModule(), key);
-	}
-}
\ No newline at end of file
+template <typename T>
+inline void remove(const std::string& key) {
+    return removeImpl<T>(GetCurrentModule(), key);
+}
+} // namespace PluginOwnData
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/SRWLock.h b/LiteLoader/Header/Utils/SRWLock.h
--- a/LiteLoader/Header/Utils/SRWLock.h
+++ b/LiteLoader/Header/Utils/SRWLock.h
@@ -2,8 +2,7 @@
 #include "../Global.h"
 #include <windows.h>
 
-class SRWLock
-{
+class SRWLock {
     bool inited = false;
     SRWLOCK srwlock{};
 
@@ -17,20 +16,29 @@ class SRWLock
     LIAPI void unlock_shared();
 };
 
-class SRWLockHolder
-{
-    SRWLock &locker;
+class SRWLockHolder {
+    SRWLock& locker;
+
 public:
-    LIAPI SRWLockHolder(SRWLock &lock) :locker(lock) { locker.lock(); }
-    LIAPI ~SRWLockHolder() { locker.unlock(); }
+    LIAPI SRWLockHolder(SRWLock& lock)
+    : locker(lock) {
+        locker.lock();
+    }
+    LIAPI ~SRWLockHolder() {
+        locker.unlock();
+    }
 };
 
 
+class SRWLockSharedHolder {
+    SRWLock& locker;
 
-class SRWLockSharedHolder
-{
-    SRWLock &locker;
 public:
-    LIAPI SRWLockSharedHolder(SRWLock &lock) :locker(lock) { locker.lock_shared(); }
-    LIAPI ~SRWLockSharedHolder() { locker.unlock_shared(); }
+    LIAPI SRWLockSharedHolder(SRWLock& lock)
+    : locker(lock) {
+        locker.lock_shared();
+    }
+    LIAPI ~SRWLockSharedHolder() {
+        locker.unlock_shared();
+    }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/STLHelper.h b/LiteLoader/Header/Utils/STLHelper.h
--- a/LiteLoader/Header/Utils/STLHelper.h
+++ b/LiteLoader/Header/Utils/STLHelper.h
@@ -2,10 +2,13 @@
 #include <map>
 #include <functional>
 
-template< typename ContainerT, typename PredicateT >
+template <typename ContainerT, typename PredicateT>
 void erase_if(ContainerT& items, const PredicateT& predicate) {
-    for (auto it = items.begin(); it != items.end(); ) {
-        if (predicate(*it)) it = items.erase(it);
-        else ++it;
+    for (auto it = items.begin(); it != items.end();) {
+        if (predicate(*it)) {
+            it = items.erase(it);
+        } else {
+            ++it;
+        }
     }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/ShellLinkFile.h b/LiteLoader/Header/Utils/ShellLinkFile.h
--- a/LiteLoader/Header/Utils/ShellLinkFile.h
+++ b/LiteLoader/Header/Utils/ShellLinkFile.h
@@ -4,8 +4,7 @@
 struct IShellLinkW;
 struct IPersistFile;
 
-class ShellLinkFile
-{
+class ShellLinkFile {
 
     IShellLinkW* shellLink = nullptr;
     IPersistFile* presistFile = nullptr;
@@ -14,23 +13,21 @@ class ShellLinkFile
     void _Init();
 
 public:
-
     /**
      * @brief The HotKey struct
-     * 
+     *
      * @see  https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinkw-gethotkey#parameters
-     * @note The modifier flags(mod) can be a combination of the following values: 
+     * @note The modifier flags(mod) can be a combination of the following values:
      *        HOTKEYF_ALT, HOTKEYF_CONTROL, HOTKEYF_EXT, HOTKEYF_SHIFT.
      */
-    struct HotKey
-    {
+    struct HotKey {
         char vk;  // Low
         char mod; // High
     };
 
     /**
      * @brief Init (and load) a shell link file.
-     * 
+     *
      * @param path  The path to the file(optional).
      *              If `path` is empty, the file will not be loaded.
      */
@@ -46,14 +43,14 @@ class ShellLinkFile
 
     /**
      * @brief Load a shell link(.lnk) file.
-     * 
+     *
      * @param  path  The path to the file
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& load(const std::string& path);
     /**
      * @brief Load a shell link(.lnk) file.
-     * 
+     *
      * @param  path  The path to the file
      * @return ShellLinkFile&  *this
      */
@@ -61,14 +58,14 @@ class ShellLinkFile
 
     /**
      * @brief Save the shell link file.
-     * 
+     *
      * @param path  The path where to save the file.
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& save(const std::string& path);
     /**
      * @brief Save the shell link file.
-     * 
+     *
      * @param path  The path where to save the file(optional).
      * @return ShellLinkFile&  *this
      */
@@ -76,7 +73,7 @@ class ShellLinkFile
 
     /**
      * @brief Try resloving the shell link file.
-     * 
+     *
      * @param  hwnd   The hwnd
      * @param  flags  The flags
      * @return bool   True if resolved, false otherwise.
@@ -86,32 +83,32 @@ class ShellLinkFile
 
     /**
      * @brief Close the shell link file.
-     * 
+     *
      */
     LIAPI void close();
 
     /**
      * @brief Get the target path of the shell link file.
-     * 
+     *
      * @return std::string  The path
      */
     LIAPI std::string getPath();
     /**
      * @brief Get the target path of the shell link file.
-     * 
+     *
      * @return std::wstring  The path
      */
     LIAPI std::wstring getPathW();
     /**
      * @brief Set the target path of the shell link file.
-     * 
+     *
      * @param path  The path
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setPath(const std::string& path);
     /**
      * @brief Set the target path of the shell link file.
-     * 
+     *
      * @param path  The path
      * @return ShellLinkFile&  *this
      */
@@ -119,26 +116,26 @@ class ShellLinkFile
 
     /**
      * @brief Get the working directory of the shell link file.
-     * 
+     *
      * @return std::string  The path
      */
     LIAPI std::string getWorkingDirectory();
     /**
      * @brief Get the working directory of the shell link file.
-     * 
+     *
      * @return std::wstring  The path
      */
     LIAPI std::wstring getWorkingDirectoryW();
     /**
      * @brief Set the working directory of the shell link file.
-     * 
+     *
      * @param path  The path
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setWorkingDirectory(const std::string& path);
     /**
      * @brief Set the working directory of the shell link file.
-     * 
+     *
      * @param path  The path
      * @return ShellLinkFile&  *this
      */
@@ -146,26 +143,26 @@ class ShellLinkFile
 
     /**
      * @brief Get the description of the shell link file.
-     * 
+     *
      * @return std::string  The description
      */
     LIAPI std::string getDescription();
     /**
      * @brief Get the description of the shell link file.
-     * 
+     *
      * @return std::wstring  The description
      */
     LIAPI std::wstring getDescriptionW();
     /**
      * @brief Set the description of the shell link file.
-     * 
+     *
      * @param description  The description
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setDescription(const std::string& description);
     /**
      * @brief Set the description of the shell link file.
-     * 
+     *
      * @param description  The description
      * @return ShellLinkFile&  *this
      */
@@ -173,26 +170,26 @@ class ShellLinkFile
 
     /**
      * @brief Get the arguments of the shell link file.
-     * 
+     *
      * @return std::string  The arguments
      */
     LIAPI std::string getArguments();
     /**
      * @brief Get the arguments of the shell link file.
-     * 
+     *
      * @return std::wstring  The arguments
      */
     LIAPI std::wstring getArgumentsW();
     /**
      * @brief Set the arguments of the shell link file.
-     * 
+     *
      * @param arguments  The arguments
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setArguments(const std::string& arguments);
     /**
      * @brief Set the arguments of the shell link file.
-     * 
+     *
      * @param arguments  The arguments
      * @return ShellLinkFile&  *this
      */
@@ -200,26 +197,26 @@ class ShellLinkFile
 
     /**
      * @brief Get the icon location of the shell link file.
-     * 
+     *
      * @return std::string  The icon location
      */
     LIAPI std::string getIconLocation();
     /**
      * @brief Get the icon location of the shell link file.
-     * 
+     *
      * @return std::wstring  The icon location
      */
     LIAPI std::wstring getIconLocationW();
     /**
      * @brief Set the icon location of the shell link file.
-     * 
+     *
      * @param iconLocation  The icon location
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setIconLocation(const std::string& iconLocation);
     /**
      * @brief Set the icon location of the shell link file.
-     * 
+     *
      * @param iconLocation  The icon location
      * @return ShellLinkFile&  *this
      */
@@ -227,14 +224,14 @@ class ShellLinkFile
 
     /**
      * @brief Get the 'ShowCmd' flags of the shell link file.
-     * 
+     *
      * @return int  The 'ShowCmd' flags
      * @see    https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinkw-getshowcmd
      */
     LIAPI int getShowCmd();
     /**
      * @brief Set the 'ShowCmd' flags of the shell link file.
-     * 
+     *
      * @param showCmd  The 'ShowCmd' flags
      * @return ShellLinkFile&  *this
      * @see    https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinkw-getshowcmd
@@ -243,16 +240,15 @@ class ShellLinkFile
 
     /**
      * @brief Get the hot key of the shell link file.
-     * 
+     *
      * @return ShellLinkFile::HotKey  The hot key
      */
     LIAPI HotKey getHotKey();
     /**
      * @brief Set the hot key of the shell link file.
-     * 
+     *
      * @param hotKey  The hot key
      * @return ShellLinkFile&  *this
      */
     LIAPI ShellLinkFile& setHotKey(const HotKey& hotKey);
-
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/StringHelper.h b/LiteLoader/Header/Utils/StringHelper.h
--- a/LiteLoader/Header/Utils/StringHelper.h
+++ b/LiteLoader/Header/Utils/StringHelper.h
@@ -29,16 +29,16 @@ LIAPI std::string FixCurlyBracket(std::string str);
 #if _HAS_CXX20
 LIAPI std::string UTF82String(std::u8string str);
 #endif
-    /**
+/**
  * @brief Integer to hex string.
- * 
+ *
  * @tparam T      The integer type
  * @param  value  The integer value
  * @param  upper  Whether to use upper case (0x1A or 0x1a)
  * @param  no0x   Whether to omit 0x prefix
  * @param  noLeadingZero  Whether to omit leading zero
  * @return std::string    The hex string
- * 
+ *
  * @par Example
  * @code
  * IntToHexStr(15); // "F"
@@ -47,18 +47,19 @@ LIAPI std::string UTF82String(std::u8string str);
  */
 template <typename T>
 std::string IntToHexStr(const T& value, bool upper = true, bool no0x = true,
-                        bool noLeadingZero = true)
-{
+                        bool noLeadingZero = true) {
     std::string result;
-    if (value < 0) result += '-';
-    if (!no0x) result += "0x";
-	auto hexStr = upper ? "0123456789ABCDEF" : "0123456789abcdef";
+    if (value < 0)
+        result += '-';
+    if (!no0x)
+        result += "0x";
+    auto hexStr = upper ? "0123456789ABCDEF" : "0123456789abcdef";
     bool leadingZero = true;
-    for (int i = sizeof(T) * 2; i > 0; --i)
-    {
+    for (int i = sizeof(T) * 2; i > 0; --i) {
         auto hex = (value >> (i - 1) * 4) & 0xF;
-        if (noLeadingZero && leadingZero && hex == 0) continue;
-		leadingZero = false;
+        if (noLeadingZero && leadingZero && hex == 0)
+            continue;
+        leadingZero = false;
         result += hexStr[hex];
     }
     return result;
diff --git a/LiteLoader/Header/Utils/StringReader.h b/LiteLoader/Header/Utils/StringReader.h
--- a/LiteLoader/Header/Utils/StringReader.h
+++ b/LiteLoader/Header/Utils/StringReader.h
@@ -1,8 +1,7 @@
 #pragma once
 #include <../Global.h>
 
-class StringReader
-{
+class StringReader {
 
     const std::string str;
     size_t len = 0;
@@ -60,13 +59,11 @@ class StringReader
     LIAPI void skipDigits(const std::string& chars = "");
     LIAPI void skipLettersAndDigits(const std::string& chars = "");
 
-    
+
     template <typename T>
-    inline T readInteger()
-    {
+    inline T readInteger() {
         T result = 0;
-        while (isValid() && isdigit(read()))
-        {
+        while (isValid() && isdigit(read())) {
             result = result * 10 + (read() - '0');
         }
         return result;
diff --git a/LiteLoader/Header/Utils/VarInt.h b/LiteLoader/Header/Utils/VarInt.h
--- a/LiteLoader/Header/Utils/VarInt.h
+++ b/LiteLoader/Header/Utils/VarInt.h
@@ -3,14 +3,19 @@
 template <typename T>
 struct VarInts {
     T v;
-    operator T() { return v; }
-    VarInts() {}
-    VarInts(T x) { v = x; }
+    operator T() {
+        return v;
+    }
+    VarInts() {
+    }
+    VarInts(T x) {
+        v = x;
+    }
     template <typename _TP>
-    void pack(WBStreamImpl<_TP> &ws) const {
+    void pack(WBStreamImpl<_TP>& ws) const {
         unsigned char buf[16];
         int ptr = 0;
-        T enc   = v;
+        T enc = v;
         do {
             buf[ptr++] = enc & 0x7f;
             enc >>= 7;
@@ -20,9 +25,9 @@ struct VarInts {
         }
         ws.write(buf, ptr);
     }
-    void unpack(RBStream &rs) {
+    void unpack(RBStream& rs) {
         unsigned char buf[16];
-        v       = 0;
+        v = 0;
         int ptr = 0;
         for (; ptr < 16; ++ptr) {
             rs.apply(buf[ptr]);
@@ -38,23 +43,26 @@ struct VarInts {
         }
     }
 };
-using VarUInt  = VarInts<unsigned int>;
+using VarUInt = VarInts<unsigned int>;
 using VarULong = VarInts<unsigned long long>;
 using VarUShort = VarInts<unsigned short>;
 
 struct MCString {
     string_view view;
-    MCString() {}
-    MCString(string_view sv) : view(sv) {}
+    MCString() {
+    }
+    MCString(string_view sv)
+    : view(sv) {
+    }
     template <typename T>
-    void pack(T &ws) const {
+    void pack(T& ws) const {
         ws.apply(VarUInt((unsigned int)view.size()));
         ws.write(view.data(), view.size());
     }
-    void unpack(RBStream &rs) {
+    void unpack(RBStream& rs) {
         VarUInt sz;
         rs.apply(sz);
-        view = string_view((const char *)rs.data, sz.v);
+        view = string_view((const char*)rs.data, sz.v);
         rs.data += sz.v;
     }
 };
\ No newline at end of file
diff --git a/LiteLoader/Header/Utils/ViewHelper.h b/LiteLoader/Header/Utils/ViewHelper.h
--- a/LiteLoader/Header/Utils/ViewHelper.h
+++ b/LiteLoader/Header/Utils/ViewHelper.h
@@ -2,15 +2,15 @@
 #include <string_view>
 using std::string_view;
 template <typename T, typename std::enable_if_t<!std::is_pointer_v<T>, int> = 0>
-inline static constexpr string_view to_view(T &x) {
-    return string_view((const char *)&x, sizeof(T));
+inline static constexpr string_view to_view(T& x) {
+    return string_view((const char*)&x, sizeof(T));
 }
 template <typename T = int>
 static constexpr T atoi(std::string_view sv) {
-    T res         = 0;
-    int fg        = 0;
-    const char *c = sv.data();
-    auto sz       = sv.size();
+    T res = 0;
+    int fg = 0;
+    const char* c = sv.data();
+    auto sz = sv.size();
     for (decltype(sz) i = 0; i < sz; ++i) {
         if constexpr (!std::is_unsigned_v<T>) {
             if (c[i] == '-') {
diff --git a/LiteLoader/Header/Utils/WinHelper.h b/LiteLoader/Header/Utils/WinHelper.h
--- a/LiteLoader/Header/Utils/WinHelper.h
+++ b/LiteLoader/Header/Utils/WinHelper.h
@@ -13,11 +13,10 @@ LIAPI std::pair<int, std::string> NewProcessSync(const std::string& process, int
 
 // Get Current DLL's module handle
 // (Must be header-only!)
-HMODULE inline GetCurrentModule()
-{
+HMODULE inline GetCurrentModule() {
     HMODULE hModule = nullptr;
     if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
-        (LPCWSTR)GetCurrentModule, &hModule)) {
+                          (LPCWSTR)GetCurrentModule, &hModule)) {
         return hModule;
     }
     return nullptr;
@@ -27,4 +26,11 @@ HMODULE inline GetCurrentModule()
 LIAPI std::string GetModulePath(HMODULE handle);
 LIAPI std::string GetModuleName(HMODULE handle);
 
+/**
+ * @brief Get the system locale name.
+ * 
+ * @return  std::string  The system locale name.
+ */
+LIAPI std::string GetSystemLocaleName();
+
 LIAPI bool IsWineEnvironment();
diff --git a/LiteLoader/Kernel/AllowListAPI.cpp b/LiteLoader/Kernel/AllowListAPI.cpp
--- a/LiteLoader/Kernel/AllowListAPI.cpp
+++ b/LiteLoader/Kernel/AllowListAPI.cpp
@@ -4,29 +4,21 @@
 #include <AllowListAPI.h>
 #include <Utils/FileHelper.h>
 #include <MC/AllowListFile.hpp>
-#pragma warning(disable: 26812)
+#pragma warning(disable : 26812)
 
 Logger allowListLogger("AllowList");
 
-AllowListManager::AllowListManager()
-{
+AllowListManager::AllowListManager() {
     allowList = nlohmann::json::array();
-    if (std::filesystem::exists("allowlist.json"))
-    {
+    if (std::filesystem::exists("allowlist.json")) {
         auto content = ReadAllFile("allowlist.json");
-        if (content.has_value())
-        {
-            try
-            {
+        if (content.has_value()) {
+            try {
                 allowList = nlohmann::json::parse(content.value());
-            }
-            catch (std::exception e)
-            {
+            } catch (std::exception e) {
                 allowListLogger.error("Failed to parse allowlist.json: {}", e.what());
             }
-        }
-        else
-        {
+        } else {
             allowListLogger.error("Failed to read allowlist.json");
         }
         return;
@@ -34,36 +26,27 @@ AllowListManager::AllowListManager()
     allowListLogger.warn("allowlist.json is not found");
 }
 
-void AllowListManager::save()
-{
+void AllowListManager::save() {
     WriteAllFile("allowlist.json", allowList.dump());
 }
 
-size_t AllowListManager::size()
-{
+size_t AllowListManager::size() {
     return allowList.size();
 }
 
-bool AllowListManager::has(const std::string& name, const xuid_t& xuid)
-{
+bool AllowListManager::has(const std::string& name, const xuid_t& xuid) {
     size_t _;
     return has(name, xuid, _);
 }
 
-bool AllowListManager::has(const std::string& name, const xuid_t& xuid, size_t& index)
-{
-    for (int i = 0; i < allowList.size(); i++)
-    {
+bool AllowListManager::has(const std::string& name, const xuid_t& xuid, size_t& index) {
+    for (size_t i = 0, mEnd = allowList.size(); i < mEnd; ++i) {
         auto& p = allowList[i];
-        if (p["name"] == name)
-        {
-            if (!xuid.empty() && p.count("xuid") && p.at("xuid") == xuid)
-            {
+        if (p["name"] == name) {
+            if (!xuid.empty() && p.count("xuid") && p.at("xuid") == xuid) {
                 index = i;
                 return true;
-            }
-            else if (xuid.empty())
-            {
+            } else if (xuid.empty()) {
                 index = i;
                 return true;
             }
@@ -72,13 +55,10 @@ bool AllowListManager::has(const std::string& name, const xuid_t& xuid, size_t&
     return false;
 }
 
-AllowListManager& AllowListManager::add(const std::string& name, const xuid_t& xuid, bool ignore)
-{
-    try
-    {
+AllowListManager& AllowListManager::add(const std::string& name, const xuid_t& xuid, bool ignore) {
+    try {
         nlohmann::json j{{"name", name}, {"ignoresPlayerLimit", ignore}};
-        if (!xuid.empty())
-        {
+        if (!xuid.empty()) {
             j.emplace("xuid", xuid);
         }
         allowList.push_back(j);
@@ -87,41 +67,30 @@ AllowListManager& AllowListManager::add(const std::string& name, const xuid_t& x
             allowListLogger.warn("Added player \"{}\" to AllowList with ignoresPlayerLimit on", name);
         else
             allowListLogger.info("Added player \"{}\" to AllowList", name);
-    }
-    catch (std::exception e)
-    {
+    } catch (std::exception e) {
         allowListLogger.error("Failed to add player to AllowList: {}", e.what());
     }
     return *this;
 }
 
-AllowListManager& AllowListManager::remove(const std::string& name, const xuid_t& xuid)
-{
-    try
-    {
+AllowListManager& AllowListManager::remove(const std::string& name, const xuid_t& xuid) {
+    try {
         size_t i = -1;
-        if (has(name, xuid, i))
-        {
+        if (has(name, xuid, i)) {
             allowList.erase(i);
             save();
             allowListLogger.info("Removed player \"{}\" from AllowList", name);
-        }
-        else
-        {
+        } else {
             allowListLogger.error("Failed to remove player from AllowList: Target player is not found");
         }
-    }
-    catch (std::exception e)
-    {
+    } catch (std::exception e) {
         allowListLogger.error("Failed to remove player from AllowList: {}", e.what());
     }
     return *this;
 }
 
-void AllowListManager::reload()
-{
-    if (Global<AllowListFile>)
-    {
+void AllowListManager::reload() {
+    if (Global<AllowListFile>) {
         Global<AllowListFile>->reload();
     }
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/Command/CommandOriginAPI.cpp b/LiteLoader/Kernel/Command/CommandOriginAPI.cpp
--- a/LiteLoader/Kernel/Command/CommandOriginAPI.cpp
+++ b/LiteLoader/Kernel/Command/CommandOriginAPI.cpp
@@ -2,6 +2,6 @@
 #include <MC/Actor.hpp>
 
 ServerPlayer* CommandOrigin::getPlayer() const {
-	Actor* origin = getEntity();
-	return origin->isPlayer() ? (ServerPlayer*)origin : nullptr;
+    Actor* origin = getEntity();
+    return origin->isPlayer() ? (ServerPlayer*)origin : nullptr;
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/Command/CommandRegistryAPI.cpp b/LiteLoader/Kernel/Command/CommandRegistryAPI.cpp
--- a/LiteLoader/Kernel/Command/CommandRegistryAPI.cpp
+++ b/LiteLoader/Kernel/Command/CommandRegistryAPI.cpp
@@ -25,15 +25,14 @@ extern Logger logger;
 CommandRegistry::Overload::Overload(CommandVersion version,
                                     FactoryFn factory,
                                     std::vector<CommandParameterData>&& args)
-    : version(version)
-    , factory(factory)
-    , params(std::forward<std::vector<CommandParameterData>>(args))
-    , unk(255){};
+: version(version)
+, factory(factory)
+, params(std::forward<std::vector<CommandParameterData>>(args))
+, unk(255){};
 
 CommandRegistry::Overload::~Overload(){};
 
-std::vector<std::string> CommandRegistry::getEnumNames()
-{
+std::vector<std::string> CommandRegistry::getEnumNames() {
     if (!Global<CommandRegistry>)
         return {};
     std::vector<std::string> results;
@@ -44,8 +43,7 @@ std::vector<std::string> CommandRegistry::getEnumNames()
     auto packet = Global<CommandRegistry>->serializeAvailableCommands();
     return packet.getEnumNames();
 }
-std::vector<std::string> CommandRegistry::getSoftEnumNames()
-{
+std::vector<std::string> CommandRegistry::getSoftEnumNames() {
     if (!Global<CommandRegistry>)
         return {};
     std::vector<std::string> results;
@@ -56,8 +54,7 @@ std::vector<std::string> CommandRegistry::getSoftEnumNames()
     auto packet = Global<CommandRegistry>->serializeAvailableCommands();
     return packet.getEnumNames();
 }
-std::vector<std::string> CommandRegistry::getEnumValues(std::string const& name)
-{
+std::vector<std::string> CommandRegistry::getEnumValues(std::string const& name) {
     if (!Global<CommandRegistry>)
         return {};
     std::vector<std::string> results;
@@ -72,8 +69,7 @@ std::vector<std::string> CommandRegistry::getEnumValues(std::string const& name)
     auto packet = Global<CommandRegistry>->serializeAvailableCommands();
     return packet.getEnumValues(name);
 }
-std::vector<std::string> CommandRegistry::getSoftEnumValues(std::string const& name)
-{
+std::vector<std::string> CommandRegistry::getSoftEnumValues(std::string const& name) {
     if (!Global<CommandRegistry>)
         return {};
     std::vector<std::string> results;
@@ -86,8 +82,7 @@ std::vector<std::string> CommandRegistry::getSoftEnumValues(std::string const& n
     auto packet = Global<CommandRegistry>->serializeAvailableCommands();
     return packet.getEnumValues(name);
 }
-std::string CommandRegistry::getCommandFullName(std::string const& name)
-{
+std::string CommandRegistry::getCommandFullName(std::string const& name) {
     if (!Global<CommandRegistry>)
         return "";
     auto sig = Global<CommandRegistry>->findCommand(name);
@@ -97,15 +92,13 @@ std::string CommandRegistry::getCommandFullName(std::string const& name)
 }
 
 #include <Main/Config.h>
-bool CommandRegistry::unregisterCommand(std::string const& name)
-{
+bool CommandRegistry::unregisterCommand(std::string const& name) {
     if (!LL::globalConfig.debugMode) {
         logger.error("unregister command is only enabled in debug mode");
         return false;
     }
     logger.warn("Unregister Command \"{}\"!", name);
-    try
-    {
+    try {
         auto command = getCommandFullName(name);
         if (command.empty())
             return false;
@@ -113,23 +106,18 @@ bool CommandRegistry::unregisterCommand(std::string const& name)
         auto aliasKey = command + "CommandAliases";
         static size_t removeIndex = 0;
         auto iter = std::find_if(mEnums.begin(), mEnums.end(), [](Enum const& e) { return e.name == "CommandName"; });
-        for (auto i = iter->values.begin(); i != iter->values.end();)
-        {
+        for (auto i = iter->values.begin(); i != iter->values.end();) {
             auto& enumValue = mEnumValues.at(std::get<3>(*i));
-            if (enumValue == command || std::find(alias.begin(), alias.end(), enumValue) != alias.end())
-            {
+            if (enumValue == command || std::find(alias.begin(), alias.end(), enumValue) != alias.end()) {
                 mEnumValueLookup.erase(enumValue);
                 i = iter->values.erase(i);
                 enumValue = fmt::format("removed_{}", removeIndex++);
-            }
-            else
-            {
+            } else {
                 ++i;
             }
         }
         auto aliasIter = std::find_if(mEnums.begin(), mEnums.end(), [&aliasKey](Enum const& e) { return e.name == aliasKey; });
-        if (aliasIter != mEnums.end())
-        {
+        if (aliasIter != mEnums.end()) {
             aliasIter->values.clear();
             mEnumLookup.erase(aliasIter->name);
             aliasIter->name = fmt::format("removed_{}", removeIndex++);
@@ -159,59 +147,47 @@ bool CommandRegistry::unregisterCommand(std::string const& name)
         mSignatures.erase(sig);
         mAliases.erase(command);
         return true;
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Error in CommandRegistry::unregisterCommand");
     }
     return false;
 }
 
-inline void CommandRegistry::printAll() const
-{
+inline void CommandRegistry::printAll() const {
     logger.error("mRules");
-    for (auto& rule : mRules)
-    {
+    for (auto& rule : mRules) {
         logger.warn("{}", rule.toDebugString());
     }
     logger.error("mParseTableMap");
-    for (auto& [key, table] : mParseTableMap)
-    {
+    for (auto& [key, table] : mParseTableMap) {
         logger.warn("{}: {}", key, table.toDebugString());
     }
     logger.error("mOptionals");
-    for (auto& optional : mOptionals)
-    {
+    for (auto& optional : mOptionals) {
         logger.warn("{}", optional.toDebugString());
     }
     logger.error("mEnums");
-    for (auto& en : mEnums)
-    {
+    for (auto& en : mEnums) {
         logger.warn("{}", en.toDebugString());
     }
     logger.error("mFactorizations");
-    for (auto& i : mFactorizations)
-    {
+    for (auto& i : mFactorizations) {
         logger.warn("{}", i.toDebugString());
     }
     logger.error("mCommandSymbols");
-    for (auto& i : mCommandSymbols)
-    {
+    for (auto& i : mCommandSymbols) {
         logger.warn("{}", i.toDebugString());
     }
     logger.error("mSignatures");
-    for (auto& [k, v] : mSignatures)
-    {
+    for (auto& [k, v] : mSignatures) {
         logger.warn("{}: {}", k, v.toDebugString());
     }
     logger.error("mConstrainedValues");
-    for (auto& i : mConstrainedValues)
-    {
+    for (auto& i : mConstrainedValues) {
         logger.warn("{}", i.toDebugString());
     }
 }
-inline void CommandRegistry::printSize() const
-{
+inline void CommandRegistry::printSize() const {
     static auto log = std::unordered_map<std::string, std::string>{
         {"mRules                   ", ""},
         {"mParseTableMap           ", ""},
@@ -239,16 +215,14 @@ inline void CommandRegistry::printSize() const
     };
     auto mEnumsValuesSize = ([&]() -> size_t {
         size_t size = 0;
-        for (auto& i : mEnums)
-        {
+        for (auto& i : mEnums) {
             size += i.values.size();
         }
         return size;
     })();
     auto mConstrainedValuesSize = ([&]() -> size_t {
         size_t size = 0;
-        for (auto& i : mConstrainedValues)
-        {
+        for (auto& i : mConstrainedValues) {
             size += i.mConstraints.size();
         }
         return size;
@@ -276,8 +250,7 @@ inline void CommandRegistry::printSize() const
     log["mStateStack              "].append(fmt::format(", {:4}", mStateStack.size()));
     log["mEnumsValues             "].append(fmt::format(", {:4}", mEnumsValuesSize));
     log["mConstrainedValuesValues "].append(fmt::format(", {:4}", mConstrainedValuesSize));
-    for (auto& [k, v] : log)
-    {
+    for (auto& [k, v] : log) {
         logger.warn("{}{}", k, v);
     }
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/Command/DynamicCommandAPI.cpp b/LiteLoader/Kernel/Command/DynamicCommandAPI.cpp
--- a/LiteLoader/Kernel/Command/DynamicCommandAPI.cpp
+++ b/LiteLoader/Kernel/Command/DynamicCommandAPI.cpp
@@ -44,22 +44,18 @@ extern Logger logger;
     func(WildcardSelector);
 
 #define CatchDynamicCommandError(func, handle)                                                                   \
-    catch (const seh_exception& e)                                                                                \
-    {                                                                                                             \
+    catch (const seh_exception& e) {                                                                             \
         OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), func, handle); \
-    }                                                                                                             \
-    catch (const std::exception& e)                                                                               \
-    {                                                                                                             \
+    }                                                                                                            \
+    catch (const std::exception& e) {                                                                            \
         OutputError("Uncaught C++ Exception Detected!", errno, TextEncoding::toUTF8(e.what()), func, handle);    \
-    }                                                                                                             \
-    catch (...)                                                                                                   \
-    {                                                                                                             \
+    }                                                                                                            \
+    catch (...) {                                                                                                \
         OutputError("Uncaught Exception Detected!", -1, "", func, handle);                                       \
     }
 
 // global variable and function
-namespace
-{
+namespace {
 bool serverCommandsRegistered = false;
 std::unordered_map<std::string, std::unique_ptr<DynamicCommandInstance>> dynamicCommandInstances;
 std::vector<std::unique_ptr<DynamicCommandInstance>> delaySetupCommandInstances;
@@ -72,8 +68,7 @@ using ParameterPtr = DynamicCommand::ParameterPtr;
 using ParameterData = DynamicCommand::ParameterData;
 using ParameterIndex = DynamicCommandInstance::ParameterIndex;
 
-namespace ParameterDataType
-{
+namespace ParameterDataType {
 typedef bool Bool;
 typedef int Int;
 typedef float Float;
@@ -127,8 +122,7 @@ auto const ParameterSizeMap = std::unordered_map<ParameterType, size_t>{
 #endif // ENABLE_PARAMETER_TYPE_POSTFIX
 };
 
-inline void OutputError(std::string errorMsg, int errorCode, std::string errorWhat, std::string func, HMODULE handle)
-{
+inline void OutputError(std::string errorMsg, int errorCode, std::string errorWhat, std::string func, HMODULE handle) {
     logger.error(errorMsg);
     logger.error("Error: Code [{}] {}", errorCode, errorWhat);
     logger.error("In Function ({})", func);
@@ -141,44 +135,36 @@ inline void OutputError(std::string errorMsg, int errorCode, std::string errorWh
 #pragma region Command init and destroy
 
 template <typename T>
-inline void destruct(void* command, size_t offset)
-{
+inline void destruct(void* command, size_t offset) {
     dAccess<T>(command, offset).~T();
 }
 
 template <typename T>
-inline void initValue(void* command, size_t offset)
-{
+inline void initValue(void* command, size_t offset) {
     dAccess<T>(command, offset) = T();
 }
 template <>
-inline void initValue<std::string>(void* command, size_t offset)
-{
+inline void initValue<std::string>(void* command, size_t offset) {
     dAccess<std::string>(command, offset).basic_string::basic_string();
 }
 template <>
-inline void initValue<CommandItem>(void* command, size_t offset)
-{
+inline void initValue<CommandItem>(void* command, size_t offset) {
     dAccess<CommandItem>(command, offset).CommandItem::CommandItem();
 }
 template <>
-inline void initValue<CommandMessage>(void* command, size_t offset)
-{
+inline void initValue<CommandMessage>(void* command, size_t offset) {
     dAccess<CommandMessage>(command, offset).CommandMessage::CommandMessage();
 }
 template <>
-inline void initValue<CommandSelector<Actor>>(void* command, size_t offset)
-{
+inline void initValue<CommandSelector<Actor>>(void* command, size_t offset) {
     dAccess<CommandSelector<Actor>>(command, offset).CommandSelector<Actor>::CommandSelector();
 }
 template <>
-inline void initValue<CommandSelector<Player>>(void* command, size_t offset)
-{
+inline void initValue<CommandSelector<Player>>(void* command, size_t offset) {
     dAccess<CommandSelector<Player>>(command, offset).CommandSelector<Player>::CommandSelector();
 }
 template <>
-inline void initValue<WildcardCommandSelector<Actor>>(void* command, size_t offset)
-{
+inline void initValue<WildcardCommandSelector<Actor>>(void* command, size_t offset) {
     dAccess<WildcardCommandSelector<Actor>>(command, offset).WildcardCommandSelector<Actor>::WildcardCommandSelector();
 }
 
@@ -187,18 +173,15 @@ inline void initValue<WildcardCommandSelector<Actor>>(void* command, size_t offs
 #pragma region ParameterPtr
 
 inline DynamicCommand::ParameterPtr::ParameterPtr(ParameterType type, size_t offset)
-    : type(type)
-    , offset(offset)
-{
+: type(type)
+, offset(offset) {
 }
 
-inline bool DynamicCommand::ParameterPtr::isValueSet(DynamicCommand const* command) const
-{
+inline bool DynamicCommand::ParameterPtr::isValueSet(DynamicCommand const* command) const {
     return dAccess<bool>(command, offset + ParameterSizeMap.at(type));
 }
 
-Result ParameterPtr::getResult(DynamicCommand const* command, CommandOrigin const* origin) const
-{
+Result ParameterPtr::getResult(DynamicCommand const* command, CommandOrigin const* origin) const {
     // auto commandInstance = dynamicCommandInstances.at(command->getCommandName()).get();
     return {this, command, origin};
 }
@@ -208,43 +191,35 @@ Result ParameterPtr::getResult(DynamicCommand const* command, CommandOrigin cons
 #pragma region ParameterData
 
 DynamicCommand::ParameterData::ParameterData(ParameterData const& right)
-    : ParameterData(right.name, right.type, right.optional, right.description, right.identifier, right.option)
-{
+: ParameterData(right.name, right.type, right.optional, right.description, right.identifier, right.option) {
     offset = right.offset;
 };
 
 inline DynamicCommand::ParameterData::ParameterData(std::string const& name, ParameterType type, bool optional, std::string const& enumOptions, std::string const& identifier, CommandParameterOption parameterOption)
-    : name(name)
-    , type(type)
-    , optional(optional)
-    , description(enumOptions)
-    , option(parameterOption)
-{
+: name(name)
+, type(type)
+, optional(optional)
+, description(enumOptions)
+, option(parameterOption) {
     if (identifier.empty())
         this->identifier = description.empty() ? name : description;
     else
         this->identifier = identifier;
-    if (type != DynamicCommand::ParameterType::Enum && type != DynamicCommand::ParameterType::SoftEnum)
-    {
+    if (type != DynamicCommand::ParameterType::Enum && type != DynamicCommand::ParameterType::SoftEnum) {
         if (!description.empty())
             description = "";
-    }
-    else
-    {
+    } else {
         if (description.empty())
             throw std::runtime_error("Enum or SoftEnum parameter need a description to confirm which enum to use");
     }
 }
 
 inline DynamicCommand::ParameterData::ParameterData(std::string const& name, DynamicCommand::ParameterType type, std::string const& enumOptions, std::string const& identifier, CommandParameterOption parameterOption)
-    : ParameterData(name, type, false, enumOptions, identifier, parameterOption)
-{
+: ParameterData(name, type, false, enumOptions, identifier, parameterOption) {
 }
 
-inline CommandParameterData DynamicCommand::ParameterData::makeParameterData() const
-{
-    switch (type)
-    {
+inline CommandParameterData DynamicCommand::ParameterData::makeParameterData() const {
+    switch (type) {
         case ParameterType::Bool:
             return makeParameterData<ParameterType::Bool, ParameterDataType::Bool>();
         case ParameterType::Int:
@@ -297,61 +272,50 @@ inline CommandParameterData DynamicCommand::ParameterData::makeParameterData() c
 #pragma region Result
 
 inline DynamicCommand::Result::Result(ParameterPtr const* ptr, DynamicCommand const* command, CommandOrigin const* origin, DynamicCommandInstance const* instance)
-    : type(ptr->type)
-    , offset(ptr->offset)
-    , command(command)
-    , origin(origin)
-    , instance(instance ? instance : command->getInstance())
-    , isSet(ptr->isValueSet(command))
-{
+: type(ptr->type)
+, offset(ptr->offset)
+, command(command)
+, origin(origin)
+, instance(instance ? instance : command->getInstance())
+, isSet(ptr->isValueSet(command)) {
 }
 
 inline DynamicCommand::Result::Result()
-    : type((ParameterType)-1)
-    , offset(-1)
-    , command(nullptr)
-    , origin(nullptr)
-    , instance(nullptr)
-    , isSet(false)
-{
-}
-
-inline std::string const& DynamicCommand::Result::getEnumValue() const
-{
-    if (getType() == ParameterType::Enum)
-    {
+: type((ParameterType)-1)
+, offset(-1)
+, command(nullptr)
+, origin(nullptr)
+, instance(nullptr)
+, isSet(false) {
+}
+
+inline std::string const& DynamicCommand::Result::getEnumValue() const {
+    if (getType() == ParameterType::Enum) {
         return getRaw<std::string>();
-    }
-    else if (getType() == ParameterType::SoftEnum)
-    {
+    } else if (getType() == ParameterType::SoftEnum) {
         return getRaw<std::string>();
     }
     static std::string const EMPTY_STRING = "";
     return EMPTY_STRING;
 }
 
-inline ParameterType DynamicCommand::Result::getType() const
-{
+inline ParameterType DynamicCommand::Result::getType() const {
     return type;
 }
 
-inline std::string DynamicCommand::Result::getName() const
-{
-    for (auto& [name, ptr] : instance->parameterPtrs)
-    {
+inline std::string DynamicCommand::Result::getName() const {
+    for (auto& [name, ptr] : instance->parameterPtrs) {
         if (ptr.getOffset() == offset)
             return name;
     }
     return "";
 }
 
-std::string DynamicCommand::Result::toDebugString() const
-{
+std::string DynamicCommand::Result::toDebugString() const {
     std::string name = getName();
     ParameterType type = getType();
     std::string typeName = fmt::format("{}({})", magic_enum::enum_name(type), (int)type);
-    switch (type)
-    {
+    switch (type) {
         case ParameterType::Bool:
             return fmt::format("name: {:15s}, type: {:15s}, isSet: {:5}, value: {}", name, typeName, isSet, getRaw<bool>());
         case ParameterType::Int:
@@ -360,15 +324,14 @@ std::string DynamicCommand::Result::toDebugString() const
             return fmt::format("name: {:15s}, type: {:15s}, isSet: {:5}, value: {}", name, typeName, isSet, getRaw<float>());
         case ParameterType::Actor:
             // return fmt::format("name: {:15s}, type: {:15s}, isSet: {:5}, value: {}", name, typeName, isSet, getRaw<CommandSelector<Actor>>().getName());
-        case ParameterType::Player:
-        {
+        case ParameterType::Player: {
             std::vector<Actor*> actors = get<std::vector<Actor*>>();
             std::ostringstream oss;
             oss << "count: " << actors.size() << ", actors: [";
             bool first = true;
-            for (auto& actor : actors)
-            {
-                if (!first) oss << ", ";
+            for (auto& actor : actors) {
+                if (!first)
+                    oss << ", ";
                 oss << CommandUtils::getActorName(*actor);
             }
             oss << "]";
@@ -410,8 +373,7 @@ std::string DynamicCommand::Result::toDebugString() const
     }
 }
 
-inline DynamicCommandInstance const* DynamicCommand::Result::getInstance() const
-{
+inline DynamicCommandInstance const* DynamicCommand::Result::getInstance() const {
     std::string commandName = command->getCommandName();
     auto iter = dynamicCommandInstances.find(commandName);
     if (iter == dynamicCommandInstances.end())
@@ -430,36 +392,31 @@ inline DynamicCommandInstance const* DynamicCommand::Result::getInstance() const
 //     return std::move(command);
 // }
 
-inline char DynamicCommand::builderCallbackHanler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata)
-{
+inline char DynamicCommand::builderCallbackHanler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata) {
     DynamicCommandInstance& command = *(DynamicCommandInstance*)userdata;
     auto arg1 = (std::unique_ptr<Command>*)dcbArgPointer(args);
     DynamicCommand::commandBuilder(arg1, command.getCommandName());
     return 'p';
 }
 
-std::unique_ptr<Command>* DynamicCommand::commandBuilder(std::unique_ptr<Command>* rtn, std::string name)
-{
+std::unique_ptr<Command>* DynamicCommand::commandBuilder(std::unique_ptr<Command>* rtn, std::string name) {
 #define CaseInitBreak(type)                                  \
     case ParameterType::type:                                \
         initValue<ParameterDataType::type>(command, offset); \
         break;
 
     assert(dynamicCommandInstances.count(name) == 1);
-    if (dynamicCommandInstances.count(name) == 0)
-    {
+    if (dynamicCommandInstances.count(name) == 0) {
         logger.error("Error in allocate dynamic command");
         return rtn;
     }
     auto& commandInstance = *dynamicCommandInstances.at(name);
     auto command = new char[commandInstance.commandSize]{0};
     (*(DynamicCommand*)command).DynamicCommand::DynamicCommand();
-    for (auto& [name, param] : commandInstance.parameterPtrs)
-    {
+    for (auto& [name, param] : commandInstance.parameterPtrs) {
         size_t offset = param.getOffset();
         dAccess<bool>(command, offset + ParameterSizeMap.at(param.type)) = false; // XXXX_isSet;
-        switch (param.type)
-        {
+        switch (param.type) {
             ForEachParameterType(CaseInitBreak);
             default:
                 break;
@@ -469,15 +426,13 @@ std::unique_ptr<Command>* DynamicCommand::commandBuilder(std::unique_ptr<Command
     return rtn;
 }
 
-DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicCommandInstance> commandInstance)
-{
+DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicCommandInstance> commandInstance) {
     std::string name = commandInstance->getCommandName();
 #ifdef DEBUG
     logger.info("Setting up command \"{}\"", name);
 #endif // DEBUG
     auto handle = commandInstance->handle;
-    try
-    {
+    try {
         if (!commandInstance)
             throw std::runtime_error("Command instance is null");
         if (!commandInstance->callback)
@@ -486,13 +441,10 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
             throw std::runtime_error("Can't setup command without overloads");
         // commandInstance->updateSoftEnum();
 
-        for (auto& param : commandInstance->parameterDatas)
-        {
-            if (param.type == ParameterType::Enum)
-            {
+        for (auto& param : commandInstance->parameterDatas) {
+            if (param.type == ParameterType::Enum) {
                 // clone BDS's enum
-                if (commandInstance->enumRanges.count(param.description) == 0)
-                {
+                if (commandInstance->enumRanges.count(param.description) == 0) {
                     auto namesInBds = CommandRegistry::getEnumNames();
                     auto iter = std::find(namesInBds.begin(), namesInBds.end(), param.description);
                     if (iter == namesInBds.end())
@@ -501,12 +453,9 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
                     commandInstance->setEnum(*iter, CommandRegistry::getEnumValues(*iter));
 #endif // USE_PARSE_ENUM_STRING
                 }
-            }
-            else if (param.type == ParameterType::SoftEnum)
-            {
+            } else if (param.type == ParameterType::SoftEnum) {
                 // add empty Soft Enum if not found in command and BDS
-                if (commandInstance->softEnums.count(param.description) == 0)
-                {
+                if (commandInstance->softEnums.count(param.description) == 0) {
                     auto namesInBds = CommandRegistry::getSoftEnumNames();
                     auto iter = std::find(namesInBds.begin(), namesInBds.end(), param.description);
                     if (iter == namesInBds.end())
@@ -518,26 +467,19 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
         // fix enum name with prefix '_...' if Enum name is exists in BDS
         auto namesInBds = CommandRegistry::getEnumNames();
         std::unordered_map<std::string_view, std::pair<size_t, size_t>> convertedEnumRanges;
-        for (auto& [name, range] : commandInstance->enumRanges)
-        {
+        for (auto& [name, range] : commandInstance->enumRanges) {
             std::string fixedName = name.data();
-            while (std::find(namesInBds.begin(), namesInBds.end(), fixedName) != namesInBds.end())
-            {
+            while (std::find(namesInBds.begin(), namesInBds.end(), fixedName) != namesInBds.end()) {
                 fixedName.append("_");
             }
             std::string_view fixedView = name;
-            if (fixedName != name)
-            {
-                for (auto& namePtr : commandInstance->enumNames)
-                {
-                    if (*namePtr == name)
-                    {
+            if (fixedName != name) {
+                for (auto& namePtr : commandInstance->enumNames) {
+                    if (*namePtr == name) {
                         namePtr->swap(fixedName);
                         fixedView = *namePtr;
-                        for (auto& data : commandInstance->parameterDatas)
-                        {
-                            if (data.description == fixedName)
-                            {
+                        for (auto& data : commandInstance->parameterDatas) {
+                            if (data.description == fixedName) {
                                 data.description = *namePtr;
                             }
                         }
@@ -547,10 +489,9 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
             }
             std::vector<std::pair<std::string, uint64_t>> values;
             size_t index = range.first;
-            for (auto& iter = commandInstance->enumValues.begin() + range.first; iter != commandInstance->enumValues.begin() + range.first + range.second; ++iter)
-            {
+            for (auto& iter = commandInstance->enumValues.begin() + range.first; iter != commandInstance->enumValues.begin() + range.first + range.second; ++iter) {
                 values.emplace_back(*iter, index);
-                index++;
+                ++index;
             }
 #ifdef USE_PARSE_ENUM_STRING
             Global<CommandRegistry>->_addEnumValuesInternal(fixedView.data(), values, typeid_t<CommandRegistry>::count++, &CommandRegistry::parseEnumStringAndInt).val;
@@ -561,8 +502,7 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
         commandInstance->enumRanges.swap(convertedEnumRanges);
 
         // add Soft Enum to BDS
-        for (auto& [name, values] : commandInstance->softEnums)
-        {
+        for (auto& [name, values] : commandInstance->softEnums) {
             Global<CommandRegistry>->addSoftEnum(name, values);
         }
 
@@ -570,8 +510,7 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
         if (!commandInstance->alias.empty())
             Global<CommandRegistry>->registerAlias(commandInstance->name, commandInstance->alias);
         auto builder = commandInstance->initCommandBuilder();
-        for (auto& overload : commandInstance->overloads)
-        {
+        for (auto& overload : commandInstance->overloads) {
             Global<CommandRegistry>->registerOverload(commandInstance->name, builder, commandInstance->buildOverload(overload));
         }
         // commandInstance->overloads.clear();
@@ -582,16 +521,13 @@ DynamicCommandInstance* DynamicCommand::_setup(std::unique_ptr<class DynamicComm
     return nullptr;
 }
 
-bool DynamicCommand::onServerCommandsRegister(CommandRegistry& registry)
-{
+bool DynamicCommand::onServerCommandsRegister(CommandRegistry& registry) {
     serverCommandsRegistered = true;
     SRWLockHolder locker(delaySetupLock);
-    for (auto& command : delaySetupCommandInstances)
-    {
+    for (auto& command : delaySetupCommandInstances) {
         std::string name = command->getCommandName();
         auto handle = command->handle;
-        try
-        {
+        try {
             if (!LL::getPlugin(handle) && handle != GetCurrentModule())
                 throw std::runtime_error("Plugin that registered command \"" + name + "\" not found");
             auto res = DynamicCommand::_setup(std::move(command));
@@ -604,8 +540,7 @@ bool DynamicCommand::onServerCommandsRegister(CommandRegistry& registry)
     return true;
 }
 
-DynamicCommand::~DynamicCommand()
-{
+DynamicCommand::~DynamicCommand() {
 #define CaseDestructBreak(type)                          \
     case ParameterType::type:                            \
         destruct<ParameterDataType::type>(this, offset); \
@@ -613,17 +548,14 @@ DynamicCommand::~DynamicCommand()
 
     auto& commandName = getCommandName();
     auto iter = dynamicCommandInstances.find(commandName);
-    if (iter == dynamicCommandInstances.end())
-    {
+    if (iter == dynamicCommandInstances.end()) {
         logger.error("Error in DynamicCommand::~DynamicCommand(), command \"{}\" not found", commandName);
         return;
     }
     auto& commandIns = *iter->second;
-    for (auto& [name, parameter] : commandIns.parameterPtrs)
-    {
+    for (auto& [name, parameter] : commandIns.parameterPtrs) {
         auto offset = parameter.getOffset();
-        switch (parameter.type)
-        {
+        switch (parameter.type) {
             ForEachParameterType(CaseDestructBreak);
             default:
                 break;
@@ -631,24 +563,19 @@ DynamicCommand::~DynamicCommand()
     }
 }
 
-void DynamicCommand::execute(CommandOrigin const& origin, CommandOutput& output) const
-{
+void DynamicCommand::execute(CommandOrigin const& origin, CommandOutput& output) const {
     auto iter = dynamicCommandInstances.find(getCommandName());
-    if (iter == dynamicCommandInstances.end())
-    {
+    if (iter == dynamicCommandInstances.end()) {
         return output.error("Dynamic Command Not Found");
     }
     auto& commandIns = *iter->second;
-    if (!commandIns.callback)
-    {
+    if (!commandIns.callback) {
         return output.error(fmt::format("Command {} has been removed.", getCommandName()));
     }
-    try
-    {
+    try {
         std::unordered_map<std::string, Result> results;
 
-        for (auto& [name, param] : commandIns.parameterPtrs)
-        {
+        for (auto& [name, param] : commandIns.parameterPtrs) {
             results.emplace(name, param.getResult(this, &origin));
         }
         commandIns.callback(*this, origin, output, results);
@@ -656,66 +583,57 @@ void DynamicCommand::execute(CommandOrigin const& origin, CommandOutput& output)
     CatchDynamicCommandError("DynamicCommand::execute", commandIns.handle);
 }
 
-std::unique_ptr<class DynamicCommandInstance> DynamicCommand::createCommand(std::string const& name, std::string const& description, CommandPermissionLevel permission, CommandFlag flag1, CommandFlag flag2, HMODULE handle)
-{
+std::unique_ptr<class DynamicCommandInstance> DynamicCommand::createCommand(std::string const& name, std::string const& description, CommandPermissionLevel permission, CommandFlag flag1, CommandFlag flag2, HMODULE handle) {
     return DynamicCommandInstance::create(name, description, permission, flag1 |= flag2, handle);
 }
 #include <LLAPI.h>
 #include <EventAPI.h>
 #include <Main/Config.h>
 
-DynamicCommandInstance const* DynamicCommand::setup(std::unique_ptr<class DynamicCommandInstance> commandInstance)
-{
+DynamicCommandInstance const* DynamicCommand::setup(std::unique_ptr<class DynamicCommandInstance> commandInstance) {
     auto ptr = commandInstance.get();
     if (!ptr)
         throw std::runtime_error("DynamicCommand::setup - commandInstance is null");
-    if (!serverCommandsRegistered)
-    {
+    if (!serverCommandsRegistered) {
         delaySetupLock.lock();
         auto& uptr = delaySetupCommandInstances.emplace_back(std::move(commandInstance));
         delaySetupLock.unlock();
         return uptr.get();
     }
-    //logger.warn("Registering command \"{}\" after RegCmdEvent, note that this is unstable!", commandInstance->getCommandName());
+    // logger.warn("Registering command \"{}\" after RegCmdEvent, note that this is unstable!", commandInstance->getCommandName());
     Schedule::nextTick([instance{commandInstance.release()}]() {
         if (!_setup(std::unique_ptr<class DynamicCommandInstance>(instance)))
             logger.warn("Registering command \"{}\" failed", instance->getCommandName());
         updateAvailableCommands();
-        });
+    });
     return ptr;
 }
 
-std::unique_ptr<class DynamicCommandInstance> DynamicCommand::createCommand(std::string const& name, std::string const& description, std::unordered_map<std::string, std::vector<std::string>>&& enums, std::vector<ParameterData>&& params, std::vector<std::vector<std::string>>&& overloads, CallBackFn callback, CommandPermissionLevel permission, CommandFlag flag1, CommandFlag flag2, HMODULE handle)
-{
+std::unique_ptr<class DynamicCommandInstance> DynamicCommand::createCommand(std::string const& name, std::string const& description, std::unordered_map<std::string, std::vector<std::string>>&& enums, std::vector<ParameterData>&& params, std::vector<std::vector<std::string>>&& overloads, CallBackFn callback, CommandPermissionLevel permission, CommandFlag flag1, CommandFlag flag2, HMODULE handle) {
     auto command = createCommand(name, description, permission, flag1, flag2, handle);
     if (!command)
         return false;
-    for (auto& [name, values] : enums)
-    {
+    for (auto& [name, values] : enums) {
         command->setEnum(name, std::move(values));
     }
-    for (auto& param : params)
-    {
+    for (auto& param : params) {
         command->newParameter(std::move(param));
     }
-    for (auto& overload : overloads)
-    {
+    for (auto& overload : overloads) {
         command->addOverload(std::move(overload));
     }
     command->setCallback(std::move(callback));
     return std::move(command);
 }
 
-bool DynamicCommand::unregisterCommand(std::string const& name)
-{
+bool DynamicCommand::unregisterCommand(std::string const& name) {
 #ifdef DEBUG
     Schedule::nextTick([tid = std::this_thread::get_id()]() {
         // Call DynamicCommand::unregisterCommand in other thread is not allowed!
         assert(tid == std::this_thread::get_id());
     });
 #endif // DEBUG
-    if (Global<CommandRegistry>->unregisterCommand(name))
-    {
+    if (Global<CommandRegistry>->unregisterCommand(name)) {
         dynamicCommandInstances.erase(name);
         updateAvailableCommands();
         return true;
@@ -723,8 +641,7 @@ bool DynamicCommand::unregisterCommand(std::string const& name)
     return false;
 }
 
-inline bool DynamicCommand::updateAvailableCommands()
-{
+inline bool DynamicCommand::updateAvailableCommands() {
 #ifdef DEBUG
     Schedule::nextTick([tid = std::this_thread::get_id()]() {
         // Call DynamicCommand::updateAvailableCommands in other thread is not allowed!
@@ -742,13 +659,11 @@ inline bool DynamicCommand::updateAvailableCommands()
     return true;
 }
 
-inline DynamicCommandInstance const* DynamicCommand::getInstance() const
-{
+inline DynamicCommandInstance const* DynamicCommand::getInstance() const {
     return getInstance(getCommandName());
 }
 
-DynamicCommandInstance const* DynamicCommand::getInstance(std::string const& commandName)
-{
+DynamicCommandInstance const* DynamicCommand::getInstance(std::string const& commandName) {
     auto iter = dynamicCommandInstances.find(commandName);
     if (iter == dynamicCommandInstances.end())
         return nullptr;
@@ -761,77 +676,62 @@ DynamicCommandInstance const* DynamicCommand::getInstance(std::string const& com
 #pragma region DynamicCommandInstance
 
 inline DynamicCommandInstance::DynamicCommandInstance(std::string const& name, std::string const& description, CommandPermissionLevel permission, CommandFlag flag, HMODULE handle)
-    : name(name)
-    , description(std::make_unique<std::string>(description))
-    , permission(permission)
-    , flag(flag)
-    , handle(handle){};
-
-inline DynamicCommandInstance::~DynamicCommandInstance()
-{
+: name(name)
+, description(std::make_unique<std::string>(description))
+, permission(permission)
+, flag(flag)
+, handle(handle){};
+
+inline DynamicCommandInstance::~DynamicCommandInstance() {
     if (this->builder)
         dcbFreeCallback((DCCallback*)this->builder);
     this->builder = nullptr;
 }
 
-inline std::unique_ptr<DynamicCommandInstance> DynamicCommandInstance::create(std::string const& name, std::string const& description, CommandPermissionLevel permission, CommandFlag flag, HMODULE handle)
-{
-    if (LL::globalConfig.serverStatus != LL::LLServerStatus::Running)
-    {
-        for (auto& cmd : delaySetupCommandInstances)
-        {
-            if (cmd->name == name)
-            {
+inline std::unique_ptr<DynamicCommandInstance> DynamicCommandInstance::create(std::string const& name, std::string const& description, CommandPermissionLevel permission, CommandFlag flag, HMODULE handle) {
+    if (LL::globalConfig.serverStatus != LL::LLServerStatus::Running) {
+        for (auto& cmd : delaySetupCommandInstances) {
+            if (cmd->name == name) {
                 logger.error("Command \"{}\" already exists", name);
                 return {};
             }
         }
-    }
-    else if (Global<CommandRegistry>->findCommand(name))
-    {
+    } else if (Global<CommandRegistry>->findCommand(name)) {
         logger.error("Command \"{}\" already exists", name);
         return {};
     }
     return std::unique_ptr<DynamicCommandInstance>(new DynamicCommandInstance(name, description, permission, flag, handle));
 }
 
-inline bool DynamicCommandInstance::addOverload(std::vector<DynamicCommand::ParameterData>&& params)
-{
+inline bool DynamicCommandInstance::addOverload(std::vector<DynamicCommand::ParameterData>&& params) {
     std::vector<ParameterIndex> indices;
-    for (auto& param : params)
-    {
+    for (auto& param : params) {
         indices.push_back(newParameter(std::forward<ParameterData>(param)));
     }
     return addOverload(std::move(indices));
 }
 
-inline std::string const& DynamicCommandInstance::setEnum(std::string const& description, std::vector<std::string> const& values)
-{
+inline std::string const& DynamicCommandInstance::setEnum(std::string const& description, std::vector<std::string> const& values) {
     auto& desc = enumNames.emplace_back(std::make_unique<std::string>(description));
     enumRanges.emplace(*desc, std::pair{enumValues.size(), values.size()});
     enumValues.insert(enumValues.end(), values.begin(), values.end());
     return *desc;
 }
 
-inline std::string const& DynamicCommandInstance::getEnumValue(int index) const
-{
+inline std::string const& DynamicCommandInstance::getEnumValue(int index) const {
     if (index < 0 || index >= enumValues.size())
         throw std::runtime_error("Enum index out of range");
     return enumValues.at(index);
 }
 
-ParameterIndex DynamicCommandInstance::newParameter(DynamicCommand::ParameterData&& data)
-{
+ParameterIndex DynamicCommandInstance::newParameter(DynamicCommand::ParameterData&& data) {
     auto iter = parameterPtrs.find(data.name);
     size_t offset = -1;
-    if (iter == parameterPtrs.end())
-    {
+    if (iter == parameterPtrs.end()) {
         offset = commandSize;
         parameterPtrs.emplace(data.name, DynamicCommand::ParameterPtr(data.type, offset));
         commandSize += ParameterSizeMap.at(data.type) + 8;
-    }
-    else
-    {
+    } else {
         offset = iter->second.getOffset();
         if (iter->second.type != data.type)
             throw std::runtime_error(fmt::format("dynamic command \"{}\" register failed, Different type parameters with the same name {} are not allowed", name, data.name));
@@ -845,57 +745,46 @@ ParameterIndex DynamicCommandInstance::newParameter(DynamicCommand::ParameterDat
     return {this, parameterDatas.size() - 1};
 }
 
-inline ParameterIndex DynamicCommandInstance::newParameter(std::string const& name, DynamicCommand::ParameterType type, bool optional, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::newParameter(std::string const& name, DynamicCommand::ParameterType type, bool optional, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption) {
     return newParameter(ParameterData(name, type, optional, description, identifier, parameterOption));
 }
 
-inline ParameterIndex DynamicCommandInstance::findParameterIndex(std::string const& indentifier)
-{
+inline ParameterIndex DynamicCommandInstance::findParameterIndex(std::string const& indentifier) {
     size_t index = 0;
-    for (auto& paramData : parameterDatas)
-    {
+    for (auto& paramData : parameterDatas) {
         if (paramData.identifier == indentifier || paramData.description == indentifier || paramData.name == indentifier)
             break;
-        index++;
+        ++index;
     }
     if (index == parameterDatas.size())
         index = -1;
     return {this, index};
 }
 
-inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption) {
     return newParameter(ParameterData(name, type, false, description, identifier, parameterOption));
 }
-inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, CommandParameterOption parameterOption) {
     return mandatory(name, type, description, "", parameterOption);
 };
-inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::mandatory(std::string const& name, DynamicCommand::ParameterType type, CommandParameterOption parameterOption) {
     return mandatory(name, type, "", "", parameterOption);
 };
 
-inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, std::string const& identifier, CommandParameterOption parameterOption) {
     return newParameter(ParameterData(name, type, true, description, identifier, parameterOption));
 }
 
-inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, std::string const& description, CommandParameterOption parameterOption) {
     return optional(name, type, description, "", parameterOption);
 }
 
-inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, CommandParameterOption parameterOption)
-{
+inline ParameterIndex DynamicCommandInstance::optional(std::string const& name, DynamicCommand::ParameterType type, CommandParameterOption parameterOption) {
     return optional(name, type, "", "", parameterOption);
 }
 
-bool DynamicCommandInstance::addOverload(std::vector<ParameterIndex>&& params)
-{
-    for (auto& index : params)
-    {
+bool DynamicCommandInstance::addOverload(std::vector<ParameterIndex>&& params) {
+    for (auto& index : params) {
         if (index >= parameterDatas.size())
             throw std::runtime_error("parameter index " + std::to_string(index) + " out of range 0 ~ " + std::to_string(parameterDatas.size()));
     }
@@ -903,14 +792,11 @@ bool DynamicCommandInstance::addOverload(std::vector<ParameterIndex>&& params)
     return true;
 }
 
-inline bool DynamicCommandInstance::addOverload(std::vector<char const*>&& params)
-{
+inline bool DynamicCommandInstance::addOverload(std::vector<char const*>&& params) {
     std::vector<ParameterIndex> paramIndices;
-    for (auto& param : params)
-    {
+    for (auto& param : params) {
         auto index = findParameterIndex(param);
-        if (!index.isValid())
-        {
+        if (!index.isValid()) {
             throw std::runtime_error("Parameter " + std::string(param) + "not found");
         }
         paramIndices.push_back(index);
@@ -918,27 +804,22 @@ inline bool DynamicCommandInstance::addOverload(std::vector<char const*>&& param
     return addOverload(std::move(paramIndices));
 }
 
-inline bool DynamicCommandInstance::addOverload(std::vector<std::string>&& params)
-{
+inline bool DynamicCommandInstance::addOverload(std::vector<std::string>&& params) {
     std::vector<ParameterIndex> paramIndices;
-    for (auto& param : params)
-    {
+    for (auto& param : params) {
         paramIndices.push_back(findParameterIndex(param));
     }
     return addOverload(std::move(paramIndices));
 }
 
-inline bool DynamicCommandInstance::setAlias(std::string const& alias)
-{
+inline bool DynamicCommandInstance::setAlias(std::string const& alias) {
     this->alias = alias;
     return true;
 }
 
-inline std::vector<CommandParameterData> DynamicCommandInstance::buildOverload(std::vector<ParameterIndex> const& overload)
-{
+inline std::vector<CommandParameterData> DynamicCommandInstance::buildOverload(std::vector<ParameterIndex> const& overload) {
     std::vector<CommandParameterData> datas;
-    for (auto& index : overload)
-    {
+    for (auto& index : overload) {
         auto& param = parameterDatas.at(index);
         datas.emplace_back(param.makeParameterData());
     }
@@ -972,19 +853,14 @@ inline std::vector<CommandParameterData> DynamicCommandInstance::buildOverload(s
 //         }
 //     }
 // }
-std::string DynamicCommandInstance::setSoftEnum(std::string const& name, std::vector<std::string> const& values) const
-{
-    if (!hasRegistered())
-    {
+std::string DynamicCommandInstance::setSoftEnum(std::string const& name, std::vector<std::string> const& values) const {
+    if (!hasRegistered()) {
         softEnums.emplace(name, values);
-    }
-    else
-    {
+    } else {
         if (!Global<CommandRegistry>)
             return "";
         auto names = CommandRegistry::getSoftEnumNames();
-        if (std::find(names.begin(), names.end(), name) == names.end())
-        {
+        if (std::find(names.begin(), names.end(), name) == names.end()) {
             Global<CommandRegistry>->addSoftEnum(name, values);
             return name;
         }
@@ -992,27 +868,19 @@ std::string DynamicCommandInstance::setSoftEnum(std::string const& name, std::ve
     }
     return name;
 }
-bool DynamicCommandInstance::addSoftEnumValues(std::string const& name, std::vector<std::string> const& values) const
-{
-    if (!hasRegistered())
-    {
+bool DynamicCommandInstance::addSoftEnumValues(std::string const& name, std::vector<std::string> const& values) const {
+    if (!hasRegistered()) {
         auto iter = softEnums.find(name);
-        if (iter != softEnums.end())
-        {
+        if (iter != softEnums.end()) {
             iter->second.insert(iter->second.end(), values.begin(), values.end());
-        }
-        else
-        {
+        } else {
             setSoftEnum(name, values);
         }
-    }
-    else
-    {
+    } else {
         if (!Global<CommandRegistry>)
             return false;
         auto names = CommandRegistry::getSoftEnumNames();
-        if (std::find(names.begin(), names.end(), name) == names.end())
-        {
+        if (std::find(names.begin(), names.end(), name) == names.end()) {
             Global<CommandRegistry>->addSoftEnum(name, values);
             return true;
         }
@@ -1020,13 +888,10 @@ bool DynamicCommandInstance::addSoftEnumValues(std::string const& name, std::vec
     }
     return true;
 };
-bool DynamicCommandInstance::removeSoftEnumValues(std::string const& name, std::vector<std::string> const& values) const
-{
-    if (!hasRegistered())
-    {
+bool DynamicCommandInstance::removeSoftEnumValues(std::string const& name, std::vector<std::string> const& values) const {
+    if (!hasRegistered()) {
         auto iter = softEnums.find(name);
-        if (iter != softEnums.end())
-        {
+        if (iter != softEnums.end()) {
             auto tmp = std::remove_if(
                 iter->second.begin(), iter->second.end(),
                 [values](std::string const& val) {
@@ -1036,40 +901,32 @@ bool DynamicCommandInstance::removeSoftEnumValues(std::string const& name, std::
             return true;
         }
         return false;
-    }
-    else
-    {
+    } else {
         if (Global<CommandRegistry>)
             CommandSoftEnumRegistry(Global<CommandRegistry>).updateSoftEnum(SoftEnumUpdateType::Remove, name, values);
     }
     return true;
 }
-inline std::vector<std::string> DynamicCommandInstance::getSoftEnumValues(std::string const& name)
-{
+inline std::vector<std::string> DynamicCommandInstance::getSoftEnumValues(std::string const& name) {
     return CommandRegistry::getSoftEnumValues(name);
 }
-inline std::vector<std::string> DynamicCommandInstance::getSoftEnumNames()
-{
+inline std::vector<std::string> DynamicCommandInstance::getSoftEnumNames() {
     return CommandRegistry::getSoftEnumNames();
 }
 
-inline void DynamicCommandInstance::setCallback(DynamicCommand::CallBackFn&& callback) const
-{
+inline void DynamicCommandInstance::setCallback(DynamicCommand::CallBackFn&& callback) const {
     this->callback = callback;
 }
 
-inline void DynamicCommandInstance::removeCallback() const
-{
+inline void DynamicCommandInstance::removeCallback() const {
     callback = nullptr;
 }
 
-inline std::string const& DynamicCommandInstance::getCommandName() const
-{
+inline std::string const& DynamicCommandInstance::getCommandName() const {
     return name;
 }
 
-inline bool DynamicCommandInstance::setBuilder(DynamicCommand::BuilderFn builder)
-{
+inline bool DynamicCommandInstance::setBuilder(DynamicCommand::BuilderFn builder) {
     if (this->builder == nullptr)
         this->builder = builder;
     else
@@ -1077,8 +934,7 @@ inline bool DynamicCommandInstance::setBuilder(DynamicCommand::BuilderFn builder
     return true;
 }
 
-inline DynamicCommand::BuilderFn DynamicCommandInstance::initCommandBuilder()
-{
+inline DynamicCommand::BuilderFn DynamicCommandInstance::initCommandBuilder() {
     auto builder = (DynamicCommand::BuilderFn)dcbNewCallback("ifsdl)p", &DynamicCommand::builderCallbackHanler, this);
     if (this->setBuilder(builder))
         return builder;
@@ -1102,8 +958,7 @@ using ParamIndex = DynamicCommandInstance::ParameterIndex;
 #include <MC/Player.hpp>
 #include <MC/Minecraft.hpp>
 
-void setupTestParamCommand()
-{
+void setupTestParamCommand() {
     using Param = DynamicCommand::ParameterData;
     using ParamType = DynamicCommand::ParameterType;
     Param boolParam("testBool", ParamType::Bool, true);
@@ -1164,16 +1019,14 @@ void setupTestParamCommand()
             //"testCommand",
         }},
         [](DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output, std::unordered_map<std::string, Result>& results) {
-            for (auto& [name, result] : results)
-            {
+            for (auto& [name, result] : results) {
                 output.success(result.toDebugString());
             }
         },
         CommandPermissionLevel::Any);
 }
 
-void setupTestEnumCommand()
-{
+void setupTestEnumCommand() {
     using ParamType = DynamicCommand::ParameterType;
     using Param = DynamicCommand::ParameterData;
     DynamicCommand::setup(
@@ -1201,8 +1054,7 @@ void setupTestEnumCommand()
         [](DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output,
            std::unordered_map<std::string, DynamicCommand::Result>& results) {
             auto& action = results["testEnum"].getRaw<std::string>();
-            switch (do_hash(action.c_str()))
-            {
+            switch (do_hash(action.c_str())) {
                 case do_hash("add"):
                     if (results["testInt"].isSet)
                         output.success(fmt::format("add {}", results["testInt"].getRaw<int>()));
@@ -1225,8 +1077,7 @@ void setupTestEnumCommand()
         CommandPermissionLevel::GameMasters);
 }
 
-void setupExampleCommand()
-{
+void setupExampleCommand() {
     using ParamType = DynamicCommand::ParameterType;
     // create a dynamic command
     auto command = DynamicCommand::createCommand("testcmd", "dynamic command", CommandPermissionLevel::GameMasters);
@@ -1242,8 +1093,7 @@ void setupExampleCommand()
     command->addOverload({"TestOperation2"});         // dyncmd <list>
 
     command->setCallback([](DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output, std::unordered_map<std::string, Result>& results) {
-        switch (do_hash(results["testEnum"].getRaw<std::string>().c_str()))
-        {
+        switch (do_hash(results["testEnum"].getRaw<std::string>().c_str())) {
             case do_hash("add"):
                 output.success(fmt::format("Add - {}", results["testString"].getRaw<std::string>()));
                 break;
@@ -1262,8 +1112,7 @@ void setupExampleCommand()
 }
 
 // "remove command" command
-void setupRemoveCommand()
-{
+void setupRemoveCommand() {
     auto command = DynamicCommand::createCommand("unregister", "unregister command", CommandPermissionLevel::Any);
     command->setAlias("remove");
     auto name = command->mandatory("name", ParamType::SoftEnum,
@@ -1274,31 +1123,26 @@ void setupRemoveCommand()
            std::unordered_map<std::string, Result>& results) {
             auto& name = results["name"].getRaw<std::string>();
             auto fullName = Global<CommandRegistry>->getCommandFullName(name);
-            if (fullName == cmd.getCommandName())
-            {
+            if (fullName == cmd.getCommandName()) {
                 output.success("Request unregister itself");
                 Schedule::delay([fullName]() {
                     auto res = Global<CommandRegistry>->unregisterCommand(fullName);
-                    if (res)
-                    {
+                    if (res) {
                         dynamicCommandInstances.erase(fullName);
                         logger.info("unregister command " + fullName);
                         ((DynamicCommandInstance*)0)->setSoftEnum("CommandNames", CommandRegistry::getEnumValues("CommandName"));
-                    }
-                    else
+                    } else
                         logger.error("error in unregister command " + fullName);
                 },
                                 20);
                 return;
             }
             auto res = Global<CommandRegistry>->unregisterCommand(fullName);
-            if (res)
-            {
+            if (res) {
                 dynamicCommandInstances.erase(fullName);
                 output.success("unregister command " + fullName);
                 cmd.getInstance()->setSoftEnum("CommandNames", CommandRegistry::getEnumValues("CommandName"));
-            }
-            else
+            } else
                 output.error("error in unregister command " + fullName);
         });
     command->setSoftEnum("CommandNames", CommandRegistry::getEnumValues("CommandName"));
@@ -1313,14 +1157,12 @@ void setupRemoveCommand()
 // }
 
 // force enable cheat
-TClasslessInstanceHook(bool, "?hasCommandsEnabled@LevelData@@QEBA_NXZ")
-{
+TClasslessInstanceHook(bool, "?hasCommandsEnabled@LevelData@@QEBA_NXZ") {
     return true;
 }
 
 TInstanceHook(CommandParameterData&, "?addOptions@CommandParameterData@@QEAAAEAV1@W4CommandParameterOption@@@Z",
-              CommandParameterData, CommandParameterOption option)
-{
+              CommandParameterData, CommandParameterOption option) {
     // logger.warn("CommandParameterData::addOptions - name: {}, type: {}, desc: {}, option: {:x}",
     //             name, magic_enum::enum_name(type), desc ? desc : "", (int)option);
     return original(this, option);
@@ -1330,56 +1172,45 @@ TInstanceHook(CommandParameterData&, "?addOptions@CommandParameterData@@QEAAAEAV
 
 // enum command
 void onEnumExecute(DynamicCommand const& cmd, CommandOrigin const& origin, CommandOutput& output,
-                   std::unordered_map<std::string, Result>& results)
-{
+                   std::unordered_map<std::string, Result>& results) {
     auto enumNames = Global<CommandRegistry>->getEnumNames();
     auto softEnumNames = Global<CommandRegistry>->getSoftEnumNames();
     cmd.getInstance()->setSoftEnum("EnumNameList", enumNames);
     cmd.getInstance()->addSoftEnumValues("EnumNameList", softEnumNames);
-    if (results["name"].isSet)
-    {
+    if (results["name"].isSet) {
         auto& enumName = results["name"].getRaw<std::string>();
         bool found = false;
-        if (std::find(enumNames.begin(), enumNames.end(), enumName) != enumNames.end())
-        {
+        if (std::find(enumNames.begin(), enumNames.end(), enumName) != enumNames.end()) {
             found = true;
             output.successf("§eEnum §l{}§r§e Values:", enumName);
-            for (auto& val : CommandRegistry::getEnumValues(enumName))
-            {
+            for (auto& val : CommandRegistry::getEnumValues(enumName)) {
                 output.success(val);
                 // output.addToResultList("enums", val);
             }
             // output.success("Enums: %1$s", {CommandOutputParameter("enums")});
         }
-        if (std::find(softEnumNames.begin(), softEnumNames.end(), enumName) != softEnumNames.end())
-        {
+        if (std::find(softEnumNames.begin(), softEnumNames.end(), enumName) != softEnumNames.end()) {
             found = true;
             output.successf("§eSoft Enum §l{}§r§e Values:", enumName);
-            for (auto& val : CommandRegistry::getSoftEnumValues(enumName))
-            {
+            for (auto& val : CommandRegistry::getSoftEnumValues(enumName)) {
                 output.success(val);
             }
         }
         if (!found)
             output.errorf("Enum or Soft Enum \"{}\" not found", enumName);
-    }
-    else
-    {
+    } else {
         output.success("§eEnum Names:");
-        for (auto& val : CommandRegistry::getEnumNames())
-        {
+        for (auto& val : CommandRegistry::getEnumNames()) {
             output.success(val);
         }
         output.success("§eSoft Enum Names:");
-        for (auto& val : CommandRegistry::getSoftEnumNames())
-        {
+        for (auto& val : CommandRegistry::getSoftEnumNames()) {
             output.success(val);
         }
     }
 }
 
-void setupEnumCommand()
-{
+void setupEnumCommand() {
     auto command = DynamicCommand::createCommand("enum", "get command enum names or values", CommandPermissionLevel::Any);
     command->setAlias("enums");
     auto name = command->mandatory("name", ParamType::SoftEnum,
@@ -1398,8 +1229,7 @@ void setupEnumCommand()
 }
 
 // echo command
-void setupEchoCommand()
-{
+void setupEchoCommand() {
     auto command = DynamicCommand::createCommand("echo", "show message", CommandPermissionLevel::Any);
     command->addOverload(command->mandatory("text", ParamType::RawText));
     command->setCallback(
@@ -1411,8 +1241,7 @@ void setupEchoCommand()
     DynamicCommand::setup(std::move(command));
 }
 
-TClasslessInstanceHook2("startServerThread_RegisterDebugCommand", void, "?startServerThread@ServerInstance@@QEAAXXZ")
-{
+TClasslessInstanceHook2("startServerThread_RegisterDebugCommand", void, "?startServerThread@ServerInstance@@QEAAXXZ") {
 #ifdef DEBUG
     setupRemoveCommand();
     setupTestEnumCommand();
@@ -1440,10 +1269,8 @@ TClasslessInstanceHook2("startServerThread_RegisterDebugCommand", void, "?startS
 #endif // DEBUG
 
 TClasslessInstanceHook(void, "?compile@BaseCommandBlock@@AEAAXAEBVCommandOrigin@@AEAVLevel@@@Z",
-              class CommandOrigin const& origin, class Level& level)
-{
-    if (LL::globalConfig.tickThreadId != std::this_thread::get_id())
-    {
+                       class CommandOrigin const& origin, class Level& level) {
+    if (LL::globalConfig.tickThreadId != std::this_thread::get_id()) {
         SRWLockSharedHolder locker(delaySetupLock);
         return original(this, origin, level);
     }
diff --git a/LiteLoader/Kernel/Compatibility.cpp b/LiteLoader/Kernel/Compatibility.cpp
--- a/LiteLoader/Kernel/Compatibility.cpp
+++ b/LiteLoader/Kernel/Compatibility.cpp
@@ -4,31 +4,32 @@
 #include <ScheduleAPI.h>
 extern Logger logger;
 
-LIAPI void OutputEventError(const std::string& errorMsg, const std::string& eventName, const std::string& pluginName)
-{
-	logger.error("Please upgrade the plugin <{}>, or it will not work properly!!!", pluginName);
+LIAPI void OutputEventError(const std::string& errorMsg, const std::string& eventName, const std::string& pluginName) {
+    logger.error("Please upgrade the plugin <{}>, or it will not work properly!!!", pluginName);
 }
 
-namespace Schedule
-{
-    LIAPI ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay)
-    { return delay(task, tickDelay, nullptr); }
-    LIAPI ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickInterval, int maxCount = -1)
-    { return repeat(task, tickInterval, maxCount, nullptr); }
-    LIAPI ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay, unsigned long long tickInterval, int maxCount = -1)
-    { return delayRepeat(task, tickDelay, tickInterval, maxCount, nullptr); }
-    LIAPI ScheduleTask nextTick(std::function<void(void)> task)
-    { return nextTick(task, nullptr); }
+namespace Schedule {
+LIAPI ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay) {
+    return delay(task, tickDelay, nullptr);
 }
+LIAPI ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickInterval, int maxCount = -1) {
+    return repeat(task, tickInterval, maxCount, nullptr);
+}
+LIAPI ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay, unsigned long long tickInterval, int maxCount = -1) {
+    return delayRepeat(task, tickDelay, tickInterval, maxCount, nullptr);
+}
+LIAPI ScheduleTask nextTick(std::function<void(void)> task) {
+    return nextTick(task, nullptr);
+}
+} // namespace Schedule
 
-LIAPI std::wstring ANSI2Unicode(const std::string& str)
-{
+LIAPI std::wstring ANSI2Unicode(const std::string& str) {
     std::wstring ret;
     std::mbstate_t state = {};
     const char* src = str.data();
     size_t len = std::mbsrtowcs(nullptr, &src, 0, &state);
     if (static_cast<size_t>(-1) != len) {
-        std::unique_ptr< wchar_t[] > buff(new wchar_t[len + 1]);
+        std::unique_ptr<wchar_t[]> buff(new wchar_t[len + 1]);
         len = std::mbsrtowcs(buff.get(), &src, len, &state);
         if (static_cast<size_t>(-1) != len) {
             ret.assign(buff.get(), len);
diff --git a/LiteLoader/Kernel/DB/Any.cpp b/LiteLoader/Kernel/DB/Any.cpp
--- a/LiteLoader/Kernel/DB/Any.cpp
+++ b/LiteLoader/Kernel/DB/Any.cpp
@@ -1,126 +1,101 @@
 #include <DB/Any.h>
 
-namespace DB
-{
+namespace DB {
 
-Any::Any()
-{
+Any::Any() {
     type = Type::Null;
     value.boolean = false;
 }
-Any::Any(bool v)
-{
+Any::Any(bool v) {
     type = Type::Boolean;
     value.boolean = v;
 }
-Any::Any(int64_t v)
-{
+Any::Any(int64_t v) {
     type = Type::Integer;
     value.integer = v;
 }
-Any::Any(uint64_t v)
-{
+Any::Any(uint64_t v) {
     type = Type::UInteger;
     value.uinteger = v;
 }
-Any::Any(double v)
-{
+Any::Any(double v) {
     type = Type::Floating;
     value.floating = v;
 }
-Any::Any(const std::string& v)
-{
+Any::Any(const std::string& v) {
     type = Type::String;
     value.string = new std::string(v);
 }
-Any::Any(const char* v)
-{
+Any::Any(const char* v) {
     type = Type::String;
     value.string = new std::string(v);
 }
-Any::Any(char* v, size_t len)
-{
+Any::Any(char* v, size_t len) {
     type = Type::String;
     value.string = new std::string(v, len);
 }
-Any::Any(const Date& v)
-{
+Any::Any(const Date& v) {
     type = Type::Date;
     value.date = new Date(v);
 }
-Any::Any(const Time& v)
-{
+Any::Any(const Time& v) {
     type = Type::Time;
     value.time = new Time(v);
 }
-Any::Any(const DateTime& v)
-{
+Any::Any(const DateTime& v) {
     type = Type::DateTime;
     value.datetime = new DateTime(v);
 }
-Any::Any(char v)
-{
+Any::Any(char v) {
     type = Type::Integer;
     value.integer = v;
 }
-Any::Any(unsigned char v)
-{
+Any::Any(unsigned char v) {
     type = Type::UInteger;
     value.uinteger = v;
 }
-Any::Any(short v)
-{
+Any::Any(short v) {
     type = Type::Integer;
     value.integer = v;
 }
-Any::Any(unsigned short v)
-{
+Any::Any(unsigned short v) {
     type = Type::UInteger;
     value.uinteger = v;
 }
-Any::Any(int v)
-{
+Any::Any(int v) {
     type = Type::Integer;
     value.integer = v;
 }
-Any::Any(unsigned int v)
-{
+Any::Any(unsigned int v) {
     type = Type::UInteger;
     value.uinteger = v;
 }
-Any::Any(long v)
-{
+Any::Any(long v) {
     type = Type::Integer;
     value.integer = v;
 }
-Any::Any(unsigned long v)
-{
+Any::Any(unsigned long v) {
     type = Type::UInteger;
     value.uinteger = v;
 }
-Any::Any(float v)
-{
+Any::Any(float v) {
     type = Type::Floating;
     value.floating = v;
 }
-Any::Any(const ByteArray& v)
-{
+Any::Any(const ByteArray& v) {
     type = Type::Blob;
     value.blob = new ByteArray(v);
 }
-Any::Any(const Any& v)
-{
+Any::Any(const Any& v) {
     *this = v;
 }
 
-Any& Any::operator=(const Any& v)
-{
+Any& Any::operator=(const Any& v) {
     if (this == &v)
         return *this;
     type = v.type;
     value = v.value;
-    switch (type)
-    {
+    switch (type) {
         case Type::String:
             value.string = new std::string(*v.value.string);
             break;
@@ -140,84 +115,61 @@ Any& Any::operator=(const Any& v)
     return *this;
 }
 
-Any::~Any()
-{
-    if (type == Type::String)
-    {
+Any::~Any() {
+    if (type == Type::String) {
         delete value.string;
         value.string = nullptr;
-    }
-    else if (type == Type::Date)
-    {
+    } else if (type == Type::Date) {
         delete value.date;
         value.date = nullptr;
-    }
-    else if (type == Type::Time)
-    {
+    } else if (type == Type::Time) {
         delete value.time;
         value.time = nullptr;
-    }
-    else if (type == Type::DateTime)
-    {
+    } else if (type == Type::DateTime) {
         delete value.datetime;
         value.datetime = nullptr;
-    }
-    else if (type == Type::Blob)
-    {
+    } else if (type == Type::Blob) {
         delete value.blob;
         value.blob = nullptr;
     }
 }
 
-bool Any::is_null() const
-{
+bool Any::is_null() const {
     return type == Type::Null;
 }
-bool Any::is_boolean() const
-{
+bool Any::is_boolean() const {
     return type == Type::Boolean;
 }
-bool Any::is_integer() const
-{
+bool Any::is_integer() const {
     return type == Type::Integer || type == Type::UInteger;
 }
-bool Any::is_uinteger() const
-{
+bool Any::is_uinteger() const {
     return type == Type::UInteger;
 }
-bool Any::is_floating() const
-{
+bool Any::is_floating() const {
     return type == Type::Floating;
 }
-bool Any::is_string() const
-{
+bool Any::is_string() const {
     return type == Type::String;
 }
-bool Any::is_date() const
-{
+bool Any::is_date() const {
     return type == Type::Date;
 }
-bool Any::is_time() const
-{
+bool Any::is_time() const {
     return type == Type::Time;
 }
-bool Any::is_datetime() const
-{
+bool Any::is_datetime() const {
     return type == Type::DateTime;
 }
-bool Any::is_number() const
-{
+bool Any::is_number() const {
     return type == Type::Integer || type == Type::UInteger || type == Type::Floating;
 }
-bool Any::is_blob() const
-{
+bool Any::is_blob() const {
     return type == Type::Blob;
 }
 
-std::string Any::type2str(Any::Type type)
-{
-    switch (type)
-    {
+std::string Any::type2str(Any::Type type) {
+    switch (type) {
         case Type::Null:
             return "null";
         case Type::Boolean:
@@ -243,27 +195,23 @@ std::string Any::type2str(Any::Type type)
     }
 }
 
-Any Any::str2any(const std::string& str)
-{
+Any Any::str2any(const std::string& str) {
     if (str.empty())
         return Any();
     bool isInteger = true;
     bool isFloating = false;
     bool first = true;
-    for (auto& ch : str)
-    {
-        if (first && ch == '-')
-        {
+    for (auto& ch : str) {
+        if (first && ch == '-') {
             first = false;
             continue;
         }
         if (ch >= '0' && ch <= '9')
             continue;
-        if (ch == '.')
-        {
-            if (isFloating) isFloating = false;
-            else
-            {
+        if (ch == '.') {
+            if (isFloating)
+                isFloating = false;
+            else {
                 isInteger = false;
                 isFloating = true;
             }
@@ -272,14 +220,14 @@ Any Any::str2any(const std::string& str)
     }
     if (isFloating)
         return Any(std::stod(str));
-    else if (isInteger)
-    {
+    else if (isInteger) {
         auto floating = std::stod(str);
-        if (floating > ULLONG_MAX || floating < LLONG_MIN) return Any(floating);
-        else if (floating > LLONG_MAX) return Any(std::stoull(str));
+        if (floating > ULLONG_MAX || floating < LLONG_MIN)
+            return Any(floating);
+        else if (floating > LLONG_MAX)
+            return Any(std::stoull(str));
         return Any(std::stoll(str));
-    }
-    else
+    } else
         return Any(str);
 }
 
diff --git a/LiteLoader/Kernel/DB/ConnParams.cpp b/LiteLoader/Kernel/DB/ConnParams.cpp
--- a/LiteLoader/Kernel/DB/ConnParams.cpp
+++ b/LiteLoader/Kernel/DB/ConnParams.cpp
@@ -2,13 +2,11 @@
 #include <Utils/StringHelper.h>
 #include <LoggerAPI.h>
 
-namespace DB
-{
+namespace DB {
 
 #pragma region URL_Parser
 
-struct URL
-{
+struct URL {
     std::string scheme;
     std::string user;
     std::string password;
@@ -19,29 +17,24 @@ struct URL
     std::string fragment;
 };
 
-URL ParseURL(const std::string& url)
-{
+URL ParseURL(const std::string& url) {
     URL result;
     std::string cur = url;
 
     size_t pos = cur.find("://");
-    if (pos != std::string::npos)
-    {
+    if (pos != std::string::npos) {
         result.scheme = cur.substr(0, pos);
         cur = cur.substr(pos + 3);
     }
     pos = cur.find('@');
     auto pos0 = pos;
-    if (pos != std::string::npos)
-    {
+    if (pos != std::string::npos) {
         std::string userInfo = cur.substr(0, pos);
         pos = userInfo.find(':');
-        if (pos != std::string::npos)
-        {
+        if (pos != std::string::npos) {
             result.user = userInfo.substr(0, pos);
             result.password = userInfo.substr(pos + 1);
-        }
-        else
+        } else
             result.user = userInfo;
         cur = cur.substr(pos0 + 1);
     }
@@ -49,12 +42,10 @@ URL ParseURL(const std::string& url)
     auto pos1 = pos;
     std::string address = cur.substr(0, pos);
     pos = address.find(':');
-    if (pos != std::string::npos)
-    {
+    if (pos != std::string::npos) {
         result.host = address.substr(0, pos);
         result.port = static_cast<uint16_t>(std::stoi(address.substr(pos + 1)));
-    }
-    else
+    } else
         result.host = address;
     if (pos1 == std::string::npos)
         return result;
@@ -67,40 +58,33 @@ URL ParseURL(const std::string& url)
         return result;
     else
         cur = cur.substr(pos);
-    if (cur[0] == '?')
-    {
+    if (cur[0] == '?') {
         cur = cur.substr(1);
         pos = cur.find('#');
         std::string query = cur.substr(0, pos);
-        if (pos != std::string::npos)
-        {
+        if (pos != std::string::npos) {
             result.fragment = cur.substr(pos + 1);
         }
         std::vector<std::string> pairs = SplitStrWithPattern(query, "&");
-        for (auto& pair : pairs)
-        {
+        for (auto& pair : pairs) {
             std::string k, v;
             pos = pair.find('=');
             if (pos == std::string::npos)
                 k = pair;
-            else
-            {
+            else {
                 k = pair.substr(0, pos);
                 v = pair.substr(pos + 1);
             }
             result.query.emplace(k, v);
         }
-    }
-    else if (cur[0] == '#')
-    {
+    } else if (cur[0] == '#') {
         result.fragment = cur.substr(1);
     }
     return result;
 }
 
 extern Logger dbLogger;
-void PrintURL(const URL& url)
-{
+void PrintURL(const URL& url) {
     dbLogger.debug("Parsed URL");
     dbLogger.debug("scheme: {}", url.scheme);
     dbLogger.debug("user: {}", url.user);
@@ -117,30 +101,23 @@ void PrintURL(const URL& url)
 #pragma endregion
 
 ConnParams::ConnParams(const std::initializer_list<Any>& list)
-    : std::unordered_map<std::string, Any>()
-{
+: std::unordered_map<std::string, Any>() {
     bool key = true;
     std::string keyName;
-    for (auto& item : list)
-    {
-        if (key)
-        {
-            if (item.is_string())
-            {
+    for (auto& item : list) {
+        if (key) {
+            if (item.is_string()) {
                 throw std::invalid_argument("ConnParams::ConnParams: Key must be string");
             }
             keyName = item.get<std::string>();
             key = false;
-        }
-        else
-        {
+        } else {
             insert({keyName, item});
             key = true;
         }
     }
     auto host = getHost();
-    if (host.find(':') != std::string::npos)
-    {
+    if (host.find(':') != std::string::npos) {
         host = host.substr(0, host.find_last_of(':'));
         auto port = host.substr(host.find_last_of(':') + 1);
         (*this)["host"] = host;
@@ -148,15 +125,12 @@ ConnParams::ConnParams(const std::initializer_list<Any>& list)
     }
 }
 ConnParams::ConnParams(const std::initializer_list<std::pair<std::string, Any>>& list)
-    : std::unordered_map<std::string, Any>()
-{
-    for (auto& item : list)
-    {
+: std::unordered_map<std::string, Any>() {
+    for (auto& item : list) {
         insert(item);
     }
     auto host = getHost();
-    if (host.find(':') != std::string::npos)
-    {
+    if (host.find(':') != std::string::npos) {
         host = host.substr(0, host.find_last_of(':'));
         auto port = host.substr(host.find_last_of(':') + 1);
         (*this)["host"] = host;
@@ -164,74 +138,69 @@ ConnParams::ConnParams(const std::initializer_list<std::pair<std::string, Any>>&
     }
 }
 ConnParams::ConnParams(const std::string& str)
-    : std::unordered_map<std::string, Any>()
-{
+: std::unordered_map<std::string, Any>() {
     raw = str;
     auto url = ParseURL(str);
 #if defined(LLDB_DEBUG_MODE)
     PrintURL(url);
 #endif
 
-    if (!url.scheme.empty()) insert({"scheme", url.scheme});
-    if (!url.host.empty()) insert({"host", url.host});
-    if (url.port) insert({"port", url.port});
-    if (!url.user.empty()) insert({"user", url.user});
-    if (!url.password.empty()) insert({"password", url.password});
-    if (!url.path.empty())
-    {
+    if (!url.scheme.empty())
+        insert({"scheme", url.scheme});
+    if (!url.host.empty())
+        insert({"host", url.host});
+    if (url.port)
+        insert({"port", url.port});
+    if (!url.user.empty())
+        insert({"user", url.user});
+    if (!url.password.empty())
+        insert({"password", url.password});
+    if (!url.path.empty()) {
         std::string path = url.path;
-        if (path[0] == '/') path = path.substr(1);
+        if (path[0] == '/')
+            path = path.substr(1);
         insert({"path", path});
     }
-    if (!url.fragment.empty()) insert({"fragment", url.fragment});
-    for (auto& pair : url.query)
-    {
+    if (!url.fragment.empty())
+        insert({"fragment", url.fragment});
+    for (auto& pair : url.query) {
         insert({pair.first, Any::str2any(pair.second)});
     }
 }
 ConnParams::ConnParams(const char* str)
-    : std::unordered_map<std::string, Any>()
-{
+: std::unordered_map<std::string, Any>() {
     *this = ConnParams(std::string(str));
 }
 
-std::string ConnParams::getScheme()
-{
+std::string ConnParams::getScheme() {
     return get<std::string>({"scheme", "protocol", "type"}, true);
 }
 
-std::string ConnParams::getHost()
-{
+std::string ConnParams::getHost() {
     return get<std::string>({"host", "hostname", "server", "server_name", "ip", "address"}, true);
 }
 
-uint16_t ConnParams::getPort()
-{
+uint16_t ConnParams::getPort() {
     return get<uint16_t>({"port", "port_number", "port_num", "port_id", "portid"}, true, 0);
 }
 
-std::string ConnParams::getUsername()
-{
+std::string ConnParams::getUsername() {
     return get<std::string>({"user", "username", "user_name", "usr", "usrname"}, true);
 }
 
-std::string ConnParams::getPassword()
-{
+std::string ConnParams::getPassword() {
     return get<std::string>({"password", "pass", "passwd", "pass_word"}, true);
 }
 
-std::string ConnParams::getDatabase()
-{
+std::string ConnParams::getDatabase() {
     return get<std::string>({"database", "db", "db_name", "dbname", "path"}, true);
 }
 
-std::string ConnParams::getPath()
-{
+std::string ConnParams::getPath() {
     return get<std::string>({"path", "file", "file_name", "filename"}, true);
 }
 
-std::string ConnParams::getRaw()
-{
+std::string ConnParams::getRaw() {
     return raw;
 }
 
diff --git a/LiteLoader/Kernel/DB/Impl/MySQL/Session.cpp b/LiteLoader/Kernel/DB/Impl/MySQL/Session.cpp
--- a/LiteLoader/Kernel/DB/Impl/MySQL/Session.cpp
+++ b/LiteLoader/Kernel/DB/Impl/MySQL/Session.cpp
@@ -4,74 +4,64 @@
 #include <LoggerAPI.h>
 #define OK 0
 
-namespace DB
-{
+namespace DB {
 
-MySQLSession::MySQLSession()
-{
+MySQLSession::MySQLSession() {
     IF_ENDBG dbLogger.info("MySQLSession::MySQLSession: Constructed! this: {}", (void*)this);
     conn = mysql_init(nullptr);
 }
-MySQLSession::MySQLSession(const ConnParams& params)
-{
+MySQLSession::MySQLSession(const ConnParams& params) {
     IF_ENDBG dbLogger.info("MySQLSession::MySQLSession: Constructed! this: {}", (void*)this);
     conn = mysql_init(nullptr);
     open(params);
 }
 
-MySQLSession::~MySQLSession()
-{
+MySQLSession::~MySQLSession() {
     IF_ENDBG dbLogger.info("MySQLSession::MySQLSession: Destructor: this: {}", (void*)this);
     close();
 }
 
-void MySQLSession::setSSL(const ConnParams& params)
-{
+void MySQLSession::setSSL(const ConnParams& params) {
     auto p = params;
-    auto key = p.get<std::string>({"sslkey", "ssl_key", "ssl-key"}); // Private key path
-    auto cert = p.get<std::string>({"sslcert", "ssl_cert", "ssl-cert"}); // Public certificate path
-    auto ca = p.get<std::string>({"sslca", "ssl_ca", "ssl-ca"}); // Certificate authority path
+    auto key = p.get<std::string>({"sslkey", "ssl_key", "ssl-key"});             // Private key path
+    auto cert = p.get<std::string>({"sslcert", "ssl_cert", "ssl-cert"});         // Public certificate path
+    auto ca = p.get<std::string>({"sslca", "ssl_ca", "ssl-ca"});                 // Certificate authority path
     auto capath = p.get<std::string>({"sslcapath", "ssl_capath", "ssl-capath"}); // Certificate authority directory
     auto cipher = p.get<std::string>({"sslcipher", "ssl_cipher", "ssl-cipher"}); // List of ciphers to use
-    if (key.empty() || cert.empty())
-    {
+    if (key.empty() || cert.empty()) {
         return;
     }
     mysql_ssl_set(conn, key.c_str(), cert.c_str(),
-                 (ca.empty() ? nullptr : ca.c_str()),
-                 (capath.empty() ? nullptr : capath.c_str()),
-                 (cipher.empty() ? nullptr : cipher.c_str())); // Always returns 0
+                  (ca.empty() ? nullptr : ca.c_str()),
+                  (capath.empty() ? nullptr : capath.c_str()),
+                  (cipher.empty() ? nullptr : cipher.c_str())); // Always returns 0
 }
 
-void MySQLSession::open(const ConnParams& params)
-{
+void MySQLSession::open(const ConnParams& params) {
     auto p = params;
     unsigned long flags = 0;
     uint16_t port = 0;
-    if ((port = p.getPort()) == 0)
-    {
+    if ((port = p.getPort()) == 0) {
         port = 3306;
     }
     std::string db = p.getDatabase();
-    if (p.get({"compress"}, true, false))
-    {
+    if (p.get({"compress"}, true, false)) {
         flags |= CLIENT_COMPRESS;
     }
-    if (p.get({"ssl", "ssl_mode", "sslmode", "ssl-mode"}, true, false))
-    {
+    if (p.get({"ssl", "ssl_mode", "sslmode", "ssl-mode"}, true, false)) {
         flags |= CLIENT_SSL;
         setSSL(p);
     }
-    //auto defaultCharset = mysql_character_set_name(conn);
+    // auto defaultCharset = mysql_character_set_name(conn);
     auto charset = p.get<std::string>({"charset", "char_set", "characterset", "character_set", "charsetname",
-                                      "char_set_name", "charactersetname", "character_set_name"}, "true",
+                                       "char_set_name", "charactersetname", "character_set_name"},
+                                      "true",
                                       "utf8");
-    //IF_ENDBG dbLogger.debug("MySQLSession::open: MySQL default charset name: {}", defaultCharset);
+    // IF_ENDBG dbLogger.debug("MySQLSession::open: MySQL default charset name: {}", defaultCharset);
     mysql_options(conn, MYSQL_SET_CHARSET_NAME, charset.c_str());
-    auto res = mysql_real_connect(conn, p.getHost().c_str(), p.getUsername().c_str(), p.getPassword().c_str(), 
+    auto res = mysql_real_connect(conn, p.getHost().c_str(), p.getUsername().c_str(), p.getPassword().c_str(),
                                   (db.empty() ? nullptr : db.c_str()), port, nullptr, 0);
-    if (!res)
-    {
+    if (!res) {
         throw std::runtime_error("MySQLSession::MySQLSession: Failed to open database: " + std::string(mysql_error(conn)));
     }
     IF_ENDBG dbLogger.debug("MySQLSession::open: Opened database: " + std::string(p.getHost()) + ":" + std::to_string(port) + "/" + db);
@@ -80,32 +70,27 @@ void MySQLSession::open(const ConnParams& params)
 #endif
 }
 
-bool MySQLSession::execute(const std::string& query)
-{
+bool MySQLSession::execute(const std::string& query) {
     IF_ENDBG dbLogger.debug("MySQLSession::execute: Executing > " + query);
     auto res = mysql_query(conn, query.c_str());
     return res == OK;
 }
 
-bool MySQLSession::relogin(const std::string& user, const std::string& password, const std::string& db)
-{
+bool MySQLSession::relogin(const std::string& user, const std::string& password, const std::string& db) {
     IF_ENDBG dbLogger.debug("MySQLSession::change: Changing user to {} and database to {}", user, db);
     auto res = mysql_change_user(conn, user.c_str(), password.c_str(), (db.empty() ? nullptr : db.c_str()));
     return res == OK;
 }
 
-Session& MySQLSession::query(const std::string& query, std::function<bool(const Row&)> callback)
-{
+Session& MySQLSession::query(const std::string& query, std::function<bool(const Row&)> callback) {
     IF_ENDBG dbLogger.debug("MySQLSession::query: Querying > " + query);
     auto res = mysql_query(conn, query.c_str());
-    if (res != OK)
-    {
+    if (res != OK) {
         throw std::runtime_error("MySQLSession::query: Failed to query database: " + std::string(mysql_error(conn)));
     }
     auto result = mysql_store_result(conn);
-    if (!result)
-    {
-        //throw std::runtime_error("MySQLSession::query: Failed to store result: " + std::string(mysql_error(conn)));
+    if (!result) {
+        // throw std::runtime_error("MySQLSession::query: Failed to store result: " + std::string(mysql_error(conn)));
         return *this; // No result set
     }
     auto numFields = mysql_num_fields(result);
@@ -117,14 +102,11 @@ Session& MySQLSession::query(const std::string& query, std::function<bool(const
     for (auto i = 0; i < numFields; i++)
         header.add(std::string(fields[i].name, fields[i].name_length));
     // Fetch rows
-    while (auto row = mysql_fetch_row(result))
-    {
+    while (auto row = mysql_fetch_row(result)) {
         Row r(header);
-        for (auto i = 0; i < numFields; i++)
-        {
+        for (auto i = 0; i < numFields; i++) {
             auto type = fields[i].type;
-            switch (type)
-            {
+            switch (type) {
                 case MYSQL_TYPE_TINY:
                 case MYSQL_TYPE_SHORT:
                 case MYSQL_TYPE_LONG:
@@ -142,18 +124,16 @@ Session& MySQLSession::query(const std::string& query, std::function<bool(const
                 case MYSQL_TYPE_DOUBLE:
                     r.push_back(std::stod(row[i]));
                     break;
-                case MYSQL_TYPE_BIT:
-                    {
-                        uint64_t val = 0;
-                        auto len = fields[i].length;
-                        for (auto j = 0; j < len; j++)
-                        {
-                            if (row[i][j] == '1')
-                                val |= (1ULL << j);
-                        }
-                        r.push_back(val);
-                        break;
+                case MYSQL_TYPE_BIT: {
+                    uint64_t val = 0;
+                    auto len = fields[i].length;
+                    for (auto j = 0; j < len; j++) {
+                        if (row[i][j] == '1')
+                            val |= (1ULL << j);
                     }
+                    r.push_back(val);
+                    break;
+                }
                 case MYSQL_TYPE_STRING:
                 case MYSQL_TYPE_VAR_STRING:
                 case MYSQL_TYPE_ENUM:
@@ -163,12 +143,11 @@ Session& MySQLSession::query(const std::string& query, std::function<bool(const
                     r.push_back(std::string(row[i]));
                     break;
                 case MYSQL_TYPE_DECIMAL:
-                case MYSQL_TYPE_NEWDECIMAL:
-                    {
-                        r.push_back(Any());
-                        // TODO: Decimal
-                        break;
-                    }
+                case MYSQL_TYPE_NEWDECIMAL: {
+                    r.push_back(Any());
+                    // TODO: Decimal
+                    break;
+                }
                 case MYSQL_TYPE_TINY_BLOB:
                 case MYSQL_TYPE_MEDIUM_BLOB:
                 case MYSQL_TYPE_LONG_BLOB:
@@ -181,58 +160,48 @@ Session& MySQLSession::query(const std::string& query, std::function<bool(const
                     break;
             }
         }
-        if (!callback(r))
-        {
+        if (!callback(r)) {
             break;
         }
     }
     return *this;
 }
 
-SharedPointer<Stmt> MySQLSession::prepare(const std::string& query, bool autoExecute)
-{
+SharedPointer<Stmt> MySQLSession::prepare(const std::string& query, bool autoExecute) {
     auto& stmt = MySQLStmt::create(getOrSetSelf(), query, autoExecute);
     stmtPool.push_back(stmt);
     return stmt;
 }
 
-std::string MySQLSession::getLastError() const
-{
+std::string MySQLSession::getLastError() const {
     return std::string(mysql_error(conn));
 }
 
-uint64_t MySQLSession::getAffectedRows() const
-{
+uint64_t MySQLSession::getAffectedRows() const {
     return mysql_affected_rows(conn);
 }
 
-uint64_t MySQLSession::getLastInsertId() const
-{
+uint64_t MySQLSession::getLastInsertId() const {
     return mysql_insert_id(conn);
 }
 
-void MySQLSession::close()
-{
-    if (conn)
-    {
+void MySQLSession::close() {
+    if (conn) {
         mysql_close(conn);
         conn = nullptr;
         IF_ENDBG dbLogger.debug("MySQLSession::close: Closed database");
     }
 }
 
-bool MySQLSession::isOpen()
-{
+bool MySQLSession::isOpen() {
     return mysql_ping(conn) == OK;
 }
 
-DBType MySQLSession::getType()
-{
+DBType MySQLSession::getType() {
     return DBType::MySQL;
 }
 
-SharedPointer<Stmt> MySQLSession::operator<<(const std::string& query)
-{
+SharedPointer<Stmt> MySQLSession::operator<<(const std::string& query) {
     return prepare(query, true);
 }
 
diff --git a/LiteLoader/Kernel/DB/Impl/MySQL/Stmt.cpp b/LiteLoader/Kernel/DB/Impl/MySQL/Stmt.cpp
--- a/LiteLoader/Kernel/DB/Impl/MySQL/Stmt.cpp
+++ b/LiteLoader/Kernel/DB/Impl/MySQL/Stmt.cpp
@@ -7,12 +7,9 @@
 #pragma warning(disable : 26812)
 
 template <>
-MYSQL_TIME any_to(const DB::Any& v)
-{
-    switch (v.type)
-    {
-        case DB::Any::Type::Date:
-        {
+MYSQL_TIME any_to(const DB::Any& v) {
+    switch (v.type) {
+        case DB::Any::Type::Date: {
             MYSQL_TIME t;
             t.year = v.value.date->year;
             t.month = v.value.date->month;
@@ -24,8 +21,7 @@ MYSQL_TIME any_to(const DB::Any& v)
             t.time_type = MYSQL_TIMESTAMP_DATE;
             return t;
         }
-        case DB::Any::Type::Time:
-        {
+        case DB::Any::Type::Time: {
             MYSQL_TIME t;
             t.year = 0;
             t.month = 0;
@@ -37,8 +33,7 @@ MYSQL_TIME any_to(const DB::Any& v)
             t.time_type = MYSQL_TIMESTAMP_TIME;
             return t;
         }
-        case DB::Any::Type::DateTime:
-        {
+        case DB::Any::Type::DateTime: {
             MYSQL_TIME t;
             t.year = v.value.datetime->date.year;
             t.month = v.value.datetime->date.month;
@@ -55,17 +50,15 @@ MYSQL_TIME any_to(const DB::Any& v)
     }
 }
 
-namespace DB
-{
+namespace DB {
 
 /**
  * @brief Parse the query with named parameters
- * 
+ *
  * @param query  Query with named parameters
  * @return std::unordered_map<std::string, int>  Indexes of parameters
  */
-std::unordered_map<std::string, int> ParseStmtParams(std::string& query)
-{
+std::unordered_map<std::string, int> ParseStmtParams(std::string& query) {
     StringReader reader(query);
     std::unordered_map<std::string, int> result;
     bool inSingleQuote = false;
@@ -73,46 +66,33 @@ std::unordered_map<std::string, int> ParseStmtParams(std::string& query)
     bool inString = false;
     int delta = 0;
     int cur = 0;
-    while (reader.isValid())
-    {
+    while (reader.isValid()) {
         char c = reader.read();
-        if (c == '\'')
-        {
-            if (!inDoubleQuote)
-            {
+        if (c == '\'') {
+            if (!inDoubleQuote) {
                 inSingleQuote = true;
                 inString = true;
-            }
-            else if (inSingleQuote)
-            {
+            } else if (inSingleQuote) {
                 inSingleQuote = false;
                 inString = false;
             }
-        }
-        else if (c == '"')
-        {
-            if (!inSingleQuote)
-            {
+        } else if (c == '"') {
+            if (!inSingleQuote) {
                 inDoubleQuote = true;
                 inString = true;
-            }
-            else if (inDoubleQuote)
-            {
+            } else if (inDoubleQuote) {
                 inDoubleQuote = false;
                 inString = false;
             }
-        }
-        else if (!inString && (c == '?' || c == '$' || c == ':'))
-        {
-            query[reader.getPos() - 1 - delta] = '?';  // Replace $ or : with ?
-            auto name = reader.readVariableName(); // Read parameter name
-            if (name.empty())                      // No parameter name
+        } else if (!inString && (c == '?' || c == '$' || c == ':')) {
+            query[reader.getPos() - 1 - delta] = '?'; // Replace $ or : with ?
+            auto name = reader.readVariableName();    // Read parameter name
+            if (name.empty())                         // No parameter name
             {
                 cur++;
                 continue;
             }
-            if (result.count(name))
-            {
+            if (result.count(name)) {
                 throw std::runtime_error("ParseStmtParams: Duplicate parameter name: " + name);
             }
             result[name] = cur++;
@@ -126,15 +106,13 @@ std::unordered_map<std::string, int> ParseStmtParams(std::string& query)
 
 /**
  * @brief Allocate the memory for the buffer in field receiver
- * 
+ *
  * @param  field  Field to allocate memory for
  * @return std::pair<std::shared_ptr<char[]>, std::size_t>  Allocated memory and its size
  */
-std::pair<std::shared_ptr<char[]>, std::size_t> AllocateBuffer(const MYSQL_FIELD& field)
-{
+std::pair<std::shared_ptr<char[]>, std::size_t> AllocateBuffer(const MYSQL_FIELD& field) {
     std::size_t len = 0;
-    switch (field.type)
-    {
+    switch (field.type) {
         case MYSQL_TYPE_NULL:
             return {nullptr, 0};
         case MYSQL_TYPE_TINY:
@@ -186,8 +164,7 @@ std::pair<std::shared_ptr<char[]>, std::size_t> AllocateBuffer(const MYSQL_FIELD
         default:
             throw std::runtime_error("AllocateBuffer: Unsupported MySQL data type: " + std::to_string(field.type));
     }
-    if (len)
-    {
+    if (len) {
         auto buffer = std::shared_ptr<char[]>(new char[len]);
 #if defined(LLDB_DEBUG_MODE)
         dbLogger.debug("AllocateBuffer: Allocated! Buffer size: {}", len);
@@ -199,29 +176,25 @@ std::pair<std::shared_ptr<char[]>, std::size_t> AllocateBuffer(const MYSQL_FIELD
 
 /**
  * @brief Judge if the field is unsigned type
- * 
+ *
  * @param  field  Field to judge
  * @return bool   True if the field is unsigned
  */
-bool IsUnsigned(const MYSQL_FIELD& field)
-{
+bool IsUnsigned(const MYSQL_FIELD& field) {
     return field.flags & UNSIGNED_FLAG;
 }
 
 /**
  * @brief Convert Receiver to Any
- * 
+ *
  * @param  receiver  Receiver to convert
  * @return Any       Converted value
  */
-Any ReceiverToAny(const Receiver& rec)
-{
-    if (rec.isNull || rec.error)
-    {
+Any ReceiverToAny(const Receiver& rec) {
+    if (rec.isNull || rec.error) {
         return Any();
     }
-    switch (rec.field.type)
-    {
+    switch (rec.field.type) {
         case MYSQL_TYPE_NULL:
             return Any();
         case MYSQL_TYPE_TINY:
@@ -260,7 +233,7 @@ Any ReceiverToAny(const Receiver& rec)
         case MYSQL_TYPE_VARCHAR:
         case MYSQL_TYPE_SET:
         case MYSQL_TYPE_ENUM:
-        //case MYSQL_TYPE_GEOMETRY:
+        // case MYSQL_TYPE_GEOMETRY:
         case MYSQL_TYPE_JSON:
 #if defined(LLDB_DEBUG_MODE)
             dbLogger.debug("ReceiverToAny: string: length: {}, buffer {}", rec.length, rec.buffer.get());
@@ -286,27 +259,23 @@ Any ReceiverToAny(const Receiver& rec)
 }
 
 MySQLStmt::MySQLStmt(MYSQL_STMT* stmt, const std::weak_ptr<Session>& parent, bool autoExecute)
-    : Stmt(parent, autoExecute)
-    , stmt(stmt)
-{
+: Stmt(parent, autoExecute)
+, stmt(stmt) {
     this->parent = parent;
     totalParamsCount = mysql_stmt_param_count(stmt);
     if (totalParamsCount)
         params.reset(new MYSQL_BIND[totalParamsCount]);
-    else
-    {
-        if (autoExecute) execute(); // Execute without params
+    else {
+        if (autoExecute)
+            execute(); // Execute without params
     }
 }
 
-int MySQLStmt::getNextParamIndex()
-{
+int MySQLStmt::getNextParamIndex() {
     int result = -1;
     // Find the first unbound parameter
-    for (int i = 0; i < boundIndexes.size() && i < totalParamsCount; i++)
-    {
-        if (boundIndexes[i] == result + 1)
-        {
+    for (int i = 0; i < boundIndexes.size() && i < totalParamsCount; i++) {
+        if (boundIndexes[i] == result + 1) {
             result++;
         }
     }
@@ -314,15 +283,12 @@ int MySQLStmt::getNextParamIndex()
     return result + 1;
 }
 
-void MySQLStmt::bindResult()
-{
+void MySQLStmt::bindResult() {
     metadata = mysql_stmt_result_metadata(stmt); // Get the result metadata
-    if (mysql_stmt_errno(stmt) && !metadata)
-    {
+    if (mysql_stmt_errno(stmt) && !metadata) {
         throw std::runtime_error("MySQLStmt::bindResult: Failed to get result metadata" + std::string(mysql_stmt_error(stmt)));
     }
-    if (!metadata)
-    {
+    if (!metadata) {
         IF_ENDBG dbLogger.debug("MySQLStmt::bindResult: No result metadata");
         return;
     }
@@ -337,8 +303,7 @@ void MySQLStmt::bindResult()
     auto fields = mysql_fetch_fields(metadata);
     result.reset(new MYSQL_BIND[cnt]); // Allocate result bindings
     resultHeader.reset(new RowHeader); // Allocate result header
-    for (auto i = 0U; i < cnt; i++)
-    {
+    for (auto i = 0U; i < cnt; i++) {
         resultValues.push_back({});      // Allocate result values
         auto& rec = resultValues.back(); // Get the binder
         auto& field = fields[i];
@@ -355,36 +320,30 @@ void MySQLStmt::bindResult()
         data.buffer_length = (unsigned long)len;      // Set the buffer length
         data.buffer = rec.buffer.get();               // Set the buffer address
 
-        rec.field = field;   // Save the field
+        rec.field = field;             // Save the field
         resultHeader->add(field.name); // Add the field name to the header
         IF_ENDBG dbLogger.debug("MySQLStmt::bindResult: Bind result {} (type {}) at index {}", field.name, (int)field.type, i);
     }
     auto res = mysql_stmt_bind_result(stmt, result.get());
-    if (res)
-    {
+    if (res) {
         throw std::runtime_error("MySQLStmt::bindResult: Failed to bind result: " + std::string(mysql_stmt_error(stmt)));
     }
 }
 
-MySQLStmt::~MySQLStmt()
-{
+MySQLStmt::~MySQLStmt() {
     close();
 }
 
-Stmt& MySQLStmt::bind(const Any& value, int index)
-{
-    if (index < 0 || index > totalParamsCount)
-    {
+Stmt& MySQLStmt::bind(const Any& value, int index) {
+    if (index < 0 || index > totalParamsCount) {
         throw std::invalid_argument("MySQLStmt::bind: Invalid argument `index`");
     }
-    if (getUnboundParams() == 0)
-    {
+    if (getUnboundParams() == 0) {
         throw std::runtime_error("MySQLStmt::bind: All the parameters are already bound");
     }
     paramValues.push_back({}); // Save the value or it will be lost
     auto& param = paramValues.back();
-    switch (value.type)
-    {
+    switch (value.type) {
         case Any::Type::Null:
             params[index].buffer_type = MYSQL_TYPE_NULL;
             break;
@@ -426,13 +385,12 @@ Stmt& MySQLStmt::bind(const Any& value, int index)
             params[index].is_null = 0;
             params[index].length = 0;
             break;
-        case Any::Type::String:
-        {
+        case Any::Type::String: {
             params[index].buffer_type = MYSQL_TYPE_STRING;
             auto sz = value.value.string->length(); // Don't +1 here!!!
             param.buffer.reset(new char[sz]);
             memcpy(param.buffer.get(), value.value.string->data(), sz); // No '\0'
-            param.length = sz; // Must set the length to the buffer size, otherwise it will be truncated
+            param.length = sz;                                          // Must set the length to the buffer size, otherwise it will be truncated
             params[index].buffer = param.buffer.get();
             params[index].buffer_length = sz;
             params[index].is_null = 0;
@@ -442,8 +400,7 @@ Stmt& MySQLStmt::bind(const Any& value, int index)
         }
         case Any::Type::Date:
         case Any::Type::Time:
-        case Any::Type::DateTime:
-        {
+        case Any::Type::DateTime: {
             params[index].buffer_type = MYSQL_TYPE_TIME;
             auto tm = value.get<MYSQL_TIME>();
             param.buffer.reset(new char[sizeof(MYSQL_TIME)]);
@@ -454,8 +411,7 @@ Stmt& MySQLStmt::bind(const Any& value, int index)
             params[index].length = 0;
             break;
         }
-        case Any::Type::Blob:
-        {
+        case Any::Type::Blob: {
             params[index].buffer_type = MYSQL_TYPE_BLOB;
             auto blob = value.get<ByteArray>();
             auto sz = blob.size();
@@ -473,37 +429,31 @@ Stmt& MySQLStmt::bind(const Any& value, int index)
     }
     boundIndexes.push_back(index);
     boundParamsCount++;
-    if (getUnboundParams() == 0)
-    {
+    if (getUnboundParams() == 0) {
         auto res = mysql_stmt_bind_param(stmt, params.get());
-        if (res)
-        {
+        if (res) {
             throw std::runtime_error("MySQLStmt::bind: " + std::string(mysql_stmt_error(stmt)));
         }
-        if (autoExecute) execute();
+        if (autoExecute)
+            execute();
     }
     return *this;
 }
 
-Stmt& MySQLStmt::bind(const Any& value, const std::string& name)
-{
-    if (!paramIndexes.count(name))
-    {
+Stmt& MySQLStmt::bind(const Any& value, const std::string& name) {
+    if (!paramIndexes.count(name)) {
         throw std::invalid_argument("MySQLStmt::bind: Parameter name `" + name + "` not found");
     }
     return bind(value, paramIndexes[name]);
 }
 
-Stmt& MySQLStmt::bind(const Any& value)
-{
+Stmt& MySQLStmt::bind(const Any& value) {
     return bind(value, getNextParamIndex());
 }
 
-Stmt& MySQLStmt::execute()
-{
+Stmt& MySQLStmt::execute() {
     auto res = mysql_stmt_execute(stmt); // Execute
-    if (res)
-    {
+    if (res) {
         if (!parent.expired())
             mysql_rollback(Wptr2MySQLSession(parent)->conn); // Rollback
         throw std::runtime_error("MySQLStmt::execute: Failed to execute stmt: " + std::string(mysql_stmt_error(stmt)));
@@ -516,49 +466,38 @@ Stmt& MySQLStmt::execute()
     return *this;
 }
 
-bool MySQLStmt::step()
-{
+bool MySQLStmt::step() {
     auto res = mysql_stmt_fetch(stmt);
-    if (res == MYSQL_NO_DATA)
-    {
+    if (res == MYSQL_NO_DATA) {
         fetched = true;
         return false;
-    }
-    else if (res == MYSQL_DATA_TRUNCATED)
-    {
+    } else if (res == MYSQL_DATA_TRUNCATED) {
         throw std::runtime_error("MySQLStmt::step: Data truncated!");
-    }
-    else if (res)
-    {
+    } else if (res) {
         throw std::runtime_error(fmt::format("MySQLStmt::step: {}", mysql_stmt_error(stmt)));
     }
     ++steps;
     return true;
 }
 
-bool MySQLStmt::next()
-{
+bool MySQLStmt::next() {
     return step();
 }
 
-bool MySQLStmt::done()
-{
+bool MySQLStmt::done() {
     return fetched;
 }
 
-Row MySQLStmt::_Fetch()
-{
+Row MySQLStmt::_Fetch() {
     // TODO: execute check
-    if (fetched)
-    {
+    if (fetched) {
         throw std::runtime_error("MySQLStmt::_Fetch: No more rows");
     }
     IF_ENDBG dbLogger.debug("MySQLStmt::_Fetch: Fetching row...");
     Row row(resultHeader);
     IF_ENDBG dbLogger.debug("MySQLStmt::_Fetch: RowHeader size {}", row.header->size());
     int i = 0;
-    for (auto& col : resultValues)
-    {
+    for (auto& col : resultValues) {
         // Because of the inexplicable problems of MySQL C API,
         //  we must set the length of the field manually.
         auto length = *(stmt->bind + i)->length;
@@ -573,10 +512,8 @@ Row MySQLStmt::_Fetch()
     return row;
 }
 
-Stmt& MySQLStmt::reset()
-{
-    if (mysql_stmt_reset(stmt))
-    {
+Stmt& MySQLStmt::reset() {
+    if (mysql_stmt_reset(stmt)) {
         throw std::runtime_error("MySQLStmt::reset: " + std::string(mysql_stmt_error(stmt)));
     }
     result.reset();
@@ -587,17 +524,14 @@ Stmt& MySQLStmt::reset()
     return *this;
 }
 
-Stmt& MySQLStmt::reexec()
-{
+Stmt& MySQLStmt::reexec() {
     reset();
     execute();
     return *this;
 }
 
-Stmt& MySQLStmt::clear()
-{
-    if (query.empty())
-    {
+Stmt& MySQLStmt::clear() {
+    if (query.empty()) {
         throw std::runtime_error("MySQLStmt::clear: No query");
     }
     close();
@@ -605,27 +539,24 @@ Stmt& MySQLStmt::clear()
     return *this;
 }
 
-void MySQLStmt::close()
-{
-    if (metadata)
-    {
+void MySQLStmt::close() {
+    if (metadata) {
         mysql_free_result(metadata);
         metadata = nullptr;
     }
-    if (stmt)
-    {
+    if (stmt) {
         // CRASH!?
         // I(Jasonzyt) had no idea how to fix it, so I just disabled it
         //  idk if it will cause any problem like memory leak but it's better than crash lol
-        //mysql_stmt_close(stmt);
-        //stmt = nullptr;
+        // mysql_stmt_close(stmt);
+        // stmt = nullptr;
     }
     params.reset();
     result.reset();
     resultHeader.reset();
     totalParamsCount = 0;
     boundParamsCount = 0;
-    paramValues  = {};
+    paramValues = {};
     resultValues = {};
     paramIndexes = {};
     boundIndexes = {};
@@ -633,70 +564,59 @@ void MySQLStmt::close()
     fetched = false;
 }
 
-uint64_t MySQLStmt::getAffectedRows() const
-{
+uint64_t MySQLStmt::getAffectedRows() const {
     return mysql_stmt_affected_rows(stmt);
 }
 
-uint64_t MySQLStmt::getInsertId() const
-{
+uint64_t MySQLStmt::getInsertId() const {
     return mysql_stmt_insert_id(stmt);
 }
 
-int MySQLStmt::getUnboundParams() const
-{
+int MySQLStmt::getUnboundParams() const {
     return totalParamsCount - boundParamsCount;
 }
 
-int MySQLStmt::getBoundParams() const
-{
+int MySQLStmt::getBoundParams() const {
     return boundParamsCount;
 }
 
-int MySQLStmt::getParamsCount() const
-{
+int MySQLStmt::getParamsCount() const {
     return totalParamsCount;
 }
 
-DBType MySQLStmt::getType() const
-{
+DBType MySQLStmt::getType() const {
     return DBType::MySQL;
 }
 
-SharedPointer<Stmt> MySQLStmt::create(const std::weak_ptr<Session>& session, const std::string& sql, bool autoExecute)
-{
+SharedPointer<Stmt> MySQLStmt::create(const std::weak_ptr<Session>& session, const std::string& sql, bool autoExecute) {
     auto& s = session.lock();
-    if (!s || s->getType() != DBType::MySQL)
-    {
+    if (!s || s->getType() != DBType::MySQL) {
         throw std::invalid_argument("MySQLStmt::create: Session is invalid");
     }
     auto raw = (MySQLSession*)s.get();
     auto stmt = mysql_stmt_init(raw->conn);
-    if (!stmt)
-    {
+    if (!stmt) {
         throw std::runtime_error("MySQLStmt::create: " + s->getLastError());
     }
     auto query = sql;
     auto params = ParseStmtParams(query);
-    if (raw->debugOutput && !params.empty())
-    {
+    if (raw->debugOutput && !params.empty()) {
         dbLogger.debug("MySQLStmt::create: Parsed named parameters in query: ");
         dbLogger.debug("MySQLStmt::create: - SQL without named parameters: {}", query);
-        for (auto& [k, v] : params)
-        {
+        for (auto& [k, v] : params) {
             dbLogger.debug("MySQLStmt::create: - {}: {}", k, v);
         }
     }
     auto res = mysql_stmt_prepare(stmt, query.c_str(), query.size());
-    if (res)
-    {
+    if (res) {
         throw std::runtime_error("MySQLStmt::create: " + std::string(mysql_stmt_error(stmt)));
     }
     auto result = new MySQLStmt(stmt, session, autoExecute);
     result->query = sql;
     result->paramIndexes = params;
     result->setDebugOutput(raw->debugOutput);
-    if (raw->debugOutput) dbLogger.debug("MySQLStmt::create: Prepared > " + query);
+    if (raw->debugOutput)
+        dbLogger.debug("MySQLStmt::create: Prepared > " + query);
     auto shared = SharedPointer<Stmt>(result);
     result->self = shared;
     return shared;
diff --git a/LiteLoader/Kernel/DB/Impl/SQLite/Session.cpp b/LiteLoader/Kernel/DB/Impl/SQLite/Session.cpp
--- a/LiteLoader/Kernel/DB/Impl/SQLite/Session.cpp
+++ b/LiteLoader/Kernel/DB/Impl/SQLite/Session.cpp
@@ -3,139 +3,111 @@
 #include <third-party/sqlite3/sqlite3.h>
 #include <LoggerAPI.h>
 
-namespace DB
-{
+namespace DB {
 
-SQLiteSession::SQLiteSession()
-{
+SQLiteSession::SQLiteSession() {
     IF_ENDBG dbLogger.debug("SQLiteSession: Constructed! this: {}", (void*)this);
 }
-SQLiteSession::SQLiteSession(const ConnParams& params)
-{
+SQLiteSession::SQLiteSession(const ConnParams& params) {
     IF_ENDBG dbLogger.debug("SQLiteSession: Constructed! this: {}", (void*)this);
     open(params);
 }
 
-SQLiteSession::~SQLiteSession()
-{
+SQLiteSession::~SQLiteSession() {
     IF_ENDBG dbLogger.debug("SQLiteSession::~SQLiteSession: Destructor: this: {}", (void*)this);
     close();
 }
 
-void SQLiteSession::open(const ConnParams& params)
-{
+void SQLiteSession::open(const ConnParams& params) {
     // see https://www.sqlite.org/c3ref/open.html
     auto p = params; // Copy to avoid modifying the origin.
     auto path = p.getPath();
-    if (path.empty())
-    {
+    if (path.empty()) {
         path = ":memory:";
         // throw std::invalid_argument("SQLiteSession::SQLiteSession: No path specified!");
     }
     auto flags = 0;
-    if (p.get<bool>({"create", "create_if_not_exist", "createifnotexist"}, true, false))
-    {
+    if (p.get<bool>({"create", "create_if_not_exist", "createifnotexist"}, true, false)) {
         flags |= SQLITE_OPEN_CREATE;
     }
-    if (p.get<bool>({"readonly", "readonly_mode", "readonlymode", "r"}, false, false))
-    {
+    if (p.get<bool>({"readonly", "readonly_mode", "readonlymode", "r"}, false, false)) {
         flags |= SQLITE_OPEN_READONLY;
     }
-    if (p.get<bool>({"readwrite", "readwrite_mode", "readwritemode", "read_write", "rw"}, false, false))
-    {
+    if (p.get<bool>({"readwrite", "readwrite_mode", "readwritemode", "read_write", "rw"}, false, false)) {
         flags |= SQLITE_OPEN_READWRITE;
     }
-    if (p.get<bool>({"privatecache", "private_cache"}, false, false))
-    {
+    if (p.get<bool>({"privatecache", "private_cache"}, false, false)) {
         flags |= SQLITE_OPEN_PRIVATECACHE;
     }
-    if (p.get<bool>({"sharedcache", "shared_cache"}, false, false))
-    {
+    if (p.get<bool>({"sharedcache", "shared_cache"}, false, false)) {
         flags |= SQLITE_OPEN_SHAREDCACHE;
     }
-    if (p.get<bool>({"nomutex", "no_mutex"}, false, false))
-    {
+    if (p.get<bool>({"nomutex", "no_mutex"}, false, false)) {
         flags |= SQLITE_OPEN_NOMUTEX;
     }
-    if (p.get<bool>({"fullmutex", "full_mutex"}, false, false))
-    {
+    if (p.get<bool>({"fullmutex", "full_mutex"}, false, false)) {
         flags |= SQLITE_OPEN_FULLMUTEX;
     }
-    if (p.get<bool>({"nofollow", "no_follow"}, false, false))
-    {
+    if (p.get<bool>({"nofollow", "no_follow"}, false, false)) {
         flags |= SQLITE_OPEN_NOFOLLOW;
     }
-    if (!params.count("readonly") && !params.count("readwrite"))
-    {
+    if (!params.count("readonly") && !params.count("readwrite")) {
         flags |= SQLITE_OPEN_READWRITE;
     }
-    if (!params.count("create"))
-    {
+    if (!params.count("create")) {
         flags |= SQLITE_OPEN_CREATE;
     }
     auto res = sqlite3_open_v2(path.c_str(), &conn, flags, nullptr);
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         throw std::runtime_error("SQLiteSession::open: Failed to open database: " + std::string(sqlite3_errmsg(conn)));
     }
     IF_ENDBG dbLogger.debug("SQLiteSession::open: Opened database: " + std::string(path));
 }
 
-bool SQLiteSession::execute(const std::string& query)
-{
+bool SQLiteSession::execute(const std::string& query) {
     IF_ENDBG dbLogger.debug("SQLiteSession::execute: Executing > " + query);
     auto res = sqlite3_exec(conn, query.c_str(), nullptr, nullptr, nullptr);
     return res == SQLITE_OK;
 }
 
-Session& SQLiteSession::query(const std::string& query, std::function<bool(const Row&)> callback)
-{
+Session& SQLiteSession::query(const std::string& query, std::function<bool(const Row&)> callback) {
     IF_ENDBG dbLogger.debug("SQLiteSession::query: Querying > " + query);
     auto stmt = prepare(query);
     stmt->fetchAll(callback);
     return *this;
 }
 
-SharedPointer<Stmt> SQLiteSession::prepare(const std::string& query, bool autoExecute)
-{
+SharedPointer<Stmt> SQLiteSession::prepare(const std::string& query, bool autoExecute) {
     auto& stmt = SQLiteStmt::create(getOrSetSelf(), query, autoExecute);
     stmtPool.push_back(stmt);
     return stmt;
 }
 
-std::string SQLiteSession::getLastError() const
-{
+std::string SQLiteSession::getLastError() const {
     return std::string(sqlite3_errmsg(conn));
 }
 
-uint64_t SQLiteSession::getAffectedRows() const
-{
+uint64_t SQLiteSession::getAffectedRows() const {
     return sqlite3_changes(conn);
 }
 
-uint64_t SQLiteSession::getLastInsertId() const
-{
+uint64_t SQLiteSession::getLastInsertId() const {
     return sqlite3_last_insert_rowid(conn);
 }
 
-void SQLiteSession::close()
-{
-    while (!stmtPool.empty())
-    {
+void SQLiteSession::close() {
+    while (!stmtPool.empty()) {
         // Close all the active statements or it will error when closing
         auto& wptr = stmtPool.back();
         auto ptr = wptr.lock();
-        if (!wptr.expired() && ptr)
-        {
+        if (!wptr.expired() && ptr) {
             ptr->close();
         }
         stmtPool.pop_back();
     }
-    if (conn)
-    {
+    if (conn) {
         auto res = sqlite3_close(conn);
-        if (res != SQLITE_OK)
-        {
+        if (res != SQLITE_OK) {
             throw std::runtime_error("SQLiteSession::close: Failed to close database: " + std::string(sqlite3_errmsg(conn)));
         }
         conn = nullptr;
@@ -143,18 +115,15 @@ void SQLiteSession::close()
     }
 }
 
-bool SQLiteSession::isOpen()
-{
+bool SQLiteSession::isOpen() {
     return conn != nullptr;
 }
 
-DBType SQLiteSession::getType()
-{
+DBType SQLiteSession::getType() {
     return DBType::SQLite;
 }
 
-SharedPointer<Stmt> SQLiteSession::operator<<(const std::string& query)
-{
+SharedPointer<Stmt> SQLiteSession::operator<<(const std::string& query) {
     return prepare(query, true);
 }
 
diff --git a/LiteLoader/Kernel/DB/Impl/SQLite/Stmt.cpp b/LiteLoader/Kernel/DB/Impl/SQLite/Stmt.cpp
--- a/LiteLoader/Kernel/DB/Impl/SQLite/Stmt.cpp
+++ b/LiteLoader/Kernel/DB/Impl/SQLite/Stmt.cpp
@@ -3,25 +3,21 @@
 #include <LoggerAPI.h>
 #include <third-party/sqlite3/sqlite3.h>
 
-namespace DB
-{
+namespace DB {
 
 SQLiteStmt::SQLiteStmt(sqlite3_stmt* stmt, const std::weak_ptr<Session> parent, bool autoExecute)
-    : Stmt(parent, autoExecute)
-    , stmt(stmt)
-{
+: Stmt(parent, autoExecute)
+, stmt(stmt) {
     IF_ENDBG dbLogger.debug("SQLiteStmt::SQLiteStmt: Constructed! this: {}", (void*)this);
     totalParamsCount = sqlite3_bind_parameter_count(stmt);
-    if (!totalParamsCount && autoExecute) execute(); // Execute without params
+    if (!totalParamsCount && autoExecute)
+        execute(); // Execute without params
 }
 
-int SQLiteStmt::getNextParamIndex()
-{
+int SQLiteStmt::getNextParamIndex() {
     int result = -1;
-    for (int i = 0; i < boundIndexes.size() && i < totalParamsCount; i++)
-    {
-        if (boundIndexes[i] == result + 1)
-        {
+    for (int i = 0; i < boundIndexes.size() && i < totalParamsCount; i++) {
+        if (boundIndexes[i] == result + 1) {
             result++;
         }
     }
@@ -29,56 +25,46 @@ int SQLiteStmt::getNextParamIndex()
     return result + 1;
 }
 
-void SQLiteStmt::fetchResultHeader()
-{
-    if (!resultHeader) resultHeader.reset(new RowHeader);
+void SQLiteStmt::fetchResultHeader() {
+    if (!resultHeader)
+        resultHeader.reset(new RowHeader);
     int colCnt = sqlite3_column_count(stmt);
-    for (int i = 0; i < colCnt; i++)
-    {
+    for (int i = 0; i < colCnt; i++) {
         auto name = sqlite3_column_name(stmt, i);
         IF_ENDBG dbLogger.debug("SQLiteStmt::fetchResultHeader: Column Name[{}]: {}", i, name);
         resultHeader->add(name);
     }
 }
 
-SQLiteStmt::~SQLiteStmt()
-{
+SQLiteStmt::~SQLiteStmt() {
     IF_ENDBG dbLogger.debug("SQLiteStmt::~SQLiteStmt: Destructor: this: {}", (void*)this);
     close();
 }
 
-Stmt& SQLiteStmt::bind(const Any& value, int index)
-{
+Stmt& SQLiteStmt::bind(const Any& value, int index) {
     ++index; // Index starts at 1, but we need to start at 0
-    if (index <= 0 || index > totalParamsCount)
-    {
+    if (index <= 0 || index > totalParamsCount) {
         throw std::invalid_argument("SQLiteStmt::bind: Invalid argument `index`");
     }
-    if (getUnboundParams() == 0)
-    {
+    if (getUnboundParams() == 0) {
         throw std::runtime_error("SQLiteStmt::bind: All the parameters are already bound");
     }
     int res = SQLITE_OK;
     auto type = value.type;
-    switch (type)
-    {
+    switch (type) {
         case Any::Type::Null:
             res = sqlite3_bind_null(stmt, index);
             break;
         case Any::Type::Integer:
             res = sqlite3_bind_int64(stmt, index, value.get<int64_t>());
             break;
-        case Any::Type::UInteger:
-        {
+        case Any::Type::UInteger: {
             uint64_t val = value.get<uint64_t>();
-            if (val > LLONG_MAX)
-            {
+            if (val > LLONG_MAX) {
                 // The conversion of uint64 to double may result in loss of precision,
                 // so it is recommended to use string/blob for big numbers
                 res = sqlite3_bind_double(stmt, index, (double)val);
-            }
-            else
-            {
+            } else {
                 res = sqlite3_bind_int64(stmt, index, (int64_t)val);
             }
             break;
@@ -98,12 +84,10 @@ Stmt& SQLiteStmt::bind(const Any& value, int index)
         default:
             throw std::runtime_error("SQLiteStmt::bind: Unsupported type");
     }
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         std::string e = fmt::format("SQLiteStmt::bind: Failed to bind {} to parameter at index {}",
                                     Any::type2str(type), index);
-        if (auto s = parent.lock())
-        {
+        if (auto s = parent.lock()) {
             e += ": " + s->getLastError();
         }
         throw std::runtime_error(e);
@@ -114,52 +98,41 @@ Stmt& SQLiteStmt::bind(const Any& value, int index)
         execute(); // Execute the statement if all the parameters are bound
     return *this;
 }
-Stmt& SQLiteStmt::bind(const Any& value, const std::string& name)
-{
-    if (name.empty())
-    {
+Stmt& SQLiteStmt::bind(const Any& value, const std::string& name) {
+    if (name.empty()) {
         throw std::runtime_error("SQLiteStmt::bind: The name is empty");
     }
     std::vector<char> start{'?', ':', '@', '$'};
     int index = 0;
-    for (auto& s : start)
-    {
+    for (auto& s : start) {
         auto i = sqlite3_bind_parameter_index(stmt, (s + name).c_str());
-        if (i != 0)
-        {
-            if (index != 0)
-            {
+        if (i != 0) {
+            if (index != 0) {
                 throw std::runtime_error("SQLiteStmt::bind: Multiple parameters match the name `" + name + "`");
             }
             index = i;
         }
     }
-    if (index == 0)
-    {
+    if (index == 0) {
         // Tips: The first parameter of SQLiteStmt::bind is the value to bind, the second is the key!
         throw std::invalid_argument("SQLiteStmt::bind: There isn't any statement parameter named `" + name + "`!");
     }
     IF_ENDBG dbLogger.debug("SQLiteStmt::bind: Parameter `{}` is at index {}", name, index);
     return bind(value, index - 1);
 }
-Stmt& SQLiteStmt::bind(const Any& value)
-{
+Stmt& SQLiteStmt::bind(const Any& value) {
     return bind(value, getNextParamIndex());
 }
 
-Stmt& SQLiteStmt::execute()
-{
+Stmt& SQLiteStmt::execute() {
     step();
     return *this;
 }
 
-bool SQLiteStmt::step()
-{
+bool SQLiteStmt::step() {
     int res = sqlite3_step(stmt);
-    if (res == SQLITE_ROW || res == SQLITE_DONE)
-    {
-        if (!parent.expired() && !executed)
-        {
+    if (res == SQLITE_ROW || res == SQLITE_DONE) {
+        if (!parent.expired() && !executed) {
             auto s = parent.lock();
             affectedRowCount = s->getAffectedRows();
             insertRowId = s->getLastInsertId();
@@ -167,75 +140,61 @@ bool SQLiteStmt::step()
         }
         ++steps;
     }
-    if (res == SQLITE_ROW)
-    {
-        if (!resultHeader || resultHeader->empty())
-        {
+    if (res == SQLITE_ROW) {
+        if (!resultHeader || resultHeader->empty()) {
             fetchResultHeader();
         }
         IF_ENDBG dbLogger.debug("SQLiteStmt::step: Successfully");
         stepped = true;
         return true;
-    }
-    else if (res == SQLITE_DONE)
-    {
+    } else if (res == SQLITE_DONE) {
         IF_ENDBG dbLogger.debug("SQLiteStmt::step: The statment is done");
         stepped = false;
         return false;
-    }
-    else
-    {
+    } else {
         throw std::runtime_error("SQLiteStmt::step: Failed to step");
     }
 }
 
-bool SQLiteStmt::next()
-{
+bool SQLiteStmt::next() {
     return step();
 }
 
-bool SQLiteStmt::done()
-{
-    if (stepped) return false;
+bool SQLiteStmt::done() {
+    if (stepped)
+        return false;
     return !step();
 }
 
-Row SQLiteStmt::_Fetch()
-{
-    if (done()) return Row();
-    if (!resultHeader || resultHeader->empty())
-    {
+Row SQLiteStmt::_Fetch() {
+    if (done())
+        return Row();
+    if (!resultHeader || resultHeader->empty()) {
         fetchResultHeader();
     }
     Row row(resultHeader);
-    for (int i = 0; i < resultHeader->size(); i++)
-    {
-        switch (sqlite3_column_type(stmt, i))
-        {
+    for (int i = 0; i < resultHeader->size(); i++) {
+        switch (sqlite3_column_type(stmt, i)) {
             case SQLITE_INTEGER:
                 row.push_back(sqlite3_column_int64(stmt, i));
                 break;
             case SQLITE_FLOAT:
                 row.push_back(sqlite3_column_double(stmt, i));
                 break;
-            case SQLITE_TEXT:
-            {
+            case SQLITE_TEXT: {
                 std::string text(reinterpret_cast<const char*>(sqlite3_column_text(stmt, i)));
                 IF_ENDBG dbLogger.debug("SQLiteStmt::_Fetch: Fetched TEXT type column: {} {}", i, text);
                 row.push_back(text);
                 break;
             }
-            case SQLITE_BLOB:
-            {
+            case SQLITE_BLOB: {
                 ByteArray arr(
                     reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, i)),
                     reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, i)) +
                         sqlite3_column_bytes(stmt, i));
-                IF_ENDBG
-                {
+                IF_ENDBG {
                     std::string out = "SQLiteStmt::_Fetch: Fetched BLOB type column: " + std::to_string(i) + " ";
-                    for (auto& byte : arr)
-                    {
+                    for (auto& byte : arr) {
                         out += IntToHexStr(byte, true, true, false) + ' ';
                     }
                     dbLogger.debug(out);
@@ -253,11 +212,9 @@ Row SQLiteStmt::_Fetch()
     return row;
 }
 
-Stmt& SQLiteStmt::reset()
-{
+Stmt& SQLiteStmt::reset() {
     auto res = sqlite3_reset(stmt);
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         throw std::runtime_error("SQLiteStmt::reexec: Failed to reset");
     }
     IF_ENDBG dbLogger.debug("SQLiteStmt::reexec: Reset successfully");
@@ -270,24 +227,20 @@ Stmt& SQLiteStmt::reset()
     return *this;
 }
 
-Stmt& SQLiteStmt::reexec()
-{
+Stmt& SQLiteStmt::reexec() {
     reset();
     step(); // Execute
     return *this;
 }
 
-Stmt& SQLiteStmt::clear()
-{
+Stmt& SQLiteStmt::clear() {
     auto res = sqlite3_reset(stmt);
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         throw std::runtime_error("SQLiteStmt::clear: Failed to reset");
     }
     IF_ENDBG dbLogger.debug("SQLiteStmt::clear: Reset successfully");
     res = sqlite3_clear_bindings(stmt);
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         throw std::runtime_error("SQLiteStmt::clear: Failed to clear bindings");
     }
     IF_ENDBG dbLogger.debug("SQLiteStmt::clear: Cleared bindings successfully");
@@ -304,10 +257,8 @@ Stmt& SQLiteStmt::clear()
     return *this;
 }
 
-void SQLiteStmt::close()
-{
-    if (stmt)
-    {
+void SQLiteStmt::close() {
+    if (stmt) {
         sqlite3_finalize(stmt);
         stmt = nullptr;
     }
@@ -322,54 +273,46 @@ void SQLiteStmt::close()
     insertRowId = -1;
 }
 
-uint64_t SQLiteStmt::getAffectedRows() const
-{
+uint64_t SQLiteStmt::getAffectedRows() const {
     return affectedRowCount;
 }
 
-uint64_t SQLiteStmt::getInsertId() const
-{
+uint64_t SQLiteStmt::getInsertId() const {
     return insertRowId;
 }
 
-int SQLiteStmt::getUnboundParams() const
-{
+int SQLiteStmt::getUnboundParams() const {
     return totalParamsCount - boundParamsCount;
 }
 
-int SQLiteStmt::getBoundParams() const
-{
+int SQLiteStmt::getBoundParams() const {
     return boundParamsCount;
 }
 
-int SQLiteStmt::getParamsCount() const
-{
+int SQLiteStmt::getParamsCount() const {
     return totalParamsCount;
 }
 
-DBType SQLiteStmt::getType() const
-{
+DBType SQLiteStmt::getType() const {
     return DBType::SQLite;
 }
 
-SharedPointer<Stmt> SQLiteStmt::create(const std::weak_ptr<Session>& session, const std::string& sql, bool autoExecute)
-{
+SharedPointer<Stmt> SQLiteStmt::create(const std::weak_ptr<Session>& session, const std::string& sql, bool autoExecute) {
     auto s = session.lock();
-    if (!s || s->getType() != DBType::SQLite)
-    {
+    if (!s || s->getType() != DBType::SQLite) {
         throw std::invalid_argument("SQLiteStmt::create: Session is invalid");
     }
     sqlite3_stmt* stmt = nullptr;
     auto raw = (SQLiteSession*)s.get();
     int res = sqlite3_prepare_v2(raw->conn, sql.c_str(), -1, &stmt, nullptr);
-    if (res != SQLITE_OK)
-    {
+    if (res != SQLITE_OK) {
         throw std::runtime_error("SQLiteStmt::create: " + s->getLastError());
     }
     auto result = new SQLiteStmt(stmt, session, autoExecute);
     result->parent = session;
     result->setDebugOutput(raw->debugOutput);
-    if (raw->debugOutput) dbLogger.debug("SQLiteStmt::create: Prepared > " + sql);
+    if (raw->debugOutput)
+        dbLogger.debug("SQLiteStmt::create: Prepared > " + sql);
     auto shared = SharedPointer<Stmt>(result);
     result->self = shared;
     return shared;
diff --git a/LiteLoader/Kernel/DB/Row.cpp b/LiteLoader/Kernel/DB/Row.cpp
--- a/LiteLoader/Kernel/DB/Row.cpp
+++ b/LiteLoader/Kernel/DB/Row.cpp
@@ -1,36 +1,28 @@
 #include <DB/Row.h>
 
-namespace DB
-{
+namespace DB {
 
 RowHeader::RowHeader(const std::initializer_list<std::string>& list)
-    : std::vector<std::string>(list)
-{
+: std::vector<std::string>(list) {
 }
 
-RowHeader::~RowHeader()
-{
+RowHeader::~RowHeader() {
 }
 
-size_t RowHeader::add(const std::string& name)
-{
+size_t RowHeader::add(const std::string& name) {
     push_back(name);
     hashes.push_back(do_hash2(name));
     return size() - 1;
 }
 
-bool RowHeader::contains(const std::string& name)
-{
+bool RowHeader::contains(const std::string& name) {
     return std::find(hashes.begin(), hashes.end(), do_hash2(name)) != hashes.end();
 }
 
-void RowHeader::remove(const std::string& name)
-{
+void RowHeader::remove(const std::string& name) {
     auto hs = do_hash2(name);
-    for (size_t i = 0; i < size(); ++i)
-    {
-        if (hashes[i] == hs)
-        {
+    for (size_t i = 0; i < size(); ++i) {
+        if (hashes[i] == hs) {
             erase(begin() + i);
             hashes.erase(hashes.begin() + i);
             return;
@@ -39,50 +31,40 @@ void RowHeader::remove(const std::string& name)
     throw std::runtime_error("RowHeader::remove: Column " + name + " is not found");
 }
 
-size_t RowHeader::at(const std::string& name)
-{
+size_t RowHeader::at(const std::string& name) {
     auto hs = do_hash2(name);
-    for (size_t i = 0; i < size(); ++i)
-    {
+    for (size_t i = 0; i < size(); ++i) {
         if (hashes[i] == hs)
             return i;
     }
     throw std::out_of_range("RowHeader::at: Column " + name + " is not found");
 }
-std::string& RowHeader::at(size_t index)
-{
+std::string& RowHeader::at(size_t index) {
     return Base::at(index);
 }
 
-size_t RowHeader::size() const
-{
+size_t RowHeader::size() const {
     return Base::size();
 }
 
-bool RowHeader::empty() const
-{
+bool RowHeader::empty() const {
     return Base::empty();
 }
 
-std::vector<std::string>::iterator RowHeader::begin()
-{
+std::vector<std::string>::iterator RowHeader::begin() {
     return Base::begin();
 }
 
-std::vector<std::string>::iterator RowHeader::end()
-{
+std::vector<std::string>::iterator RowHeader::end() {
     return Base::end();
 }
 
-bool RowHeader::check(const Row& row) const
-{
+bool RowHeader::check(const Row& row) const {
     if (row.header.get() == this)
         return true;
 
-    if (row.size() == size())
-    {
-        if (row.header && !row.header->empty())
-        {
+    if (row.size() == size()) {
+        if (row.header && !row.header->empty()) {
             if (row.header->size() == size())
                 return true;
             else
@@ -93,138 +75,115 @@ bool RowHeader::check(const Row& row) const
     return false;
 }
 
-size_t RowHeader::operator[](const std::string& name)
-{
+size_t RowHeader::operator[](const std::string& name) {
     auto hs = do_hash2(name);
-    for (size_t i = 0; i < size(); ++i)
-    {
+    for (size_t i = 0; i < size(); ++i) {
         if (hashes[i] == hs)
             return i;
     }
     return add(name);
 }
-std::string& RowHeader::operator[](size_t index)
-{
+std::string& RowHeader::operator[](size_t index) {
     return at(index);
 }
 
 
 Row::Row(const std::shared_ptr<RowHeader>& header)
-    : header(header)
-{
+: header(header) {
 }
 Row::Row(const RowHeader& header)
-    : header(new RowHeader(header))
-{
+: header(new RowHeader(header)) {
 }
 Row::Row(const std::initializer_list<Any>& list, const RowHeader& header)
-    : std::vector<Any>(list)
-    , header(new RowHeader(header))
-{
-    if (!header.empty() && list.size() != header.size())
-    {
+: std::vector<Any>(list)
+, header(new RowHeader(header)) {
+    if (!header.empty() && list.size() != header.size()) {
         throw std::invalid_argument("Row::Row: The row and the header mismatch");
     }
 }
 Row::Row(const std::initializer_list<Any>& list, const std::shared_ptr<RowHeader>& header)
-    : std::vector<Any>(list)
-    , header(header)
-{
-    if (header != nullptr && list.size() != header->size())
-    {
+: std::vector<Any>(list)
+, header(header) {
+    if (header != nullptr && list.size() != header->size()) {
         throw std::invalid_argument("Row::Row: The row and the header mismatch");
     }
 }
 Row::Row(std::vector<Any>&& list, const RowHeader& header)
-    : std::vector<Any>(std::move(list))
-    , header(new RowHeader(header))
-{
-    if (size() != header.size())
-    {
+: std::vector<Any>(std::move(list))
+, header(new RowHeader(header)) {
+    if (size() != header.size()) {
         list = std::move(*this); // Restore
         throw std::invalid_argument("Row::Row: The row and the header mismatch");
     }
 }
 Row::Row(const std::vector<Any>& list, const RowHeader& header)
-    : std::vector<Any>(list)
-    , header(new RowHeader(header))
-{
-    if (list.size() != header.size())
-    {
+: std::vector<Any>(list)
+, header(new RowHeader(header)) {
+    if (list.size() != header.size()) {
         throw std::invalid_argument("Row::Row: The row and the header mismatch");
     }
 }
 Row::Row(const std::initializer_list<std::pair<std::string, Any>>& list)
-    : header(new RowHeader())
-{
-    for (auto& pair : list)
-    {
+: header(new RowHeader()) {
+    for (auto& pair : list) {
         header->add(pair.first);
         this->push_back(pair.second);
     }
 }
 Row::Row(Row&& row) noexcept
-    : header(row.header)
-{
+: header(row.header) {
     *this = std::move(row);
 }
 Row::Row(const Row& row)
-    : header(row.header)
-{
+: header(row.header) {
     *this = row;
 }
 
-Row& Row::operator=(Row&& row) noexcept
-{
+Row& Row::operator=(Row&& row) noexcept {
     header = row.header;
     this->swap(row);
     return *this;
 }
-Row& Row::operator=(const Row& row)
-{
+Row& Row::operator=(const Row& row) {
     header = row.header;
     this->assign(row.begin(), row.end());
     return *this;
 }
 
-Any& Row::operator[](const std::string& name)
-{
+Any& Row::operator[](const std::string& name) {
     auto idx = (*header)[name];
     if (idx < (int)size())
         return std::vector<Any>::at(idx);
     resize((size_t)idx + 1, Any());
     return std::vector<Any>::at(idx);
 }
-const Any& Row::operator[](const std::string& name) const
-{
+const Any& Row::operator[](const std::string& name) const {
     return std::vector<Any>::at(header->at(name));
 }
 
-Any& Row::at(const std::string& name)
-{
+Any& Row::at(const std::string& name) {
     return std::vector<Any>::at(header->at(name));
 }
-const Any& Row::at(const std::string& name) const
-{
+const Any& Row::at(const std::string& name) const {
     return std::vector<Any>::at(header->at(name));
 }
 
-void Row::forEach_ref(std::function<bool(const std::string&, Any&)> cb)
-{
-    if (!this->header) return;
-    for (auto& col : *this->header)
-    {
-        if (!cb(col, this->at(col))) break;
+void Row::forEach_ref(std::function<bool(const std::string&, Any&)> cb) {
+    if (!this->header)
+        return;
+    for (auto& col : *this->header) {
+        if (!cb(col, this->at(col)))
+            break;
     }
 }
 
-void Row::forEach(std::function<bool(const std::string&, const Any&)> cb) const
-{
-    if (!this->header) return;
+void Row::forEach(std::function<bool(const std::string&, const Any&)> cb) const {
+    if (!this->header)
+        return;
     int i = 0;
-    for (auto& col : *this->header)
-    {
-        if (!cb(col, this->data()[i])) break;
+    for (auto& col : *this->header) {
+        if (!cb(col, this->data()[i]))
+            break;
         i++;
     }
 }
diff --git a/LiteLoader/Kernel/DB/RowSet.cpp b/LiteLoader/Kernel/DB/RowSet.cpp
--- a/LiteLoader/Kernel/DB/RowSet.cpp
+++ b/LiteLoader/Kernel/DB/RowSet.cpp
@@ -1,128 +1,104 @@
 #include <DB/RowSet.h>
 
-namespace DB
-{
+namespace DB {
 
 RowSet::RowSet(const std::shared_ptr<RowHeader>& header)
-    : std::vector<Row>()
-    , header(header)
-{
-    if (!header)
-    {
+: std::vector<Row>()
+, header(header) {
+    if (!header) {
         this->header = std::make_shared<RowHeader>();
     }
 }
 
 RowSet::RowSet(const RowHeader& header)
-    : std::vector<Row>()
-    , header(new RowHeader(header))
-{
+: std::vector<Row>()
+, header(new RowHeader(header)) {
 }
 RowSet::RowSet(RowSet&& set) noexcept
-    : std::vector<Row>(std::move(set))
-    , header(set.header)
-{
+: std::vector<Row>(std::move(set))
+, header(set.header) {
 }
 RowSet::RowSet(const RowSet& set)
-    : std::vector<Row>(set)
-    , header(set.header)
-{
+: std::vector<Row>(set)
+, header(set.header) {
 }
-RowSet& RowSet::operator=(RowSet&& set) noexcept
-{
+RowSet& RowSet::operator=(RowSet&& set) noexcept {
     Base::operator=(std::move(set));
     header = set.header;
     return *this;
 }
-RowSet& RowSet::operator=(const RowSet& set)
-{
+RowSet& RowSet::operator=(const RowSet& set) {
     Base::operator=(set);
     header = set.header;
     return *this;
 }
 
-void RowSet::add(const Row& row)
-{
-    if (header && !header->empty())
-    {
+void RowSet::add(const Row& row) {
+    if (header && !header->empty()) {
         if (!header->check(row))
             throw std::runtime_error("RowSet::add: Row doesn't match header");
-    }
-    else if (row.header && !row.header->empty())
-    {
+    } else if (row.header && !row.header->empty()) {
         header = row.header;
     }
     Base::push_back(row);
-    if (!row.header || row.header->empty())
-    {
+    if (!row.header || row.header->empty()) {
         Base::back().header = header;
     }
 }
 
-bool RowSet::valid()
-{
-    if (!header) return false;
+bool RowSet::valid() {
+    if (!header)
+        return false;
     size_t rowSize = header->size();
-    if (!rowSize) return false;
-    for (auto& row : *this)
-    {
-        if (row.size() != rowSize) return false;
+    if (!rowSize)
+        return false;
+    for (auto& row : *this) {
+        if (row.size() != rowSize)
+            return false;
     }
     return true;
 }
 
-void RowSet::push_back(const Row& row)
-{
+void RowSet::push_back(const Row& row) {
     add(row);
 }
 
-std::string RowSet::toTableString(const std::string& nullPattern) const
-{
-    if (!header || !header->size()) return "";
+std::string RowSet::toTableString(const std::string& nullPattern) const {
+    if (!header || !header->size())
+        return "";
     std::string result, dividingLine;
     // Get the field widths
     std::vector<size_t> colWidths;
-    for (size_t i = 0; i < header->size(); ++i)
-    {
+    for (size_t i = 0; i < header->size(); ++i) {
         colWidths.push_back(header->at(i).size());
     }
-    for (auto& row : *this)
-    {
-        for (size_t i = 0; i < row.size(); ++i)
-        {
+    for (auto& row : *this) {
+        for (size_t i = 0; i < row.size(); ++i) {
             auto val = row.data()[i];
-            if (val.is_null())
-            {
+            if (val.is_null()) {
                 colWidths[i] = std::max(sizeof(nullPattern) - 1, colWidths[i]);
             }
             colWidths[i] = std::max(val.get<std::string>().size(), colWidths[i]);
         }
     }
     // Build the dividing line like '|====|=====|'
-    for (auto& w : colWidths)
-    {
+    for (auto& w : colWidths) {
         dividingLine += "|" + std::string(w + 2, '=');
     }
     dividingLine += "|\n";
     // Build the table header
-    for (size_t i = 0; i < header->size(); ++i)
-    {
+    for (size_t i = 0; i < header->size(); ++i) {
         result += fmt::format("| {:^{}} ", header->at(i), colWidths[i]);
     }
     result += "|\n";
     result += dividingLine;
     // Build the table body
-    for (auto& row : *this)
-    {
-        for (size_t i = 0; i < row.size(); ++i)
-        {
+    for (auto& row : *this) {
+        for (size_t i = 0; i < row.size(); ++i) {
             auto val = row.data()[i];
-            if (val.is_null())
-            {
+            if (val.is_null()) {
                 result += fmt::format("| {:<{}} ", nullPattern, colWidths[i]);
-            }
-            else
-            {
+            } else {
                 result += fmt::format("| {:<{}} ", val.get<std::string>(), colWidths[i]);
             }
         }
diff --git a/LiteLoader/Kernel/DB/Session.cpp b/LiteLoader/Kernel/DB/Session.cpp
--- a/LiteLoader/Kernel/DB/Session.cpp
+++ b/LiteLoader/Kernel/DB/Session.cpp
@@ -3,118 +3,92 @@
 #include <DB/Impl/SQLite/Session.h>
 #include <DB/Impl/MySQL/Session.h>
 
-namespace DB
-{
+namespace DB {
 
 Logger dbLogger("LLDB");
 
-void Session::setDebugOutput(bool enable)
-{
+void Session::setDebugOutput(bool enable) {
     debugOutput = enable;
 }
 
-bool Session::relogin(const std::string& user, const std::string& password, const std::string& db)
-{
+bool Session::relogin(const std::string& user, const std::string& password, const std::string& db) {
     throw std::runtime_error("Session::relogin: Not implemented");
 }
 
-ResultSet Session::query(const std::string& query)
-{
+ResultSet Session::query(const std::string& query) {
     bool headerSet = false;
     ResultSet result;
     this->query(query, [&](const Row& row) {
-        if (!headerSet)
-        {
+        if (!headerSet) {
             result.header = row.header;
             headerSet = true;
         }
         result.push_back(row);
         return true;
     });
-    IF_ENDBG
-    {
-        if (result.valid())
-        {
+    IF_ENDBG {
+        if (result.valid()) {
             dbLogger.debug("Session::query: Results >");
-            for (auto& str : SplitStrWithPattern(result.toTableString(), "\n"))
-            {
+            for (auto& str : SplitStrWithPattern(result.toTableString(), "\n")) {
                 dbLogger.debug(str);
             }
-        }
-        else 
-        {
+        } else {
             dbLogger.debug("Session::query: Query returned no result");
         }
     }
     return result;
 }
 
-std::string Session::getLastError() const
-{
+std::string Session::getLastError() const {
     throw std::runtime_error("Session::getLastError: Not implemented");
 }
 
-std::weak_ptr<Session> Session::getOrSetSelf()
-{
-    if (self.expired())
-    {
+std::weak_ptr<Session> Session::getOrSetSelf() {
+    if (self.expired()) {
         IF_ENDBG dbLogger.debug("Session::getOrSetSelf: `self` expired, trying fetching");
         return self = getSession(this);
     }
     return self;
 }
 
-SharedPointer<Stmt> Session::operator<<(const std::string& query)
-{
+SharedPointer<Stmt> Session::operator<<(const std::string& query) {
     return prepare(query);
 }
 
 
-SharedPointer<Session> Session::create(DBType type)
-{
+SharedPointer<Session> Session::create(DBType type) {
     return _Create(type);
 }
-SharedPointer<Session> Session::create(const ConnParams& params)
-{
+SharedPointer<Session> Session::create(const ConnParams& params) {
     static std::unordered_map<std::string, DBType> names{
-        {"sqlite",  DBType::SQLite},
+        {"sqlite", DBType::SQLite},
         {"sqlite3", DBType::SQLite},
-        {"file",    DBType::SQLite},
-        {"mysql",   DBType::MySQL},
-        {"mysqlc",  DBType::MySQL}
-    };
+        {"file", DBType::SQLite},
+        {"mysql", DBType::MySQL},
+        {"mysqlc", DBType::MySQL}};
     ConnParams copy = params;
     auto scheme = copy.getScheme();
     std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
-    if (names.count(scheme))
-    {
+    if (names.count(scheme)) {
         return _Create(names[scheme], params);
-    }
-    else
-    {
+    } else {
         throw std::runtime_error("Session::create: Unknown/Unsupported database type");
     }
 }
-SharedPointer<Session> Session::create(DBType type, const ConnParams& params)
-{
+SharedPointer<Session> Session::create(DBType type, const ConnParams& params) {
     return _Create(type, params);
 }
-SharedPointer<Session> Session::create(DBType type, const std::string& host, uint16_t port, const std::string& user, const std::string& password, const std::string& database)
-{
-    return _Create(type, 
-        {{"host", host}, {"port", port}, {"user", user}, {"password", password}, {"database", database}});
-    
+SharedPointer<Session> Session::create(DBType type, const std::string& host, uint16_t port, const std::string& user, const std::string& password, const std::string& database) {
+    return _Create(type,
+                   {{"host", host}, {"port", port}, {"user", user}, {"password", password}, {"database", database}});
 }
-SharedPointer<Session> Session::create(DBType type, const std::string& path)
-{
+SharedPointer<Session> Session::create(DBType type, const std::string& path) {
     return _Create(type, {{"path", path}});
 }
 
-SharedPointer<Session> Session::_Create(DBType type, const ConnParams& params)
-{
+SharedPointer<Session> Session::_Create(DBType type, const ConnParams& params) {
     Session* session = nullptr;
-    switch (type)
-    {
+    switch (type) {
         case DBType::SQLite:
             session = params.empty() ? new SQLiteSession() : new SQLiteSession(params);
             break;
@@ -124,8 +98,7 @@ SharedPointer<Session> Session::_Create(DBType type, const ConnParams& params)
         default:
             throw std::runtime_error("Session::_Create: Unknown/Unsupported database type");
     }
-    if (session)
-    {
+    if (session) {
         auto result = SharedPointer<Session>(session);
         result->self = result;
         sessionPool.push_back(result);
diff --git a/LiteLoader/Kernel/DB/Stmt.cpp b/LiteLoader/Kernel/DB/Stmt.cpp
--- a/LiteLoader/Kernel/DB/Stmt.cpp
+++ b/LiteLoader/Kernel/DB/Stmt.cpp
@@ -1,34 +1,27 @@
 #include <DB/Session.h>
 #include <LoggerAPI.h>
 
-namespace DB
-{
+namespace DB {
 
 Stmt::Stmt(const std::weak_ptr<Session>& parent, bool autoExecute)
-    : parent(parent)
-    , autoExecute(autoExecute)
-{
+: parent(parent)
+, autoExecute(autoExecute) {
 }
 
 
-Stmt::~Stmt()
-{
+Stmt::~Stmt() {
 }
 
-void Stmt::setDebugOutput(bool enable)
-{
+void Stmt::setDebugOutput(bool enable) {
     debugOutput = enable;
 }
 
-std::weak_ptr<Session> Stmt::getParent() const
-{
+std::weak_ptr<Session> Stmt::getParent() const {
     return parent;
 }
 
-SharedPointer<Stmt> Stmt::getSharedPointer() const
-{
-    if (!self.expired())
-    {
+SharedPointer<Stmt> Stmt::getSharedPointer() const {
+    if (!self.expired()) {
         return self.lock();
     }
     return nullptr;
@@ -56,22 +49,14 @@ SharedPointer<Stmt> Stmt::getSharedPointer() const
     */
 }
 
-SharedPointer<Stmt> Stmt::operator,(const BindType& b)
-{
-    if (b.name.empty() && b.idx == -1)
-    {
+SharedPointer<Stmt> Stmt::operator,(const BindType&b) {
+    if (b.name.empty() && b.idx == -1) {
         bind(b.value);
-    }
-    else if (!b.name.empty())
-    {
+    } else if (!b.name.empty()) {
         bind(b.value, b.name);
-    }
-    else if (b.idx != -1)
-    {
+    } else if (b.idx != -1) {
         bind(b.value, b.idx);
-    }
-    else
-    {
+    } else {
         throw std::invalid_argument("Stmt::operator,: Parameter `b`(const BindType&) is invalid");
     }
     return getSharedPointer();
diff --git a/LiteLoader/Kernel/EventAPI.cpp b/LiteLoader/Kernel/EventAPI.cpp
--- a/LiteLoader/Kernel/EventAPI.cpp
+++ b/LiteLoader/Kernel/EventAPI.cpp
@@ -72,9 +72,8 @@ extern Logger logger;
 
 int globalListenerId = 0;
 
-template<typename EVENT>
-struct ListenerData
-{
+template <typename EVENT>
+struct ListenerData {
     std::string pluginName;
     int listenerId;
     bool isRef;
@@ -82,84 +81,71 @@ struct ListenerData
     std::function<bool(EVENT&)> callbackRef;
 };
 
-template<typename EVENT>
+template <typename EVENT>
 std::list<ListenerData<EVENT>> listeners;
 
 
-/////////////////////////////// Listener Manager /////////////////////////////// 
+/////////////////////////////// Listener Manager ///////////////////////////////
 
-template<typename EVENT>
-int EventManager<EVENT>::addEventListener(std::string name, std::function<bool(EVENT)> callback)
-{
+template <typename EVENT>
+int EventManager<EVENT>::addEventListener(std::string name, std::function<bool(EVENT)> callback) {
     int newId = ++globalListenerId;
-    listeners<EVENT>.push_back({ name, newId, false, callback, nullptr });
+    listeners<EVENT>.push_back({name, newId, false, callback, nullptr});
     return newId;
 }
 
-template<typename EVENT>
-int EventManager<EVENT>::addEventListenerRef(std::string name, std::function<bool(EVENT&)> callback)
-{
+template <typename EVENT>
+int EventManager<EVENT>::addEventListenerRef(std::string name, std::function<bool(EVENT&)> callback) {
     int newId = ++globalListenerId;
-    listeners<EVENT>.push_back({ name, newId, true, nullptr, callback });
+    listeners<EVENT>.push_back({name, newId, true, nullptr, callback});
     return newId;
 }
 
-template<typename EVENT>
-bool EventManager<EVENT>::removeEventListener(int id)
-{
-    for(auto &i = listeners<EVENT>.begin(); i!=listeners<EVENT>.end(); ++i)
-        if (i->listenerId == id)
-        { listeners<EVENT>.erase(i); return true; }
+template <typename EVENT>
+bool EventManager<EVENT>::removeEventListener(int id) {
+    for (auto& i = listeners<EVENT>.begin(); i != listeners<EVENT>.end(); ++i)
+        if (i->listenerId == id) {
+            listeners<EVENT>.erase(i);
+            return true;
+        }
     return false;
 }
 
-template<typename EVENT>
-bool EventManager<EVENT>::hasListener()
-{
+template <typename EVENT>
+bool EventManager<EVENT>::hasListener() {
     return !listeners<EVENT>.empty();
 }
 
 
-/////////////////////////////// Event Calling /////////////////////////////// 
+/////////////////////////////// Event Calling ///////////////////////////////
 
-inline void OutputError(std::string errorMsg, int errorCode, std::string errorWhat, std::string eventName, std::string pluginName)
-{
+inline void OutputError(std::string errorMsg, int errorCode, std::string errorWhat, std::string eventName, std::string pluginName) {
     logger.error(errorMsg);
     logger.error("Error: Code [{}] {}", errorCode, errorWhat);
     logger.error("In Event ({})", eventName);
-    if (!pluginName.empty())
-    {
+    if (!pluginName.empty()) {
         auto plugin = LL::getPlugin(pluginName);
         if (plugin) {
             logger.error("In Plugin <{} {}>", plugin->name, plugin->version.toString());
-        }
-        else {
+        } else {
             logger.error("In Plugin <{}>", pluginName);
         }
     }
 }
 
-template<typename EVENT>
-bool EventManager<EVENT>::call(EVENT& ev)
-{
+template <typename EVENT>
+bool EventManager<EVENT>::call(EVENT& ev) {
     bool passToBDS = true;
-    for (auto i = listeners<EVENT>.begin(); i != listeners<EVENT>.end(); ++i)
-    {
+    for (auto i = listeners<EVENT>.begin(); i != listeners<EVENT>.end(); ++i) {
         try {
             bool res = i->isRef ? i->callbackRef(ev) : i->callback(ev);
             if (!res)
                 passToBDS = false;
-        }
-        catch (const seh_exception& e)
-        {
+        } catch (const seh_exception& e) {
             OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->pluginName);
-        }
-        catch (const std::exception& e)
-        {
+        } catch (const std::exception& e) {
             OutputError("Uncaught C++ Exception Detected!", errno, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->pluginName);
-        }
-        catch (...)
-        {
+        } catch (...) {
             OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), i->pluginName);
         }
     }
@@ -167,49 +153,42 @@ bool EventManager<EVENT>::call(EVENT& ev)
 
     ///////////////////////////////////// For compatibility DO NOT UPDATE /////////////////////////////////////
     auto iNoConst = ev.listenersNoConst.begin();
-    try { for (; iNoConst != ev.listenersNoConst.end(); ++iNoConst) if (!iNoConst->second(ev)) passToBDS = false;}
-    catch (const seh_exception& e)
-    { OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), iNoConst->first); }
-    catch (const std::exception& e)
-    { OutputError("Uncaught Exception Detected! ", -1, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), iNoConst->first); }
-    catch (...)
-    { OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), iNoConst->first); }
+    try {
+        for (; iNoConst != ev.listenersNoConst.end(); ++iNoConst)
+            if (!iNoConst->second(ev))
+                passToBDS = false;
+    } catch (const seh_exception& e) { OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), iNoConst->first); } catch (const std::exception& e) {
+        OutputError("Uncaught Exception Detected! ", -1, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), iNoConst->first);
+    } catch (...) { OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), iNoConst->first); }
     ///////////////////////////////////// For compatibility DO NOT UPDATE /////////////////////////////////////
     auto i = ev.listeners.begin();
-    try { for (; i != ev.listeners.end(); ++i) if (!i->second(ev)) passToBDS = false; }
-    catch (const seh_exception& e)
-    { OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->first); }
-    catch (const std::exception& e)
-    { OutputError("Uncaught Exception Detected! ", -1, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->first); }
-    catch (...)
-    { OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), i->first); }
+    try {
+        for (; i != ev.listeners.end(); ++i)
+            if (!i->second(ev))
+                passToBDS = false;
+    } catch (const seh_exception& e) { OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->first); } catch (const std::exception& e) {
+        OutputError("Uncaught Exception Detected! ", -1, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->first);
+    } catch (...) { OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), i->first); }
     ///////////////////////////////////// For compatibility DO NOT UPDATE /////////////////////////////////////
 
     return passToBDS;
 }
 
-template<typename EVENT>
-bool EventManager<EVENT>::callToPlugin(std::string pluginName, EVENT& ev)
-{
+template <typename EVENT>
+bool EventManager<EVENT>::callToPlugin(std::string pluginName, EVENT& ev) {
     bool passToBDS = true;
-    for (auto i = listeners<EVENT>.begin(); i != listeners<EVENT>.end(); ++i)
-    {
+    for (auto i = listeners<EVENT>.begin(); i != listeners<EVENT>.end(); ++i) {
         if (i->pluginName != pluginName)
             continue;
         try {
             bool res = i->isRef ? i->callbackRef(ev) : i->callback(ev);
-            if (!res) passToBDS = false;
-        }
-        catch (const seh_exception& e)
-        {
+            if (!res)
+                passToBDS = false;
+        } catch (const seh_exception& e) {
             OutputError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->pluginName);
-        }
-        catch (const std::exception& e)
-        {
+        } catch (const std::exception& e) {
             OutputError("Uncaught C++ Exception Detected!", errno, TextEncoding::toUTF8(e.what()), typeid(EVENT).name(), i->pluginName);
-        }
-        catch (...)
-        {
+        } catch (...) {
             OutputError("Uncaught Exception Detected!", -1, "", typeid(EVENT).name(), i->pluginName);
         }
     }
@@ -217,11 +196,11 @@ bool EventManager<EVENT>::callToPlugin(std::string pluginName, EVENT& ev)
 }
 
 
-/////////////////////////////// Event Declare /////////////////////////////// 
+/////////////////////////////// Event Declare ///////////////////////////////
 
-#define DECLARE_EVENT_DATA(EVENT) \
-    template class EventManager<EVENT>; \
-    /*********************** For Compatibility ***********************/ \
+#define DECLARE_EVENT_DATA(EVENT)                                                                    \
+    template class EventManager<EVENT>;                                                              \
+    /*********************** For Compatibility ***********************/                              \
     std::list<std::pair<string, std::function<bool(const EVENT&)>>> EventTemplate<EVENT>::listeners; \
     std::list<std::pair<string, std::function<bool(EVENT&)>>> EventTemplate<EVENT>::listenersNoConst;
 
@@ -246,6 +225,7 @@ DECLARE_EVENT_DATA(PlayerConsumeTotemEvent);
 DECLARE_EVENT_DATA(PlayerCmdEvent);
 DECLARE_EVENT_DATA(PlayerDestroyBlockEvent);
 DECLARE_EVENT_DATA(PlayerPlaceBlockEvent);
+DECLARE_EVENT_DATA(BlockPlacedByPlayerEvent);
 DECLARE_EVENT_DATA(PlayerEffectChangedEvent);
 DECLARE_EVENT_DATA(PlayerStartDestroyBlockEvent);
 DECLARE_EVENT_DATA(PlayerOpenContainerEvent);
@@ -298,14 +278,12 @@ DECLARE_EVENT_DATA(MobSpawnEvent);
 
 
 #ifdef ENABLE_SEH_PROTECTION
-#define IF_LISTENED(EVENT)    \
-    if (EVENT::hasListener()) \
-    {                         \
+#define IF_LISTENED(EVENT)      \
+    if (EVENT::hasListener()) { \
         try
 
 #define IF_LISTENED_END(EVENT)                        \
-    catch (...)                                       \
-    {                                                 \
+    catch (...) {                                     \
         logger.error("Event Callback Failed!");       \
         logger.error("Uncaught Exception Detected!"); \
         logger.error("In Event: " #EVENT "");         \
@@ -313,23 +291,20 @@ DECLARE_EVENT_DATA(MobSpawnEvent);
     }                                                 \
     }
 #else
-#define IF_LISTENED(EVENT)    \
-    if (EVENT::hasListener()) \
-    {
+#define IF_LISTENED(EVENT) \
+    if (EVENT::hasListener()) {
 #define IF_LISTENED_END(EVENT) }
 #endif
 
 
-/////////////////////////////// Events /////////////////////////////// 
+/////////////////////////////// Events ///////////////////////////////
 
 
 /////////////////// PreJoin ///////////////////
 TClasslessInstanceHook(void, "?sendLoginMessageLocal@ServerNetworkHandler@@QEAAXAEBVNetworkIdentifier@@"
-            "AEBVConnectionRequest@@AEAVServerPlayer@@@Z",
-      NetworkIdentifier* Ni, ConnectionRequest* a3, ServerPlayer* sp)
-{
-    IF_LISTENED(PlayerPreJoinEvent)
-    {
+                             "AEBVConnectionRequest@@AEAVServerPlayer@@@Z",
+                       NetworkIdentifier* Ni, ConnectionRequest* a3, ServerPlayer* sp) {
+    IF_LISTENED(PlayerPreJoinEvent) {
         PlayerPreJoinEvent ev{};
         ev.mPlayer = sp;
         ev.mIP = Ni->getIP();
@@ -344,10 +319,8 @@ TClasslessInstanceHook(void, "?sendLoginMessageLocal@ServerNetworkHandler@@QEAAX
 
 /////////////////// PlayerJoin ///////////////////
 TInstanceHook(bool, "?setLocalPlayerAsInitialized@ServerPlayer@@QEAAXXZ",
-              ServerPlayer)
-{
-    IF_LISTENED(PlayerJoinEvent)
-    {
+              ServerPlayer) {
+    IF_LISTENED(PlayerJoinEvent) {
         PlayerJoinEvent ev{};
         ev.mPlayer = this;
 
@@ -361,10 +334,8 @@ TInstanceHook(bool, "?setLocalPlayerAsInitialized@ServerPlayer@@QEAAXXZ",
 
 /////////////////// PlayerLeft ///////////////////
 THook(void, "?disconnect@ServerPlayer@@QEAAXXZ",
-      ServerPlayer* sp)
-{
-    IF_LISTENED(PlayerLeftEvent)
-    {
+      ServerPlayer* sp) {
+    IF_LISTENED(PlayerLeftEvent) {
         PlayerLeftEvent ev{};
         ev.mPlayer = sp;
         ev.mXUID = sp->getXuid();
@@ -376,13 +347,10 @@ THook(void, "?disconnect@ServerPlayer@@QEAAXXZ",
 
 /////////////////// PlayerRespawn ///////////////////
 TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VPlayerActionPacket@@$0A@@@UEBAXAEBVNetworkIdentifier@@AEAVNetEventCallback@@AEAV?$shared_ptr@VPacket@@@std@@@Z",
-                       NetworkIdentifier* id, ServerNetworkHandler* handler, void* pPacket)
-{
+                       NetworkIdentifier* id, ServerNetworkHandler* handler, void* pPacket) {
     PlayerActionPacket* packet = *(PlayerActionPacket**)pPacket;
-    if (packet->actionType == PlayerActionType::Respawn)
-    {
-        IF_LISTENED(PlayerRespawnEvent)
-        {
+    if (packet->actionType == PlayerActionType::Respawn) {
+        IF_LISTENED(PlayerRespawnEvent) {
             PlayerRespawnEvent ev{};
             ev.mPlayer = packet->getPlayerFromPacket(handler, id);
             if (!ev.mPlayer)
@@ -396,10 +364,8 @@ TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VPlayerA
 
 /////////////////// PlayerChat ///////////////////
 TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVTextPacket@@@Z",
-      ServerNetworkHandler, NetworkIdentifier* id, void* text)
-{
-    IF_LISTENED(PlayerChatEvent)
-    {
+              ServerNetworkHandler, NetworkIdentifier* id, void* text) {
+    IF_LISTENED(PlayerChatEvent) {
         Event::PlayerChatEvent ev{};
         ev.mPlayer = this->getServerPlayer(*id);
         if (!ev.mPlayer)
@@ -416,8 +382,7 @@ TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@A
 }
 
 /////////////////// PlayerChangeDim ///////////////////
-class ChangeDimensionRequest
-{
+class ChangeDimensionRequest {
 public:
     int mState;
     AutomaticID<Dimension, int> mFromDimensionId;
@@ -429,14 +394,12 @@ class ChangeDimensionRequest
 };
 
 TClasslessInstanceHook(bool, "?requestPlayerChangeDimension@Level@@UEAAXAEAVPlayer@@V?$unique_ptr@VChangeDimensionRequest@@U?$default_delete@VChangeDimensionRequest@@@std@@@std@@@Z",
-      Player* sp, std::unique_ptr<ChangeDimensionRequest> request)
-{
+                       Player* sp, std::unique_ptr<ChangeDimensionRequest> request) {
 
     if (request->mToDimensionId == sp->getDimensionId())
         return original(this, sp, std::move(request));
 
-    IF_LISTENED(PlayerChangeDimEvent)
-    {
+    IF_LISTENED(PlayerChangeDimEvent) {
         PlayerChangeDimEvent ev{};
         ev.mPlayer = sp;
         ev.mToDimensionId = request->mToDimensionId;
@@ -449,10 +412,8 @@ TClasslessInstanceHook(bool, "?requestPlayerChangeDimension@Level@@UEAAXAEAVPlay
 
 int num = 0;
 /////////////////// PlayerJump ///////////////////
-TInstanceHook(void, "?jumpFromGround@Player@@UEAAXXZ", Player)
-{
-    IF_LISTENED(PlayerJumpEvent)
-    {
+TInstanceHook(void, "?jumpFromGround@Player@@UEAAXXZ", Player) {
+    IF_LISTENED(PlayerJumpEvent) {
         PlayerJumpEvent ev{};
         ev.mPlayer = this;
         ev.call();
@@ -463,10 +424,8 @@ TInstanceHook(void, "?jumpFromGround@Player@@UEAAXXZ", Player)
 
 ////////////////// EntityTransform //////////////////
 TClasslessInstanceHook(void, "?maintainOldData@TransformationComponent@@QEAAXAEAVActor@@0AEBUTransformationDescription@@AEBUActorUniqueID@@AEBVLevel@@@Z",
-    Actor* beforeEntity, Actor* afterEntity, void* a4, ActorUniqueID* aid, Level* level)
-{
-    IF_LISTENED(EntityTransformEvent)
-    {
+                       Actor* beforeEntity, Actor* afterEntity, void* a4, ActorUniqueID* aid, Level* level) {
+    IF_LISTENED(EntityTransformEvent) {
         EntityTransformEvent ev{};
         ev.mBeforeEntityUniqueId = &beforeEntity->getActorUniqueId();
         ev.mAfterEntity = afterEntity;
@@ -478,10 +437,8 @@ TClasslessInstanceHook(void, "?maintainOldData@TransformationComponent@@QEAAXAEA
 
 /////////////////// PlayerSneak ///////////////////
 TClasslessInstanceHook(void, "?sendActorSneakChanged@ActorEventCoordinator@@QEAAXAEAVActor@@_N@Z",
-      Actor* ac, bool isSneaking)
-{
-    IF_LISTENED(PlayerSneakEvent)
-    {
+                       Actor* ac, bool isSneaking) {
+    IF_LISTENED(PlayerSneakEvent) {
         PlayerSneakEvent ev{};
         ev.mPlayer = (Player*)ac;
         ev.mIsSneaking = isSneaking;
@@ -496,10 +453,8 @@ TClasslessInstanceHook(void, "?sendActorSneakChanged@ActorEventCoordinator@@QEAA
 
 /////////////////// PlayerAttackEntity ///////////////////
 TInstanceHook(bool, "?attack@Player@@UEAA_NAEAVActor@@AEBW4ActorDamageCause@@@Z",
-      Player , Actor* ac, int* damageCause)
-{
-    IF_LISTENED(PlayerAttackEvent)
-    {
+              Player, Actor* ac, int* damageCause) {
+    IF_LISTENED(PlayerAttackEvent) {
         PlayerAttackEvent ev{};
         ev.mPlayer = this;
         ev.mTarget = ac;
@@ -516,10 +471,8 @@ TInstanceHook(bool, "?attack@Player@@UEAA_NAEAVActor@@AEBW4ActorDamageCause@@@Z"
 
 /////////////////// PlayerAttackBlock ///////////////////
 TInstanceHook(bool, "?attack@Block@@QEBA_NPEAVPlayer@@AEBVBlockPos@@@Z",
-    Block , Player* pl, BlockPos* bp)
-{
-    IF_LISTENED(PlayerAttackBlockEvent)
-    {
+              Block, Player* pl, BlockPos* bp) {
+    IF_LISTENED(PlayerAttackBlockEvent) {
         PlayerAttackBlockEvent ev{};
         ev.mPlayer = pl;
         ev.mItemStack = pl->getHandSlot();
@@ -533,10 +486,8 @@ TInstanceHook(bool, "?attack@Block@@QEBA_NPEAVPlayer@@AEBVBlockPos@@@Z",
 
 /////////////////// PlayerTakeItem ///////////////////
 TInstanceHook(bool, "?take@Player@@QEAA_NAEAVActor@@HH@Z",
-      Player , Actor* actor, int a2, int a3)
-{
-    IF_LISTENED(PlayerPickupItemEvent)
-    {
+              Player, Actor* actor, int a2, int a3) {
+    IF_LISTENED(PlayerPickupItemEvent) {
         ItemStack* it = nullptr;
         if (actor->isItemActor())
             it = ((ItemActor*)actor)->getItemStack();
@@ -556,12 +507,12 @@ bool isQDrop;
 bool isDieDrop;
 /////////////////// PlayerDropItem ///////////////////
 TInstanceHook(bool, "?drop@Player@@UEAA_NAEBVItemStack@@_N@Z",
-      Player, ItemStack* it, bool a3)
-{
-    if (isQDrop) return original(this, it, a3);
-    if (isDieDrop) return original(this, it, a3);
-    IF_LISTENED(PlayerDropItemEvent)
-    {
+              Player, ItemStack* it, bool a3) {
+    if (isQDrop)
+        return original(this, it, a3);
+    if (isDieDrop)
+        return original(this, it, a3);
+    IF_LISTENED(PlayerDropItemEvent) {
         PlayerDropItemEvent ev{};
         ev.mPlayer = this;
         ev.mItemStack = it;
@@ -569,14 +520,12 @@ TInstanceHook(bool, "?drop@Player@@UEAA_NAEBVItemStack@@_N@Z",
             return false;
     }
     IF_LISTENED_END(PlayerDropItemEvent)
-    return original(this,it,a3);
+    return original(this, it, a3);
 }
 
 /////////////////// PlayerConsumeTotem ///////////////////
-TInstanceHook(void, "?consumeTotem@Player@@UEAA_NXZ", Player)
-{
-    IF_LISTENED(PlayerConsumeTotemEvent)
-    {
+TInstanceHook(void, "?consumeTotem@Player@@UEAA_NXZ", Player) {
+    IF_LISTENED(PlayerConsumeTotemEvent) {
         PlayerConsumeTotemEvent ev{};
         ev.mPlayer = this;
         if (!ev.call())
@@ -589,10 +538,8 @@ TInstanceHook(void, "?consumeTotem@Player@@UEAA_NXZ", Player)
 
 /////////////////// PlayerEffectChanged ///////////////////
 // add
-TInstanceHook(void, "?onEffectAdded@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player, MobEffectInstance* effect)
-{
-    IF_LISTENED(PlayerEffectChangedEvent)
-    {
+TInstanceHook(void, "?onEffectAdded@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player, MobEffectInstance* effect) {
+    IF_LISTENED(PlayerEffectChangedEvent) {
         PlayerEffectChangedEvent ev{};
         ev.mPlayer = this;
         ev.mEventType = PlayerEffectChangedEvent::EventType::Add;
@@ -603,10 +550,8 @@ TInstanceHook(void, "?onEffectAdded@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z
     return original(this, effect);
 }
 // remove
-TInstanceHook(void, "?onEffectRemoved@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player , MobEffectInstance* effect)
-{
-    IF_LISTENED(PlayerEffectChangedEvent)
-    {
+TInstanceHook(void, "?onEffectRemoved@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player, MobEffectInstance* effect) {
+    IF_LISTENED(PlayerEffectChangedEvent) {
         PlayerEffectChangedEvent ev{};
         ev.mPlayer = this;
         ev.mEventType = PlayerEffectChangedEvent::EventType::Remove;
@@ -617,10 +562,8 @@ TInstanceHook(void, "?onEffectRemoved@ServerPlayer@@MEAAXAEAVMobEffectInstance@@
     return original(this, effect);
 }
 // update
-TInstanceHook(void, "?onEffectUpdated@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player, MobEffectInstance* effect)
-{
-    IF_LISTENED(PlayerEffectChangedEvent)
-    {
+TInstanceHook(void, "?onEffectUpdated@ServerPlayer@@MEAAXAEAVMobEffectInstance@@@Z", Player, MobEffectInstance* effect) {
+    IF_LISTENED(PlayerEffectChangedEvent) {
         PlayerEffectChangedEvent ev{};
         ev.mPlayer = this;
         ev.mEventType = PlayerEffectChangedEvent::EventType::Update;
@@ -634,10 +577,8 @@ TInstanceHook(void, "?onEffectUpdated@ServerPlayer@@MEAAXAEAVMobEffectInstance@@
 
 /////////////////// PlayerStartDestroyBlock ///////////////////
 TClasslessInstanceHook(void, "?sendBlockDestructionStarted@BlockEventCoordinator@@QEAAXAEAVPlayer@@AEBVBlockPos@@@Z",
-       Player* pl, BlockPos* bp)
-{
-    IF_LISTENED(PlayerStartDestroyBlockEvent)
-    {
+                       Player* pl, BlockPos* bp) {
+    IF_LISTENED(PlayerStartDestroyBlockEvent) {
         PlayerStartDestroyBlockEvent ev{};
         ev.mPlayer = pl;
         ev.mBlockInstance = Level::getBlockInstance(bp, Level::getBlockSource(pl));
@@ -650,18 +591,14 @@ TClasslessInstanceHook(void, "?sendBlockDestructionStarted@BlockEventCoordinator
 /////////////////// PlayerPlaceBlock ///////////////////
 #include <MC/ItemUseInventoryTransaction.hpp>
 TInstanceHook(char, "?checkBlockPermissions@BlockSource@@QEAA_NAEAVActor@@AEBVBlockPos@@EAEBVItemStackBase@@_N@Z",
-    BlockSource, Actor* ac, BlockPos* bp, unsigned __int8 facing, ItemStackBase* item, bool a6)
-{
-    if (ac->isPlayer())
-    {
-        IF_LISTENED(PlayerPlaceBlockEvent)
-        {
+              BlockSource, Actor* ac, BlockPos* bp, unsigned __int8 facing, ItemStackBase* item, bool a6) {
+    if (ac->isPlayer()) {
+        IF_LISTENED(PlayerPlaceBlockEvent) {
             auto pl = (Player*)ac;
             PlayerPlaceBlockEvent ev{};
             ev.mPlayer = pl;
             ev.mBlockInstance = this->getBlockInstance(*bp);
-            if (!ev.call())
-            {   // this pointer is not used.
+            if (!ev.call()) { // this pointer is not used.
                 ((ItemUseInventoryTransaction*)nullptr)->resendBlocksAroundArea(*pl, *bp, facing);
                 return false;
             }
@@ -671,6 +608,20 @@ TInstanceHook(char, "?checkBlockPermissions@BlockSource@@QEAA_NAEAVActor@@AEBVBl
     return original(this, ac, bp, facing, item, a6);
 }
 
+/////////////////// BlockPlacedByPlayerEvent ///////////////////
+TClasslessInstanceHook(void, "?sendBlockPlacedByPlayer@BlockEventCoordinator@@QEAAXAEAVPlayer@@AEBVBlock@@AEBVBlockPos@@_N@Z",
+    Player* pl, Block* bl, BlockPos* bp, bool a5)
+{
+    IF_LISTENED(BlockPlacedByPlayerEvent) {
+        BlockPlacedByPlayerEvent ev{};
+        ev.mPlayer = pl;
+        ev.mBlockInstance = BlockInstance::createBlockInstance(bl, *bp, pl->getDimensionId());
+        ev.call();
+    }
+    IF_LISTENED_END(BlockPlacedByPlayerEvent)
+    original(this, pl, bl, bp, a5);
+}
+
 /*
 #include <MC/BedrockBlocks.hpp>
 #include <mc/BlockLegacy.hpp>
@@ -719,7 +670,7 @@ TClasslessInstanceHook(bool, "?_useOn@BambooBlockItem@@UEBA_NAEAVItemStack@@AEAV
             if (onBlock == VanillaBlocks::mBambooBlock || onBlock == VanillaBlocks::mBambooSapling
                 || underBlock == VanillaBlocks::mBambooBlock || underBlock == VanillaBlocks::mBambooSapling)
                 return original(this, a2, a3, a4, a5, a6); // listen in BlockSource::mayPlace
-            
+
             PlayerPlaceBlockEvent ev{};
             ev.mPlayer = (Player*)a3;
             ev.mBlockInstance = BlockInstance::createBlockInstance(const_cast<Block*>(VanillaBlocks::mBambooSapling), a4, (int)a3->getDimensionId());
@@ -824,7 +775,7 @@ TClasslessInstanceHook(bool, "?_useOn@DoorItem@@EEBA_NAEAVItemStack@@AEAVActor@@
                 case 8:
                     v11 = VanillaBlocks::mWarpedDoor;
                     break;
-                case 9: 
+                case 9:
                     v11 = VanillaBlocks::mMangroveDoor;
                     break;
             }
@@ -856,7 +807,7 @@ TClasslessInstanceHook(bool, "?_useOn@RedStoneDustItem@@EEBA_NAEAVItemStack@@AEA
     return original(this, a2, a3, a4, a5, a6);
 }
 
-//THook(bool, "?_useOn@SignItem@@UEBA_NAEAVItemStack@@AEAVActor@@VBlockPos@@EMMM@Z", 
+//THook(bool, "?_useOn@SignItem@@UEBA_NAEAVItemStack@@AEAVActor@@VBlockPos@@EMMM@Z",
 //      class SignItem* a1, ItemStack* a2, Actor* a3, BlockPos a4, unsigned char a5, Vec3* a6)
 //{
 //    IF_LISTENED(PlayerPlaceBlockEvent)
@@ -946,13 +897,10 @@ TInstanceHook(bool, "?useOn@SeedItemComponentLegacy@@QEAA_NAEAVItemStack@@AEAVAc
 */
 
 /////////////////// PlayerOpenContainer ///////////////////
-TClasslessInstanceHook(__int64, "?onEvent@VanillaServerGameplayEventListener@@UEAA?AW4EventResult@@AEBUPlayerOpenContainerEvent@@@Z", void* a2)
-{
+TClasslessInstanceHook(__int64, "?onEvent@VanillaServerGameplayEventListener@@UEAA?AW4EventResult@@AEBUPlayerOpenContainerEvent@@@Z", void* a2) {
     Actor* pl = SymCall("??$tryUnwrap@VActor@@$$V@WeakEntityRef@@QEBAPEAVActor@@XZ", Actor*, void*)(a2);
-    if (pl->isPlayer())
-    {
-        IF_LISTENED(PlayerOpenContainerEvent)
-        {
+    if (pl->isPlayer()) {
+        IF_LISTENED(PlayerOpenContainerEvent) {
             BlockPos bp = dAccess<BlockPos>(a2, 28);
             PlayerOpenContainerEvent ev{};
             ev.mPlayer = (Player*)pl;
@@ -967,13 +915,11 @@ TClasslessInstanceHook(__int64, "?onEvent@VanillaServerGameplayEventListener@@UE
 }
 
 /////////////////// PlayerCloseContainer ///////////////////
-//chest
+// chest
 TInstanceHook(bool, "?stopOpen@ChestBlockActor@@UEAAXAEAVPlayer@@@Z",
-              ChestBlockActor, Player* pl)
-{
-    IF_LISTENED(PlayerCloseContainerEvent)
-    {
-        BlockActor* ba = (BlockActor*)((char*)this - 240); //IDA ChestBlockActor::stopOpen
+              ChestBlockActor, Player* pl) {
+    IF_LISTENED(PlayerCloseContainerEvent) {
+        BlockActor* ba = (BlockActor*)((char*)this - 240); // IDA ChestBlockActor::stopOpen
         BlockPos bp = ba->getPosition();
 
         PlayerCloseContainerEvent ev{};
@@ -985,13 +931,11 @@ TInstanceHook(bool, "?stopOpen@ChestBlockActor@@UEAAXAEAVPlayer@@@Z",
     IF_LISTENED_END(PlayerCloseContainerEvent)
     return original(this, pl);
 }
-//barrel
+// barrel
 TClasslessInstanceHook(bool, "?stopOpen@BarrelBlockActor@@UEAAXAEAVPlayer@@@Z",
-       Player* pl)
-{
-    IF_LISTENED(PlayerCloseContainerEvent)
-    {
-        BlockActor* ba = (BlockActor*)((char*)this - 240); //IDA ChestBlockActor::stopOpen
+                       Player* pl) {
+    IF_LISTENED(PlayerCloseContainerEvent) {
+        BlockActor* ba = (BlockActor*)((char*)this - 240); // IDA ChestBlockActor::stopOpen
         BlockPos bp = ba->getPosition();
 
         PlayerCloseContainerEvent ev{};
@@ -1006,12 +950,9 @@ TClasslessInstanceHook(bool, "?stopOpen@BarrelBlockActor@@UEAAXAEAVPlayer@@@Z",
 
 /////////////////// PlayerInventoryChange ///////////////////
 TInstanceHook(void, "?inventoryChanged@Player@@UEAAXAEAVContainer@@HAEBVItemStack@@1_N@Z",
-      Player , void* container, int slotNumber, ItemStack* oldItem, ItemStack* newItem, bool is)
-{
-    IF_LISTENED(PlayerInventoryChangeEvent)
-    {
-        if (this->isPlayer())
-        {
+              Player, void* container, int slotNumber, ItemStack* oldItem, ItemStack* newItem, bool is) {
+    IF_LISTENED(PlayerInventoryChangeEvent) {
+        if (this->isPlayer()) {
             PlayerInventoryChangeEvent ev{};
             ev.mPlayer = this;
             ev.mSlot = slotNumber;
@@ -1026,12 +967,9 @@ TInstanceHook(void, "?inventoryChanged@Player@@UEAAXAEAVContainer@@HAEBVItemStac
 
 /////////////////// PlayerMove ///////////////////
 TClasslessInstanceHook(void, "?sendPlayerMove@PlayerEventCoordinator@@QEAAXAEAVPlayer@@@Z",
-     Player* pl)
-{
-    IF_LISTENED(PlayerMoveEvent)
-    {
-        if (pl->isMoving())
-        {
+                       Player* pl) {
+    IF_LISTENED(PlayerMoveEvent) {
+        if (pl->isMoving()) {
             PlayerMoveEvent ev{};
             ev.mPlayer = pl;
             ev.mPos = pl->getPosition();
@@ -1044,19 +982,16 @@ TClasslessInstanceHook(void, "?sendPlayerMove@PlayerEventCoordinator@@QEAAXAEAVP
 
 /////////////////// PlayerSprint ///////////////////
 TInstanceHook(void, "?setSprinting@Mob@@UEAAX_N@Z",
-      Mob , bool sprinting)
-{
-    IF_LISTENED(PlayerSprintEvent)
-    {
-        if (this->isPlayer() && this->isSprinting() != sprinting)
-        {
+              Mob, bool sprinting) {
+    IF_LISTENED(PlayerSprintEvent) {
+        if (this->isPlayer() && this->isSprinting() != sprinting) {
             PlayerSprintEvent ev{};
             ev.mPlayer = (Player*)this;
             ev.mIsSprinting = sprinting;
             if (!ev.call())
                 return;
 
-            //sprinting = ev.mIsSprinting;
+            // sprinting = ev.mIsSprinting;
         }
     }
     IF_LISTENED_END(PlayerSprintEvent)
@@ -1066,13 +1001,10 @@ TInstanceHook(void, "?setSprinting@Mob@@UEAAX_N@Z",
 #include <MC/SimpleContainer.hpp>
 /////////////////// PlayerSetArmor ///////////////////
 TInstanceHook(void, "?setArmor@Player@@UEAAXW4ArmorSlot@@AEBVItemStack@@@Z",
-      Player, unsigned slot, ItemStack* it)
-{
+              Player, unsigned slot, ItemStack* it) {
     original(this, slot, it);
-    IF_LISTENED(PlayerSetArmorEvent)
-    {
-        if (this->isPlayer())
-        {
+    IF_LISTENED(PlayerSetArmorEvent) {
+        if (this->isPlayer()) {
             PlayerSetArmorEvent ev{};
             ev.mPlayer = this;
             ev.mSlot = slot;
@@ -1086,7 +1018,8 @@ TInstanceHook(void, "?setArmor@Player@@UEAAXW4ArmorSlot@@AEBVItemStack@@@Z",
                     auto sp = Global<Level>->getPlayer(uid);
                     if (sp)
                         sp->refreshInventory();
-                },1);
+                },
+                                1);
             }
         }
     }
@@ -1095,10 +1028,8 @@ TInstanceHook(void, "?setArmor@Player@@UEAAXW4ArmorSlot@@AEBVItemStack@@@Z",
 
 /////////////////// PlayerUseRespawnAnchor ///////////////////
 TInstanceHook(bool, "?trySetSpawn@RespawnAnchorBlock@@CA_NAEAVPlayer@@AEBVBlockPos@@AEAVBlockSource@@AEAVLevel@@@Z",
-      Player , BlockPos* bp, BlockSource* bs, Level* a4)
-{
-    IF_LISTENED(PlayerUseRespawnAnchorEvent)
-    {
+              Player, BlockPos* bp, BlockSource* bs, Level* a4) {
+    IF_LISTENED(PlayerUseRespawnAnchorEvent) {
         PlayerUseRespawnAnchorEvent ev{};
         ev.mPlayer = this;
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
@@ -1110,10 +1041,8 @@ TInstanceHook(bool, "?trySetSpawn@RespawnAnchorBlock@@CA_NAEAVPlayer@@AEBVBlockP
 }
 
 /////////////////// PlayerOpenContainerScreen ///////////////////
-TInstanceHook(bool, "?canOpenContainerScreen@Player@@UEAA_NXZ",Player)
-{
-    IF_LISTENED(PlayerOpenContainerScreenEvent)
-    {
+TInstanceHook(bool, "?canOpenContainerScreen@Player@@UEAA_NXZ", Player) {
+    IF_LISTENED(PlayerOpenContainerScreenEvent) {
         PlayerOpenContainerScreenEvent ev{};
         ev.mPlayer = this;
         if (!ev.call())
@@ -1125,17 +1054,14 @@ TInstanceHook(bool, "?canOpenContainerScreen@Player@@UEAA_NXZ",Player)
 
 /////////////////// PlayerCmdEvent & ConsoleCmd ///////////////////
 TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCRESULT@@V?$shared_ptr@VCommandContext@@@std@@_N@Z",
-       MCRESULT* rtn, std::shared_ptr<CommandContext> context, bool print)
-{
+                       MCRESULT* rtn, std::shared_ptr<CommandContext> context, bool print) {
     Player* sp;
     string cmd;
 
-    try
-    {
+    try {
         sp = context->getOrigin().getPlayer();
         cmd = context->getCmd();
-        if (!cmd.empty() && cmd.at(0) == '/')
-        {
+        if (!cmd.empty() && cmd.at(0) == '/') {
             cmd = cmd.substr(1, cmd.size() - 1);
         }
 
@@ -1143,21 +1069,16 @@ TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCR
             logger.error("Detected invalid utf-8 character, command will not be executed");
             return rtn;
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         return rtn;
     }
 
-    if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id())
-    {
+    if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) {
         logger.warn("The thread executing the command \"{}\" is not the \"MC_SERVER\" thread", cmd);
     }
-    if (sp)
-    {
-        //PlayerCmd
-        IF_LISTENED(PlayerCmdEvent)
-        {
+    if (sp) {
+        // PlayerCmd
+        IF_LISTENED(PlayerCmdEvent) {
             PlayerCmdEvent ev{};
             ev.mCommand = cmd;
             ev.mPlayer = sp;
@@ -1172,12 +1093,9 @@ TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCR
                 context->getCmd() = ev.mCommand;
         }
         IF_LISTENED_END(PlayerCmdEvent)
-    }
-    else
-    {
-        //ConsoleCmd
-        IF_LISTENED(ConsoleCmdEvent)
-        {
+    } else {
+        // ConsoleCmd
+        IF_LISTENED(ConsoleCmdEvent) {
             ConsoleCmdEvent ev{};
             ev.mCommand = cmd;
 
@@ -1195,10 +1113,8 @@ TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCR
 }
 
 /////////////////// PlayerExperienceAddEvent ///////////////////
-TInstanceHook(void, "?addExperience@Player@@UEAAXH@Z", Player , int exp)
-{
-    IF_LISTENED(PlayerExperienceAddEvent)
-    {
+TInstanceHook(void, "?addExperience@Player@@UEAAXH@Z", Player, int exp) {
+    IF_LISTENED(PlayerExperienceAddEvent) {
         PlayerExperienceAddEvent ev{};
         ev.mPlayer = this;
         ev.mExp = exp;
@@ -1211,19 +1127,14 @@ TInstanceHook(void, "?addExperience@Player@@UEAAXH@Z", Player , int exp)
 
 /////////////////// CmdBlockExecute ///////////////////
 TInstanceHook(bool, "?_performCommand@BaseCommandBlock@@AEAA_NAEAVBlockSource@@AEBVCommandOrigin@@AEA_N@Z",
-      BaseCommandBlock , BlockSource* a2, CommandOrigin* a3, bool* a4)
-{
-    IF_LISTENED(CmdBlockExecuteEvent)
-    {
+              BaseCommandBlock, BlockSource* a2, CommandOrigin* a3, bool* a4) {
+    IF_LISTENED(CmdBlockExecuteEvent) {
         CmdBlockExecuteEvent ev{};
         ev.mCommand = this->getCommand();
-        if ((OriginType)a3->getOriginType() == OriginType::MinecartBlock)
-        {
+        if ((OriginType)a3->getOriginType() == OriginType::MinecartBlock) {
             ev.mIsMinecart = true;
             ev.mMinecart = a3->getEntity();
-        }
-        else
-        {
+        } else {
             ev.mIsMinecart = false;
             ev.mBlockInstance = Level::getBlockInstance(a3->getBlockPosition(), a2);
         }
@@ -1237,11 +1148,9 @@ TInstanceHook(bool, "?_performCommand@BaseCommandBlock@@AEAA_NAEAVBlockSource@@A
 
 /////////////////// BlockInteracted ///////////////////
 TClasslessInstanceHook(unsigned short,
-      "?onBlockInteractedWith@VanillaServerGameplayEventListener@@UEAA?AW4EventResult@@AEAVPlayer@@AEBVBlockPos@@@Z",
-       Player* pl, BlockPos* bp)
-{
-    IF_LISTENED(BlockInteractedEvent)
-    {
+                       "?onBlockInteractedWith@VanillaServerGameplayEventListener@@UEAA?AW4EventResult@@AEAVPlayer@@AEBVBlockPos@@@Z",
+                       Player* pl, BlockPos* bp) {
+    IF_LISTENED(BlockInteractedEvent) {
         BlockInteractedEvent ev{};
         ev.mPlayer = pl;
         ev.mBlockInstance = Level::getBlockInstance(bp, pl->getDimensionId());
@@ -1254,10 +1163,8 @@ TClasslessInstanceHook(unsigned short,
 
 /////////////////// BlockChanged ///////////////////
 TInstanceHook(void, "?_blockChanged@BlockSource@@IEAAXAEBVBlockPos@@IAEBVBlock@@1HPEBUActorBlockSyncMessage@@PEAVActor@@@Z",
-              BlockSource, BlockPos* bp, int a3, Block* afterBlock, Block* beforeBlock, int a6, void* a7, Actor* ac)
-{
-    IF_LISTENED(BlockChangedEvent)
-    {
+              BlockSource, BlockPos* bp, int a3, Block* afterBlock, Block* beforeBlock, int a6, void* a7, Actor* ac) {
+    IF_LISTENED(BlockChangedEvent) {
         int dimId = this->getDimensionId();
         BlockChangedEvent ev{};
         ev.mPreviousBlockInstance = BlockInstance::createBlockInstance(beforeBlock, *bp, dimId);
@@ -1266,17 +1173,14 @@ TInstanceHook(void, "?_blockChanged@BlockSource@@IEAAXAEBVBlockPos@@IAEBVBlock@@
             return;
     }
     IF_LISTENED_END(BlockChangedEvent)
-    return original(this, bp, a3, afterBlock, beforeBlock, a6, a7,ac);
+    return original(this, bp, a3, afterBlock, beforeBlock, a6, a7, ac);
 }
 
 /////////////////// BlockExploded ///////////////////
 TInstanceHook(void, "?onExploded@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@@Z",
-      Block, BlockSource* bs, BlockPos* bp, Actor* actor)
-{
-    IF_LISTENED(BlockExplodedEvent)
-    {
-        if (actor)
-        {
+              Block, BlockSource* bs, BlockPos* bp, Actor* actor) {
+    IF_LISTENED(BlockExplodedEvent) {
+        if (actor) {
             BlockExplodedEvent ev{};
             ev.mBlockInstance = BlockInstance::createBlockInstance(this, *bp, bs->getDimensionId());
             ev.mExplodeSource = actor;
@@ -1292,22 +1196,19 @@ TInstanceHook(void, "?onExploded@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@@PEAV
 bool onFireSpread_OnPlace = false;
 
 TClasslessInstanceHook(void, "?onPlace@FireBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@@Z",
-     BlockSource* bs, BlockPos* bp)
-{
+                       BlockSource* bs, BlockPos* bp) {
     onFireSpread_OnPlace = true;
     original(this, bs, bp);
     onFireSpread_OnPlace = false;
 }
 
 TClasslessInstanceHook(bool, "?mayPlace@FireBlock@@UEBA_NAEAVBlockSource@@AEBVBlockPos@@@Z",
-      BlockSource* bs, BlockPos* bp)
-{
+                       BlockSource* bs, BlockPos* bp) {
     auto rtn = original(this, bs, bp);
     if (!onFireSpread_OnPlace || !rtn)
         return rtn;
 
-    IF_LISTENED(FireSpreadEvent)
-    {
+    IF_LISTENED(FireSpreadEvent) {
         FireSpreadEvent ev{};
         ev.mTarget = *bp;
         ev.mDimensionId = bs->getDimensionId();
@@ -1323,14 +1224,11 @@ TClasslessInstanceHook(bool, "?mayPlace@FireBlock@@UEBA_NAEAVBlockSource@@AEBVBl
 #include <MC/LevelContainerModel.hpp>
 
 TInstanceHook(void, "?_onItemChanged@LevelContainerModel@@MEAAXHAEBVItemStack@@0@Z",
-      LevelContainerModel , int slotNumber, ItemStack* oldItem, ItemStack* newItem)
-{
-    IF_LISTENED(ContainerChangeEvent)
-    {
-        Player* pl = (Player*)dAccess<Actor*>(this, 208); //IDA LevelContainerModel::LevelContainerModel
+              LevelContainerModel, int slotNumber, ItemStack* oldItem, ItemStack* newItem) {
+    IF_LISTENED(ContainerChangeEvent) {
+        Player* pl = (Player*)dAccess<Actor*>(this, 208); // IDA LevelContainerModel::LevelContainerModel
 
-        if (pl->hasOpenContainer())
-        {
+        if (pl->hasOpenContainer()) {
             BlockPos* bp = (BlockPos*)((char*)this + 216);
 
             ContainerChangeEvent ev{};
@@ -1351,15 +1249,12 @@ TInstanceHook(void, "?_onItemChanged@LevelContainerModel@@MEAAXHAEBVItemStack@@0
 
 /////////////////// ProjectileHitBlock ///////////////////
 TInstanceHook(void, "?onProjectileHit@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@@AEBVActor@@@Z",
-      Block, BlockSource* bs, BlockPos* bp, Actor* actor)
-{
+              Block, BlockSource* bs, BlockPos* bp, Actor* actor) {
     // Exclude default position BlockPos::Zero
-    if ((bp->x | bp->y | bp->z) == 0) //actor->getPos().distanceTo(bp->center())>5)
+    if ((bp->x | bp->y | bp->z) == 0) // actor->getPos().distanceTo(bp->center())>5)
         return original(this, bs, bp, actor);
-    IF_LISTENED(ProjectileHitBlockEvent)
-    {
-        if (this->getTypeName() != "minecraft:air")
-        {
+    IF_LISTENED(ProjectileHitBlockEvent) {
+        if (this->getTypeName() != "minecraft:air") {
             ProjectileHitBlockEvent ev{};
             ev.mBlockInstance = Level::getBlockInstance(bp, bs);
             ev.mSource = actor;
@@ -1374,10 +1269,8 @@ TInstanceHook(void, "?onProjectileHit@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@
 /////////////////// RedStoneUpdate ///////////////////
 // 红石粉
 TClasslessInstanceHook(void, "?onRedstoneUpdate@RedStoneWireBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@H_N@Z",
-      BlockSource* bs, BlockPos* bp, int level, bool isActive)
-{
-    IF_LISTENED(RedStoneUpdateEvent)
-    {
+                       BlockSource* bs, BlockPos* bp, int level, bool isActive) {
+    IF_LISTENED(RedStoneUpdateEvent) {
         RedStoneUpdateEvent ev{};
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
         ev.mRedStonePower = level;
@@ -1392,10 +1285,8 @@ TClasslessInstanceHook(void, "?onRedstoneUpdate@RedStoneWireBlock@@UEBAXAEAVBloc
 }
 // 红石火把
 TClasslessInstanceHook(void, "?onRedstoneUpdate@RedstoneTorchBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@H_N@Z",
-      BlockSource* bs, BlockPos* bp, int level, bool isActive)
-{
-    IF_LISTENED(RedStoneUpdateEvent)
-    {
+                       BlockSource* bs, BlockPos* bp, int level, bool isActive) {
+    IF_LISTENED(RedStoneUpdateEvent) {
         RedStoneUpdateEvent ev{};
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
         ev.mRedStonePower = level;
@@ -1410,10 +1301,8 @@ TClasslessInstanceHook(void, "?onRedstoneUpdate@RedstoneTorchBlock@@UEBAXAEAVBlo
 }
 // 红石中继器
 TClasslessInstanceHook(void, "?onRedstoneUpdate@DiodeBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@H_N@Z",
-       BlockSource* bs, BlockPos* bp, int level, bool isActive)
-{
-    IF_LISTENED(RedStoneUpdateEvent)
-    {
+                       BlockSource* bs, BlockPos* bp, int level, bool isActive) {
+    IF_LISTENED(RedStoneUpdateEvent) {
         RedStoneUpdateEvent ev{};
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
         ev.mRedStonePower = level;
@@ -1428,10 +1317,8 @@ TClasslessInstanceHook(void, "?onRedstoneUpdate@DiodeBlock@@UEBAXAEAVBlockSource
 }
 // 红石比较器
 TClasslessInstanceHook(void, "?onRedstoneUpdate@ComparatorBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@H_N@Z",
-       BlockSource* bs, BlockPos* bp, int level, bool isActive)
-{
-    IF_LISTENED(RedStoneUpdateEvent)
-    {
+                       BlockSource* bs, BlockPos* bp, int level, bool isActive) {
+    IF_LISTENED(RedStoneUpdateEvent) {
         RedStoneUpdateEvent ev{};
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
         ev.mRedStonePower = level;
@@ -1448,20 +1335,15 @@ TClasslessInstanceHook(void, "?onRedstoneUpdate@ComparatorBlock@@UEBAXAEAVBlockS
 
 /////////////////// HopperSearchItem ///////////////////
 TClasslessInstanceHook(bool, "?_tryPullInItemsFromAboveContainer@Hopper@@IEAA_NAEAVBlockSource@@AEAVContainer@@AEBVVec3@@@Z",
-       BlockSource* bs, void* container, Vec3* pos)
-{
+                       BlockSource* bs, void* container, Vec3* pos) {
     bool isMinecart = dAccess<bool>(this, 5); // IDA Hopper::Hopper
 
-    IF_LISTENED(HopperSearchItemEvent)
-    {
+    IF_LISTENED(HopperSearchItemEvent) {
         HopperSearchItemEvent ev{};
-        if (isMinecart)
-        {
+        if (isMinecart) {
             ev.isMinecart = true;
             ev.mMinecartPos = *pos;
-        }
-        else
-        {
+        } else {
             ev.isMinecart = false;
             ev.mHopperBlock = Level::getBlockInstance(pos->toBlockPos(), bs);
         }
@@ -1475,10 +1357,8 @@ TClasslessInstanceHook(bool, "?_tryPullInItemsFromAboveContainer@Hopper@@IEAA_NA
 
 /////////////////// HopperPushOut ///////////////////
 TClasslessInstanceHook(bool, "?_pushOutItems@Hopper@@IEAA_NAEAVBlockSource@@AEAVContainer@@AEBVVec3@@H@Z",
-      BlockSource* bs, void* container, Vec3* pos, int a5)
-{
-    IF_LISTENED(HopperPushOutEvent)
-    {
+                       BlockSource* bs, void* container, Vec3* pos, int a5) {
+    IF_LISTENED(HopperPushOutEvent) {
         HopperPushOutEvent ev{};
         ev.mPos = *pos;
         ev.mDimensionId = bs->getDimensionId();
@@ -1491,10 +1371,8 @@ TClasslessInstanceHook(bool, "?_pushOutItems@Hopper@@IEAA_NAEAVBlockSource@@AEAV
 
 /////////////////// PistonTryPushEvent & PistonPushEvent ///////////////////
 TInstanceHook(bool, "?_attachedBlockWalker@PistonBlockActor@@AEAA_NAEAVBlockSource@@AEBVBlockPos@@EE@Z",
-    PistonBlockActor, BlockSource* bs, BlockPos* bp, char a3, char a4)
-{
-    IF_LISTENED(PistonTryPushEvent)
-    {
+              PistonBlockActor, BlockSource* bs, BlockPos* bp, char a3, char a4) {
+    IF_LISTENED(PistonTryPushEvent) {
         PistonTryPushEvent ev{};
         ev.mTargetBlockInstance = Level::getBlockInstance(bp, bs);
         if (ev.mTargetBlockInstance.getBlock()->getTypeName() == "minecraft:air")
@@ -1511,8 +1389,7 @@ TInstanceHook(bool, "?_attachedBlockWalker@PistonBlockActor@@AEAA_NAEAVBlockSour
     if (!res)
         return false;
 
-    IF_LISTENED(PistonPushEvent)
-    {
+    IF_LISTENED(PistonPushEvent) {
         PistonPushEvent ev{};
         ev.mTargetBlockInstance = Level::getBlockInstance(bp, bs);
         if (ev.mTargetBlockInstance.getBlock()->getTypeName() == "minecraft:air")
@@ -1529,10 +1406,8 @@ TInstanceHook(bool, "?_attachedBlockWalker@PistonBlockActor@@AEAA_NAEAVBlockSour
 
 /////////////////// FarmLandDecay ///////////////////
 TClasslessInstanceHook(void, "?transformOnFall@FarmBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@M@Z",
-      BlockSource* bs, BlockPos* bp, Actor* ac, float a5)
-{
-    IF_LISTENED(FarmLandDecayEvent)
-    {
+                       BlockSource* bs, BlockPos* bp, Actor* ac, float a5) {
+    IF_LISTENED(FarmLandDecayEvent) {
         FarmLandDecayEvent ev{};
         ev.mBlockInstance = Level::getBlockInstance(bp, bs);
         ev.mActor = ac;
@@ -1546,10 +1421,8 @@ TClasslessInstanceHook(void, "?transformOnFall@FarmBlock@@UEBAXAEAVBlockSource@@
 
 /////////////////// PlayerUseFrameBlockEvent  ///////////////////
 TClasslessInstanceHook(bool, "?use@ItemFrameBlock@@UEBA_NAEAVPlayer@@AEBVBlockPos@@E@Z",
-      Player* a2, BlockPos* a3)
-{
-    IF_LISTENED(PlayerUseFrameBlockEvent)
-    {
+                       Player* a2, BlockPos* a3) {
+    IF_LISTENED(PlayerUseFrameBlockEvent) {
         PlayerUseFrameBlockEvent ev{};
         ev.mType = PlayerUseFrameBlockEvent::Type::Use;
         ev.mBlockInstance = Level::getBlockInstance(a3, a2->getDimensionId());
@@ -1562,10 +1435,8 @@ TClasslessInstanceHook(bool, "?use@ItemFrameBlock@@UEBA_NAEAVPlayer@@AEBVBlockPo
 }
 
 TClasslessInstanceHook(bool, "?attack@ItemFrameBlock@@UEBA_NPEAVPlayer@@AEBVBlockPos@@@Z",
-       Player* a2, BlockPos* a3)
-{
-    IF_LISTENED(PlayerUseFrameBlockEvent)
-    {
+                       Player* a2, BlockPos* a3) {
+    IF_LISTENED(PlayerUseFrameBlockEvent) {
         PlayerUseFrameBlockEvent ev{};
         ev.mType = PlayerUseFrameBlockEvent::Type::Attack;
         ev.mBlockInstance = Level::getBlockInstance(a3, a2->getDimensionId());
@@ -1580,13 +1451,11 @@ TClasslessInstanceHook(bool, "?attack@ItemFrameBlock@@UEBA_NPEAVPlayer@@AEBVBloc
 /////////////////// LiquidSpreadEvent ///////////////////
 #include <MC/LiquidBlockDynamic.hpp>
 TInstanceHook(bool, "?_canSpreadTo@LiquidBlockDynamic@@AEBA_NAEAVBlockSource@@AEBVBlockPos@@1E@Z",
-      LiquidBlockDynamic , class BlockSource& bs, class BlockPos const& to, class BlockPos const& from, unsigned char unk)
-{
+              LiquidBlockDynamic, class BlockSource& bs, class BlockPos const& to, class BlockPos const& from, unsigned char unk) {
     auto rtn = original(this, bs, to, from, unk);
     if (!rtn)
         return rtn;
-    IF_LISTENED(LiquidSpreadEvent)
-    {
+    IF_LISTENED(LiquidSpreadEvent) {
         LiquidSpreadEvent ev{};
         ev.mBlockInstance = BlockInstance::createBlockInstance(
             const_cast<Block*>(&this->getRenderBlock()), from, bs.getDimensionId());
@@ -1600,34 +1469,31 @@ TInstanceHook(bool, "?_canSpreadTo@LiquidBlockDynamic@@AEBA_NAEAVBlockSource@@AE
     return rtn;
 }
 
-//THook(void, "?_trySpreadTo@LiquidBlockDynamic@@AEBAXAEAVBlockSource@@AEBVBlockPos@@H1E@Z",
-//      LiquidBlockDynamic* _this, BlockSource* bs, BlockPos* to, unsigned int a4, BlockPos* from, char id)
+// THook(void, "?_trySpreadTo@LiquidBlockDynamic@@AEBAXAEAVBlockSource@@AEBVBlockPos@@H1E@Z",
+//       LiquidBlockDynamic* _this, BlockSource* bs, BlockPos* to, unsigned int a4, BlockPos* from, char id)
 //{
-//    IF_LISTENED(LiquidSpreadEvent)
-//    {
-//        LiquidSpreadEvent ev{};
-//        ev.mBlockInstance = BlockInstance::createBlockInstance(
-//            const_cast<Block*>(&_this->getRenderBlock()), *from, bs->getDimensionId());
-//        ev.mTarget = *to;
-//        ev.mDimensionId = bs->getDimensionId();
-//        logger.warn("LiquidSpreadEvent - {} - {} -> {}",
-//                    ev.mBlockInstance.getBlock()->getTypeName(), from->toString(), to->toString());
-//        if (!ev.call())
-//            return;
-//    }
-//    IF_LISTENED_END(LiquidSpreadEvent)
-//    return;
-//    original(_this, bs, to, a4, from, id);
-//}
+//     IF_LISTENED(LiquidSpreadEvent)
+//     {
+//         LiquidSpreadEvent ev{};
+//         ev.mBlockInstance = BlockInstance::createBlockInstance(
+//             const_cast<Block*>(&_this->getRenderBlock()), *from, bs->getDimensionId());
+//         ev.mTarget = *to;
+//         ev.mDimensionId = bs->getDimensionId();
+//         logger.warn("LiquidSpreadEvent - {} - {} -> {}",
+//                     ev.mBlockInstance.getBlock()->getTypeName(), from->toString(), to->toString());
+//         if (!ev.call())
+//             return;
+//     }
+//     IF_LISTENED_END(LiquidSpreadEvent)
+//     return;
+//     original(_this, bs, to, a4, from, id);
+// }
 
 
 /////////////////// PlayerDeath ///////////////////
-TInstanceHook(void*, "?die@Player@@UEAAXAEBVActorDamageSource@@@Z", ServerPlayer, ActorDamageSource* src)
-{
-    IF_LISTENED(PlayerDieEvent)
-    {
-        if (this->isPlayer())
-        {
+TInstanceHook(void*, "?die@Player@@UEAAXAEBVActorDamageSource@@@Z", ServerPlayer, ActorDamageSource* src) {
+    IF_LISTENED(PlayerDieEvent) {
+        if (this->isPlayer()) {
             PlayerDieEvent ev{};
             ev.mPlayer = this;
             ev.mDamageSource = src;
@@ -1644,40 +1510,36 @@ TInstanceHook(void*, "?die@Player@@UEAAXAEBVActorDamageSource@@@Z", ServerPlayer
 #include <MC/SurvivalMode.hpp>
 /////////////////// PlayerDestroy ///////////////////
 
-//TInstanceHook(bool, "?destroyBlock@SurvivalMode@@UEAA_NAEBVBlockPos@@E@Z",
-//              SurvivalMode, BlockPos a3, unsigned __int8 a4)
+// TInstanceHook(bool, "?destroyBlock@SurvivalMode@@UEAA_NAEBVBlockPos@@E@Z",
+//               SurvivalMode, BlockPos a3, unsigned __int8 a4)
 //{
-//    IF_LISTENED(PlayerDestroyBlockEvent)
-//    {
-//        if (getPlayer()->isPlayer())
-//        {
-//            PlayerDestroyBlockEvent ev{};
-//            ev.mPlayer = getPlayer();
-//            auto bl = Level::getBlockInstance(a3, getPlayer()->getDimensionId());
-//            ev.mBlockInstance = bl;
-//            if (!ev.call())
-//            {
-//                return false;
-//            }
-//        }
-//    }
-//    IF_LISTENED_END(PlayerDestroyBlockEvent)
-//    return original(this, a3, a4);
-//}
+//     IF_LISTENED(PlayerDestroyBlockEvent)
+//     {
+//         if (getPlayer()->isPlayer())
+//         {
+//             PlayerDestroyBlockEvent ev{};
+//             ev.mPlayer = getPlayer();
+//             auto bl = Level::getBlockInstance(a3, getPlayer()->getDimensionId());
+//             ev.mBlockInstance = bl;
+//             if (!ev.call())
+//             {
+//                 return false;
+//             }
+//         }
+//     }
+//     IF_LISTENED_END(PlayerDestroyBlockEvent)
+//     return original(this, a3, a4);
+// }
 
 TInstanceHook(bool, "?destroyBlock@GameMode@@UEAA_NAEBVBlockPos@@E@Z",
-              GameMode, BlockPos a3, unsigned __int8 a4)
-{
-    IF_LISTENED(PlayerDestroyBlockEvent)
-    {
-        if (getPlayer()->isPlayer())
-        {
+              GameMode, BlockPos a3, unsigned __int8 a4) {
+    IF_LISTENED(PlayerDestroyBlockEvent) {
+        if (getPlayer()->isPlayer()) {
             PlayerDestroyBlockEvent ev{};
             ev.mPlayer = getPlayer();
             auto bl = Level::getBlockInstance(a3, getPlayer()->getDimensionId());
             ev.mBlockInstance = bl;
-            if (!ev.call())
-            {
+            if (!ev.call()) {
                 return false;
             }
         }
@@ -1697,7 +1559,8 @@ TInstanceHook(bool, "?useItemOn@GameMode@@UEAA_NAEAVItemStack@@AEBVBlockPos@@EAE
         ev.mItemStack = &it;
         ev.mFace = side;
         ev.mClickPos = *clickPos;
-        if (!ev.call()) return false;
+        if (!ev.call())
+            return false;
     }
     IF_LISTENED_END(PlayerUseItemOnEvent)
     return original(this, it, bp, side, clickPos, a6_block);
@@ -1706,12 +1569,9 @@ TInstanceHook(bool, "?useItemOn@GameMode@@UEAA_NAEAVItemStack@@AEBVBlockPos@@EAE
 
 /////////////////// MobHurt ///////////////////
 TInstanceHook(bool, "?_hurt@Mob@@MEAA_NAEBVActorDamageSource@@M_N1@Z",
-              Mob, ActorDamageSource& src, float damage, bool unk1_1, bool unk2_0)
-{
-    IF_LISTENED(MobHurtEvent)
-    {
-        if (this)
-        {
+              Mob, ActorDamageSource& src, float damage, bool unk1_1, bool unk2_0) {
+    IF_LISTENED(MobHurtEvent) {
+        if (this) {
             MobHurtEvent ev{};
             ev.mMob = this;
             ev.mDamageSource = &src;
@@ -1726,14 +1586,10 @@ TInstanceHook(bool, "?_hurt@Mob@@MEAA_NAEBVActorDamageSource@@M_N1@Z",
     return original(this, src, damage, unk1_1, unk2_0);
 }
 
-TInstanceHook(float, "?getDamageAfterResistanceEffect@Mob@@UEBAMAEBVActorDamageSource@@M@Z", Mob, ActorDamageSource* src, float damage)
-{
-    if (src->getCause() == ActorDamageCause::Magic)
-    {
-        IF_LISTENED(MobHurtEvent)
-        {
-            if (this)
-            {
+TInstanceHook(float, "?getDamageAfterResistanceEffect@Mob@@UEBAMAEBVActorDamageSource@@M@Z", Mob, ActorDamageSource* src, float damage) {
+    if (src->getCause() == ActorDamageCause::Magic) {
+        IF_LISTENED(MobHurtEvent) {
+            if (this) {
                 MobHurtEvent ev{};
                 ev.mMob = this;
                 ev.mDamageSource = src;
@@ -1750,11 +1606,9 @@ TInstanceHook(float, "?getDamageAfterResistanceEffect@Mob@@UEBAMAEBVActorDamageS
 
 //////////////// PlayerUseItem & PlayerEat ////////////////
 #include <MC/ComponentItem.hpp>
-TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode , ItemStack& it)
-{
+TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode, ItemStack& it) {
     auto pl = this->getPlayer();
-    IF_LISTENED(PlayerUseItemEvent)
-    {
+    IF_LISTENED(PlayerUseItemEvent) {
         PlayerUseItemEvent ev{};
         ev.mPlayer = pl;
         ev.mItemStack = &it;
@@ -1762,15 +1616,12 @@ TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode ,
             return false;
     }
     IF_LISTENED_END(PlayerUseItemEvent)
-    IF_LISTENED(PlayerEatEvent)
-    {
-        if (it.getItem()->isFood() && (pl->isHungry() || pl->forceAllowEating()))
-        {
+    IF_LISTENED(PlayerEatEvent) {
+        if (it.getItem()->isFood() && (pl->isHungry() || pl->forceAllowEating())) {
             PlayerEatEvent ev{};
             ev.mPlayer = pl;
             ev.mFoodItem = &it;
-            if (!ev.call())
-            {
+            if (!ev.call()) {
                 pl->refreshAttribute(Player::HUNGER);
                 return false;
             }
@@ -1780,17 +1631,13 @@ TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode ,
     return original(this, it);
 }
 
-THook(ItemStack*, "?use@BucketItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", Item* _this, ItemStack* a1, Player* a2)
-{
-    if (_this->getFullItemName() == "minecraft:milk_bucket")
-    {
-        IF_LISTENED(PlayerEatEvent)
-        {
+THook(ItemStack*, "?use@BucketItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", Item* _this, ItemStack* a1, Player* a2) {
+    if (_this->getFullItemName() == "minecraft:milk_bucket") {
+        IF_LISTENED(PlayerEatEvent) {
             PlayerEatEvent ev{};
             ev.mPlayer = a2;
             ev.mFoodItem = a1;
-            if (!ev.call())
-            {
+            if (!ev.call()) {
                 return a1;
             }
         }
@@ -1800,15 +1647,12 @@ THook(ItemStack*, "?use@BucketItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", It
 }
 
 
-THook(ItemStack*, "?use@PotionItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", void* _this, ItemStack* a1, Player* a2)
-{
-    IF_LISTENED(PlayerEatEvent)
-    {
+THook(ItemStack*, "?use@PotionItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", void* _this, ItemStack* a1, Player* a2) {
+    IF_LISTENED(PlayerEatEvent) {
         PlayerEatEvent ev{};
         ev.mPlayer = a2;
         ev.mFoodItem = a1;
-        if (!ev.call())
-        {
+        if (!ev.call()) {
             return a1;
         }
     }
@@ -1817,12 +1661,9 @@ THook(ItemStack*, "?use@PotionItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", vo
 }
 
 /////////////////// MobDie ///////////////////
-TInstanceHook(bool, "?die@Mob@@UEAAXAEBVActorDamageSource@@@Z", Mob, ActorDamageSource* ads)
-{
-    IF_LISTENED(MobDieEvent)
-    {
-        if (this)
-        {
+TInstanceHook(bool, "?die@Mob@@UEAAXAEBVActorDamageSource@@@Z", Mob, ActorDamageSource* ads) {
+    IF_LISTENED(MobDieEvent) {
+        if (this) {
             MobDieEvent ev{};
             ev.mMob = this;
             ev.mDamageSource = ads;
@@ -1835,10 +1676,8 @@ TInstanceHook(bool, "?die@Mob@@UEAAXAEBVActorDamageSource@@@Z", Mob, ActorDamage
 }
 
 ///////////////////  Entity & Block Explosion ///////////////////
-TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ")
-{
-    try
-    {
+TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ") {
+    try {
         auto acId = *(ActorUniqueID*)((QWORD*)this + 11);
         auto actor = Global<Level>->getEntity(acId);
         auto pos = *(Vec3*)(QWORD*)this;
@@ -1848,10 +1687,8 @@ TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ")
         auto genFire = (bool)*((BYTE*)this + 80);
         auto canBreaking = (bool)*((BYTE*)this + 81);
 
-        IF_LISTENED(EntityExplodeEvent)
-        {
-            if (actor)
-            {
+        IF_LISTENED(EntityExplodeEvent) {
+            if (actor) {
                 EntityExplodeEvent ev{};
                 ev.mActor = actor;
                 ev.mBreaking = canBreaking;
@@ -1871,10 +1708,8 @@ TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ")
         }
         IF_LISTENED_END(EntityExplodeEvent)
 
-        IF_LISTENED(BlockExplodeEvent)
-        {
-            if (!actor)
-            {
+        IF_LISTENED(BlockExplodeEvent) {
+            if (!actor) {
                 BlockPos bp = pos.toBlockPos();
                 BlockExplodeEvent ev{};
                 ev.mBlockInstance = Level::getBlockInstance(bp, bs);
@@ -1892,9 +1727,7 @@ TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ")
             }
         }
         IF_LISTENED_END(BlockExplodeEvent)
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Event Callback Failed!");
         logger.error("Uncaught Exception Detected!");
         logger.error("In Event: Entity or Block Explosion");
@@ -1905,13 +1738,10 @@ TClasslessInstanceHook(void, "?explode@Explosion@@QEAAXXZ")
 
 ////////////// ProjectileHitEntity //////////////
 TClasslessInstanceHook(void, "?onHit@ProjectileComponent@@QEAAXAEAVActor@@AEBVHitResult@@@Z",
-       Actor* item, HitResult* res)
-{
-    IF_LISTENED(ProjectileHitEntityEvent)
-    {
+                       Actor* item, HitResult* res) {
+    IF_LISTENED(ProjectileHitEntityEvent) {
         Actor* to = res->getEntity();
-        if (to)
-        {
+        if (to) {
             ProjectileHitEntityEvent ev{};
             ev.mTarget = to;
             ev.mSource = item;
@@ -1925,9 +1755,8 @@ TClasslessInstanceHook(void, "?onHit@ProjectileComponent@@QEAAXAEAVActor@@AEBVHi
 
 ////////////// WitherBossDestroy //////////////
 TInstanceHook(void, "?_destroyBlocks@WitherBoss@@AEAAXAEAVLevel@@AEBVAABB@@AEAVBlockSource@@HW4WitherAttackType@1@@Z",
-              Actor, Level* a2, AABB* aabb, BlockSource* a4, int a5,unsigned int a6) {
-    IF_LISTENED(WitherBossDestroyEvent)
-    {
+              Actor, Level* a2, AABB* aabb, BlockSource* a4, int a5, unsigned int a6) {
+    IF_LISTENED(WitherBossDestroyEvent) {
         WitherBossDestroyEvent ev{};
         ev.mWitherBoss = (WitherBoss*)this;
         ev.mDestroyRange = *aabb;
@@ -1937,19 +1766,17 @@ TInstanceHook(void, "?_destroyBlocks@WitherBoss@@AEAAXAEAVLevel@@AEBVAABB@@AEAVB
         *aabb = ev.mDestroyRange;
     }
     IF_LISTENED_END(WitherBossDestroyEvent)
-    original(this, a2, aabb, a4, a5,a6);
+    original(this, a2, aabb, a4, a5, a6);
 }
 
 
 ////////////// EntityRide //////////////
 TInstanceHook(bool, "?canAddPassenger@Actor@@UEBA_NAEAV1@@Z",
-      Actor, Actor* a2)
-{
+              Actor, Actor* a2) {
     auto rtn = original(this, a2);
     if (!rtn)
         return false;
-    IF_LISTENED(EntityRideEvent)
-    {
+    IF_LISTENED(EntityRideEvent) {
         EntityRideEvent ev{};
         ev.mRider = a2;
         ev.mVehicle = this;
@@ -1963,10 +1790,8 @@ TInstanceHook(bool, "?canAddPassenger@Actor@@UEBA_NAEAV1@@Z",
 
 ////////////// EntityStepOnPressurePlate //////////////
 TClasslessInstanceHook(bool, "?shouldTriggerEntityInside@BasePressurePlateBlock@@UEBA_NAEAVBlockSource@@AEBVBlockPos@@AEAVActor@@@Z",
-                       BlockSource* a2, BlockPos* a3, Actor* a4)
-{
-    IF_LISTENED(EntityStepOnPressurePlateEvent)
-    {
+                       BlockSource* a2, BlockPos* a3, Actor* a4) {
+    IF_LISTENED(EntityStepOnPressurePlateEvent) {
         EntityStepOnPressurePlateEvent ev{};
         ev.mActor = a4;
         ev.mBlockInstance = Level::getBlockInstance(a3, a4->getDimensionId());
@@ -1979,14 +1804,11 @@ TClasslessInstanceHook(bool, "?shouldTriggerEntityInside@BasePressurePlateBlock@
 
 ////////////// ProjectileSpawn //////////////
 TClasslessInstanceHook(Actor*,
-      "?spawnProjectile@Spawner@@QEAAPEAVActor@@AEAVBlockSource@@AEBUActorDefinitionIdentifier@@PEAV2@AEBVVec3@@3@Z",
-       BlockSource* a2, ActorDefinitionIdentifier* a3, Actor* a4, Vec3* a5, Vec3* a6)
-{
+                       "?spawnProjectile@Spawner@@QEAAPEAVActor@@AEAVBlockSource@@AEBUActorDefinitionIdentifier@@PEAV2@AEBVVec3@@3@Z",
+                       BlockSource* a2, ActorDefinitionIdentifier* a3, Actor* a4, Vec3* a5, Vec3* a6) {
     string name = a3->getCanonicalName();
-    if (name != "minecraft:thrown_trident")
-    {
-        IF_LISTENED(ProjectileSpawnEvent)
-        {
+    if (name != "minecraft:thrown_trident") {
+        IF_LISTENED(ProjectileSpawnEvent) {
             ProjectileSpawnEvent ev{};
             ev.mShooter = a4;
             ev.mIdentifier = a3;
@@ -1998,8 +1820,7 @@ TClasslessInstanceHook(Actor*,
         IF_LISTENED_END(ProjectileSpawnEvent)
     }
     auto projectile = original(this, a2, a3, a4, a5, a6);
-    IF_LISTENED(ProjectileCreatedEvent)
-    {
+    IF_LISTENED(ProjectileCreatedEvent) {
         ProjectileCreatedEvent ev{};
         ev.mShooter = a4;
         ev.mProjectile = projectile;
@@ -2013,10 +1834,8 @@ TClasslessInstanceHook(Actor*,
 #include <MC/ActorDefinitionIdentifier.hpp>
 static_assert(sizeof(ActorDefinitionIdentifier) == 176);
 TInstanceHook(void, "?_shootFirework@CrossbowItem@@AEBAXAEBVItemInstance@@AEAVPlayer@@@Z",
-    CrossbowItem, void* a1, Player* a2)
-{
-    IF_LISTENED(ProjectileSpawnEvent)
-    {
+              CrossbowItem, void* a1, Player* a2) {
+    IF_LISTENED(ProjectileSpawnEvent) {
         ActorDefinitionIdentifier identifier("minecraft:fireworks_rocket");
         ProjectileSpawnEvent ev{};
         ev.mShooter = a2;
@@ -2031,10 +1850,8 @@ TInstanceHook(void, "?_shootFirework@CrossbowItem@@AEBAXAEBVItemInstance@@AEAVPl
 }
 
 TClasslessInstanceHook(void, "?releaseUsing@TridentItem@@UEBAXAEAVItemStack@@PEAVPlayer@@H@Z",
-   ItemStack* a2, Player* a3, int a4)
-{
-    IF_LISTENED(ProjectileSpawnEvent)
-    {
+                       ItemStack* a2, Player* a3, int a4) {
+    IF_LISTENED(ProjectileSpawnEvent) {
         ActorDefinitionIdentifier identifier("minecraft:thrown_trident");
         ProjectileSpawnEvent ev{};
         ev.mShooter = a3;
@@ -2053,27 +1870,24 @@ TClasslessInstanceHook(void, "?releaseUsing@TridentItem@@UEBAXAEAVItemStack@@PEA
 
 ////////////// NpcCmd //////////////
 TInstanceHook(void,
-      "?executeCommandAction@NpcComponent@@QEAAXAEAVActor@@AEAVPlayer@@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z",
-      NpcComponent, Actor* ac, Player* pl, int a4, string& a5)
-{
-    IF_LISTENED(NpcCmdEvent)
-    {
-        //IDA NpcComponent::executeCommandAction
-        //NpcSceneDialogueData data(*this, *ac, a5);
-		
+              "?executeCommandAction@NpcComponent@@QEAAXAEAVActor@@AEAVPlayer@@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z",
+              NpcComponent, Actor* ac, Player* pl, int a4, string& a5) {
+    IF_LISTENED(NpcCmdEvent) {
+        // IDA NpcComponent::executeCommandAction
+        // NpcSceneDialogueData data(*this, *ac, a5);
+
         auto ec = (EntityContext*)((char*)ac + 8);
         NpcSceneDialogueData data(WeakEntityRef(ec->getWeakRef()), a5);
-		
+
         auto container = data.getActionsContainer();
         auto actionAt = container->getActionAt(a4);
-        if (actionAt && dAccess<char>(actionAt, 8) == (char)1)
-        {
-            
+        if (actionAt && dAccess<char>(actionAt, 8) == (char)1) {
+
             NpcCmdEvent ev{};
             ev.mPlayer = pl;
             ev.mNpc = ac;
             ev.mCommand = actionAt->getText();
-            if (!ev.call()) 
+            if (!ev.call())
                 return;
         }
     }
@@ -2083,10 +1897,8 @@ TInstanceHook(void,
 
 ////////////// ArmorStandChange //////////////
 TInstanceHook(bool, "?_trySwapItem@ArmorStand@@AEAA_NAEAVPlayer@@W4EquipmentSlot@@@Z",
-      ArmorStand, Player* a2, int a3)
-{
-    IF_LISTENED(ArmorStandChangeEvent)
-    {
+              ArmorStand, Player* a2, int a3) {
+    IF_LISTENED(ArmorStandChangeEvent) {
         ArmorStandChangeEvent ev{};
         ev.mArmorStand = this;
         ev.mPlayer = a2;
@@ -2101,10 +1913,8 @@ TInstanceHook(bool, "?_trySwapItem@ArmorStand@@AEAA_NAEAVPlayer@@W4EquipmentSlot
 
 ////////////// ItemUseOnActorInventory //////////////
 TInstanceHook(void, "?handle@ItemUseOnActorInventoryTransaction@@UEBA?AW4InventoryTransactionError@@AEAVPlayer@@_N@Z",
-      ServerNetworkHandler, ServerPlayer* sp, bool unk)
-{
-    IF_LISTENED(ItemUseOnActorEvent)
-    {
+              ServerNetworkHandler, ServerPlayer* sp, bool unk) {
+    IF_LISTENED(ItemUseOnActorEvent) {
         ItemUseOnActorEvent ev{};
         ev.mTarget = dAccess<ActorRuntimeID, 104>(this);
         ev.mInteractiveMode = dAccess<int, 112>(this);
@@ -2116,25 +1926,20 @@ TInstanceHook(void, "?handle@ItemUseOnActorInventoryTransaction@@UEBA?AW4Invento
 
 ////////////// PlayerScoreChangedEvent  //////////////
 TClasslessInstanceHook(void, "?onScoreChanged@ServerScoreboard@@UEAAXAEBUScoreboardId@@AEBVObjective@@@Z",
-       ScoreboardId* a1, Objective* a2)
-{
-    IF_LISTENED(PlayerScoreChangedEvent)
-    {
+                       ScoreboardId* a1, Objective* a2) {
+    IF_LISTENED(PlayerScoreChangedEvent) {
         __int64 id = a1->id;
 
         Player* player = nullptr;
         auto pls = Level::getAllPlayers();
-        for (auto& pl : pls)
-        {
-            if (Global<Scoreboard>->getScoreboardId(*pl).id == id)
-            {
+        for (auto& pl : pls) {
+            if (Global<Scoreboard>->getScoreboardId(*pl).id == id) {
                 player = pl;
                 break;
             }
         }
 
-        if (player)
-        {
+        if (player) {
             PlayerScoreChangedEvent ev{};
             ev.mPlayer = player;
             ev.mScore = a2->getPlayerScore(*a1).getCount();
@@ -2152,17 +1957,15 @@ TClasslessInstanceHook(void, "?onScoreChanged@ServerScoreboard@@UEAAXAEBUScorebo
 #include <MC/Minecraft.hpp>
 ////////////// ServerStarted //////////////
 TClasslessInstanceHook(void, "?sendServerThreadStarted@ServerInstanceEventCoordinator@@QEAAXAEAVServerInstance@@@Z",
-    class ServerInstance& ins)
-{
+                       class ServerInstance& ins) {
     _set_se_translator(seh_exception::TranslateSEHtoCE);
     LL::globalConfig.tickThreadId = std::this_thread::get_id();
     Global<Level> = Global<Minecraft>->getLevel();
     Global<ServerLevel> = (ServerLevel*)Global<Minecraft>->getLevel();
-    //Global<ServerNetworkHandler> = Global<Minecraft>->getServerNetworkHandler();
+    // Global<ServerNetworkHandler> = Global<Minecraft>->getServerNetworkHandler();
     LL::globalConfig.serverStatus = LL::LLServerStatus::Running;
 
-    IF_LISTENED(ServerStartedEvent)
-    {
+    IF_LISTENED(ServerStartedEvent) {
         ServerStartedEvent ev{};
         ev.call();
     }
@@ -2172,12 +1975,10 @@ TClasslessInstanceHook(void, "?sendServerThreadStarted@ServerInstanceEventCoordi
 }
 
 ////////////// ServerStopped //////////////
-TClasslessInstanceHook(void, "??1DedicatedServer@@UEAA@XZ")
-{
+TClasslessInstanceHook(void, "??1DedicatedServer@@UEAA@XZ") {
     LL::globalConfig.serverStatus = LL::LLServerStatus::Stopping;
 
-    IF_LISTENED(ServerStoppedEvent)
-    {
+    IF_LISTENED(ServerStoppedEvent) {
         ServerStoppedEvent ev{};
         ev.call();
     }
@@ -2185,8 +1986,7 @@ TClasslessInstanceHook(void, "??1DedicatedServer@@UEAA@XZ")
     original(this);
 }
 TClasslessInstanceHook(void, "?execute@StopCommand@@UEBAXAEBVCommandOrigin@@AEAVCommandOutput@@@Z",
-    class CommandOrigin const& origin, class CommandOutput& output)
-{
+                       class CommandOrigin const& origin, class CommandOutput& output) {
     LL::globalConfig.serverStatus = LL::LLServerStatus::Stopping;
     original(this, origin, output);
 }
@@ -2194,12 +1994,10 @@ TClasslessInstanceHook(void, "?execute@StopCommand@@UEBAXAEBVCommandOrigin@@AEAV
 
 ////////////// RegCmd //////////////
 TInstanceHook(void, "?setup@ChangeSettingCommand@@SAXAEAVCommandRegistry@@@Z",
-      CommandRegistry, void* a1)
-{
+              CommandRegistry, void* a1) {
     Global<CommandRegistry> = this;
     original(this, a1);
-    IF_LISTENED(RegCmdEvent)
-    {
+    IF_LISTENED(RegCmdEvent) {
         RegCmdEvent ev{};
         ev.mCommandRegistry = this;
         ev.call();
@@ -2212,12 +2010,9 @@ TInstanceHook(void, "?setup@ChangeSettingCommand@@SAXAEAVCommandRegistry@@@Z",
 ////////////// ConsoleOutput //////////////
 THook(std::ostream&,
       "??$_Insert_string@DU?$char_traits@D@std@@_K@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@QEBD_K@Z",
-      std::ostream& _this, const char* str, unsigned size)
-{
-    IF_LISTENED(ConsoleOutputEvent)
-    {
-        if (&_this == &std::cout)
-        {
+      std::ostream& _this, const char* str, unsigned size) {
+    IF_LISTENED(ConsoleOutputEvent) {
+        if (&_this == &std::cout) {
             ConsoleOutputEvent ev{};
             ev.mOutput = string(str, size);
             if (!ev.call())
@@ -2230,22 +2025,17 @@ THook(std::ostream&,
 
 
 TInstanceHook(void*, "?handle@ComplexInventoryTransaction@@UEBA?AW4InventoryTransactionError@@AEAVPlayer@@_N@Z",
-      ComplexInventoryTransaction, Player* a2, int a3)
-{
-    if (this->type == ComplexInventoryTransaction::Type::NORMAL)
-    {
-        IF_LISTENED(PlayerDropItemEvent)
-        {
+              ComplexInventoryTransaction, Player* a2, int a3) {
+    if (this->type == ComplexInventoryTransaction::Type::NORMAL) {
+        IF_LISTENED(PlayerDropItemEvent) {
             auto& InvTran = this->data;
             auto& action = InvTran.getActions(InventorySource(InventorySourceType::Container, ContainerID::Inventory));
-            if (action.size() == 1)
-            {
+            if (action.size() == 1) {
                 PlayerDropItemEvent ev{};
                 auto& item = a2->getInventory().getItem(action[0].slot);
                 ev.mItemStack = const_cast<ItemStack*>(&item);
                 ev.mPlayer = a2;
-                if (!ev.call())
-                {
+                if (!ev.call()) {
                     a2->sendInventory(1);
                     return nullptr;
                 }
@@ -2261,39 +2051,31 @@ TInstanceHook(void*, "?handle@ComplexInventoryTransaction@@UEBA?AW4InventoryTran
 }
 
 TInstanceHook(void, "?dropSlot@Inventory@@QEAAXH_N00@Z",
-    Container, int a2, char a3, char a4, bool a5)
-{
-    auto pl = dAccess<Player*,248>(this);
-    if (pl->isPlayer())
-    {
-        IF_LISTENED(PlayerDropItemEvent)
-        {
+              Container, int a2, char a3, char a4, bool a5) {
+    auto pl = dAccess<Player*, 248>(this);
+    if (pl->isPlayer()) {
+        IF_LISTENED(PlayerDropItemEvent) {
             PlayerDropItemEvent ev{};
-            if (a2 >= 0)
-            {
+            if (a2 >= 0) {
                 auto& item = this->getItem(a2);
-                if (!item.isNull())
-                {        
-                   ev.mItemStack = const_cast<ItemStack*>(&item);
-                   ev.mPlayer = pl;
+                if (!item.isNull()) {
+                    ev.mItemStack = const_cast<ItemStack*>(&item);
+                    ev.mPlayer = pl;
                 }
-                if (!ev.call())
-                {
+                if (!ev.call()) {
                     return;
                 }
             }
         }
         IF_LISTENED_END(PlayerDropItemEvent)
     }
-    return original(this, a2, a3,a4,a5);
+    return original(this, a2, a3, a4, a5);
 }
 
 TInstanceHook(int, "?startSleepInBed@Player@@UEAA?AW4BedSleepingResult@@AEBVBlockPos@@@Z",
-    Player, BlockPos const& blk)
-{
+              Player, BlockPos const& blk) {
     auto bl = Level::getBlockInstance(blk, getDimensionId());
-    IF_LISTENED(PlayerBedEnterEvent)
-    {
+    IF_LISTENED(PlayerBedEnterEvent) {
         PlayerBedEnterEvent ev{};
         ev.mPlayer = this;
         ev.mBlockInstance = &bl;
@@ -2306,11 +2088,9 @@ TInstanceHook(int, "?startSleepInBed@Player@@UEAA?AW4BedSleepingResult@@AEBVBloc
 
 
 #include <MC/Spawner.hpp>
-TInstanceHook(Mob*,"?spawnMob@Spawner@@QEAAPEAVMob@@AEAVBlockSource@@AEBUActorDefinitionIdentifier@@PEAVActor@@AEBVVec3@@_N44@Z",
-              Spawner, BlockSource* a2, ActorDefinitionIdentifier* a3, Actor* a4, Vec3& a5, bool a6, bool a7, bool a8)
-{
-    IF_LISTENED(MobSpawnEvent)
-    {
+TInstanceHook(Mob*, "?spawnMob@Spawner@@QEAAPEAVMob@@AEAVBlockSource@@AEBUActorDefinitionIdentifier@@PEAVActor@@AEBVVec3@@_N44@Z",
+              Spawner, BlockSource* a2, ActorDefinitionIdentifier* a3, Actor* a4, Vec3& a5, bool a6, bool a7, bool a8) {
+    IF_LISTENED(MobSpawnEvent) {
         MobSpawnEvent ev{};
         ev.mTypeName = a3->getCanonicalName();
         ev.mPos = a5;
@@ -2319,5 +2099,5 @@ TInstanceHook(Mob*,"?spawnMob@Spawner@@QEAAPEAVMob@@AEAVBlockSource@@AEBUActorDe
             return nullptr;
     }
     IF_LISTENED_END(MobSpawnEvent)
-    return original(this,a2,a3,a4,a5,a6,a7,a8);
+    return original(this, a2, a3, a4, a5, a6, a7, a8);
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/FormPacketHelper.cpp b/LiteLoader/Kernel/FormPacketHelper.cpp
--- a/LiteLoader/Kernel/FormPacketHelper.cpp
+++ b/LiteLoader/Kernel/FormPacketHelper.cpp
@@ -18,7 +18,12 @@ using namespace std;
 //////////////////////////////// Data ////////////////////////////////
 
 enum class FormType {
-	SimpleFormBuilder, CustomFormBuilder, SimpleFormPacket, CustomFormPacket, ModalFormPacket
+    SimpleFormBuilder,
+    ModalFormBuilder,
+    CustomFormBuilder,
+    SimpleFormPacket,
+    ModalFormPacket,
+    CustomFormPacket
 };
 
 unordered_map<unsigned, FormType> formTypes;
@@ -28,6 +33,7 @@ unordered_map<unsigned, std::function<void(Player*, bool)>> modalFormPacketCallb
 unordered_map<unsigned, std::function<void(Player*, string)>> customFormPacketCallbacks;
 
 unordered_map<unsigned, std::shared_ptr<Form::SimpleForm>> simpleFormBuilders;
+unordered_map<unsigned, std::shared_ptr<Form::ModalForm>> modalFormBuilders;
 unordered_map<unsigned, std::shared_ptr<Form::CustomForm>> customFormBuilders;
 
 
@@ -35,8 +41,7 @@ unordered_map<unsigned, std::shared_ptr<Form::CustomForm>> customFormBuilders;
 
 #define RAND_FORM_ID() (unsigned)((rand() << 16) + rand())
 
-unsigned NewFormId()
-{
+unsigned NewFormId() {
     unsigned formId;
     do {
         formId = RAND_FORM_ID();
@@ -44,64 +49,67 @@ unsigned NewFormId()
     return formId;
 }
 
-void SetSimpleFormPacketCallback(unsigned formId, std::function<void(Player*, int)> callback)
-{
-	formTypes[formId] = FormType::SimpleFormPacket;
-	simpleFormPacketCallbacks[formId] = callback;
+void SetSimpleFormPacketCallback(unsigned formId, std::function<void(Player*, int)> callback) {
+    formTypes[formId] = FormType::SimpleFormPacket;
+    simpleFormPacketCallbacks[formId] = callback;
 }
 
-void SetModalFormPacketCallback(unsigned formId, std::function<void(Player*, bool)> callback)
-{
-	formTypes[formId] = FormType::ModalFormPacket;
-	modalFormPacketCallbacks[formId] = callback;
+void SetModalFormPacketCallback(unsigned formId, std::function<void(Player*, bool)> callback) {
+    formTypes[formId] = FormType::ModalFormPacket;
+    modalFormPacketCallbacks[formId] = callback;
 }
 
-void SetCustomFormPacketCallback(unsigned formId, std::function<void(Player*, string)> callback)
-{
-	formTypes[formId] = FormType::CustomFormPacket;
-	customFormPacketCallbacks[formId] = callback;
+void SetCustomFormPacketCallback(unsigned formId, std::function<void(Player*, string)> callback) {
+    formTypes[formId] = FormType::CustomFormPacket;
+    customFormPacketCallbacks[formId] = callback;
 }
 
-void SetSimpleFormBuilderData(unsigned formId, std::shared_ptr<Form::SimpleForm> data)
-{
-	formTypes[formId] = FormType::SimpleFormBuilder;
-	simpleFormBuilders[formId] = data;
+void SetSimpleFormBuilderData(unsigned formId, std::shared_ptr<Form::SimpleForm> data) {
+    formTypes[formId] = FormType::SimpleFormBuilder;
+    simpleFormBuilders[formId] = data;
 }
 
-void SetCustomFormBuilderData(unsigned formId, std::shared_ptr<Form::CustomForm> data)
-{
-	formTypes[formId] = FormType::CustomFormBuilder;
-	customFormBuilders[formId] = data;
+void SetModalFormBuilderData(unsigned formId, std::shared_ptr<Form::ModalForm> data) {
+    formTypes[formId] = FormType::ModalFormBuilder;
+    modalFormBuilders[formId] = data;
 }
 
-void HandleFormPacket(Player* player, unsigned formId, const string& data)
-{
+void SetCustomFormBuilderData(unsigned formId, std::shared_ptr<Form::CustomForm> data) {
+    formTypes[formId] = FormType::CustomFormBuilder;
+    customFormBuilders[formId] = data;
+}
+
+void HandleFormPacket(Player* player, unsigned formId, const string& data) {
     if (formTypes.find(formId) == formTypes.end())
         return;
 
-    if (formTypes[formId] == FormType::SimpleFormBuilder)
-    {
+    if (formTypes[formId] == FormType::SimpleFormBuilder) {
         int chosen = data != "null" ? stoi(data) : -1;
 
-        //Simple Form Builder
+        // Simple Form Builder
         auto form = simpleFormBuilders[formId];
         if (form->callback)
             form->callback(player, chosen);
-        //Button Callback
+        // Button Callback
         if (chosen >= 0) {
             auto button = dynamic_pointer_cast<Form::Button>(form->elements[chosen]);
             if (button->callback)
                 button->callback(player);
         }
         simpleFormBuilders.erase(formId);
-    }
-    else if(formTypes[formId] == FormType::CustomFormBuilder)
-    {
-        //Custom Form Builder
+    } else if (formTypes[formId] == FormType::ModalFormBuilder) {
+        int chosen = data == "true" ? 1 : 0;
+
+        // Modal Form Builder
+        auto form = modalFormBuilders[formId];
+        if (form->callback)
+            form->callback(player, chosen);
+        modalFormBuilders.erase(formId);
+    } else if (formTypes[formId] == FormType::CustomFormBuilder) {
+        // Custom Form Builder
         auto form = customFormBuilders[formId];
 
-        if (data == "null")
-        {
+        if (data == "null") {
             customFormBuilders.erase(formId);
             if (form->callback)
                 form->callback(player, {});
@@ -110,41 +118,36 @@ void HandleFormPacket(Player* player, unsigned formId, const string& data)
 
         fifo_json res = fifo_json::parse(data);
         int nowIndex = 0;
-        for (fifo_json& j : res)
-        {
-            switch (form->getType(nowIndex))
-            {
-            case Form::CustomFormElement::Type::Label:      //label's data is null
-                break;
-            case Form::CustomFormElement::Type::Input:
-                form->setValue(nowIndex, j.get<string>());
-                break;
-            case Form::CustomFormElement::Type::Toggle:
-                form->setValue(nowIndex, j.get<bool>());
-                break;
-            case Form::CustomFormElement::Type::Slider:
-                form->setValue(nowIndex, j.get<int>());
-                break;
-            case Form::CustomFormElement::Type::Dropdown:
-            {
-                auto& options = dynamic_pointer_cast<Form::Dropdown>(form->elements[nowIndex].second)->options;
-                form->setValue(nowIndex, options[j.get<int>()]);
-                break;
-            }
-            case Form::CustomFormElement::Type::StepSlider:
-            {
-                auto& options = dynamic_pointer_cast<Form::StepSlider>(form->elements[nowIndex].second)->options;
-                form->setValue(nowIndex, options[j.get<int>()]);
-                break;
+        for (fifo_json& j : res) {
+            switch (form->getType(nowIndex)) {
+                case Form::CustomFormElement::Type::Label: // label's data is null
+                    break;
+                case Form::CustomFormElement::Type::Input:
+                    form->setValue(nowIndex, j.get<string>());
+                    break;
+                case Form::CustomFormElement::Type::Toggle:
+                    form->setValue(nowIndex, j.get<bool>());
+                    break;
+                case Form::CustomFormElement::Type::Slider:
+                    form->setValue(nowIndex, j.get<int>());
+                    break;
+                case Form::CustomFormElement::Type::Dropdown: {
+                    auto& options = dynamic_pointer_cast<Form::Dropdown>(form->elements[nowIndex].second)->options;
+                    form->setValue(nowIndex, options[j.get<int>()]);
+                    break;
+                }
+                case Form::CustomFormElement::Type::StepSlider: {
+                    auto& options = dynamic_pointer_cast<Form::StepSlider>(form->elements[nowIndex].second)->options;
+                    form->setValue(nowIndex, options[j.get<int>()]);
+                    break;
+                }
+                default:
+                    break;
             }
-            default:
-                break;
-            }
-            nowIndex++;
+            ++nowIndex;
         }
 
-        if (form->callback)
-        {
+        if (form->callback) {
             std::map<string, std::shared_ptr<Form::CustomFormElement>> callbackData;
             for (auto& [k, v] : form->elements)
                 callbackData[k] = v;
@@ -153,20 +156,14 @@ void HandleFormPacket(Player* player, unsigned formId, const string& data)
         }
 
         customFormBuilders.erase(formId);
-    }
-    else if (formTypes[formId] == FormType::SimpleFormPacket)
-    {
+    } else if (formTypes[formId] == FormType::SimpleFormPacket) {
         int chosen = data != "null" ? stoi(data) : -1;
         simpleFormPacketCallbacks[formId](player, chosen);
         simpleFormPacketCallbacks.erase(formId);
-    }
-    else if (formTypes[formId] == FormType::CustomFormPacket)
-    {
+    } else if (formTypes[formId] == FormType::CustomFormPacket) {
         customFormPacketCallbacks[formId](player, data);
         customFormPacketCallbacks.erase(formId);
-    }
-    else if (formTypes[formId] == FormType::ModalFormPacket)
-    {
+    } else if (formTypes[formId] == FormType::ModalFormPacket) {
         int chosen = data == "true" ? 1 : 0;
         modalFormPacketCallbacks[formId](player, chosen);
         modalFormPacketCallbacks.erase(formId);
@@ -180,21 +177,17 @@ class Packet;
 class ServerNetworkHandler;
 class NetworkIdentifier;
 
-Player* GetPlayerFromPacket(ServerNetworkHandler* handler, NetworkIdentifier* id, Packet* packet)
-{
+Player* GetPlayerFromPacket(ServerNetworkHandler* handler, NetworkIdentifier* id, Packet* packet) {
     return (Player*)handler->getServerPlayer(*id, dAccess<char>(packet, 16));
 }
 
 TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VModalFormResponsePacket@@$0A@@@UEBAXAEBVNetworkIdentifier@@AEAVNetEventCallback@@AEAV?$shared_ptr@VPacket@@@std@@@Z",
-    NetworkIdentifier* id, ServerNetworkHandler* handler, void* pPacket)
-{
-    try
-    {
+                       NetworkIdentifier* id, ServerNetworkHandler* handler, void* pPacket) {
+    try {
         Packet* packet = *(Packet**)pPacket;
         ServerPlayer* sp = handler->getServerPlayer(*id, 0);
 
-        if (sp)
-        {
+        if (sp) {
             unsigned formId = dAccess<unsigned>(packet, 48);
             string data = dAccess<string>(packet, 56);
 
@@ -203,17 +196,13 @@ TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VModalFo
 
             HandleFormPacket(sp, formId, data);
         }
-    }
-    catch (const seh_exception& e)
-    {
+    } catch (const seh_exception& e) {
         logger.error("Event Callback Failed!");
         logger.error("SEH Uncaught Exception Detected!");
         logger.error("{}", TextEncoding::toUTF8(e.what()));
         logger.error("In Event: onFormSelected");
         PrintCurrentStackTraceback();
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Event Callback Failed!");
         logger.error("Uncaught Exception Detected!");
         logger.error("In Event: onFormSelected");
diff --git a/LiteLoader/Kernel/FormUI.cpp b/LiteLoader/Kernel/FormUI.cpp
--- a/LiteLoader/Kernel/FormUI.cpp
+++ b/LiteLoader/Kernel/FormUI.cpp
@@ -14,354 +14,375 @@ using namespace std;
 
 namespace Form {
 //////////////////////////////// Simple Form ////////////////////////////////
-    string Button::serialize() {
-        try {
-            fifo_json button;
-            button["text"] = text;
-            if (!image.empty()) {
-                fifo_json imageObj;
-                imageObj["type"] = image.find("textures/") == 0 ? "path" : "url";
-                imageObj["data"] = image;
-                button["image"] = imageObj;
-            }
-            return button.dump();
+string Button::serialize() {
+    try {
+        fifo_json button;
+        button["text"] = text;
+        if (!image.empty()) {
+            fifo_json imageObj;
+            imageObj["type"] = image.find("textures/") == 0 ? "path" : "url";
+            imageObj["data"] = image;
+            button["image"] = imageObj;
         }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Button in Simple Form serialize!");
-            return "";
-        }
-    }
-
-    SimpleForm &SimpleForm::setTitle(const string &title) {
-        this->title = title;
-        return *this;
-    }
-
-    SimpleForm &SimpleForm::setContent(const string &content) {
-        this->content = content;
-        return *this;
-    }
-
-    SimpleForm& SimpleForm::addButton(string text, string image, Button::ButtonCallback callback)
-    {
-        return append(Button(text, image, callback));
-    }
-
-    SimpleForm &SimpleForm::append(const Button &element) {
-        elements.emplace_back(make_shared<Button>(element));
-        return *this;
+        return button.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Button in Simple Form serialize!");
+        return "";
     }
-
-    string SimpleForm::serialize() {
-        try {
-            fifo_json form = fifo_json::parse(R"({"title":"","content":"","buttons":[],"type":"form"})");
-            form["title"] = title;
-            form["content"] = content;
-            for (auto &e: elements) {
-                string element = e->serialize();
-                if (!element.empty())
-                    form["buttons"].push_back(fifo_json::parse(element));
-            }
-            return form.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Simple Form in serialize!");
-            return "";
+}
+
+SimpleForm& SimpleForm::setTitle(const string& title) {
+    this->title = title;
+    return *this;
+}
+
+SimpleForm& SimpleForm::setContent(const string& content) {
+    this->content = content;
+    return *this;
+}
+
+SimpleForm& SimpleForm::addButton(string text, string image, Button::ButtonCallback callback) {
+    return append(Button(text, image, callback));
+}
+
+SimpleForm& SimpleForm::append(const Button& element) {
+    elements.emplace_back(make_shared<Button>(element));
+    return *this;
+}
+
+string SimpleForm::serialize() {
+    try {
+        fifo_json form = fifo_json::parse(R"({"title":"","content":"","buttons":[],"type":"form"})");
+        form["title"] = title;
+        form["content"] = content;
+        for (auto& e : elements) {
+            string element = e->serialize();
+            if (!element.empty())
+                form["buttons"].push_back(fifo_json::parse(element));
         }
+        return form.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Simple Form in serialize!");
+        return "";
     }
+}
 
-    bool SimpleForm::sendTo(Player *player, Callback callback) {
-        unsigned id = NewFormId();
-        this->callback = std::move(callback);
-        SetSimpleFormBuilderData(id, make_shared<SimpleForm>(*this));
+bool SimpleForm::sendTo(Player* player, Callback callback) {
+    unsigned id = NewFormId();
+    this->callback = std::move(callback);
+    SetSimpleFormBuilderData(id, make_shared<SimpleForm>(*this));
 
-        string data = serialize();
-        if (data.empty())
-            return false;
-        return player->sendRawFormPacket(id, data);
+    string data = serialize();
+    if (data.empty())
+        return false;
+    return player->sendRawFormPacket(id, data);
+}
+
+//////////////////////////////// Modal Form ////////////////////////////////
+ModalForm& ModalForm::setTitle(const string& title) {
+    this->title = title;
+    return *this;
+}
+
+ModalForm& ModalForm::setContent(const string& content) {
+    this->content = content;
+    return *this;
+}
+
+ModalForm& ModalForm::setConfirmButton(const string& text) {
+    this->confirmButton = text;
+    return *this;
+}
+
+ModalForm& ModalForm::setCancelButton(const string& text) {
+    this->cancelButton = text;
+    return *this;
+}
+
+string ModalForm::serialize() {
+    try {
+        fifo_json form = fifo_json::parse(R"({"title":"","content":"","button1":"","button2":"","type":"modal"})");
+        form["title"] = title;
+        form["content"] = content;
+        form["button1"] = confirmButton;
+        form["button2"] = cancelButton;
+        return form.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Modal Form in serialize!");
+        return "";
     }
+}
 
-//////////////////////////////// Custom Form ////////////////////////////////
-    std::string CustomFormElement::getString()
-    {
-        return value;
-    }
+bool ModalForm::sendTo(Player* player, Callback callback) {
+    unsigned id = NewFormId();
+    this->callback = std::move(callback);
+    SetModalFormBuilderData(id, make_shared<ModalForm>(*this));
 
-    int CustomFormElement::getNumber()
-    {
-        try
-        {
-            return stoi(value);
-        }
-        catch (...)
-        {
-            return 0;
-        }
-    }
+    string data = serialize();
+    if (data.empty())
+        return false;
+    return player->sendRawFormPacket(id, data);
+}
 
-    bool CustomFormElement::getBool()
-    {
-        if (value.empty() || value == "0" || value == "false" || value == "False" || value == "FALSE")
-            return false;
-        return true;
+//////////////////////////////// Custom Form ////////////////////////////////
+std::string CustomFormElement::getString() {
+    return value;
+}
+
+int CustomFormElement::getNumber() {
+    try {
+        return stoi(value);
+    } catch (...) {
+        return 0;
     }
+}
 
-    string Label::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "label";
-            itemAdd["text"] = text;
-            return itemAdd.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Label in Custom Form serialize!");
-            return "";
-        }
+bool CustomFormElement::getBool() {
+    if (value.empty() || value == "0" || value == "false" || value == "False" || value == "FALSE")
+        return false;
+    return true;
+}
+
+string Label::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "label";
+        itemAdd["text"] = text;
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Label in Custom Form serialize!");
+        return "";
     }
-
-    string Input::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "input";
-            itemAdd["text"] = title;
-            if (!placeholder.empty())
-                itemAdd["placeholder"] = placeholder;
-            if (!def.empty())
-                itemAdd["default"] = def;
-            return itemAdd.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Input in Custom Form serialize!");
-            return "";
-        }
+}
+
+string Input::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "input";
+        itemAdd["text"] = title;
+        if (!placeholder.empty())
+            itemAdd["placeholder"] = placeholder;
+        if (!def.empty())
+            itemAdd["default"] = def;
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Input in Custom Form serialize!");
+        return "";
     }
-
-    string Toggle::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "toggle";
-            itemAdd["text"] = title;
-            if (def)
-                itemAdd["default"] = def;
-            return itemAdd.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Toggle in Custom Form serialize!");
-            return "";
-        }
+}
+
+string Toggle::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "toggle";
+        itemAdd["text"] = title;
+        if (def)
+            itemAdd["default"] = def;
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Toggle in Custom Form serialize!");
+        return "";
     }
+}
 
-    string Dropdown::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "dropdown";
-            itemAdd["text"] = title;
-
-            fifo_json items = fifo_json::array();
-            for (auto &str: options)
-                items.push_back(str);
-            itemAdd["options"] = items;
+string Dropdown::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "dropdown";
+        itemAdd["text"] = title;
 
-            if (def > 0)
-                itemAdd["default"] = def;
-            return itemAdd.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Dropdown in Custom Form serialize!");
-            return "";
-        }
-    }
+        fifo_json items = fifo_json::array();
+        for (auto& str : options)
+            items.push_back(str);
+        itemAdd["options"] = items;
 
-    string Slider::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "slider";
-            itemAdd["text"] = title;
-
-            if (minValue >= maxValue)
-                maxValue = minValue + 1;
-            itemAdd["min"] = minValue;
-            itemAdd["max"] = maxValue;
-            itemAdd["step"] = step >= 1 ? step : 1;
-            if (def > 0 && minValue <= def && maxValue >= def) {
-                itemAdd["default"] = def;
-            }
-            return itemAdd.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Slider in Custom Form serialize!");
-            return "";
-        }
+        if (def > 0)
+            itemAdd["default"] = def;
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Dropdown in Custom Form serialize!");
+        return "";
     }
-
-    string StepSlider::serialize() {
-        try {
-            fifo_json itemAdd;
-            itemAdd["type"] = "step_slider";
-            itemAdd["text"] = title;
-
-            fifo_json items = fifo_json::array();
-            for (auto &str: options)
-                items.push_back(str);
-            itemAdd["steps"] = items;
-
-            size_t maxIndex = items.size() - 1;
-            if (def >= 0 && def <= maxIndex) {
-                itemAdd["default"] = def;
-            }
-            return itemAdd.dump();
+}
+
+string Slider::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "slider";
+        itemAdd["text"] = title;
+
+        if (minValue >= maxValue)
+            maxValue = minValue + 1;
+        itemAdd["min"] = minValue;
+        itemAdd["max"] = maxValue;
+        itemAdd["step"] = step >= 1 ? step : 1;
+        if (def > 0 && minValue <= def && maxValue >= def) {
+            itemAdd["default"] = def;
         }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate StepSlider in Custom Form serialize!");
-            return "";
-        }
-    }
-
-    CustomForm &CustomForm::setTitle(const string &title) {
-        this->title = title;
-        return *this;
-    }
-
-    CustomForm& CustomForm::addLabel(const string& name, string text)
-    {
-        return append(Label(name, text));
-    }
-
-    CustomForm& CustomForm::addInput(const string& name, string title, string placeholder, string def)
-    {
-        return append(Input(name, title, placeholder, def));
-    }
-
-    CustomForm& CustomForm::addToggle(const string& name, string title, bool def)
-    {
-        return append(Toggle(name, title, def));
-    }
-
-    CustomForm& CustomForm::addDropdown(const string& name, string title, const vector<string>& options, int defId)
-    {
-        return append(Dropdown(name, title, options, defId));
-    }
-
-    CustomForm& CustomForm::addSlider(const string& name, string title, int min, int max, int step, int def)
-    {
-        return append(Slider(name, title, min, max, step, def));
-    }
-
-    CustomForm& CustomForm::addStepSlider(const string& name, string title, const vector<string>& options, int defId)
-    {
-        return append(StepSlider(name, title, options, defId));
-    }
-
-    CustomForm &CustomForm::append(const Label &element) {
-        elements.emplace_back(element.name, make_shared<Label>(element));
-        return *this;
-    }
-
-    CustomForm &CustomForm::append(const Input &element) {
-        elements.emplace_back(element.name, make_shared<Input>(element));
-        return *this;
-    }
-
-    CustomForm &CustomForm::append(const Toggle &element) {
-        elements.emplace_back(element.name, make_shared<Toggle>(element));
-        return *this;
-    }
-
-    CustomForm &CustomForm::append(const Dropdown &element) {
-        elements.emplace_back(element.name, make_shared<Dropdown>(element));
-        return *this;
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Slider in Custom Form serialize!");
+        return "";
     }
+}
 
-    CustomForm &CustomForm::append(const Slider &element) {
-        elements.emplace_back(element.name, make_shared<Slider>(element));
-        return *this;
-    }
+string StepSlider::serialize() {
+    try {
+        fifo_json itemAdd;
+        itemAdd["type"] = "step_slider";
+        itemAdd["text"] = title;
 
-    CustomForm &CustomForm::append(const StepSlider &element) {
-        elements.emplace_back(element.name, make_shared<StepSlider>(element));
-        return *this;
-    }
+        fifo_json items = fifo_json::array();
+        for (auto& str : options)
+            items.push_back(str);
+        itemAdd["steps"] = items;
 
-    string CustomForm::serialize() {
-        try {
-            fifo_json form = fifo_json::parse(R"({ "title":"", "type":"custom_form", "content":[], "buttons":[] })");
-            form["title"] = title;
-            for (auto&[k, v]: elements) {
-                string element = v->serialize();
-                if (!element.empty())
-                    form["content"].push_back(fifo_json::parse(element));
-            }
-            return form.dump();
-        }
-        catch (const fifo_json::exception &) {
-            logger.error("Fail to generate Custom Form in serialize!");
-            return "";
+        size_t maxIndex = items.size() - 1;
+        if (def >= 0 && def <= maxIndex) {
+            itemAdd["default"] = def;
         }
+        return itemAdd.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate StepSlider in Custom Form serialize!");
+        return "";
     }
-
-    bool CustomForm::sendTo(Player* player, Callback callback) {
-        unsigned id = NewFormId();
-        this->callback = std::move(callback);
-        SetCustomFormBuilderData(id, make_shared<CustomForm>(*this));
-
-        string data = serialize();
-        if (data.empty())
-            return false;
-
-        return player->sendRawFormPacket(id, data);
-    }
-
-    bool CustomForm::sendToForRawJson(Player* player, Callback2 callback) {
-        unsigned id = NewFormId();
-        //this->callback = callback;
-        this->callback = nullptr;
-        SetCustomFormPacketCallback(id, callback);
-
-        string data = serialize();
-        if (data.empty())
-            return false;
-
-        return player->sendRawFormPacket(id, data);
-    }
-
-    string CustomForm::getString(const string& name) {
-        for (auto& [k, v] : elements)
-            if (k == name)
-                return v->getString();
+}
+
+CustomForm& CustomForm::setTitle(const string& title) {
+    this->title = title;
+    return *this;
+}
+
+CustomForm& CustomForm::addLabel(const string& name, string text) {
+    return append(Label(name, text));
+}
+
+CustomForm& CustomForm::addInput(const string& name, string title, string placeholder, string def) {
+    return append(Input(name, title, placeholder, def));
+}
+
+CustomForm& CustomForm::addToggle(const string& name, string title, bool def) {
+    return append(Toggle(name, title, def));
+}
+
+CustomForm& CustomForm::addDropdown(const string& name, string title, const vector<string>& options, int defId) {
+    return append(Dropdown(name, title, options, defId));
+}
+
+CustomForm& CustomForm::addSlider(const string& name, string title, int min, int max, int step, int def) {
+    return append(Slider(name, title, min, max, step, def));
+}
+
+CustomForm& CustomForm::addStepSlider(const string& name, string title, const vector<string>& options, int defId) {
+    return append(StepSlider(name, title, options, defId));
+}
+
+CustomForm& CustomForm::append(const Label& element) {
+    elements.emplace_back(element.name, make_shared<Label>(element));
+    return *this;
+}
+
+CustomForm& CustomForm::append(const Input& element) {
+    elements.emplace_back(element.name, make_shared<Input>(element));
+    return *this;
+}
+
+CustomForm& CustomForm::append(const Toggle& element) {
+    elements.emplace_back(element.name, make_shared<Toggle>(element));
+    return *this;
+}
+
+CustomForm& CustomForm::append(const Dropdown& element) {
+    elements.emplace_back(element.name, make_shared<Dropdown>(element));
+    return *this;
+}
+
+CustomForm& CustomForm::append(const Slider& element) {
+    elements.emplace_back(element.name, make_shared<Slider>(element));
+    return *this;
+}
+
+CustomForm& CustomForm::append(const StepSlider& element) {
+    elements.emplace_back(element.name, make_shared<StepSlider>(element));
+    return *this;
+}
+
+string CustomForm::serialize() {
+    try {
+        fifo_json form = fifo_json::parse(R"({ "title":"", "type":"custom_form", "content":[], "buttons":[] })");
+        form["title"] = title;
+        for (auto& [k, v] : elements) {
+            string element = v->serialize();
+            if (!element.empty())
+                form["content"].push_back(fifo_json::parse(element));
+        }
+        return form.dump();
+    } catch (const fifo_json::exception&) {
+        logger.error("Fail to generate Custom Form in serialize!");
         return "";
     }
+}
 
-    int CustomForm::getNumber(const string& name) {
-        for (auto& [k, v] : elements)
-            if (k == name)
-                return v->getNumber();
-        return 0;
-    }
+bool CustomForm::sendTo(Player* player, Callback callback) {
+    unsigned id = NewFormId();
+    this->callback = std::move(callback);
+    SetCustomFormBuilderData(id, make_shared<CustomForm>(*this));
 
-    bool CustomForm::getBool(const string& name) {
-        for (auto& [k, v] : elements)
-            if (k == name)
-                return v->getBool();
+    string data = serialize();
+    if (data.empty())
         return false;
-    }
 
-    string CustomForm::getString(int index)
-    {
-        return elements[index].second->getString();
-    }
+    return player->sendRawFormPacket(id, data);
+}
 
-    int CustomForm::getNumber(int index)
-    {
-        return elements[index].second->getNumber();
-    }
+bool CustomForm::sendToForRawJson(Player* player, Callback2 callback) {
+    unsigned id = NewFormId();
+    // this->callback = callback;
+    this->callback = nullptr;
+    SetCustomFormPacketCallback(id, callback);
 
-    bool CustomForm::getBool(int index)
-    {
-        return elements[index].second->getBool();
-    }
+    string data = serialize();
+    if (data.empty())
+        return false;
 
-    CustomFormElement::Type CustomForm::getType(int index) {
-        return elements[index].second->getType();
-    }
+    return player->sendRawFormPacket(id, data);
+}
+
+string CustomForm::getString(const string& name) {
+    for (auto& [k, v] : elements)
+        if (k == name)
+            return v->getString();
+    return "";
+}
+
+int CustomForm::getNumber(const string& name) {
+    for (auto& [k, v] : elements)
+        if (k == name)
+            return v->getNumber();
+    return 0;
+}
+
+bool CustomForm::getBool(const string& name) {
+    for (auto& [k, v] : elements)
+        if (k == name)
+            return v->getBool();
+    return false;
+}
+
+string CustomForm::getString(int index) {
+    return elements[index].second->getString();
+}
+
+int CustomForm::getNumber(int index) {
+    return elements[index].second->getNumber();
+}
+
+bool CustomForm::getBool(int index) {
+    return elements[index].second->getBool();
+}
+
+CustomFormElement::Type CustomForm::getType(int index) {
+    return elements[index].second->getType();
+}
 
 } // namespace Form
\ No newline at end of file
diff --git a/LiteLoader/Kernel/I18nAPI.cpp b/LiteLoader/Kernel/I18nAPI.cpp
--- a/LiteLoader/Kernel/I18nAPI.cpp
+++ b/LiteLoader/Kernel/I18nAPI.cpp
@@ -23,7 +23,9 @@ void I18N::load(const std::string& fileName) {
     for (auto& [lang, dat] : langData) {
         if (defaultLangData.count(lang)) {
             for (auto& [k, v] : defaultLangData[lang]) {
-                if (!dat.count(k)) { dat[k] = v; }
+                if (!dat.count(k)) {
+                    dat[k] = v;
+                }
             }
         }
     }
@@ -57,24 +59,32 @@ std::string I18N::get(const std::string& key, const std::string& langCode) {
     auto langType = langc.substr(0, 2);
     if (langData.count(langc)) {
         auto& lang = langData[langc];
-        if (lang.count(key)) return lang[key];
+        if (lang.count(key))
+            return lang[key];
         // Search for the similar language in langData
         for (auto& [lc, ld] : langData) {
-            if (lc.length() < 2) continue;
+            if (lc.length() < 2)
+                continue;
             if (lc.substr(0, 2) == langType) {
-                if (ld.count(key)) { return ld[key]; }
+                if (ld.count(key)) {
+                    return ld[key];
+                }
             }
         }
     }
     // If not found, try falling back to the default language data
     if (defaultLangData.count(langc)) {
-        if (defaultLangData[langc].count(key)) return defaultLangData[langc][key]; // Fall back
+        if (defaultLangData[langc].count(key))
+            return defaultLangData[langc][key]; // Fall back
     }
     // Search for the similar language
     for (auto& [lc, ld] : defaultLangData) {
         if (lc.substr(0, 2) == langType) {
-            if (lc.length() < 2) continue;
-            if (ld.count(key)) { return ld[key]; }
+            if (lc.length() < 2)
+                continue;
+            if (ld.count(key)) {
+                return ld[key];
+            }
         }
     }
     // Finally, not found, return the key
@@ -125,158 +135,142 @@ I18N* loadFromImpl(HMODULE hPlugin, HMODULE hTarget) {
 
 ///////////////////////////// Encoding-CodePage Map /////////////////////////////
 #undef UNICODE
-namespace TextEncoding
-{
-    const std::unordered_map<Encoding, UINT> Encoding_CodePage_Map = {
-        {Encoding::ISO_8859_1, 28591},
-        {Encoding::ISO_8859_2, 28592},
-        {Encoding::ISO_8859_3, 28593},
-        {Encoding::ISO_8859_4, 28594},
-        {Encoding::ISO_8859_5, 28595},
-        {Encoding::ISO_8859_6, 28596},
-        {Encoding::ISO_8859_7, 28597},
-        {Encoding::ISO_8859_8, 28598},
-        {Encoding::ISO_8859_9, 28599},
-        //{Encoding::ISO_8859_10,},             //?
-        {Encoding::JAPANESE_EUC_JP, 51932},
-        {Encoding::JAPANESE_SHIFT_JIS, 932},
-        {Encoding::JAPANESE_JIS, 932},
-        {Encoding::CHINESE_BIG5, 950},
-        {Encoding::CHINESE_GB, 936},
-        {Encoding::CHINESE_EUC_CN, 51936},
-        {Encoding::KOREAN_EUC_KR, 51949},
-        //{Encoding::UNICODE, },
-        {Encoding::CHINESE_EUC_DEC, 51936},
-        {Encoding::CHINESE_CNS, 20000},
-        {Encoding::CHINESE_BIG5_CP950, 950},
-        {Encoding::JAPANESE_CP932, 932},
-        {Encoding::UTF8, CP_UTF8},
-        {Encoding::UNKNOWN_ENCODING, CP_ACP},
-        {Encoding::ASCII_7BIT, 28591},
-        {Encoding::RUSSIAN_KOI8_R, 20866},
-        {Encoding::RUSSIAN_CP1251, 1251},
-        {Encoding::MSFT_CP1252, 1252},
-        {Encoding::RUSSIAN_KOI8_RU, 20866},
-        {Encoding::MSFT_CP1250, 1250},
-        {Encoding::ISO_8859_15, 28605},
-        {Encoding::MSFT_CP1254, 1254},
-        {Encoding::MSFT_CP1257, 1257},
-        {Encoding::ISO_8859_11, 10021},         //?
-        {Encoding::MSFT_CP874, 874},
-        {Encoding::MSFT_CP1256, 1256},
-        {Encoding::MSFT_CP1255, 1255},
-        {Encoding::ISO_8859_8_I, 38598},
-        {Encoding::HEBREW_VISUAL, 28598},
-        {Encoding::CZECH_CP852, 852},
-        //{Encoding::CZECH_CSN_369103, },       //?
-        {Encoding::MSFT_CP1253, 1253},
-        {Encoding::RUSSIAN_CP866, 866},
-        {Encoding::ISO_8859_13, 28603},
-        {Encoding::ISO_2022_KR, 50225},
-        {Encoding::GBK, 936},
-        {Encoding::GB18030, 54936},
-        {Encoding::BIG5_HKSCS, 950},
-        {Encoding::ISO_2022_CN, 50227},
-        {Encoding::TSCII, 57004},               //?
-        {Encoding::TAMIL_MONO, 57004},          //?
-        {Encoding::TAMIL_BI, 57004},            //?
-        //{Encoding::JAGRAN, },                 //?
-        {Encoding::MACINTOSH_ROMAN, 10000},
-        {Encoding::UTF7, CP_UTF7},
-        {Encoding::UTF16BE, 1201},
-        {Encoding::UTF16LE, 1200},
-        {Encoding::UTF32BE, 12001},
-        {Encoding::UTF32LE, 12000},
-        //{Encoding::BINARYENC, },
-        {Encoding::HZ_GB_2312, 52936},
-        //{Encoding::TAM_ELANGO, },             //?
-        //{Encoding::TAM_LTTMBARANI, },         //?
-        //{Encoding::TAM_SHREE, },              //?
-        //{Encoding::TAM_TBOOMIS, },            //?
-        //{Encoding::TAM_TMNEWS, },             //?
-        //{Encoding::TAM_WEBTAMIL, },           //?
-        {Encoding::KDDI_SHIFT_JIS, 932},
-        {Encoding::DOCOMO_SHIFT_JIS, 932},
-        {Encoding::SOFTBANK_SHIFT_JIS, 932},
-        {Encoding::KDDI_ISO_2022_JP, 50220},
-        {Encoding::SOFTBANK_ISO_2022_JP, 50220},
-    };
+namespace TextEncoding {
+const std::unordered_map<Encoding, UINT> Encoding_CodePage_Map = {
+    {Encoding::ISO_8859_1, 28591},
+    {Encoding::ISO_8859_2, 28592},
+    {Encoding::ISO_8859_3, 28593},
+    {Encoding::ISO_8859_4, 28594},
+    {Encoding::ISO_8859_5, 28595},
+    {Encoding::ISO_8859_6, 28596},
+    {Encoding::ISO_8859_7, 28597},
+    {Encoding::ISO_8859_8, 28598},
+    {Encoding::ISO_8859_9, 28599},
+    //{Encoding::ISO_8859_10,},             //?
+    {Encoding::JAPANESE_EUC_JP, 51932},
+    {Encoding::JAPANESE_SHIFT_JIS, 932},
+    {Encoding::JAPANESE_JIS, 932},
+    {Encoding::CHINESE_BIG5, 950},
+    {Encoding::CHINESE_GB, 936},
+    {Encoding::CHINESE_EUC_CN, 51936},
+    {Encoding::KOREAN_EUC_KR, 51949},
+    //{Encoding::UNICODE, },
+    {Encoding::CHINESE_EUC_DEC, 51936},
+    {Encoding::CHINESE_CNS, 20000},
+    {Encoding::CHINESE_BIG5_CP950, 950},
+    {Encoding::JAPANESE_CP932, 932},
+    {Encoding::UTF8, CP_UTF8},
+    {Encoding::UNKNOWN_ENCODING, CP_ACP},
+    {Encoding::ASCII_7BIT, 28591},
+    {Encoding::RUSSIAN_KOI8_R, 20866},
+    {Encoding::RUSSIAN_CP1251, 1251},
+    {Encoding::MSFT_CP1252, 1252},
+    {Encoding::RUSSIAN_KOI8_RU, 20866},
+    {Encoding::MSFT_CP1250, 1250},
+    {Encoding::ISO_8859_15, 28605},
+    {Encoding::MSFT_CP1254, 1254},
+    {Encoding::MSFT_CP1257, 1257},
+    {Encoding::ISO_8859_11, 10021}, //?
+    {Encoding::MSFT_CP874, 874},
+    {Encoding::MSFT_CP1256, 1256},
+    {Encoding::MSFT_CP1255, 1255},
+    {Encoding::ISO_8859_8_I, 38598},
+    {Encoding::HEBREW_VISUAL, 28598},
+    {Encoding::CZECH_CP852, 852},
+    //{Encoding::CZECH_CSN_369103, },       //?
+    {Encoding::MSFT_CP1253, 1253},
+    {Encoding::RUSSIAN_CP866, 866},
+    {Encoding::ISO_8859_13, 28603},
+    {Encoding::ISO_2022_KR, 50225},
+    {Encoding::GBK, 936},
+    {Encoding::GB18030, 54936},
+    {Encoding::BIG5_HKSCS, 950},
+    {Encoding::ISO_2022_CN, 50227},
+    {Encoding::TSCII, 57004},      //?
+    {Encoding::TAMIL_MONO, 57004}, //?
+    {Encoding::TAMIL_BI, 57004},   //?
+    //{Encoding::JAGRAN, },                 //?
+    {Encoding::MACINTOSH_ROMAN, 10000},
+    {Encoding::UTF7, CP_UTF7},
+    {Encoding::UTF16BE, 1201},
+    {Encoding::UTF16LE, 1200},
+    {Encoding::UTF32BE, 12001},
+    {Encoding::UTF32LE, 12000},
+    //{Encoding::BINARYENC, },
+    {Encoding::HZ_GB_2312, 52936},
+    //{Encoding::TAM_ELANGO, },             //?
+    //{Encoding::TAM_LTTMBARANI, },         //?
+    //{Encoding::TAM_SHREE, },              //?
+    //{Encoding::TAM_TBOOMIS, },            //?
+    //{Encoding::TAM_TMNEWS, },             //?
+    //{Encoding::TAM_WEBTAMIL, },           //?
+    {Encoding::KDDI_SHIFT_JIS, 932},
+    {Encoding::DOCOMO_SHIFT_JIS, 932},
+    {Encoding::SOFTBANK_SHIFT_JIS, 932},
+    {Encoding::KDDI_ISO_2022_JP, 50220},
+    {Encoding::SOFTBANK_ISO_2022_JP, 50220},
+};
 }
 #define UNICODE
 ///////////////////////////// Encoding-CodePage Map /////////////////////////////
 
-namespace TextEncoding
-{
-    Encoding getLocalEncoding()
-    {
-        UINT page = GetACP();
-        for (auto& [k, v] : Encoding_CodePage_Map)
-        {
-            if (v == page)
-                return k;
-        }
-        return default_encoding();
+namespace TextEncoding {
+Encoding getLocalEncoding() {
+    UINT page = GetACP();
+    for (auto& [k, v] : Encoding_CodePage_Map) {
+        if (v == page)
+            return k;
     }
+    return default_encoding();
+}
 
-    Encoding detectEncoding(const std::string& text, bool* isReliable)
-    {
-        bool temp;
-        int bytes_consumed;
+Encoding detectEncoding(const std::string& text, bool* isReliable) {
+    bool temp;
+    int bytes_consumed;
 
-        return DetectEncoding(
-            text.c_str(), (int)text.size(),
-            nullptr, nullptr, nullptr,
-            UNKNOWN_ENCODING,
-            UNKNOWN_LANGUAGE,
-            CompactEncDet::WEB_CORPUS,
-            false,
-            &bytes_consumed,
-            isReliable ? isReliable : &temp);
-    }
+    return DetectEncoding(
+        text.c_str(), (int)text.size(),
+        nullptr, nullptr, nullptr,
+        UNKNOWN_ENCODING,
+        UNKNOWN_LANGUAGE,
+        CompactEncDet::WEB_CORPUS,
+        false,
+        &bytes_consumed,
+        isReliable ? isReliable : &temp);
+}
 
-    std::string fromUnicode(const std::wstring &text, Encoding encoding)
-    {
-        try
-        {
-            return wstr2str(text, Encoding_CodePage_Map.at(encoding));
-        }
-        catch (...)
-        {
-            return "";
-        }
+std::string fromUnicode(const std::wstring& text, Encoding encoding) {
+    try {
+        return wstr2str(text, Encoding_CodePage_Map.at(encoding));
+    } catch (...) {
+        return "";
     }
+}
 
-    std::wstring toUnicode(const std::string &text, Encoding encoding)
-    {
-        try
-        {
-            return str2wstr(text, Encoding_CodePage_Map.at(encoding));
-        }
-        catch (...)
-        {
-            return L"";
-        }
+std::wstring toUnicode(const std::string& text, Encoding encoding) {
+    try {
+        return str2wstr(text, Encoding_CodePage_Map.at(encoding));
+    } catch (...) {
+        return L"";
     }
+}
 
-    std::string toUTF8(const std::string& text)
-    {
-        return convert(text, detectEncoding(text), Encoding::UTF8);
-    }
+std::string toUTF8(const std::string& text) {
+    return convert(text, detectEncoding(text), Encoding::UTF8);
+}
 
-    std::string toUTF8(const std::string& text, Encoding from)
-    {
-        return convert(text, from, Encoding::UTF8);
-    }
+std::string toUTF8(const std::string& text, Encoding from) {
+    return convert(text, from, Encoding::UTF8);
+}
 
-    std::string convert(const std::string &text, Encoding from, Encoding to)
-    {
-        if (text.empty() || from == to)
-            return text;
+std::string convert(const std::string& text, Encoding from, Encoding to) {
+    if (text.empty() || from == to)
+        return text;
 
-        wstring uni = toUnicode(text, from);
-        if (uni.empty())
-            return "";
+    wstring uni = toUnicode(text, from);
+    if (uni.empty())
+        return "";
 
-        return fromUnicode(uni, to);
-    }
+    return fromUnicode(uni, to);
+}
 } // namespace TextEncoding
\ No newline at end of file
diff --git a/LiteLoader/Kernel/KVDBAPI.cpp b/LiteLoader/Kernel/KVDBAPI.cpp
--- a/LiteLoader/Kernel/KVDBAPI.cpp
+++ b/LiteLoader/Kernel/KVDBAPI.cpp
@@ -6,31 +6,27 @@
 
 Logger levelDBLogger("LevelDB");
 
-std::unique_ptr<KVDB> KVDB::create(const string& path, bool read_cache, int cache_sz,int Bfilter_bit)
-{
+std::unique_ptr<KVDB> KVDB::create(const string& path, bool read_cache, int cache_sz, int Bfilter_bit) {
     CreateDirs(path);
     auto db = std::make_unique<KVDB>();
     db->_init(path.c_str(), true, read_cache, cache_sz, Bfilter_bit);
     return db;
 }
-std::unique_ptr<KVDB> KVDB::open(const string& path, bool create, bool read_cache, int cache_sz,int Bfilter_bit)
-{
+std::unique_ptr<KVDB> KVDB::open(const string& path, bool create, bool read_cache, int cache_sz, int Bfilter_bit) {
     CreateDirs(path);
     auto db = std::make_unique<KVDB>();
     db->_init(path.c_str(), create, read_cache, cache_sz, Bfilter_bit);
     return db;
 }
 
-void KVDB::_init(const char* path, bool create, bool read_cache, int cache_sz, int Bfilter_bit)
-{
+void KVDB::_init(const char* path, bool create, bool read_cache, int cache_sz, int Bfilter_bit) {
     rdopt = leveldb::ReadOptions();
     wropt = leveldb::WriteOptions();
     options = leveldb::Options();
     rdopt.fill_cache = read_cache;
     rdopt.verify_checksums = false;
     wropt.sync = false;
-    if (cache_sz)
-    {
+    if (cache_sz) {
         options.block_cache = leveldb::NewLRUCache(cache_sz);
     }
     options.reuse_logs = true; // WARN:EXPERIMENTAL
@@ -39,8 +35,7 @@ void KVDB::_init(const char* path, bool create, bool read_cache, int cache_sz, i
     options.create_if_missing = create;
     dbpath = path;
     status = leveldb::DB::Open(options, path, &db);
-    if (!status.ok())
-    {
+    if (!status.ok()) {
         levelDBLogger.error("Fail to load KVDB <{}>", path);
         auto output = error(status);
         output.erase(std::remove(output.begin(), output.end(), '\n'), output.end());
@@ -48,61 +43,50 @@ void KVDB::_init(const char* path, bool create, bool read_cache, int cache_sz, i
     }
 }
 
-KVDB::~KVDB()
-{
+KVDB::~KVDB() {
     if (options.filter_policy)
         delete options.filter_policy;
     delete db;
 }
 
-bool KVDB::get(string_view key, string& val)
-{
+bool KVDB::get(string_view key, string& val) {
     auto s = db->Get(rdopt, leveldb::Slice(key.data(), key.size()), &val);
-    if (!s.ok())
-    {
+    if (!s.ok()) {
         if (s.IsNotFound())
             return false;
         levelDBLogger.error("get %s %s\n", dbpath.c_str(), s.ToString().c_str());
     }
     return true;
 }
-std::optional<std::string> KVDB::get(string_view key)
-{
+std::optional<std::string> KVDB::get(string_view key) {
     std::string result;
     auto s = db->Get(rdopt, leveldb::Slice(key.data(), key.size()), &result);
-    if (!s.ok())
-    {
+    if (!s.ok()) {
         return std::nullopt;
     }
     return result;
 }
 
-bool KVDB::set(string_view key, string_view val)
-{
+bool KVDB::set(string_view key, string_view val) {
     auto s = db->Put(wropt, leveldb::Slice(key.data(), key.size()),
                      leveldb::Slice(val.data(), val.size()));
-    if (!s.ok())
-    {
+    if (!s.ok()) {
         levelDBLogger.error("put %s %s\n", dbpath.c_str(), s.ToString().c_str());
     }
     return true;
 }
 
-bool KVDB::del(string_view key)
-{
+bool KVDB::del(string_view key) {
     auto s = db->Delete(wropt, leveldb::Slice(key.data(), key.size()));
-    if (!s.ok())
-    {
+    if (!s.ok()) {
         levelDBLogger.error("del %s %s\n", dbpath.c_str(), s.ToString().c_str());
     }
     return true;
 }
 
-void KVDB::iter(std::function<bool(string_view key)> const& fn)
-{
+void KVDB::iter(std::function<bool(string_view key)> const& fn) {
     leveldb::Iterator* it = db->NewIterator(rdopt);
-    for (it->SeekToFirst(); it->Valid(); it->Next())
-    {
+    for (it->SeekToFirst(); it->Valid(); it->Next()) {
         auto k = it->key();
         if (!fn({k.data(), k.size()}))
             break;
@@ -110,11 +94,9 @@ void KVDB::iter(std::function<bool(string_view key)> const& fn)
     delete it;
 }
 
-void KVDB::iter(std::function<bool(string_view key, string_view val)> const& fn)
-{
+void KVDB::iter(std::function<bool(string_view key, string_view val)> const& fn) {
     leveldb::Iterator* it = db->NewIterator(rdopt);
-    for (it->SeekToFirst(); it->Valid(); it->Next())
-    {
+    for (it->SeekToFirst(); it->Valid(); it->Next()) {
         auto k = it->key();
         auto v = it->value();
         if (!fn({k.data(), k.size()}, {v.data(), v.size()}))
@@ -125,26 +107,22 @@ void KVDB::iter(std::function<bool(string_view key, string_view val)> const& fn)
 
 vector<string> KVDB::getAllKeys() {
     vector<string> keyList;
-    iter([&keyList](const string_view& key)
-        {
-            keyList.push_back(string(key));
-            return true;
-        });
+    iter([&keyList](const string_view& key) {
+        keyList.push_back(string(key));
+        return true;
+    });
     return keyList;
 }
 
-bool KVDB::isValid()
-{
+bool KVDB::isValid() {
     return status.ok();
 }
 
-KVDB::operator bool()
-{
+KVDB::operator bool() {
     return isValid();
 }
 
 
-LIAPI std::string KVDB::error(leveldb::Status status)
-{
+LIAPI std::string KVDB::error(leveldb::Status status) {
     return status.ToString();
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/LLAPI.cpp b/LiteLoader/Kernel/LLAPI.cpp
--- a/LiteLoader/Kernel/LLAPI.cpp
+++ b/LiteLoader/Kernel/LLAPI.cpp
@@ -10,11 +10,9 @@
 
 using namespace std;
 
-std::string LL::getDataPath(const std::string &pluginName)
-{
+std::string LL::getDataPath(const std::string& pluginName) {
     string dataPath = "plugins\\LiteLoader\\" + pluginName;
-    if (!filesystem::exists(str2wstr(dataPath)))
-    {
+    if (!filesystem::exists(str2wstr(dataPath))) {
         std::error_code ec;
         filesystem::create_directories(str2wstr(dataPath), ec);
     }
@@ -25,8 +23,7 @@ std::string LL::getLoaderVersionString() {
     return getLoaderVersion().toString();
 }
 
-LL::Version LL::getLoaderVersion()
-{
+LL::Version LL::getLoaderVersion() {
     return Version(LITELOADER_VERSION_MAJOR, LITELOADER_VERSION_MINOR, LITELOADER_VERSION_REVISION, (LL::Version::Status)LITELOADER_VERSION_STATUS);
 }
 
@@ -34,11 +31,11 @@ bool LL::isDebugMode() {
     return LL::globalConfig.debugMode;
 }
 
-LL::Plugin *LL::getPlugin(std::string name) {
+LL::Plugin* LL::getPlugin(std::string name) {
     return PluginManager::getPlugin(name);
 }
 
-LL::Plugin *LL::getPlugin(HMODULE handle) {
+LL::Plugin* LL::getPlugin(HMODULE handle) {
     return PluginManager::getPlugin(handle);
 }
 
@@ -54,9 +51,10 @@ HMODULE LL::getLoaderHandle() {
     return GetCurrentModule();
 }
 
-//Version
+// Version
 LL::Version::Version(int major, int minor, int revision, Status status)
-        : major(major), minor(minor), revision(revision), status(status) {}
+: major(major), minor(minor), revision(revision), status(status) {
+}
 
 bool LL::Version::operator<(LL::Version b) {
     return major < b.major || (major == b.major && minor < b.minor) ||
@@ -79,7 +77,7 @@ std::string LL::Version::toString(bool needStatus) {
 }
 
 
-LL::Version LL::Version::parse(const std::string &str) {
+LL::Version LL::Version::parse(const std::string& str) {
     Version ver;
     std::string a = str;
     std::string status;
@@ -95,7 +93,7 @@ LL::Version LL::Version::parse(const std::string &str) {
         ver.status = Status::Dev;
     else
         ver.status = Status::Release;
-    
+
     auto res = SplitStrWithPattern(a, ".");
 
     if (res.size() >= 1)
@@ -104,21 +102,18 @@ LL::Version LL::Version::parse(const std::string &str) {
         ver.minor = stoi(res[1]);
     if (res.size() >= 3)
         ver.revision = stoi(res[2]);
-    
+
     return ver;
 }
 
-LL::ServerStatus LL::getServerStatus()
-{
+LL::ServerStatus LL::getServerStatus() {
     return (LL::ServerStatus)(LL::globalConfig.serverStatus);
 }
 
-bool LL::isServerStarting()
-{
+bool LL::isServerStarting() {
     return getServerStatus() == LL::ServerStatus::Starting;
 }
 
-bool LL::isServerStopping()
-{
+bool LL::isServerStopping() {
     return getServerStatus() == LL::ServerStatus::Stopping;
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/LoggerAPI.cpp b/LiteLoader/Kernel/LoggerAPI.cpp
--- a/LiteLoader/Kernel/LoggerAPI.cpp
+++ b/LiteLoader/Kernel/LoggerAPI.cpp
@@ -15,15 +15,11 @@
 
 std::unordered_map<std::string, CsLock> lockerList;
 
-bool Logger::setDefaultFileImpl(HMODULE hPlugin, const std::string& logFile, bool appendMode = true)
-{
-    if (logFile.empty())
-    {
+bool Logger::setDefaultFileImpl(HMODULE hPlugin, const std::string& logFile, bool appendMode = true) {
+    if (logFile.empty()) {
         PluginOwnData::removeImpl<std::ofstream>(hPlugin, LOGGER_CURRENT_FILE);
         return true;
-    }
-    else
-    {
+    } else {
         std::error_code ec;
         std::filesystem::create_directories(std::filesystem::path(str2wstr(logFile)).remove_filename(), ec);
 
@@ -33,24 +29,19 @@ bool Logger::setDefaultFileImpl(HMODULE hPlugin, const std::string& logFile, boo
     }
 }
 
-bool Logger::setDefaultFileImpl(HMODULE hPlugin, nullptr_t)
-{
+bool Logger::setDefaultFileImpl(HMODULE hPlugin, nullptr_t) {
     PluginOwnData::removeImpl<std::ofstream>(hPlugin, LOGGER_CURRENT_FILE);
     return true;
 }
 
 
-bool Logger::setFile(const std::string& logFile, bool appendMode)
-{
+bool Logger::setFile(const std::string& logFile, bool appendMode) {
     if (ofs.is_open())
         ofs.close();
 
-    if (logFile.empty())
-    {
+    if (logFile.empty()) {
         return true;
-    }
-    else
-    {
+    } else {
         std::error_code ec;
         std::filesystem::create_directories(std::filesystem::path(str2wstr(logFile)).remove_filename(), ec);
         ofs.open(logFile, appendMode ? std::ios::app : std::ios::out);
@@ -58,30 +49,25 @@ bool Logger::setFile(const std::string& logFile, bool appendMode)
     }
 }
 
-bool Logger::setFile(nullptr_t)
-{
+bool Logger::setFile(nullptr_t) {
     if (ofs.is_open())
         ofs.close();
     return true;
 }
 
-bool Logger::tryLock()
-{
+bool Logger::tryLock() {
     return lockerList[title].tryLock();
 }
 
-bool Logger::lock()
-{
+bool Logger::lock() {
     return lockerList[title].lock();
 }
 
-bool Logger::unlock()
-{
+bool Logger::unlock() {
     return lockerList[title].unlock();
 }
 
-CsLock& Logger::getLocker()
-{
+CsLock& Logger::getLocker() {
     return lockerList[title];
 }
 
@@ -89,8 +75,7 @@ Logger::OutputStream::OutputStream() = default;
 
 Logger::OutputStream::OutputStream(Logger* logger, int level, std::string&& consoleFormat, std::string&& fileFormat,
                                    std::string&& playerFormat,
-                                   fmt::text_style&& style, std::string&& levelPrefix)
-{
+                                   fmt::text_style&& style, std::string&& levelPrefix) {
     this->logger = logger;
     this->level = level;
     this->consoleFormat = consoleFormat;
@@ -100,8 +85,7 @@ Logger::OutputStream::OutputStream(Logger* logger, int level, std::string&& cons
     this->levelPrefix = levelPrefix;
 }
 
-bool checkLogLevel(int level, int outLevel)
-{
+bool checkLogLevel(int level, int outLevel) {
     if (level >= outLevel)
         return true;
     if (level == -1 && LL::globalConfig.logLevel >= outLevel)
@@ -109,53 +93,52 @@ bool checkLogLevel(int level, int outLevel)
     return false;
 }
 #define H do_hash
-fmt::text_style getModeColor(string a1)
-{
-    if (!LL::globalConfig.colorLog) return fmt::text_style();
-    switch (H(a1.c_str()))
-    {
-        case H("INFO"): return fmt::fg(fmt::color::light_sea_green);
-        case H("WARN"): return fmt::fg(fmt::color::yellow2);
-        case H("DEBUG"): return fmt::fg(fmt::color::white);
-        case H("ERROR"): return fmt::fg(fmt::terminal_color::bright_red);
-        case H("FATAL"): return fmt::fg(fmt::color::red);
+fmt::text_style getModeColor(string a1) {
+    if (!LL::globalConfig.colorLog)
+        return fmt::text_style();
+    switch (H(a1.c_str())) {
+        case H("INFO"):
+            return fmt::fg(fmt::color::light_sea_green);
+        case H("WARN"):
+            return fmt::fg(fmt::color::yellow2);
+        case H("DEBUG"):
+            return fmt::fg(fmt::color::white);
+        case H("ERROR"):
+            return fmt::fg(fmt::terminal_color::bright_red);
+        case H("FATAL"):
+            return fmt::fg(fmt::color::red);
     }
     return fmt::fg(fmt::color::white);
 }
 
 template <typename S, typename Char = fmt::v8::char_t<S>>
-std::string applyTextStyle(const fmt::v8::text_style& ts, const S& format_str)
-{
+std::string applyTextStyle(const fmt::v8::text_style& ts, const S& format_str) {
     fmt::v8::basic_memory_buffer<Char> buf;
     auto fmt = fmt::v8::to_string_view(format_str);
     bool has_style = false;
-    if (ts.has_emphasis())
-    {
+    if (ts.has_emphasis()) {
         has_style = true;
         auto emphasis = fmt::v8::detail::make_emphasis<Char>(ts.get_emphasis());
         buf.append(emphasis.begin(), emphasis.end());
     }
-    if (ts.has_foreground())
-    {
+    if (ts.has_foreground()) {
         has_style = true;
         auto foreground = fmt::v8::detail::make_foreground_color<Char>(ts.get_foreground());
         buf.append(foreground.begin(), foreground.end());
     }
-    if (ts.has_background())
-    {
+    if (ts.has_background()) {
         has_style = true;
         auto background = fmt::v8::detail::make_background_color<Char>(ts.get_background());
         buf.append(background.begin(), background.end());
     }
     buf.append(fmt.begin(), fmt.end());
-    if (has_style) fmt::v8::detail::reset_color<Char>(buf);
+    if (has_style)
+        fmt::v8::detail::reset_color<Char>(buf);
     return fmt::to_string(buf);
 }
 
-void Logger::endlImpl(HMODULE hPlugin, OutputStream& o)
-{
-    try
-    {
+void Logger::endlImpl(HMODULE hPlugin, OutputStream& o) {
+    try {
         CsLockHolder lock(o.logger->getLocker());
 
         std::string title = o.logger->title;
@@ -164,68 +147,54 @@ void Logger::endlImpl(HMODULE hPlugin, OutputStream& o)
 
         auto& text = o.os.str();
         bool filterBanned = false;
-        //Output Filter
+        // Output Filter
         if (LL::globalConfig.enableOutputFilter)
-            for (auto& regexStr : LL::globalConfig.outputFilterRegex)
-            {
-                try
-                {
+            for (auto& regexStr : LL::globalConfig.outputFilterRegex) {
+                try {
                     std::regex re(regexStr);
-                    if (std::regex_search(text, re) || std::regex_search(title, re))
-                    {
+                    if (std::regex_search(text, re) || std::regex_search(title, re)) {
                         filterBanned = true;
                         break;
                     }
-                }
-                catch (...)
-                { }
+                } catch (...) {}
             }
 
-        if (checkLogLevel(o.logger->consoleLevel, o.level) && !filterBanned)
-        {
+        if (checkLogLevel(o.logger->consoleLevel, o.level) && !filterBanned) {
             fmt::print(
                 o.consoleFormat,
                 applyTextStyle(LL::globalConfig.colorLog ? fg(fmt::color::light_blue) : fmt::text_style(),
-                    fmt::format("{:%H:%M:%S}", fmt::localtime(_time64(nullptr)))),
+                               fmt::format("{:%H:%M:%S}", fmt::localtime(_time64(nullptr)))),
                 applyTextStyle(getModeColor(o.levelPrefix), o.levelPrefix),
                 applyTextStyle(LL::globalConfig.colorLog ? o.style : fmt::text_style(), title),
                 applyTextStyle(LL::globalConfig.colorLog ? o.style : fmt::text_style(), text));
-
         }
 
-        if (checkLogLevel(o.logger->fileLevel, o.level) && (LL::globalConfig.onlyFilterConsoleOutput || !filterBanned))
-        {
-            if (o.logger->ofs.is_open() || PluginOwnData::hasImpl(hPlugin, LOGGER_CURRENT_FILE))
-            {
+        if (checkLogLevel(o.logger->fileLevel, o.level) && (LL::globalConfig.onlyFilterConsoleOutput || !filterBanned)) {
+            if (o.logger->ofs.is_open() || PluginOwnData::hasImpl(hPlugin, LOGGER_CURRENT_FILE)) {
                 auto fileContent = fmt::format(o.fileFormat, fmt::localtime(_time64(nullptr)), o.levelPrefix, title, text);
                 if (o.logger->ofs.is_open())
                     o.logger->ofs << fileContent << std::flush;
                 else
                     PluginOwnData::getImpl<std::ofstream>(hPlugin, LOGGER_CURRENT_FILE)
-                    << fileContent << std::flush;
+                        << fileContent << std::flush;
             }
         }
 
-        if (checkLogLevel(o.logger->playerLevel, o.level) && o.logger->player && Player::isValid(o.logger->player)
-            && (LL::globalConfig.onlyFilterConsoleOutput || !filterBanned))
-        {
+        if (checkLogLevel(o.logger->playerLevel, o.level) && o.logger->player && Player::isValid(o.logger->player) && (LL::globalConfig.onlyFilterConsoleOutput || !filterBanned)) {
             o.logger->player->sendTextPacket(
                 fmt::format(o.playerFormat, fmt::localtime(_time64(nullptr)), o.levelPrefix, title, text));
         }
 
         o.os.str("");
         o.os.clear();
-    }
-    catch (...)
-    {
+    } catch (...) {
         std::cerr << "Error in Logger::endlImpl" << std::endl;
         o.os.str("");
         o.os.clear();
     }
 }
 
-Logger::Logger(const std::string& title)
-{
+Logger::Logger(const std::string& title) {
     this->title = title;
     debug = OutputStream{this,
                          5,
@@ -264,7 +233,13 @@ Logger::Logger(const std::string& title)
                          "FATAL"};
 }
 
-//For compatibility
-void Logger::initLockImpl(HMODULE hPlugin) { ; }
-void Logger::lockImpl(HMODULE hPlugin) { ; }
-void Logger::unlockImpl(HMODULE hPlugin) { ; }
\ No newline at end of file
+// For compatibility
+void Logger::initLockImpl(HMODULE hPlugin) {
+    ;
+}
+void Logger::lockImpl(HMODULE hPlugin) {
+    ;
+}
+void Logger::unlockImpl(HMODULE hPlugin) {
+    ;
+}
\ No newline at end of file
diff --git a/LiteLoader/Kernel/MC/ActorAPI.cpp b/LiteLoader/Kernel/MC/ActorAPI.cpp
--- a/LiteLoader/Kernel/MC/ActorAPI.cpp
+++ b/LiteLoader/Kernel/MC/ActorAPI.cpp
@@ -30,8 +30,7 @@ UserEntityIdentifierComponent* Actor::getUserEntityIdentifierComponent() const {
     return SymCall("??$tryGetComponent@VUserEntityIdentifierComponent@@@Actor@@QEAAPEAVUserEntityIdentifierComponent@@XZ", UserEntityIdentifierComponent*, Actor*)((Actor*)this);
 }
 
-MCINLINE Vec3 Actor::getFeetPosition() const
-{
+MCINLINE Vec3 Actor::getFeetPosition() const {
     return CommandUtils::getFeetPos(this);
 }
 
@@ -48,15 +47,13 @@ bool Actor::isSimulatedPlayer() const {
 bool Actor::isPlayer(bool allowSimulatedPlayer) const {
     if (!this)
         return false;
-    try
-    {
-        if(*(void**)this == dlsym("??_7ServerPlayer@@6B@"))
+    try {
+        if (*(void**)this == dlsym("??_7ServerPlayer@@6B@"))
             return true;
-        if(allowSimulatedPlayer && isSimulatedPlayer())
+        if (allowSimulatedPlayer && isSimulatedPlayer())
             return true;
         return false;
-    }
-    catch (...) { return false; }
+    } catch (...) { return false; }
 }
 
 bool Actor::isItemActor() const {
@@ -67,8 +64,7 @@ bool Actor::isOnGround() const {
     return (dAccess<bool, 472>(this)); // IDA DirectActorProxyImpl<IMobMovementProxy>::isOnGround
 }
 #include <MC/ActorDefinitionIdentifier.hpp>
-std::string Actor::getTypeName() const
-{
+std::string Actor::getTypeName() const {
     return getActorIdentifier().getCanonicalName();
 }
 
@@ -87,11 +83,10 @@ Vec2* Actor::getDirection() const {
 }
 
 BlockPos Actor::getBlockPos() {
-    return getPosition().add(0,-1.0,0).toBlockPos();
+    return getPosition().add(0, -1.0, 0).toBlockPos();
 }
 
-BlockInstance Actor::getBlockStandingOn() const
-{
+BlockInstance Actor::getBlockStandingOn() const {
     return Level::getBlockInstance(getBlockPosCurrentlyStandingOn(nullptr), getDimensionId());
 }
 
@@ -104,23 +99,21 @@ ActorUniqueID Actor::getActorUniqueId() const {
 }
 
 static_assert(sizeof(TeleportRotationData) == 32);
-bool Actor::teleport(Vec3 to, int dimID)
-{
+bool Actor::teleport(Vec3 to, int dimID) {
     if (!this->isAlive())
         return false;
     char mem[48];
-    auto computeTarget = (TeleportTarget * (*)(void*, class Actor&, class Vec3, class Vec3*, class AutomaticID<class Dimension, int>, std::optional<TeleportRotationData> const&, int))(&TeleportCommand::computeTarget);   
+    auto computeTarget = (TeleportTarget * (*)(void*, class Actor&, class Vec3, class Vec3*, class AutomaticID<class Dimension, int>, std::optional<TeleportRotationData> const&, int))(&TeleportCommand::computeTarget);
     auto target = computeTarget(mem, *this, to, nullptr, dimID, TeleportRotationData{getRotation().x, getRotation().y, {}}, 15);
     TeleportCommand::applyTarget(*this, *target, false);
     return true;
 }
 
-bool Actor::teleport(Vec3 to, int dimID,float x,float y)
-{
+bool Actor::teleport(Vec3 to, int dimID, float x, float y) {
     char mem[48];
     auto computeTarget = (TeleportTarget * (*)(void*, class Actor&, class Vec3, class Vec3*, class AutomaticID<class Dimension, int>, std::optional<TeleportRotationData> const&, int))(&TeleportCommand::computeTarget);
     auto target = computeTarget(mem, *this, to, nullptr, dimID, TeleportRotationData{x, y, {}}, 15);
-    TeleportCommand::applyTarget(*this, *target,false);
+    TeleportCommand::applyTarget(*this, *target, false);
     return true;
 }
 
@@ -148,7 +141,7 @@ bool Actor::refreshActorData() {
     return true;
 }
 
-bool Actor::setOnFire(int num,bool isEffect) {
+bool Actor::setOnFire(int num, bool isEffect) {
     if (isEffect)
         OnFireSystem::setOnFire(*this, num);
     else
@@ -201,7 +194,7 @@ BlockInstance Actor::getBlockFromViewVector(FaceID& face, bool includeLiquid, bo
             bpos = result.getBlockPos();
             face = result.getFacing();
         }
-        //auto block = const_cast<Block*>(&bs.getBlock(bpos));
+        // auto block = const_cast<Block*>(&bs.getBlock(bpos));
         return Level::getBlockInstance(bpos, bs.getDimensionId());
     }
     return BlockInstance::Null;
@@ -225,35 +218,28 @@ Actor* Actor::getActorFromViewVector(float maxDistance) {
     return result;
 }
 
-bool Actor::addEffect(MobEffect::EffectType type, int tick, int level, bool ambient, bool showParticles, bool showAnimation)
-{
+bool Actor::addEffect(MobEffect::EffectType type, int tick, int level, bool ambient, bool showParticles, bool showAnimation) {
     MobEffectInstance ins = MobEffectInstance((unsigned int)type, tick, level, ambient, showParticles, showAnimation);
     ins.applyEffects(this);
     return true;
 };
 
-std::vector<std::string> Actor::getAllTags()
-{
-    try
-    {
+std::vector<std::string> Actor::getAllTags() {
+    try {
         auto nbt = getNbt();
         auto& list = ((ListTag*)nbt->getListTag("Tags"))->value();
 
         vector<string> res;
-        for (auto& tag : list)
-        {
+        for (auto& tag : list) {
             res.emplace_back(tag->asStringTag()->get());
         }
         return res;
-    }
-    catch (...)
-    {
+    } catch (...) {
         return {};
     }
 }
 
-bool Actor::hasTag(const string& tag)
-{
+bool Actor::hasTag(const string& tag) {
     auto tags = getAllTags();
     return std::find(tags.begin(), tags.end(), tag) != tags.end();
 }
diff --git a/LiteLoader/Kernel/MC/ActorDamageSource.cpp b/LiteLoader/Kernel/MC/ActorDamageSource.cpp
--- a/LiteLoader/Kernel/MC/ActorDamageSource.cpp
+++ b/LiteLoader/Kernel/MC/ActorDamageSource.cpp
@@ -1,8 +1,7 @@
 #include <MC/ActorDamageSource.hpp>
 #include <MC/Level.hpp>
 
-Actor* ActorDamageSource::getEntity()
-{
+Actor* ActorDamageSource::getEntity() {
     ActorUniqueID v6 = getDamagingEntityUniqueID();
     return Global<Level>->getEntity(v6);
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/MC/BiomeAPI.cpp b/LiteLoader/Kernel/MC/BiomeAPI.cpp
--- a/LiteLoader/Kernel/MC/BiomeAPI.cpp
+++ b/LiteLoader/Kernel/MC/BiomeAPI.cpp
@@ -3,30 +3,25 @@
 #include <MC/VanillaBiomes.hpp>
 #include <MC/Level.hpp>
 
-int Biome::getId() const
-{
+int Biome::getId() const {
     return dAccess<int, 120>(this);
 }
 
-std::string const& Biome::getName() const
-{
+std::string const& Biome::getName() const {
     return dAccess<std::string, 8>(this);
 }
 
-Biome* Biome::fromId(int id)
-{
+Biome* Biome::fromId(int id) {
     auto& reg = Global<Level>->getBiomeRegistry();
     return reg.lookupById(id);
 }
 
-Biome* Biome::fromName(std::string const& name)
-{
+Biome* Biome::fromName(std::string const& name) {
     auto& reg = Global<Level>->getBiomeRegistry();
     return reg.lookupByName(name);
 }
 
-std::vector<Biome*> Biome::getBiomesByType(VanillaBiomeTypes type)
-{
+std::vector<Biome*> Biome::getBiomesByType(VanillaBiomeTypes type) {
     std::vector<Biome*> result;
     auto& reg = Global<Level>->getBiomeRegistry();
     reg.forEachBiome([&](Biome& biome) {
@@ -42,8 +37,7 @@ std::vector<Biome*> Biome::getBiomesByType(VanillaBiomeTypes type)
 #include <MC/Minecraft.hpp>
 extern Logger logger;
 
-TClasslessInstanceHook2("startServerThread_TestBiome", void, "?startServerThread@ServerInstance@@QEAAXXZ")
-{
+TClasslessInstanceHook2("startServerThread_TestBiome", void, "?startServerThread@ServerInstance@@QEAAXXZ") {
     Global<Level> = Global<Minecraft>->getLevel();
     auto& reg = Global<Level>->getBiomeRegistry();
     assert(reg.isRegistrationFinished());
@@ -52,8 +46,7 @@ TClasslessInstanceHook2("startServerThread_TestBiome", void, "?startServerThread
         assert(&bio == Biome::fromId(bio.getId()));
         assert(&bio == Biome::fromName(bio.getName()));
     });
-    for (size_t i = 0; i < 20; i++)
-    {
+    for (size_t i = 0; i < 20; i++) {
         auto biomes = Biome::getBiomesByType((VanillaBiomeTypes)i);
         std::string biomesInfo = "";
         for (auto biome : biomes)
diff --git a/LiteLoader/Kernel/MC/BlockAPI.cpp b/LiteLoader/Kernel/MC/BlockAPI.cpp
--- a/LiteLoader/Kernel/MC/BlockAPI.cpp
+++ b/LiteLoader/Kernel/MC/BlockAPI.cpp
@@ -8,8 +8,7 @@
 #include <MC/HashedString.hpp>
 #include <MC/Level.hpp>
 
-Block* Block::create(const string& name, unsigned short tileData)
-{
+Block* Block::create(const string& name, unsigned short tileData) {
     BlockPalette& generator = Global<Level>->getBlockPalette();
     auto blk = generator.getBlockLegacy(name);
     if (!blk)
@@ -17,21 +16,18 @@ Block* Block::create(const string& name, unsigned short tileData)
     return (Block*)((BlockLegacy*)blk)->toBlock(tileData);
 }
 
-Block* Block::create(CompoundTag* nbt) 
-{
+Block* Block::create(CompoundTag* nbt) {
     // pair<enum BlockSerializationUtils::NBTState, Block*>
     auto result = BlockSerializationUtils::tryGetBlockFromNBT(*nbt, nullptr);
     return const_cast<Block*>(result.second);
 }
 
-string Block::getTypeName() const
-{
+string Block::getTypeName() const {
     return Block::getName().getString();
 }
 
 
-int Block::getId() const
-{
+int Block::getId() const {
     return getLegacyBlock().getBlockItemId();
 }
 
diff --git a/LiteLoader/Kernel/MC/BlockActorAPI.cpp b/LiteLoader/Kernel/MC/BlockActorAPI.cpp
--- a/LiteLoader/Kernel/MC/BlockActorAPI.cpp
+++ b/LiteLoader/Kernel/MC/BlockActorAPI.cpp
@@ -8,7 +8,7 @@
 #include <MC/StructureEditorData.hpp>
 
 unsigned int BlockActor::getBlockEntityType(Block* block) {
-    return block->getBlockEntityType(); //IDA Block::getBlockEntityType
+    return block->getBlockEntityType(); // IDA Block::getBlockEntityType
 }
 
 bool BlockActor::refreshData() {
diff --git a/LiteLoader/Kernel/MC/BlockInstanceAPI.cpp b/LiteLoader/Kernel/MC/BlockInstanceAPI.cpp
--- a/LiteLoader/Kernel/MC/BlockInstanceAPI.cpp
+++ b/LiteLoader/Kernel/MC/BlockInstanceAPI.cpp
@@ -12,14 +12,14 @@
 #include <MC/ItemInstance.hpp>
 
 BlockInstance::BlockInstance(Block* block, BlockPos pos, int dimID)
-    : block(block)
-    , pos(pos)
-    , dim(dimID) {
+: block(block)
+, pos(pos)
+, dim(dimID) {
 }
 
 BlockInstance::BlockInstance(BlockPos pos, int dimID)
-    : pos(pos)
-    , dim(dimID) {
+: pos(pos)
+, dim(dimID) {
     block = Level::getBlock(pos, dimID);
 }
 
@@ -48,16 +48,14 @@ bool BlockInstance::hasContainer() {
 }
 
 class DropperBlockActor;
-Container* BlockInstance::getContainer()
-{
+Container* BlockInstance::getContainer() {
     auto be = getBlockEntity();
     if (!be)
         return nullptr;
     return VirtualCall<Container*>(be, 224); // IDA ChestBlockActor::`vftable'{for `RandomizableBlockActorContainerBase'}
 }
 
-bool BlockInstance::breakNaturally(bool isCreativeMode)
-{
+bool BlockInstance::breakNaturally(bool isCreativeMode) {
     auto canDestroy = isCreativeMode || (block->getDestroySpeed() >= 0.0f);
     if (!canDestroy)
         return false;
@@ -70,8 +68,7 @@ bool BlockInstance::breakNaturally(bool isCreativeMode)
     return out;
 }
 
-bool BlockInstance::breakNaturally(ItemStack* tool, bool isCreativeMode)
-{
+bool BlockInstance::breakNaturally(ItemStack* tool, bool isCreativeMode) {
     auto canDestroy = isCreativeMode || (block->getDestroySpeed() >= 0.0f);
     if (!canDestroy)
         return false;
diff --git a/LiteLoader/Kernel/MC/ColorFormatAPI.cpp b/LiteLoader/Kernel/MC/ColorFormatAPI.cpp
--- a/LiteLoader/Kernel/MC/ColorFormatAPI.cpp
+++ b/LiteLoader/Kernel/MC/ColorFormatAPI.cpp
@@ -2,31 +2,30 @@
 #include <LoggerAPI.h>
 extern Logger logger;
 #include <MC/Util.hpp>
-namespace ColorFormat
-{
+namespace ColorFormat {
 std::unordered_map<std::string, const char*> const colorCodeToConsoleMap = {
-    {"§0", "\x1b[38;2;000;000;000m"}, //BLACK
-    {"§1", "\x1b[38;2;000;000;170m"}, //DARK_BLUE
-    {"§2", "\x1b[38;2;000;170;000m"}, //DARK_GREEN
-    {"§3", "\x1b[38;2;000;170;170m"}, //DARK_AQUA
-    {"§4", "\x1b[38;2;170;000;000m"}, //DARK_RED
-    {"§5", "\x1b[38;2;170;000;170m"}, //DARK_PURPLE
-    {"§6", "\x1b[38;2;255;170;000m"}, //GOLD
-    {"§7", "\x1b[38;2;170;170;170m"}, //GRAY
-    {"§8", "\x1b[38;2;085;085;085m"}, //DARK_GRAY
-    {"§9", "\x1b[38;2;085;085;255m"}, //BLUE
-    {"§a", "\x1b[38;2;085;255;085m"}, //GREEN
-    {"§b", "\x1b[38;2;085;255;255m"}, //AQUA
-    {"§c", "\x1b[38;2;255;085;085m"}, //RED
-    {"§d", "\x1b[38;2;255;085;255m"}, //LIGHT_PURPLE
-    {"§e", "\x1b[38;2;255;255;085m"}, //YELLOW
-    {"§f", "\x1b[38;2;255;255;255m"}, //WHITE
-    {"§g", "\x1b[38;2;221;214;005m"}, //MINECOIN_GOLD
+    {"§0", "\x1b[38;2;000;000;000m"}, // BLACK
+    {"§1", "\x1b[38;2;000;000;170m"}, // DARK_BLUE
+    {"§2", "\x1b[38;2;000;170;000m"}, // DARK_GREEN
+    {"§3", "\x1b[38;2;000;170;170m"}, // DARK_AQUA
+    {"§4", "\x1b[38;2;170;000;000m"}, // DARK_RED
+    {"§5", "\x1b[38;2;170;000;170m"}, // DARK_PURPLE
+    {"§6", "\x1b[38;2;255;170;000m"}, // GOLD
+    {"§7", "\x1b[38;2;170;170;170m"}, // GRAY
+    {"§8", "\x1b[38;2;085;085;085m"}, // DARK_GRAY
+    {"§9", "\x1b[38;2;085;085;255m"}, // BLUE
+    {"§a", "\x1b[38;2;085;255;085m"}, // GREEN
+    {"§b", "\x1b[38;2;085;255;255m"}, // AQUA
+    {"§c", "\x1b[38;2;255;085;085m"}, // RED
+    {"§d", "\x1b[38;2;255;085;255m"}, // LIGHT_PURPLE
+    {"§e", "\x1b[38;2;255;255;085m"}, // YELLOW
+    {"§f", "\x1b[38;2;255;255;255m"}, // WHITE
+    {"§g", "\x1b[38;2;221;214;005m"}, // MINECOIN_GOLD
     //{"§", ""},                        //ESCAPE
-    {"§l", "\x1b[1m"},                //BOLD
-    {"§o", "\x1b[3m"},                //ITALIC
-    {"§k", ""},                       //OBFUSCATED
-    {"§r", "\x1b[0m"},                //RESET
+    {"§l", "\x1b[1m"}, // BOLD
+    {"§o", "\x1b[3m"}, // ITALIC
+    {"§k", ""},        // OBFUSCATED
+    {"§r", "\x1b[0m"}, // RESET
 };
 
 std::unordered_map<std::string, mce::Color const> const colorCodeToColorMap = std::unordered_map<std::string, mce::Color const>{
@@ -70,28 +69,23 @@ std::unordered_map<unsigned char, const char*> const decorationToColorCodeMap =
     {97, "§f"},
 };
 
-std::string nearestColorCodeFromColor(mce::Color const& color)
-{
+std::string nearestColorCodeFromColor(mce::Color const& color) {
     double minDst = 10000000.0f;
     std::string minCode = "";
-    for (auto& [code, codeColor] : colorCodeToColorMap)
-    {
+    for (auto& [code, codeColor] : colorCodeToColorMap) {
         auto dst = color.distanceTo(codeColor);
-        //std::cout << code << color.toConsoleCode() << color.toHexString() << " - " << codeColor.toConsoleCode() << codeColor.toHexString() << " - " << dst << std::endl;
-        if (dst < minDst)
-        {
+        // std::cout << code << color.toConsoleCode() << color.toHexString() << " - " << codeColor.toConsoleCode() << codeColor.toHexString() << " - " << dst << std::endl;
+        if (dst < minDst) {
             minDst = dst;
             minCode = code;
         }
     }
-    //std::cout << minCode << color.toConsoleCode() << color.toHexString() << " - " << colorCodeToColorMap.at(minCode).toConsoleCode() << colorCodeToColorMap.at(minCode).toHexString() << " - " << minDst << std::endl;
+    // std::cout << minCode << color.toConsoleCode() << color.toHexString() << " - " << colorCodeToColorMap.at(minCode).toConsoleCode() << colorCodeToColorMap.at(minCode).toHexString() << " - " << minDst << std::endl;
     return minCode;
 }
 
-inline int __readUnsignedChar(unsigned char& out, std::istringstream& iss)
-{
-    while (true)
-    {
+inline int __readUnsignedChar(unsigned char& out, std::istringstream& iss) {
+    while (true) {
         int c = iss.get();
         if (isdigit(c))
             out = out * 10 + c - '0';
@@ -101,16 +95,14 @@ inline int __readUnsignedChar(unsigned char& out, std::istringstream& iss)
     return EOF;
 }
 
-std::string consoleCodeFromColorCode(std::string const& mcCode)
-{
+std::string consoleCodeFromColorCode(std::string const& mcCode) {
     auto iter = colorCodeToConsoleMap.find(mcCode);
     if (iter == colorCodeToConsoleMap.end())
         return "";
     return iter->second;
 }
 
-mce::Color ColorFromConsoleCode(std::string const& console)
-{
+mce::Color ColorFromConsoleCode(std::string const& console) {
     unsigned char decoration = 0;
     unsigned char r = 0;
     unsigned char g = 0;
@@ -122,15 +114,13 @@ mce::Color ColorFromConsoleCode(std::string const& console)
     c = __readUnsignedChar(decoration, iss);
     if (c == EOF)
         return mce::Color::NIL;
-    if (c == 'm')
-    {
+    if (c == 'm') {
         auto codeIter = decorationToColorCodeMap.find(decoration);
         if (codeIter != decorationToColorCodeMap.end())
             return *ColorFromColorCode(codeIter->second);
         return mce::Color::NIL;
     }
-    if (decoration == 38 && c == ';')
-    {
+    if (decoration == 38 && c == ';') {
         unsigned char unk;
         c = __readUnsignedChar(unk, iss);
         if (c != ';')
@@ -149,17 +139,14 @@ mce::Color ColorFromConsoleCode(std::string const& console)
     return mce::Color::NIL;
 }
 
-std::string nearestColorCodeFromConsoleCode(std::string const& code)
-{
+std::string nearestColorCodeFromConsoleCode(std::string const& code) {
     if (code.empty())
         return code;
-    for (auto& [mcCode, consoleCode] : colorCodeToConsoleMap)
-    {
+    for (auto& [mcCode, consoleCode] : colorCodeToConsoleMap) {
         if (consoleCode == code)
             return mcCode;
     }
-    if (code.size() == 19 && code.substr(0, 7) == "\x1b[38;2;" && code.back() == 'm')
-    {
+    if (code.size() == 19 && code.substr(0, 7) == "\x1b[38;2;" && code.back() == 'm') {
         mce::Color color(0, 0, 0);
         color.r = std::stoi(code.substr(7, 7 + 3)) / 255.0f;
         color.g = std::stoi(code.substr(11, 11 + 3)) / 255.0f;
@@ -181,15 +168,13 @@ std::string nearestColorCodeFromConsoleCode(std::string const& code)
     c = __readUnsignedChar(decoration, iss);
     if (c == EOF)
         return "";
-    if (c == 'm')
-    {
+    if (c == 'm') {
         auto codeIter = decorationToColorCodeMap.find(decoration);
         if (codeIter != decorationToColorCodeMap.end())
             return codeIter->second;
         return "";
     }
-    if (decoration == 38 && c == ';')
-    {
+    if (decoration == 38 && c == ';') {
         unsigned char unk;
         c = __readUnsignedChar(unk, iss);
         if (c != ';')
@@ -206,47 +191,38 @@ std::string nearestColorCodeFromConsoleCode(std::string const& code)
         mce::Color color(r, g, b);
         return nearestColorCodeFromColor(color);
     }
-    //std::cout << code << "\\x" << Util::toHex(code.substr(0, 1)) << code.substr(1) << std::endl;
+    // std::cout << code << "\\x" << Util::toHex(code.substr(0, 1)) << code.substr(1) << std::endl;
     return "";
 }
 
-std::string convertToColsole(std::string&& str, bool keepColorCode)
-{
+std::string convertToColsole(std::string&& str, bool keepColorCode) {
     convertToColsole(str, keepColorCode);
     return std::move(str);
 }
 
-std::string& removeColorCode(std::string& str)
-{
+std::string& removeColorCode(std::string& str) {
     size_t size = str.size();
-    for (size_t pos = str.find("§"); pos < size - 2; pos = str.find("§", pos))
-    {
+    for (size_t pos = str.find("§"); pos < size - 2; pos = str.find("§", pos)) {
         str.erase(pos, 3);
         size -= 3;
     }
     return str;
 }
 
-std::string removeColorCode(std::string&& str)
-{
+std::string removeColorCode(std::string&& str) {
     removeColorCode(str);
     return std::move(str);
 }
 
-std::string& convertToColsole(std::string& str, bool keepColorCode)
-{
+std::string& convertToColsole(std::string& str, bool keepColorCode) {
     size_t size = str.size();
-    for (size_t pos = str.find("§"); pos < size - 2; pos = str.find("§", pos))
-    {
+    for (size_t pos = str.find("§"); pos < size - 2; pos = str.find("§", pos)) {
         std::string consoleCode = consoleCodeFromColorCode(str.substr(pos, 3));
-        if (keepColorCode)
-        {
+        if (keepColorCode) {
             str.insert(pos + (str[pos + 2] == 'r' ? 0 : 3), consoleCode);
             pos += consoleCode.size() + 3;
             size += consoleCode.size();
-        }
-        else
-        {
+        } else {
             str.replace(pos, 3, consoleCode);
             pos += consoleCode.size();
             size += consoleCode.size() - 3;
@@ -255,11 +231,9 @@ std::string& convertToColsole(std::string& str, bool keepColorCode)
     return str;
 }
 
-std::string& convertToMc(std::string& str)
-{
+std::string& convertToMc(std::string& str) {
     size_t size = str.size();
-    for (size_t pos = str.find('\x1b'); pos < size - 2; pos = str.find('\x1b', pos))
-    {
+    for (size_t pos = str.find('\x1b'); pos < size - 2; pos = str.find('\x1b', pos)) {
         size_t endPos = str.find('m', pos);
         size_t codeSize = endPos - pos + 1;
         auto consoleCode = str.substr(pos, codeSize);
@@ -273,68 +247,56 @@ std::string& convertToMc(std::string& str)
     return str;
 }
 
-std::string convertToMc(std::string&& str)
-{
+std::string convertToMc(std::string&& str) {
     convertToMc(str);
     return std::move(str);
 }
 
-std::string& transferConsoleColorToColorCode(std::string& str)
-{
+std::string& transferConsoleColorToColorCode(std::string& str) {
     return convertToMc(str);
 }
 
-std::string& transferColorCodeToConsole(std::string& str, bool keepColorCode)
-{
+std::string& transferColorCodeToConsole(std::string& str, bool keepColorCode) {
     return convertToColsole(str, keepColorCode);
 }
 
 #ifdef DEBUG
-inline void testCode(int i)
-{
+inline void testCode(int i) {
     std::cout << "\x1b[" << std::to_string(i) << "mTest-" << std::to_string(i) << std::endl;
 }
-inline std::string mcCodeWithColor(std::string const& code)
-{
+inline std::string mcCodeWithColor(std::string const& code) {
     if (ColorFromColorCode(code))
         return fmt::format("{}{}{}", ColorFromColorCode(code)->toConsoleCode(), code, "\x1b[0m");
     return fmt::format("{}{}{}", "\x1b[0m", code, "\x1b[0m");
 }
-inline std::string consoleCodeWithColor(std::string const& code)
-{
+inline std::string consoleCodeWithColor(std::string const& code) {
     if (code.empty())
         return "";
     return fmt::format("{}\\x{}{}\x1b[0m", code, Util::toHex(code.substr(0, 1)), code.substr(1));
 }
-inline std::string colorWithColor(mce::Color const& color)
-{
+inline std::string colorWithColor(mce::Color const& color) {
     return fmt::format("{}{}{}", color.toConsoleCode(), color.toHexString(), "\x1b[0m");
     return fmt::format("{}mce::Color({}, {}, {}){}", color.toConsoleCode(), color.r, color.b, color.g, "\x1b[0m");
 }
 
-void testAll()
-{
+void testAll() {
     static bool first = true;
     if (!first)
         return;
     first = false;
 
-    for (auto& [dec, code] : decorationToColorCodeMap)
-    {
-        if (ColorFromColorCode(code))
-        {
+    for (auto& [dec, code] : decorationToColorCodeMap) {
+        if (ColorFromColorCode(code)) {
             std::string console = std::string("\x1b[") + std::to_string(dec) + 'm';
             logger.info("{}\"{}\" ,\"{}\"{},", '{', consoleCodeWithColor(console), mcCodeWithColor(code), '}');
         }
     }
-    for (auto& [code, console] : colorCodeToColorMap)
-    {
+    for (auto& [code, console] : colorCodeToColorMap) {
         if (ColorFromColorCode(code))
             logger.info("{}\"{}\" ,{}{},", '{', mcCodeWithColor(code), colorWithColor(console), '}');
     }
 
-    for (auto& [code, console] : colorCodeToConsoleMap)
-    {
+    for (auto& [code, console] : colorCodeToConsoleMap) {
         if (ColorFromColorCode(code))
             logger.info("{}\"{}\" ,\"{}\"{},", '{', mcCodeWithColor(code), consoleCodeWithColor(console), '}');
     }
@@ -362,16 +324,15 @@ void testAll()
     PrintAllColorCode(e);
     PrintAllColorCode(f);
     PrintAllColorCode(g);
-    //PrintColor("§");
-    //PrintColor("§l");
-    //PrintColor("§o");
-    //PrintColor("§k");
-    //PrintColor("§r");
-    //fmt::v8::emphasis emp = fmt::v8::emphasis::bold;
-    //auto color = fmt::v8::detail::make_emphasis<char>(emp);
-    for (int i = 0; i < 255; i++)
-    {
-        //testCode(i);
+    // PrintColor("§");
+    // PrintColor("§l");
+    // PrintColor("§o");
+    // PrintColor("§k");
+    // PrintColor("§r");
+    // fmt::v8::emphasis emp = fmt::v8::emphasis::bold;
+    // auto color = fmt::v8::detail::make_emphasis<char>(emp);
+    for (int i = 0; i < 255; i++) {
+        // testCode(i);
     }
     std::string format;
     format = fmt::v8::detail::make_emphasis<char>(fmt::v8::emphasis::bold);
@@ -384,8 +345,7 @@ void testAll()
     logger.info("{}{}\"{}\", \"\\x{}{}\"{},", format, '{', "§r", Util::toHex(format.substr(0, 1)), format.substr(1), '}');
 }
 }
-TClasslessInstanceHook2("TestColorFormat", void, "?startServerThread@ServerInstance@@QEAAXXZ")
-{
+TClasslessInstanceHook2("TestColorFormat", void, "?startServerThread@ServerInstance@@QEAAXXZ") {
     if (false)
         ColorFormat::testAll();
     original(this);
diff --git a/LiteLoader/Kernel/MC/ContainerAPI.cpp b/LiteLoader/Kernel/MC/ContainerAPI.cpp
--- a/LiteLoader/Kernel/MC/ContainerAPI.cpp
+++ b/LiteLoader/Kernel/MC/ContainerAPI.cpp
@@ -4,25 +4,23 @@
 #include <MC/Level.hpp>
 
 LIAPI std::string Container::getTypeName() {
-    //ContainerType type = dAccess<ContainerType>(this, 8); //IDA Container::Container
+    // ContainerType type = dAccess<ContainerType>(this, 8); //IDA Container::Container
     ContainerType type = getContainerType();
     return getContainerTypeName(type);
 }
 
-//Safely add items to the container
-LIAPI bool Container::addItem_s(ItemStack* item)
-{
+// Safely add items to the container
+LIAPI bool Container::addItem_s(ItemStack* item) {
     if (!hasRoomForItem(*item))
         return false;
     addItem(*((ItemStack*)item)->clone_s());
     return true;
 }
 
-LIAPI bool Container::addItemToFirstEmptySlot_s(ItemStack* item)
-{
+LIAPI bool Container::addItemToFirstEmptySlot_s(ItemStack* item) {
     return addItemToFirstEmptySlot(*((ItemStack*)item)->clone_s());
 }
-//Safely remove items to the container
+// Safely remove items to the container
 LIAPI bool Container::removeItem_s(int slot, unsigned int number) {
     if (slot >= getSize())
         return false;
@@ -41,8 +39,7 @@ LIAPI std::vector<const ItemStack*> Container::getAllSlots() {
     return getSlots();
 }
 
-LIAPI int Container::getSize()
-{
+LIAPI int Container::getSize() {
     // return (*(signed int(__fastcall**)(__int64))(*(_QWORD*)this + 112i64))((unsigned long long)this); //IDA Container::getSlotCopies
     return getContainerSize();
 }
diff --git a/LiteLoader/Kernel/MC/HitResultAPI.cpp b/LiteLoader/Kernel/MC/HitResultAPI.cpp
--- a/LiteLoader/Kernel/MC/HitResultAPI.cpp
+++ b/LiteLoader/Kernel/MC/HitResultAPI.cpp
@@ -9,12 +9,12 @@ Vec3 HitResult::getPos() {
 bool HitResult::isHitLiquid() {
     return dAccess<bool>(this, 80);
 }
-//LIAPI bool HitResult::isEntity() {
-//    return getHitResultType() == HitResultType::ENTITY;
-//}
-//LIAPI bool HitResult::isTile() {
-//    return getHitResultType() == HitResultType::TILE;
-//}
+// LIAPI bool HitResult::isEntity() {
+//     return getHitResultType() == HitResultType::ENTITY;
+// }
+// LIAPI bool HitResult::isTile() {
+//     return getHitResultType() == HitResultType::TILE;
+// }
 BlockPos HitResult::getBlockPos() {
     return dAccess<BlockPos>(this, 32);
 }
@@ -24,13 +24,13 @@ BlockPos HitResult::getLiquidPos() {
 FaceID HitResult::getLiquidFacing() {
     return dAccess<FaceID>(this, 81);
 }
-//LIAPI Vec3 HitResult::getLiquidHitPos();
-//LIAPI HitResultType HitResult::getHitResultType() {
-//    return dAccess<HitResultType>(this, 24);
-//}
+// LIAPI Vec3 HitResult::getLiquidHitPos();
+// LIAPI HitResultType HitResult::getHitResultType() {
+//     return dAccess<HitResultType>(this, 24);
+// }
 
-//static_assert(offsetof(HitResult, endBpos) == 32);
-//static_assert(offsetof(HitResult, unk64) == 64);
-//static_assert(offsetof(HitResult, unk81) == 81);
-//static_assert(offsetof(HitResult, indirectHit) == 108);
-//static_assert(sizeof(HitResult) == 112);
\ No newline at end of file
+// static_assert(offsetof(HitResult, endBpos) == 32);
+// static_assert(offsetof(HitResult, unk64) == 64);
+// static_assert(offsetof(HitResult, unk81) == 81);
+// static_assert(offsetof(HitResult, indirectHit) == 108);
+// static_assert(sizeof(HitResult) == 112);
\ No newline at end of file
diff --git a/LiteLoader/Kernel/MC/I18nAPI.cpp b/LiteLoader/Kernel/MC/I18nAPI.cpp
--- a/LiteLoader/Kernel/MC/I18nAPI.cpp
+++ b/LiteLoader/Kernel/MC/I18nAPI.cpp
@@ -1,11 +1,9 @@
 #include <MC/I18n.hpp>
 #include <MC/Localization.hpp>
 
-Localization const* I18n::getLanguage(std::string const& languageCode)
-{
+Localization const* I18n::getLanguage(std::string const& languageCode) {
     auto loc = _findLocaleFor(languageCode);
-    if (loc)
-    {
+    if (loc) {
         return loc;
     }
     auto backupLanguage = mCurrentLanguage;
diff --git a/LiteLoader/Kernel/MC/ItemStackAPI.cpp b/LiteLoader/Kernel/MC/ItemStackAPI.cpp
--- a/LiteLoader/Kernel/MC/ItemStackAPI.cpp
+++ b/LiteLoader/Kernel/MC/ItemStackAPI.cpp
@@ -16,7 +16,7 @@ using namespace std;
 static_assert(sizeof(ItemStack) == 160);
 static_assert(sizeof(ItemInstance) == 136);
 
-ItemStack *ItemStack::create() {
+ItemStack* ItemStack::create() {
     try {
         return new ItemStack();
     } catch (...) {
@@ -24,8 +24,8 @@ ItemStack *ItemStack::create() {
     }
 }
 
-ItemStack *ItemStack::create(std::unique_ptr<CompoundTag> tag) {
-    ItemStack *item = create();
+ItemStack* ItemStack::create(std::unique_ptr<CompoundTag> tag) {
+    ItemStack* item = create();
     if (!item)
         return nullptr;
     tag->setItemStack(item);
@@ -33,15 +33,14 @@ ItemStack *ItemStack::create(std::unique_ptr<CompoundTag> tag) {
 }
 
 #include <MC/ItemRegistry.hpp>
-ItemStack* ItemStack::create(short itemId, int aux,int count)
-{
+ItemStack* ItemStack::create(short itemId, int aux, int count) {
     auto item = ItemRegistry::getItem(itemId);
     if (item)
         return new ItemStack(*item, count, aux);
     return nullptr;
 }
 
-ItemStack *ItemStack::create(std::string type, int count) {
+ItemStack* ItemStack::create(std::string type, int count) {
     auto nbt = CompoundTag::create();
     nbt->putByte("WasPickedUp", 0);
     nbt->putShort("Damage", 0);
@@ -50,17 +49,16 @@ ItemStack *ItemStack::create(std::string type, int count) {
     return create(std::move(nbt));
 }
 
-ItemStack ItemStack::fromItemInstance(ItemInstance const &ins) {
+ItemStack ItemStack::fromItemInstance(ItemInstance const& ins) {
     try {
         return {ins};
-    }
-    catch (...) {
+    } catch (...) {
         return ItemStack::EMPTY_ITEM;
     }
 }
 
-ItemStack *ItemStack::clone_s() const {
-    ItemStack *a = ItemStack::create();
+ItemStack* ItemStack::clone_s() const {
+    ItemStack* a = ItemStack::create();
     *a = clone();
     return a;
 }
@@ -83,13 +81,13 @@ int ItemStack::getCount() const {
     return dAccess<unsigned char, 34>(this);
 }
 
-bool ItemStack::setItem(ItemStack *newItem) {
+bool ItemStack::setItem(ItemStack* newItem) {
     auto nbt = CompoundTag::fromItemStack(newItem);
     nbt->setItemStack(this);
     return true;
 }
 
-bool ItemStack::setLore(const vector<string> &lores) {
+bool ItemStack::setLore(const vector<string>& lores) {
     if (this->isNull())
         return false;
     this->setCustomLore(lores);
@@ -105,15 +103,13 @@ bool ItemStack::setNbt(CompoundTag* nbt) {
     return true;
 }
 
-int ItemStackBase::getCount() const
-{
+int ItemStackBase::getCount() const {
     if (this->isNull())
         return 0;
     return dAccess<unsigned char, 34>(this);
 }
 
-string ItemStack::getStandardName(const Localization& language)
-{
+string ItemStack::getStandardName(const Localization& language) {
     I18n::chooseLanguage(language);
     string standardName = this->getItem()->buildDescriptionName(*this);
     I18n::chooseLanguage(Global<PropertiesSettings>->getLanguage());
diff --git a/LiteLoader/Kernel/MC/LevelAPI.cpp b/LiteLoader/Kernel/MC/LevelAPI.cpp
--- a/LiteLoader/Kernel/MC/LevelAPI.cpp
+++ b/LiteLoader/Kernel/MC/LevelAPI.cpp
@@ -26,24 +26,20 @@
 #include <MC/PlayerCommandOrigin.hpp>
 
 
-Actor* Level::getEntity(ActorUniqueID uniqueId)
-{
-    try
-    {
+Actor* Level::getEntity(ActorUniqueID uniqueId) {
+    try {
         return SymCall("?fetchEntity@Level@@UEBAPEAVActor@@UActorUniqueID@@_N@Z", Actor*, Level*, ActorUniqueID)(Global<Level>, uniqueId);
-    }
-    catch (...)
-    {
+    } catch (...) {
         return nullptr;
     }
 }
 
 
 BlockSource* Level::getBlockSource(int dimID) {
-    //auto dim = Global<Level>->createDimension(dimID);
+    // auto dim = Global<Level>->createDimension(dimID);
     auto dim = Global<Level>->getDimension(dimID);
     return &dim->getBlockSourceFromMainChunkSource();
-    //return dAccess<BlockSource*>(dim, 96);
+    // return dAccess<BlockSource*>(dim, 96);
 }
 
 BlockSource* Level::getBlockSource(Actor* ac) {
@@ -68,8 +64,7 @@ Block* Level::getBlock(const BlockPos& pos, BlockSource* blockSource) {
 
 
 // Return nullptr when failing to get block
-Block* Level::getBlockEx(const BlockPos& pos, int dimId)
-{
+Block* Level::getBlockEx(const BlockPos& pos, int dimId) {
     auto dim = Global<Level>->getDimension(dimId);
     if (!dim)
         return nullptr;
@@ -112,7 +107,7 @@ BlockActor* Level::getBlockEntity(BlockPos* pos, BlockSource* blockSource) {
 }
 
 BlockActor* Level::getBlockEntity(const BlockPos& pos, int dimId) {
-    return getBlockEntity((BlockPos*) & pos, Level::getBlockSource(dimId));
+    return getBlockEntity((BlockPos*)&pos, Level::getBlockSource(dimId));
 }
 
 BlockActor* Level::getBlockEntity(const BlockPos& pos, BlockSource* blockSource) {
@@ -122,7 +117,7 @@ BlockActor* Level::getBlockEntity(const BlockPos& pos, BlockSource* blockSource)
 
 bool Level::setBlock(const BlockPos& pos, int dim, Block* block) {
     BlockSource* bs = getBlockSource(dim);
-    return bs->setBlock(pos, *block, 3, nullptr,nullptr); // updateFlag = 3 from IDA SetBlockCommand::execute()
+    return bs->setBlock(pos, *block, 3, nullptr, nullptr); // updateFlag = 3 from IDA SetBlockCommand::execute()
 }
 
 bool Level::setBlock(const BlockPos& pos, int dim, const string& name, unsigned short tileData) {
@@ -147,15 +142,13 @@ bool Level::breakBlockNaturally(BlockSource* bs, const BlockPos& pos, ItemStack*
     return getBlockInstance(pos, bs).breakNaturally(item);
 }
 
-bool Level::hasContainer(Vec3 pos, int dim)
-{
-    return getContainer(pos,dim) != nullptr;
+bool Level::hasContainer(Vec3 pos, int dim) {
+    return getContainer(pos, dim) != nullptr;
 }
 
-Container* Level::getContainer(Vec3 pos, int dim)
-{
+Container* Level::getContainer(Vec3 pos, int dim) {
     // VirtualCall<Container*>(getBlockEntity(), 224); // IDA ChestBlockActor::`vftable'{for `RandomizableBlockActorContainerBase'}
-    
+
     // This function didn't use 'this' pointer
     return ((DropperBlockActor*)nullptr)->_getContainerAt(*Level::getBlockSource(dim), pos);
 }
@@ -167,14 +160,12 @@ Actor* Level::getDamageSourceEntity(ActorDamageSource* ads) {
 
 void* Level::ServerCommandOrigin::fake_vtbl[26];
 
-CompoundTag& getServerOriginTag()
-{
+CompoundTag& getServerOriginTag() {
     static auto cached = CompoundTag::fromSNBT(R"({"CommandPermissionLevel":4b,"DimensionId":"Overworld","OriginType":7b,"RequestId":"00000000-0000-0000-0000-000000000000"})");
     return *cached;
 }
 
-std::unique_ptr<CompoundTag> getPlayerOriginTag(Player& player)
-{
+std::unique_ptr<CompoundTag> getPlayerOriginTag(Player& player) {
     static auto cached = CompoundTag::fromSNBT(R"({"OriginType":0b,"PlayerId":0l})");
     auto tag = cached->clone();
     tag->putInt64("PlayerId", player.getUniqueID());
@@ -188,8 +179,7 @@ bool Level::executeCommand(const string& cmd) {
 
 std::unordered_map<CommandOrigin const*, string*> resultOfOrigin = {};
 
-std::pair<bool, string> Level::executeCommandEx(const string& cmd)
-{
+std::pair<bool, string> Level::executeCommandEx(const string& cmd) {
     auto origin = ::ServerCommandOrigin::load(getServerOriginTag(), *Global<ServerLevel>);
     string val;
     auto ptr = origin.get();
@@ -210,37 +200,33 @@ bool Level::executeCommandAs(Player* pl, const string& cmd) {
 
 
 std::vector<Player*> Level::getAllPlayers() {
-    try
-    {
+    try {
         std::vector<Player*> player_list;
         Global<Level>->forEachPlayer([&](Player& sp) -> bool {
             Player* player = &sp;
             player_list.push_back(player);
             return true;
-            });
+        });
         return player_list;
-    }
-    catch (...)
-    {
+    } catch (...) {
         return {};
     }
 }
 
 std::vector<Actor*> Level::getAllEntities(int dimId) {
-    try
-    {
+    try {
         Level* lv = Global<Level>;
         Dimension* dim = lv->getDimension(dimId);
         if (!dim)
             return {};
-        auto& list = *(std::unordered_map<ActorUniqueID, void*>*)((uintptr_t)dim + 320); //IDA Dimension::registerEntity
+        auto& list = *(std::unordered_map<ActorUniqueID, void*>*)((uintptr_t)dim + 320); // IDA Dimension::registerEntity
 
-        //Check Valid
+        // Check Valid
         std::vector<Actor*> result;
         auto currTick = SymCall("?getCurrentTick@Level@@UEBAAEBUTick@@XZ", Tick*, Level*)(lv)->t;
         for (auto& i : list) {
-            //auto entity = SymCall("??$tryUnwrap@VActor@@$$V@WeakEntityRef@@QEBAPEAVActor@@XZ",
-            //    Actor*, void*)(&i.second);
+            // auto entity = SymCall("??$tryUnwrap@VActor@@$$V@WeakEntityRef@@QEBAPEAVActor@@XZ",
+            //     Actor*, void*)(&i.second);
             auto entity = getEntity(i.first);
             if (!entity)
                 continue;
@@ -251,36 +237,32 @@ std::vector<Actor*> Level::getAllEntities(int dimId) {
                 result.push_back(entity);
         }
         return result;
-    }
-    catch (...)
-    {
+    } catch (...) {
         return {};
     }
 }
 
-std::vector<Actor*> Level::getAllEntities()
-{
+std::vector<Actor*> Level::getAllEntities() {
 
-    //std::vector<Actor*> entityList;
-    //auto entities = getAllEntities(0);
-    //entityList.insert(entityList.end(), entities.begin(), entities.end());
-    //entities = getAllEntities(1);
-    //entityList.insert(entityList.end(), entities.begin(), entities.end());
-    //entities = getAllEntities(2);
-    //entityList.insert(entityList.end(), entities.begin(), entities.end());
-    //return entityList;
+    // std::vector<Actor*> entityList;
+    // auto entities = getAllEntities(0);
+    // entityList.insert(entityList.end(), entities.begin(), entities.end());
+    // entities = getAllEntities(1);
+    // entityList.insert(entityList.end(), entities.begin(), entities.end());
+    // entities = getAllEntities(2);
+    // entityList.insert(entityList.end(), entities.begin(), entities.end());
+    // return entityList;
     return Global<Level>->getRuntimeActorList();
 }
 
 Player* Level::getPlayer(const string& info) {
     string target{info};
-    std::transform(target.begin(), target.end(), target.begin(), ::tolower); //lower case the string
-    size_t delta = UINT64_MAX;                                                  //c++ int max
+    std::transform(target.begin(), target.end(), target.begin(), ::tolower); // lower case the string
+    size_t delta = UINT64_MAX;                                               // c++ int max
     Player* found = nullptr;
     Global<Level>->forEachPlayer([&](Player& sp) -> bool {
         Player* p = &sp;
-        if (p->getXuid() == target || p->getRealName() == info)
-        {
+        if (p->getXuid() == target || p->getRealName() == info) {
             found = p;
             return false;
         }
@@ -290,7 +272,7 @@ Player* Level::getPlayer(const string& info) {
 
         //模糊匹配
         if (pName.find(target) == 0) {
-            //0 ís the index where the "target" appear in "pName"
+            // 0 ís the index where the "target" appear in "pName"
             size_t curDelta = pName.length() - target.length();
             if (curDelta == 0) {
                 found = p;
@@ -306,8 +288,7 @@ Player* Level::getPlayer(const string& info) {
     return found;
 }
 
-Player* Level::getPlayer(ActorUniqueID id)
-{
+Player* Level::getPlayer(ActorUniqueID id) {
     return SymCall("?getPlayer@Level@@UEBAPEAVPlayer@@UActorUniqueID@@@Z", Player*, Level*, ActorUniqueID)(Global<Level>, id);
 }
 
@@ -317,8 +298,7 @@ Actor* Level::spawnMob(Vec3 pos, int dimId, std::string name) {
     return sp->spawnMob(pos, dimId, std::move(name));
 }
 
-Actor* Level::cloneMob(Vec3 pos, int dimId, Actor* ac)
-{
+Actor* Level::cloneMob(Vec3 pos, int dimId, Actor* ac) {
     Spawner* sp = &Global<Level>->getSpawner();
     Mob* mob = sp->spawnMob(pos, dimId, std::move(ac->getTypeName()));
     mob->setNbt(ac->getNbt().get());
@@ -343,8 +323,7 @@ ItemStack* Level::getItemStackFromId(short itemId, int aux) {
     return nullptr;
 }
 
-void Level::broadcastText(const string& a1, TextType ty) 
-{
+void Level::broadcastText(const string& a1, TextType ty) {
     if (!Global<Level>)
         return;
     Global<Level>->forEachPlayer([&](Player& sp) -> bool {
@@ -353,8 +332,7 @@ void Level::broadcastText(const string& a1, TextType ty)
     });
 }
 
-void Level::broadcastTitle(const string& text, TitleType Type, int FadeInDuration, int RemainDuration, int FadeOutDuration)
-{
+void Level::broadcastTitle(const string& text, TitleType Type, int FadeInDuration, int RemainDuration, int FadeOutDuration) {
     if (!Global<Level>)
         return;
     Global<Level>->forEachPlayer([&](Player& sp) -> bool {
@@ -363,8 +341,7 @@ void Level::broadcastTitle(const string& text, TitleType Type, int FadeInDuratio
     });
 }
 
-void Level::sendPacketForAllPlayer(Packet& pkt)
-{
+void Level::sendPacketForAllPlayer(Packet& pkt) {
     if (!Global<Level>)
         return;
     auto sender = (LoopbackPacketSender*)Global<Level>->getPacketSender();
@@ -372,32 +349,29 @@ void Level::sendPacketForAllPlayer(Packet& pkt)
         return sender->sendBroadcast(pkt);
 }
 
-std::string Level::getCurrentLevelName()
-{
+std::string Level::getCurrentLevelName() {
     if (Global<PropertiesSettings>)
         return Global<PropertiesSettings>->getLevelName();
     std::ifstream fin("server.properties");
     string buf;
-    while (getline(fin, buf))
-    {
-        if (buf.find("level-name=") != string::npos)
-        {
-            if (buf.back() == '\n') buf.pop_back();
-            if (buf.back() == '\r') buf.pop_back();
+    while (getline(fin, buf)) {
+        if (buf.find("level-name=") != string::npos) {
+            if (buf.back() == '\n')
+                buf.pop_back();
+            if (buf.back() == '\r')
+                buf.pop_back();
             return buf.substr(11);
         }
     }
     return "";
 }
 
-std::string Level::getCurrentLevelPath()
-{
+std::string Level::getCurrentLevelPath() {
     return "./worlds/" + getCurrentLevelName();
 }
 
 int64_t BossID = 7492341231332ull;
 
-int64_t Level::createBossEvent()
-{
+int64_t Level::createBossEvent() {
     return ++BossID;
 }
\ No newline at end of file
diff --git a/LiteLoader/MolangAPI.cpp b/LiteLoader/Kernel/MC/MolangAPI.cpp
similarity index 99%
rename from LiteLoader/MolangAPI.cpp
rename to LiteLoader/Kernel/MC/MolangAPI.cpp
--- a/LiteLoader/MolangAPI.cpp
+++ b/LiteLoader/Kernel/MC/MolangAPI.cpp
@@ -7,7 +7,7 @@
 //      static local MolangInstance instance("(!query.is_in_water)&&query.is_in_water_or_rain")
 //  ...
 //      instance.evalAsFloat(actor);
-// 	...
+//  ...
 //      bool isInRain = instance.evalAsFloat(actor)==(float)1.0;
 //  ...
 //      Json::Value isInRain = instance.evalAsJson(actor);
diff --git a/LiteLoader/Kernel/MC/PlayerAPI.cpp b/LiteLoader/Kernel/MC/PlayerAPI.cpp
--- a/LiteLoader/Kernel/MC/PlayerAPI.cpp
+++ b/LiteLoader/Kernel/MC/PlayerAPI.cpp
@@ -43,14 +43,12 @@
 
 extern Logger logger;
 
-NetworkIdentifier* Player::getNetworkIdentifier() 
-{
+NetworkIdentifier* Player::getNetworkIdentifier() {
     return (NetworkIdentifier*)(getUserEntityIdentifierComponent());
 }
 
 
-Certificate* Player::getCertificate() 
-{
+Certificate* Player::getCertificate() {
     UserEntityIdentifierComponent* ueic = getUserEntityIdentifierComponent();
     if (ueic) {
         return ueic->mCertificate.get();
@@ -58,47 +56,39 @@ Certificate* Player::getCertificate()
     return nullptr;
 }
 
-std::string Player::getRealName() 
-{
+std::string Player::getRealName() {
     if (isSimulatedPlayer())
         return dAccess<std::string>(this, 2472);
     return ExtendedCertificate::getIdentityName(*getCertificate());
 }
 
-int Player::getAvgPing() 
-{
+int Player::getAvgPing() {
     if (isSimulatedPlayer())
         return -1;
     return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().avgping;
 }
 
-int Player::getLastPing() 
-{
+int Player::getLastPing() {
     if (isSimulatedPlayer())
         return -1;
     return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().ping;
 }
 
-string Player::getIP()
-{
+string Player::getIP() {
     if (isSimulatedPlayer())
         return "127.0.0.1";
     return getNetworkIdentifier()->getIP();
 }
 
 #include <MC/Localization.hpp>
-string Player::getLanguageCode()
-{
-    if (isSimulatedPlayer())
-    {
+string Player::getLanguageCode() {
+    if (isSimulatedPlayer()) {
         return I18n::getCurrentLanguage()->getFullLanguageCode();
     }
     auto map = Global<ServerNetworkHandler>->fetchConnectionRequest(*getNetworkIdentifier()).rawToken.get()->dataInfo.value_.map_;
-    for (auto & iter : *map) 
-    {
+    for (auto& iter : *map) {
         string s(iter.first.c_str());
-        if (s.find("LanguageCode") != std::string::npos) 
-        {
+        if (s.find("LanguageCode") != std::string::npos) {
             auto langCode = iter.second.value_.string_;
             return langCode;
         }
@@ -106,16 +96,13 @@ string Player::getLanguageCode()
     return "unknown";
 }
 
-string Player::getServerAddress() 
-{
+string Player::getServerAddress() {
     if (isSimulatedPlayer())
         return "unknown";
     auto map = Global<ServerNetworkHandler>->fetchConnectionRequest(*getNetworkIdentifier()).rawToken.get()->dataInfo.value_.map_;
-    for (auto iter = map->begin(); iter != map->end(); ++iter) 
-    {
+    for (auto iter = map->begin(); iter != map->end(); ++iter) {
         string s(iter->first.c_str());
-        if (s.find("ServerAddress") != s.npos) 
-        {
+        if (s.find("ServerAddress") != s.npos) {
             auto ServerAddress = iter->second.value_.string_;
             return ServerAddress;
         }
@@ -123,10 +110,8 @@ string Player::getServerAddress()
     return "unknown";
 }
 
-string Player::getDeviceTypeName() 
-{
-    switch ((int)getPlatform()) 
-    {
+string Player::getDeviceTypeName() {
+    switch ((int)getPlatform()) {
         case -1:
             return "Unknown";
         case 1:
@@ -164,54 +149,47 @@ string Player::getDeviceTypeName()
     }
 }
 
-bool Player::kick(const std::string& msg) 
-{
+bool Player::kick(const std::string& msg) {
     NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier();
     Global<ServerNetworkHandler>->disconnectClient(*pNetworkIdentifier, msg, 0);
     return true;
 }
 
-bool Player::sendText(const std::string& text, TextType type)
-{
+bool Player::sendText(const std::string& text, TextType type) {
     return sendTextPacket(text, type);
 }
 
-bool Player::talkAs(const std::string& msg)
-{
+bool Player::talkAs(const std::string& msg) {
     return sendTextTalkPacket(msg);
 }
 
-bool Player::giveItem(ItemStack* item) 
-{
+bool Player::giveItem(ItemStack* item) {
     if (!this->add(*item))
         return false;
     refreshInventory();
     return true;
 }
 
-int Player::clearItem(string typeName) 
-{
+int Player::clearItem(string typeName) {
     int res = 0;
 
-    //Hand
+    // Hand
     ItemStack* item = getHandSlot();
-    if (item->getTypeName() == typeName) 
-    {
+    if (item->getTypeName() == typeName) {
         auto out = item->getCount();
         item->setNull();
         res += out;
     }
 
-    //OffHand
+    // OffHand
     item = (ItemStack*)&getOffhandSlot();
-    if (item->getTypeName() == typeName) 
-    {
+    if (item->getTypeName() == typeName) {
         auto out = item->getCount();
         item->setNull();
         res += out;
     }
 
-    //Inventory
+    // Inventory
     Container* container = &getInventory();
     auto items = container->getAllSlots();
     int size = container->getSize();
@@ -223,7 +201,7 @@ int Player::clearItem(string typeName)
         }
     }
 
-    //Armor
+    // Armor
     auto& armor = getArmorContainer();
     items = armor.getAllSlots();
     size = armor.getSize();
@@ -238,23 +216,19 @@ int Player::clearItem(string typeName)
     return res;
 }
 
-string Player::getName() 
-{
+string Player::getName() {
     return getNameTag();
 }
 
-bool Player::runcmd(const string& cmd)
-{
+bool Player::runcmd(const string& cmd) {
     return sendCommandRequestPacket(cmd);
 }
 
-Container* Player::getEnderChestContainer() 
-{
+Container* Player::getEnderChestContainer() {
     return dAccess<Container*>(this, 4960); // IDA Player::Player() 782
 }
 
-bool Player::transferServer(const string& address, unsigned short port)
-{
+bool Player::transferServer(const string& address, unsigned short port) {
     return sendTransferPacket(address, port);
 }
 
@@ -270,13 +244,11 @@ std::pair<BlockPos, int> Player::getRespawnPosition() {
     return {bp, dimId};
 }
 
-std::unique_ptr<CompoundTag> Player::getNbt() 
-{
+std::unique_ptr<CompoundTag> Player::getNbt() {
     return CompoundTag::fromPlayer(this);
 }
 
-bool Player::setNbt(CompoundTag* nbt) 
-{
+bool Player::setNbt(CompoundTag* nbt) {
     nbt->setPlayer(this);
     return true;
 }
@@ -284,17 +256,14 @@ bool Player::setNbt(CompoundTag* nbt)
 #include <MC/AttributeInstance.hpp>
 #include <MC/HashedString.hpp>
 #include <LiteLoader/Header/SendPacketAPI.h>
-bool Player::refreshAttribute(class Attribute const& attribute)
-{
+bool Player::refreshAttribute(class Attribute const& attribute) {
     return refreshAttributes({&attribute});
 }
-bool Player::refreshAttributes(std::vector<Attribute const*> const& attributes)
-{
+bool Player::refreshAttributes(std::vector<Attribute const*> const& attributes) {
     BinaryStream wp;
     wp.writeUnsignedVarInt64(getRuntimeID()); // EntityId
     wp.writeUnsignedVarInt((unsigned)attributes.size());
-    for (auto attribute : attributes)
-    {
+    for (auto attribute : attributes) {
         auto& instance = getAttribute(*attribute);
         wp.writeFloat(instance.getMinValue());
         wp.writeFloat(instance.getMaxValue());
@@ -309,48 +278,48 @@ bool Player::refreshAttributes(std::vector<Attribute const*> const& attributes)
     return true;
 }
 
-string Player::getUuid() 
-{
+string Player::getUuid() {
     auto ueic = getUserEntityIdentifierComponent();
     if (!ueic)
         return "";
     return ueic->mUUID.asString();
 }
 
-unsigned char Player::getClientSubId()
-{
+unsigned char Player::getClientSubId() {
     auto ueic = getUserEntityIdentifierComponent();
     if (!ueic)
         return -1;
     return ueic->mClientSubId;
 }
 
-float Player::getAvgPacketLoss()
-{
+float Player::getAvgPacketLoss() {
     if (isSimulatedPlayer())
         return 0.f;
     return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().avgpacketloss;
 }
 
-string Player::getClientId() 
-{
+float Player::getLastPacketLoss() {
+    if (isSimulatedPlayer()) {
+        return 0.f;
+    }
+    return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().packetloss;
+}
+
+string Player::getClientId() {
     if (isSimulatedPlayer())
         return "";
     return Global<ServerNetworkHandler>->fetchConnectionRequest(*getNetworkIdentifier()).getDeviceId();
 }
 
-int Player::getDeviceType() 
-{
+int Player::getDeviceType() {
     return getPlatform();
 }
 
-bool Player::isOperator()
-{
+bool Player::isOperator() {
     return (int)getPlayerPermissionLevel() >= 2;
 }
 
-bool Player::isOP()
-{
+bool Player::isOP() {
     return isOperator();
 }
 
@@ -362,7 +331,8 @@ int Player::getCurrentExperience() {
 
 bool Player::setCurrentExperience(int exp) {
     auto attr = getMutableAttribute(Player::EXPERIENCE);
-    if (!attr) return false;
+    if (!attr)
+        return false;
     int levelExp = getXpNeededForNextLevel();
     attr->setCurrentValue(static_cast<float>(exp) / levelExp);
     return true;
@@ -387,7 +357,7 @@ bool Player::setTotalExperience(size_t exp) {
             addExperience(static_cast<int>(exp));
         } else {
             // reach max level
-            addExperience(INT32_MAX); 
+            addExperience(INT32_MAX);
         }
         return true;
     }
@@ -395,7 +365,8 @@ bool Player::setTotalExperience(size_t exp) {
 
 bool Player::reduceExperience(size_t exp) {
     auto attr = getMutableAttribute(Player::EXPERIENCE);
-    if (!attr) return false;
+    if (!attr)
+        return false;
     int neededExp = getXpNeededForNextLevel();
     int currExp = static_cast<int>(attr->getCurrentValue() * neededExp);
     if (exp <= currExp) {
@@ -432,14 +403,13 @@ int Player::getXpNeededForLevel(int nextLevel) {
 
 size_t Player::getTotalXpNeededForLevel(int level) {
     size_t result = 0;
-    for (int i = 1; i <= level; i++) {
+    for (int i = 1; i <= level; ++i) {
         result += getXpNeededForLevel(i);
     }
     return result;
 }
 
-bool Player::crashClient() 
-{
+bool Player::crashClient() {
     if (isSimulatedPlayer())
         return false;
     auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::LevelChunk);
@@ -448,13 +418,11 @@ bool Player::crashClient()
     return true;
 }
 
-bool Player::setSidebar(const std::string& title, const std::vector<std::pair<std::string, int>>& data, ObjectiveSortOrder sortOrder)
-{
+bool Player::setSidebar(const std::string& title, const std::vector<std::pair<std::string, int>>& data, ObjectiveSortOrder sortOrder) {
     sendSetDisplayObjectivePacket(title, "FakeScoreObj", (char)sortOrder);
 
     vector<ScorePacketInfo> info;
-    for (auto& x : data)
-    {
+    for (auto& x : data) {
         const ScoreboardId& id = ScoreboardId(NewScoreId());
         ScorePacketInfo i((ScoreboardId*)&id, "FakeScoreObj", IdentityDefinition::Type::Fake, x.second, x.first);
         info.emplace_back(i);
@@ -463,38 +431,31 @@ bool Player::setSidebar(const std::string& title, const std::vector<std::pair<st
     return sendSetDisplayObjectivePacket(title, "FakeScoreObj", (char)sortOrder);
 }
 
-bool Player::removeSidebar()
-{
+bool Player::removeSidebar() {
     return sendSetDisplayObjectivePacket("", "", (char)0);
 }
 
-int Player::getScore(const string& key)
-{
+int Player::getScore(const string& key) {
     return Scoreboard::getScore(this, key);
 }
 
-bool Player::setScore(const string& key, int value)
-{
+bool Player::setScore(const string& key, int value) {
     return Scoreboard::setScore(this, key, value);
 }
 
-bool Player::addScore(const string& key, int value)
-{
+bool Player::addScore(const string& key, int value) {
     return Scoreboard::addScore(this, key, value);
 }
 
-bool Player::reduceScore(const string& key, int value)
-{
+bool Player::reduceScore(const string& key, int value) {
     return Scoreboard::reduceScore(this, key, value);
 }
 
-bool Player::deleteScore(const string& key)
-{
+bool Player::deleteScore(const string& key) {
     return Scoreboard::deleteScore(this, key);
 }
 
-void Player::addBossEvent(int64_t uid, string name, float percent, BossEventColour colour, int overlay)
-{
+void Player::addBossEvent(int64_t uid, string name, float percent, BossEventColour colour, int overlay) {
     BinaryStream wp;
     wp.writeVarInt64(uid);
     wp.writeUnsignedVarInt((int)0);
@@ -509,8 +470,7 @@ void Player::addBossEvent(int64_t uid, string name, float percent, BossEventColo
     sendNetworkPacket(*pkt);
 }
 
-void Player::removeBossEvent(int64_t uid)
-{
+void Player::removeBossEvent(int64_t uid) {
     BinaryStream wp;
     wp.writeVarInt64(uid);
     wp.writeUnsignedVarInt((int)2);
@@ -519,8 +479,7 @@ void Player::removeBossEvent(int64_t uid)
     sendNetworkPacket(*pkt);
 }
 
-void Player::updateBossEvent(int64_t uid, string name, float percent, BossEventColour colour, int overlay)
-{
+void Player::updateBossEvent(int64_t uid, string name, float percent, BossEventColour colour, int overlay) {
     removeBossEvent(uid);
     addBossEvent(uid, name, percent, colour, overlay);
 }
@@ -531,8 +490,7 @@ void Player::updateBossEvent(int64_t uid, string name, float percent, BossEventC
 static_assert(sizeof(TextPacket) == 216);
 static_assert(sizeof(TransferPacket) == 88);
 
-bool Player::sendTextPacket(string text, TextType Type) const
-{
+bool Player::sendTextPacket(string text, TextType Type) const {
     BinaryStream wp;
     wp.reserve(8 + text.size());
     wp.writeUnsignedChar((char)Type);
@@ -570,8 +528,7 @@ bool Player::sendToastPacket(string title, string msg) {
     return true;
 }
 
-bool Player::sendTitlePacket(string text, TitleType Type, int FadeInDuration, int RemainDuration, int FadeOutDuration) const 
-{
+bool Player::sendTitlePacket(string text, TitleType Type, int FadeInDuration, int RemainDuration, int FadeOutDuration) const {
     BinaryStream wp;
     wp.reserve(8 + text.size());
     wp.writeVarInt((int)Type);
@@ -588,8 +545,7 @@ bool Player::sendTitlePacket(string text, TitleType Type, int FadeInDuration, in
     return true;
 }
 
-bool Player::sendNotePacket(unsigned int tone) 
-{
+bool Player::sendNotePacket(unsigned int tone) {
     if (tone == 0) {
         return false;
     }
@@ -610,16 +566,15 @@ bool Player::sendNotePacket(unsigned int tone)
     return true;
 }
 
-bool Player::sendSpawnParticleEffectPacket(Vec3 spawnPos, int dimID, string ParticleName, int64_t EntityUniqueID) const 
-{
+bool Player::sendSpawnParticleEffectPacket(Vec3 spawnPos, int dimID, string ParticleName, int64_t EntityUniqueID) const {
     BinaryStream wp;
     wp.writeUnsignedChar(dimID);
-    //If EntityUniqueID is not -1, the Position below will be interpreted as relative to the position of the entity associated with this unique ID.
+    // If EntityUniqueID is not -1, the Position below will be interpreted as relative to the position of the entity associated with this unique ID.
     wp.writeVarInt64(EntityUniqueID);
     wp.writeFloat(spawnPos.x);
     wp.writeFloat(spawnPos.y);
     wp.writeFloat(spawnPos.z);
-    //ParticleName is the name of the particle that should be shown. This name may point to a particle effect that is built-in, or to one implemented by behaviour packs.
+    // ParticleName is the name of the particle that should be shown. This name may point to a particle effect that is built-in, or to one implemented by behaviour packs.
     wp.writeString(ParticleName);
 
     auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::SpawnParticleEffect);
@@ -628,36 +583,34 @@ bool Player::sendSpawnParticleEffectPacket(Vec3 spawnPos, int dimID, string Part
     return true;
 }
 
-bool Player::sendPlaySoundPacket(string SoundName, Vec3 Position, float Volume, float Pitch) const 
-{
+bool Player::sendPlaySoundPacket(string SoundName, Vec3 Position, float Volume, float Pitch) const {
     PlaySoundPacket playSoundPkt(std::move(SoundName), Position, Volume, Pitch);
     sendNetworkPacket(playSoundPkt);
     return true;
 }
 
 // Bad?
-bool Player::sendAddItemEntityPacket(unsigned long long runtimeID, Item const& item, int stackSize, short aux, Vec3 pos, vector<std::unique_ptr<DataItem>> dataItems) const
-{
+bool Player::sendAddItemEntityPacket(unsigned long long runtimeID, Item const& item, int stackSize, short aux, Vec3 pos, vector<std::unique_ptr<DataItem>> dataItems) const {
     BinaryStream wp;
-    wp.writeVarInt64(runtimeID);                                   //RuntimeId
-    wp.writeUnsignedVarInt64(runtimeID);                           //EntityId
+    wp.writeVarInt64(runtimeID);         // RuntimeId
+    wp.writeUnsignedVarInt64(runtimeID); // EntityId
 
     // NetworkItemStackDescriptor
     ItemStackDescriptor desc(item, aux, stackSize, nullptr);
     NetworkItemStackDescriptor netDesc(desc);
     wp.writeType(netDesc);
-    //wp.writeBool(true);                                            //hasNetID
-    //wp.writeVarInt(itemID);                                        //ItemId
-    //wp.writeUnsignedShort(static_cast<unsigned short>(stackSize)); //StackSize
-    //wp.writeUnsignedVarInt(aux);                                   //Aux
-    //wp.writeUnsignedVarInt(110);
-    //wp.writeVarInt(0);
-    //wp.writeString("minecraft:apple");
-
-    wp.writeType(pos);        //mPos
-    wp.writeType(Vec3::ZERO); //mVelocity
-    wp.writeType(dataItems);  //EntityMetadata & DataItem
-    wp.writeBool(false);       //isFromFishing
+    // wp.writeBool(true);                                            //hasNetID
+    // wp.writeVarInt(itemID);                                        //ItemId
+    // wp.writeUnsignedShort(static_cast<unsigned short>(stackSize)); //StackSize
+    // wp.writeUnsignedVarInt(aux);                                   //Aux
+    // wp.writeUnsignedVarInt(110);
+    // wp.writeVarInt(0);
+    // wp.writeString("minecraft:apple");
+
+    wp.writeType(pos);        // mPos
+    wp.writeType(Vec3::ZERO); // mVelocity
+    wp.writeType(dataItems);  // EntityMetadata & DataItem
+    wp.writeBool(false);      // isFromFishing
 
     auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::AddItemActor);
     pkt->read(wp);
@@ -665,8 +618,7 @@ bool Player::sendAddItemEntityPacket(unsigned long long runtimeID, Item const& i
     return true;
 }
 
-bool Player::sendAddEntityPacket(unsigned long long runtimeID, string entityType, Vec3 pos, Vec2 rotation, float headYaw, vector<std::unique_ptr<DataItem>> dataItems)
-{
+bool Player::sendAddEntityPacket(unsigned long long runtimeID, string entityType, Vec3 pos, Vec2 rotation, float headYaw, vector<std::unique_ptr<DataItem>> dataItems) {
     BinaryStream bs;
     bs.writeVarInt64(runtimeID);
     bs.writeUnsignedVarInt64(runtimeID);
@@ -683,14 +635,13 @@ bool Player::sendAddEntityPacket(unsigned long long runtimeID, string entityType
 
     // Links
     bs.writeUnsignedVarInt(0);
- 
+
     NetworkPacket<13> pkt(bs.getAndReleaseData());
     sendNetworkPacket(pkt);
     return true;
 }
 
-bool Player::sendUpdateBlockPacket(BlockPos const& bpos, unsigned int runtimeId, UpdateBlockFlags flag, UpdateBlockLayer layer)
-{
+bool Player::sendUpdateBlockPacket(BlockPos const& bpos, unsigned int runtimeId, UpdateBlockFlags flag, UpdateBlockLayer layer) {
     BinaryStream wp;
     wp.writeVarInt(bpos.x);
     wp.writeUnsignedVarInt(bpos.y);
@@ -703,26 +654,22 @@ bool Player::sendUpdateBlockPacket(BlockPos const& bpos, unsigned int runtimeId,
     sendNetworkPacket(*pkt);
     return true;
 }
-bool Player::sendUpdateBlockPacket(BlockPos const& bpos, const Block& block, UpdateBlockFlags flag, UpdateBlockLayer layer)
-{
+bool Player::sendUpdateBlockPacket(BlockPos const& bpos, const Block& block, UpdateBlockFlags flag, UpdateBlockLayer layer) {
     return sendUpdateBlockPacket(bpos, block.getRuntimeId(), flag, layer);
 }
 
-bool Player::sendTransferPacket(const string& address, short port) const 
-{
+bool Player::sendTransferPacket(const string& address, short port) const {
     TransferPacket transferPkt(address, port);
     sendNetworkPacket(transferPkt);
     return true;
 }
 
-bool Player::sendSetDisplayObjectivePacket(const string& title, const string& name, char sortOrder) const 
-{
+bool Player::sendSetDisplayObjectivePacket(const string& title, const string& name, char sortOrder) const {
     sendNetworkPacket(SetDisplayObjectivePacket("sidebar", name, title, "dummy", ObjectiveSortOrder(sortOrder)));
     return true;
 }
 
-bool Player::sendSetScorePacket(char type, const vector<ScorePacketInfo>& data) 
-{
+bool Player::sendSetScorePacket(char type, const vector<ScorePacketInfo>& data) {
     auto packet = MinecraftPackets::createPacket(0x6c);
     dAccess<char>(packet.get(), 48) = type;
     dAccess<vector<ScorePacketInfo>>(packet.get(), 56) = data;
@@ -730,31 +677,26 @@ bool Player::sendSetScorePacket(char type, const vector<ScorePacketInfo>& data)
     return true;
 }
 
-bool Player::sendBossEventPacket(BossEvent type, string name, float percent, BossEventColour colour, int overlay)
-{
+bool Player::sendBossEventPacket(BossEvent type, string name, float percent, BossEventColour colour, int overlay) {
     BinaryStream wp;
     wp.writeVarInt64(getUniqueID() + 1145141919);
     wp.writeUnsignedVarInt((int)type);
-    switch (type)
-    {
+    switch (type) {
         case BossEvent::Show:
             wp.writeString(name);
             wp.writeFloat(percent);
             goto LABEL_3;
         case BossEvent::RegisterPlayer:
         case BossEvent::UnregisterPlayer:
-        case BossEvent::ResendRaidBossEventData:
-        {
+        case BossEvent::ResendRaidBossEventData: {
             wp.writeVarInt64(getUniqueID() + 1145141919);
             break;
         }
-        case BossEvent::HealthPercentage:
-        {
+        case BossEvent::HealthPercentage: {
             wp.writeFloat(percent);
             break;
         }
-        case BossEvent::Title:
-        {
+        case BossEvent::Title: {
             wp.writeString(name);
             break;
         }
@@ -772,45 +714,37 @@ bool Player::sendBossEventPacket(BossEvent type, string name, float percent, Bos
     auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::BossEvent);
     pkt->read(wp);
     sendAddEntityPacket(getUniqueID() + 1145141919, "player", Vec3(getPos().x, (float)-70, getPos().z), Vec2{0, 0}, 0);
-    if (type != BossEvent::Hide)
-    {
+    if (type != BossEvent::Hide) {
         sendBossEventPacket(BossEvent::Hide, "", 0, BossEventColour::White);
     }
     sendNetworkPacket(*pkt);
     return true;
 }
 
-bool Player::sendCommandRequestPacket(const string& cmd) 
-{
+bool Player::sendCommandRequestPacket(const string& cmd) {
     auto packet = MinecraftPackets::createPacket(0x4d);
     dAccess<string, 48>(packet.get()) = cmd;
     Global<ServerNetworkHandler>->handle(*getNetworkIdentifier(), *((CommandRequestPacket*)packet.get()));
     return true;
 }
 
-bool Player::sendTextTalkPacket(const string& msg) 
-{
+bool Player::sendTextTalkPacket(const string& msg) {
     return sendTextTalkPacket(msg, nullptr);
 }
 #include <Utils/DbgHelper.h>
-bool Player::sendTextTalkPacket(const string& msg, Player* target)
-{
+bool Player::sendTextTalkPacket(const string& msg, Player* target) {
     auto packet = TextPacket::createChat(getName(), msg, getXuid(), "");
-    if (target == nullptr)
-    {
+    if (target == nullptr) {
         Global<ServerNetworkHandler>->handle(*getNetworkIdentifier(), packet);
         return true;
     }
-    try
-    {
+    try {
         Event::PlayerChatEvent ev;
         ev.mMessage = msg;
         ev.mPlayer = this;
         if (!ev.call())
             return false;
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Event Callback Failed!");
         logger.error("Uncaught Exception Detected!");
         logger.error("In Event: PlayerChatEvent");
@@ -820,8 +754,7 @@ bool Player::sendTextTalkPacket(const string& msg, Player* target)
     return true;
 }
 
-bool Player::sendRawFormPacket(unsigned formId, const string& data) const
-{
+bool Player::sendRawFormPacket(unsigned formId, const string& data) const {
     BinaryStream wp;
     wp.reserve(32 + data.size());
     wp.writeUnsignedVarInt(formId);
@@ -833,17 +766,14 @@ bool Player::sendRawFormPacket(unsigned formId, const string& data) const
     return true;
 }
 
-bool Player::sendSimpleForm(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(Player*, int)> callback) const
-{
+bool Player::sendSimpleForm(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(Player*, int)> callback) const {
     nlohmann::json model = R"({"title": "","content":"","buttons":[],"type":"form"})"_json;
     model["title"] = title;
     model["content"] = content;
-    for (int i = 0; i < buttons.size(); ++i)
-    {
+    for (int i = 0; i < buttons.size(); ++i) {
         nlohmann::json oneButton = "{}"_json;
         oneButton["text"] = buttons[i];
-        if (!images[i].empty())
-        {
+        if (!images[i].empty()) {
             nlohmann::json image = "{}"_json;
             image["type"] = images[i].find("textures/") == 0 ? "path" : "url";
             image["data"] = images[i];
@@ -860,13 +790,12 @@ bool Player::sendSimpleForm(const string& title, const string& content, const ve
     return true;
 }
 
-bool Player::sendModalForm(const string& title, const string& content, const string& button1, const string& button2, std::function<void(Player*, bool)> callback) const
-{
+bool Player::sendModalForm(const string& title, const string& content, const string& confirmButton, const string& cancelButton, std::function<void(Player*, bool)> callback) const {
     nlohmann::json model = R"({"title":"","content":"","button1":"","button2":"","type":"modal"})"_json;
     model["title"] = title;
     model["content"] = content;
-    model["button1"] = button1;
-    model["button2"] = button2;
+    model["button1"] = confirmButton;
+    model["button2"] = cancelButton;
     std::string data = model.dump();
     unsigned formId = NewFormId();
     if (!sendRawFormPacket(formId, data))
@@ -875,8 +804,7 @@ bool Player::sendModalForm(const string& title, const string& content, const str
     return true;
 }
 
-bool Player::sendCustomForm(const std::string& data, std::function<void(Player*, string)> callback) const
-{
+bool Player::sendCustomForm(const std::string& data, std::function<void(Player*, string)> callback) const {
     unsigned formId = NewFormId();
     if (!sendRawFormPacket(formId, data))
         return false;
@@ -884,8 +812,7 @@ bool Player::sendCustomForm(const std::string& data, std::function<void(Player*,
     return true;
 }
 
-bool Player::isValid(Player* player)
-{
+bool Player::isValid(Player* player) {
     auto pls = Level::getAllPlayers();
     for (auto& pl : pls)
         if (pl == player)
@@ -894,50 +821,38 @@ bool Player::isValid(Player* player)
 }
 
 // For Compatibility
-bool Player::sendSimpleFormPacket(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(int)> callback) const
-{
+bool Player::sendSimpleFormPacket(const string& title, const string& content, const vector<string>& buttons, const std::vector<std::string>& images, std::function<void(int)> callback) const {
     return sendSimpleForm(title, content, buttons, images, [callback](Player* pl, int id) {
         if (!callback || !Player::isValid(pl))
             return;
-        try
-        {
+        try {
             callback(id);
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.error("Exception occurred in custom-form packet callback!");
             logger.error("Player: {}", pl->getName());
         }
     });
 }
-bool Player::sendModalFormPacket(const string& title, const string& content, const string& button1, const string& button2, std::function<void(bool)> callback)
-{
-    return sendModalForm(title,content,button1,button2, [callback](Player* pl, bool res) {
+bool Player::sendModalFormPacket(const string& title, const string& content, const string& button1, const string& button2, std::function<void(bool)> callback) {
+    return sendModalForm(title, content, button1, button2, [callback](Player* pl, bool res) {
         if (!callback || !Player::isValid(pl))
             return;
-        try
-        {
+        try {
             callback(res);
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.error("Exception occurred in modal-form packet callback!");
             logger.error("Player: {}", pl->getName());
         }
     });
 }
 
-bool Player::sendCustomFormPacket(const std::string& data, std::function<void(string)> callback)
-{
+bool Player::sendCustomFormPacket(const std::string& data, std::function<void(string)> callback) {
     return sendCustomForm(data, [callback](Player* pl, string res) {
         if (!callback || !Player::isValid(pl))
             return;
-        try
-        {
+        try {
             callback(res);
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.error("Exception occurred in custom-form packet callback!");
             logger.error("Player: {}", pl->getName());
         }
@@ -972,12 +887,12 @@ bool testPlayerExperience(Player& player) {
     exp = player.getCurrentExperience();
     totalExp = player.getTotalExperience();
     logger.warn("level: {} exp: {}, totalExp: {}", level, exp, totalExp);
-    //for (int i = 0; i <= 1000; i++) {
-    //    int level = i * i;
-    //    int exp = Player::getXpNeededForLevel(level + 1);
-    //    size_t total = Player::getTotalXpNeededForLevel(level);
-    //    logger.warn("Level: {}, exp needed: {}, total exp: {}", level, exp, total);
-    //}
+    // for (int i = 0; i <= 1000; i++) {
+    //     int level = i * i;
+    //     int exp = Player::getXpNeededForLevel(level + 1);
+    //     size_t total = Player::getTotalXpNeededForLevel(level);
+    //     logger.warn("Level: {}, exp needed: {}, total exp: {}", level, exp, total);
+    // }
     return true;
 }
 
diff --git a/LiteLoader/Kernel/MC/StructureTemplateAPI.cpp b/LiteLoader/Kernel/MC/StructureTemplateAPI.cpp
--- a/LiteLoader/Kernel/MC/StructureTemplateAPI.cpp
+++ b/LiteLoader/Kernel/MC/StructureTemplateAPI.cpp
@@ -7,21 +7,20 @@
 
 StructureTemplate StructureTemplate::fromTag(std::string name, CompoundTag const& tag) {
     StructureTemplate st(name);
-    //st.getName(name_span)
+    // st.getName(name_span)
     st.getData()->load(tag);
     return st;
 }
 
 StructureTemplate::StructureTemplate(class StructureTemplate const& copy)
-    : StructureTemplate(copy.getName())
-{
+: StructureTemplate(copy.getName()) {
     load(*copy.save());
 }
 
-//bool StructureTemplate::load(CompoundTag const& tag)
+// bool StructureTemplate::load(CompoundTag const& tag)
 //{
-//    return getData()->load(tag);
-//}
+//     return getData()->load(tag);
+// }
 
 std::unique_ptr<CompoundTag> StructureTemplate::toTag() {
     return save();
@@ -29,7 +28,7 @@ std::unique_ptr<CompoundTag> StructureTemplate::toTag() {
 
 StructureTemplate StructureTemplate::fromWorld(std::string name, int dimID, BlockPos p1, BlockPos p2, bool ignoreBlocks, bool ignoreEntities) {
     auto st = StructureTemplate(name);
-    //st.getName();
+    // st.getName();
     BlockPos start = {std::min(p1.x, p2.x), std::min(p1.y, p2.y), std::min(p1.z, p2.z)};
     BlockPos size = {std::abs(p1.x - p2.x) + 1, std::abs(p1.y - p2.y) + 1, std::abs(p1.z - p2.z) + 1};
     auto setting = StructureSettings();
diff --git a/LiteLoader/Kernel/MC/Types.cpp b/LiteLoader/Kernel/MC/Types.cpp
--- a/LiteLoader/Kernel/MC/Types.cpp
+++ b/LiteLoader/Kernel/MC/Types.cpp
@@ -145,8 +145,10 @@ double mce::Color::deltaE00(mce::Color const& dst) const {
     double dCp = C1p - C2p;
     double h1p = atan2(b1, a1p);
     double h2p = atan2(b2, a2p);
-    if (h1p < 0) h1p += 6.2831853071796;
-    if (h2p < 0) h2p += 6.2831853071796;
+    if (h1p < 0)
+        h1p += 6.2831853071796;
+    if (h2p < 0)
+        h2p += 6.2831853071796;
     h1p *= 57.2957795131;
     h2p *= 57.2957795131;
     double h_p = (h1p + h2p) * 0.5;
@@ -223,15 +225,6 @@ BlockPos Vec3::toBlockPos() const {
     return BlockPos((int)std::floor((double)x), (int)std::floor((double)y), (int)std::floor((double)z));
 }
 
-float Vec3::length() const {
-    return sqrt(x * x + y * y + z * z);
-}
-
-float Vec3::distanceTo(Vec3 const& a0) const {
-    Vec3 tmp = *this - a0;
-    return tmp.length();
-}
-
 AABB BoundingBox::toAABB() const {
     Vec3 vec1 = min.toVec3();
     Vec3 vec2 = max.toVec3();
diff --git a/LiteLoader/Kernel/NBT/ByteArrayTagAPI.cpp b/LiteLoader/Kernel/NBT/ByteArrayTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/ByteArrayTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/ByteArrayTagAPI.cpp
@@ -14,7 +14,7 @@ std::unique_ptr<ByteArrayTag> ByteArrayTag::create() {
 }
 
 std::unique_ptr<ByteArrayTag> ByteArrayTag::create(TagMemoryChunk const& val) {
-    auto tag=Tag::newTag(Tag::Type::ByteArray);
+    auto tag = Tag::newTag(Tag::Type::ByteArray);
     tag->asByteArrayTag()->set(val);
     return std::unique_ptr<ByteArrayTag>((ByteArrayTag*)tag.release());
 }
diff --git a/LiteLoader/Kernel/NBT/ByteTagAPI.cpp b/LiteLoader/Kernel/NBT/ByteTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/ByteTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/ByteTagAPI.cpp
@@ -26,8 +26,7 @@ unsigned char ByteTag::get() {
     return value();
 }
 
-ByteTag::operator unsigned char() const
-{
+ByteTag::operator unsigned char() const {
     if (!this)
         return 0;
     return val;
diff --git a/LiteLoader/Kernel/NBT/CompoundTagAPI.cpp b/LiteLoader/Kernel/NBT/CompoundTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/CompoundTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/CompoundTagAPI.cpp
@@ -27,37 +27,31 @@
 
 class DataLoadHelper;
 
-std::unique_ptr<CompoundTag> CompoundTag::create()
-{
+std::unique_ptr<CompoundTag> CompoundTag::create() {
     return std::unique_ptr<CompoundTag>((CompoundTag*)Tag::newTag(Tag::Type::Compound).release());
 }
 
 #pragma region Set
 // put value
-void CompoundTag::putEnd(std::string key)
-{
+void CompoundTag::putEnd(std::string key) {
     put(key, EndTag::create());
 }
 
-double& CompoundTag::putDouble(std::string key, double val)
-{
+double& CompoundTag::putDouble(std::string key, double val) {
     return put(key, DoubleTag::create(val))->asDoubleTag()->value();
 }
 
-void CompoundTag::putByteArray(std::string key, char data[], size_t size)
-{
+void CompoundTag::putByteArray(std::string key, char data[], size_t size) {
     TagMemoryChunk tmc(data, size);
     putByteArray(key, tmc);
 }
 
-void CompoundTag::putIntArray(std::string key, int data[], size_t size)
-{
+void CompoundTag::putIntArray(std::string key, int data[], size_t size) {
     TagMemoryChunk tmc((char*)data, size * 4);
     putIntArray(key, tmc);
 }
 
-struct TagMemoryChunk& CompoundTag::putIntArray(std::string key, struct TagMemoryChunk val)
-{
+struct TagMemoryChunk& CompoundTag::putIntArray(std::string key, struct TagMemoryChunk val) {
     return put(key, IntArrayTag::create(val))->asIntArrayTag()->value();
 }
 
@@ -65,74 +59,63 @@ struct TagMemoryChunk& CompoundTag::putIntArray(std::string key, struct TagMemor
 
 #pragma region Get
 
-inline map<std::string, CompoundTagVariant>& CompoundTag::value()
-{
+inline map<std::string, CompoundTagVariant>& CompoundTag::value() {
     return dAccess<map<std::string, CompoundTagVariant>, 8>(this);
 }
 
 // get value
-double CompoundTag::getDouble(class gsl::basic_string_span<char const, -1> key) const
-{
+double CompoundTag::getDouble(class gsl::basic_string_span<char const, -1> key) const {
     auto tag = const_cast<Tag*>(get(key))->asDoubleTag();
     if (tag)
         return tag->value();
     // TODO
     return 0.0;
 };
-struct TagMemoryChunk const& CompoundTag::getIntArray(class gsl::basic_string_span<char const, -1> key) const
-{
+struct TagMemoryChunk const& CompoundTag::getIntArray(class gsl::basic_string_span<char const, -1> key) const {
     auto tag = const_cast<Tag*>(get(key))->asIntArrayTag();
     return tag->value();
 };
 
 // get tag
-class ByteTag const* CompoundTag::getByteTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class ByteTag const* CompoundTag::getByteTag(class gsl::basic_string_span<char const, -1> key) const {
     return const_cast<Tag*>(get(key))->asByteTag();
 };
 
 // BDS has implemented this interface
-//class ShortTag const* CompoundTag::getShortTag(class gsl::basic_string_span<char const, -1> key) const
+// class ShortTag const* CompoundTag::getShortTag(class gsl::basic_string_span<char const, -1> key) const
 //{
 //    return const_cast<Tag*>(get(key))->asShortTag();
 //};
 
-class FloatTag const* CompoundTag::getFloatTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class FloatTag const* CompoundTag::getFloatTag(class gsl::basic_string_span<char const, -1> key) const {
     return const_cast<Tag*>(get(key))->asFloatTag();
 };
 
-class DoubleTag const* CompoundTag::getDoubleTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class DoubleTag const* CompoundTag::getDoubleTag(class gsl::basic_string_span<char const, -1> key) const {
     return const_cast<Tag*>(get(key))->asDoubleTag();
 };
 
-class ByteArrayTag const* CompoundTag::getByteArrayTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class ByteArrayTag const* CompoundTag::getByteArrayTag(class gsl::basic_string_span<char const, -1> key) const {
     return const_cast<Tag*>(get(key))->asByteArrayTag();
 };
 
-class IntArrayTag const* CompoundTag::getIntArrayTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class IntArrayTag const* CompoundTag::getIntArrayTag(class gsl::basic_string_span<char const, -1> key) const {
     return const_cast<Tag*>(get(key))->asIntArrayTag();
 };
 
-//class StringTag const* CompoundTag::getStringTag(class gsl::basic_string_span<char const, -1> key) const {
-//    return const_cast<Tag*>(get(key))->asStringTag();
-//};
+// class StringTag const* CompoundTag::getStringTag(class gsl::basic_string_span<char const, -1> key) const {
+//     return const_cast<Tag*>(get(key))->asStringTag();
+// };
 
-class ListTag const* CompoundTag::getListTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class ListTag const* CompoundTag::getListTag(class gsl::basic_string_span<char const, -1> key) const {
     return getList(key);
 };
 
-class CompoundTag const* CompoundTag::getCompoundTag(class gsl::basic_string_span<char const, -1> key) const
-{
+class CompoundTag const* CompoundTag::getCompoundTag(class gsl::basic_string_span<char const, -1> key) const {
     return getCompound(key);
 };
 
-Tag* CompoundTag::operator[](class gsl::basic_string_span<char const, -1> key)
-{
+Tag* CompoundTag::operator[](class gsl::basic_string_span<char const, -1> key) {
     return get(key);
 }
 
@@ -140,69 +123,59 @@ Tag* CompoundTag::operator[](class gsl::basic_string_span<char const, -1> key)
 
 #pragma region Convert
 
-std::unique_ptr<CompoundTag> CompoundTag::fromItemStack(ItemStack* item)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromItemStack(ItemStack* item) {
     return item->save();
 }
 
-void CompoundTag::setItemStack(ItemStack* item)
-{
+void CompoundTag::setItemStack(ItemStack* item) {
     using SetItemStackFn = ItemStack* (*)(ItemStack*, CompoundTag*);
     ItemStack (*func)(const CompoundTag&) = &ItemStack::fromTag;
     (*(SetItemStackFn)func)(item, this);
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromBlock(Block* block)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBlock(Block* block) {
     auto tag = (CompoundTag*)((uintptr_t)block + 104); // Block::Block
     return tag->clone();
 }
 
-void CompoundTag::setBlock(Block* blk)
-{
+void CompoundTag::setBlock(Block* blk) {
     auto tag = (CompoundTag*)((uintptr_t)blk + 104);
     tag->deepCopy(*this);
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromActor(Actor* actor)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromActor(Actor* actor) {
     auto tag = CompoundTag::create();
     actor->save(*tag);
-    //actor->saveWithoutId(*tag);
-    //actor->addAdditionalSaveData(*tag);
+    // actor->saveWithoutId(*tag);
+    // actor->addAdditionalSaveData(*tag);
 
     return std::move(tag);
 }
 
-bool CompoundTag::setActor(Actor* actor) const
-{
+bool CompoundTag::setActor(Actor* actor) const {
     void* vtbl = (void*)dlsym("??_7DefaultDataLoadHelper@@6B@");
     bool res = actor->load(*this, (DataLoadHelper&)vtbl);
-    //actor->readAdditionalSaveData(*this, (DataLoadHelper&)vtbl);
+    // actor->readAdditionalSaveData(*this, (DataLoadHelper&)vtbl);
     actor->_sendDirtyActorData();
     return res;
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromPlayer(Player* player)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromPlayer(Player* player) {
     return fromActor(player);
 }
 
-bool CompoundTag::setPlayer(Player* player)
-{
+bool CompoundTag::setPlayer(Player* player) {
     return setActor(player);
 }
 
-bool CompoundTag::setBlockActor(BlockActor* blockActor) const
-{
+bool CompoundTag::setBlockActor(BlockActor* blockActor) const {
     void* vtbl = dlsym("??_7DefaultDataLoadHelper@@6B@");
     blockActor->load(*Global<Level>, *this, (DataLoadHelper&)vtbl);
     blockActor->refreshData();
     return true;
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromBlockActor(BlockActor* blockActor)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBlockActor(BlockActor* blockActor) {
     auto tag = CompoundTag::create();
     blockActor->save(*tag);
     return std::move(tag);
@@ -216,37 +189,30 @@ using namespace std;
 #include <LoggerAPI.h>
 extern Logger logger;
 
-inline void OutputNBTError(std::string const& errorMsg, int errorCode, std::string errorWhat, std::string const& functionName)
-{
+inline void OutputNBTError(std::string const& errorMsg, int errorCode, std::string errorWhat, std::string const& functionName) {
     logger.error(errorMsg);
     logger.error("Error: Code [{}] {}", errorCode, errorWhat);
     logger.error("In {}", functionName);
 }
 
-#define CatchNBTError(func)                                                           \
-    catch (const seh_exception& e)                                                    \
-    {                                                                                 \
+#define CatchNBTError(func)                                                                                 \
+    catch (const seh_exception& e) {                                                                        \
         OutputNBTError("Uncaught SEH Exception Detected!", e.code(), TextEncoding::toUTF8(e.what()), func); \
-    }                                                                                 \
-    catch (const std::exception& e)                                                   \
-    {                                                                                 \
+    }                                                                                                       \
+    catch (const std::exception& e) {                                                                       \
         OutputNBTError("Uncaught C++ Exception Detected!", errno, TextEncoding::toUTF8(e.what()), func);    \
-    }                                                                                 \
-    catch (...)                                                                       \
-    {                                                                                 \
-        OutputNBTError("Uncaught Exception Detected!", -1, "", func);                 \
+    }                                                                                                       \
+    catch (...) {                                                                                           \
+        OutputNBTError("Uncaught Exception Detected!", -1, "", func);                                       \
     }
 
 #pragma region To Binary
 //////////////////// To Binary ////////////////////
 // Reference from StringByteOutput and BigEndianStringByteInput
-class BigEndianStringByteOutput
-{
-    void writeBigEndianBytes(byte* bytes, size_t count)
-    {
+class BigEndianStringByteOutput {
+    void writeBigEndianBytes(byte* bytes, size_t count) {
         auto right = bytes + count - 1;
-        if (right >= bytes)
-        {
+        if (right >= bytes) {
             auto left = bytes;
             do {
                 auto tmp = *left;
@@ -260,56 +226,43 @@ class BigEndianStringByteOutput
 public:
     virtual ~BigEndianStringByteOutput() = default;
     ;
-    virtual void* writeString(gsl::basic_string_span<char const, -1> string_span)
-    {
+    virtual void* writeString(gsl::basic_string_span<char const, -1> string_span) {
         return SymCall("?writeString@BytesDataOutput@@UEAAXV?$basic_string_span@$$CBD$0?0@gsl@@@Z",
                        void*, void*, gsl::basic_string_span<char const, -1>)((void*)this, std::move(string_span));
     }
-    virtual void* writeLongString(gsl::basic_string_span<char const, -1> string_span)
-    {
+    virtual void* writeLongString(gsl::basic_string_span<char const, -1> string_span) {
         return SymCall("?writeLongString@BytesDataOutput@@UEAAXV?$basic_string_span@$$CBD$0?0@gsl@@@Z",
                        void*, void*, gsl::basic_string_span<char const, -1>)((void*)this, std::move(string_span));
     }
-    virtual void writeFloat(float data)
-    {
+    virtual void writeFloat(float data) {
         writeBigEndianBytes((byte*)&data, 4);
     }
-    virtual void writeDouble(double data)
-    {
+    virtual void writeDouble(double data) {
         writeBigEndianBytes((byte*)&data, 8);
     }
-    virtual void writeByte(byte data)
-    {
+    virtual void writeByte(byte data) {
         writeBytes(&data, 1);
     }
-    virtual void writeShort(short data)
-    {
+    virtual void writeShort(short data) {
         writeBigEndianBytes((byte*)&data, 2);
     }
-    virtual void writeInt(int data)
-    {
+    virtual void writeInt(int data) {
         writeBigEndianBytes((byte*)&data, 4);
     }
-    virtual void writeLongLong(long long data)
-    {
+    virtual void writeLongLong(long long data) {
         writeBigEndianBytes((byte*)&data, 8);
     }
-    virtual void* writeBytes(byte* bytes, size_t count)
-    {
+    virtual void* writeBytes(byte* bytes, size_t count) {
         return SymCall("?writeBytes@StringByteOutput@@UEAAXPEBX_K@Z",
                        void*, void*, byte*, size_t)((void*)this, bytes, count);
     }
 };
 
-string CompoundTag::toBinaryNBT(bool isLittleEndian)
-{
+string CompoundTag::toBinaryNBT(bool isLittleEndian) {
     void* vtbl;
-    if (isLittleEndian)
-    {
+    if (isLittleEndian) {
         vtbl = dlsym("??_7StringByteOutput@@6B@");
-    }
-    else
-    {
+    } else {
         auto tmp = BigEndianStringByteOutput();
         vtbl = *(void**)&tmp;
     }
@@ -319,11 +272,9 @@ string CompoundTag::toBinaryNBT(bool isLittleEndian)
     return result;
 }
 
-std::string CompoundTag::nbtListToBinary(std::vector<std::unique_ptr<CompoundTag>> tags, bool isLittleEndian)
-{
+std::string CompoundTag::nbtListToBinary(std::vector<std::unique_ptr<CompoundTag>> tags, bool isLittleEndian) {
     std::string result = "";
-    for (auto& tag : tags)
-    {
+    for (auto& tag : tags) {
         result += tag->toBinaryNBT(isLittleEndian);
     }
     return result;
@@ -333,8 +284,7 @@ std::string CompoundTag::nbtListToBinary(std::vector<std::unique_ptr<CompoundTag
 
 #pragma region From Binary
 //////////////////// From Binary ////////////////////
-std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(void* data, size_t len, size_t& offset, bool isLittleEndian)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(void* data, size_t len, size_t& offset, bool isLittleEndian) {
     void* vtbl;
     if (isLittleEndian)
         vtbl = dlsym("??_7StringByteInput@@6B@");
@@ -348,29 +298,24 @@ std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(void* data, size_t len,
     return rtn;
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(void* data, size_t len, bool isLittleEndian)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(void* data, size_t len, bool isLittleEndian) {
     size_t endOffset = 0;
     return fromBinaryNBT(data, len, endOffset, isLittleEndian);
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(std::string const& data, size_t& offset, bool isLittleEndian)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(std::string const& data, size_t& offset, bool isLittleEndian) {
     return fromBinaryNBT((void*)data.c_str(), data.size(), offset, isLittleEndian);
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(std::string const& data, bool isLittleEndian)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromBinaryNBT(std::string const& data, bool isLittleEndian) {
     size_t endOffset = 0;
     return fromBinaryNBT(data, endOffset, isLittleEndian);
 }
 
-std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromBinary(std::string const& data, bool isLittleEndian)
-{
+std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromBinary(std::string const& data, bool isLittleEndian) {
     std::vector<std::unique_ptr<CompoundTag>> rtn;
     size_t endOffset = 0;
-    while (endOffset < data.size())
-    {
+    while (endOffset < data.size()) {
         auto tmp = CompoundTag::fromBinaryNBT(data, endOffset, isLittleEndian);
         if (tmp)
             rtn.push_back(std::move(tmp));
@@ -384,15 +329,13 @@ std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromBinary(std::st
 
 //////////////////// To Network ////////////////////
 #include <MC/BinaryStream.hpp>
-std::string CompoundTag::toNetworkNBT() const
-{
+std::string CompoundTag::toNetworkNBT() const {
     BinaryStream bs;
     bs.writeCompoundTag(*this);
     return bs.getAndReleaseData();
 }
 
-std::string CompoundTag::nbtListToNetwork(std::vector<std::unique_ptr<CompoundTag>> tags)
-{
+std::string CompoundTag::nbtListToNetwork(std::vector<std::unique_ptr<CompoundTag>> tags) {
     BinaryStream bs;
     for (auto& tag : tags)
         bs.writeCompoundTag(*tag);
@@ -404,17 +347,14 @@ std::string CompoundTag::nbtListToNetwork(std::vector<std::unique_ptr<CompoundTa
 #pragma region From Network NBT
 
 //////////////////// From Network ////////////////////
-std::unique_ptr<CompoundTag> CompoundTag::fromNetworkNBT(std::string const& data)
-{
+std::unique_ptr<CompoundTag> CompoundTag::fromNetworkNBT(std::string const& data) {
     ReadOnlyBinaryStream bs(data, false);
     return bs.getCompoundTag();
 }
-std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromNetwork(std::string const& data)
-{
+std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromNetwork(std::string const& data) {
     std::vector<std::unique_ptr<CompoundTag>> rtn;
     ReadOnlyBinaryStream bs(data, false);
-    while (bs.getUnreadLength())
-    {
+    while (bs.getUnreadLength()) {
         rtn.emplace_back(bs.getCompoundTag());
     }
     return rtn;
@@ -427,60 +367,51 @@ std::vector<std::unique_ptr<CompoundTag>> CompoundTag::nbtListFromNetwork(std::s
 void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt);
 void TagToSNBT_List_Helper(tags::compound_list_tag& res, ListTag* nbt);
 
-void TagToSNBT_List_Helper(tags::byte_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::byte_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asByteTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::short_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::short_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asShortTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::int_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::int_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asIntTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::long_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::long_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asInt64Tag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::float_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::float_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asFloatTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::double_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::double_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asDoubleTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::string_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::string_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
     for (auto& tag : list)
         res.value.emplace_back(tag->asStringTag()->value());
 }
 
-void TagToSNBT_List_Helper(tags::bytearray_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::bytearray_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
-    for (auto& tag : list)
-    {
+    for (auto& tag : list) {
         auto& bytes = tag->asByteArrayTag()->value();
 
         char* raw = (char*)bytes.data.get();
@@ -493,11 +424,9 @@ void TagToSNBT_List_Helper(tags::bytearray_list_tag& res, ListTag* nbt)
     }
 }
 
-void TagToSNBT_List_Helper(tags::intarray_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::intarray_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
-    for (auto& tag : list)
-    {
+    for (auto& tag : list) {
         auto& bytes = tag->asIntArrayTag()->value();
 
         int* raw = (int*)bytes.data.get();
@@ -510,115 +439,95 @@ void TagToSNBT_List_Helper(tags::intarray_list_tag& res, ListTag* nbt)
     }
 }
 
-tags::tag_list_tag TagToSNBT_List_Helper(ListTag* nbt)
-{
-    //auto& list = nbt->value();
-    //if (list.empty()) {
-    //    return tags::tag_list_tag();
-    //}
+tags::tag_list_tag TagToSNBT_List_Helper(ListTag* nbt) {
+    // auto& list = nbt->value();
+    // if (list.empty()) {
+    //     return tags::tag_list_tag();
+    // }
 
-    switch (nbt->getElementType())
-    {
+    switch (nbt->getElementType()) {
         case Tag::Type::End:
             return tags::end_list_tag().as_tags();
-        case Tag::Type::Byte:
-        {
+        case Tag::Type::Byte: {
             tags::byte_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::Short:
-        {
+        case Tag::Type::Short: {
             tags::short_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::Int:
-        {
+        case Tag::Type::Int: {
             tags::int_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             // this is error, so return.
             // res = std::move(data.as_tags());
             return data.as_tags();
         }
-        case Tag::Type::Int64:
-        {
+        case Tag::Type::Int64: {
             tags::long_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::Float:
-        {
+        case Tag::Type::Float: {
             tags::float_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::Double:
-        {
+        case Tag::Type::Double: {
             tags::double_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::String:
-        {
+        case Tag::Type::String: {
             tags::string_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::ByteArray:
-        {
+        case Tag::Type::ByteArray: {
             tags::bytearray_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::IntArray:
-        {
+        case Tag::Type::IntArray: {
             tags::intarray_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        case Tag::Type::List:
-        {
+        case Tag::Type::List: {
             tags::list_list_tag res;
-            for (auto& tag : nbt->value())
-            {
+            for (auto& tag : nbt->value()) {
                 tags::tag_list_tag data = TagToSNBT_List_Helper((ListTag*)tag);
                 res.value.emplace_back(std::make_unique<tags::tag_list_tag>(data));
             }
             return res.as_tags();
         }
-        case Tag::Type::Compound:
-        {
+        case Tag::Type::Compound: {
             tags::compound_list_tag data;
             TagToSNBT_List_Helper(data, nbt);
             return data.as_tags();
         }
-        default:
-        {
+        default: {
             return tags::end_list_tag().as_tags();
         }
     }
 }
 
-void TagToSNBT_List_Helper(tags::compound_list_tag& res, ListTag* nbt)
-{
+void TagToSNBT_List_Helper(tags::compound_list_tag& res, ListTag* nbt) {
     auto& list = nbt->value();
-    for (auto& tag : list)
-    {
+    for (auto& tag : list) {
         auto obj = tags::compound_tag(false);
         TagToSNBT_Compound_Helper(obj, (CompoundTag*)tag);
         res.value.emplace_back(obj.value);
     }
 }
 
-void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
-{
+void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt) {
     auto& list = nbt->value();
-    for (auto& [key, tmp] : list)
-    {
+    for (auto& [key, tmp] : list) {
         auto& tag = *tmp.get();
-        switch (tag.getTagType())
-        {
+        switch (tag.getTagType()) {
             case Tag::Type::End:
                 res.value[key].reset();
                 break;
@@ -643,8 +552,7 @@ void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
             case Tag::Type::String:
                 res.value[key] = make_unique<tags::string_tag>(tag.asStringTag()->value());
                 break;
-            case Tag::Type::ByteArray:
-            {
+            case Tag::Type::ByteArray: {
                 auto& bytes = tag.asByteArrayTag()->value();
                 char* raw = (char*)bytes.data.get();
                 vector<int8_t> data;
@@ -655,8 +563,7 @@ void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
                 res.value[key] = make_unique<tags::bytearray_tag>(data);
                 break;
             }
-            case Tag::Type::IntArray:
-            {
+            case Tag::Type::IntArray: {
                 auto& bytes = tag.asIntArrayTag()->value();
                 int* raw = (int*)bytes.data.get();
                 vector<int32_t> data;
@@ -667,11 +574,9 @@ void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
                 res.value[key] = make_unique<tags::intarray_tag>(data);
                 break;
             }
-            case Tag::Type::List:
-            {
+            case Tag::Type::List: {
                 auto& list = tag.asListTag()->value();
-                if (list.empty())
-                {
+                if (list.empty()) {
                     res.value[key] = make_unique<tags::tag_list_tag>();
                     break;
                 }
@@ -679,8 +584,7 @@ void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
                 res.value[key] = make_unique<tags::tag_list_tag>(obj);
                 break;
             }
-            case Tag::Type::Compound:
-            {
+            case Tag::Type::Compound: {
                 auto obj = tags::compound_tag(false);
                 TagToSNBT_Compound_Helper(obj, (CompoundTag*)&tag);
                 res.value[key] = make_unique<tags::compound_tag>(obj);
@@ -693,10 +597,8 @@ void TagToSNBT_Compound_Helper(tags::compound_tag& res, CompoundTag* nbt)
     }
 }
 
-string CompoundTag::toSNBT()
-{
-    try
-    {
+string CompoundTag::toSNBT() {
+    try {
         if (this->getTagType() != Tag::Type::Compound)
             return "";
         tags::compound_tag root(true);
@@ -718,72 +620,59 @@ string CompoundTag::toSNBT()
 void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag& data);
 void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::compound_list_tag& data);
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::end_list_tag& data)
-{
-    //nbt->addEnd();
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::end_list_tag& data) {
+    // nbt->addEnd();
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::byte_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::byte_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addByte((unsigned char)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::short_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::short_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addShort((short)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::int_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::int_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addInt((int)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::long_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::long_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addInt64((long long)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::float_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::float_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addFloat((float)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::double_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::double_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addDouble((double)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::string_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::string_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addString((string)dat);
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::bytearray_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::bytearray_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addByteArray((char*)dat.data(), dat.size());
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::intarray_list_tag& data)
-{
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::intarray_list_tag& data) {
     for (auto& dat : data.value)
         nbt->addIntArray(dat.data(), dat.size());
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::list_list_tag& data)
-{
-    for (auto& dat : data.value)
-    {
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::list_list_tag& data) {
+    for (auto& dat : data.value) {
         unique_ptr<ListTag> tagList = ListTag::create();
-        switch (dat->element_id())
-        {
+        switch (dat->element_id()) {
             case tag_id::tag_end:
                 SNBTToTag_List_Helper(tagList, *(tags::end_list_tag*)dat.get());
                 break;
@@ -827,22 +716,17 @@ void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::list_list_tag& data)
     }
 }
 
-void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::compound_list_tag& data)
-{
-    for (auto& dat : data.value)
-    {
+void SNBTToTag_List_Helper(unique_ptr<ListTag>& nbt, tags::compound_list_tag& data) {
+    for (auto& dat : data.value) {
         auto tagComp = CompoundTag::create();
         SNBTToTag_Compound_Helper(tagComp, dat);
         nbt->add(Tag::asTag(std::move(tagComp)));
     }
 }
 
-void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag& data)
-{
-    for (auto& [key, value] : data.value)
-    {
-        switch (value->id())
-        {
+void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag& data) {
+    for (auto& [key, value] : data.value) {
+        switch (value->id()) {
             case tag_id::tag_end:
                 nbt->putEnd(key);
                 break;
@@ -867,25 +751,21 @@ void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag&
             case tag_id::tag_string:
                 nbt->putString(key, ((tags::string_tag*)value.get())->value);
                 break;
-            case tag_id::tag_bytearray:
-            {
+            case tag_id::tag_bytearray: {
                 auto& data = ((tags::bytearray_tag*)value.get())->value;
                 nbt->putByteArray(key, (char*)data.data(), data.size());
                 break;
             }
-            case tag_id::tag_intarray:
-            {
+            case tag_id::tag_intarray: {
                 auto& data = ((tags::intarray_tag*)value.get())->value;
                 nbt->putIntArray(key, data.data(), data.size());
                 break;
             }
-            case tag_id::tag_list:
-            {
+            case tag_id::tag_list: {
                 unique_ptr<ListTag> res = ListTag::create();
 
                 tags::list_tag* data = (tags::list_tag*)value.get();
-                switch (data->element_id())
-                {
+                switch (data->element_id()) {
                     case tag_id::tag_byte:
                         SNBTToTag_List_Helper(res, *(tags::byte_list_tag*)data);
                         break;
@@ -925,8 +805,7 @@ void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag&
                 nbt->put(key, Tag::asTag(std::move(res)));
                 break;
             }
-            case tag_id::tag_compound:
-            {
+            case tag_id::tag_compound: {
                 auto res = CompoundTag::create();
                 tags::compound_tag* data = (tags::compound_tag*)value.get();
                 SNBTToTag_Compound_Helper(res, *data);
@@ -937,10 +816,8 @@ void SNBTToTag_Compound_Helper(unique_ptr<CompoundTag>& nbt, tags::compound_tag&
     }
 }
 
-std::unique_ptr<CompoundTag> CompoundTag::fromSNBT(const string& snbt)
-{
-    try
-    {
+std::unique_ptr<CompoundTag> CompoundTag::fromSNBT(const string& snbt) {
+    try {
         istringstream sin(snbt);
         tags::compound_tag root(true);
         sin >> contexts::mojangson >> root;
@@ -957,13 +834,10 @@ std::unique_ptr<CompoundTag> CompoundTag::fromSNBT(const string& snbt)
 
 #pragma region To Formatted SNBT
 
-void __appendString(std::ostringstream& oss, std::string const& str)
-{
+void __appendString(std::ostringstream& oss, std::string const& str) {
     oss << '"';
-    for (auto& c : str)
-    {
-        switch (c)
-        {
+    for (auto& c : str) {
+        switch (c) {
             case '"':
                 oss << "\\\"";
                 break;
@@ -992,10 +866,8 @@ void __appendString(std::ostringstream& oss, std::string const& str)
     oss << '"';
 }
 
-inline void __appendSpace(std::ostringstream& oss, int indent, int level)
-{
-    switch (indent * level)
-    {
+inline void __appendSpace(std::ostringstream& oss, int indent, int level) {
+    switch (indent * level) {
         case 0:
             break;
         case 4:
@@ -1021,8 +893,7 @@ inline void __appendSpace(std::ostringstream& oss, int indent, int level)
     }
 }
 
-inline void __appendReturnSpace(std::ostringstream& oss, int indent, int level)
-{
+inline void __appendReturnSpace(std::ostringstream& oss, int indent, int level) {
     oss << '\n';
     __appendSpace(oss, indent, level);
 }
@@ -1035,45 +906,36 @@ template <>
 inline void __appendSNBT(std::ostringstream& oss, ListTag& tag, int indent, int level, SnbtFormat snbtFormat);
 
 template <>
-inline void __appendSNBT(std::ostringstream& oss, EndTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, EndTag& tag, int indent, int level, SnbtFormat snbtFormat) {
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, ByteTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, ByteTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << (int)(signed char)tag.value() << 'b';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, ShortTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, ShortTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << tag.value() << 's';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, IntTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, IntTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << tag.value();
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, Int64Tag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, Int64Tag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << tag.value() << 'L';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, FloatTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, FloatTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << tag.value() << 'f';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, DoubleTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, DoubleTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     oss << tag.value() << 'd';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, ByteArrayTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, ByteArrayTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     size_t size = tag.value().size;
-    if (size == 0)
-    {
+    if (size == 0) {
         oss << "[B;]";
         return;
     }
@@ -1081,8 +943,7 @@ inline void __appendSNBT(std::ostringstream& oss, ByteArrayTag& tag, int indent,
     bool first = true;
     std::string const& separator = snbtFormat == SnbtFormat::Minimize ? "," : ", ";
     oss << "[B; ";
-    for (size_t i = 0; i < size; ++i)
-    {
+    for (size_t i = 0; i < size; ++i) {
         if (!first)
             oss << separator;
         first = false;
@@ -1091,11 +952,9 @@ inline void __appendSNBT(std::ostringstream& oss, ByteArrayTag& tag, int indent,
     oss << ']';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, IntArrayTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, IntArrayTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     size_t size = tag.value().size;
-    if (size == 0)
-    {
+    if (size == 0) {
         oss << "[I;]";
         return;
     }
@@ -1103,8 +962,7 @@ inline void __appendSNBT(std::ostringstream& oss, IntArrayTag& tag, int indent,
     bool first = true;
     oss << "[I; ";
     std::string const& separator = snbtFormat == SnbtFormat::Minimize ? "," : ", ";
-    for (size_t i = 0; i < size; i += 4)
-    {
+    for (size_t i = 0; i < size; i += 4) {
         if (!first)
             oss << separator;
         first = false;
@@ -1114,16 +972,13 @@ inline void __appendSNBT(std::ostringstream& oss, IntArrayTag& tag, int indent,
 }
 
 template <>
-inline void __appendSNBT(std::ostringstream& oss, StringTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
+inline void __appendSNBT(std::ostringstream& oss, StringTag& tag, int indent, int level, SnbtFormat snbtFormat) {
     __appendString(oss, tag.value());
 }
 
 template <>
-inline void __appendSNBT(std::ostringstream& oss, ListTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
-    if (tag.size() == 0)
-    {
+inline void __appendSNBT(std::ostringstream& oss, ListTag& tag, int indent, int level, SnbtFormat snbtFormat) {
+    if (tag.size() == 0) {
         oss << "[]";
         return;
     }
@@ -1131,16 +986,13 @@ inline void __appendSNBT(std::ostringstream& oss, ListTag& tag, int indent, int
     bool first = true;
     bool shouldReturn = snbtFormat == SnbtFormat::AlwayNewLine;
     oss << '[';
-    for (auto& child : tag)
-    {
-        if (!first)
-        {
+    for (auto& child : tag) {
+        if (!first) {
             oss << ',';
             if (!shouldReturn)
                 oss << ' ';
         }
-        switch (childrenType)
-        {
+        switch (childrenType) {
             case Tag::End:
                 if (snbtFormat == SnbtFormat::AlwayNewLine)
                     __appendReturnSpace(oss, indent, level + 1);
@@ -1216,33 +1068,26 @@ inline void __appendSNBT(std::ostringstream& oss, ListTag& tag, int indent, int
     oss << ']';
 }
 template <>
-inline void __appendSNBT(std::ostringstream& oss, CompoundTag& tag, int indent, int level, SnbtFormat snbtFormat)
-{
-    if (tag.isEmpty())
-    {
+inline void __appendSNBT(std::ostringstream& oss, CompoundTag& tag, int indent, int level, SnbtFormat snbtFormat) {
+    if (tag.isEmpty()) {
         oss << "{}";
         return;
     }
     bool first = true;
     oss << '{';
-    for (auto& [key, child] : tag)
-    {
+    for (auto& [key, child] : tag) {
         if (!first)
             oss << ',';
-        if (snbtFormat == SnbtFormat::Minimize)
-        {
+        if (snbtFormat == SnbtFormat::Minimize) {
             __appendString(oss, key);
             oss << ":";
-        }
-        else
-        {
+        } else {
             __appendReturnSpace(oss, indent, level + 1);
             __appendString(oss, key);
             oss << ": ";
         }
         auto tag = const_cast<Tag*>(child.get());
-        switch (tag->getTagType())
-        {
+        switch (tag->getTagType()) {
             case Tag::End:
                 __appendSNBT(oss, *tag->asEndTag(), indent, level + 1, snbtFormat);
                 break;
@@ -1289,10 +1134,8 @@ inline void __appendSNBT(std::ostringstream& oss, CompoundTag& tag, int indent,
     oss << '}';
 }
 
-string CompoundTag::toSNBT(int indent, SnbtFormat snbtFormat)
-{
-    try
-    {
+string CompoundTag::toSNBT(int indent, SnbtFormat snbtFormat) {
+    try {
         if (this->getTagType() != Tag::Type::Compound)
             return "";
         std::ostringstream oss;
@@ -1309,12 +1152,9 @@ string CompoundTag::toSNBT(int indent, SnbtFormat snbtFormat)
 #pragma region To Pretty SNBT
 #include <MC/PrettySnbtFormat.hpp>
 
-void __appendPrettyString(std::ostringstream& oss, std::string const& str, PrettySnbtFormat const& format)
-{
-    for (auto& c : str)
-    {
-        switch (c)
-        {
+void __appendPrettyString(std::ostringstream& oss, std::string const& str, PrettySnbtFormat const& format) {
+    for (auto& c : str) {
+        switch (c) {
             case '"':
                 oss << "\\\"";
                 break;
@@ -1342,18 +1182,15 @@ void __appendPrettyString(std::ostringstream& oss, std::string const& str, Prett
     }
 }
 
-inline void __appendPrettySpace(std::ostringstream& oss, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySpace(std::ostringstream& oss, unsigned int level, PrettySnbtFormat const& format) {
     if (level > format.mMaxLevel)
         return;
-    for (unsigned i = 0; i < level; i++)
-    {
+    for (unsigned i = 0; i < level; ++i) {
         oss << format.mIndent;
     }
 }
 
-inline void __appendPrettyReturnSpace(std::ostringstream& oss, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettyReturnSpace(std::ostringstream& oss, unsigned int level, PrettySnbtFormat const& format) {
     if (level > format.mMaxLevel)
         return;
     oss << '\n';
@@ -1368,56 +1205,46 @@ template <>
 inline void __appendPrettySNBT(std::ostringstream& oss, ListTag& tag, unsigned int level, PrettySnbtFormat const& format);
 
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, EndTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, EndTag& tag, unsigned int level, PrettySnbtFormat const& format) {
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, ByteTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, ByteTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Byte].mPrefix << (int)(signed char)tag.value() << format.mValueFormats[Tag::Type::Byte].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, ShortTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, ShortTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Short].mPrefix << tag.value() << format.mValueFormats[Tag::Type::Short].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, IntTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, IntTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Int].mPrefix << tag.value() << format.mValueFormats[Tag::Type::Int].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, Int64Tag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, Int64Tag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Int64].mPrefix << tag.value() << format.mValueFormats[Tag::Type::Int64].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, FloatTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, FloatTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Float].mPrefix << tag.value() << format.mValueFormats[Tag::Type::Float].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, DoubleTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, DoubleTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     oss << format.mValueFormats[Tag::Type::Double].mPrefix << tag.value() << format.mValueFormats[Tag::Type::Double].mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, ByteArrayTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, ByteArrayTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     auto& valueFormat = format.mValueFormats[Tag::Type::ByteArray];
     auto& elementFormat = format.mValueFormats[Tag::Type::Byte];
     auto& separator = format.mSeparator;
     size_t size = tag.value().size;
-    if (size == 0)
-    {
+    if (size == 0) {
         oss << valueFormat.mPrefix << valueFormat.mSuffix;
         return;
     }
     auto val = tag.value().data.get();
     bool first = true;
     oss << valueFormat.mPrefix;
-    for (size_t i = 0; i < size; ++i)
-    {
+    for (size_t i = 0; i < size; ++i) {
         if (!first)
             oss << separator;
         first = false;
@@ -1426,22 +1253,19 @@ inline void __appendPrettySNBT(std::ostringstream& oss, ByteArrayTag& tag, unsig
     oss << valueFormat.mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, IntArrayTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, IntArrayTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     auto& valueFormat = format.mValueFormats[Tag::Type::IntArray];
     auto& elementFormat = format.mValueFormats[Tag::Type::Int];
     auto& separator = format.mSeparator;
     size_t size = tag.value().size;
-    if (size == 0)
-    {
+    if (size == 0) {
         oss << valueFormat.mPrefix << valueFormat.mSuffix;
         return;
     }
     auto val = tag.value().data.get();
     bool first = true;
     oss << valueFormat.mPrefix;
-    for (size_t i = 0; i < size; i += 4)
-    {
+    for (size_t i = 0; i < size; i += 4) {
         if (!first)
             oss << separator;
         first = false;
@@ -1451,8 +1275,7 @@ inline void __appendPrettySNBT(std::ostringstream& oss, IntArrayTag& tag, unsign
 }
 
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, StringTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, StringTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     auto& valueFormat = format.mValueFormats[Tag::Type::String];
     oss << valueFormat.mPrefix;
     __appendPrettyString(oss, tag.value(), format);
@@ -1460,13 +1283,10 @@ inline void __appendPrettySNBT(std::ostringstream& oss, StringTag& tag, unsigned
 }
 
 template <typename type>
-inline void __appendPrettyList(std::ostringstream& oss, ListTag& tag, unsigned int level, PrettySnbtFormat const& format, Tag::Type childrenType)
-{
+inline void __appendPrettyList(std::ostringstream& oss, ListTag& tag, unsigned int level, PrettySnbtFormat const& format, Tag::Type childrenType) {
     bool first = true;
-    for (auto& child : tag)
-    {
-        if (!first)
-        {
+    for (auto& child : tag) {
+        if (!first) {
             oss << format.mSeparator;
             if (format.mExpandInList[childrenType])
                 __appendPrettyReturnSpace(oss, level + 1, format);
@@ -1477,11 +1297,9 @@ inline void __appendPrettyList(std::ostringstream& oss, ListTag& tag, unsigned i
 }
 
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, ListTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, ListTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     auto& valueFormat = format.mValueFormats[Tag::Type::List];
-    if (tag.size() == 0)
-    {
+    if (tag.size() == 0) {
         oss << valueFormat.mPrefix << valueFormat.mSuffix;
         return;
     }
@@ -1493,8 +1311,7 @@ inline void __appendPrettySNBT(std::ostringstream& oss, ListTag& tag, unsigned i
         __appendPrettyReturnSpace(oss, level + 1, format);
     const Tag::Type tagType = childrenType;
 
-    switch (childrenType)
-    {
+    switch (childrenType) {
         case Tag::End:
             __appendPrettyList<EndTag>(oss, tag, level, format, childrenType);
             break;
@@ -1540,32 +1357,27 @@ inline void __appendPrettySNBT(std::ostringstream& oss, ListTag& tag, unsigned i
     oss << valueFormat.mSuffix;
 }
 template <>
-inline void __appendPrettySNBT(std::ostringstream& oss, CompoundTag& tag, unsigned int level, PrettySnbtFormat const& format)
-{
+inline void __appendPrettySNBT(std::ostringstream& oss, CompoundTag& tag, unsigned int level, PrettySnbtFormat const& format) {
     auto& valueFormat = format.mValueFormats[Tag::Type::Compound];
-    if (tag.isEmpty())
-    {
+    if (tag.isEmpty()) {
         oss << valueFormat.mPrefix << valueFormat.mSuffix;
         return;
     }
     bool first = true;
     oss << valueFormat.mPrefix;
-    for (auto& [key, child] : tag)
-    {
+    for (auto& [key, child] : tag) {
         if (!first)
             oss << ',';
-        if (format.mExpandCompound && level < format.mMaxLevel)
-        {
+        if (format.mExpandCompound && level < format.mMaxLevel) {
             __appendPrettyReturnSpace(oss, level + 1, format);
         }
 
         oss << format.mKeyFormat.mPrefix;
         __appendPrettyString(oss, key, format);
         oss << format.mKeyFormat.mSuffix << format.mColon;
-        
+
         auto tag = const_cast<Tag*>(child.get());
-        switch (tag->getTagType())
-        {
+        switch (tag->getTagType()) {
             case Tag::End:
                 __appendPrettySNBT(oss, *tag->asEndTag(), level + 1, format);
                 break;
@@ -1612,19 +1424,15 @@ inline void __appendPrettySNBT(std::ostringstream& oss, CompoundTag& tag, unsign
     oss << valueFormat.mSuffix;
 }
 
-string CompoundTag::toPrettySNBT(bool forPlayer) const
-{
-    try
-    {
+string CompoundTag::toPrettySNBT(bool forPlayer) const {
+    try {
         return toPrettySNBT(PrettySnbtFormat::getDefaultFormat(forPlayer));
     }
     CatchNBTError("CompoundTag::toPrettySNBT");
     return "";
 }
-string CompoundTag::toPrettySNBT(PrettySnbtFormat const& format) const
-{
-    try
-    {
+string CompoundTag::toPrettySNBT(PrettySnbtFormat const& format) const {
+    try {
         if (this->getTagType() != Tag::Type::Compound)
             return "";
         std::ostringstream oss;
@@ -1640,14 +1448,11 @@ string CompoundTag::toPrettySNBT(PrettySnbtFormat const& format) const
 #pragma region From SNBT For Tag of BDS
 #ifdef Working
 
-inline bool __isEmptyChar(int c)
-{
+inline bool __isEmptyChar(int c) {
     return c == ' ' || c == '\n' || c == '\t';
 }
-inline int __readEmpty(std::istringstream& iss)
-{
-    while (!iss.eof())
-    {
+inline int __readEmpty(std::istringstream& iss) {
+    while (!iss.eof()) {
         auto c = cheof(iss);
         if (!__isEmptyChar(c))
             return c;
@@ -1655,8 +1460,7 @@ inline int __readEmpty(std::istringstream& iss)
     return '\x0';
 }
 
-inline std::string __readString(std::istringstream& iss)
-{
+inline std::string __readString(std::istringstream& iss) {
     std::ostringstream oss;
     bool qoute = false;
     auto c = __readEmpty(iss);
@@ -1664,20 +1468,15 @@ inline std::string __readString(std::istringstream& iss)
         qoute == true;
     else
         oss << c;
-    if (qoute)
-    {
-        while (!iss.eof())
-        {
+    if (qoute) {
+        while (!iss.eof()) {
             c = cheof(iss);
             if (c == '"')
                 break;
             oss << c;
         }
-    }
-    else
-    {
-        while (!iss.eof())
-        {
+    } else {
+        while (!iss.eof()) {
             c = cheof(iss);
             if (__isEmptyChar(c))
                 break;
@@ -1689,13 +1488,10 @@ inline std::string __readString(std::istringstream& iss)
     return oss.str();
 }
 
-std::unique_ptr<Tag>&& __readStringValue(std::istringstream& iss)
-{
+std::unique_ptr<Tag>&& __readStringValue(std::istringstream& iss) {
     std::ostringstream oss;
-    while (!iss.eof())
-    {
-        while (!iss.eof())
-        {
+    while (!iss.eof()) {
+        while (!iss.eof()) {
             auto c = cheof(iss);
             if (c == '"')
                 break;
@@ -1705,47 +1501,40 @@ std::unique_ptr<Tag>&& __readStringValue(std::istringstream& iss)
     return StringTag::create(oss.str());
 }
 
-std::unique_ptr<Tag>&& __readIntArrayValue(std::istringstream& iss)
-{
+std::unique_ptr<Tag>&& __readIntArrayValue(std::istringstream& iss) {
     if (__readEmpty(iss) != ';')
         throw runtime_error("Expected char ';'");
 
     std::ostringstream oss;
     auto res = IntArrayTag::create();
     auto c = __readEmpty(iss);
-    while (!iss.eof())
-    {
-        if (c == ']')
-        {
+    while (!iss.eof()) {
+        if (c == ']') {
             if (oss.eof())
                 return std::move(res);
         }
-        if (c == 'I' || c == ',' || c == ' ') return {};
+        if (c == 'I' || c == ',' || c == ' ')
+            return {};
     }
     return {};
 }
 
-std::unique_ptr<Tag>&& __readValue(std::istringstream& iss)
-{
+std::unique_ptr<Tag>&& __readValue(std::istringstream& iss) {
     auto c = __readEmpty(iss);
     if (c == '"')
         return __readStringValue(iss);
-    else if (c == '[')
-    {
+    else if (c == '[') {
         auto c2 = __readEmpty(iss);
         if (c2 == 'I')
             return __readIntArrayValue(iss);
     }
 }
 
-void __readList(std::istringstream& iss, ListTag& tag)
-{
+void __readList(std::istringstream& iss, ListTag& tag) {
 }
 
-void __readCompound(std::istringstream& iss, CompoundTag& tag)
-{
-    while (true)
-    {
+void __readCompound(std::istringstream& iss, CompoundTag& tag) {
+    while (true) {
         if (__readEmpty(iss) != '{')
             throw runtime_error("Expected char '{'");
         std::string key = __readString(iss);
@@ -1757,8 +1546,7 @@ void __readCompound(std::istringstream& iss, CompoundTag& tag)
     }
 }
 
-std::unique_ptr<CompoundTag> fromSNBT(string& snbt)
-{
+std::unique_ptr<CompoundTag> fromSNBT(string& snbt) {
     std::istringstream iss(snbt);
     auto tag = CompoundTag::create();
     __readCompound(iss, *tag);
diff --git a/LiteLoader/Kernel/NBT/DoubleTagAPI.cpp b/LiteLoader/Kernel/NBT/DoubleTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/DoubleTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/DoubleTagAPI.cpp
@@ -26,8 +26,7 @@ double DoubleTag::get() {
     return value();
 }
 
-DoubleTag::operator double() const
-{
+DoubleTag::operator double() const {
     if (!this)
         return 0.0;
     return val;
diff --git a/LiteLoader/Kernel/NBT/FloatTagAPI.cpp b/LiteLoader/Kernel/NBT/FloatTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/FloatTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/FloatTagAPI.cpp
@@ -26,8 +26,7 @@ float FloatTag::get() {
     return value();
 }
 
-FloatTag::operator float() const
-{
+FloatTag::operator float() const {
     if (!this)
         return 0.0f;
     return val;
diff --git a/LiteLoader/Kernel/NBT/Int64TagAPI.cpp b/LiteLoader/Kernel/NBT/Int64TagAPI.cpp
--- a/LiteLoader/Kernel/NBT/Int64TagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/Int64TagAPI.cpp
@@ -26,8 +26,7 @@ int64_t Int64Tag::get() {
     return value();
 }
 
-Int64Tag::operator int64_t() const
-{
+Int64Tag::operator int64_t() const {
     if (!this)
         return 0;
     return val;
diff --git a/LiteLoader/Kernel/NBT/IntArrayTagAPI.cpp b/LiteLoader/Kernel/NBT/IntArrayTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/IntArrayTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/IntArrayTagAPI.cpp
@@ -1,22 +1,18 @@
 #include <MC/IntArrayTag.hpp>
 
-TagMemoryChunk& IntArrayTag::value()
-{
+TagMemoryChunk& IntArrayTag::value() {
     return dAccess<TagMemoryChunk, 8>(this);
 }
-IntArrayTag& IntArrayTag::operator=(TagMemoryChunk const& val)
-{
+IntArrayTag& IntArrayTag::operator=(TagMemoryChunk const& val) {
     value() = val;
     return *this;
 }
 
-std::unique_ptr<IntArrayTag> IntArrayTag::create()
-{
+std::unique_ptr<IntArrayTag> IntArrayTag::create() {
     return std::unique_ptr<IntArrayTag>((IntArrayTag*)Tag::newTag(Tag::Type::IntArray).release());
 }
 
-std::unique_ptr<IntArrayTag> IntArrayTag::create(TagMemoryChunk const& val)
-{
+std::unique_ptr<IntArrayTag> IntArrayTag::create(TagMemoryChunk const& val) {
     if (val.size % 4)
         return nullptr;
     auto tag = Tag::newTag(Tag::Type::IntArray);
@@ -24,21 +20,18 @@ std::unique_ptr<IntArrayTag> IntArrayTag::create(TagMemoryChunk const& val)
     return std::unique_ptr<IntArrayTag>((IntArrayTag*)tag.release());
 }
 
-std::unique_ptr<IntArrayTag> IntArrayTag::create(int data[], size_t size)
-{
+std::unique_ptr<IntArrayTag> IntArrayTag::create(int data[], size_t size) {
     TagMemoryChunk tmc((char*)data, size * 4);
     return create(tmc);
 }
 
-bool IntArrayTag::set(TagMemoryChunk const& val)
-{
+bool IntArrayTag::set(TagMemoryChunk const& val) {
     if (getTagType() != Tag::Type::IntArray)
         return false;
     value() = val;
     return true;
 }
 
-TagMemoryChunk IntArrayTag::get()
-{
+TagMemoryChunk IntArrayTag::get() {
     return value();
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/NBT/IntTagAPI.cpp b/LiteLoader/Kernel/NBT/IntTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/IntTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/IntTagAPI.cpp
@@ -26,8 +26,7 @@ int IntTag::get() {
     return value();
 }
 
-IntTag::operator int() const
-{
+IntTag::operator int() const {
     if (!this)
         return 0;
     return val;
diff --git a/LiteLoader/Kernel/NBT/ListTagAPI.cpp b/LiteLoader/Kernel/NBT/ListTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/ListTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/ListTagAPI.cpp
@@ -21,35 +21,29 @@ std::vector<Tag*>& ListTag::value() {
     return dAccess<std::vector<Tag*>, 8>(this);
 }
 
-Tag const* ListTag::operator[](int index) const
-{
+Tag const* ListTag::operator[](int index) const {
     if (index < size())
         return get(index);
     return nullptr;
 }
 
-Tag::Type ListTag::getElementType() const
-{
+Tag::Type ListTag::getElementType() const {
     return elementType;
 }
 
-size_t ListTag::getSize() const
-{
+size_t ListTag::getSize() const {
     return val.size();
 }
 
-std::vector<Tag*>::const_iterator ListTag::begin() const
-{
+std::vector<Tag*>::const_iterator ListTag::begin() const {
     return val.begin();
 }
 
-std::vector<Tag*>::const_iterator ListTag::end() const
-{
+std::vector<Tag*>::const_iterator ListTag::end() const {
     return val.end();
 }
 
-vector<Tag*> ListTag::get()
-{
+vector<Tag*> ListTag::get() {
     return value();
 }
 
@@ -100,13 +94,11 @@ void ListTag::addString(const string& v) {
     add(StringTag::create(v));
 }
 
-void ListTag::addByteArray(char data[], size_t size)
-{
-    add(ByteArrayTag::create(data,size));
+void ListTag::addByteArray(char data[], size_t size) {
+    add(ByteArrayTag::create(data, size));
 }
 
-void ListTag::addIntArray(int data[], size_t size)
-{
+void ListTag::addIntArray(int data[], size_t size) {
     add(Tag::asTag(IntArrayTag::create(data, size)));
 }
 
diff --git a/LiteLoader/Kernel/NBT/PrettySnbtFormatAPI.cpp b/LiteLoader/Kernel/NBT/PrettySnbtFormatAPI.cpp
--- a/LiteLoader/Kernel/NBT/PrettySnbtFormatAPI.cpp
+++ b/LiteLoader/Kernel/NBT/PrettySnbtFormatAPI.cpp
@@ -14,8 +14,7 @@
     op(Tag::Type::List);      \
     op(Tag::Type::Compound);  \
     op(Tag::Type::IntArray);
-namespace
-{
+namespace {
 template <Tag::Type T>
 std::string const& DefaultSuffix;
 template <Tag::Type T>
@@ -56,18 +55,15 @@ template <>
 std::string const& DefaultSuffix<Tag::Type::IntArray> = "]";
 } // namespace
 
-inline void PrettySnbtFormat::ValueFormat::toPlayerFormat()
-{
+inline void PrettySnbtFormat::ValueFormat::toPlayerFormat() {
     ColorFormat::convertToMc(mPrefix);
     ColorFormat::convertToMc(mSuffix);
 }
-inline void PrettySnbtFormat::ValueFormat::toConsoleFormat()
-{
+inline void PrettySnbtFormat::ValueFormat::toConsoleFormat() {
     ColorFormat::convertToColsole(mPrefix);
     ColorFormat::convertToColsole(mSuffix);
 }
-PrettySnbtFormat::PrettySnbtFormat()
-{
+PrettySnbtFormat::PrettySnbtFormat() {
 #define InitFormat(type) mValueFormats[type] = {DefaultPrefix<type>, DefaultSuffix<type>};
     ForEachTagType(InitFormat);
     mExpandInList[Tag::Type::End] = false;
@@ -85,8 +81,7 @@ PrettySnbtFormat::PrettySnbtFormat()
 #undef InitFormat
 }
 template <Tag::Type type>
-inline bool PrettySnbtFormat::setValueColor(mce::Color const& color)
-{
+inline bool PrettySnbtFormat::setValueColor(mce::Color const& color) {
     if constexpr (type == Tag::Type::String)
         mValueFormats[type] = {getColorCode(color) + DefaultPrefix<type>, DefaultSuffix<type> + getResetColorCode()};
     else if constexpr (type >= Tag::Type::ByteArray)
@@ -97,15 +92,13 @@ inline bool PrettySnbtFormat::setValueColor(mce::Color const& color)
 }
 
 template <Tag::Type type>
-inline bool PrettySnbtFormat::setValueFormat(std::string const& prefix, std::string const& suffix)
-{
+inline bool PrettySnbtFormat::setValueFormat(std::string const& prefix, std::string const& suffix) {
     mValueFormats[type] = {prefix, suffix};
     return true;
 }
 
 template <Tag::Type type>
-inline bool PrettySnbtFormat::setExpand(bool expand)
-{
+inline bool PrettySnbtFormat::setExpand(bool expand) {
     mExpandInList[type] = expand;
     return true;
 }
@@ -121,89 +114,75 @@ ForEachTagType(DllExport_SetValueColor);
 ForEachTagType(DllExport_SetValueFormat);
 ForEachTagType(DllExport_SetExpand);
 
-inline bool PrettySnbtFormat::setStringColor(std::string& in, mce::Color const& color)
-{
+inline bool PrettySnbtFormat::setStringColor(std::string& in, mce::Color const& color) {
     in.insert(0, getColorCode(color));
     in.append(getResetColorCode());
     return true;
 }
 
-inline std::string PrettySnbtFormat::getColorCode(mce::Color const& color) const
-{
+inline std::string PrettySnbtFormat::getColorCode(mce::Color const& color) const {
     if (mForPlayer)
         return color.toNearestColorCode();
     else
         return color.toConsoleCode();
 }
 
-inline std::string PrettySnbtFormat::getResetColorCode() const
-{
+inline std::string PrettySnbtFormat::getResetColorCode() const {
     return mForPlayer ? "§r" : "\x1b[0m";
 }
 
-inline std::string PrettySnbtFormat::getItalicCode() const
-{
+inline std::string PrettySnbtFormat::getItalicCode() const {
     return mForPlayer ? "§o" : "\x1b[3m";
 }
 
-inline bool PrettySnbtFormat::setKeyColor(mce::Color const& color)
-{
+inline bool PrettySnbtFormat::setKeyColor(mce::Color const& color) {
     mKeyFormat = {getColorCode(color) + "\"", "\"" + getResetColorCode()};
     return true;
 }
 
-inline bool PrettySnbtFormat::isPlayerFormat() const
-{
+inline bool PrettySnbtFormat::isPlayerFormat() const {
     return mForPlayer;
 }
 
-void PrettySnbtFormat::switchToPlayerFormat()
-{
+void PrettySnbtFormat::switchToPlayerFormat() {
     if (mForPlayer)
         return;
     ColorFormat::convertToMc(mIndent);
     ColorFormat::convertToMc(mSeparator);
     ColorFormat::convertToMc(mColon);
     mKeyFormat.toPlayerFormat();
-    for (auto& format : mValueFormats)
-    {
+    for (auto& format : mValueFormats) {
         format.toPlayerFormat();
     }
 }
 
-void PrettySnbtFormat::switchToConsoleFormat()
-{
+void PrettySnbtFormat::switchToConsoleFormat() {
     if (!mForPlayer)
         return;
     ColorFormat::convertToColsole(mIndent);
     ColorFormat::convertToColsole(mSeparator);
     ColorFormat::convertToColsole(mColon);
     mKeyFormat.toConsoleFormat();
-    for (auto& format : mValueFormats)
-    {
+    for (auto& format : mValueFormats) {
         format.toConsoleFormat();
     }
 }
 
-inline bool PrettySnbtFormat::setColonColor(mce::Color const& color)
-{
+inline bool PrettySnbtFormat::setColonColor(mce::Color const& color) {
     return setStringColor(mColon, color);
 }
 
-inline bool PrettySnbtFormat::setSeparatorColor(mce::Color const& color)
-{
+inline bool PrettySnbtFormat::setSeparatorColor(mce::Color const& color) {
     return setStringColor(mSeparator, color);
 }
 
-inline bool PrettySnbtFormat::setIndent(int indent)
-{
+inline bool PrettySnbtFormat::setIndent(int indent) {
     mIndent.clear();
     mIndent.resize(indent, ' ');
     return true;
 }
 
-void PrettySnbtFormat::setDefaultColor()
-{
+void PrettySnbtFormat::setDefaultColor() {
     setKeyColor(ColorFormat::colorCodeToColorMap.at("§b"));
 
     setValueColor<Tag::Type::Int>(ColorFormat::colorCodeToColorMap.at("§e"));
@@ -222,10 +201,8 @@ void PrettySnbtFormat::setDefaultColor()
     setValueColor<Tag::Type::IntArray>(ColorFormat::colorCodeToColorMap.at("§d"));
 }
 
-PrettySnbtFormat const& PrettySnbtFormat::getDefaultFormat(bool forPlayer)
-{
-    if (forPlayer)
-    {
+PrettySnbtFormat const& PrettySnbtFormat::getDefaultFormat(bool forPlayer) {
+    if (forPlayer) {
         static PrettySnbtFormat const consoleFormat = ([]() -> PrettySnbtFormat {
             PrettySnbtFormat format;
             format.mForPlayer = true;
@@ -235,9 +212,7 @@ PrettySnbtFormat const& PrettySnbtFormat::getDefaultFormat(bool forPlayer)
             return format;
         })();
         return consoleFormat;
-    }
-    else
-    {
+    } else {
         static PrettySnbtFormat const playerFormat = ([]() -> PrettySnbtFormat {
             PrettySnbtFormat format;
             format.mForPlayer = false;
diff --git a/LiteLoader/Kernel/NBT/ShortTagAPI.cpp b/LiteLoader/Kernel/NBT/ShortTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/ShortTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/ShortTagAPI.cpp
@@ -26,8 +26,7 @@ short ShortTag::get() {
     return value();
 }
 
-ShortTag::operator short() const
-{
+ShortTag::operator short() const {
     if (!this)
         return 0;
     return val;
diff --git a/LiteLoader/Kernel/NBT/StringTagAPI.cpp b/LiteLoader/Kernel/NBT/StringTagAPI.cpp
--- a/LiteLoader/Kernel/NBT/StringTagAPI.cpp
+++ b/LiteLoader/Kernel/NBT/StringTagAPI.cpp
@@ -26,8 +26,7 @@ std::string StringTag::get() {
     return value();
 }
 
-StringTag::operator std::string() const
-{
+StringTag::operator std::string() const {
     if (!this)
         return "";
     return val;
diff --git a/LiteLoader/Kernel/NBT/TagMemoryChunk.cpp b/LiteLoader/Kernel/NBT/TagMemoryChunk.cpp
--- a/LiteLoader/Kernel/NBT/TagMemoryChunk.cpp
+++ b/LiteLoader/Kernel/NBT/TagMemoryChunk.cpp
@@ -1,31 +1,29 @@
 #include <MC/TagMemoryChunk.hpp>
 
 TagMemoryChunk::TagMemoryChunk(char data[], size_t size)
-    : capacity(size)
-    , size(size)
-    //, data(std::move(data))
+: capacity(size)
+, size(size)
+//, data(std::move(data))
 {
     this->data = std::unique_ptr<char[]>(new char[size]);
     memcpy(this->data.get(), data, size);
 }
 
 TagMemoryChunk::TagMemoryChunk(const TagMemoryChunk& a1)
-    //: capacity(a1.capacity), size(a1.size), data(std::make_unique<char*>(new char[capacity]))
+//: capacity(a1.capacity), size(a1.size), data(std::make_unique<char*>(new char[capacity]))
 {
     *this = a1.copy();
 }
 
 TagMemoryChunk::TagMemoryChunk(TagMemoryChunk&& a1)
-    : capacity(a1.capacity), size(a1.size), data(std::move(a1.data))
-{ }
+: capacity(a1.capacity), size(a1.size), data(std::move(a1.data)) {
+}
 
-void TagMemoryChunk::operator=(const TagMemoryChunk& a1)
-{
+void TagMemoryChunk::operator=(const TagMemoryChunk& a1) {
     *this = a1.copy();
 }
 
-void TagMemoryChunk::operator=(TagMemoryChunk&& a1)
-{
+void TagMemoryChunk::operator=(TagMemoryChunk&& a1) {
     capacity = a1.capacity;
     size = a1.size;
     data = std::move(a1.data);
diff --git a/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp b/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp
--- a/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp
+++ b/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp
@@ -7,8 +7,7 @@ std::string& BinaryStream::getRaw() {
     return *dAccess<std::string*, 96>(this); // BinaryStream::getAndReleaseData
 }
 
-void BinaryStream::writeCompoundTag(class CompoundTag const& tag)
-{
+void BinaryStream::writeCompoundTag(class CompoundTag const& tag) {
     void (*rv)(class CompoundTag const&, class BinaryStream&);
     *((void**)&rv) = dlsym("?write@?$serialize@VCompoundTag@@@@SAXAEBVCompoundTag@@AEAVBinaryStream@@@Z");
     return (*rv)(tag, *this);
diff --git a/LiteLoader/Kernel/Network/PacketAPI.cpp b/LiteLoader/Kernel/Network/PacketAPI.cpp
--- a/LiteLoader/Kernel/Network/PacketAPI.cpp
+++ b/LiteLoader/Kernel/Network/PacketAPI.cpp
@@ -387,7 +387,7 @@ extern Logger logger;
     Func(UpdateAbilitiesPacket);                   \
     Func(UpdateAdventureSettingsPacket);           \
     Func(EditorNetworkPacket);                     \
-    Func(DeathInfoPacket);                         \
+    Func(DeathInfoPacket);
 
 #define DeclearClass(packet) class packet;
 
@@ -402,8 +402,7 @@ inline void* VFTABLE_ADDR;
 template <typename T>
 inline size_t PACKET_SIZE;
 
-inline void __initPacketVftable()
-{
+inline void __initPacketVftable() {
     static bool inited = false;
     if (inited)
         return;
@@ -417,30 +416,25 @@ inline void __initPacketVftable()
 }
 
 template <typename T>
-inline void* getVftableAddr()
-{
+inline void* getVftableAddr() {
     __initPacketVftable();
     return VFTABLE_ADDR<T>;
 }
 
-void __initPacketSize()
-{
+void __initPacketSize() {
     static bool inited = false;
     if (inited)
         return;
     inited = true;
-#define SET_PACKET_SIZE(type)                            \
-    if (getVftableAddr<type>() == *(void**)packet.get()) \
-    {                                                    \
-        PACKET_SIZE<type> = size - 16;                   \
-        continue;                                        \
+#define SET_PACKET_SIZE(type)                              \
+    if (getVftableAddr<type>() == *(void**)packet.get()) { \
+        PACKET_SIZE<type> = size - 16;                     \
+        continue;                                          \
     }
     int packetId = -1;
-    while (packetId < 200)
-    {
+    while (packetId < 200) {
         auto packet = MinecraftPackets::createPacket(++packetId);
-        if (packet)
-        {
+        if (packet) {
             auto size = _msize((void**)packet.get() - 2);
 
             ForEachPacket(SET_PACKET_SIZE);
@@ -450,8 +444,7 @@ void __initPacketSize()
 #undef SET_PACKET_SIZE
 }
 
-std::string getClassName(Packet* packet)
-{
+std::string getClassName(Packet* packet) {
 #define RETURN_IF_FIND(type)                             \
     if (getVftableAddr<class type>() == *(void**)packet) \
         return #type;
@@ -461,16 +454,13 @@ std::string getClassName(Packet* packet)
 #undef RETURN_IF_FIND
 }
 
-inline void forEachPacket(std::function<void(Packet const& packet, std::string className, size_t size)> callback)
-{
+inline void forEachPacket(std::function<void(Packet const& packet, std::string className, size_t size)> callback) {
     int packetId = 0;
-    while (packetId < 200)
-    {
+    while (packetId < 200) {
         auto packet = MinecraftPackets::createPacket(packetId);
-        if (packet)
-        {
+        if (packet) {
             auto size = _msize((void**)packet.get() - 2);
-            //logger.warn("Packet: {},{},{},{},{}", magic_enum::enum_name((MinecraftPacketIds)packetId), packet->getName(), getClassName(packet.get()), packetId, size);
+            // logger.warn("Packet: {},{},{},{},{}", magic_enum::enum_name((MinecraftPacketIds)packetId), packet->getName(), getClassName(packet.get()), packetId, size);
 
             auto className = getClassName(packet.get());
             callback(*packet, className, size - 16);
@@ -480,8 +470,7 @@ inline void forEachPacket(std::function<void(Packet const& packet, std::string c
 }
 
 template <typename T>
-inline size_t getPacketSize()
-{
+inline size_t getPacketSize() {
     __initPacketSize();
     return PACKET_SIZE<T>;
 }
@@ -497,8 +486,7 @@ using ParamType = DynamicCommand::ParameterType;
 using ParamIndex = DynamicCommandInstance::ParameterIndex;
 using Result = DynamicCommand::Result;
 
-inline bool replaceString(std::string& content, std::string const& start, std::string const& end, std::string const& str, size_t offset = 0, bool exclude = true)
-{
+inline bool replaceString(std::string& content, std::string const& start, std::string const& end, std::string const& str, size_t offset = 0, bool exclude = true) {
     auto startOffset = content.find(start, offset);
     if (startOffset == content.npos)
         return false;
@@ -506,17 +494,14 @@ inline bool replaceString(std::string& content, std::string const& start, std::s
         startOffset += start.size();
     auto endOffset = end.empty() ? content.npos : content.find(end, startOffset);
 
-    if (endOffset != content.npos && !exclude)
-    {
+    if (endOffset != content.npos && !exclude) {
         endOffset += sizeof(end);
     }
     content.replace(startOffset, endOffset - startOffset, str);
     return true;
-
 }
 
-void autoGenerate()
-{
+void autoGenerate() {
     auto file = ReadAllFile(__FILE__, false);
     if (!file)
         __debugbreak();
@@ -556,8 +541,7 @@ void autoGenerate()
     WriteAllFile(__FILE__, content, false);
 }
 template <typename T>
-void __autoFill(std::string const& className)
-{
+void __autoFill(std::string const& className) {
     if (sizeof(T) == getPacketSize<T>())
         return;
 
@@ -565,8 +549,7 @@ void __autoFill(std::string const& className)
 
     std::filesystem::path filePath = McDir.append(fmt::format("{}.hpp", className));
     auto file = ReadAllFile(filePath.string());
-    if (!file)
-    {
+    if (!file) {
         __debugbreak();
         return;
     }
@@ -575,29 +558,23 @@ void __autoFill(std::string const& className)
     std::string filler = fmt::format("    char filler[{}];\n", getPacketSize<T>() - 48);
 
     auto startOffset = content.find("// Add Member There");
-    if (startOffset == content.npos)
-    {
+    if (startOffset == content.npos) {
         startOffset = content.find("#define AFTER_EXTRA");
-        if (startOffset == content.npos)
-        {
+        if (startOffset == content.npos) {
             __debugbreak();
             return;
         }
         filler = "// Add Member There\n" + filler;
     }
 
-    startOffset += std::string("// Add Member There").size()+1;
+    startOffset += std::string("// Add Member There").size() + 1;
     auto endOffset = content.find("#undef", startOffset);
 
-    if (sizeof(T) != 48)
-    {
-        replaceString(content, "filler[", "]", std::to_string(getPacketSize<T>()-48));
-    }
-    else
-    {
-        if (content.substr(startOffset, endOffset - startOffset) != "\n")
-        {
-            startOffset = content.find("\n\n", startOffset)+1;
+    if (sizeof(T) != 48) {
+        replaceString(content, "filler[", "]", std::to_string(getPacketSize<T>() - 48));
+    } else {
+        if (content.substr(startOffset, endOffset - startOffset) != "\n") {
+            startOffset = content.find("\n\n", startOffset) + 1;
             __debugbreak();
         }
         content.insert(startOffset, filler);
@@ -606,11 +583,10 @@ void __autoFill(std::string const& className)
     WriteAllFile(filePath.string(), content);
     return;
 }
-void autoFill()
-{
+void autoFill() {
 #ifdef FILL_PACKET
 
-#define AUTO_FILL(type)\
+#define AUTO_FILL(type) \
     __autoFill<type>(#type);
     ForEachPacket(AUTO_FILL);
 #undef AUTO_FILL;
@@ -619,15 +595,13 @@ void autoFill()
 }
 
 void onExecute(DynamicCommand const& cmd, CommandOrigin const& origin, CommandOutput& output,
-               std::unordered_map<std::string, Result>& results)
-{
+               std::unordered_map<std::string, Result>& results) {
     autoGenerate();
     autoFill();
     output.success("Generate finished");
 }
 
-TClasslessInstanceHook2("SetupPacketCommand_startServerThread", void, "?startServerThread@ServerInstance@@QEAAXXZ")
-{
+TClasslessInstanceHook2("SetupPacketCommand_startServerThread", void, "?startServerThread@ServerInstance@@QEAAXXZ") {
     original(this);
     Global<Level> = Global<Minecraft>->getLevel();
     autoGenerate();
diff --git a/LiteLoader/Kernel/Network/ReadOnlyBinaryStreamAPI.cpp b/LiteLoader/Kernel/Network/ReadOnlyBinaryStreamAPI.cpp
--- a/LiteLoader/Kernel/Network/ReadOnlyBinaryStreamAPI.cpp
+++ b/LiteLoader/Kernel/Network/ReadOnlyBinaryStreamAPI.cpp
@@ -25,8 +25,7 @@ void ReadOnlyBinaryStream::setReadPointer(std::size_t size) {
         readPointer = len;
 }
 
-std::unique_ptr<class CompoundTag> ReadOnlyBinaryStream::getCompoundTag()
-{
+std::unique_ptr<class CompoundTag> ReadOnlyBinaryStream::getCompoundTag() {
     auto tag = CompoundTag::create();
     class CompoundTag& (*rv)(class CompoundTag&, class ReadOnlyBinaryStream&);
     *((void**)&rv) = dlsym("?read@?$serialize@VCompoundTag@@@@SA?AVCompoundTag@@AEAVReadOnlyBinaryStream@@@Z");
@@ -34,4 +33,4 @@ std::unique_ptr<class CompoundTag> ReadOnlyBinaryStream::getCompoundTag()
     return std::move(tag);
 }
 
-//static_assert(offsetof(ReadOnlyBinaryStream, pBuf) == 56);
\ No newline at end of file
+// static_assert(offsetof(ReadOnlyBinaryStream, pBuf) == 56);
\ No newline at end of file
diff --git a/LiteLoader/Kernel/ObjectivePacketHelper.cpp b/LiteLoader/Kernel/ObjectivePacketHelper.cpp
--- a/LiteLoader/Kernel/ObjectivePacketHelper.cpp
+++ b/LiteLoader/Kernel/ObjectivePacketHelper.cpp
@@ -1,11 +1,10 @@
-#include<set>
+#include <set>
 #include <Impl/ObjectivePacketHelper.h>
 std::set<uint64_t> scoreIds;
 
 #define RAND_SCORE_ID() (uint64_t)((rand() << 16) + rand() + 1145140)
 
-uint64_t NewScoreId()
-{
+uint64_t NewScoreId() {
     uint64_t Id = 0;
     do {
         Id = RAND_SCORE_ID();
diff --git a/LiteLoader/Kernel/RemoteCallAPI.cpp b/LiteLoader/Kernel/RemoteCallAPI.cpp
--- a/LiteLoader/Kernel/RemoteCallAPI.cpp
+++ b/LiteLoader/Kernel/RemoteCallAPI.cpp
@@ -5,15 +5,12 @@
 
 extern Logger logger;
 
-namespace RemoteCall
-{
+namespace RemoteCall {
 CallbackFn const EMPTY_FUNC{};
 std::unordered_map<std::string, RemoteCall::ExportedFuncData> exportedFuncs;
 
-bool exportFunc(std::string const& nameSpace, std::string const& funcName, CallbackFn&& callback, HMODULE handle)
-{
-    if (nameSpace.find("::") != nameSpace.npos)
-    {
+bool exportFunc(std::string const& nameSpace, std::string const& funcName, CallbackFn&& callback, HMODULE handle) {
+    if (nameSpace.find("::") != nameSpace.npos) {
         logger.error("Namespace can't includes \"::\"");
         return false;
     }
@@ -23,58 +20,47 @@ bool exportFunc(std::string const& nameSpace, std::string const& funcName, Callb
     return true;
 }
 
-CallbackFn const& importFunc(std::string const& nameSpace, std::string const& funcName)
-{
+CallbackFn const& importFunc(std::string const& nameSpace, std::string const& funcName) {
     auto iter = exportedFuncs.find(nameSpace + "::" + funcName);
     if (iter == exportedFuncs.end())
         return EMPTY_FUNC;
     return iter->second.callback;
 }
 
-bool hasFunc(std::string const& nameSpace, std::string const& funcName)
-{
+bool hasFunc(std::string const& nameSpace, std::string const& funcName) {
     return exportedFuncs.find(nameSpace + "::" + funcName) != exportedFuncs.end();
 }
 
-bool removeFunc(std::string&& key)
-{
+bool removeFunc(std::string&& key) {
     return exportedFuncs.erase(key);
 }
 
-bool removeFunc(std::string const& nameSpace, std::string const& funcName)
-{
+bool removeFunc(std::string const& nameSpace, std::string const& funcName) {
     return removeFunc(nameSpace + "::" + funcName);
 }
 
-void _onCallError(std::string const& msg, HMODULE handle)
-{
+void _onCallError(std::string const& msg, HMODULE handle) {
     logger.error(msg);
     auto plugin = LL::getPlugin(handle);
     if (plugin)
         logger.error("In plugin <{}>", plugin->name);
 }
 
-int removeNameSpace(std::string const& nameSpace)
-{
+int removeNameSpace(std::string const& nameSpace) {
     int count = 0;
-    for (auto& iter = exportedFuncs.begin(); iter != exportedFuncs.end();)
-    {
-        if (SplitStrWithPattern(iter->first, "::")[0] == nameSpace)
-        {
+    for (auto& iter = exportedFuncs.begin(); iter != exportedFuncs.end();) {
+        if (SplitStrWithPattern(iter->first, "::")[0] == nameSpace) {
             iter = exportedFuncs.erase(iter);
             ++count;
-        }
-        else
+        } else
             ++iter;
     }
     return count;
 }
 
-int removeFuncs(std::vector<std::pair<std::string, std::string>> funcs)
-{
+int removeFuncs(std::vector<std::pair<std::string, std::string>> funcs) {
     int count = 0;
-    for (auto& [ns, name] : funcs)
-    {
+    for (auto& [ns, name] : funcs) {
         if (removeFunc(ns + "::" + name))
             count++;
     }
@@ -96,7 +82,7 @@ static_assert(RemoteCall::is_supported_type_v<Block*>);
 static_assert(RemoteCall::is_supported_type_v<Vec3>);
 static_assert(RemoteCall::is_supported_type_v<Vec3&>);
 static_assert(RemoteCall::is_supported_type_v<Vec3 const&>);
-//static_assert(RemoteCall::is_supported_type_v<Vec3 const*>);
+// static_assert(RemoteCall::is_supported_type_v<Vec3 const*>);
 static_assert(RemoteCall::is_supported_type_v<CompoundTag*>);
 
 
@@ -136,17 +122,14 @@ inline bool testExtra = ([]() {
 #endif // false
     return true;
 })();
-int TestExport(std::string a0, int a1, int a2)
-{
+int TestExport(std::string a0, int a1, int a2) {
     return static_cast<int>(a0.size()) + a1;
 }
-std::unique_ptr<CompoundTag> TestSimulatedPlayerLL(Player* player)
-{
+std::unique_ptr<CompoundTag> TestSimulatedPlayerLL(Player* player) {
     return player->getNbt();
 }
 
-void exportTestSimulatedPlayerLL()
-{
+void exportTestSimulatedPlayerLL() {
     RemoteCall::exportAs("TestRemoteCall", "TestSimulatedPlayerLL", TestSimulatedPlayerLL);
 }
 #include <EventAPI.h>
diff --git a/LiteLoader/Kernel/ScheduleAPI.cpp b/LiteLoader/Kernel/ScheduleAPI.cpp
--- a/LiteLoader/Kernel/ScheduleAPI.cpp
+++ b/LiteLoader/Kernel/ScheduleAPI.cpp
@@ -17,7 +17,9 @@ atomic_uint nextTaskId = 0;
 class ScheduleTaskData {
 public:
     enum class TaskType {
-        Delay, Repeat, InfiniteRepeat
+        Delay,
+        Repeat,
+        InfiniteRepeat
     };
     unsigned int taskId;
     TaskType type;
@@ -28,19 +30,19 @@ class ScheduleTaskData {
 
     ScheduleTaskData::ScheduleTaskData(TaskType type, std::function<void(void)> task, unsigned long long delay,
                                        unsigned long long interval, int count, HMODULE handle)
-        : type(type)
-        , task(task)
-        , leftTime((long long)delay)
-        , interval((long long)interval)
-        , count(count)
-        , taskId(++nextTaskId)
-        , handle(handle) {};
+    : type(type)
+    , task(task)
+    , leftTime((long long)delay)
+    , interval((long long)interval)
+    , count(count)
+    , taskId(++nextTaskId)
+    , handle(handle){};
 
     inline unsigned int getTaskId() {
         return taskId;
     }
 
-    inline bool operator>(const ScheduleTaskData &t) const {
+    inline bool operator>(const ScheduleTaskData& t) const {
         return leftTime > t.leftTime;
     }
 };
@@ -50,7 +52,7 @@ std::vector<unsigned int> pendingCancelList{};
 bool pendingClear = false;
 
 class ScheduleTaskQueueType
-        : public priority_queue<ScheduleTaskData, vector<ScheduleTaskData>, greater<ScheduleTaskData>> {
+: public priority_queue<ScheduleTaskData, vector<ScheduleTaskData>, greater<ScheduleTaskData>> {
 public:
     bool remove(unsigned int taskId) {
         size_t size = c.size();
@@ -60,7 +62,7 @@ class ScheduleTaskQueueType
             if (c[i].taskId == taskId) {
                 c[i] = c.back();
                 c.pop_back();
-                std::make_heap(c.begin(), c.end(), comp);  //重排二叉堆
+                std::make_heap(c.begin(), c.end(), comp); //重排二叉堆
                 removed = true;
             }
         return removed;
@@ -70,8 +72,7 @@ class ScheduleTaskQueueType
         c.clear();
     }
 
-    inline void tick()
-    {
+    inline void tick() {
         if (pendingClear) {
             clear();
             std::vector<ScheduleTaskData> tmpList;
@@ -82,14 +83,12 @@ class ScheduleTaskQueueType
             locker.unlock();
             return;
         }
-        if (!pendingTaskList.empty())
-        {
+        if (!pendingTaskList.empty()) {
             std::vector<ScheduleTaskData> tmpList;
             locker.lock();
             tmpList.swap(pendingTaskList);
             locker.unlock();
-            for (auto& task : tmpList)
-            {
+            for (auto& task : tmpList) {
                 push(std::move(task));
             }
             tmpList.clear();
@@ -97,15 +96,13 @@ class ScheduleTaskQueueType
         if (c.empty()) {
             return;
         }
-        if (!pendingCancelList.empty())
-        { 
+        if (!pendingCancelList.empty()) {
             std::vector<uint32_t> tmpList;
             locker.lock();
             // ScheduleTaskData destructor may trigger ScriptX's lock
             tmpList.swap(pendingCancelList);
             locker.unlock();
-            for (auto tid : tmpList)
-            {
+            for (auto tid : tmpList) {
                 remove(tid);
             }
             tmpList.clear();
@@ -118,50 +115,47 @@ class ScheduleTaskQueueType
                 if (empty())
                     break;
                 const ScheduleTaskData& t = top();
-                 if (t.leftTime > 0)
+                if (t.leftTime > 0)
                     break;
 
-                //timeout
+                // timeout
                 try {
                     if (!t.task)
                         continue;
                     t.task();
 
                     switch (t.type) {
-                    case ScheduleTaskData::TaskType::InfiniteRepeat: {
-                        ScheduleTaskData sche{ std::move(t) };
-                        sche.leftTime = sche.interval;
-                        push(std::move(sche));
-                        break;
-                    }
-                    case ScheduleTaskData::TaskType::Repeat: {
-                        if (t.count > 0) {
-                            ScheduleTaskData sche{ std::move(t) };
+                        case ScheduleTaskData::TaskType::InfiniteRepeat: {
+                            ScheduleTaskData sche{std::move(t)};
                             sche.leftTime = sche.interval;
-                            --sche.count;
                             push(std::move(sche));
+                            break;
                         }
-                        break;
-                    }
-                    default:
-                        break;
+                        case ScheduleTaskData::TaskType::Repeat: {
+                            if (t.count > 0) {
+                                ScheduleTaskData sche{std::move(t)};
+                                sche.leftTime = sche.interval;
+                                --sche.count;
+                                push(std::move(sche));
+                            }
+                            break;
+                        }
+                        default:
+                            break;
                     }
-                }
-                catch (const seh_exception& e) {
+                } catch (const seh_exception& e) {
                     logger.error("SEH exception occurred in ScheduleTask!");
                     logger.error("{}", TextEncoding::toUTF8(e.what()));
                     logger.error("TaskId: {}", t.taskId);
                     if (auto plugin = LL::getPlugin(t.handle))
                         logger.error("In Plugin: <{} {}>", plugin->name, plugin->version.toString());
-                }
-                catch (const std::exception& e) {
+                } catch (const std::exception& e) {
                     logger.error("Exception occurred in ScheduleTask!");
                     logger.error("{}", TextEncoding::toUTF8(e.what()));
                     logger.error("TaskId: {}", t.taskId);
                     if (auto plugin = LL::getPlugin(t.handle))
                         logger.error("In Plugin: <{} {}>", plugin->name, plugin->version.toString());
-                }
-                catch (...) {
+                } catch (...) {
                     logger.error("Exception occurred in ScheduleTask!");
                     logger.error("TaskId: {}", t.taskId);
                     if (auto plugin = LL::getPlugin(t.handle))
@@ -169,11 +163,9 @@ class ScheduleTaskQueueType
                 }
                 pop();
             }
-        }
-        catch (...) {
+        } catch (...) {
             logger.error("Exception occurred in ScheduleTask!");
         }
-
     }
 
     bool has(unsigned int taskId) {
@@ -188,65 +180,59 @@ ScheduleTaskQueueType taskQueue;
 
 
 namespace Schedule {
-    ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay, HMODULE handle)
-    {
-        if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
-            return ScheduleTask((unsigned) -1);
-        ScheduleTaskData sche(ScheduleTaskData::TaskType::Delay, task, tickDelay, -1, -1, handle);
-        locker.lock();
-        pendingTaskList.push_back(sche);
-        locker.unlock();
-        return ScheduleTask(sche.getTaskId());
-    }
+ScheduleTask delay(std::function<void(void)> task, unsigned long long tickDelay, HMODULE handle) {
+    if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
+        return ScheduleTask((unsigned)-1);
+    ScheduleTaskData sche(ScheduleTaskData::TaskType::Delay, task, tickDelay, -1, -1, handle);
+    locker.lock();
+    pendingTaskList.push_back(sche);
+    locker.unlock();
+    return ScheduleTask(sche.getTaskId());
+}
 
-    ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickRepeat, int maxCount, HMODULE handle)
-    {
-        if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
-            return ScheduleTask((unsigned) -1);
-        ScheduleTaskData::TaskType type = maxCount < 0 ?
-                                          ScheduleTaskData::TaskType::InfiniteRepeat
-                                                       : ScheduleTaskData::TaskType::Repeat;
-        ScheduleTaskData sche(type, task, std::max(tickRepeat, 1ull), std::max(tickRepeat, 1ull), maxCount, handle);
-        locker.lock();
-        pendingTaskList.push_back(sche);
-        locker.unlock();
-        return ScheduleTask(sche.getTaskId());
-    }
+ScheduleTask repeat(std::function<void(void)> task, unsigned long long tickRepeat, int maxCount, HMODULE handle) {
+    if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
+        return ScheduleTask((unsigned)-1);
+    ScheduleTaskData::TaskType type = maxCount < 0 ? ScheduleTaskData::TaskType::InfiniteRepeat
+                                                   : ScheduleTaskData::TaskType::Repeat;
+    ScheduleTaskData sche(type, task, std::max(tickRepeat, 1ull), std::max(tickRepeat, 1ull), maxCount, handle);
+    locker.lock();
+    pendingTaskList.push_back(sche);
+    locker.unlock();
+    return ScheduleTask(sche.getTaskId());
+}
 
-    ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay,
-        unsigned long long tickRepeat, int maxCount, HMODULE handle)
-    {
-        if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
-            return ScheduleTask((unsigned)-1);
-        ScheduleTaskData::TaskType type = maxCount < 0 ? ScheduleTaskData::TaskType::InfiniteRepeat
-                                                       : ScheduleTaskData::TaskType::Repeat;
-        ScheduleTaskData sche(type, task, tickDelay, std::max(tickRepeat, 1ull), maxCount, handle);
-        locker.lock();
-        pendingTaskList.push_back(sche);
-        locker.unlock();
-        return ScheduleTask(sche.getTaskId());
-    }
+ScheduleTask delayRepeat(std::function<void(void)> task, unsigned long long tickDelay,
+                         unsigned long long tickRepeat, int maxCount, HMODULE handle) {
+    if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
+        return ScheduleTask((unsigned)-1);
+    ScheduleTaskData::TaskType type = maxCount < 0 ? ScheduleTaskData::TaskType::InfiniteRepeat
+                                                   : ScheduleTaskData::TaskType::Repeat;
+    ScheduleTaskData sche(type, task, tickDelay, std::max(tickRepeat, 1ull), maxCount, handle);
+    locker.lock();
+    pendingTaskList.push_back(sche);
+    locker.unlock();
+    return ScheduleTask(sche.getTaskId());
+}
 
-    ScheduleTask nextTick(std::function<void(void)> task, HMODULE handle)
-    {
-        if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
-            return ScheduleTask((unsigned) -1);
-        ScheduleTaskData sche(ScheduleTaskData::TaskType::Delay, task, 1, -1, -1, handle);
-        locker.lock();
-        pendingTaskList.push_back(sche);
-        locker.unlock();
-        return ScheduleTask(sche.getTaskId());
-    }
+ScheduleTask nextTick(std::function<void(void)> task, HMODULE handle) {
+    if (LL::globalConfig.serverStatus >= LL::LLServerStatus::Stopping)
+        return ScheduleTask((unsigned)-1);
+    ScheduleTaskData sche(ScheduleTaskData::TaskType::Delay, task, 1, -1, -1, handle);
+    locker.lock();
+    pendingTaskList.push_back(sche);
+    locker.unlock();
+    return ScheduleTask(sche.getTaskId());
 }
+} // namespace Schedule
 
 THook(void, "?tick@ServerLevel@@UEAAXXZ",
-      void *_this) {
+      void* _this) {
     original(_this);
     taskQueue.tick();
 }
 
-void EndScheduleSystem()
-{
+void EndScheduleSystem() {
     locker.lock();
     pendingClear = true;
     locker.unlock();
@@ -254,7 +240,8 @@ void EndScheduleSystem()
 
 
 ScheduleTask::ScheduleTask(unsigned int taskId)
-        : taskId(taskId) {}
+: taskId(taskId) {
+}
 
 bool ScheduleTask::cancel() {
     locker.lock();
diff --git a/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp b/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp
--- a/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp
+++ b/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp
@@ -2,23 +2,24 @@
 #include <MC/ServerScoreboard.hpp>
 #include <GlobalServiceAPI.h>
 
-//helper
+// helper
 #define H do_hash
 LIAPI bool checkSlotName(const std::string& slot) {
     switch (H(slot.c_str())) {
-    case H("list"): break;
-    case H("sidebar"): break;
-    case H("belowname"): break;
-    default:
-        return false;
+        case H("list"):
+            break;
+        case H("sidebar"):
+            break;
+        case H("belowname"):
+            break;
+        default:
+            return false;
     }
     return true;
 }
 
-bool Objective::setDisplay(const std::string& slotName, ObjectiveSortOrder sort)
-{
-    if (checkSlotName(slotName))
-    {
+bool Objective::setDisplay(const std::string& slotName, ObjectiveSortOrder sort) {
+    if (checkSlotName(slotName)) {
         ((ServerScoreboard*)Global<Scoreboard>)->setDisplayObjective(slotName, *this, sort);
         return true;
     }
diff --git a/LiteLoader/Kernel/Scoreboard/ScoreboardAPI.cpp b/LiteLoader/Kernel/Scoreboard/ScoreboardAPI.cpp
--- a/LiteLoader/Kernel/Scoreboard/ScoreboardAPI.cpp
+++ b/LiteLoader/Kernel/Scoreboard/ScoreboardAPI.cpp
@@ -57,8 +57,7 @@ LIAPI std::optional<int> Scoreboard::addScore(const std::string& objname, const
     int a1 = 0;
     auto ref = Global<Scoreboard>->getScoreboardIdentityRef(identity);
     bool res = ref->modifyScoreInObjective(a1, *obj, score, PlayerScoreSetFunction::Add);
-    if (res)
-    {
+    if (res) {
         Global<Scoreboard>->onScoreChanged(identity, *obj);
         return a1;
     }
@@ -75,8 +74,7 @@ LIAPI std::optional<int> Scoreboard::setScore(const std::string& objname, const
     int a1 = 0;
     auto ref = Global<Scoreboard>->getScoreboardIdentityRef(identity);
     bool res = ref->modifyScoreInObjective(a1, *obj, score, PlayerScoreSetFunction::Set);
-    if (res)
-    {
+    if (res) {
         Global<Scoreboard>->onScoreChanged(identity, *obj);
         return a1;
     }
@@ -93,8 +91,7 @@ LIAPI std::optional<int> Scoreboard::reduceScore(const std::string& objname, con
     int a1 = 0;
     auto ref = Global<Scoreboard>->getScoreboardIdentityRef(identity);
     bool res = ref->modifyScoreInObjective(a1, *obj, score, PlayerScoreSetFunction::Remove);
-    if (res)
-    {
+    if (res) {
         Global<Scoreboard>->onScoreChanged(identity, *obj);
         return a1;
     }
@@ -123,8 +120,7 @@ LIAPI bool Scoreboard::removeFromObjective(const std::string& objname, Player* p
     vector<ScorePacketInfo> info;
     ScorePacketInfo i((ScoreboardId*)&identity, objname, Global<Scoreboard>->getScoreboardIdentityRef(identity)->getIdentityType(), obj->getPlayerScore(identity).getCount(), obj->getName());
     info.emplace_back(i);
-    for (auto sp : Level::getAllPlayers())
-    {
+    for (auto sp : Level::getAllPlayers()) {
         sp->sendSetScorePacket(1, info);
     }
     auto out = Global<Scoreboard>->getScoreboardIdentityRef(identity)->removeFromObjective(*Global<Scoreboard>, *obj);
@@ -142,12 +138,11 @@ LIAPI int Scoreboard::getScore(const std::string& objname, const std::string& id
 
     auto scores = Global<Scoreboard>->getIdScores(identity);
 #ifdef DEBUG
-    struct voids
-    {
+    struct voids {
         void** filler[100];
     };
     auto& vs = *(voids*&)scores; // -> sizeof(ScoreInfo) == 16
-#endif // DEBUG
+#endif                           // DEBUG
     for (auto& it : scores)
         if (it.getObjective() == obj)
             return it.getCount();
@@ -177,7 +172,7 @@ LIAPI bool Scoreboard::setScore(Player* player, const std::string& key, int valu
         Global<Scoreboard>->createScoreboardId(*player);
     }
     bool a2 = true;
-    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)0); //Set
+    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)0); // Set
     return true;
 }
 
@@ -191,7 +186,7 @@ LIAPI bool Scoreboard::addScore(Player* player, const std::string& key, int valu
         Global<Scoreboard>->createScoreboardId(*player);
     }
     bool a2 = true;
-    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)1); //Add
+    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)1); // Add
     return true;
 }
 
@@ -207,7 +202,7 @@ LIAPI bool Scoreboard::reduceScore(Player* player, const std::string& key, int v
         Global<Scoreboard>->createScoreboardId(*player);
     }
     bool a2 = true;
-    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)2); //Reduce
+    Global<Scoreboard>->modifyPlayerScore(a2, identity, *obj, value, (PlayerScoreSetFunction)2); // Reduce
     return true;
 }
 
diff --git a/LiteLoader/Kernel/ServerAPI.cpp b/LiteLoader/Kernel/ServerAPI.cpp
--- a/LiteLoader/Kernel/ServerAPI.cpp
+++ b/LiteLoader/Kernel/ServerAPI.cpp
@@ -7,20 +7,19 @@
 class UserEntityIdentifierComponent;
 
 namespace LL {
-    std::string getBdsVersion() {
-        return Common::getGameVersionString();
-    }
+std::string getBdsVersion() {
+    return Common::getGameVersionString();
+}
 
-    int getServerProtocolVersion() {
-        return SharedConstants::NetworkProtocolVersion;
-    }
+int getServerProtocolVersion() {
+    return SharedConstants::NetworkProtocolVersion;
+}
 
-    bool setServerMotd(const std::string& motd)
-    {
-        if (!Global<ServerNetworkHandler>)
-            return false;
+bool setServerMotd(const std::string& motd) {
+    if (!Global<ServerNetworkHandler>)
+        return false;
 
-        Global<ServerNetworkHandler>->allowIncomingConnections(motd, true);
-        return true;
-    }
+    Global<ServerNetworkHandler>->allowIncomingConnections(motd, true);
+    return true;
+}
 } // namespace LL
diff --git a/LiteLoader/Kernel/SimulatedPlayerAPI.cpp b/LiteLoader/Kernel/SimulatedPlayerAPI.cpp
--- a/LiteLoader/Kernel/SimulatedPlayerAPI.cpp
+++ b/LiteLoader/Kernel/SimulatedPlayerAPI.cpp
@@ -7,10 +7,14 @@
 #include <MC/OwnerStorageEntity.hpp>
 #include <MC/Level.hpp>
 
-//static_assert(sizeof(ScriptNavigationResult) == 32);
+// static_assert(sizeof(ScriptNavigationResult) == 32);
 
-bool SimulatedPlayer::simulateDestory()
-{
+// For compatibility
+bool SimulatedPlayer::simulateDestory() {
+    return SimulatedPlayer::simulateDestroy();
+}
+
+bool SimulatedPlayer::simulateDestroy() {
     FaceID face = FaceID::Unknown;
     auto blockIns = getBlockFromViewVector(face);
     if (blockIns.isNull())
@@ -18,53 +22,45 @@ bool SimulatedPlayer::simulateDestory()
     return simulateDestroyBlock(blockIns.getPosition(), (ScriptModuleMinecraft::ScriptFacing)face);
 }
 
-bool SimulatedPlayer::simulateUseItem()
-{
+bool SimulatedPlayer::simulateUseItem() {
     auto slot = getSelectedItemSlot();
     return simulateUseItemInSlot(slot);
 }
 
-bool SimulatedPlayer::simulateSneak()
-{
+bool SimulatedPlayer::simulateSneak() {
     setSneaking(true);
     return isSneaking();
 }
 
-bool SimulatedPlayer::simulateStopSneaking()
-{
+bool SimulatedPlayer::simulateStopSneaking() {
     setSneaking(false);
     return !isSneaking();
 }
 
 template <>
-class OwnerPtrT<struct EntityRefTraits>
-{
+class OwnerPtrT<struct EntityRefTraits> {
     char filler[24];
 
 public:
     MCAPI ~OwnerPtrT();
 
-    inline OwnerPtrT(OwnerPtrT&& right) noexcept
-    {
+    inline OwnerPtrT(OwnerPtrT&& right) noexcept {
         void (OwnerPtrT::*rv)(OwnerPtrT && right);
         *((void**)&rv) = dlsym("??0OwnerStorageEntity@@IEAA@$$QEAV0@@Z");
         (this->*rv)(std::move(right));
     }
-    inline OwnerPtrT& operator=(OwnerPtrT&& right) noexcept
-    {
+    inline OwnerPtrT& operator=(OwnerPtrT&& right) noexcept {
         void (OwnerPtrT::*rv)(OwnerPtrT && right);
         *((void**)&rv) = dlsym("??4OwnerStorageEntity@@IEAAAEAV0@$$QEAV0@@Z");
         (this->*rv)(std::move(right));
     }
 
-    inline SimulatedPlayer* tryGetSimulatedPlayer(bool b = false)
-    {
+    inline SimulatedPlayer* tryGetSimulatedPlayer(bool b = false) {
         auto& context = dAccess<StackResultStorageEntity, 0>(this).getStackRef();
         return SimulatedPlayer::tryGetFromEntity(context, b);
     }
 
-    inline bool hasValue() const
-    {
+    inline bool hasValue() const {
         if (!this)
             return false;
         return dAccess<bool, 16>(this);
@@ -72,15 +68,13 @@ class OwnerPtrT<struct EntityRefTraits>
     // inline bool isValid()
 };
 
-class SimulatedPlayer* SimulatedPlayer::create(std::string const& name, class BlockPos const& position, class AutomaticID<class Dimension, int> dimensionId)
-{
+class SimulatedPlayer* SimulatedPlayer::create(std::string const& name, class BlockPos const& position, class AutomaticID<class Dimension, int> dimensionId) {
     // auto handler = Global<Minecraft>->getServerNetworkHandler();
     // return create(name, position, dimensionId, Global<Minecraft>->getServerNetworkHandler());
     OwnerPtrT<EntityRefTraits> ownerPtr = Global<ServerNetworkHandler>->createSimulatedPlayer(name, dimensionId, "");
     auto player = ownerPtr.tryGetSimulatedPlayer();
 
-    if (player /* && player->isSimulatedPlayer() */)
-    {
+    if (player /* && player->isSimulatedPlayer() */) {
         player->postLoad(/* isNewPlayer */ true);
         Level& level = player->getLevel();
         level.addUser(std::move(ownerPtr));
@@ -96,13 +90,11 @@ class SimulatedPlayer* SimulatedPlayer::create(std::string const& name, class Bl
 }
 
 
-class SimulatedPlayer* SimulatedPlayer::create(std::string const& name, class AutomaticID<class Dimension, int> dimensionId)
-{
+class SimulatedPlayer* SimulatedPlayer::create(std::string const& name, class AutomaticID<class Dimension, int> dimensionId) {
     OwnerPtrT<EntityRefTraits> ownerPtr = Global<ServerNetworkHandler>->createSimulatedPlayer(name, dimensionId, "");
     auto player = ownerPtr.tryGetSimulatedPlayer();
 
-    if (player /* && player->isSimulatedPlayer() */)
-    {
+    if (player /* && player->isSimulatedPlayer() */) {
         player->postLoad(/* isNewPlayer */ true);
         Level& level = player->getLevel();
         level.addUser(std::move(ownerPtr));
diff --git a/LiteLoader/Kernel/Utils/CsLock.cpp b/LiteLoader/Kernel/Utils/CsLock.cpp
--- a/LiteLoader/Kernel/Utils/CsLock.cpp
+++ b/LiteLoader/Kernel/Utils/CsLock.cpp
@@ -12,8 +12,7 @@ CsLock::~CsLock() {
         DeleteCriticalSection(&cslock);
 }
 
-bool CsLock::tryLock()
-{
+bool CsLock::tryLock() {
     if (!inited) {
         inited = true;
         InitializeCriticalSection(&cslock);
diff --git a/LiteLoader/Kernel/Utils/DbgHelper.cpp b/LiteLoader/Kernel/Utils/DbgHelper.cpp
--- a/LiteLoader/Kernel/Utils/DbgHelper.cpp
+++ b/LiteLoader/Kernel/Utils/DbgHelper.cpp
@@ -19,22 +19,16 @@ extern Logger logger;
 std::set<std::wstring> loadedSymbolDir;
 bool symbolsLoaded = false;
 
-void FindSymbols(wstring& collection, const string& nowPath, bool recursion = false)
-{
+void FindSymbols(wstring& collection, const string& nowPath, bool recursion = false) {
     filesystem::directory_iterator list(nowPath);
-    for (auto& it : list)
-    {
-        if (it.is_directory() && recursion)
-        {
+    for (auto& it : list) {
+        if (it.is_directory() && recursion) {
             FindSymbols(collection, it.path().string(), recursion);
-        }
-        else if (it.path().extension() == ".pdb")
-        {
+        } else if (it.path().extension() == ".pdb") {
             filesystem::path dir = filesystem::canonical(it.path());
             wstring dirPath = dir.remove_filename().native();
 
-            if (loadedSymbolDir.find(dirPath) == loadedSymbolDir.end())
-            {
+            if (loadedSymbolDir.find(dirPath) == loadedSymbolDir.end()) {
                 collection = collection + L";" + dirPath.substr(0, dirPath.size() - 1);
                 loadedSymbolDir.insert(dirPath);
             }
@@ -42,8 +36,7 @@ void FindSymbols(wstring& collection, const string& nowPath, bool recursion = fa
     }
 }
 
-bool LoadSymbols()
-{
+bool LoadSymbols() {
     if (symbolsLoaded)
         return true;
 
@@ -52,8 +45,7 @@ bool LoadSymbols()
     FindSymbols(symbolPath, ".", false);
     FindSymbols(symbolPath, ".\\plugins", true);
 
-    if (!SymInitializeW(GetCurrentProcess(), symbolPath.c_str(), TRUE))
-    {
+    if (!SymInitializeW(GetCurrentProcess(), symbolPath.c_str(), TRUE)) {
         logger.warn("Fail to load Symbol Files! Error Code: {}", GetLastError());
         return false;
     }
@@ -62,8 +54,7 @@ bool LoadSymbols()
     return true;
 }
 
-bool CleanupSymbols()
-{
+bool CleanupSymbols() {
     symbolsLoaded = false;
     return SymCleanup(GetCurrentProcess());
 }
@@ -73,8 +64,7 @@ bool CleanupSymbols()
 
 std::map<DWORD, std::wstring> moduleMap;
 
-PSYMBOL_INFOW GetSymbolInfo(HANDLE hProcess, void* address)
-{
+PSYMBOL_INFOW GetSymbolInfo(HANDLE hProcess, void* address) {
     PSYMBOL_INFOW pSymbol = (SYMBOL_INFOW*)new char[sizeof(SYMBOL_INFOW) + MAX_SYM_NAME * sizeof(TCHAR)];
     pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
     pSymbol->MaxNameLen = MAX_SYM_NAME;
@@ -86,31 +76,26 @@ PSYMBOL_INFOW GetSymbolInfo(HANDLE hProcess, void* address)
         return NULL;
 }
 
-void CleanSymbolInfo(PSYMBOL_INFOW pSymbol)
-{
+void CleanSymbolInfo(PSYMBOL_INFOW pSymbol) {
     delete[]((char*)pSymbol);
 }
 
-BOOL CALLBACK EnumerateModuleCallBack(PCTSTR ModuleName, DWORD64 ModuleBase, ULONG ModuleSize, PVOID UserContext)
-{
+BOOL CALLBACK EnumerateModuleCallBack(PCTSTR ModuleName, DWORD64 ModuleBase, ULONG ModuleSize, PVOID UserContext) {
     std::map<DWORD, std::wstring>* pModuleMap = (std::map<DWORD, std::wstring>*)UserContext;
     LPCWSTR name = wcsrchr(ModuleName, TEXT('\\')) + 1;
     (*pModuleMap)[(DWORD)ModuleBase] = name;
     return TRUE;
 }
 
-bool CreateModuleMap(HANDLE hProcess)
-{
-    if (!EnumerateLoadedModulesW64(hProcess, EnumerateModuleCallBack, &moduleMap))
-    {
+bool CreateModuleMap(HANDLE hProcess) {
+    if (!EnumerateLoadedModulesW64(hProcess, EnumerateModuleCallBack, &moduleMap)) {
         logger.error("Fail to Enumerate loaded modules! Error Code: {}", GetLastError());
         return false;
     }
     return true;
 }
 
-wstring MapModuleFromAddr(HANDLE hProcess, void* address)
-{
+wstring MapModuleFromAddr(HANDLE hProcess, void* address) {
     return moduleMap[(DWORD)SymGetModuleBase64(hProcess, (DWORD64)address)];
 }
 
@@ -118,11 +103,9 @@ wstring MapModuleFromAddr(HANDLE hProcess, void* address)
 
 #define MACHINE_TYPE IMAGE_FILE_MACHINE_AMD64
 
-bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l)
-{
+bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l) {
     Logger& debugLogger = l ? *l : logger;
-    if (!LL::globalConfig.enableErrorStackTraceback)
-    {
+    if (!LL::globalConfig.enableErrorStackTraceback) {
         logger.error("* Stack traceback is disabled by config file.");
         return true;
     }
@@ -144,17 +127,14 @@ bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l)
         CONTEXT context{};
         if (e)
             pContext = e->ContextRecord;
-        else
-        {
+        else {
             HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, TRUE, threadId);
-            if (hThread == NULL)
-            {
+            if (hThread == NULL) {
                 logger.error("Fail to Open Thread! Error Code: {}", GetLastError());
                 return;
             }
             context.ContextFlags = CONTEXT_FULL;
-            if (!GetThreadContext(hThread, &context))
-            {
+            if (!GetThreadContext(hThread, &context)) {
                 logger.error("Fail to Get Context! Error Code: {}", GetLastError());
                 return;
             }
@@ -172,17 +152,14 @@ bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l)
         bool skipingPrintFunctionsStack = true;
 
         while (StackWalk64(MACHINE_TYPE, hProcess, hThread, &stackFrame, pContext,
-                           NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
-        {
+                           NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL)) {
             DWORD64 address = stackFrame.AddrPC.Offset;
 
             // Function
             PSYMBOL_INFOW info;
             auto moduleName = wstr2str(MapModuleFromAddr(hProcess, (void*)address).c_str());
-            if (info = GetSymbolInfo(hProcess, (void*)address))
-            {
-                if (skipingPrintFunctionsStack)
-                {
+            if (info = GetSymbolInfo(hProcess, (void*)address)) {
+                if (skipingPrintFunctionsStack) {
                     if (wcscmp(info->Name, L"PrintCurrentStackTraceback") == 0) // Skiping these print functions' stack
                         skipingPrintFunctionsStack = false;
                     continue;
@@ -199,8 +176,7 @@ bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l)
                 if (SymGetLineFromAddrW64(hProcess, address, &displacement, &line))
                     debugLogger.error("(in File {} : Line {})", wstr2str(line.FileName), line.LineNumber);
                 delete info;
-            }
-            else
+            } else
                 debugLogger.error("at ???????? (0x{:X})  [{}]", address, moduleName);
         }
         cout << endl;
@@ -216,15 +192,13 @@ bool PrintCurrentStackTraceback(PEXCEPTION_POINTERS e, Logger* l)
 
 /////////////////////////////////// Debug Helper ///////////////////////////////////
 
-HMODULE GetCallerModule(unsigned long FramesToSkip)
-{
+HMODULE GetCallerModule(unsigned long FramesToSkip) {
     static const int maxFrameCount = 1;
     void* frames[maxFrameCount];
     int frameCount = CaptureStackBackTrace(FramesToSkip + 2, maxFrameCount, frames, NULL);
 
     std::string name;
-    if (0 < frameCount)
-    {
+    if (0 < frameCount) {
         HMODULE hModule;
         GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
                           (LPCWSTR)frames[0], &hModule);
@@ -233,63 +207,66 @@ HMODULE GetCallerModule(unsigned long FramesToSkip)
     return HMODULE();
 }
 
-std::string GetCallerModuleFileName(unsigned long FramesToSkip)
-{
+std::string GetCallerModuleFileName(unsigned long FramesToSkip) {
     return GetModuleName(GetCallerModule(FramesToSkip));
 }
 
-bool GetFileVersion(const wchar_t* filePath, unsigned short* ver1, unsigned short* ver2, unsigned short* ver3, unsigned short* ver4, unsigned int* flag)
-{
+bool GetFileVersion(const wchar_t* filePath, unsigned short* ver1, unsigned short* ver2, unsigned short* ver3, unsigned short* ver4, unsigned int* flag) {
 
     DWORD dwHandle = 0;
     DWORD dwLen = GetFileVersionInfoSizeW(filePath, &dwHandle);
-    if (0 >= dwLen)
-    {
+    if (0 >= dwLen) {
         return false;
     }
     wchar_t* pBlock = new wchar_t[dwLen];
-    if (NULL == pBlock)
-    {
+    if (NULL == pBlock) {
         return false;
     }
-    if (!GetFileVersionInfoW(filePath, dwHandle, dwLen, pBlock))
-    {
+    if (!GetFileVersionInfoW(filePath, dwHandle, dwLen, pBlock)) {
         delete[] pBlock;
         return false;
     }
 
     VS_FIXEDFILEINFO* lpBuffer = nullptr;
     unsigned int uLen = 0;
-    if (!VerQueryValueW(pBlock, L"\\", (void**)&lpBuffer, &uLen))
-    {
+    if (!VerQueryValueW(pBlock, L"\\", (void**)&lpBuffer, &uLen)) {
         delete[] pBlock;
         return false;
     }
 
-    if (ver1) *ver1 = (lpBuffer->dwFileVersionMS >> 16) & 0x0000FFFF;
-    if (ver2) *ver2 = lpBuffer->dwFileVersionMS & 0x0000FFFF;
-    if (ver3) *ver3 = (lpBuffer->dwFileVersionLS >> 16) & 0x0000FFFF;
-    if (ver4) *ver4 = lpBuffer->dwFileVersionLS & 0x0000FFFF;
-    if (flag) *flag = lpBuffer->dwFileFlags;
+    if (ver1)
+        *ver1 = (lpBuffer->dwFileVersionMS >> 16) & 0x0000FFFF;
+    if (ver2)
+        *ver2 = lpBuffer->dwFileVersionMS & 0x0000FFFF;
+    if (ver3)
+        *ver3 = (lpBuffer->dwFileVersionLS >> 16) & 0x0000FFFF;
+    if (ver4)
+        *ver4 = lpBuffer->dwFileVersionLS & 0x0000FFFF;
+    if (flag)
+        *flag = lpBuffer->dwFileFlags;
 
     delete[] pBlock;
     return true;
 }
 
-inline std::string VersionToString(unsigned short major_ver, unsigned short minor_ver, unsigned short revision_ver, unsigned short build_ver, unsigned int flag = 0)
-{
+inline std::string VersionToString(unsigned short major_ver, unsigned short minor_ver, unsigned short revision_ver, unsigned short build_ver, unsigned int flag = 0) {
     std::string flagStr = "";
-    if (flag & VS_FF_DEBUG) flagStr += " DEBUG";
-    if (flag & VS_FF_PRERELEASE) flagStr += " PRERELEASE";
-    if (flag & VS_FF_PATCHED) flagStr += " PATCHED";
-    if (flag & VS_FF_PRIVATEBUILD) flagStr += " PRIVATEBUILD";
-    if (flag & VS_FF_INFOINFERRED) flagStr += " INFOINFERRED";
-    if (flag & VS_FF_SPECIALBUILD) flagStr += " SPECIALBUILD";
+    if (flag & VS_FF_DEBUG)
+        flagStr += " DEBUG";
+    if (flag & VS_FF_PRERELEASE)
+        flagStr += " PRERELEASE";
+    if (flag & VS_FF_PATCHED)
+        flagStr += " PATCHED";
+    if (flag & VS_FF_PRIVATEBUILD)
+        flagStr += " PRIVATEBUILD";
+    if (flag & VS_FF_INFOINFERRED)
+        flagStr += " INFOINFERRED";
+    if (flag & VS_FF_SPECIALBUILD)
+        flagStr += " SPECIALBUILD";
     return fmt::format("{}.{}.{}.{}{}", major_ver, minor_ver, revision_ver, build_ver, flagStr);
 }
 
-std::string GetFileVersionString(HMODULE hModule, bool includeFlag)
-{
+std::string GetFileVersionString(HMODULE hModule, bool includeFlag) {
     unsigned short major_ver, minor_ver, revision_ver, build_ver;
     unsigned int flag;
     wchar_t filePath[MAX_PATH] = {0};
@@ -300,13 +277,11 @@ std::string GetFileVersionString(HMODULE hModule, bool includeFlag)
     return "";
 }
 
-std::string GetFileVersionString(std::string const& filePath, bool includeFlag)
-{
+std::string GetFileVersionString(std::string const& filePath, bool includeFlag) {
     unsigned short major_ver, minor_ver, revision_ver, build_ver;
     unsigned int flag;
     std::wstring wFilePath = str2wstr(filePath);
-    if (GetFileVersion(wFilePath.c_str(), &major_ver, &minor_ver, &revision_ver, &build_ver, &flag))
-    {
+    if (GetFileVersion(wFilePath.c_str(), &major_ver, &minor_ver, &revision_ver, &build_ver, &flag)) {
         return VersionToString(major_ver, minor_ver, revision_ver, build_ver, includeFlag ? flag : 0);
     }
     return "";
diff --git a/LiteLoader/Kernel/Utils/FileHelper.cpp b/LiteLoader/Kernel/Utils/FileHelper.cpp
--- a/LiteLoader/Kernel/Utils/FileHelper.cpp
+++ b/LiteLoader/Kernel/Utils/FileHelper.cpp
@@ -25,8 +25,7 @@ FILE* GetFILEfromFstream(std::fstream& fs) {
     return hack(fs.rdbuf());
 }
 
-HANDLE GetHANDLEfromFstream(std::fstream& fs)
-{
+HANDLE GetHANDLEfromFstream(std::fstream& fs) {
     auto cfile = ::_fileno(GetFILEfromFstream(fs));
     return (HANDLE)::_get_osfhandle(cfile);
 }
@@ -65,23 +64,20 @@ bool WriteAllFile(const std::string& filePath, const std::string& content, bool
     return true;
 }
 
-vector<string> GetFileNameList(const std::string& dir)
-{
+vector<string> GetFileNameList(const std::string& dir) {
     std::filesystem::directory_entry d(dir);
     if (!d.is_directory())
         return {};
 
     vector<string> list;
     std::filesystem::directory_iterator deps(d);
-    for (auto& i : deps)
-    {
+    for (auto& i : deps) {
         list.push_back(UTF82String(i.path().filename().u8string()));
     }
     return list;
 }
 
-bool CreateDirs(const string path)
-{
+bool CreateDirs(const string path) {
     std::error_code ec;
     return std::filesystem::create_directories(std::filesystem::path(str2wstr(path)).remove_filename(), ec);
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/Utils/GlobalService.cpp b/LiteLoader/Kernel/Utils/GlobalService.cpp
--- a/LiteLoader/Kernel/Utils/GlobalService.cpp
+++ b/LiteLoader/Kernel/Utils/GlobalService.cpp
@@ -11,47 +11,43 @@
 #include <GlobalServiceAPI.h>
 
 // Minecraft
-TInstanceHook(void, "?initAsDedicatedServer@Minecraft@@QEAAXXZ", Minecraft)
-{
+TInstanceHook(void, "?initAsDedicatedServer@Minecraft@@QEAAXXZ", Minecraft) {
     Global<Minecraft> = this;
     original(this);
 }
 // ServerNetworkHandler
 TInstanceHook(void, "?allowIncomingConnections@ServerNetworkHandler@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z",
-              ServerNetworkHandler, std::string const& a1, bool a2)
-{
+              ServerNetworkHandler, std::string const& a1, bool a2) {
     static bool initd = false;
-    if (!initd)
-    {
+    if (!initd) {
         initd = true;
         Global<ServerNetworkHandler> = this;
     }
     original(this, a1, a2);
 }
-//TInstanceHook(ServerNetworkHandler*, "??0ServerNetworkHandler@@QEAA@AEAVGameCallbacks@@AEBV?$NonOwnerPointer@VILevel@@@Bedrock@@AEAVNetworkHandler@@AEAVPrivateKeyManager@@AEAVServerLocator@@AEAVPacketSender@@AEAVAllowList@@PEAVPermissionsFile@@AEBVUUID@mce@@H_NAEBV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HAEAVMinecraftCommands@@AEAVIMinecraftApp@@AEBV?$unordered_map@UPackIdVersion@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@UPackIdVersion@@@3@U?$equal_to@UPackIdVersion@@@3@V?$allocator@U?$pair@$$CBUPackIdVersion@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@@3@@std@@AEAVScheduler@@V?$NonOwnerPointer@VTextFilteringProcessor@@@3@@Z",
-//              ServerNetworkHandler, class GameCallbacks& a1, class Bedrock::NonOwnerPointer<class ILevel> const& a2, class NetworkHandler& a3, class PrivateKeyManager& a4, class ServerLocator& a5, class PacketSender& a6, class AllowList& a7, class PermissionsFile* a8, class mce::UUID const& a9, int a10, bool a11, std::vector<std::string> const& a12, std::string a13, int a14, class MinecraftCommands& a15, class IMinecraftApp& a16, class std::unordered_map<struct PackIdVersion, std::string> const& a17, class Scheduler& a18, class Bedrock::NonOwnerPointer<class TextFilteringProcessor> a19)
+// TInstanceHook(ServerNetworkHandler*, "??0ServerNetworkHandler@@QEAA@AEAVGameCallbacks@@AEBV?$NonOwnerPointer@VILevel@@@Bedrock@@AEAVNetworkHandler@@AEAVPrivateKeyManager@@AEAVServerLocator@@AEAVPacketSender@@AEAVAllowList@@PEAVPermissionsFile@@AEBVUUID@mce@@H_NAEBV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HAEAVMinecraftCommands@@AEAVIMinecraftApp@@AEBV?$unordered_map@UPackIdVersion@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@UPackIdVersion@@@3@U?$equal_to@UPackIdVersion@@@3@V?$allocator@U?$pair@$$CBUPackIdVersion@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@@3@@std@@AEAVScheduler@@V?$NonOwnerPointer@VTextFilteringProcessor@@@3@@Z",
+//               ServerNetworkHandler, class GameCallbacks& a1, class Bedrock::NonOwnerPointer<class ILevel> const& a2, class NetworkHandler& a3, class PrivateKeyManager& a4, class ServerLocator& a5, class PacketSender& a6, class AllowList& a7, class PermissionsFile* a8, class mce::UUID const& a9, int a10, bool a11, std::vector<std::string> const& a12, std::string a13, int a14, class MinecraftCommands& a15, class IMinecraftApp& a16, class std::unordered_map<struct PackIdVersion, std::string> const& a17, class Scheduler& a18, class Bedrock::NonOwnerPointer<class TextFilteringProcessor> a19)
 //{
-//    auto rtn = original(this, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
-//    Global<ServerNetworkHandler> = this;
-//    //Global<NetworkHandler> = &a3;
-//    Global<MinecraftCommands> = &a15;
-//    return rtn;
-//}
+//     auto rtn = original(this, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
+//     Global<ServerNetworkHandler> = this;
+//     //Global<NetworkHandler> = &a3;
+//     Global<MinecraftCommands> = &a15;
+//     return rtn;
+// }
 
 // MinecraftCommands
 TInstanceHook(void,
               "?initCoreEnums@MinecraftCommands@@QEAAXVItemRegistryRef@@AEBVIWorldRegistriesProvider@@AEBVActorFactory@"
               "@AEBVExperiments@@AEBVBaseGameVersion@@@Z",
-              MinecraftCommands, void* a2, __int64 a3, __int64 a4, void* a5,  void* a6) {
+              MinecraftCommands, void* a2, __int64 a3, __int64 a4, void* a5, void* a6) {
     original(this, a2, a3, a4, a5, a6);
     Global<MinecraftCommands> = this;
 }
 
 // LevelStorage & DBStorage
 TInstanceHook(DBStorage*, "??0DBStorage@@QEAA@UDBStorageConfig@@V?$not_null@V?$NonOwnerPointer@VLevelDbEnv@@@Bedrock@@@gsl@@@Z",
-              DBStorage, struct DBStorageConfig* config, void* a3)
-{
-    auto ret = original(this, config,a3);
+              DBStorage, struct DBStorageConfig* config, void* a3) {
+    auto ret = original(this, config, a3);
     Global<LevelStorage> = (LevelStorage*)this;
     Global<DBStorage> = this;
     return ret;
@@ -59,32 +55,28 @@ TInstanceHook(DBStorage*, "??0DBStorage@@QEAA@UDBStorageConfig@@V?$not_null@V?$N
 
 #if 0
 // ChunkSource
-THook(void*, "??0ChunkSource@@QEAA@V?$unique_ptr@VChunkSource@@U?$default_delete@VChunkSource@@@std@@@std@@@Z", ChunkSource* a1, void** a2) 
+THook(void*, "??0ChunkSource@@QEAA@V?$unique_ptr@VChunkSource@@U?$default_delete@VChunkSource@@@std@@@std@@@Z", ChunkSource* a1, void** a2)
 {
-	Global<ChunkSource> = a1);
-	return original(a1, a2);
+    Global<ChunkSource> = a1);
+    return original(a1, a2);
 }
 #endif
 
 // RakNetServerLocator
 // ?activate@RakNetServerLocator@@AEAAXXZ
-TInstanceHook(void*, "?_activate@RakNetServerLocator@@AEAAXXZ", RakNetServerLocator)
-{
+TInstanceHook(void*, "?_activate@RakNetServerLocator@@AEAAXXZ", RakNetServerLocator) {
     constexpr auto h = do_hash("?_activate@RakNetServerLocator@@AEAAXXZ");
     static bool set = false;
-    if (!set)
-    {
+    if (!set) {
         set = true;
         Global<RakNetServerLocator> = this;
     }
     return original(this);
 }
 // RakNet::RakPeer
-TInstanceHook(void*, "??0RakPeer@RakNet@@QEAA@XZ", RakNet::RakPeer)
-{
+TInstanceHook(void*, "??0RakPeer@RakNet@@QEAA@XZ", RakNet::RakPeer) {
     static bool set = false;
-    if (!set)
-    {
+    if (!set) {
         set = true;
         Global<RakNet::RakPeer> = this;
     }
@@ -93,15 +85,13 @@ TInstanceHook(void*, "??0RakPeer@RakNet@@QEAA@XZ", RakNet::RakPeer)
 // Scoreboard
 #include <MC/CommandSoftEnumRegistry.hpp>
 TInstanceHook(Scoreboard*, "??0ServerScoreboard@@QEAA@VCommandSoftEnumRegistry@@PEAVLevelStorage@@@Z",
-              Scoreboard, void** a2, class LevelStorage* a3)
-{
+              Scoreboard, void** a2, class LevelStorage* a3) {
     Scoreboard* sc = original(this, a2, a3);
     Global<Scoreboard> = sc;
     return sc;
 }
 // AllowListFile
-TInstanceHook(int, "?reload@AllowListFile@@QEAA?AW4FileReadResult@@XZ", AllowListFile)
-{
+TInstanceHook(int, "?reload@AllowListFile@@QEAA?AW4FileReadResult@@XZ", AllowListFile) {
     static bool set = false;
     if (!set) {
         Global<AllowListFile> = this;
diff --git a/LiteLoader/Kernel/Utils/NetworkHelper.cpp b/LiteLoader/Kernel/Utils/NetworkHelper.cpp
--- a/LiteLoader/Kernel/Utils/NetworkHelper.cpp
+++ b/LiteLoader/Kernel/Utils/NetworkHelper.cpp
@@ -8,7 +8,7 @@
 
 using namespace std;
 
-void SplitHttpUrl(const std::string &url, string &host, string &path) {
+void SplitHttpUrl(const std::string& url, string& host, string& path) {
     host = url;
 
     bool foundProtocol = host.find('/') != string::npos;
@@ -22,17 +22,15 @@ void SplitHttpUrl(const std::string &url, string &host, string &path) {
     }
 }
 
-bool HttpGet(const string& url, const function<void(int, string)>& callback, int timeout)
-{
+bool HttpGet(const string& url, const function<void(int, string)>& callback, int timeout) {
     return HttpGet(url, {}, callback, timeout);
 }
 
-bool HttpGet(const string& url, const httplib::Headers& headers, const function<void(int, string)>& callback, int timeout)
-{
+bool HttpGet(const string& url, const httplib::Headers& headers, const function<void(int, string)>& callback, int timeout) {
     string host, path;
     SplitHttpUrl(url, host, path);
 
-    auto *cli = new httplib::Client(host.c_str());
+    auto* cli = new httplib::Client(host.c_str());
     if (!cli->is_valid()) {
         delete cli;
         return false;
@@ -50,19 +48,15 @@ bool HttpGet(const string& url, const httplib::Headers& headers, const function<
                 callback(-1, "");
             else
                 callback(response->status, response->body);
-        }
-        catch (const seh_exception &e) {
+        } catch (const seh_exception& e) {
             logger.error("SEH Uncaught Exception Detected!\n{}", e.what());
             logger.error("In HttpGet callback");
             PrintCurrentStackTraceback();
-        }
-        catch (const std::exception& e)
-        {
+        } catch (const std::exception& e) {
             logger.error("Uncaught C++ Exception Detected!\n{}", TextEncoding::toUTF8(e.what()));
             logger.error("In HttpGet callback");
             PrintCurrentStackTraceback();
-        }
-        catch (...) {
+        } catch (...) {
             logger.error("HttpGet Callback Failed!");
             logger.error("Uncaught Exception Detected!");
             PrintCurrentStackTraceback();
@@ -73,50 +67,40 @@ bool HttpGet(const string& url, const httplib::Headers& headers, const function<
 }
 
 bool HttpPost(const string& url, const string& data, const string& type, const std::function<void(int, string)>& callback,
-              int timeout)
-{
+              int timeout) {
     return HttpPost(url, {}, data, type, callback);
 }
 
 bool HttpPost(const string& url, const httplib::Headers& headers, const string& data, const string& type, const std::function<void(int, string)>& callback,
-              int timeout)
-{
+              int timeout) {
     string host, path;
     SplitHttpUrl(url, host, path);
     auto* cli = new httplib::Client(host.c_str());
-    if (!cli->is_valid())
-    {
+    if (!cli->is_valid()) {
         delete cli;
         return false;
     }
     if (timeout > 0)
         cli->set_connection_timeout(timeout, 0);
-        
+
     std::thread([cli, headers, data, type, callback, path{std::move(path)}]() {
         _set_se_translator(seh_exception::TranslateSEHtoCE);
-        try
-        {
+        try {
             auto response = cli->Post(path.c_str(), headers, data, type.c_str());
             delete cli;
             if (!response)
                 callback(-1, "");
             else
                 callback(response->status, response->body);
-        }
-        catch (const seh_exception& e)
-        {
+        } catch (const seh_exception& e) {
             logger.error("SEH Uncaught Exception Detected!\n{}", e.what());
             logger.error("In HttpPost callback");
             PrintCurrentStackTraceback();
-        }
-        catch (const std::exception& e)
-        {
+        } catch (const std::exception& e) {
             logger.error("Uncaught C++ Exception Detected!\n{}", TextEncoding::toUTF8(e.what()));
             logger.error("In HttpGet callback");
             PrintCurrentStackTraceback();
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.error("HttpPost Callback Failed!");
             logger.error("Uncaught Exception Detected!");
             PrintCurrentStackTraceback();
@@ -125,7 +109,7 @@ bool HttpPost(const string& url, const httplib::Headers& headers, const string&
     return true;
 }
 
-bool HttpGetSync(const std::string &url, int *statusRtn, std::string *dataRtn, int timeout) {
+bool HttpGetSync(const std::string& url, int* statusRtn, std::string* dataRtn, int timeout) {
     string host, path;
     SplitHttpUrl(url, host, path);
 
diff --git a/LiteLoader/Kernel/Utils/SRWLock.cpp b/LiteLoader/Kernel/Utils/SRWLock.cpp
--- a/LiteLoader/Kernel/Utils/SRWLock.cpp
+++ b/LiteLoader/Kernel/Utils/SRWLock.cpp
@@ -1,61 +1,49 @@
 #include <Utils/SRWLock.h>
 
-SRWLock::SRWLock()
-{
-    if (!inited)
-    {
+SRWLock::SRWLock() {
+    if (!inited) {
         inited = true;
         InitializeSRWLock(&srwlock);
     }
     inited = true;
 }
 
-void SRWLock::lock()
-{
-    if (!inited)
-    {
+void SRWLock::lock() {
+    if (!inited) {
         inited = true;
         InitializeSRWLock(&srwlock);
     }
     AcquireSRWLockExclusive(&srwlock);
 }
 
-bool SRWLock::try_lock()
-{
-    if (!inited)
-    {
+bool SRWLock::try_lock() {
+    if (!inited) {
         inited = true;
         InitializeSRWLock(&srwlock);
     }
     return TryAcquireSRWLockExclusive(&srwlock);
 }
 
-void SRWLock::unlock()
-{
+void SRWLock::unlock() {
     ReleaseSRWLockExclusive(&srwlock);
 }
 
-void SRWLock::lock_shared()
-{
-    if (!inited)
-    {
+void SRWLock::lock_shared() {
+    if (!inited) {
         inited = true;
         InitializeSRWLock(&srwlock);
     }
     AcquireSRWLockShared(&srwlock);
 }
 
-bool SRWLock::try_lock_shared()
-{
-    if (!inited)
-    {
+bool SRWLock::try_lock_shared() {
+    if (!inited) {
         inited = true;
         InitializeSRWLock(&srwlock);
     }
     return TryAcquireSRWLockShared(&srwlock);
 }
 
-void SRWLock::unlock_shared()
-{
+void SRWLock::unlock_shared() {
     ReleaseSRWLockShared(&srwlock);
 }
diff --git a/LiteLoader/Kernel/Utils/ShellLinkFile.cpp b/LiteLoader/Kernel/Utils/ShellLinkFile.cpp
--- a/LiteLoader/Kernel/Utils/ShellLinkFile.cpp
+++ b/LiteLoader/Kernel/Utils/ShellLinkFile.cpp
@@ -2,361 +2,286 @@
 #include <Utils/ShellLinkFile.h>
 #include <Utils/StringHelper.h>
 
-void ShellLinkFile::_Init()
-{
+void ShellLinkFile::_Init() {
     auto res = ::CoInitialize(nullptr);
-    if (res != S_OK && res != S_FALSE)
-    {
+    if (res != S_OK && res != S_FALSE) {
         throw std::exception("ShellLinkFile::ShellLinkFile:: Error when initializing the COM library");
     }
 
     // Init IShellLink
     res = ::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*)&this->shellLink);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::ShellLinkFile:: Error when creating the IShellLink instance");
     }
 
     res = shellLink->QueryInterface(IID_IPersistFile, (void**)&this->presistFile);
 
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::ShellLinkFile:: Error when querying to get the interface");
     }
 }
 
-ShellLinkFile::ShellLinkFile(const std::string& path)
-{
+ShellLinkFile::ShellLinkFile(const std::string& path) {
     _Init();
-    if (!path.empty())
-    {
+    if (!path.empty()) {
         load(path);
         lnkPath = str2wstr(path);
     }
 }
-ShellLinkFile::ShellLinkFile(const std::wstring& path)
-{
+ShellLinkFile::ShellLinkFile(const std::wstring& path) {
     _Init();
-    if (!path.empty())
-    {
+    if (!path.empty()) {
         load(path);
         lnkPath = path;
     }
 }
 
-ShellLinkFile::~ShellLinkFile()
-{
+ShellLinkFile::~ShellLinkFile() {
     close();
 }
 
-ShellLinkFile& ShellLinkFile::load(const std::string& path)
-{
+ShellLinkFile& ShellLinkFile::load(const std::string& path) {
     return load(str2wstr(path));
 }
-ShellLinkFile& ShellLinkFile::load(const std::wstring& path)
-{
-    if (path.empty())
-    {
+ShellLinkFile& ShellLinkFile::load(const std::wstring& path) {
+    if (path.empty()) {
         throw std::exception("ShellLinkFile::load:: The path is empty");
     }
-    if (!presistFile)
-    {
+    if (!presistFile) {
         throw std::exception("ShellLinkFile::load: presistFile is null");
     }
     auto res = presistFile->Load(path.c_str(), 0);
     lnkPath = path;
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::load: Failed to load");
     }
     return *this;
 }
 
-ShellLinkFile& ShellLinkFile::save(const std::string& path)
-{
+ShellLinkFile& ShellLinkFile::save(const std::string& path) {
     return save(str2wstr(path));
 }
-ShellLinkFile& ShellLinkFile::save(const std::wstring& path)
-{
-    if (!presistFile)
-    {
+ShellLinkFile& ShellLinkFile::save(const std::wstring& path) {
+    if (!presistFile) {
         throw std::exception("ShellLinkFile::save: presistFile is null");
     }
     auto res = presistFile->Load((path.empty() ? lnkPath : path).c_str(), true);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::save: Failed to save");
     }
     return *this;
 }
 
-bool ShellLinkFile::resolve(HWND hwnd, DWORD flags)
-{
-    if (!shellLink)
-    {
+bool ShellLinkFile::resolve(HWND hwnd, DWORD flags) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::resolve: shellLink is null");
     }
     return shellLink->Resolve(hwnd, flags) == S_OK;
 }
 
-void ShellLinkFile::close()
-{
-    if (presistFile)
-    {
+void ShellLinkFile::close() {
+    if (presistFile) {
         presistFile->Release();
         presistFile = nullptr;
     }
-    if (shellLink)
-    {
+    if (shellLink) {
         shellLink->Release();
         shellLink = nullptr;
     }
     ::CoUninitialize();
 }
 
-std::string ShellLinkFile::getPath()
-{
+std::string ShellLinkFile::getPath() {
     return wstr2str(getPathW());
 }
-std::wstring ShellLinkFile::getPathW()
-{
-    if (!shellLink)
-    {
+std::wstring ShellLinkFile::getPathW() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getPathW: shellLink is null");
     }
-    wchar_t buf[8192] = { 0 };
+    wchar_t buf[8192] = {0};
     auto res = shellLink->GetPath(buf, 8192, nullptr, 0);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getPathW: Failed to get the path");
     }
     return std::wstring(buf);
 }
-ShellLinkFile& ShellLinkFile::setPath(const std::string& path)
-{
+ShellLinkFile& ShellLinkFile::setPath(const std::string& path) {
     return setPath(str2wstr(path));
 }
-ShellLinkFile& ShellLinkFile::setPath(const std::wstring& path)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setPath(const std::wstring& path) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setPath: shellLink is null");
     }
     auto res = shellLink->SetPath(path.c_str());
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setPath: Failed to set the path");
     }
     return *this;
 }
 
-std::string ShellLinkFile::getWorkingDirectory()
-{
+std::string ShellLinkFile::getWorkingDirectory() {
     return wstr2str(getWorkingDirectoryW());
 }
-std::wstring ShellLinkFile::getWorkingDirectoryW()
-{
-    if (!shellLink)
-    {
+std::wstring ShellLinkFile::getWorkingDirectoryW() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getWorkingDirectoryW: shellLink is null");
     }
-    wchar_t buf[8192] = { 0 };
+    wchar_t buf[8192] = {0};
     auto res = shellLink->GetWorkingDirectory(buf, 8192);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getWorkingDirectoryW: Failed to get the working directory");
     }
     return std::wstring(buf);
 }
-ShellLinkFile& ShellLinkFile::setWorkingDirectory(const std::string& path)
-{
+ShellLinkFile& ShellLinkFile::setWorkingDirectory(const std::string& path) {
     return setWorkingDirectory(str2wstr(path));
 }
-ShellLinkFile& ShellLinkFile::setWorkingDirectory(const std::wstring& path)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setWorkingDirectory(const std::wstring& path) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setWorkingDirectory: shellLink is null");
     }
     auto res = shellLink->SetWorkingDirectory(path.c_str());
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setWorkingDirectory: Failed to set the working directory");
     }
     return *this;
 }
 
-std::string ShellLinkFile::getDescription()
-{
+std::string ShellLinkFile::getDescription() {
     return wstr2str(getDescriptionW());
 }
-std::wstring ShellLinkFile::getDescriptionW()
-{
-    if (!shellLink)
-    {
+std::wstring ShellLinkFile::getDescriptionW() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getDescriptionW: shellLink is null");
     }
-    wchar_t buf[8192] = { 0 };
+    wchar_t buf[8192] = {0};
     auto res = shellLink->GetDescription(buf, 8192);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getDescriptionW: Failed to get the description");
     }
     return std::wstring(buf);
 }
-ShellLinkFile& ShellLinkFile::setDescription(const std::string& desc)
-{
+ShellLinkFile& ShellLinkFile::setDescription(const std::string& desc) {
     return setDescription(str2wstr(desc));
 }
-ShellLinkFile& ShellLinkFile::setDescription(const std::wstring& desc)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setDescription(const std::wstring& desc) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setDescription: shellLink is null");
     }
     auto res = shellLink->SetDescription(desc.c_str());
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setDescription: Failed to set the description");
     }
     return *this;
 }
 
-std::string ShellLinkFile::getArguments()
-{
+std::string ShellLinkFile::getArguments() {
     return wstr2str(getArgumentsW());
 }
-std::wstring ShellLinkFile::getArgumentsW()
-{
-    if (!shellLink)
-    {
+std::wstring ShellLinkFile::getArgumentsW() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getArgumentsW: shellLink is null");
     }
-    wchar_t buf[8192] = { 0 };
+    wchar_t buf[8192] = {0};
     auto res = shellLink->GetArguments(buf, 8192);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getArgumentsW: Failed to get the arguments");
     }
     return std::wstring(buf);
 }
-ShellLinkFile& ShellLinkFile::setArguments(const std::string& arguments)
-{
+ShellLinkFile& ShellLinkFile::setArguments(const std::string& arguments) {
     return setArguments(str2wstr(arguments));
 }
-ShellLinkFile& ShellLinkFile::setArguments(const std::wstring& arguments)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setArguments(const std::wstring& arguments) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setArguments: shellLink is null");
     }
     auto res = shellLink->SetArguments(arguments.c_str());
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setArguments: Failed to set the arguments");
     }
     return *this;
 }
 
-std::string ShellLinkFile::getIconLocation()
-{
+std::string ShellLinkFile::getIconLocation() {
     return wstr2str(getIconLocationW());
 }
-std::wstring ShellLinkFile::getIconLocationW()
-{
-    if (!shellLink)
-    {
+std::wstring ShellLinkFile::getIconLocationW() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getIconLocationW: shellLink is null");
     }
-    wchar_t buf[8192] = { 0 };
+    wchar_t buf[8192] = {0};
     auto res = shellLink->GetIconLocation(buf, 8192, 0);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getIconLocationW: Failed to get the icon location");
     }
     return std::wstring(buf);
 }
-ShellLinkFile& ShellLinkFile::setIconLocation(const std::string& iconLocation)
-{
+ShellLinkFile& ShellLinkFile::setIconLocation(const std::string& iconLocation) {
     return setIconLocation(str2wstr(iconLocation));
 }
-ShellLinkFile& ShellLinkFile::setIconLocation(const std::wstring& iconLocation)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setIconLocation(const std::wstring& iconLocation) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setIconLocation: shellLink is null");
     }
     auto res = shellLink->SetIconLocation(iconLocation.c_str(), 0);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setIconLocation: Failed to set the icon location");
     }
     return *this;
 }
 
-int ShellLinkFile::getShowCmd()
-{
-    if (!shellLink)
-    {
+int ShellLinkFile::getShowCmd() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getShowCmd: shellLink is null");
     }
     int showCmd = 0;
     auto res = shellLink->GetShowCmd(&showCmd);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getShowCmd: Failed to get the show command");
     }
     return showCmd;
 }
-ShellLinkFile& ShellLinkFile::setShowCmd(int showCmd)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setShowCmd(int showCmd) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setShowCmd: shellLink is null");
     }
     auto res = shellLink->SetShowCmd(showCmd);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setShowCmd: Failed to set the show command");
     }
     return *this;
 }
 
-ShellLinkFile::HotKey ShellLinkFile::getHotKey()
-{
-    if (!shellLink)
-    {
+ShellLinkFile::HotKey ShellLinkFile::getHotKey() {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::getHotKey: shellLink is null");
     }
     union {
         HotKey out;
         // The address of the keyboard shortcut. The virtual key code is in the low-order byte,
         //  and the modifier flags are in the high-order byte.
-        WORD   in;
+        WORD in;
     } hotKey;
     auto res = shellLink->GetHotkey(&hotKey.in);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::getHotKey: Failed to get the hot key");
     }
     return hotKey.out;
 }
-ShellLinkFile& ShellLinkFile::setHotKey(const HotKey& hotKey)
-{
-    if (!shellLink)
-    {
+ShellLinkFile& ShellLinkFile::setHotKey(const HotKey& hotKey) {
+    if (!shellLink) {
         throw std::exception("ShellLinkFile::setHotKey: shellLink is null");
     }
     union {
         HotKey in;
         // The address of the keyboard shortcut. The virtual key code is in the low-order byte,
         //  and the modifier flags are in the high-order byte.
-        WORD   out;
+        WORD out;
     } hotKey1;
     hotKey1.in = hotKey;
     auto res = shellLink->SetHotkey(hotKey1.out);
-    if (res != S_OK)
-    {
+    if (res != S_OK) {
         throw std::exception("ShellLinkFile::setHotKey: Failed to set the hot key");
     }
     return *this;
diff --git a/LiteLoader/Kernel/Utils/StringHelper.cpp b/LiteLoader/Kernel/Utils/StringHelper.cpp
--- a/LiteLoader/Kernel/Utils/StringHelper.cpp
+++ b/LiteLoader/Kernel/Utils/StringHelper.cpp
@@ -8,8 +8,7 @@ wstring str2wstr(const string& str) {
     return str2wstr(str, CP_UTF8);
 }
 
-std::wstring str2wstr(const std::string& str, UINT codePage)
-{
+std::wstring str2wstr(const std::string& str, UINT codePage) {
     auto len = MultiByteToWideChar(codePage, 0, str.c_str(), -1, nullptr, 0);
     auto* buffer = new wchar_t[len + 1];
     MultiByteToWideChar(codePage, 0, str.c_str(), -1, buffer, len + 1);
@@ -24,8 +23,7 @@ string wstr2str(const wstring& wstr) {
     return wstr2str(wstr, CP_UTF8);
 }
 
-std::string wstr2str(const std::wstring& wstr, UINT codePage)
-{
+std::string wstr2str(const std::wstring& wstr, UINT codePage) {
     auto len = WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
     char* buffer = new char[len + 1];
     WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, buffer, len + 1, nullptr, nullptr);
@@ -98,7 +96,6 @@ std::string FixCurlyBracket(std::string str) {
 }
 
 
-std::string UTF82String(std::u8string str)
-{
+std::string UTF82String(std::u8string str) {
     return reinterpret_cast<std::string&>(str);
 }
\ No newline at end of file
diff --git a/LiteLoader/Kernel/Utils/StringReader.cpp b/LiteLoader/Kernel/Utils/StringReader.cpp
--- a/LiteLoader/Kernel/Utils/StringReader.cpp
+++ b/LiteLoader/Kernel/Utils/StringReader.cpp
@@ -4,87 +4,72 @@
 //////////////////////////////// CONSTRUCTOR ////////////////////////////////
 
 StringReader::StringReader(const std::string& str)
-    : str(str)
-    , len(str.length())
-    , begin(str.begin())
-    , end(str.end())
-    , it(begin)
-{
+: str(str)
+, len(str.length())
+, begin(str.begin())
+, end(str.end())
+, it(begin) {
 }
 StringReader::StringReader(const char* cstr)
-    : str(cstr)
-    , len(str.length())
-    , begin(str.begin())
-    , end(str.end())
-    , it(begin)
-{
+: str(cstr)
+, len(str.length())
+, begin(str.begin())
+, end(str.end())
+, it(begin) {
 }
 StringReader::StringReader(const char* cstr, size_t len)
-    : str(cstr, len)
-    , len(len)
-    , begin(str.begin())
-    , end(str.end())
-    , it(begin)
-{
+: str(cstr, len)
+, len(len)
+, begin(str.begin())
+, end(str.end())
+, it(begin) {
 }
 
 //////////////////////////////// GET ////////////////////////////////
 
-bool StringReader::isEmpty() const
-{
+bool StringReader::isEmpty() const {
     return len == 0;
 }
 
-bool StringReader::isEnd() const
-{
+bool StringReader::isEnd() const {
     return it == end;
 }
 
-bool StringReader::isStart() const
-{
+bool StringReader::isStart() const {
     return it == begin;
 }
 
-bool StringReader::isValid() const
-{
+bool StringReader::isValid() const {
     return it != end;
 }
 
-size_t StringReader::getPos() const
-{
+size_t StringReader::getPos() const {
     return it - begin;
 }
 
-size_t StringReader::getLength() const
-{
+size_t StringReader::getLength() const {
     return len;
 }
 
-size_t StringReader::getRemaining() const
-{
+size_t StringReader::getRemaining() const {
     return end - it;
 }
 
 //////////////////////////////// READ ////////////////////////////////
 
-char StringReader::read()
-{
-    if (isEnd())
-    {
+char StringReader::read() {
+    if (isEnd()) {
         throw std::out_of_range("StringReader::read: The end of the string has been reached");
     }
     return *it++;
 }
 
-char StringReader::read(char& c)
-{
+char StringReader::read(char& c) {
     return c = read();
 }
 
-std::string StringReader::read(size_t len)
-{
-    if (len > getRemaining())
-    {
+std::string StringReader::read(size_t len) {
+    if (len > getRemaining()) {
         throw std::out_of_range("StringReader::read: The end of the string has been reached");
     }
     std::string result(it, it + len);
@@ -92,109 +77,87 @@ std::string StringReader::read(size_t len)
     return result;
 }
 
-std::string StringReader::readUntil(char c)
-{
+std::string StringReader::readUntil(char c) {
     std::string result;
-    while (!isEnd() && peek() != c)
-    {
+    while (!isEnd() && peek() != c) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readUntil(const std::string& chars)
-{
+std::string StringReader::readUntil(const std::string& chars) {
     std::string result;
-    while (!isEnd() && chars.find(peek()) == std::string::npos)
-    {
+    while (!isEnd() && chars.find(peek()) == std::string::npos) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readUntilNot(char c)
-{
+std::string StringReader::readUntilNot(char c) {
     std::string result;
-    while (!isEnd() && peek() != c)
-    {
+    while (!isEnd() && peek() != c) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readUntilNot(const std::string& chars)
-{
+std::string StringReader::readUntilNot(const std::string& chars) {
     std::string result;
-    while (!isEnd() && chars.find(peek()) != std::string::npos)
-    {
+    while (!isEnd() && chars.find(peek()) != std::string::npos) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readLine()
-{
+std::string StringReader::readLine() {
     return readUntil('\n');
 }
 
-std::string StringReader::readLetters(const std::string& chars)
-{
+std::string StringReader::readLetters(const std::string& chars) {
     std::string result;
-    while (!isEnd() && (isalpha(peek()) || chars.find(peek()) != std::string::npos))
-    {
+    while (!isEnd() && (isalpha(peek()) || chars.find(peek()) != std::string::npos)) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readLower(const std::string& chars)
-{
+std::string StringReader::readLower(const std::string& chars) {
     std::string result;
-    while (!isEnd() && (islower(peek()) || chars.find(peek()) != std::string::npos))
-    {
+    while (!isEnd() && (islower(peek()) || chars.find(peek()) != std::string::npos)) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readUpper(const std::string& chars)
-{
+std::string StringReader::readUpper(const std::string& chars) {
     std::string result;
-    while (!isEnd() && (isupper(peek()) || chars.find(peek()) != std::string::npos))
-    {
+    while (!isEnd() && (isupper(peek()) || chars.find(peek()) != std::string::npos)) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readDigits(const std::string& chars)
-{
+std::string StringReader::readDigits(const std::string& chars) {
     std::string result;
-    while (!isEnd() && (isdigit(peek()) || chars.find(peek()) != std::string::npos))
-    {
+    while (!isEnd() && (isdigit(peek()) || chars.find(peek()) != std::string::npos)) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readLettersAndDigits(const std::string& chars)
-{
+std::string StringReader::readLettersAndDigits(const std::string& chars) {
     std::string result;
-    while (!isEnd() && (isalnum(peek()) || chars.find(peek()) != std::string::npos))
-    {
+    while (!isEnd() && (isalnum(peek()) || chars.find(peek()) != std::string::npos)) {
         result += read();
     }
     return result;
 }
 
-std::string StringReader::readVariableName()
-{
+std::string StringReader::readVariableName() {
     std::string result;
     bool first = true;
-    while (!isEnd() && (isalnum(peek()) || peek() == '_'))
-    {
-        if (first && isdigit(peek()))
-        {
+    while (!isEnd() && (isalnum(peek()) || peek() == '_')) {
+        if (first && isdigit(peek())) {
             return result;
         }
         result += read();
@@ -202,11 +165,9 @@ std::string StringReader::readVariableName()
     return result;
 }
 
-std::string StringReader::readToEnd()
-{
+std::string StringReader::readToEnd() {
     std::string result;
-    while (isValid())
-    {
+    while (isValid()) {
         result += read();
     }
     return result;
@@ -214,37 +175,29 @@ std::string StringReader::readToEnd()
 
 //////////////////////////////// PEEK ////////////////////////////////
 
-char StringReader::peek()
-{
-    if (isEnd())
-    {
+char StringReader::peek() {
+    if (isEnd()) {
         throw std::out_of_range("StringReader::peek: The end of the string has been reached");
     }
     return *it;
 }
 
-char StringReader::peek(char& c)
-{
+char StringReader::peek(char& c) {
     return c = peek();
 }
 
-char StringReader::peek(size_t offset)
-{
-    if (isEnd())
-    {
+char StringReader::peek(size_t offset) {
+    if (isEnd()) {
         throw std::out_of_range("StringReader::peek: The end of the string has been reached");
     }
-    if (offset >= getRemaining())
-    {
+    if (offset >= getRemaining()) {
         throw std::out_of_range("StringReader::peek: The offset is greater than the remaining length");
     }
     return *(it + offset);
 }
 
-std::string StringReader::peek(size_t offset, size_t len)
-{
-    if (offset >= getRemaining())
-    {
+std::string StringReader::peek(size_t offset, size_t len) {
+    if (offset >= getRemaining()) {
         throw std::out_of_range("StringReader::peek: The offset is greater than the remaining length");
     }
     return std::string(it + offset, it + offset + len);
@@ -252,106 +205,81 @@ std::string StringReader::peek(size_t offset, size_t len)
 
 //////////////////////////////// SKIP ////////////////////////////////
 
-void StringReader::skip()
-{
-    if (isEnd())
-    {
+void StringReader::skip() {
+    if (isEnd()) {
         throw std::out_of_range("StringReader::skip: The end of the string has been reached");
     }
     ++it;
 }
 
-void StringReader::skip(size_t len)
-{
-    if (isEnd())
-    {
+void StringReader::skip(size_t len) {
+    if (isEnd()) {
         throw std::out_of_range("StringReader::skip: The end of the string has been reached");
     }
-    if (len > getRemaining())
-    {
+    if (len > getRemaining()) {
         throw std::out_of_range("StringReader::skip: The length is greater than the remaining length");
     }
     it += len;
 }
 
-void StringReader::skipUntil(char c)
-{
-    while (isValid() && peek() != c)
-    {
+void StringReader::skipUntil(char c) {
+    while (isValid() && peek() != c) {
         skip();
     }
 }
 
-void StringReader::skipUntil(const std::string& chars)
-{
-    while (isValid() && chars.find(peek()) == std::string::npos)
-    {
+void StringReader::skipUntil(const std::string& chars) {
+    while (isValid() && chars.find(peek()) == std::string::npos) {
         skip();
     }
 }
 
-void StringReader::skipUntilNot(char c)
-{
-    while (isValid() && peek() == c)
-    {
+void StringReader::skipUntilNot(char c) {
+    while (isValid() && peek() == c) {
         skip();
     }
 }
 
-void StringReader::skipUntilNot(const std::string& chars)
-{
-    while (isValid() && chars.find(peek()) != std::string::npos)
-    {
+void StringReader::skipUntilNot(const std::string& chars) {
+    while (isValid() && chars.find(peek()) != std::string::npos) {
         skip();
     }
 }
 
-void StringReader::skipLetters(const std::string& chars)
-{
-    while (isValid() && (isalpha(peek()) || chars.find(peek()) != std::string::npos))
-    {
+void StringReader::skipLetters(const std::string& chars) {
+    while (isValid() && (isalpha(peek()) || chars.find(peek()) != std::string::npos)) {
         skip();
     }
 }
 
-void StringReader::skipLower(const std::string& chars)
-{
-    while (isValid() && (islower(peek()) || chars.find(peek()) != std::string::npos))
-    {
+void StringReader::skipLower(const std::string& chars) {
+    while (isValid() && (islower(peek()) || chars.find(peek()) != std::string::npos)) {
         skip();
     }
 }
 
-void StringReader::skipUpper(const std::string& chars)
-{
-    while (isValid() && (isupper(peek()) || chars.find(peek()) != std::string::npos))
-    {
+void StringReader::skipUpper(const std::string& chars) {
+    while (isValid() && (isupper(peek()) || chars.find(peek()) != std::string::npos)) {
         skip();
     }
 }
 
-void StringReader::skipDigits(const std::string& chars)
-{
-    while (isValid() && (isdigit(peek()) || chars.find(peek()) != std::string::npos))
-    {
+void StringReader::skipDigits(const std::string& chars) {
+    while (isValid() && (isdigit(peek()) || chars.find(peek()) != std::string::npos)) {
         skip();
     }
 }
 
-void StringReader::skipLettersAndDigits(const std::string& chars)
-{
-    while (isValid() && (isalnum(peek()) || chars.find(peek()) != std::string::npos))
-    {
+void StringReader::skipLettersAndDigits(const std::string& chars) {
+    while (isValid() && (isalnum(peek()) || chars.find(peek()) != std::string::npos)) {
         skip();
     }
 }
 
-void StringReader::skipWhitespace()
-{
+void StringReader::skipWhitespace() {
     skipUntilNot(" \t\r\n");
 }
 
-void StringReader::skipLine()
-{
+void StringReader::skipLine() {
     skipUntil('\n');
 }
diff --git a/LiteLoader/Kernel/Utils/WinHelper.cpp b/LiteLoader/Kernel/Utils/WinHelper.cpp
--- a/LiteLoader/Kernel/Utils/WinHelper.cpp
+++ b/LiteLoader/Kernel/Utils/WinHelper.cpp
@@ -9,8 +9,7 @@
 
 using namespace std;
 
-string GetLastErrorMessage(DWORD error_message_id)
-{
+string GetLastErrorMessage(DWORD error_message_id) {
     if (error_message_id == 0)
         return "";
 
@@ -29,16 +28,16 @@ string GetLastErrorMessage() {
 
     LPWSTR message_buffer = nullptr;
     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
-                  nullptr, error_message_id, MAKELANGID(0x09, SUBLANG_DEFAULT), (LPWSTR) &message_buffer, 0, nullptr);
+                  nullptr, error_message_id, MAKELANGID(0x09, SUBLANG_DEFAULT), (LPWSTR)&message_buffer, 0, nullptr);
     string res = wstr2str(wstring(message_buffer));
     LocalFree(message_buffer);
     return res;
 }
 
 // Tool
-wchar_t *str2cwstr(const string &str) {
+wchar_t* str2cwstr(const string& str) {
     auto len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0);
-    auto *buffer = new wchar_t[len + 1];
+    auto* buffer = new wchar_t[len + 1];
     MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, buffer, len + 1);
     buffer[len] = L'\0';
     return buffer;
@@ -46,7 +45,7 @@ wchar_t *str2cwstr(const string &str) {
 
 #define READ_BUFFER_SIZE 4096
 
-bool NewProcess(const std::string &process, std::function<void(int, std::string)> callback, int timeLimit) {
+bool NewProcess(const std::string& process, std::function<void(int, std::string)> callback, int timeLimit) {
     SECURITY_ATTRIBUTES sa;
     HANDLE hRead, hWrite;
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
@@ -72,7 +71,7 @@ bool NewProcess(const std::string &process, std::function<void(int, std::string)
     CloseHandle(pi.hThread);
 
     std::thread([hRead{hRead}, hProcess{pi.hProcess},
-                        callback{std::move(callback)}, timeLimit{timeLimit}, wCmd{wCmd}]() {
+                 callback{std::move(callback)}, timeLimit{timeLimit}, wCmd{wCmd}]() {
         _set_se_translator(seh_exception::TranslateSEHtoCE);
         if (timeLimit == -1)
             WaitForSingleObject(hProcess, INFINITE);
@@ -96,15 +95,13 @@ bool NewProcess(const std::string &process, std::function<void(int, std::string)
         CloseHandle(hProcess);
 
         try {
-            if(callback)
-                callback((int) exitCode, strOutput);
-        }
-        catch (const seh_exception &e) {
+            if (callback)
+                callback((int)exitCode, strOutput);
+        } catch (const seh_exception& e) {
             logger.error("SEH Uncaught Exception Detected!\n{}", TextEncoding::toUTF8(e.what()));
             logger.error("In NewProcess callback");
             PrintCurrentStackTraceback();
-        }
-        catch (...) {
+        } catch (...) {
             logger.error("NewProcess Callback Failed!");
             logger.error("Uncaught Exception Detected!");
             PrintCurrentStackTraceback();
@@ -114,8 +111,7 @@ bool NewProcess(const std::string &process, std::function<void(int, std::string)
     return true;
 }
 
-std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit, bool noReadOutput)
-{
+std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit, bool noReadOutput) {
     SECURITY_ATTRIBUTES sa;
     HANDLE hRead, hWrite;
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
@@ -123,8 +119,8 @@ std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit,
     sa.bInheritHandle = TRUE;
 
     if (!CreatePipe(&hRead, &hWrite, &sa, 0))
-        return { -1,"" };
-    STARTUPINFOW si = { 0 };
+        return {-1, ""};
+    STARTUPINFOW si = {0};
     PROCESS_INFORMATION pi;
 
     si.cb = sizeof(STARTUPINFO);
@@ -135,7 +131,7 @@ std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit,
     auto wCmd = str2cwstr(process);
     if (!CreateProcessW(nullptr, wCmd, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &pi)) {
         delete[] wCmd;
-        return { -1,"" };
+        return {-1, ""};
     }
     CloseHandle(hWrite);
     CloseHandle(pi.hThread);
@@ -152,8 +148,7 @@ std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit,
 
     delete[] wCmd;
     GetExitCodeProcess(pi.hProcess, &exitCode);
-    if (!noReadOutput)
-    {
+    if (!noReadOutput) {
         while (true) {
             ZeroMemory(buffer, READ_BUFFER_SIZE);
             if (!ReadFile(hRead, buffer, READ_BUFFER_SIZE, &bytesRead, nullptr))
@@ -163,24 +158,31 @@ std::pair<int, string> NewProcessSync(const std::string& process, int timeLimit,
     }
     CloseHandle(hRead);
     CloseHandle(pi.hProcess);
-    return { exitCode, strOutput };
+    return {exitCode, strOutput};
 }
 
 string GetModulePath(HMODULE handle) {
-    wchar_t buf[MAX_PATH] = { 0 };
+    wchar_t buf[MAX_PATH] = {0};
     GetModuleFileNameEx(GetCurrentProcess(), handle, buf, MAX_PATH);
     return wstr2str(std::wstring(buf));
 }
 
-string GetModuleName(HMODULE handle)
-{
-    wchar_t buf[MAX_PATH] = { 0 };
+string GetModuleName(HMODULE handle) {
+    wchar_t buf[MAX_PATH] = {0};
     GetModuleFileNameEx(GetCurrentProcess(), handle, buf, MAX_PATH);
     return UTF82String(std::filesystem::path(buf).filename().u8string());
 }
 
-inline bool isWine()
-{
+std::string GetSystemLocaleName() {
+    wchar_t buf[256] = {0};
+    auto lcid = GetSystemDefaultLCID();
+    GetSystemDefaultLocaleName(buf, lcid);
+    auto str = wstr2str(buf);
+    std::replace(str.begin(), str.end(), '-', '_');
+    return str;
+}
+
+inline bool isWine() {
     HMODULE ntdll = GetModuleHandle(L"ntdll.dll");
     auto pwine_get_version = GetProcAddress(ntdll, "wine_get_version");
     if (pwine_get_version)
@@ -189,8 +191,7 @@ inline bool isWine()
         return false;
 }
 
-bool IsWineEnvironment()
-{
+bool IsWineEnvironment() {
     static bool result = isWine();
     return result;
 }
diff --git a/LiteLoader/LiteLoader.vcxproj b/LiteLoader/LiteLoader.vcxproj
--- a/LiteLoader/LiteLoader.vcxproj
+++ b/LiteLoader/LiteLoader.vcxproj
@@ -58,9 +58,10 @@
       <WarningLevel>Level3</WarningLevel>
       <ExternalWarningLevel>Level1</ExternalWarningLevel>
       <DisableAnalyzeExternal>true</DisableAnalyzeExternal>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>DebugFull</GenerateDebugInformation>
@@ -114,6 +115,7 @@ LibraryBuilder.exe
       <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)I18nAPI_LL.obj</ObjectFileName>
     </ClCompile>
     <ClCompile Include="Kernel\MC\BiomeAPI.cpp" />
+    <ClCompile Include="Kernel\MC\MolangAPI.cpp" />
     <ClCompile Include="Kernel\NBT\PrettySnbtFormatAPI.cpp" />
     <ClCompile Include="Kernel\Compatibility.cpp" />
     <ClCompile Include="Kernel\MC\ColorFormatAPI.cpp" />
@@ -134,7 +136,6 @@ LibraryBuilder.exe
     <ClCompile Include="Main\CrashLogger.cpp" />
     <ClCompile Include="Main\dllmain.cpp" />
     <ClCompile Include="Main\BuiltinBugFix.cpp" />
-    <ClCompile Include="MolangAPI.cpp" />
     <ClInclude Include="Header\AllowListAPI.h" />
     <ClInclude Include="Header\DB\Any.h" />
     <ClInclude Include="Header\DB\ConnParams.h" />
diff --git a/LiteLoader/LiteLoader.vcxproj.filters b/LiteLoader/LiteLoader.vcxproj.filters
--- a/LiteLoader/LiteLoader.vcxproj.filters
+++ b/LiteLoader/LiteLoader.vcxproj.filters
@@ -381,7 +381,7 @@
     <ClCompile Include="Kernel\MC\BiomeAPI.cpp">
       <Filter>Kernel</Filter>
     </ClCompile>
-    <ClCompile Include="MolangAPI.cpp">
+    <ClCompile Include="Kernel\MC\MolangAPI.cpp">
       <Filter>Kernel\MC</Filter>
     </ClCompile>
   </ItemGroup>
diff --git a/LiteLoader/Main/AddonsHelper.cpp b/LiteLoader/Main/AddonsHelper.cpp
--- a/LiteLoader/Main/AddonsHelper.cpp
+++ b/LiteLoader/Main/AddonsHelper.cpp
@@ -29,45 +29,38 @@ std::vector<Addon> addons;
 
 bool AutoInstallAddons(string path);
 
-//Helper
-std::string GetAddonJsonFile(Addon::Type type)
-{
+// Helper
+std::string GetAddonJsonFile(Addon::Type type) {
     string addonListFile = Level::getCurrentLevelPath();
-    switch (type)
-    {
-    case Addon::Type::BehaviorPack:
-        return addonListFile + "/world_behavior_packs.json";
-        break;
-    case Addon::Type::ResourcePack:
-        return addonListFile + "/world_resource_packs.json";
-        break;
-    default:
-        break;
+    switch (type) {
+        case Addon::Type::BehaviorPack:
+            return addonListFile + "/world_behavior_packs.json";
+            break;
+        case Addon::Type::ResourcePack:
+            return addonListFile + "/world_resource_packs.json";
+            break;
+        default:
+            break;
     }
     return "";
 }
 
-inline bool isManifestFile(std::string const& filename)
-{
-    return filename == "manifest.json"|| filename == "pack_manifest.json";
+inline bool isManifestFile(std::string const& filename) {
+    return filename == "manifest.json" || filename == "pack_manifest.json";
 }
 
 #include <MC/JsonHelpers.hpp>
-inline std::string FixMojangJson(std::string const& content)
-{
+inline std::string FixMojangJson(std::string const& content) {
     Json::Value value;
     JsonHelpers::parseJson(content, value);
     return JsonHelpers::serialize(value);
 }
 
-std::optional<Addon> parseAddonFromPath(std::filesystem::path addonPath)
-{
-    try
-    {
+std::optional<Addon> parseAddonFromPath(std::filesystem::path addonPath) {
+    try {
         auto manifestPath = addonPath;
         manifestPath.append("manifest.json");
-        if (!filesystem::exists(manifestPath))
-        {
+        if (!filesystem::exists(manifestPath)) {
             manifestPath = addonPath;
             manifestPath.append("pack_manifest.json");
         }
@@ -75,7 +68,7 @@ std::optional<Addon> parseAddonFromPath(std::filesystem::path addonPath)
         if (!manifestFile || manifestFile->empty())
             throw std::exception("manifest.json not found!");
         std::string content = FixMojangJson(*manifestFile);
-        
+
         auto manifest = nlohmann::json::parse(content, nullptr, true, true);
         auto header = manifest["header"];
         auto uuid = header["uuid"];
@@ -97,52 +90,40 @@ std::optional<Addon> parseAddonFromPath(std::filesystem::path addonPath)
             throw std::exception("Unknown type of addon pack!");
 
         return addon;
-    }
-    catch (const seh_exception& e)
-    {
+    } catch (const seh_exception& e) {
         addonLogger.error("Uncaught SEH Exception Detected!");
         addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string()));
         addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what()));
-    }
-    catch (const std::exception& e)
-    {
+    } catch (const std::exception& e) {
         addonLogger.error("Uncaught C++ Exception Detected!");
         addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string()));
         addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what()));
-    }
-    catch (...)
-    {
+    } catch (...) {
         addonLogger.error("Uncaught Exception Detected!");
         addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string()));
     }
     return std::nullopt;
 }
 
-bool RemoveAddonFromList(Addon& addon)
-{
+bool RemoveAddonFromList(Addon& addon) {
     auto jsonFile = GetAddonJsonFile(addon.type);
-    if (!filesystem::exists(str2wstr(jsonFile)))
-    {
+    if (!filesystem::exists(str2wstr(jsonFile))) {
         addonLogger.error("Addon config not found!");
         return false;
     }
 
     auto addonJsonContent = ReadAllFile(jsonFile);
-    if (!addonJsonContent || addonJsonContent->empty())
-    {
+    if (!addonJsonContent || addonJsonContent->empty()) {
         addonLogger.error("Addon config not found!");
         return false;
     }
     auto addonJson = fifo_json::parse(*addonJsonContent, nullptr, true, true);
     int id = 0;
-    for (auto item : addonJson)
-    {
-        if (item["pack_id"] == addon.uuid)
-        {
+    for (auto item : addonJson) {
+        if (item["pack_id"] == addon.uuid) {
             addonJson.erase(id);
             bool res = WriteAllFile(jsonFile, addonJson.dump(4));
-            if (!res)
-            {
+            if (!res) {
                 addonLogger.error("Fail to remove addon <{}> from config file!", addon.getPrintName());
                 return false;
             }
@@ -155,40 +136,33 @@ bool RemoveAddonFromList(Addon& addon)
     return false;
 }
 
-bool AddAddonToList(Addon& addon)
-{
+bool AddAddonToList(Addon& addon) {
     string addonListFile = GetAddonJsonFile(addon.type);
-    if (!filesystem::exists(str2wstr(addonListFile)))
-    {
+    if (!filesystem::exists(str2wstr(addonListFile))) {
         ofstream fout(addonListFile);
         fout << "[]" << flush;
     }
 
-    try
-    {
+    try {
 
         bool exists = false;
         auto addonList = nlohmann::json::parse(*ReadAllFile(addonListFile), nullptr, false, true);
         // Auto fix Addon List File
-        if (!addonList.is_array())
-        {
+        if (!addonList.is_array()) {
             auto backupPath = UTF82String(filesystem::path(str2wstr(addonListFile)).stem().u8string()) + "_error.json";
             addonLogger.error("Invalid Addon List File {}, backup to {} and reset to default", addonListFile, backupPath);
             std::error_code ec;
             std::filesystem::rename(str2wstr(addonListFile), filesystem::path(addonListFile).remove_filename().append(str2wstr(backupPath)), ec);
             addonList = "[]"_json;
         }
-        for (auto& addonData : addonList)
-        {
-            if (addonData["pack_id"] == addon.uuid)
-            {
+        for (auto& addonData : addonList) {
+            if (addonData["pack_id"] == addon.uuid) {
                 addonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision};
                 exists = true;
                 break;
             }
         }
-        if (!exists)
-        {
+        if (!exists) {
             auto newAddonData = nlohmann::json::object();
             newAddonData["pack_id"] = addon.uuid;
             newAddonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision};
@@ -199,17 +173,14 @@ bool AddAddonToList(Addon& addon)
             throw std::exception("Fail to write data back to addon list file!");
         addonLogger.info("Success to add addon <{}> to config file.", addon.getPrintName());
         return true;
-    }
-    catch (const std::exception& e)
-    {
+    } catch (const std::exception& e) {
         addonLogger.error("Fail to insert the addon {} into {}!", addon.getPrintName(), addonListFile);
         addonLogger.error("Error: {}", TextEncoding::toUTF8(e.what()));
         addonLogger.error("* Install progress aborted!");
         return false;
     }
 }
-bool InstallAddonToLevel(std::string addonDir, std::string addonName)
-{
+bool InstallAddonToLevel(std::string addonDir, std::string addonName) {
     auto addon = parseAddonFromPath(str2wstr(addonDir));
     if (!addon.has_value())
         return false;
@@ -225,15 +196,11 @@ bool InstallAddonToLevel(std::string addonDir, std::string addonName)
     string toPath = levelPath + subPath + "/" + addonName;
 
     // Avoid duplicate names or update addon if same uuid
-    while (filesystem::exists(str2wstr(toPath)))
-    {
+    while (filesystem::exists(str2wstr(toPath))) {
         auto tmp = parseAddonFromPath(str2wstr(toPath));
-        if (tmp.has_value() && tmp->uuid != addon->uuid)
-        {
+        if (tmp.has_value() && tmp->uuid != addon->uuid) {
             toPath += "_";
-        }
-        else
-        {
+        } else {
             std::error_code ec;
             filesystem::remove_all(str2wstr(toPath), ec);
             break;
@@ -247,52 +214,44 @@ bool InstallAddonToLevel(std::string addonDir, std::string addonName)
     return AddAddonToList(*addon);
 }
 
-void FindManifest(vector<string> &result, const string& path)
-{
+void FindManifest(vector<string>& result, const string& path) {
     filesystem::directory_iterator ent(str2wstr(path));
 
     bool foundManifest = false;
-    for (auto& file : ent)
-    {
+    for (auto& file : ent) {
         auto path = file.path();
-        if (isManifestFile(UTF82String(path.filename().u8string())))
-        {
+        if (isManifestFile(UTF82String(path.filename().u8string()))) {
             result.push_back(UTF82String(filesystem::canonical(path).parent_path().u8string()));
             foundManifest = true;
             break;
         }
     }
-    if (!foundManifest)
-    {
-        //No manifest file
+    if (!foundManifest) {
+        // No manifest file
         if (!AutoInstallAddons(path)) {
             filesystem::directory_iterator ent2(str2wstr(path));
             for (auto& file : ent2)
-                if (file.is_directory()) FindManifest(result, UTF82String(file.path().u8string()));
+                if (file.is_directory())
+                    FindManifest(result, UTF82String(file.path().u8string()));
         }
     }
     return;
 }
 
-std::string Addon::getPrintName() const
-{
+std::string Addon::getPrintName() const {
     if (LL::globalConfig.colorLog)
         return ColorFormat::convertToColsole(std::string(name));
     else
         return ColorFormat::removeColorCode(std::string(name));
 }
 
-bool AddonsManager::install(std::string packPath)
-{
-    try
-    {
-        if (!filesystem::exists(str2wstr(packPath)))
-        {
+bool AddonsManager::install(std::string packPath) {
+    try {
+        if (!filesystem::exists(str2wstr(packPath))) {
             addonLogger.error("Addon file \"{}\" not found!", packPath);
             return false;
         }
-        if (VALID_ADDON_FILE_EXTENSION.find(UTF82String(filesystem::path(str2wstr(packPath)).extension().u8string())) == VALID_ADDON_FILE_EXTENSION.end())
-        {
+        if (VALID_ADDON_FILE_EXTENSION.find(UTF82String(filesystem::path(str2wstr(packPath)).extension().u8string())) == VALID_ADDON_FILE_EXTENSION.end()) {
             addonLogger.error("Unsupported type of file found!");
             return false;
         }
@@ -301,15 +260,13 @@ bool AddonsManager::install(std::string packPath)
         addonLogger.warn("Installing addon <{}>...", name);
 
         std::error_code ec;
-        if (EndsWith(packPath, ".mcpack"))
-        {
+        if (EndsWith(packPath, ".mcpack")) {
             string newPath = packPath;
             ReplaceStr(newPath, ".mcpack", ".zip");
             filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec);
             packPath = newPath;
         }
-        if (EndsWith(packPath, ".mcaddon"))
-        {
+        if (EndsWith(packPath, ".mcaddon")) {
             string newPath = packPath;
             ReplaceStr(newPath, ".mcaddon", ".zip");
             filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec);
@@ -318,12 +275,11 @@ bool AddonsManager::install(std::string packPath)
 
         name = UTF82String(filesystem::path(str2wstr(packPath)).filename().u8string());
 
-        //filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); //?
-        //filesystem::create_directories(ADDON_INSTALL_TEMP_DIR + name + "/", ec);
+        // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); //?
+        // filesystem::create_directories(ADDON_INSTALL_TEMP_DIR + name + "/", ec);
 
         auto res = NewProcessSync(fmt::format("{} x \"{}\" -o{} -aoa", ZIP_PROGRAM_PATH, packPath, "\"" ADDON_INSTALL_TEMP_DIR + name + "/\""), ADDON_INSTALL_MAX_WAIT);
-        if (res.first != 0)
-        {
+        if (res.first != 0) {
             addonLogger.error("Fail to uncompress addon {}!", name);
             addonLogger.error("Exit Code: {}", res.first);
             addonLogger.error("Program Output:\n{}", res.second);
@@ -334,9 +290,8 @@ bool AddonsManager::install(std::string packPath)
 
         vector<string> paths;
         FindManifest(paths, ADDON_INSTALL_TEMP_DIR + name + "/");
-		
-        for (auto& dir : paths)
-        {
+
+        for (auto& dir : paths) {
             string addonName = UTF82String(filesystem::path(str2wstr(dir)).filename().u8string());
             if (addonName.empty() || addonName == "Temp")
                 addonName = UTF82String(filesystem::path(str2wstr(packPath)).stem().u8string());
@@ -347,72 +302,53 @@ bool AddonsManager::install(std::string packPath)
         filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec);
         filesystem::remove_all(str2wstr(packPath), ec);
         return true;
-    }
-    catch (const seh_exception& e)
-    {
+    } catch (const seh_exception& e) {
         addonLogger.error("Uncaught SEH Exception Detected!");
         addonLogger.error("In " __FUNCTION__);
         addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what()));
-    }
-    catch (const std::exception& e)
-    {
+    } catch (const std::exception& e) {
         addonLogger.error("Uncaught C++ Exception Detected!");
         addonLogger.error("In " __FUNCTION__);
         addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what()));
-    }
-    catch (...)
-    {
+    } catch (...) {
         addonLogger.error("Uncaught Exception Detected!");
         addonLogger.error("In " __FUNCTION__);
     }
     return false;
 }
 
-bool AddonsManager::disable(std::string nameOrUuid)
-{
-    try
-    {
+bool AddonsManager::disable(std::string nameOrUuid) {
+    try {
         auto addon = findAddon(nameOrUuid, true);
         if (!addon)
             return false;
-        if (RemoveAddonFromList(*addon))
-        {
+        if (RemoveAddonFromList(*addon)) {
             addon->enable = false;
             return true;
         }
 
-    }
-    catch(...)
-    { }
+    } catch (...) {}
     return false;
 }
 
-bool AddonsManager::enable(std::string nameOrUuid)
-{
-    try
-    {
+bool AddonsManager::enable(std::string nameOrUuid) {
+    try {
         auto addon = findAddon(nameOrUuid, true);
         if (!addon)
             return false;
-        if (AddAddonToList(*addon))
-        {
+        if (AddAddonToList(*addon)) {
             addon->enable = true;
             return true;
         }
 
-    }
-    catch(...)
-    { }
+    } catch (...) {}
     return false;
 }
 
-bool AddonsManager::uninstall(std::string nameOrUuid)
-{
-    try
-    {
+bool AddonsManager::uninstall(std::string nameOrUuid) {
+    try {
         auto addon = findAddon(nameOrUuid, true);
-        if (!addon)
-        {
+        if (!addon) {
             addonLogger.error("Addon not found!");
             return false;
         }
@@ -420,32 +356,26 @@ bool AddonsManager::uninstall(std::string nameOrUuid)
         std::error_code ec;
         filesystem::remove_all(str2wstr(addon->directory), ec);
         for (auto i = addons.begin(); i != addons.end(); ++i)
-            if (i->uuid == addon->uuid)
-            {
+            if (i->uuid == addon->uuid) {
                 addons.erase(i);
                 break;
             }
         addonLogger.info("Addon <{}> uninstalled.", addon->getPrintName());
-    }
-    catch(...)
-    { }
+    } catch (...) {}
     return false;
 }
 
-std::vector<Addon*> AddonsManager::getAllAddons()
-{
+std::vector<Addon*> AddonsManager::getAllAddons() {
     std::vector<Addon*> res;
     for (auto& addon : addons)
         res.push_back(&addon);
     return res;
 }
 
-Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy)
-{
+Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy) {
     Addon* possible = nullptr;
     bool multiMatch = false;
-    for (auto& addon : addons)
-    {
+    for (auto& addon : addons) {
         if (addon.uuid == nameOrUuid)
             return &addon;
         std::string addonName = addon.name;
@@ -457,8 +387,7 @@ Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy)
         // Simple fuzzy matching
         std::transform(addonName.begin(), addonName.end(), addonName.begin(), ::tolower);
         std::transform(targetName.begin(), targetName.end(), targetName.begin(), ::tolower);
-        if (StartsWith(addonName, targetName))
-        {
+        if (StartsWith(addonName, targetName)) {
             if (possible)
                 multiMatch = true;
             else
@@ -471,17 +400,14 @@ Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy)
         return possible;
 }
 
-void ListAllAddons(CommandOutput& output)
-{
-    if (addons.empty())
-    {
+void ListAllAddons(CommandOutput& output) {
+    if (addons.empty()) {
         output.success("No addon is installed.");
         return;
     }
 
     output.success("Addons: " + to_string(addons.size()) + " addon(s) installed:");
-    for (auto index = 0;index<addons.size();++index)
-    {
+    for (auto index = 0; index < addons.size(); ++index) {
         auto& addon = addons[index];
         string addonName = addon.name;
         if (addonName.find("§") == string::npos)
@@ -491,22 +417,17 @@ void ListAllAddons(CommandOutput& output)
             desc = "§7" + desc;
 
         std::string addonType = (addon.type == Addon::Type::ResourcePack ? "ResourcePack" : "BehaviorPack");
-        if (addon.enable)
-        {
+        if (addon.enable) {
             output.success(fmt::format("§e{:>2}§r: {} §a[v{}] §8({})", index + 1, addonName, addon.version.toString(), addonType));
             output.success(fmt::format("    {}", desc));
-        }
-        else
-        {
+        } else {
             output.success(fmt::format("§e{:>2}§r: §8{} [v{}] ({})", index + 1, ColorFormat::removeColorCode(addonName), addon.version.toString(), addonType));
             output.success(fmt::format("    §8Disabled"));
         }
-        
     }
 }
 
-void ShowAddon(CommandOutput& output, Addon& addon)
-{
+void ShowAddon(CommandOutput& output, Addon& addon) {
     std::ostringstream oss;
     oss << "Addon <" << addon.name << "§r>" << (addon.enable ? " §aEnabled" : " §cDisabled") << "\n\n";
     oss << "- §aName§r:  " << addon.name << "\n";
@@ -519,9 +440,12 @@ void ShowAddon(CommandOutput& output, Addon& addon)
 }
 
 class AddonsCommand : public Command {
-    enum class Operation
-    {
-        List, Install, Uninstall, Enable, Disable
+    enum class Operation {
+        List,
+        Install,
+        Uninstall,
+        Enable,
+        Disable
     };
 
     Operation operation = static_cast<Operation>(-1);
@@ -530,8 +454,7 @@ class AddonsCommand : public Command {
     bool target_isSet = false;
     bool index_isSet = false;
 
-    inline Addon* getSelectedAddon(CommandOutput& output) const
-    {
+    inline Addon* getSelectedAddon(CommandOutput& output) const {
         Addon* addon = nullptr;
         if (target_isSet) {
             auto addon = AddonsManager::findAddon(target, true);
@@ -539,9 +462,7 @@ class AddonsCommand : public Command {
                 return addon;
             else
                 output.error(fmt::format("Addon {} Not Found", target));
-        }
-        else
-        {
+        } else {
             auto addons = AddonsManager::getAllAddons();
             if (index - 1 >= 0 && index - 1 < static_cast<int>(addons.size()))
                 return addons[index - 1];
@@ -552,40 +473,33 @@ class AddonsCommand : public Command {
     }
 
 public:
-    void execute(CommandOrigin const& ori, CommandOutput& output) const override
-    {
-        switch (operation)
-        {
+    void execute(CommandOrigin const& ori, CommandOutput& output) const override {
+        switch (operation) {
             case Operation::List:
-                if (target_isSet || index_isSet)
-                {
+                if (target_isSet || index_isSet) {
                     if (auto addon = getSelectedAddon(output))
                         ShowAddon(output, *addon);
-                }
-                else
+                } else
                     ListAllAddons(output);
                 break;
             case Operation::Install:
-                if (AddonsManager::install(target)) 
+                if (AddonsManager::install(target))
                     filesystem::remove_all(ADDON_INSTALL_TEMP_DIR);
-                    output.success();
+                output.success();
                 break;
-            case Operation::Uninstall:
-            {
+            case Operation::Uninstall: {
                 auto addon = getSelectedAddon(output);
                 if (addon && AddonsManager::uninstall(addon->uuid))
                     output.success();
                 break;
             }
-            case Operation::Enable:
-            {
+            case Operation::Enable: {
                 auto addon = getSelectedAddon(output);
                 if (addon && AddonsManager::enable(addon->uuid))
                     output.success();
                 break;
             }
-            case Operation::Disable:
-            {
+            case Operation::Disable: {
                 auto addon = getSelectedAddon(output);
                 if (addon && AddonsManager::disable(addon->uuid))
                     output.success();
@@ -598,7 +512,7 @@ class AddonsCommand : public Command {
 
     static void setup(CommandRegistry* registry) {
         registry->registerCommand("addons", "LiteLoaderBDS Addons Helper (Restart required after addon changes)",
-            CommandPermissionLevel::GameMasters, { (CommandFlagValue)0 }, { (CommandFlagValue)0x80 });
+                                  CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80});
 
         vector<string> addonsList;
         for (auto& addon : addons)
@@ -606,55 +520,44 @@ class AddonsCommand : public Command {
         registry->addSoftEnum("AddonName", addonsList);
 
         // addons list
-        registry->addEnum<Operation>("Operation_Addons_List", {
-            {"list", Operation::List}
-        });
+        registry->addEnum<Operation>("Operation_Addons_List", {{"list", Operation::List}});
         registry->registerOverload<AddonsCommand>(
             "addons",
             makeMandatory<CommandParameterDataType::ENUM>(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1),
-            makeOptional<CommandParameterDataType::SOFT_ENUM>(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)
-        );
+            makeOptional<CommandParameterDataType::SOFT_ENUM>(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet));
         registry->registerOverload<AddonsCommand>(
             "addons",
             makeMandatory<CommandParameterDataType::ENUM>(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1),
-            makeOptional<CommandParameterDataType::NORMAL>(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)
-        );
+            makeOptional<CommandParameterDataType::NORMAL>(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet));
 
         // addons install
-        registry->addEnum<Operation>("Operation_Addons_Install", {
-            {"install", Operation::Install}
-        });
+        registry->addEnum<Operation>("Operation_Addons_Install", {{"install", Operation::Install}});
         registry->registerOverload<AddonsCommand>(
             "addons",
             makeMandatory<CommandParameterDataType::ENUM>(&AddonsCommand::operation, "operation", "Operation_Addons_Install").addOptions((CommandParameterOption)1),
-            makeMandatory<CommandParameterDataType::NORMAL>(&AddonsCommand::target, "addonName")
-        );
+            makeMandatory<CommandParameterDataType::NORMAL>(&AddonsCommand::target, "addonName"));
 
         // addons uninstall
 
         registry->addEnum<Operation>("Operation_Addons_Others", {
-            {"uninstall", Operation::Uninstall},
-            {"remove", Operation::Uninstall},
-            {"enable", Operation::Enable},
-            {"disable", Operation::Disable},
-        });
+                                                                    {"uninstall", Operation::Uninstall},
+                                                                    {"remove", Operation::Uninstall},
+                                                                    {"enable", Operation::Enable},
+                                                                    {"disable", Operation::Disable},
+                                                                });
         registry->registerOverload<AddonsCommand>(
             "addons",
             makeMandatory<CommandParameterDataType::ENUM>(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1),
-            makeMandatory<CommandParameterDataType::SOFT_ENUM>(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)
-        );
+            makeMandatory<CommandParameterDataType::SOFT_ENUM>(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet));
         registry->registerOverload<AddonsCommand>(
             "addons",
             makeMandatory<CommandParameterDataType::ENUM>(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1),
-            makeMandatory<CommandParameterDataType::NORMAL>(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)
-        );
+            makeMandatory<CommandParameterDataType::NORMAL>(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet));
     }
 };
 
-void FindAddons(string jsonPath, string packsDir)
-{
-    try
-    {
+void FindAddons(string jsonPath, string packsDir) {
+    try {
         if (!filesystem::exists(str2wstr(jsonPath)) && !filesystem::exists(str2wstr(packsDir)))
             return;
         if (!filesystem::exists(str2wstr(jsonPath)))
@@ -663,29 +566,23 @@ void FindAddons(string jsonPath, string packsDir)
             filesystem::create_directories(str2wstr(packsDir));
 
         auto content = ReadAllFile(jsonPath);
-        if (!content || content->empty())
-        {
+        if (!content || content->empty()) {
             WriteAllFile(jsonPath, "[]");
             content = "[]";
         }
         std::set<string> validPackIDs;
-        try
-        {
+        try {
             auto addonList = nlohmann::json::parse(*content, nullptr, true, true);
-            for (auto addon : addonList)
-            {
+            for (auto addon : addonList) {
                 std::string pktid = addon["pack_id"];
                 validPackIDs.insert(pktid);
             }
-        }
-        catch (const std::exception&)
-        {
+        } catch (const std::exception&) {
             addonLogger.error("Error in parse enabled addons list");
         }
 
         filesystem::directory_iterator ent(str2wstr(packsDir));
-        for (auto& dir : ent)
-        {
+        for (auto& dir : ent) {
             if (!dir.is_directory())
                 continue;
             auto addon = parseAddonFromPath(dir);
@@ -695,15 +592,12 @@ void FindAddons(string jsonPath, string packsDir)
                 addon->enable = true;
             addons.emplace_back(std::move(*addon));
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         return;
     }
 }
 
-void BuildAddonsList()
-{
+void BuildAddonsList() {
     string levelPath = Level::getCurrentLevelPath();
 
     FindAddons(levelPath + "/world_behavior_packs.json", levelPath + "/behavior_packs");
@@ -721,23 +615,20 @@ void BuildAddonsList()
 
 bool AutoInstallAddons(string path) {
     std::error_code ec;
-    if (!filesystem::exists(str2wstr(path)))
-    {
+    if (!filesystem::exists(str2wstr(path))) {
         filesystem::create_directories(str2wstr(path), ec);
         addonLogger.warn("Directory created. You can move compressed Addon files to {} to get installed at next launch.",
-            LL::globalConfig.addonsInstallPath);
+                         LL::globalConfig.addonsInstallPath);
         return false;
     }
     std::vector<string> toInstallList;
 
     filesystem::directory_iterator ent(str2wstr(path));
-    for (auto& file : ent)
-    {
+    for (auto& file : ent) {
         if (!file.is_regular_file())
             continue;
 
-        if (VALID_ADDON_FILE_EXTENSION.count(UTF82String(file.path().extension().u8string())) > 0)
-        {
+        if (VALID_ADDON_FILE_EXTENSION.count(UTF82String(file.path().extension().u8string())) > 0) {
             toInstallList.push_back(UTF82String(file.path().lexically_normal().u8string()));
         }
     }
@@ -747,34 +638,26 @@ bool AutoInstallAddons(string path) {
 
     addonLogger.warn("{} new addon(s) found to install. Working...", toInstallList.size());
     int cnt = 0;
-    for (auto& path : toInstallList)
-    {
+    for (auto& path : toInstallList) {
         addonLogger.debug("Installing \"{}\"...", path);
-        if (!AddonsManager::install(path))
-        {
+        if (!AddonsManager::install(path)) {
             // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR, ec);
             break;
-        }
-        else
-        {
+        } else {
             ++cnt;
             addonLogger.warn("Addon {} has beed installed.", path);
         }
     }
 
-    if (cnt == 0)
-    {
+    if (cnt == 0) {
         addonLogger.error("No addon was installed.");
-    }
-    else
-    {
+    } else {
         addonLogger.warn("{} addon(s) was installed.", cnt);
     }
     return true;
 }
 
-void InitAddonsHelper()
-{
+void InitAddonsHelper() {
     if (LL::isDebugMode())
         addonLogger.consoleLevel = addonLogger.debug.level;
 
@@ -785,7 +668,7 @@ void InitAddonsHelper()
     BuildAddonsList();
 
     filesystem::remove_all(ADDON_INSTALL_TEMP_DIR);
-    
+
     Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands
         AddonsCommand::setup(ev.mCommandRegistry);
         return true;
diff --git a/LiteLoader/Main/AddonsHelper.h b/LiteLoader/Main/AddonsHelper.h
--- a/LiteLoader/Main/AddonsHelper.h
+++ b/LiteLoader/Main/AddonsHelper.h
@@ -5,9 +5,11 @@
 
 void InitAddonsHelper();
 
-struct Addon
-{
-    enum class Type { ResourcePack, BehaviorPack  };
+struct Addon {
+    enum class Type {
+        ResourcePack,
+        BehaviorPack
+    };
     std::string name;
     std::string description;
     Type type;
@@ -19,8 +21,7 @@ struct Addon
     std::string getPrintName() const;
 };
 
-class AddonsManager
-{
+class AddonsManager {
 public:
     static bool install(std::string path);
     static bool uninstall(std::string nameOrUuid);
diff --git a/LiteLoader/Main/BuiltinBugFix.cpp b/LiteLoader/Main/BuiltinBugFix.cpp
--- a/LiteLoader/Main/BuiltinBugFix.cpp
+++ b/LiteLoader/Main/BuiltinBugFix.cpp
@@ -22,51 +22,45 @@
 using namespace LL;
 
 
-//Fix bug
+// Fix bug
 TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVDisconnectPacket@@@Z",
-              ServerNetworkHandler, NetworkIdentifier* ni, void* packet)
-{
-    if (globalConfig.enableFixDisconnectBug)
-    {
+              ServerNetworkHandler, NetworkIdentifier* ni, void* packet) {
+    if (globalConfig.enableFixDisconnectBug) {
         if (!getServerPlayer(*ni))
             return;
     }
     return original(this, ni, packet);
 }
 
-//Fix bug
+// Fix bug
 TClasslessInstanceHook(bool, "?_read@ClientCacheBlobStatusPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z",
-    ReadOnlyBinaryStream* a2)
-{
+                       ReadOnlyBinaryStream* a2) {
     ReadOnlyBinaryStream pkt(a2->getData(), false);
     pkt.getUnsignedVarInt();
-    if (pkt.getUnsignedVarInt() >= 0xfff) return false;
-    if (pkt.getUnsignedVarInt() >= 0xfff) return false;
+    if (pkt.getUnsignedVarInt() >= 0xfff)
+        return false;
+    if (pkt.getUnsignedVarInt() >= 0xfff)
+        return false;
     return original(this, a2);
 }
 
-//Fix bug
+// Fix bug
 TClasslessInstanceHook(void*, "?_read@PurchaseReceiptPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z",
-    ReadOnlyBinaryStream* a2)
-{
+                       ReadOnlyBinaryStream* a2) {
     return (void*)1;
 }
 
 // Fix bug
 TClasslessInstanceHook(void*, "?_read@EduUriResourcePacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z",
-    ReadOnlyBinaryStream* a2)
-{
+                       ReadOnlyBinaryStream* a2) {
     return (void*)1;
 }
 
 // Fix the listening port twice
-TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ")
-{
+TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ") {
     static bool isFirstLog = true;
-    if (globalConfig.enableFixListenPort)
-    {
-        if (isFirstLog)
-        {
+    if (globalConfig.enableFixListenPort) {
+        if (isFirstLog) {
             isFirstLog = false;
             original(this);
             endTime = clock();
@@ -74,14 +68,11 @@ TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ")
             return 1;
         }
         return 0;
-    }
-    else
-    {     
+    } else {
         original(this);
-        if (!isFirstLog)
-        {
+        if (!isFirstLog) {
             endTime = clock();
-            Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\""); 
+            Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\"");
         }
         isFirstLog = false;
         return 1;
@@ -98,40 +89,45 @@ TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ")
 #include <MC/ColorFormat.hpp>
 #include <magic_enum/magic_enum.hpp>
 
-inline bool itemMayFromReducer(ItemStack const& item)
-{
+inline bool itemMayFromReducer(ItemStack const& item) {
     return item.isNull() || (ElementBlock::isElement(item) && !item.hasUserData());
 }
 
 TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVInventoryTransactionPacket@@@Z",
-              ServerNetworkHandler, NetworkIdentifier const& netid, InventoryTransactionPacket* pk)
-{
-    if (globalConfig.enableAntiGive)
-    {
+              ServerNetworkHandler, NetworkIdentifier const& netid, InventoryTransactionPacket* pk) {
+    if (globalConfig.enableAntiGive) {
         auto sp = (Player*)this->getServerPlayer(netid);
         auto& actions = pk->transaction->data.actions;
         bool abnormal = false;
         bool mayFromReducer = true;
-        for (auto& action : actions)
-            if (action.first.type == InventorySourceType::NONIMPLEMENTEDTODO)
-            {
-                for (auto& a : action.second)
-                {
+        bool isContainer = false;
+        for (auto& action : actions) {
+            if (action.first.type == InventorySourceType::Container) {
+				isContainer = true;
+                if (abnormal) {
+                    logger.warn << "Player(" << sp->getRealName() << ") item data error!" << Logger::endl;
+                    mayFromReducer = false;
+                }
+            }			
+            if (action.first.type == InventorySourceType::NONIMPLEMENTEDTODO) {
+                for (auto& a : action.second) {
                     auto fromDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global<Level>->getBlockPalette(), true);
-                    auto toDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global<Level>->getBlockPalette(), true);
-                    if (!itemMayFromReducer(fromDesc) || !itemMayFromReducer(toDesc) || !itemMayFromReducer(a.fromItem) || !itemMayFromReducer(a.toItem))
-                    {
-                        if (mayFromReducer)
+                    auto toDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global<Level>->getBlockPalette(), true);					
+                    if ( isContainer || !itemMayFromReducer(fromDesc) || !itemMayFromReducer(toDesc) || !itemMayFromReducer(a.fromItem) || !itemMayFromReducer(a.toItem)) {
+                        if (mayFromReducer) {
                             logger.warn << "Player(" << sp->getRealName() << ") item data error!" << Logger::endl;
-                        if (!toDesc.isNull())
+                        }
+                        if (!toDesc.isNull()) {
                             logger.warn("Item: {}", toDesc.toString());
+                        }
                         mayFromReducer = false;
                     }
                 }
                 abnormal = true;
             }
-        if (abnormal && !mayFromReducer)
-        {
+        }
+		
+        if (abnormal && !mayFromReducer) {
             string cmd = ReplaceStr(globalConfig.antiGiveCommand, "{player}", "\"" + sp->getRealName() + "\"");
             Level::runcmd(cmd);
             return;
@@ -140,12 +136,10 @@ TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@A
     return original(this, netid, pk);
 }
 
-TInstanceHook(size_t, "??0PropertiesSettings@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z", PropertiesSettings, const std::string& file)
-{
+TInstanceHook(size_t, "??0PropertiesSettings@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z", PropertiesSettings, const std::string& file) {
     auto out = original(this, file);
-    if (LL::globalConfig.enableUnoccupyPort19132)
-    {
-        //logger.warn("If you turn on this feature, your server will not be displayed on the LAN");
+    if (LL::globalConfig.enableUnoccupyPort19132) {
+        // logger.warn("If you turn on this feature, your server will not be displayed on the LAN");
         DWORD v4Flag, v6Flag;
         VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePort, 4, PAGE_READWRITE, &v4Flag);
         *(unsigned short*)&SharedConstants::NetworkDefaultGamePort = getServerPort();
@@ -163,28 +157,25 @@ TInstanceHook(size_t, "??0PropertiesSettings@@QEAA@AEBV?$basic_string@DU?$char_t
 // Fix move view crash (ref PlayerAuthInput[MoveView])
 Player* movingViewPlayer = nullptr;
 TInstanceHook(void, "?moveView@Player@@UEAAXXZ",
-              Player)
-{
+              Player) {
     movingViewPlayer = this;
     original(this);
     movingViewPlayer = nullptr;
 }
 #include <MC/ChunkViewSource.hpp>
-inline bool Interval(int a1)
-{
-    if (a1 < 0x5ffffff && a1 > -0x5ffffff) return true;
+inline bool Interval(int a1) {
+    if (a1 < 0x5ffffff && a1 > -0x5ffffff)
+        return true;
     return false;
 }
 template <typename T>
-inline bool validPosition(T const& pos)
-{
-    if (isnan(static_cast<float>(pos.x)) || isnan(static_cast<float>(pos.z))) return false;
+inline bool validPosition(T const& pos) {
+    if (isnan(static_cast<float>(pos.x)) || isnan(static_cast<float>(pos.z)))
+        return false;
     return Interval(static_cast<int>(pos.x)) && Interval(static_cast<int>(pos.y)) && Interval(static_cast<int>(pos.z));
 }
-inline void fixPlayerPosition(Player* pl, bool kick = true)
-{
-    if (pl->isPlayer())
-    {
+inline void fixPlayerPosition(Player* pl, bool kick = true) {
+    if (pl->isPlayer()) {
         logger.warn << "Player(" << pl->getRealName() << ") sent invalid MoveView Packet!" << Logger::endl;
         auto& pos = pl->getPosPrev();
         if (validPosition(pos))
@@ -196,24 +187,20 @@ inline void fixPlayerPosition(Player* pl, bool kick = true)
     }
 }
 TInstanceHook(void, "?moveSpawnView@Player@@QEAAXAEBVVec3@@V?$AutomaticID@VDimension@@H@@@Z",
-              Player, class Vec3 const& pos, class AutomaticID<class Dimension, int> dimid)
-{
+              Player, class Vec3 const& pos, class AutomaticID<class Dimension, int> dimid) {
     if (validPosition(pos))
         return original(this, pos, dimid);
     fixPlayerPosition(false);
-    
 }
 TClasslessInstanceHook(__int64, "?move@ChunkViewSource@@QEAAXAEBVBlockPos@@H_NV?$function@$$A6AXV?$buffer_span_mut@V?$shared_ptr@VLevelChunk@@@std@@@@V?$buffer_span@I@@@Z@std@@@Z",
-    BlockPos const& a1, int a2, bool a3, std::function<void(class buffer_span_mut<class std::shared_ptr<class LevelChunk>>, class buffer_span<unsigned int>)> a4)
-{
+                       BlockPos const& a1, int a2, bool a3, std::function<void(class buffer_span_mut<class std::shared_ptr<class LevelChunk>>, class buffer_span<unsigned int>)> a4) {
     if (validPosition(a1))
         return original(this, a1, a2, a3, a4);
     fixPlayerPosition(movingViewPlayer);
     return 0;
 }
 
-TInstanceHook(void, "?move@Player@@UEAAXAEBVVec3@@@Z", Player, Vec3 pos)
-{
+TInstanceHook(void, "?move@Player@@UEAAXAEBVVec3@@@Z", Player, Vec3 pos) {
     if (validPosition(pos))
         return original(this, pos);
     logger.warn << "Player(" << this->getRealName() << ") sent invalid Move Packet!" << Logger::endl;
@@ -237,27 +224,27 @@ TInstanceHook(void, "?die@ServerPlayer@@UEAAXAEBVActorDamageSource@@@Z", ServerP
 }
 #endif
 
-//fix Fishing Hook changeDimension Crash
-TInstanceHook(__int64, "?changeDimension@Actor@@UEAAXV?$AutomaticID@VDimension@@H@@@Z", Actor, unsigned int a1)
-{
-    if (!LL::globalConfig.enableFixMcBug) return original(this, a1);
-    if ((int)this->getEntityTypeId() == 0x4D) return 0;
+// fix Fishing Hook changeDimension Crash
+TInstanceHook(__int64, "?changeDimension@Actor@@UEAAXV?$AutomaticID@VDimension@@H@@@Z", Actor, unsigned int a1) {
+    if (!LL::globalConfig.enableFixMcBug)
+        return original(this, a1);
+    if ((int)this->getEntityTypeId() == 0x4D)
+        return 0;
     return original(this, a1);
 }
 
-TClasslessInstanceHook(__int64, "?teleportEntity@EndGatewayBlockActor@@QEAAXAEAVActor@@@Z", Actor* a1)
-{
-    if (!LL::globalConfig.enableFixMcBug) return original(this, a1);
-    if ((int)a1->getEntityTypeId() == 0x4D) return 0;
+TClasslessInstanceHook(__int64, "?teleportEntity@EndGatewayBlockActor@@QEAAXAEAVActor@@@Z", Actor* a1) {
+    if (!LL::globalConfig.enableFixMcBug)
+        return original(this, a1);
+    if ((int)a1->getEntityTypeId() == 0x4D)
+        return 0;
     return original(this, a1);
 }
 
-//fix Wine Stop
-TClasslessInstanceHook(void, "?leaveGameSync@ServerInstance@@QEAAXXZ")
-{
+// fix Wine Stop
+TClasslessInstanceHook(void, "?leaveGameSync@ServerInstance@@QEAAXXZ") {
     original(this);
-    if (IsWineEnvironment())
-    {
+    if (IsWineEnvironment()) {
         std::cerr << "Quit correctly" << std::endl;
         auto proc = GetCurrentProcess();
         TerminateProcess(proc, 0);
@@ -265,10 +252,8 @@ TClasslessInstanceHook(void, "?leaveGameSync@ServerInstance@@QEAAXXZ")
 }
 
 TClasslessInstanceHook(enum StartupResult, "?Startup@RakPeer@RakNet@@UEAA?AW4StartupResult@2@IPEAUSocketDescriptor@2@IH@Z",
-                       unsigned int maxConnections, class SocketDescriptor* socketDescriptors, unsigned socketDescriptorCount, int threadPriority)
-{
-    if (maxConnections > 0xFFFF)
-    {
+                       unsigned int maxConnections, class SocketDescriptor* socketDescriptors, unsigned socketDescriptorCount, int threadPriority) {
+    if (maxConnections > 0xFFFF) {
         maxConnections = 0xFFFF;
     }
     return original(this, maxConnections, socketDescriptors, socketDescriptorCount, threadPriority);
@@ -276,43 +261,36 @@ TClasslessInstanceHook(enum StartupResult, "?Startup@RakPeer@RakNet@@UEAA?AW4Sta
 
 // Fix command crash when server is stopping
 TClasslessInstanceHook(void, "?fireEventPlayerMessage@MinecraftEventing@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@000@Z",
-                       std::string const& a1, std::string const& a2, std::string const& a3, std::string const& a4)
-{
+                       std::string const& a1, std::string const& a2, std::string const& a3, std::string const& a4) {
     if (LL::isServerStopping())
         return;
     original(this, a1, a2, a3, a4);
 }
 TClasslessInstanceHook(void, "?fireEventPlayerTransform@MinecraftEventing@@SAXAEAVPlayer@@@Z",
-                       class Player& a1)
-{
+                       class Player& a1) {
     if (LL::isServerStopping())
         return;
     original(this, a1);
 }
 
 TClasslessInstanceHook(void, "?fireEventPlayerTravelled@MinecraftEventing@@UEAAXPEAVPlayer@@M@Z",
-                       class Player& a1, float a2)
-{
+                       class Player& a1, float a2) {
     if (LL::isServerStopping())
         return;
     original(this, a1, a2);
 }
 TClasslessInstanceHook(void, "?fireEventPlayerTeleported@MinecraftEventing@@SAXPEAVPlayer@@MW4TeleportationCause@1@H@Z",
-                       class Player* a1, float a2, int a3, int a4)
-{
+                       class Player* a1, float a2, int a3, int a4) {
     if (LL::isServerStopping())
         return;
     original(this, a1, a2, a3, a4);
 }
 
 // set stdin mode to text mode if in wine environment
-inline bool _tryFixConsoleInputMode()
-{
-    if ((LL::globalConfig.enableFixMcBug && IsWineEnvironment()) || LL::globalConfig.enableForceUtf8Input)
-    {
+inline bool _tryFixConsoleInputMode() {
+    if ((LL::globalConfig.enableFixMcBug && IsWineEnvironment()) || LL::globalConfig.enableForceUtf8Input) {
         int result = _setmode(_fileno(stdin), _O_U8TEXT);
-        if (result == -1)
-        {
+        if (result == -1) {
             logger.error("Cannot set stdin to utf8 text mode");
             return false;
         }
@@ -325,12 +303,9 @@ inline bool _tryFixConsoleInputMode()
 THook(std::wistream&,
       "??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@$$"
       "QEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@_W@Z",
-      std::wistream&& ret, std::wstring& a1, wchar_t a2)
-{
-    if (&ret == &std::wcin)
-    {
+      std::wistream&& ret, std::wstring& a1, wchar_t a2) {
+    if (&ret == &std::wcin) {
         static bool fixed = _tryFixConsoleInputMode();
     }
     return original(std::move(ret), a1, a2);
 }
-
diff --git a/LiteLoader/Main/BuiltinCommands.cpp b/LiteLoader/Main/BuiltinCommands.cpp
--- a/LiteLoader/Main/BuiltinCommands.cpp
+++ b/LiteLoader/Main/BuiltinCommands.cpp
@@ -19,11 +19,9 @@ using namespace LL;
 
 static_assert(sizeof(CommandSelector<Player>) == 200);
 
-class TeleportDimensionCommand : public Command
-{
+class TeleportDimensionCommand : public Command {
 
-    enum class DimensionType
-    {
+    enum class DimensionType {
         OverWorld,
         Nether,
         TheEnd,
@@ -33,15 +31,13 @@ class TeleportDimensionCommand : public Command
     bool Victim_isSet = false;
     bool CommandPos_isSet = false;
 
-    Vec3 getTargetPos(CommandOrigin const& ori, Actor* actor) const
-    {
+    Vec3 getTargetPos(CommandOrigin const& ori, Actor* actor) const {
         if (CommandPos_isSet)
             return CommandPos.getPosition(ori, {0, 0, 0});
         auto pos = actor->getPosition();
         Vec3 result = pos;
         int actorDimensionId = actor->getDimensionId();
-        switch (DimensionId)
-        {
+        switch (DimensionId) {
             case TeleportDimensionCommand::DimensionType::OverWorld:
                 if (actorDimensionId == 1)
                     result = {pos.x * 8, pos.y, pos.z * 8};
@@ -60,8 +56,7 @@ class TeleportDimensionCommand : public Command
         return result;
     }
 
-    bool teleportTarget(CommandOrigin const& ori, CommandOutput& output, Actor* actor) const
-    {
+    bool teleportTarget(CommandOrigin const& ori, CommandOutput& output, Actor* actor) const {
         auto dim = VanillaDimensions::toString((int)DimensionId);
         auto pos = getTargetPos(ori, actor);
         actor->teleport(pos, (int)DimensionId);
@@ -70,31 +65,24 @@ class TeleportDimensionCommand : public Command
         return true;
     }
 
-    bool teleportTargets(CommandOrigin const& ori, CommandOutput& output, CommandSelectorResults<Actor>& actors) const
-    {
+    bool teleportTargets(CommandOrigin const& ori, CommandOutput& output, CommandSelectorResults<Actor>& actors) const {
         auto dim = VanillaDimensions::toString((int)DimensionId);
         std::string names;
-        for (auto& actor : actors)
-        {
+        for (auto& actor : actors) {
             std::string actorName = actor->getNameTag();
-            if (actorName.empty())
-            {
+            if (actorName.empty()) {
                 actorName = actor->getTypeName();
             }
             names.append(", ").append(actorName);
             if (actor->teleport(getTargetPos(ori, actor), (int)DimensionId))
                 output.success();
         }
-        if (output.getSuccessCount() == 0)
-        {
+        if (output.getSuccessCount() == 0) {
             output.error("No Actor Teleported");
             return false;
-        }
-        else
-        {
+        } else {
             std::string message = fmt::format("Teleported {} to {}", names.substr(2), dim);
-            if (CommandPos_isSet)
-            {
+            if (CommandPos_isSet) {
                 auto pos = CommandPos.getPosition(ori, {0, 0, 0});
                 message.append(fmt::format(" ({:2f}, {:2f}, {:2f})", pos.x, pos.y, pos.z));
             }
@@ -104,16 +92,12 @@ class TeleportDimensionCommand : public Command
     }
 
 public:
-
-    void execute(CommandOrigin const& ori, CommandOutput& output) const override
-    {
-        if ((int)DimensionId < 0 || (int)DimensionId > 2)
-        {
+    void execute(CommandOrigin const& ori, CommandOutput& output) const override {
+        if ((int)DimensionId < 0 || (int)DimensionId > 2) {
             output.error("Invalid DimensionId: " + std::to_string((int)DimensionId));
             return;
         }
-        if (Victim_isSet)
-        {
+        if (Victim_isSet) {
             auto result = Victim.results(ori);
             if (result.empty())
                 output.error("No Actor Specific");
@@ -121,9 +105,7 @@ class TeleportDimensionCommand : public Command
                 teleportTarget(ori, output, *result.begin());
             else
                 teleportTargets(ori, output, result);
-        }
-        else
-        {
+        } else {
             auto actor = ori.getEntity();
             if (!actor)
                 output.error("No Actor Specific");
@@ -132,8 +114,7 @@ class TeleportDimensionCommand : public Command
         }
     }
 
-    static void setup(CommandRegistry* registry)
-    {
+    static void setup(CommandRegistry* registry) {
         registry->registerCommand(
             "tpdim", "Teleport to Dimension", CommandPermissionLevel::GameMasters,
             {(CommandFlagValue)0}, {(CommandFlagValue)0x80});
@@ -159,21 +140,19 @@ class TeleportDimensionCommand : public Command
             "tpdim", victimParam, dimensionTypeParam, positionParam);
         registry->registerOverload<TeleportDimensionCommand>(
             "tpdim", victimParam, dimensionIdParam, positionParam);
-        //registry->registerOverload<TeleportDimensionCommand>(
-        //    "tpdim", dimensionTypeParam, positionParam);
+        // registry->registerOverload<TeleportDimensionCommand>(
+        //     "tpdim", dimensionTypeParam, positionParam);
         registry->registerOverload<TeleportDimensionCommand>(
             "tpdim", dimensionIdParam, positionParam);
     }
 };
 
-void LLListPluginsCommand(CommandOutput& output)
-{
+void LLListPluginsCommand(CommandOutput& output) {
     auto plugins = LL::getAllPlugins();
     std::ostringstream oss;
     oss << "Plugin Lists [" << plugins.size() << "]\n";
 
-    for (auto& [name, plugin] : plugins)
-    {
+    for (auto& [name, plugin] : plugins) {
         string pluginName = name;
         if (pluginName.find("§") == string::npos)
             pluginName = "§b" + pluginName;
@@ -183,17 +162,15 @@ void LLListPluginsCommand(CommandOutput& output)
 
         auto fileName = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string());
         oss << fmt::format("- {} §a[v{}] §8({})\n  {}\n",
-            pluginName, plugin->version.toString(), fileName, desc);
+                           pluginName, plugin->version.toString(), fileName, desc);
     }
     oss << "\n* Send command \"ll list <Plugin Name>\" for more information";
     output.success(oss.str());
 }
 
-void LLPluginInfoCommand(CommandOutput& output, const string& pluginName)
-{
+void LLPluginInfoCommand(CommandOutput& output, const string& pluginName) {
     auto plugin = LL::getPlugin(pluginName);
-    if (plugin)
-    {
+    if (plugin) {
         std::map<std::string, std::string> outs;
         std::ostringstream oss;
         auto fn = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string());
@@ -210,29 +187,24 @@ void LLPluginInfoCommand(CommandOutput& output, const string& pluginName)
         size_t width = 10;
         for (auto& [k, _] : outs)
             width = std::max(width, k.length());
-        for (auto& [k, v] : outs)
-        {
+        for (auto& [k, v] : outs) {
             if (k != "PluginType" && k != "PluginFilePath")
                 oss << "- §l" << std::setw(width) << std::left << k << "§r: " << v << std::endl;
         }
         auto text = oss.str();
         text.pop_back();
         output.success(text, {});
-    }
-    else
-    {
+    } else {
         output.error("Plugin <" + pluginName + "> is not found!", {});
     }
 }
 
-void LLVersionCommand(CommandOutput& output)
-{
+void LLVersionCommand(CommandOutput& output) {
     output.success(fmt::format("Bedrock Dedicated Server {}\n- with LiteLoaderBDS {}\n- Network Protocol: {}",
                                LL::getBdsVersion(), LL::getLoaderVersionString(), LL::getServerProtocolVersion()));
 }
 
-void LLHelpCommand(CommandOutput& output)
-{
+void LLHelpCommand(CommandOutput& output) {
     output.success(
         "[Introduction]\n"
         "LiteLoaderBDS is an unofficial plugin loader for modding development of Bedrock Dedicated Server.\n"
@@ -242,8 +214,7 @@ void LLHelpCommand(CommandOutput& output)
         "Welcome to our github project to get more information ~");
 }
 
-void LLLoadPluginCommand(CommandOutput& output, const string& path)
-{
+void LLLoadPluginCommand(CommandOutput& output, const string& path) {
     // if (!LL::isDebugMode())
     //     return;
     if (PluginManager::loadPlugin(path, true))
@@ -252,8 +223,7 @@ void LLLoadPluginCommand(CommandOutput& output, const string& path)
         output.error("Fail to load plugin " + path);
 }
 
-void LLUnloadPluginCommand(CommandOutput& output, const string& pluginName)
-{
+void LLUnloadPluginCommand(CommandOutput& output, const string& pluginName) {
     // if (!LL::isDebugMode())
     //     return;
     if (PluginManager::unloadPlugin(pluginName, true))
@@ -262,19 +232,15 @@ void LLUnloadPluginCommand(CommandOutput& output, const string& pluginName)
         output.error("Fail to unload plugin " + pluginName);
 }
 
-void LLReloadPluginCommand(CommandOutput& output, const string& pluginName, bool reloadAll)
-{
-    //if (!LL::isDebugMode())
-    //    return;
-    if (!reloadAll)
-    {
+void LLReloadPluginCommand(CommandOutput& output, const string& pluginName, bool reloadAll) {
+    // if (!LL::isDebugMode())
+    //     return;
+    if (!reloadAll) {
         if (PluginManager::reloadPlugin(pluginName, true))
             output.success("Plugin <" + pluginName + "> reloaded successfully.");
         else
             output.error("Fail to reload plugin <" + pluginName + ">");
-    }
-    else
-    {
+    } else {
         int cnt = PluginManager::reloadAllPlugins(true);
         if (cnt > 0)
             output.success(std::to_string(cnt) + " plugins reloaded successfully.");
@@ -283,11 +249,9 @@ void LLReloadPluginCommand(CommandOutput& output, const string& pluginName, bool
     }
 }
 
-class LLCommand : public Command
-{
+class LLCommand : public Command {
 
-    enum class Operation
-    {
+    enum class Operation {
         Version,
         List,
         Help,
@@ -301,20 +265,16 @@ class LLCommand : public Command
     CommandRawText pluginNameToDoOperation;
 
 public:
-
-    void execute(CommandOrigin const& ori, CommandOutput& output) const override
-    {
+    void execute(CommandOrigin const& ori, CommandOutput& output) const override {
         std::string pluginName = "";
         if (hasPluginNameSet) {
             pluginName = pluginNameToDoOperation;
-            if (pluginName.size() > 1 && pluginName[0] == '"' && pluginName[pluginName.size() - 1] == '"' && pluginName[pluginName.size() - 2] != '\\')
-            {
+            if (pluginName.size() > 1 && pluginName[0] == '"' && pluginName[pluginName.size() - 1] == '"' && pluginName[pluginName.size() - 2] != '\\') {
                 pluginName.erase(0, 1);
                 pluginName.pop_back();
             }
         }
-        switch (operation)
-        {
+        switch (operation) {
             case Operation::Version:
                 LLVersionCommand(output);
                 break;
@@ -350,33 +310,29 @@ class LLCommand : public Command
         }
     }
 
-    static void setup(CommandRegistry* registry)
-    {
+    static void setup(CommandRegistry* registry) {
         // Register Cmd
         registry->registerCommand("ll", "LiteLoaderBDS plugin operations",
                                   CommandPermissionLevel::Console, {(CommandFlagValue)0}, {(CommandFlagValue)0x80});
 
         // Register softenum
         vector<string> pluginList;
-        for (auto& [name, p] : LL::getAllPlugins())
-        {
+        for (auto& [name, p] : LL::getAllPlugins()) {
             pluginList.push_back(name);
         }
         registry->addSoftEnum("PluginName", pluginList);
 
         // ll version & help
-        registry->addEnum<Operation>("Operation_Common", {
-            {"version", Operation::Version},
-            {"help", Operation::Help}}
-        );
+        registry->addEnum<Operation>("Operation_Common", {{"version", Operation::Version},
+                                                          {"help", Operation::Help}});
         registry->registerOverload<LLCommand>(
             "ll",
             makeMandatory<CommandParameterDataType::ENUM>(&LLCommand::operation, "Operation", "Operation_Common").addOptions((CommandParameterOption)1));
 
-        // ll load 
+        // ll load
         registry->addEnum<Operation>("Operation_FreeFilePath", {
-            {"load", Operation::Load},
-        });
+                                                                   {"load", Operation::Load},
+                                                               });
         registry->registerOverload<LLCommand>(
             "ll",
             makeMandatory<CommandParameterDataType::ENUM>(&LLCommand::operation, "Operation", "Operation_FreeFilePath").addOptions((CommandParameterOption)1),
@@ -384,8 +340,8 @@ class LLCommand : public Command
 
         // ll unload
         registry->addEnum<Operation>("Operation_MustPluginName", {
-            {"unload", Operation::Unload},
-        });
+                                                                     {"unload", Operation::Unload},
+                                                                 });
         registry->registerOverload<LLCommand>(
             "ll",
             makeMandatory<CommandParameterDataType::ENUM>(&LLCommand::operation, "Operation", "Operation_MustPluginName").addOptions((CommandParameterOption)1),
@@ -393,10 +349,10 @@ class LLCommand : public Command
 
         // ll list & reload
         registry->addEnum<Operation>("Operation_OptionalPluginName", {
-            {"list", Operation::List},
-            {"plugins", Operation::List},
-            {"reload", Operation::Reload},
-        });
+                                                                         {"list", Operation::List},
+                                                                         {"plugins", Operation::List},
+                                                                         {"reload", Operation::Reload},
+                                                                     });
         registry->registerOverload<LLCommand>(
             "ll",
             makeMandatory<CommandParameterDataType::ENUM>(&LLCommand::operation, "Operation", "Operation_OptionalPluginName").addOptions((CommandParameterOption)1),
@@ -404,34 +360,31 @@ class LLCommand : public Command
     }
 };
 
-class VersionCommand : public Command
-{
+class VersionCommand : public Command {
 
 public:
-
-    void execute(CommandOrigin const& ori, CommandOutput& output) const override
-    {
+    void execute(CommandOrigin const& ori, CommandOutput& output) const override {
 #ifdef DEBUG
         Logger("CommandOrigin").warn(ori.serialize().toSNBT());
 #endif // DEBUG
         LLVersionCommand(output);
     }
 
-    static void setup(CommandRegistry* registry)
-    {
+    static void setup(CommandRegistry* registry) {
         registry->registerCommand("version", "Get the version of this server",
                                   CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80});
         registry->registerOverload<VersionCommand>("version");
     }
 };
 
-void RegisterCommands()
-{
+void RegisterCommands() {
     Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands
         LLCommand::setup(ev.mCommandRegistry);
         VersionCommand::setup(ev.mCommandRegistry);
-        if (LL::globalConfig.enableTpdimCommand) { TeleportDimensionCommand::setup(ev.mCommandRegistry); }
-		
+        if (LL::globalConfig.enableTpdimCommand) {
+            TeleportDimensionCommand::setup(ev.mCommandRegistry);
+        }
+
         return true;
     });
 }
diff --git a/LiteLoader/Main/BuiltinUnlockCmd.cpp b/LiteLoader/Main/BuiltinUnlockCmd.cpp
--- a/LiteLoader/Main/BuiltinUnlockCmd.cpp
+++ b/LiteLoader/Main/BuiltinUnlockCmd.cpp
@@ -10,8 +10,7 @@ bool isUnlockCmdEnabled = true;
 void LogCommandRegistration(std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2);
 
 TInstanceHook(void, "?registerCommand@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBDW4CommandPermissionLevel@@UCommandFlag@@3@Z",
-              CommandRegistry, std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2)
-{
+              CommandRegistry, std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2) {
     if (LL::globalConfig.enableUnlockCmd)
         flag1 |= 0x80;
     if (LL::globalConfig.debugMode)
@@ -23,10 +22,8 @@ TInstanceHook(void, "?registerCommand@CommandRegistry@@QEAAXAEBV?$basic_string@D
 class CommandSelectorBase;
 class CommandOrigin;
 TClasslessInstanceHook(bool, "?isExpansionAllowed@CommandSelectorBase@@AEBA_NAEBVCommandOrigin@@@Z",
-                       CommandOrigin* a2)
-{
-    if (LL::globalConfig.enableUnlockCmd)
-    {
+                       CommandOrigin* a2) {
+    if (LL::globalConfig.enableUnlockCmd) {
         original(this, a2);
         return true;
     }
@@ -37,7 +34,7 @@ TClasslessInstanceHook(bool, "?isExpansionAllowed@CommandSelectorBase@@AEBA_NAEB
 //#include <MC/CommandVersion.hpp>
 //#include <MC/CommandRegistry.hpp>
 //#include <MC/CommandParameterData.hpp>
-//inline void tryChangeStringToRawText(CommandParameterData& data)
+// inline void tryChangeStringToRawText(CommandParameterData& data)
 //{
 //    if (false /* config.xxxx*/ && data.tid.value == type_id<CommandRegistry, std::string>().value)
 //    {
@@ -46,53 +43,51 @@ TClasslessInstanceHook(bool, "?isExpansionAllowed@CommandSelectorBase@@AEBA_NAEB
 //    }
 //}
 //// allowlist
-//TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VAllowListCommand@@VCommandParameterData@@V2@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@2@Z",
-//              CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData const& operationParam, class CommandParameterData& nameParam)
+// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VAllowListCommand@@VCommandParameterData@@V2@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@2@Z",
+//               CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData const& operationParam, class CommandParameterData& nameParam)
 //{
-//    tryChangeStringToRawText(nameParam);
-//    return original(this, unk, version, operationParam, nameParam);
-//}
+//     tryChangeStringToRawText(nameParam);
+//     return original(this, unk, version, operationParam, nameParam);
+// }
 //// op
-//TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z",
-//              CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam)
+// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z",
+//               CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam)
 //{
-//    tryChangeStringToRawText(nameParam);
-//    return original(this, unk, version, nameParam);
-//}
+//     tryChangeStringToRawText(nameParam);
+//     return original(this, unk, version, nameParam);
+// }
 //// deop
-//TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VDeOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z",
-//              CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam)
+// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VDeOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z",
+//               CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam)
 //{
-//    tryChangeStringToRawText(nameParam);
-//    return original(this, unk, version, nameParam);
-//}
-// bool unlockNewExecute = true;
-// TClasslessInstanceHook(bool, "?isEnabled@FeatureToggles@@QEBA_NW4FeatureOptionID@@@Z",
-//                        int feature)
-// {
-//     if (feature == 54 && unlockNewExecute)
-//         return true;
-//     return original(this, feature);
+//     tryChangeStringToRawText(nameParam);
+//     return original(this, unk, version, nameParam);
 // }
-//TClasslessInstanceHook(void, "?addSemanticConstraint@CommandRegistry@@AEAAXW4SemanticConstraint@@@Z",
-//                       enum SemanticConstraint)
+//  bool unlockNewExecute = true;
+//  TClasslessInstanceHook(bool, "?isEnabled@FeatureToggles@@QEBA_NW4FeatureOptionID@@@Z",
+//                         int feature)
+//  {
+//      if (feature == 54 && unlockNewExecute)
+//          return true;
+//      return original(this, feature);
+//  }
+// TClasslessInstanceHook(void, "?addSemanticConstraint@CommandRegistry@@AEAAXW4SemanticConstraint@@@Z",
+//                        enum SemanticConstraint)
 //{
-//    return;
-//}
+//     return;
+// }
 TClasslessInstanceHook(void, "?addEnumValueConstraints@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@3@W4SemanticConstraint@@@Z",
-                       std::string const& enumName, std::vector<std::string> const& enumValues, SemanticConstraint constraint)
-{
+                       std::string const& enumName, std::vector<std::string> const& enumValues, SemanticConstraint constraint) {
     if (!LL::globalConfig.enableUnlockCmd)
         return original(this, enumName, enumValues, constraint);
-    if (constraint & SemanticConstraint::RequiresCheatsEnabled)
-    {
+    if (constraint & SemanticConstraint::RequiresCheatsEnabled) {
         constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresCheatsEnabled));
         constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions);
     }
-    //if (constraint & SemanticConstraint::RequiresHostPermissions)
+    // if (constraint & SemanticConstraint::RequiresHostPermissions)
     //{
-    //    constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresHostPermissions));
-    //    constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions);
-    //}
+    //     constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresHostPermissions));
+    //     constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions);
+    // }
     return original(this, enumName, enumValues, constraint);
 }
\ No newline at end of file
diff --git a/LiteLoader/Main/Config.cpp b/LiteLoader/Main/Config.cpp
--- a/LiteLoader/Main/Config.cpp
+++ b/LiteLoader/Main/Config.cpp
@@ -10,166 +10,128 @@ using namespace std;
 
 namespace LL {
 
-    LLConfig globalConfig;
-    LL::CommandLineOption commandLineOption;
+LLConfig globalConfig;
+LL::CommandLineOption commandLineOption;
 
-    void inline to_json(nlohmann::json& j, const LLConfig& conf)
-    {
-        j = nlohmann::json{
-                {"DebugMode", conf.debugMode},
-                {"ColorLog",  conf.colorLog},
-                {"LogLevel",  conf.logLevel},
-                {"Language",  conf.language},
-                {"ScriptEngine", {
-                    {"enabled", conf.enableScriptEngine},
-                    {"alwaysLaunch", conf.alwaysLaunchScriptEngine}
-                }},
-                {"Modules", {
-                    {"CrashLogger", {
-                        {"enabled", conf.enableCrashLogger},
-                        {"path", conf.crashLoggerPath}
-                    }},
-                    {"SimpleServerLogger", {{"enabled", conf.enableSimpleServerLogger}}},
-                    {"FixDisconnectBug", {{"enabled", conf.enableFixDisconnectBug}}},
-                    {"UnlockCmd", {{"enabled", conf.enableUnlockCmd}}},
-                    {"AddonsHelper", {
-                        {"enabled", conf.enableAddonsHelper},
-                        {"autoInstallPath", conf.addonsInstallPath}
-                    }},
-                    {"FixListenPort", {{"enabled", conf.enableFixListenPort}}},
-                    {"AntiGive", {
-                        {"enabled", conf.enableAntiGive},
-                        {"command", conf.antiGiveCommand}
-                    }},
-                    {"ErrorStackTraceback", {
-                        {"enabled", conf.enableErrorStackTraceback},
-                        {"cacheSymbol", conf.cacheErrorStackTracebackSymbol}
-                    }},
-                    {"UnoccupyPort19132", {{"enabled", conf.enableUnoccupyPort19132}}},
-                    {"CheckRunningBDS", {{"enabled", conf.enableCheckRunningBDS}}},
-                    {"WelcomeText", {{"enabled", conf.enableWelcomeText}}},
-                    {"FixMcBug", {{"enabled", conf.enableFixMcBug}}},
-                    {"OutputFilter", {
-                        {"enabled", conf.enableOutputFilter},
-                        {"onlyFilterConsoleOutput", conf.onlyFilterConsoleOutput},
-                        {"filterRegex", conf.outputFilterRegex}
-                    }}, 
-                    {"EconomyCore", {
-                        {"enabled", conf.enableEconomyCore}
-                    }},
-                     {"ForceUtf8Input", {{"enabled", conf.enableForceUtf8Input}
-                    }},
-                   {"TpdimCommand", {{"enabled", conf.enableTpdimCommand}}},
-                }
-            }
-        };
-    }
+void inline to_json(nlohmann::json& j, const LLConfig& conf) {
+    j = nlohmann::json{
+        {"DebugMode", conf.debugMode},
+        {"ColorLog", conf.colorLog},
+        {"LogLevel", conf.logLevel},
+        {"Language", conf.language},
+        {"ScriptEngine", {{"enabled", conf.enableScriptEngine}, {"alwaysLaunch", conf.alwaysLaunchScriptEngine}}},
+        {"Modules", {
+                        {"CrashLogger", {{"enabled", conf.enableCrashLogger}, {"path", conf.crashLoggerPath}}},
+                        {"SimpleServerLogger", {{"enabled", conf.enableSimpleServerLogger}}},
+                        {"FixDisconnectBug", {{"enabled", conf.enableFixDisconnectBug}}},
+                        {"UnlockCmd", {{"enabled", conf.enableUnlockCmd}}},
+                        {"AddonsHelper", {{"enabled", conf.enableAddonsHelper}, {"autoInstallPath", conf.addonsInstallPath}}},
+                        {"FixListenPort", {{"enabled", conf.enableFixListenPort}}},
+                        {"AntiGive", {{"enabled", conf.enableAntiGive}, {"command", conf.antiGiveCommand}}},
+                        {"ErrorStackTraceback", {{"enabled", conf.enableErrorStackTraceback}, {"cacheSymbol", conf.cacheErrorStackTracebackSymbol}}},
+                        {"UnoccupyPort19132", {{"enabled", conf.enableUnoccupyPort19132}}},
+                        {"CheckRunningBDS", {{"enabled", conf.enableCheckRunningBDS}}},
+                        {"WelcomeText", {{"enabled", conf.enableWelcomeText}}},
+                        {"FixMcBug", {{"enabled", conf.enableFixMcBug}}},
+                        {"OutputFilter", {{"enabled", conf.enableOutputFilter}, {"onlyFilterConsoleOutput", conf.onlyFilterConsoleOutput}, {"filterRegex", conf.outputFilterRegex}}},
+                        {"EconomyCore", {{"enabled", conf.enableEconomyCore}}},
+                        {"ForceUtf8Input", {{"enabled", conf.enableForceUtf8Input}}},
+                        {"TpdimCommand", {{"enabled", conf.enableTpdimCommand}}},
+                    }}};
+}
 
-    void inline from_json(const nlohmann::json& j, LLConfig& conf)
-    {
-        conf.debugMode = j.value("DebugMode", false);
-        if (LL::commandLineOption.noColorOption)
-            conf.colorLog = false;
-        else
-            conf.colorLog = j.value("ColorLog", true);
-        conf.logLevel = j.value("LogLevel", 4);
-        conf.language = j.value("Language", "en");
+void inline from_json(const nlohmann::json& j, LLConfig& conf) {
+    conf.debugMode = j.value("DebugMode", false);
+    if (LL::commandLineOption.noColorOption)
+        conf.colorLog = false;
+    else
+        conf.colorLog = j.value("ColorLog", true);
+    conf.logLevel = j.value("LogLevel", 4);
+    conf.language = j.value("Language", "en");
 
-        if (j.find("ScriptEngine") != j.end()) {
-            const nlohmann::json& scriptEngine = j.at("ScriptEngine");
-            conf.enableScriptEngine = scriptEngine.value("enabled", true);
+    if (j.find("ScriptEngine") != j.end()) {
+        const nlohmann::json& scriptEngine = j.at("ScriptEngine");
+        conf.enableScriptEngine = scriptEngine.value("enabled", true);
 
-            if(scriptEngine.find("alwaysLaunch") != scriptEngine.end())
-                conf.alwaysLaunchScriptEngine = scriptEngine.value("alwaysLaunch", false);
-        }
+        if (scriptEngine.find("alwaysLaunch") != scriptEngine.end())
+            conf.alwaysLaunchScriptEngine = scriptEngine.value("alwaysLaunch", false);
+    }
 
-        if (j.find("Modules") != j.end()) {
-            const nlohmann::json &modules = j.at("Modules");
+    if (j.find("Modules") != j.end()) {
+        const nlohmann::json& modules = j.at("Modules");
 
-            if (modules.count("CrashLogger"))
-            {
-                const nlohmann::json& setting = modules.at("CrashLogger");
-                conf.enableCrashLogger = setting.value("enabled", true);
-                conf.crashLoggerPath = setting.value("path", "plugins\\LiteLoader\\CrashLogger_Daemon.exe");
-            }
-            if (modules.count("SimpleServerLogger"))
-            {
-                const nlohmann::json& setting = modules.at("SimpleServerLogger");
-                conf.enableSimpleServerLogger = setting.value("enabled", true);
-            }
-            if (modules.count("FixDisconnectBug"))
-            {
-                const nlohmann::json& setting = modules.at("FixDisconnectBug");
-                conf.enableFixDisconnectBug = setting.value("enabled", true);
-            }
-            if (modules.count("FixListenPort"))
-            {
-                const nlohmann::json& setting = modules.at("FixListenPort");
-                conf.enableFixListenPort = setting.value("enabled", false);
-            }
-            if (modules.count("UnlockCmd"))
-            {
-                const nlohmann::json& setting = modules.at("UnlockCmd");
-                conf.enableUnlockCmd = setting.value("enabled", true);
-            }
-            if (modules.count("AddonsHelper"))
-            {
-                const nlohmann::json& setting = modules.at("AddonsHelper");
-                conf.enableAddonsHelper = setting.value("enabled", true);
-                conf.addonsInstallPath = setting.value("autoInstallPath", "plugins/AddonsHelper");
-            }
-            if (modules.count("AntiGive"))
-            {
-                const nlohmann::json& setting = modules.at("AntiGive");
-                conf.enableAntiGive = setting.value("enabled", true);
-                conf.antiGiveCommand = setting.value("command", "kick {player}");
-            }
-            if (modules.count("UnoccupyPort19132"))
-            {
-                const nlohmann::json& setting = modules.at("UnoccupyPort19132");
-                conf.enableUnoccupyPort19132 = setting.value("enabled", true);
-            }
-            if (modules.count("CheckRunningBDS"))
-            {
-                const nlohmann::json& setting = modules.at("CheckRunningBDS");
-                conf.enableCheckRunningBDS = setting.value("enabled", true);
-            }
-            if (modules.count("WelcomeText"))
-            {
-                const nlohmann::json& setting = modules.at("WelcomeText");
-                conf.enableWelcomeText = setting.value("enabled", true);
-            }
-            if (modules.count("FixMcBug"))
-            {
-                const nlohmann::json& setting = modules.at("FixMcBug");
-                conf.enableFixMcBug = setting.value("enabled", true);
-            }
-            if (modules.find("ErrorStackTraceback") != modules.end()) {
-                const nlohmann::json& setting = modules.at("ErrorStackTraceback");
-                conf.enableErrorStackTraceback = setting.value("enabled", true);
-                conf.cacheErrorStackTracebackSymbol = setting.value("cacheSymbol", false);
-            }
-            if (modules.find("OutputFilter") != modules.end()) {
-                const nlohmann::json& setting = modules.at("OutputFilter");
-                conf.enableOutputFilter = setting.value("enabled", false);
-                conf.onlyFilterConsoleOutput = setting.value("onlyFilterConsoleOutput", true);
-                conf.outputFilterRegex = setting.value("filterRegex", std::vector<std::string>());
-            }
-            if (modules.find("EconomyCore") != modules.end())
-            {
-                const nlohmann::json& setting = modules.at("EconomyCore");
-                conf.enableEconomyCore = setting.value("enabled", true);
-            }
-            if (modules.find("TpdimCommand") != modules.end()) {
-                const nlohmann::json& setting = modules.at("TpdimCommand");
-                conf.enableTpdimCommand = setting.value("enabled", true);
-            }
-            if (modules.find("ForceUtf8Input") != modules.end()) {
-                const nlohmann::json& setting = modules.at("ForceUtf8Input");
-                conf.enableForceUtf8Input = setting.value("enabled", true);
-            }
+        if (modules.count("CrashLogger")) {
+            const nlohmann::json& setting = modules.at("CrashLogger");
+            conf.enableCrashLogger = setting.value("enabled", true);
+            conf.crashLoggerPath = setting.value("path", "plugins\\LiteLoader\\CrashLogger_Daemon.exe");
+        }
+        if (modules.count("SimpleServerLogger")) {
+            const nlohmann::json& setting = modules.at("SimpleServerLogger");
+            conf.enableSimpleServerLogger = setting.value("enabled", true);
+        }
+        if (modules.count("FixDisconnectBug")) {
+            const nlohmann::json& setting = modules.at("FixDisconnectBug");
+            conf.enableFixDisconnectBug = setting.value("enabled", true);
+        }
+        if (modules.count("FixListenPort")) {
+            const nlohmann::json& setting = modules.at("FixListenPort");
+            conf.enableFixListenPort = setting.value("enabled", false);
+        }
+        if (modules.count("UnlockCmd")) {
+            const nlohmann::json& setting = modules.at("UnlockCmd");
+            conf.enableUnlockCmd = setting.value("enabled", true);
+        }
+        if (modules.count("AddonsHelper")) {
+            const nlohmann::json& setting = modules.at("AddonsHelper");
+            conf.enableAddonsHelper = setting.value("enabled", true);
+            conf.addonsInstallPath = setting.value("autoInstallPath", "plugins/AddonsHelper");
+        }
+        if (modules.count("AntiGive")) {
+            const nlohmann::json& setting = modules.at("AntiGive");
+            conf.enableAntiGive = setting.value("enabled", true);
+            conf.antiGiveCommand = setting.value("command", "kick {player}");
+        }
+        if (modules.count("UnoccupyPort19132")) {
+            const nlohmann::json& setting = modules.at("UnoccupyPort19132");
+            conf.enableUnoccupyPort19132 = setting.value("enabled", true);
+        }
+        if (modules.count("CheckRunningBDS")) {
+            const nlohmann::json& setting = modules.at("CheckRunningBDS");
+            conf.enableCheckRunningBDS = setting.value("enabled", true);
+        }
+        if (modules.count("WelcomeText")) {
+            const nlohmann::json& setting = modules.at("WelcomeText");
+            conf.enableWelcomeText = setting.value("enabled", true);
+        }
+        if (modules.count("FixMcBug")) {
+            const nlohmann::json& setting = modules.at("FixMcBug");
+            conf.enableFixMcBug = setting.value("enabled", true);
+        }
+        if (modules.find("ErrorStackTraceback") != modules.end()) {
+            const nlohmann::json& setting = modules.at("ErrorStackTraceback");
+            conf.enableErrorStackTraceback = setting.value("enabled", true);
+            conf.cacheErrorStackTracebackSymbol = setting.value("cacheSymbol", false);
+        }
+        if (modules.find("OutputFilter") != modules.end()) {
+            const nlohmann::json& setting = modules.at("OutputFilter");
+            conf.enableOutputFilter = setting.value("enabled", false);
+            conf.onlyFilterConsoleOutput = setting.value("onlyFilterConsoleOutput", true);
+            conf.outputFilterRegex = setting.value("filterRegex", std::vector<std::string>());
+        }
+        if (modules.find("EconomyCore") != modules.end()) {
+            const nlohmann::json& setting = modules.at("EconomyCore");
+            conf.enableEconomyCore = setting.value("enabled", true);
+        }
+        if (modules.find("TpdimCommand") != modules.end()) {
+            const nlohmann::json& setting = modules.at("TpdimCommand");
+            conf.enableTpdimCommand = setting.value("enabled", true);
+        }
+        if (modules.find("ForceUtf8Input") != modules.end()) {
+            const nlohmann::json& setting = modules.at("ForceUtf8Input");
+            conf.enableForceUtf8Input = setting.value("enabled", true);
         }
     }
+}
 } // namespace LL
 
 inline bool SaveConfig(nlohmann::json& config) {
@@ -183,19 +145,14 @@ inline bool SaveConfig(nlohmann::json& config) {
     }
 }
 
-bool LL::LoadLLConfig()
-{
-    try
-    {
+bool LL::LoadLLConfig() {
+    try {
         auto content = ReadAllFile(LITELOADER_CONFIG_FILE);
-        if (!content || content.value().empty())
-        {
+        if (!content || content.value().empty()) {
             logger.warn("LL Config File <{}> not found. Creating configuration file...", LITELOADER_CONFIG_FILE);
             filesystem::create_directories(filesystem::path(LITELOADER_CONFIG_FILE).remove_filename().u8string());
             LL::SaveLLConfig();
-        }
-        else
-        {
+        } else {
             try {
                 auto out = nlohmann::json::parse(*content, nullptr, false, true);
                 LL::globalConfig = out;
@@ -214,15 +171,11 @@ bool LL::LoadLLConfig()
                 return LL::SaveLLConfig();
             }
         }
-    }
-    catch (const nlohmann::json::exception& e)
-    {
+    } catch (const nlohmann::json::exception& e) {
         logger.error("Fail to parse config file <{}> !", LITELOADER_CONFIG_FILE);
         logger.error("{}", e.what());
         return false;
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Fail to load config file <{}> !", LITELOADER_CONFIG_FILE);
         return false;
     }
diff --git a/LiteLoader/Main/Config.h b/LiteLoader/Main/Config.h
--- a/LiteLoader/Main/Config.h
+++ b/LiteLoader/Main/Config.h
@@ -18,22 +18,20 @@ constexpr const char* NoCrashLogger[] = {"AntiCheats"};
 /////////////////////// LL Configs ///////////////////////
 #define LITELOADER_CONFIG_FILE "plugins/LiteLoader/LiteLoader.json"
 
-namespace LL
-{
-struct CommandLineOption
-{
+namespace LL {
+struct CommandLineOption {
     bool noColorOption = false;
 };
-enum class LLServerStatus
-{
-    Starting, Running, Stopping
+enum class LLServerStatus {
+    Starting,
+    Running,
+    Stopping
 };
-struct LLConfig
-{
+struct LLConfig {
     bool debugMode = false;
     bool colorLog = true;
     int logLevel = 4;
-    std::string language = "en_US";
+    std::string language = "en_us";
 
     bool enableScriptEngine = true;
     bool alwaysLaunchScriptEngine = false;
diff --git a/LiteLoader/Main/CrashLogger.cpp b/LiteLoader/Main/CrashLogger.cpp
--- a/LiteLoader/Main/CrashLogger.cpp
+++ b/LiteLoader/Main/CrashLogger.cpp
@@ -11,15 +11,12 @@ using namespace LL;
 
 Logger crashLogger("CrashLogger");
 
-bool LL::StartCrashLoggerProcess()
-{
-    if (IsDebuggerPresent())
-    {
+bool LL::StartCrashLoggerProcess() {
+    if (IsDebuggerPresent()) {
         crashLogger.info("Existing debugger detected. Builtin CrashLogger will not work.");
         return true;
     }
-    if (IsWineEnvironment())
-    {
+    if (IsWineEnvironment()) {
         crashLogger.info("Wine Environment detected. Builtin CrashLogger will not work.");
         return true;
     }
@@ -37,8 +34,7 @@ bool LL::StartCrashLoggerProcess()
     wchar_t daemonCmd[MAX_PATH];
     std::string serverVersion = fmt::format("{}.{:0>2}", Common::getGameVersionStringNet(), SharedConstants::RevisionVersion);
     wsprintf(daemonCmd, L"%ls %u \"%ls\"", str2wstr(globalConfig.crashLoggerPath).c_str(), GetCurrentProcessId(), str2wstr(serverVersion).c_str());
-    if (!CreateProcess(nullptr, daemonCmd, &sa, &sa, TRUE, 0, nullptr, nullptr, &si, &pi))
-    {
+    if (!CreateProcess(nullptr, daemonCmd, &sa, &sa, TRUE, 0, nullptr, nullptr, &si, &pi)) {
         crashLogger.error("Could not Create CrashLogger Daemon Process!");
         crashLogger.error << GetLastErrorMessage() << Logger::endl;
         return false;
@@ -49,17 +45,13 @@ bool LL::StartCrashLoggerProcess()
     return true;
 }
 
-void LL::InitCrashLogger(bool enableCrashLogger)
-{
+void LL::InitCrashLogger(bool enableCrashLogger) {
     // Enable PreLog Module
-    try
-    {
+    try {
         LoadLibrary(CL_PRELOG_MODULE);
-    }
-    catch (...) {}
+    } catch (...) {}
 
-    if (!enableCrashLogger)
-    {
+    if (!enableCrashLogger) {
         crashLogger.warn("Builtin CrashLogger is not enabled because the configuration disabled it.");
         crashLogger.warn("There will be no crash log when unhandled exception occurs,");
         crashLogger.warn("which makes it almost impossible to find out the reason for crash and the source of crash.");
@@ -76,7 +68,7 @@ void LL::InitCrashLogger(bool enableCrashLogger)
         if (i.is_regular_file() && i.path().extension().u8string() == u8".dll") {
             auto path = UTF82String(i.path().u8string());
 
-            //Check crashLogger
+            // Check crashLogger
             for (auto name : NoCrashLogger) {
                 if (path.find(name) != string::npos) {
                     noCrashLoggerReason = string(name) + ".dll";
@@ -98,11 +90,9 @@ void LL::InitCrashLogger(bool enableCrashLogger)
 
     // Start CrashLogger
     if (StartCrashLoggerProcess()) {
-        //Logger::Info("CrashLogger Daemon Process attached.");
-    }
-    else {
+        // Logger::Info("CrashLogger Daemon Process attached.");
+    } else {
         crashLogger.warn("Builtin CrashLogger failed to start!");
         crashLogger.warn("There will be no crash log when unhandled exception occurs.");
     }
-
 }
\ No newline at end of file
diff --git a/LiteLoader/Main/CrashLogger.h b/LiteLoader/Main/CrashLogger.h
--- a/LiteLoader/Main/CrashLogger.h
+++ b/LiteLoader/Main/CrashLogger.h
@@ -1,7 +1,6 @@
 #pragma once
 
-namespace LL
-{
+namespace LL {
 bool StartCrashLoggerProcess();
 void InitCrashLogger(bool enableCrashLogger);
 } // namespace LL
diff --git a/LiteLoader/Main/DefaultLangData.h b/LiteLoader/Main/DefaultLangData.h
--- a/LiteLoader/Main/DefaultLangData.h
+++ b/LiteLoader/Main/DefaultLangData.h
@@ -3,78 +3,77 @@
 
 static const I18N::LangData defaultLangData = {
     {"en", {
-         {"init.loadConfig.fail", "Loading ScriptEngine config failed"},
-         {"init.fileMapping.fail", "Failed to load global shared data"},
-         {"init.mapFile.fail", "Global shared data mapping failed"},
-         {"init.llMoney.noFound", "LLMoney.dll not found, ScriptEngine Economy System won't work"},
-         {"init.idFile.fail", "Failed to initialize unique identification file! Code: "},
-         {"api.parseJson.fail", "Json parse error"},
-         {"remoteCall.createMessageThread.fail", "Creating Message Thread failed"},
-         {"remoteCall.createEventObject.fail", "Creating Event Object failed"},
-         {"remoteCall.postMessage.fail", "Posting remote call information failed"},
-         {"remoteCall.timeout.fail", "Remote call timeout, call failed"},
-         {"remoteCall.waitFail.fail", "Remote call waiting failed, call failed"},
-         {"remoteCall.postMessageReturn.fail", "Remote call post return value failed"},
-         {"remoteCall.inRemoteEngine.fail", "Remote call error in remote engine"},
-         {"base.getDimName.0", "Overworld"},
-         {"base.getDimName.1", "Nether"},
-         {"base.getDimName.2", "End"},
-         {"base.getDimName.unknown", "Other dimension"},
-         {"llseapi.require.success", " - Plugin require loaded successfully. Loaded: "},
-         {"llseapi.require.fail", " - Plugin require load failed"},
-         {"llseapi.require.download.success", " - Successfully downloaded require! Path: "},
-         {"llseapi.require.network.fail", " - Download plugin require failed! Code: "},
-    }},
+               {"init.loadConfig.fail", "Loading ScriptEngine config failed"},
+               {"init.fileMapping.fail", "Failed to load global shared data"},
+               {"init.mapFile.fail", "Global shared data mapping failed"},
+               {"init.llMoney.noFound", "LLMoney.dll not found, ScriptEngine Economy System won't work"},
+               {"init.idFile.fail", "Failed to initialize unique identification file! Code: "},
+               {"api.parseJson.fail", "Json parse error"},
+               {"remoteCall.createMessageThread.fail", "Creating Message Thread failed"},
+               {"remoteCall.createEventObject.fail", "Creating Event Object failed"},
+               {"remoteCall.postMessage.fail", "Posting remote call information failed"},
+               {"remoteCall.timeout.fail", "Remote call timeout, call failed"},
+               {"remoteCall.waitFail.fail", "Remote call waiting failed, call failed"},
+               {"remoteCall.postMessageReturn.fail", "Remote call post return value failed"},
+               {"remoteCall.inRemoteEngine.fail", "Remote call error in remote engine"},
+               {"base.getDimName.0", "Overworld"},
+               {"base.getDimName.1", "Nether"},
+               {"base.getDimName.2", "End"},
+               {"base.getDimName.unknown", "Other dimension"},
+               {"llseapi.require.success", " - Plugin require loaded successfully. Loaded: "},
+               {"llseapi.require.fail", " - Plugin require load failed"},
+               {"llseapi.require.download.success", " - Successfully downloaded require! Path: "},
+               {"llseapi.require.network.fail", " - Download plugin require failed! Code: "},
+           }},
     {"zh_CN", {
-         {"init.loadConfig.fail", "LLSE配置文件加载失败！"},
-         {"init.fileMapping.fail", "全局共享数据加载失败！"},
-         {"init.mapFile.fail", "全局共享数据映射失败！"},
-         {"init.llMoney.noFound", "LLMoney.dll 未找到！LLSE经济系统将不会工作"},
-         {"init.idFile.fail", "初始化唯一识别文件失败！错误码："},
-         {"api.parseJson.fail", "Json解析发生错误！"},
-         {"remoteCall.createMessageThread.fail", "创建消息循环失败！"},
-         {"remoteCall.createEventObject.fail", "创建事件对象失败！"},
-         {"remoteCall.postMessage.fail", "递送远程调用信息失败！"},
-         {"remoteCall.timeout.fail", "远程调用等待超时！调用失败"},
-         {"remoteCall.waitFail.fail", "远程调用等待失败！调用失败"},
-         {"remoteCall.postMessageReturn.fail", "远程调用传递返回值失败！"},
-         {"remoteCall.inRemoteEngine.fail", "在远程引擎中发生错误！"},
-         {"base.getDimName.0", "主世界"},
-         {"base.getDimName.1", "下界"},
-         {"base.getDimName.2", "末地"},
-         {"base.getDimName.unknown", "其他维度"},
-         {"llseapi.require.success", " - 插件依赖包加载成功。已加载："},
-         {"llseapi.require.fail", " - 插件依赖包加载失败！"},
-         {"llseapi.require.download.success", " - 插件依赖包拉取成功！已安装到路径："},
-         {"llseapi.require.network.fail", " - 插件依赖包拉取网络请求失败！错误码："},
-         {"Detected the existence of another BDS process with the same path!", "检测到另一个相同的BDS进程存在!"},
-         {"This may cause the network port and the level to be occupied", "这可能会导致存档和端口占用"},
-         {"Do you want to terminate the process with PID {}?  (y=Yes, n=No)", "您是否要强制终止该PID为 {} 的进程? (y=是, n=否)"},
-    }},
+                  {"init.loadConfig.fail", "LLSE配置文件加载失败！"},
+                  {"init.fileMapping.fail", "全局共享数据加载失败！"},
+                  {"init.mapFile.fail", "全局共享数据映射失败！"},
+                  {"init.llMoney.noFound", "LLMoney.dll 未找到！LLSE经济系统将不会工作"},
+                  {"init.idFile.fail", "初始化唯一识别文件失败！错误码："},
+                  {"api.parseJson.fail", "Json解析发生错误！"},
+                  {"remoteCall.createMessageThread.fail", "创建消息循环失败！"},
+                  {"remoteCall.createEventObject.fail", "创建事件对象失败！"},
+                  {"remoteCall.postMessage.fail", "递送远程调用信息失败！"},
+                  {"remoteCall.timeout.fail", "远程调用等待超时！调用失败"},
+                  {"remoteCall.waitFail.fail", "远程调用等待失败！调用失败"},
+                  {"remoteCall.postMessageReturn.fail", "远程调用传递返回值失败！"},
+                  {"remoteCall.inRemoteEngine.fail", "在远程引擎中发生错误！"},
+                  {"base.getDimName.0", "主世界"},
+                  {"base.getDimName.1", "下界"},
+                  {"base.getDimName.2", "末地"},
+                  {"base.getDimName.unknown", "其他维度"},
+                  {"llseapi.require.success", " - 插件依赖包加载成功。已加载："},
+                  {"llseapi.require.fail", " - 插件依赖包加载失败！"},
+                  {"llseapi.require.download.success", " - 插件依赖包拉取成功！已安装到路径："},
+                  {"llseapi.require.network.fail", " - 插件依赖包拉取网络请求失败！错误码："},
+                  {"Detected the existence of another BDS process with the same path!", "检测到另一个相同的BDS进程存在!"},
+                  {"This may cause the network port and the level to be occupied", "这可能会导致存档和端口占用"},
+                  {"Do you want to terminate the process with PID {}?  (y=Yes, n=No)", "您是否要强制终止该PID为 {} 的进程? (y=是, n=否)"},
+              }},
     {"zh_TW", {
-         {"init.loadConfig.fail", "加載ScriptEngine配置文件失敗！"},
-         {"init.fileMapping.fail", "加載全局共享數據失敗！"},
-         {"init.mapFile.fail", "全局共享數據映射失敗！"},
-         {"init.llMoney.noFound", "LLMoney.dll 未找到！ScriptEngine經濟系統將無法工作"},
-         {"init.idFile.fail", "初始化唯一標識文件失敗！ 錯誤代碼：："},
-         {"api.parseJson.fail", "解析Json時發生錯誤！"},
-         {"remoteCall.createMessageThread.fail", "創建消息線程失敗"},
-         {"remoteCall.createEventObject.fail", "創建事件線程失敗"},
-         {"remoteCall.postMessage.fail", "發送遠程調用信息失敗！"},
-         {"remoteCall.timeout.fail", "遠程調用超時，調用失敗！"},
-         {"remoteCall.waitFail.fail", "遠程調用等待失敗，調用失敗！"},
-         {"remoteCall.postMessageReturn.fail", "遠程調用後返回值失敗！"},
-         {"remoteCall.inRemoteEngine.fail", "在遠程引擎中的遠程調用錯誤！"},
-         {"base.getDimName.0", "主世界"},
-         {"base.getDimName.1", "地獄"},
-         {"base.getDimName.2", "終界"},
-         {"base.getDimName.unknown", "其他維度(世界)"},
-         {"llseapi.require.success", " - 插件所需拓展包加載成功。已加載："},
-         {"llseapi.require.fail", " - 插件所需拓展包加載失敗！"},
-         {"llseapi.require.download.success", " - 插件所需拓展包下載成功！已安裝到至："},
-         {"llseapi.require.network.fail", " - 插件所需拓展包下載請求失敗！錯誤代碼："},
-         {"Detected the existence of another BDS process with the same path!", "檢測到另一個相同的BDS進程存在!"},
-         {"This may cause the network port and the level to be occupied", "這可能會導致存檔和端口占用"},
-         {"Do you want to terminate the process with PID {}?  (y=Yes, n=No)", "您是否要強製終止該PID為 {} 的進程? (y=是, n=否)"},
-    }}
-};
\ No newline at end of file
+                  {"init.loadConfig.fail", "加載ScriptEngine配置文件失敗！"},
+                  {"init.fileMapping.fail", "加載全局共享數據失敗！"},
+                  {"init.mapFile.fail", "全局共享數據映射失敗！"},
+                  {"init.llMoney.noFound", "LLMoney.dll 未找到！ScriptEngine經濟系統將無法工作"},
+                  {"init.idFile.fail", "初始化唯一標識文件失敗！ 錯誤代碼：："},
+                  {"api.parseJson.fail", "解析Json時發生錯誤！"},
+                  {"remoteCall.createMessageThread.fail", "創建消息線程失敗"},
+                  {"remoteCall.createEventObject.fail", "創建事件線程失敗"},
+                  {"remoteCall.postMessage.fail", "發送遠程調用信息失敗！"},
+                  {"remoteCall.timeout.fail", "遠程調用超時，調用失敗！"},
+                  {"remoteCall.waitFail.fail", "遠程調用等待失敗，調用失敗！"},
+                  {"remoteCall.postMessageReturn.fail", "遠程調用後返回值失敗！"},
+                  {"remoteCall.inRemoteEngine.fail", "在遠程引擎中的遠程調用錯誤！"},
+                  {"base.getDimName.0", "主世界"},
+                  {"base.getDimName.1", "地獄"},
+                  {"base.getDimName.2", "終界"},
+                  {"base.getDimName.unknown", "其他維度(世界)"},
+                  {"llseapi.require.success", " - 插件所需拓展包加載成功。已加載："},
+                  {"llseapi.require.fail", " - 插件所需拓展包加載失敗！"},
+                  {"llseapi.require.download.success", " - 插件所需拓展包下載成功！已安裝到至："},
+                  {"llseapi.require.network.fail", " - 插件所需拓展包下載請求失敗！錯誤代碼："},
+                  {"Detected the existence of another BDS process with the same path!", "檢測到另一個相同的BDS進程存在!"},
+                  {"This may cause the network port and the level to be occupied", "這可能會導致存檔和端口占用"},
+                  {"Do you want to terminate the process with PID {}?  (y=Yes, n=No)", "您是否要強製終止該PID為 {} 的進程? (y=是, n=否)"},
+              }}};
\ No newline at end of file
diff --git a/LiteLoader/Main/LiteLoader.cpp b/LiteLoader/Main/LiteLoader.cpp
--- a/LiteLoader/Main/LiteLoader.cpp
+++ b/LiteLoader/Main/LiteLoader.cpp
@@ -24,8 +24,7 @@ time_t startTime;
 time_t endTime;
 
 // Add plugins folder to path
-void FixPluginsLibDir()
-{
+void FixPluginsLibDir() {
     auto buffer = new WCHAR[8192];
     auto sz = GetEnvironmentVariableW(TEXT("PATH"), buffer, 8192);
     std::wstring PATH{buffer, sz};
@@ -35,8 +34,7 @@ void FixPluginsLibDir()
     delete[] buffer;
 }
 
-void FixUpCWD()
-{
+void FixUpCWD() {
     string buf;
     buf.assign(8192, '\0');
     GetModuleFileNameA(nullptr, buf.data(), 8192);
@@ -44,18 +42,17 @@ void FixUpCWD()
     SetCurrentDirectoryA(buf.c_str());
 }
 
-void CheckRunningBDS()
-{
+void CheckRunningBDS() {
     if (!LL::globalConfig.enableCheckRunningBDS)
         return;
     std::vector<DWORD> pids;
     PROCESSENTRY32 pe32{};
     pe32.dwSize = sizeof(pe32);
     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-    if (hProcessSnap == INVALID_HANDLE_VALUE) return;
+    if (hProcessSnap == INVALID_HANDLE_VALUE)
+        return;
     bool res = Process32First(hProcessSnap, &pe32); // Start traversing
-    while (res)
-    {
+    while (res) {
         std::wstring name = pe32.szExeFile;
         auto pid = pe32.th32ProcessID;
         if (_getpid() != pid && (name == L"bedrock_server.exe" || name == L"bedrock_server_mod.exe")) {
@@ -73,25 +70,21 @@ void CheckRunningBDS()
         WCHAR buf[8196] = {0};
         // Open process handle
         auto handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, false, pid);
-        if (handle)
-        {
+        if (handle) {
             DWORD sz = NULL;
             WCHAR buf[8196] = {0};
             // Get the full path of the process
-            if (sz = GetModuleFileNameEx(handle, NULL, buf, 8196))
-            {
+            if (sz = GetModuleFileNameEx(handle, NULL, buf, 8196)) {
                 std::wstring path{buf, sz};
-                if (current == path)
-                {
+                if (current == path) {
                     logger.error("Detected the existence of another BDS process with the same path!");
                     logger.error("This may cause the network port and the level to be occupied");
                     logger.error("Do you want to terminate the process with PID {}?  (y=Yes, n=No)", pid);
                     char ch;
                     cin >> ch;
-                    if (ch == 'y' || ch == 'Y')
-                    {
-                        //auto cmd = "taskkill /F /PID " + std::to_string(pid);
-                        //system(cmd.c_str());
+                    if (ch == 'y' || ch == 'Y') {
+                        // auto cmd = "taskkill /F /PID " + std::to_string(pid);
+                        // system(cmd.c_str());
                         TerminateProcess(handle, 1);
                     }
                 }
@@ -101,20 +94,14 @@ void CheckRunningBDS()
     }
 }
 
-void FixAllowList()
-{
-    if (filesystem::exists("whitelist.json"))
-    {
-        if (filesystem::exists("allowlist.json"))
-        {
+void FixAllowList() {
+    if (filesystem::exists("whitelist.json")) {
+        if (filesystem::exists("allowlist.json")) {
             auto res = ReadAllFile("allowlist.json");
-            if (res && (res->empty() || nlohmann::json::parse(*res, nullptr, true, true).empty()))
-            {
+            if (res && (res->empty() || nlohmann::json::parse(*res, nullptr, true, true).empty())) {
                 logger.warn("allowlist.json is empty! Removing...");
                 filesystem::remove("allowlist.json");
-            }
-            else
-            {
+            } else {
                 logger.warn("Both allowlist.json and whitelist.json exist and aren't empty. Please check them manually");
                 return;
             }
@@ -132,21 +119,29 @@ extern bool InitPlayerDatabase();
 
 extern void RegisterSimpleServerLogger();
 
-void Welcome()
-{
+void Welcome() {
     if (!LL::globalConfig.enableWelcomeText)
         return;
 
-       
-    cout << "\r" << R"(                                                                       )" << endl
-         << "\r" << R"(          _     _ _       _                    _                       )" << endl
-         << "\r" << R"(         | |   (_) |_ ___| |    ___   __ _  __| | ___ _ __             )" << endl
-         << "\r" << R"(         | |   | | __/ _ \ |   / _ \ / _` |/ _` |/ _ \ '__|            )" << endl
-         << "\r" << R"(         | |___| | ||  __/ |__| (_) | (_| | (_| |  __/ |               )" << endl
-         << "\r" << R"(         |_____|_|\__\___|_____\___/ \__,_|\__,_|\___|_|               )" << endl
-         << "\r" << R"(                                                                       )" << endl
-         << "\r" << R"(       --------   Light-Weight BDS Plugin Loader   ----------          )" << endl
-         << "\r" << R"(                                                                       )" << endl;
+
+    cout << "\r"
+         << R"(                                                                       )" << endl
+         << "\r"
+         << R"(          _     _ _       _                    _                       )" << endl
+         << "\r"
+         << R"(         | |   (_) |_ ___| |    ___   __ _  __| | ___ _ __             )" << endl
+         << "\r"
+         << R"(         | |   | | __/ _ \ |   / _ \ / _` |/ _` |/ _ \ '__|            )" << endl
+         << "\r"
+         << R"(         | |___| | ||  __/ |__| (_) | (_| | (_| |  __/ |               )" << endl
+         << "\r"
+         << R"(         |_____|_|\__\___|_____\___/ \__,_|\__,_|\___|_|               )" << endl
+         << "\r"
+         << R"(                                                                       )" << endl
+         << "\r"
+         << R"(       --------   Light-Weight BDS Plugin Loader   ----------          )" << endl
+         << "\r"
+         << R"(                                                                       )" << endl;
 }
 
 void CheckDevMode() {
@@ -154,20 +149,16 @@ void CheckDevMode() {
         logger.warn("Currently in developer mode!");
 }
 
-void CheckBetaVersion()
-{
-    if (LITELOADER_VERSION_STATUS != LL::Version::Release)
-    {
+void CheckBetaVersion() {
+    if (LITELOADER_VERSION_STATUS != LL::Version::Release) {
         logger.warn("Currently using a beta version.");
         logger.warn("PLEASE DO NOT USE IN PRODUCTION ENVIRONMENT!");
     }
 }
 
-void CheckProtocolVersion()
-{
+void CheckProtocolVersion() {
     auto currentProtocol = LL::getServerProtocolVersion();
-    if (TARGET_BDS_PROTOCOL_VERSION != currentProtocol)
-    {
+    if (TARGET_BDS_PROTOCOL_VERSION != currentProtocol) {
         logger.warn("Protocol version not match, target version: {}, current version: {}.",
                     TARGET_BDS_PROTOCOL_VERSION, currentProtocol);
         logger.warn("This will most likely crash the server, please use the LiteLoader that matches the BDS version!");
@@ -178,8 +169,7 @@ void CheckProtocolVersion()
 // extern
 extern void EndScheduleSystem();
 
-void LLMain()
-{
+void LLMain() {
     // Set global SEH-Exception handler
     _set_se_translator(seh_exception::TranslateSEHtoCE);
 
@@ -233,8 +223,7 @@ void LLMain()
     CheckDevMode();
 
     // Addon Helper
-    if (LL::globalConfig.enableAddonsHelper)
-    {
+    if (LL::globalConfig.enableAddonsHelper) {
         InitAddonsHelper();
     }
 
@@ -249,9 +238,9 @@ void LLMain()
 
     // Register Started
     Event::ServerStartedEvent::subscribe([](Event::ServerStartedEvent) {
-        logger.info("LiteLoader is distributed under the AGPLv3 License");
-        logger.info("Our new fourm is now available! -> https://fourm.litebds.com");
-        logger.info("Thanks to RhyMC (rhymc.com) for supporting this project.");
+        logger.info("LiteLoader is licensed under AGPLv3");
+        logger.info("Our new forum is live! -> https://forum.litebds.com");
+        logger.info("Thanks to RhyMC(rhymc.com) for the support");
         return true;
     });
 
@@ -263,14 +252,11 @@ void LLMain()
 }
 
 // Call LLMain
-THook(int, "main", int a, void* b)
-{
+THook(int, "main", int a, void* b) {
     startTime = clock();
     char** str = static_cast<char**>(b);
-    for (int i = 0; i < a; ++i)
-    {
-        if (strcmp(str[i], "--noColor") == 0)
-        {
+    for (int i = 0; i < a; ++i) {
+        if (strcmp(str[i], "--noColor") == 0) {
             LL::commandLineOption.noColorOption = true;
             break;
         }
diff --git a/LiteLoader/Main/Loader.cpp b/LiteLoader/Main/Loader.cpp
--- a/LiteLoader/Main/Loader.cpp
+++ b/LiteLoader/Main/Loader.cpp
@@ -19,19 +19,15 @@
 
 using namespace std;
 
-vector<std::wstring> GetPreloadList()
-{
+vector<std::wstring> GetPreloadList() {
     // 若在preload.conf中，则不加载
     vector<std::wstring> preloadList{};
 
-    if (std::filesystem::exists(std::filesystem::path(TEXT(".\\plugins\\preload.conf"))))
-    {
+    if (std::filesystem::exists(std::filesystem::path(TEXT(".\\plugins\\preload.conf")))) {
         std::wifstream dllList(TEXT(".\\plugins\\preload.conf"));
-        if (dllList)
-        {
+        if (dllList) {
             std::wstring dllName;
-            while (getline(dllList, dllName))
-            {
+            while (getline(dllList, dllName)) {
                 if (dllName.back() == TEXT('\n'))
                     dllName.pop_back();
                 if (dllName.back() == TEXT('\r'))
@@ -47,8 +43,7 @@ vector<std::wstring> GetPreloadList()
     return preloadList;
 }
 
-void CleanOldScriptEngine()
-{
+void CleanOldScriptEngine() {
     std::error_code ec;
     if (filesystem::exists("plugins/LiteXLoader", ec))
         filesystem::remove_all("plugins/LiteXLoader", ec);
@@ -58,34 +53,49 @@ void CleanOldScriptEngine()
         filesystem::remove("plugins/LiteXLoader.Lua.dll", ec);
 }
 
-void LoadScriptEngine()
-{
+void LoadScriptEngine() {
     std::string llVersion = GetFileVersionString(GetCurrentModule(), true);
-    for (string backend : LLSE_VALID_BACKENDS)
-    {
+    for (string backend : LLSE_VALID_BACKENDS) {
         std::string path = "plugins/LiteLoader/LiteLoader." + backend + ".dll";
         std::string version = GetFileVersionString(path, true);
-        if (version != llVersion)
-        {
+        if (version != llVersion) {
             logger.warn("The file version <{}> of Script Engine for {} does not match the LiteLoader version <{}>",
-                         version, backend, llVersion);
+                        version, backend, llVersion);
         }
         auto lib = LoadLibrary(str2wstr(path).c_str()); // eg. LiteLoader.Js.dll
         if (lib) {
             logger.info("* ScriptEngine for " + backend + " loaded");
             // Fake Register
             RegisterPlugin(lib, "ScriptEngine-" + backend, "ScriptEngine-" + backend, LITELOADER_VERSION,
-            {
-                {"GitHub","github.com/LiteLDev/LiteLoaderBDS"}
-            });
-        }
-        else {
+                           {{"GitHub", "https://github.com/LiteLDev/LiteLoaderBDS"}});
+        } else {
             logger.error("* Fail to load ScriptEngine for {}!", backend);
             logger.error("* Error: Code[{}] - {}", GetLastError(), GetLastErrorMessage());
         }
     }
 }
 
+void LoadDotNETEngine() {
+    logger.warn("LiteLoader.NET is not finished yet!");
+    std::string llVersion = GetFileVersionString(GetCurrentModule(), true);
+    std::string path = "plugins/LiteLoader/LiteLoader.NET.dll";
+    std::string version = GetFileVersionString(path, true);
+    if (version != llVersion) {
+        logger.warn("The file version <{}> of LiteLoader.NET does not match the LiteLoader version <{}>",
+                    version, llVersion);
+    }
+    auto lib = LoadLibrary(str2wstr(path).c_str());
+    if (lib) {
+        logger.info("* .NET Engine loaded");
+        // Fake Register
+        RegisterPlugin(lib, "LiteLoader.NET", "LiteLoader.NET", LITELOADER_VERSION,
+                       {{"GitHub", "https://github.com/LiteLDev/LiteLoader.NET"}});
+    } else {
+        logger.error("* Fail to load LiteLoader.NET!");
+        logger.error("* Error: Code[{}] - {}", GetLastError(), GetLastErrorMessage());
+    }
+}
+
 void LL::LoadMain() {
     logger.info("Loading plugins...");
 
@@ -103,34 +113,29 @@ void LL::LoadMain() {
         filesystem::path path;
         bool isShellLink = false;
 
-        if (file.is_regular_file())
-        {
+        if (file.is_regular_file()) {
             path = file.path();
-        }
-        else
+        } else
             continue;
         auto strPath = UTF82String(path.u8string());
-        if (strPath.find("LiteLoader.dll") != string::npos
-            || strPath.find("LiteXLoader") != string::npos ) // Skip Wrong file path		
+        if (strPath.find("LiteLoader") != string::npos || strPath.find("LiteXLoader") != string::npos) // Skip Wrong file path
             continue;
-        
+
         if (strPath.find("LLMoney.dll") != string::npos) {
             if (!globalConfig.enableEconomyCore) {
-				continue;
+                continue;
             }
         }
-		
+
         string ext = UTF82String(path.extension().u8string());
-        if (ext != ".dll")
-        {
+        if (ext != ".dll") {
             if (ext == ".lnk") // Shell link file
             {
                 ShellLinkFile lnk(path.wstring());
                 filesystem::path target = lnk.getPathW();
                 if (!filesystem::is_regular_file(target))
                     continue;
-                if (target.extension() != ".dll")
-                {
+                if (target.extension() != ".dll") {
                     if (scriptExts.find(ext) != scriptExts.end())
                         hasScriptPlugin = true;
                     continue;
@@ -138,9 +143,7 @@ void LL::LoadMain() {
                 logger.debug(UTF82String(target.u8string()));
                 path = target;
                 isShellLink = true;
-            }
-            else
-            {
+            } else {
                 if (scriptExts.find(ext) != scriptExts.end())
                     hasScriptPlugin = true;
                 continue;
@@ -159,30 +162,26 @@ void LL::LoadMain() {
         string pluginFileName = UTF82String(path.filename().u8string());
         auto lib = LoadLibrary(path.wstring().c_str());
         if (lib) {
-            pluginCount++;
+            ++pluginCount;
 
             if (isShellLink)
                 logger.info("ShellLink Plugin <{} => {}> loaded",
                             UTF82String(file.path().filename().u8string()), UTF82String(path.u8string()));
-            else 
+            else
                 logger.info("Plugin <{}> loaded", pluginFileName);
 
             if (PluginManager::getPlugin(lib) == nullptr) {
-                if (!RegisterPlugin(lib, pluginFileName, pluginFileName, LL::Version(1, 0, 0), {}))
-                {
+                if (!RegisterPlugin(lib, pluginFileName, pluginFileName, LL::Version(1, 0, 0), {})) {
                     logger.error("Failed to register plugin {}!", UTF82String(path.u8string()));
                     if (getPlugin(pluginFileName))
                         logger.error("A plugin named {} has been registered", pluginFileName);
                 }
             }
-        }
-        else
-        {
+        } else {
             DWORD lastError = GetLastError();
             std::string fileVersion = GetFileVersionString(UTF82String(path.u8string()), true);
             std::string info = pluginFileName;
-            if (!fileVersion.empty())
-            {
+            if (!fileVersion.empty()) {
                 info += " [" + fileVersion + "]";
             }
             logger.error("Fail to load plugin <{}>", info);
@@ -191,18 +190,25 @@ void LL::LoadMain() {
     }
 
     // Load ScriptEngine
-    if (LL::globalConfig.enableScriptEngine)
-        if(LL::globalConfig.alwaysLaunchScriptEngine || hasScriptPlugin)
+    if (LL::globalConfig.enableScriptEngine) {
+        if (LL::globalConfig.alwaysLaunchScriptEngine || hasScriptPlugin) {
             LoadScriptEngine();
+        }
+    }
+
+    // Load .NET Engine
+    if (filesystem::exists("plugins/LiteLoader/LiteLoader.NET.dll")) {
+        LoadDotNETEngine();
+    }
 
     //  Call onPostInit
     auto plugins = PluginManager::getAllPlugins(false);
-    for (auto&[name, plugin]: plugins) {
+    for (auto& [name, plugin] : plugins) {
         auto fn = GetProcAddress(plugin->handle, "onPostInit");
         if (fn) {
             try {
-                ((void (*)()) fn)();
-            } catch (std::exception &e) {
+                ((void (*)())fn)();
+            } catch (std::exception& e) {
                 std::string fileVersion = GetFileVersionString(plugin->handle, true);
                 std::string info = name;
                 if (!fileVersion.empty()) {
@@ -211,13 +217,10 @@ void LL::LoadMain() {
                 logger.error("Plugin [{}] throws an std::exception in onPostInit", info);
                 logger.error("Exception: {}", TextEncoding::toUTF8(e.what()));
                 logger.error("Fail to init this plugin!");
-            }
-            catch (...)
-            {
+            } catch (...) {
                 std::string fileVersion = GetFileVersionString(plugin->handle, true);
                 std::string info = name;
-                if (!fileVersion.empty())
-                {
+                if (!fileVersion.empty()) {
                     info += "<" + fileVersion + ">";
                 }
                 logger.error("Plugin [{}] throws an exception in onPostInit", info);
diff --git a/LiteLoader/Main/Loader.h b/LiteLoader/Main/Loader.h
--- a/LiteLoader/Main/Loader.h
+++ b/LiteLoader/Main/Loader.h
@@ -1,7 +1,6 @@
 #pragma once
 #include <string>
 
-namespace LL
-{
+namespace LL {
 void LoadMain();
 } // namespace LL
diff --git a/LiteLoader/Main/ModifyInfomation.cpp b/LiteLoader/Main/ModifyInfomation.cpp
--- a/LiteLoader/Main/ModifyInfomation.cpp
+++ b/LiteLoader/Main/ModifyInfomation.cpp
@@ -9,17 +9,14 @@ using namespace std;
 
 Logger serverLogger("Server");
 extern void CheckBetaVersion();
-THook(std::string, "?getServerVersionString@Common@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ")
-{
+THook(std::string, "?getServerVersionString@Common@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ") {
     CheckBetaVersion();
-    return original() + "(ProtocolVersion " + to_string(LL::getServerProtocolVersion()) + ") with " + fmt::format(LL::globalConfig.colorLog ?fg(fmt::color::light_sky_blue) | fmt::emphasis::bold | fmt::emphasis::italic : fmt::text_style() , "LiteLoaderBDS " + LL::getLoaderVersion().toString(true));
+    return original() + "(ProtocolVersion " + to_string(LL::getServerProtocolVersion()) + ") with " + fmt::format(LL::globalConfig.colorLog ? fg(fmt::color::light_sky_blue) | fmt::emphasis::bold | fmt::emphasis::italic : fmt::text_style(), "LiteLoaderBDS " + LL::getLoaderVersion().toString(true));
 }
 
 
-string& replace_all_distinct(string& str, const string& old_value, const string& new_value)
-{
-    for (string::size_type pos(0); pos != string::npos; pos += new_value.length())
-    {
+string& replace_all_distinct(string& str, const string& old_value, const string& new_value) {
+    for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) {
         if ((pos = str.find(old_value, pos)) != string::npos)
             str.replace(pos, old_value.length(), new_value);
         else
@@ -29,12 +26,10 @@ string& replace_all_distinct(string& str, const string& old_value, const string&
 }
 
 // Standardize BDS's output
-THook(void, "?PlatformBedrockLogOut@@YAXIPEBD@Z", int a1, const char* ts)
-{
+THook(void, "?PlatformBedrockLogOut@@YAXIPEBD@Z", int a1, const char* ts) {
     string input = ts;
     input.erase(std::remove(input.begin(), input.end(), '\n'), input.end());
-    switch (a1)
-    {
+    switch (a1) {
         case 1u:
             serverLogger.debug << input << Logger::endl;
             break;
@@ -53,39 +48,32 @@ THook(void, "?PlatformBedrockLogOut@@YAXIPEBD@Z", int a1, const char* ts)
     }
 }
 
-//Block BDS from adding LOG metadata
+// Block BDS from adding LOG metadata
 THook(void, "?_appendLogEntryMetadata@LogDetails@BedrockLog@@AEAAXAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V34@W4LogAreaID@@I1HH@Z",
-    void* a1, void* a2, void** a3, int a4, unsigned int a5, __int64 a6, unsigned int a7, unsigned int a8)
-{
+      void* a1, void* a2, void** a3, int a4, unsigned int a5, __int64 a6, unsigned int a7, unsigned int a8) {
     return;
 }
 
 #include "LiteLoader.h"
 #include <MC/BedrockLog.hpp>
-namespace ModifyInfomation
-{
-    int telemetryText = 0;
+namespace ModifyInfomation {
+int telemetryText = 0;
 }
-    THook(void, "?log@BedrockLog@@YAXW4LogCategory@1@V?$bitset@$02@std@@W4LogRule@1@W4LogAreaID@@IPEBDH4ZZ",
-      enum BedrockLog::LogCategory a1, class std::bitset<3> a2, enum BedrockLog::LogRule a3, enum LogAreaID a4, unsigned int a5, char const* a6, int a7, char const* a8, ...)
-{
+THook(void, "?log@BedrockLog@@YAXW4LogCategory@1@V?$bitset@$02@std@@W4LogRule@1@W4LogAreaID@@IPEBDH4ZZ",
+      enum BedrockLog::LogCategory a1, class std::bitset<3> a2, enum BedrockLog::LogRule a3, enum LogAreaID a4, unsigned int a5, char const* a6, int a7, char const* a8, ...) {
     va_list va;
     auto text = (char*)a8;
     va_start(va, a8);
-    if (string(text).find("= TELEMETRY MESSAGE =") != string(text).npos)
-    {
-        ModifyInfomation::telemetryText = 6;  
+    if (string(text).find("= TELEMETRY MESSAGE =") != string(text).npos) {
+        ModifyInfomation::telemetryText = 6;
         return BedrockLog::log_va(a1, a2, a3, a4, a5, a6, a7, "To enable Server Telemetry, add the line 'emit-server-telemetry=true' to the server.properties file in the bds directory", va);
     }
-	if (ModifyInfomation::telemetryText > 0)
-	{
-		ModifyInfomation::telemetryText--;
-		return;
-	}
-	
-    if (string(text).find("setting up server logging...") != string(text).npos 
-        || string(text).find("Server started") != string(text).npos)
-    {
+    if (ModifyInfomation::telemetryText > 0) {
+        ModifyInfomation::telemetryText--;
+        return;
+    }
+
+    if (string(text).find("setting up server logging...") != string(text).npos || string(text).find("Server started") != string(text).npos) {
         return;
     }
     return BedrockLog::log_va(a1, a2, a3, a4, a5, a6, a7, a8, va);
@@ -96,24 +84,20 @@ namespace ModifyInfomation
 #include <MC/CommandOutput.hpp>
 extern std::unordered_map<CommandOrigin const*, string*> resultOfOrigin;
 TClasslessInstanceHook(void*, "?send@CommandOutputSender@@UEAAXAEBVCommandOrigin@@AEBVCommandOutput@@@Z",
-                       class CommandOrigin const& origin, class CommandOutput const& output)
-{
+                       class CommandOrigin const& origin, class CommandOutput const& output) {
     std::stringbuf tmpBuf;
     auto oldBuf = std::cout.rdbuf();
     std::cout.rdbuf(&tmpBuf);
     auto rv = original(this, origin, output);
     std::cout.rdbuf(oldBuf);
-    if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id())
-    {
+    if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) {
         logger.warn("The thread executing the CommandOutputSender::send is not the \"MC_SERVER\" thread");
         logger.warn("Output: {}", tmpBuf.str());
     }
 
     auto it = resultOfOrigin.find(&origin);
-    if (it != resultOfOrigin.end())
-    {
-        try
-        {
+    if (it != resultOfOrigin.end()) {
+        try {
             // May crash for incomprehensible reasons
             it->second->assign(tmpBuf.str());
             while (it->second->size() && (it->second->back() == '\n' || it->second->back() == '\r'))
@@ -121,11 +105,8 @@ TClasslessInstanceHook(void*, "?send@CommandOutputSender@@UEAAXAEBVCommandOrigin
             it->second = nullptr;
             resultOfOrigin.erase(it);
             return rv;
-        }
-        catch (...)
-        {
-            if (LL::isDebugMode())
-            {
+        } catch (...) {
+            if (LL::isDebugMode()) {
                 logger.warn("Output: {}", tmpBuf.str());
                 logger.warn("size of resultOfOrigin: {}", resultOfOrigin.size());
             }
@@ -137,8 +118,7 @@ TClasslessInstanceHook(void*, "?send@CommandOutputSender@@UEAAXAEBVCommandOrigin
     auto& log = output.getSuccessCount() > 0 ? serverLogger.info : serverLogger.error;
     std::istringstream iss(tmpBuf.str());
     string line;
-    while (getline(iss, line))
-    {
+    while (getline(iss, line)) {
         if (LL::globalConfig.colorLog)
             log << ColorFormat::convertToColsole(line, false) << Logger::endl;
         else
diff --git a/LiteLoader/Main/PlayerInfoAPI.cpp b/LiteLoader/Main/PlayerInfoAPI.cpp
--- a/LiteLoader/Main/PlayerInfoAPI.cpp
+++ b/LiteLoader/Main/PlayerInfoAPI.cpp
@@ -11,139 +11,136 @@ std::unique_ptr<SQLite::Database> db;
 
 
 namespace PlayerInfo {
-    std::string getVal(std::string name, unsigned short type) { //type: 0=XUID 1=UUID
-        if (name == "")
-            return "";
-        try {
-            std::string val;
-            if (type == 0) { //XUID
-                SQLite::Statement get{*db, "select XUID from player where NAME=?"};
-                get.bindNoCopy(1, name);
-                while (get.executeStep()) {
-                    val = get.getColumn(0).getText();
-                }
-                get.reset();
-                get.clearBindings();
-            } else { //UUID
-                SQLite::Statement get{*db, "select UUID from player where NAME=?"};
-                get.bindNoCopy(1, name);
-                while (get.executeStep()) {
-                    val = get.getColumn(0).getText();
-                }
-                get.reset();
-                get.clearBindings();
+std::string getVal(std::string name, unsigned short type) { // type: 0=XUID 1=UUID
+    if (name == "")
+        return "";
+    try {
+        std::string val;
+        if (type == 0) { // XUID
+            SQLite::Statement get{*db, "select XUID from player where NAME=?"};
+            get.bindNoCopy(1, name);
+            while (get.executeStep()) {
+                val = get.getColumn(0).getText();
             }
-
-            return val;
-        } catch (std::exception const &e) {
-            logger.error("DB Error: {}", e.what());
-            return "";
+            get.reset();
+            get.clearBindings();
+        } else { // UUID
+            SQLite::Statement get{*db, "select UUID from player where NAME=?"};
+            get.bindNoCopy(1, name);
+            while (get.executeStep()) {
+                val = get.getColumn(0).getText();
+            }
+            get.reset();
+            get.clearBindings();
         }
+
+        return val;
+    } catch (std::exception const& e) {
+        logger.error("DB Error: {}", e.what());
+        return "";
     }
+}
 
-    bool insert(std::string name, std::string xuid, std::string uuid) {
-        if (name == "" || xuid == "" || uuid == "") {
+bool insert(std::string name, std::string xuid, std::string uuid) {
+    if (name == "" || xuid == "" || uuid == "") {
+        return false;
+    }
+    if (getVal(name, 0) == "") {
+        try {
+            SQLite::Statement st{*db, "insert into player values (?,?,?)"};
+            st.bindNoCopy(1, name);
+            st.bindNoCopy(2, xuid);
+            st.bindNoCopy(3, uuid);
+            st.exec();
+            st.reset();
+            st.clearBindings();
+        } catch (std::exception const& e) {
+            logger.error("DB Error: {}", e.what());
             return false;
         }
-        if (getVal(name, 0) == "") {
-            try {
-                SQLite::Statement st{*db, "insert into player values (?,?,?)"};
-                st.bindNoCopy(1, name);
-                st.bindNoCopy(2, xuid);
-                st.bindNoCopy(3, uuid);
-                st.exec();
-                st.reset();
-                st.clearBindings();
-            }
-            catch (std::exception const &e) {
-                logger.error("DB Error: {}", e.what());
-                return false;
-            }
-        } else {
-            try {
-                db->exec("begin");
-                SQLite::Statement st{*db, "update player set XUID=? where NAME=?"};
-                st.bindNoCopy(2, name);
-                st.bindNoCopy(1, xuid);
-                st.exec();
-                st.reset();
-                st.clearBindings();
-                SQLite::Statement stUUID{*db, "update player set UUID=? where NAME=?"};
-                stUUID.bindNoCopy(2, name);
-                stUUID.bindNoCopy(1, uuid);
-                stUUID.exec();
-                stUUID.reset();
-                stUUID.clearBindings();
-                db->exec("commit");
-            } catch (std::exception const &e) {
-                logger.error("DB Error: {}", e.what());
-                return false;
-            }
+    } else {
+        try {
+            db->exec("begin");
+            SQLite::Statement st{*db, "update player set XUID=? where NAME=?"};
+            st.bindNoCopy(2, name);
+            st.bindNoCopy(1, xuid);
+            st.exec();
+            st.reset();
+            st.clearBindings();
+            SQLite::Statement stUUID{*db, "update player set UUID=? where NAME=?"};
+            stUUID.bindNoCopy(2, name);
+            stUUID.bindNoCopy(1, uuid);
+            stUUID.exec();
+            stUUID.reset();
+            stUUID.clearBindings();
+            db->exec("commit");
+        } catch (std::exception const& e) {
+            logger.error("DB Error: {}", e.what());
+            return false;
         }
-        return true;
     }
+    return true;
+}
 
-    std::string getXuid(std::string name) {
-        return getVal(name, 0);
-    }
+std::string getXuid(std::string name) {
+    return getVal(name, 0);
+}
 
-    std::string getUUID(std::string name) {
-        return getVal(name, 1);
-    }
+std::string getUUID(std::string name) {
+    return getVal(name, 1);
+}
 
-    std::string getName(unsigned short type, std::string val) {
-        if (val == "")
-            return "";
-        try {
-            std::string out;
-            if (type == 0) {
-                SQLite::Statement get{*db, "select NAME from player where XUID=?"};
-                get.bindNoCopy(1, val);
-                while (get.executeStep()) {
-                    out = get.getColumn(0).getText();
-                }
-                get.reset();
-                get.clearBindings();
-            } else {
-                SQLite::Statement get{*db, "select NAME from player where UUID=?"};
-                get.bindNoCopy(1, val);
-                while (get.executeStep()) {
-                    out = get.getColumn(0).getText();
-                }
-                get.reset();
-                get.clearBindings();
+std::string getName(unsigned short type, std::string val) {
+    if (val == "")
+        return "";
+    try {
+        std::string out;
+        if (type == 0) {
+            SQLite::Statement get{*db, "select NAME from player where XUID=?"};
+            get.bindNoCopy(1, val);
+            while (get.executeStep()) {
+                out = get.getColumn(0).getText();
             }
-            return out;
-        } catch (std::exception const &e) {
-            logger.error("DB Error: {}", e.what());
-            return "";
+            get.reset();
+            get.clearBindings();
+        } else {
+            SQLite::Statement get{*db, "select NAME from player where UUID=?"};
+            get.bindNoCopy(1, val);
+            while (get.executeStep()) {
+                out = get.getColumn(0).getText();
+            }
+            get.reset();
+            get.clearBindings();
         }
+        return out;
+    } catch (std::exception const& e) {
+        logger.error("DB Error: {}", e.what());
+        return "";
     }
+}
 
-    std::string fromXuid(std::string xuid) {
-        return getName(0, xuid);
-    }
+std::string fromXuid(std::string xuid) {
+    return getName(0, xuid);
+}
 
-    std::string fromUUID(std::string uuid) {
-        return getName(1, uuid);
-    }
+std::string fromUUID(std::string uuid) {
+    return getName(1, uuid);
+}
 
-    void forEachInfo(std::function<bool(std::string_view name, std::string_view xuid, std::string_view uuid)> callback)
-    {
-        SQLite::Statement get{*db, "select NAME, XUID, UUID from player"};
-        while (get.executeStep())
-        {
-            auto name = get.getColumn(0).getText();
-            auto xuid = get.getColumn(1).getText();
-            auto uuid = get.getColumn(2).getText();
-            if (!callback(name, xuid, uuid))
-                break;
-        }
-        get.reset();
-        get.clearBindings();
+void forEachInfo(std::function<bool(std::string_view name, std::string_view xuid, std::string_view uuid)> callback) {
+    SQLite::Statement get{*db, "select NAME, XUID, UUID from player"};
+    while (get.executeStep()) {
+        auto name = get.getColumn(0).getText();
+        auto xuid = get.getColumn(1).getText();
+        auto uuid = get.getColumn(2).getText();
+        if (!callback(name, xuid, uuid))
+            break;
     }
+    get.reset();
+    get.clearBindings();
+}
 
-    } // namespace PlayerDB
+} // namespace PlayerInfo
 
 bool InitPlayerDatabase() {
     using namespace PlayerInfo;
@@ -151,21 +148,21 @@ bool InitPlayerDatabase() {
         db = std::make_unique<SQLite::Database>(PlayerDatabasePath, SQLite::OPEN_CREATE | SQLite::OPEN_READWRITE);
 
         db->exec("CREATE TABLE IF NOT EXISTS player ( \
-			NAME TEXT PRIMARY KEY \
+            NAME TEXT PRIMARY KEY \
             NOT NULL, \
-			XUID TEXT \
+            XUID TEXT \
             NOT NULL, \
             UUID TEXT \
             NOT NULL \
-		) \
-			WITHOUT ROWID; ");
+        ) \
+            WITHOUT ROWID; ");
 
-        Event::PlayerJoinEvent::subscribe([](const Event::PlayerJoinEvent &e) {
+        Event::PlayerJoinEvent::subscribe([](const Event::PlayerJoinEvent& e) {
             if (!e.mPlayer->isSimulatedPlayer())
                 insert(e.mPlayer->getRealName(), e.mPlayer->getXuid(), e.mPlayer->getUuid());
             return true;
         });
-    } catch (std::exception const &e) {
+    } catch (std::exception const& e) {
         logger.error("Read PlayerDB Error: {}", e.what());
         return false;
     }
diff --git a/LiteLoader/Main/PluginManager.cpp b/LiteLoader/Main/PluginManager.cpp
--- a/LiteLoader/Main/PluginManager.cpp
+++ b/LiteLoader/Main/PluginManager.cpp
@@ -19,40 +19,31 @@ extern Logger logger;
 std::unordered_map<std::string, LL::Plugin> plugins;
 
 bool LL::PluginManager::registerPlugin(HMODULE handle, std::string name, std::string desc, LL::Version version,
-                    std::map<std::string, std::string> others)
-{
-    if (handle != nullptr)             // DLL Plugin
+                                       std::map<std::string, std::string> others) {
+    if (handle != nullptr) // DLL Plugin
     {
-        if (getPlugin(handle) != nullptr)
-        {
-            erase_if(plugins, [&handle](auto& data) {               // Allow plugins to overwrite their own plugin registory
+        if (getPlugin(handle) != nullptr) {
+            erase_if(plugins, [&handle](auto& data) { // Allow plugins to overwrite their own plugin registory
                 return data.second.handle == handle;
-            });                           
-        }
-        else if (getPlugin(name) != nullptr) {
-            return false;                                      // Reject overwriting other's data
+            });
+        } else if (getPlugin(name) != nullptr) {
+            return false; // Reject overwriting other's data
         }
     }
 
     LL::Plugin plugin{name, desc, version, others};
     plugin.handle = handle;
-    try
-    {
+    try {
         plugin.type = others.at("PluginType") == "Script Plugin" ? Plugin::PluginType::ScriptPlugin : Plugin::PluginType::DllPlugin;
         others.erase("PluginType");
-    }
-    catch (...)
-    {
+    } catch (...) {
         plugin.type = handle ? Plugin::PluginType::DllPlugin : Plugin::PluginType::ScriptPlugin;
     }
 
-    try
-    {
+    try {
         plugin.filePath = UTF82String(filesystem::path(str2wstr(others.at("PluginFilePath"))).lexically_normal().u8string());
         others.erase("PluginFilePath");
-    }
-    catch (...)
-    {
+    } catch (...) {
         if (handle)
             plugin.filePath = GetModulePath(handle);
     }
@@ -61,15 +52,11 @@ bool LL::PluginManager::registerPlugin(HMODULE handle, std::string name, std::st
     return true;
 }
 
-bool LL::PluginManager::unRegisterPlugin(std::string name)
-{
+bool LL::PluginManager::unRegisterPlugin(std::string name) {
     auto plugin = getPlugin(name);
-    if (plugin == nullptr)
-    { 
+    if (plugin == nullptr) {
         return false;
-    }
-    else
-    {
+    } else {
         plugins.erase(plugin->name);
         return true;
     }
@@ -78,8 +65,7 @@ bool LL::PluginManager::unRegisterPlugin(std::string name)
 // Helper
 LL::Plugin* GetPlugin_Raw(std::string name, bool includeScriptPlugin) {
     for (auto& it : plugins) {
-        if (it.second.name == name || UTF82String(filesystem::path(str2wstr(it.second.filePath)).filename().u8string()) == name)
-        {
+        if (it.second.name == name || UTF82String(filesystem::path(str2wstr(it.second.filePath)).filename().u8string()) == name) {
             if (!includeScriptPlugin && it.second.type == LL::Plugin::PluginType::ScriptPlugin)
                 continue;
             return &it.second;
@@ -122,8 +108,7 @@ bool LL::PluginManager::hasPlugin(std::string name, bool includeScriptPlugin) {
 
 std::unordered_map<std::string, LL::Plugin*> LL::PluginManager::getAllPlugins(bool includeScriptPlugin) {
     std::unordered_map<std::string, LL::Plugin*> res;
-    for (auto& [k, v] : plugins)
-    {
+    for (auto& [k, v] : plugins) {
         if (!includeScriptPlugin && v.type == Plugin::PluginType::ScriptPlugin)
             continue;
         res[k] = &v;
@@ -131,19 +116,16 @@ std::unordered_map<std::string, LL::Plugin*> LL::PluginManager::getAllPlugins(bo
     return res;
 }
 
-bool LL::PluginManager::loadPlugin(string pluginFilePath, bool outputResult, bool isHotLoad)
-{
+bool LL::PluginManager::loadPlugin(string pluginFilePath, bool outputResult, bool isHotLoad) {
     // if (!LL::isDebugMode())
     //     return false;
-    try
-    {
+    try {
         filesystem::path path(filesystem::path(str2wstr(pluginFilePath)).lexically_normal());
-        pluginFilePath = UTF82String( path.u8string());
+        pluginFilePath = UTF82String(path.u8string());
 
         string ext = UTF82String(path.extension().u8string());
-        if (ext != ".dll")
-        {
-            if (LLSE_VALID_PLUGIN_EXTENSIONS.find(ext) != LLSE_VALID_PLUGIN_EXTENSIONS.end())   //LLSE Script Plugin
+        if (ext != ".dll") {
+            if (LLSE_VALID_PLUGIN_EXTENSIONS.find(ext) != LLSE_VALID_PLUGIN_EXTENSIONS.end()) // LLSE Script Plugin
             {
                 Event::ScriptPluginManagerEvent ev;
                 ev.operation = Event::ScriptPluginManagerEvent::Operation::Load;
@@ -152,15 +134,12 @@ bool LL::PluginManager::loadPlugin(string pluginFilePath, bool outputResult, boo
                 ev.call();
 
                 return ev.success;
-            }
-            else if (outputResult)
+            } else if (outputResult)
                 logger.error("You need to give a correct type of file!");
             return false;
         }
 
-        if (pluginFilePath.find("/") == string::npos && pluginFilePath.find("\\") == string::npos
-            && loadPlugin("plugins/" + pluginFilePath))
-        {
+        if (pluginFilePath.find("/") == string::npos && pluginFilePath.find("\\") == string::npos && loadPlugin("plugins/" + pluginFilePath)) {
             if (outputResult)
                 logger.error("No valid plugin found at {}!", pluginFilePath);
             return false;
@@ -168,20 +147,16 @@ bool LL::PluginManager::loadPlugin(string pluginFilePath, bool outputResult, boo
 
         string pluginFileName = UTF82String(path.filename().u8string());
         auto lib = LoadLibrary(str2wstr(pluginFilePath).c_str());
-        if (lib)
-        {
+        if (lib) {
             if (getPlugin(lib) == nullptr) {
-                if (!RegisterPlugin(lib, pluginFileName, pluginFileName, LL::Version(1, 0, 0), {}))
-                {
+                if (!RegisterPlugin(lib, pluginFileName, pluginFileName, LL::Version(1, 0, 0), {})) {
                     logger.error("Failed to register plugin {}!", pluginFilePath);
                     if (getPlugin(pluginFileName))
                         logger.error("A plugin named {} has been registered", pluginFileName);
                     return false;
                 }
             };
-        }
-        else
-        {
+        } else {
             if (outputResult)
                 logger.error("Fail to load the plugin {}!", pluginFileName);
             return false;
@@ -193,74 +168,58 @@ bool LL::PluginManager::loadPlugin(string pluginFilePath, bool outputResult, boo
         auto fn = GetProcAddress(getPlugin(lib)->handle, "onPostInit");
         if (fn) {
             try {
-                ((void (*)()) fn)();
+                ((void (*)())fn)();
                 return true;
-            }
-            catch (std::exception& e) {
-                if (outputResult)
-                {
+            } catch (std::exception& e) {
+                if (outputResult) {
                     logger.error("Plugin <{}> throws an std::exception in onPostInit", pluginFileName);
                     logger.error("Exception: ", TextEncoding::toUTF8(e.what()));
                     logger.error("Fail to init this plugin!");
                 }
                 return false;
-            }
-            catch (...) {
-                if (outputResult)
-                {
+            } catch (...) {
+                if (outputResult) {
                     logger.error("Plugin <{}> throws an exception in onPostInit", pluginFileName);
                     logger.error("Fail to init this plugin!");
                 }
                 return false;
             }
-        }
-        else if (outputResult)
-        {
+        } else if (outputResult) {
             logger.error("Fail to get the initialize point of the plugin {}!", pluginFileName);
             return false;
         }
 
-        //Hot Load
-        if (isHotLoad)
-        {
+        // Hot Load
+        if (isHotLoad) {
             callEventAtHotLoad(getPlugin(lib)->name);
         }
         return true;
-    }
-    catch (const std::exception& e)
-    {
-        if (outputResult)
-        {
+    } catch (const std::exception& e) {
+        if (outputResult) {
             logger.error("Error occurred when loading plugin {}!", pluginFilePath);
             logger.error(TextEncoding::toUTF8(e.what()));
         }
         return false;
-    }
-    catch (...)
-    {
-        if (outputResult)
-        {
+    } catch (...) {
+        if (outputResult) {
             logger.error("Error occurred when loading plugin {}!", pluginFilePath);
         }
         return false;
     }
 }
 
-bool LL::PluginManager::unloadPlugin(string pluginName, bool outputResult)
-{
+bool LL::PluginManager::unloadPlugin(string pluginName, bool outputResult) {
     // if (!LL::isDebugMode())
     //     return false;
-    try
-    {
+    try {
         LL::Plugin* plugin = getPlugin(pluginName);
-        if (!plugin)
-        {
+        if (!plugin) {
             if (outputResult)
                 logger.error("No match plugin found!");
             return false;
         }
 
-        if (plugin->type == Plugin::PluginType::ScriptPlugin)        //Script Plugin
+        if (plugin->type == Plugin::PluginType::ScriptPlugin) // Script Plugin
         {
             Event::ScriptPluginManagerEvent ev;
             ev.operation = Event::ScriptPluginManagerEvent::Operation::Unload;
@@ -271,48 +230,39 @@ bool LL::PluginManager::unloadPlugin(string pluginName, bool outputResult)
             return ev.success;
         }
 
-        //Hot unload
-        //callEventAtHotUnload(pluginName);
-        //unRegisterPlugin(pluginName);
-        //removeAllEventListeners(pluginName);
+        // Hot unload
+        // callEventAtHotUnload(pluginName);
+        // unRegisterPlugin(pluginName);
+        // removeAllEventListeners(pluginName);
 
-        logger.warn("Unload function of dll plugins has not been finished.");                    //TODO
+        logger.warn("Unload function of dll plugins has not been finished."); // TODO
         return false;
-    }
-    catch (const std::exception& e)
-    {
-        if (outputResult)
-        {
+    } catch (const std::exception& e) {
+        if (outputResult) {
             logger.error("Error occurred when unloading plugin {}!", pluginName);
             logger.error(TextEncoding::toUTF8(e.what()));
         }
         return false;
-    }
-    catch (...)
-    {
-        if (outputResult)
-        {
+    } catch (...) {
+        if (outputResult) {
             logger.error("Error occurred when unloading plugin {}!", pluginName);
         }
         return false;
     }
 }
 
-bool LL::PluginManager::reloadPlugin(string pluginName, bool outputResult)
-{
+bool LL::PluginManager::reloadPlugin(string pluginName, bool outputResult) {
     // if (!LL::isDebugMode())
     //     return false;
-    try
-    {
+    try {
         LL::Plugin* plugin = getPlugin(pluginName);
-        if (!plugin)
-        {
+        if (!plugin) {
             if (outputResult)
                 logger.error("No match plugin found!");
             return false;
         }
 
-        if (plugin->type == Plugin::PluginType::ScriptPlugin)        //Script Plugin
+        if (plugin->type == Plugin::PluginType::ScriptPlugin) // Script Plugin
         {
             Event::ScriptPluginManagerEvent ev;
             ev.operation = Event::ScriptPluginManagerEvent::Operation::Reload;
@@ -327,40 +277,30 @@ bool LL::PluginManager::reloadPlugin(string pluginName, bool outputResult)
             return false;
         return loadPlugin(path);*/
 
-        logger.warn("Reload function of dll plugins has not been finished.");                    //TODO
+        logger.warn("Reload function of dll plugins has not been finished."); // TODO
         return false;
-    }
-    catch (const std::exception& e)
-    {
-        if (outputResult)
-        {
+    } catch (const std::exception& e) {
+        if (outputResult) {
             logger.error("Error occurred when reloading plugin {}!", pluginName);
             logger.error(TextEncoding::toUTF8(e.what()));
         }
         return false;
-    }
-    catch (...)
-    {
-        if (outputResult)
-        {
+    } catch (...) {
+        if (outputResult) {
             logger.error("Error occurred when reloading plugin {}!", pluginName);
         }
         return false;
     }
 }
 
-int LL::PluginManager::reloadAllPlugins(bool outputResult)
-{
+int LL::PluginManager::reloadAllPlugins(bool outputResult) {
     // if (!LL::isDebugMode())
     //     return false;
-    try
-    {
+    try {
         auto plugins = getAllPlugins(true);
         int cnt = 0;
-        for (auto& [name, plugin] : plugins)
-        {
-            if (plugin->type == Plugin::PluginType::ScriptPlugin)
-            {
+        for (auto& [name, plugin] : plugins) {
+            if (plugin->type == Plugin::PluginType::ScriptPlugin) {
                 Event::ScriptPluginManagerEvent ev;
                 ev.operation = Event::ScriptPluginManagerEvent::Operation::Reload;
                 ev.target = plugin->name;
@@ -369,9 +309,7 @@ int LL::PluginManager::reloadAllPlugins(bool outputResult)
 
                 if (ev.success)
                     ++cnt;
-            }
-            else
-            {
+            } else {
                 if (reloadPlugin(name))
                     ++cnt;
                 else
@@ -379,37 +317,30 @@ int LL::PluginManager::reloadAllPlugins(bool outputResult)
             }
         }
         return cnt;
-    }
-    catch (const std::exception& e)
-    {
-        if (outputResult)
-        {
+    } catch (const std::exception& e) {
+        if (outputResult) {
             logger.error("Error occurred when reloading all plugins!");
             logger.error(TextEncoding::toUTF8(e.what()));
         }
         return false;
-    }
-    catch (...)
-    {
-        if (outputResult)
-        {
+    } catch (...) {
+        if (outputResult) {
             logger.error("Error occurred when reloading all plugins!");
         }
         return false;
     }
 }
 
-bool LL::PluginManager::callEventAtHotLoad(std::string pluginName)
-{
+bool LL::PluginManager::callEventAtHotLoad(std::string pluginName) {
     // if (!LL::isDebugMode())
     //     return false;
     Schedule::nextTick([pluginName]() {
-        Event::ServerStartedEvent().callToPlugin(pluginName);       // ServerStartedEvent
+        Event::ServerStartedEvent().callToPlugin(pluginName); // ServerStartedEvent
     });
 
     Schedule::delay([pluginName]() {
         auto players = Level::getAllPlayers();
-        for (auto& pl : players)                        // PlayerPreJoinEvent
+        for (auto& pl : players) // PlayerPreJoinEvent
         {
             Event::PlayerPreJoinEvent ev;
             ev.mPlayer = pl;
@@ -417,22 +348,22 @@ bool LL::PluginManager::callEventAtHotLoad(std::string pluginName)
             ev.mIP = pl->getIP();
             ev.callToPlugin(pluginName);
         }
-        for (auto& pl : players)                        // PlayerJoinEvent
+        for (auto& pl : players) // PlayerJoinEvent
         {
             Event::PlayerJoinEvent ev;
             ev.mPlayer = pl;
             ev.callToPlugin(pluginName);
         }
-    }, 20);
+    },
+                    20);
     return true;
 }
 
-bool LL::PluginManager::callEventAtHotUnload(std::string pluginName)
-{
+bool LL::PluginManager::callEventAtHotUnload(std::string pluginName) {
     // if (!LL::isDebugMode())
     //     return false;
     auto players = Level::getAllPlayers();
-    for (auto& pl : players)                        // PlayerLeftEvent
+    for (auto& pl : players) // PlayerLeftEvent
     {
         Event::PlayerLeftEvent ev;
         ev.mPlayer = pl;
@@ -440,14 +371,13 @@ bool LL::PluginManager::callEventAtHotUnload(std::string pluginName)
         ev.callToPlugin(pluginName);
     }
 
-    Event::ServerStoppedEvent().callToPlugin(pluginName);       // ServerStoppedEvent
+    Event::ServerStoppedEvent().callToPlugin(pluginName); // ServerStoppedEvent
     return true;
 }
 
-//Helper
+// Helper
 LIAPI bool RegisterPlugin(HMODULE handle, std::string name, std::string desc, LL::Version version,
-    std::map<std::string, std::string> others)
-{
+                          std::map<std::string, std::string> others) {
     others["PluginType"] = "DLL Plugin";
     others["PluginFilePath"] = handle ? GetModulePath(handle) : name;
     return LL::PluginManager::registerPlugin(handle, name, desc, version, others);
diff --git a/LiteLoader/Main/PluginManager.h b/LiteLoader/Main/PluginManager.h
--- a/LiteLoader/Main/PluginManager.h
+++ b/LiteLoader/Main/PluginManager.h
@@ -4,34 +4,31 @@
 #include <string>
 #include <unordered_map>
 
-namespace LL
-{
-    struct Plugin;
-    struct Version;
+namespace LL {
+struct Plugin;
+struct Version;
 
-    class PluginManager
-    {
-        static bool callEventAtHotLoad(std::string pluginName);
-        static bool callEventAtHotUnload(std::string pluginName);
+class PluginManager {
+    static bool callEventAtHotLoad(std::string pluginName);
+    static bool callEventAtHotUnload(std::string pluginName);
 
-    public:
-        static LIAPI bool registerPlugin(HMODULE handle, std::string name, std::string desc,
-            LL::Version version, std::map<std::string, std::string> others);
+public:
+    static LIAPI bool registerPlugin(HMODULE handle, std::string name, std::string desc,
+                                     LL::Version version, std::map<std::string, std::string> others);
 
-        static LIAPI LL::Plugin* getPlugin(HMODULE handle);
-        static LIAPI LL::Plugin* getPlugin(std::string name, bool includeScriptPlugin = true);
-        static LIAPI bool hasPlugin(std::string name, bool includeScriptPlugin = true);
-        static LIAPI std::unordered_map<std::string, LL::Plugin*> getAllPlugins(bool includeScriptPlugin = true);
+    static LIAPI LL::Plugin* getPlugin(HMODULE handle);
+    static LIAPI LL::Plugin* getPlugin(std::string name, bool includeScriptPlugin = true);
+    static LIAPI bool hasPlugin(std::string name, bool includeScriptPlugin = true);
+    static LIAPI std::unordered_map<std::string, LL::Plugin*> getAllPlugins(bool includeScriptPlugin = true);
 
-        static bool loadPlugin(std::string pluginFilePath, bool outputStatus = false, bool isHotLoad = false);
-        static bool unloadPlugin(std::string pluginName, bool outputStatus = false);
-        static bool reloadPlugin(std::string pluginName, bool outputStatus = false);
-        static int reloadAllPlugins(bool outputStatus = false);
+    static bool loadPlugin(std::string pluginFilePath, bool outputStatus = false, bool isHotLoad = false);
+    static bool unloadPlugin(std::string pluginName, bool outputStatus = false);
+    static bool reloadPlugin(std::string pluginName, bool outputStatus = false);
+    static int reloadAllPlugins(bool outputStatus = false);
 
-        static LIAPI bool unRegisterPlugin(std::string name);
-    };
-}
+    static LIAPI bool unRegisterPlugin(std::string name);
+};
+} // namespace LL
 
 LIAPI bool RegisterPlugin(HMODULE handle, std::string name, std::string desc, LL::Version version,
-    std::map<std::string, std::string> others);
-
+                          std::map<std::string, std::string> others);
diff --git a/LiteLoader/Main/SEHProtection.cpp b/LiteLoader/Main/SEHProtection.cpp
--- a/LiteLoader/Main/SEHProtection.cpp
+++ b/LiteLoader/Main/SEHProtection.cpp
@@ -18,12 +18,12 @@ bool seSetForMinecraftUpdate = false;
 THook2("SEHPROTECT",void, "?tick@ServerLevel@@UEAAXXZ",
     void* _this)
 {
-	if (!seSetForServerLevelTick)
-	{
-		_set_se_translator(seh_exception::TranslateSEHtoCE);
-		seSetForServerLevelTick = true;
-	}
-		
+    if (!seSetForServerLevelTick)
+    {
+        _set_se_translator(seh_exception::TranslateSEHtoCE);
+        seSetForServerLevelTick = true;
+    }
+
     try
     {
         original(_this);
@@ -32,41 +32,41 @@ THook2("SEHPROTECT",void, "?tick@ServerLevel@@UEAAXXZ",
     {
         logger.error("Uncaught SEH Exception Detected in ServerLevel::tick!");
         logger.error("Exception: {}",wstr2str(ANSI2Unicode(TextEncoding::toUTF8(e.what()))));
-		logger.error("Error Code: {}", e.code());
-		PrintCurrentStackTraceback(e.info());
+        logger.error("Error Code: {}", e.code());
+        PrintCurrentStackTraceback(e.info());
     }
     catch (...)
     {
-		logger.error("Uncaught Exception Detected in Level::tick!");
-		PrintCurrentStackTraceback();
+        logger.error("Uncaught Exception Detected in Level::tick!");
+        PrintCurrentStackTraceback();
     }
-	return;
+    return;
 }
 
 THook(__int64, "?update@Minecraft@@QEAA_NXZ",
-	void* _this)
+    void* _this)
 {
-	if (!seSetForMinecraftUpdate)
-	{
-		_set_se_translator(seh_exception::TranslateSEHtoCE);
-		seSetForMinecraftUpdate = true;
-	}
+    if (!seSetForMinecraftUpdate)
+    {
+        _set_se_translator(seh_exception::TranslateSEHtoCE);
+        seSetForMinecraftUpdate = true;
+    }
 
-	try
-	{
-		original(_this);
-	}
-	catch (const seh_exception& e)
-	{
-		logger.error("Uncaught SEH Exception Detected in Minecraft::update!");
-		logger.error("Exception: {}", wstr2str(ANSI2Unicode(TextEncoding::toUTF8(e.what()))));
-		logger.error("Error Code: {}", e.code());
-		PrintCurrentStackTraceback(e.info());
-	}
-	catch (...)
-	{
-		logger.error("Uncaught Exception Detected in Minecraft::update!");
-		PrintCurrentStackTraceback();
-	}
-	return 0;
+    try
+    {
+        original(_this);
+    }
+    catch (const seh_exception& e)
+    {
+        logger.error("Uncaught SEH Exception Detected in Minecraft::update!");
+        logger.error("Exception: {}", wstr2str(ANSI2Unicode(TextEncoding::toUTF8(e.what()))));
+        logger.error("Error Code: {}", e.code());
+        PrintCurrentStackTraceback(e.info());
+    }
+    catch (...)
+    {
+        logger.error("Uncaught Exception Detected in Minecraft::update!");
+        PrintCurrentStackTraceback();
+    }
+    return 0;
 }*/
\ No newline at end of file
diff --git a/LiteLoader/Main/SimpleServerLogger.cpp b/LiteLoader/Main/SimpleServerLogger.cpp
--- a/LiteLoader/Main/SimpleServerLogger.cpp
+++ b/LiteLoader/Main/SimpleServerLogger.cpp
@@ -9,10 +9,8 @@
 using namespace Event;
 
 
-void RegisterSimpleServerLogger()
-{
-    if (LL::globalConfig.enableSimpleServerLogger)
-    {
+void RegisterSimpleServerLogger() {
+    if (LL::globalConfig.enableSimpleServerLogger) {
         Event::PlayerChatEvent::subscribe([](const Event::PlayerChatEvent& ev) {
             static Logger logger("Chat");
             logger.info("<{}> {}", ev.mPlayer->getRealName(), ev.mMessage);
@@ -28,10 +26,8 @@ void RegisterSimpleServerLogger()
 
 #include <MC/Command.hpp>
 TInstanceHook(void, "?setPermissions@Player@@QEAAXW4CommandPermissionLevel@@@Z",
-              Player, CommandPermissionLevel perm)
-{
-    if (LL::globalConfig.enableSimpleServerLogger)
-    {
+              Player, CommandPermissionLevel perm) {
+    if (LL::globalConfig.enableSimpleServerLogger) {
         static Logger logger("Permissions");
         logger.info("<{}> {}({}) -> {}({})",
                     getRealName(), magic_enum::enum_name(getCommandPermissionLevel()), (int)getCommandPermissionLevel(), magic_enum::enum_name(perm), (int)perm);
@@ -41,8 +37,7 @@ TInstanceHook(void, "?setPermissions@Player@@QEAAXW4CommandPermissionLevel@@@Z",
 
 // ==> LiteLoader/Main/BuiltinUnlockCmd.cpp
 #include <MC/I18n.hpp>
-void LogCommandRegistration(std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2)
-{
+void LogCommandRegistration(std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2) {
     static Logger logger("RegsterCommand");
     logger.consoleLevel = logger.debug.level;
     logger.debug("{:<18} - {:<12} - {}", name, magic_enum::enum_name(perm), I18n::get(description));
diff --git a/LiteLoader/Main/Version.h b/LiteLoader/Main/Version.h
--- a/LiteLoader/Main/Version.h
+++ b/LiteLoader/Main/Version.h
@@ -1,19 +1,18 @@
 #pragma once
 
-#define LITELOADER_VERSION_DEV      0
-#define LITELOADER_VERSION_BETA     1
-#define LITELOADER_VERSION_RELEASE  2
+#define LITELOADER_VERSION_DEV 0
+#define LITELOADER_VERSION_BETA 1
+#define LITELOADER_VERSION_RELEASE 2
 
-#define LITELOADER_VERSION_MAJOR    2
-#define LITELOADER_VERSION_MINOR    4
-#define LITELOADER_VERSION_REVISION 0
-#define LITELOADER_VERSION_ACTIONS  0
-#define LITELOADER_VERSION_STATUS   LITELOADER_VERSION_DEV
+#define LITELOADER_VERSION_MAJOR 2
+#define LITELOADER_VERSION_MINOR 4
+#define LITELOADER_VERSION_REVISION 1
+#define LITELOADER_VERSION_ACTIONS 0
+#define LITELOADER_VERSION_STATUS LITELOADER_VERSION_DEV
 
 #define TARGET_BDS_PROTOCOL_VERSION 534
 
-#define LITELOADER_VERSION          LL::getLoaderVersion()
-
+#define LITELOADER_VERSION LL::getLoaderVersion()
 
 
 #define __TO_VERSION_STRING(ver) #ver
@@ -21,12 +20,12 @@
 
 // Used in LiteLoader.rc or ScriptEngine.rc
 #if LITELOADER_VERSION_STATUS == LITELOADER_VERSION_BETA
-#define LITELOADER_FILE_VERSION_FLAG    VS_FF_DEBUG
-#define LITELOADER_FILE_VERSION_STRING  TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS BETA)
+#define LITELOADER_FILE_VERSION_FLAG VS_FF_DEBUG
+#define LITELOADER_FILE_VERSION_STRING TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS BETA)
 #elif LITELOADER_VERSION_STATUS == LITELOADER_VERSION_DEV
-#define LITELOADER_FILE_VERSION_FLAG    VS_FF_PRIVATEBUILD
-#define LITELOADER_FILE_VERSION_STRING  TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS DEV)
+#define LITELOADER_FILE_VERSION_FLAG VS_FF_PRIVATEBUILD
+#define LITELOADER_FILE_VERSION_STRING TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS DEV)
 #else
-#define LITELOADER_FILE_VERSION_FLAG    0x00000000L
-#define LITELOADER_FILE_VERSION_STRING  TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS)
+#define LITELOADER_FILE_VERSION_FLAG 0x00000000L
+#define LITELOADER_FILE_VERSION_STRING TO_VERSION_STRING(LITELOADER_VERSION_MAJOR.LITELOADER_VERSION_MINOR.LITELOADER_VERSION_REVISION.LITELOADER_VERSION_ACTIONS)
 #endif
diff --git a/LiteLoader/Main/dllmain.cpp b/LiteLoader/Main/dllmain.cpp
--- a/LiteLoader/Main/dllmain.cpp
+++ b/LiteLoader/Main/dllmain.cpp
@@ -8,10 +8,8 @@
 
 
 #include <Windows.h>
-BOOL WINAPI DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID)
-{
-    switch (ul_reason_for_call)
-    {
+BOOL WINAPI DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID) {
+    switch (ul_reason_for_call) {
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
diff --git a/LiteLoader/Resource/LiteLoader.rc b/LiteLoader/Resource/LiteLoader.rc
--- a/LiteLoader/Resource/LiteLoader.rc
+++ b/LiteLoader/Resource/LiteLoader.rc
@@ -26,18 +26,18 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
 // TEXTINCLUDE
 //
 
-1 TEXTINCLUDE 
+1 TEXTINCLUDE
 BEGIN
     "resource.h\0"
 END
 
-2 TEXTINCLUDE 
+2 TEXTINCLUDE
 BEGIN
     "#include ""winres.h""\r\n"
     "\0"
 END
 
-3 TEXTINCLUDE 
+3 TEXTINCLUDE
 BEGIN
     "\r\n"
     "\0"
diff --git a/MBCHANGELOG.txt b/MBCHANGELOG.txt
--- a/MBCHANGELOG.txt
+++ b/MBCHANGELOG.txt
@@ -1,31 +1,32 @@
 [HEADING=1][LiteLoader Release Note][/HEADING]
-LiteLoaderBDS-2.4.0更新已发布，适应于BDS-1.19.10，协议版本534
+LiteLoaderBDS-2.4.1更新已发布，适应于BDS-1.19.10，协议版本534
 
-[HEADING=2][新内容][/HEADING]
+[HEADING=1][新内容][/HEADING]
 [LIST]
-[*]支持BDS1.19.10 ,by @QingYu,@WangYneos 
-[*]全新的I18N API(为中小型插件设计) ,by @Jasonzyt（服务于大型插件的i18n正在制作中）
-[*]配置文件新增enableTpdimCommand与enableForceUtf8Input,[URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/518']#518[/URL] by @QingYu
-[*]重写PlayerPlaceBlockEvent, by @Redbeanw44602
-[*]为onUseItemOnEvent新增点击目标的坐标(Vec3), [URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/523']#523[/URL] by @OEOTYAN
-[/LIST]
-
-[HEADING=2][新内容][/HEADING]
+[*]LL API
 [LIST]
-[*]PlayerMoveEvent/onMove将在未来被移除(请尽快修改其他方案)
+[*]新增 Player::getLastPacketLoss, By @StarsDream00
+[*]新增事件 BlockPlacedByPlayerEvent, By @StarsDream00
+[*]FormUI中新增ModalForm,(#554) By @S3v3Nice
 [/LIST]
-
-[HEADING=2][BUG修复][/HEADING]
+[*]LLSE API
 [LIST]
-[*]修复LL Bugs
-[LIST]
-[*]修复不会加载文件名与已注册插件名称相同的插件,[URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/510']#510[/URL] by @Jasonzyt
-[*]修复Molang API(MC/ExpressionNode.hpp) 的错误 , [URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/524']#524[/URL] by @LazuliKao
-[*]修复onMove的部分问题 , [URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/530']#530[/URL] by @Redbeanw44602
-[*]修复distanceToSqr API ,by @QingYu
+[*]新增 pl.lastDeathPos,(#551) By @StarsDream00
+[*]新增 pl.isLoading, By @StarsDream00
+[*]新增 dv.lastPacketLoss, By @StarsDream00
+[*]新增 dv.lastPing, By @StarsDream00
+[*]新增 dv.serverAddress, By @StarsDream00
+[*]新增 bl.destroy(drop), By @StarsDream00
+[*]新增事件 onExperienceAdd, By @StarsDream00
+[*]新增事件 onBedEnter, By @StarsDream00
+[*]新增事件 afterPlaceBlock, By @Redbeanw44602
+[/LIST]
 [/LIST]
-[*]修复LLSE bugs
+[HEADING=1][Bug修复][/HEADING]
+[LIST]
+[*]LL bugs:
 [LIST]
-[*]修复mc.newCommand中参数perm的默认值不正确, [URL='https://github.com/LiteLDev/LiteLoaderBDS/issues/517']#517[/URL] by @StarsDream00
+[*]修复AntiGive部分情况下失效的问题, By @dreamguxiang
+[*]修复Vec3的一些问题, By @OEOTYAN
 [/LIST]
 [/LIST]
\ No newline at end of file
diff --git a/PreLoader/CMakeLists.txt b/PreLoader/CMakeLists.txt
--- a/PreLoader/CMakeLists.txt
+++ b/PreLoader/CMakeLists.txt
@@ -14,8 +14,8 @@ link_directories(${LiteLoader_SOURCE_DIR}/Lib/third-party)
 link_directories(${CMAKE_SOURCE_DIR}/x64/Release/)
 
 add_compile_options(
-        /permissive- /GS /GL /W0 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Zc:inline /fp:precise 
-        /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /diagnostics:column 
+        /permissive- /GS /GL /W0 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Zc:inline /fp:precise
+        /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /diagnostics:column
 )
 
 add_link_options(
diff --git a/PreLoader/FakeSymbol.hpp b/PreLoader/FakeSymbol.hpp
--- a/PreLoader/FakeSymbol.hpp
+++ b/PreLoader/FakeSymbol.hpp
@@ -4,11 +4,9 @@
 #include <string>
 #include "../Tools/Demangler/include/MicrosoftDemangle.h"
 
-namespace FakeSymbol
-{
+namespace FakeSymbol {
 
-inline static llvm::ms_demangle::SpecialIntrinsicKind consumeSpecialIntrinsicKind(StringView& MangledName)
-{
+inline static llvm::ms_demangle::SpecialIntrinsicKind consumeSpecialIntrinsicKind(StringView& MangledName) {
     using namespace llvm::ms_demangle;
     using namespace llvm;
     if (MangledName.consumeFront("?_7"))
@@ -47,8 +45,7 @@ inline static llvm::ms_demangle::SpecialIntrinsicKind consumeSpecialIntrinsicKin
 }
 
 // generate fakeSymbol for virtual functions
-inline static std::optional<std::string> getFakeSymbol(const std::string& fn)
-{
+inline static std::optional<std::string> getFakeSymbol(const std::string& fn) {
     using namespace llvm::ms_demangle;
     using namespace llvm;
     Demangler Demangler;
@@ -68,30 +65,25 @@ inline static std::optional<std::string> getFakeSymbol(const std::string& fn)
     if (DemangledName == nullptr || (DemangledName->kind() != NodeKind::FunctionSymbol && DemangledName->kind() != NodeKind::VariableSymbol) || Demangler.Error)
         return std::nullopt;
 
-	if (DemangledName->kind() == NodeKind::FunctionSymbol)
-    {
+    if (DemangledName->kind() == NodeKind::FunctionSymbol) {
         auto& FunctionClass = ((FunctionSymbolNode*)DemangledName)->Signature->FunctionClass;
         bool modified = false;
         size_t originalSize = FunctionClass.toString().size();
-        if (FunctionClass.has(FC_Virtual))
-        {
+        if (FunctionClass.has(FC_Virtual)) {
             FunctionClass.remove(FC_Virtual);
             modified = true;
         }
-        if (FunctionClass.has(FC_Protected))
-        {
+        if (FunctionClass.has(FC_Protected)) {
             FunctionClass.remove(FC_Protected);
             FunctionClass.add(FC_Public);
             modified = true;
         }
-        if (FunctionClass.has(FC_Private))
-        {
+        if (FunctionClass.has(FC_Private)) {
             FunctionClass.remove(FC_Private);
             FunctionClass.add(FC_Public);
             modified = true;
         }
-        if (modified)
-        {
+        if (modified) {
             std::string FakeSymbol = fn;
             std::string FakeFunctionClass = FunctionClass.toString();
             size_t BeginPos = fn.size() - FunctionClass.pos->size();
@@ -104,22 +96,20 @@ inline static std::optional<std::string> getFakeSymbol(const std::string& fn)
     if (DemangledName->kind() == NodeKind::VariableSymbol) {
         auto& StorageClass = ((VariableSymbolNode*)DemangledName)->SC;
         bool modified = false;
-        if (StorageClass == StorageClass::PrivateStatic)
-        {
+        if (StorageClass == StorageClass::PrivateStatic) {
             StorageClass.set(StorageClass::PublicStatic);
             modified = true;
         }
-        if (StorageClass == StorageClass::ProtectedStatic)
-        {
-			StorageClass.set(StorageClass::PublicStatic);
+        if (StorageClass == StorageClass::ProtectedStatic) {
+            StorageClass.set(StorageClass::PublicStatic);
             modified = true;
         }
         if (modified) {
-			std::string FakeSymbol = fn;
+            std::string FakeSymbol = fn;
             char FakeStorageClass = StorageClass.toChar();
-			size_t BeginPos = fn.size() - StorageClass.pos->size();
+            size_t BeginPos = fn.size() - StorageClass.pos->size();
             FakeSymbol[BeginPos] = FakeStorageClass;
-			return FakeSymbol;
+            return FakeSymbol;
         }
     }
 
diff --git a/PreLoader/Logger.h b/PreLoader/Logger.h
--- a/PreLoader/Logger.h
+++ b/PreLoader/Logger.h
@@ -15,43 +15,31 @@
 
 inline bool ColorLog;
 
-inline void LoadConfigFromJson(const std::string& fileName)
-{
+inline void LoadConfigFromJson(const std::string& fileName) {
     std::ifstream file(fileName);
-    if (!file.is_open())
-    {
+    if (!file.is_open()) {
         ColorLog = true;
         return;
     }
     nlohmann::json json;
     file >> json;
     file.close();
-    if (json.find("ColorLog") != json.end())
-    {
+    if (json.find("ColorLog") != json.end()) {
         const nlohmann::json& out = json.at("ColorLog");
         out.get_to(ColorLog);
     }
 }
 
-inline void loadconfig()
-{
-    if (std::filesystem::exists("plugins/LiteLoader/LiteLoader.json"))
-    {
-        try
-        {
+inline void loadconfig() {
+    if (std::filesystem::exists("plugins/LiteLoader/LiteLoader.json")) {
+        try {
             LoadConfigFromJson("plugins/LiteLoader/LiteLoader.json");
-        }
-        catch (std::exception& e)
-        {
+        } catch (std::exception& e) {
             ColorLog = true;
-        }
-        catch (...)
-        {
+        } catch (...) {
             ColorLog = true;
         }
-    }
-    else
-    {
+    } else {
         ColorLog = true;
     }
 }
@@ -65,32 +53,29 @@ inline void loadconfig()
 #define COLOR_ERROR_PREFIX fmt::terminal_color::bright_red
 #define COLOR_ERROR_TEXT fmt::color::red2
 
-#define LOG_PREFIX(prefix, color1, color2)                                               \
+#define LOG_PREFIX(prefix, color1, color2)                                                                              \
     fmt::print(ColorLog ? fmt::fg(color1) : fmt::text_style(), fmt::format("{:%H:%M:%S}", fmt::localtime(_time64(0)))); \
     fmt::print(ColorLog ? fmt::fg(color2) : fmt::text_style(), fmt::format(prefix, fmt::localtime(_time64(0))));
-#define LOG(color1, color2, prefix)                                         \
-    LOG_PREFIX(prefix, color1, color2);                                     \
+#define LOG(color1, color2, prefix)                                            \
+    LOG_PREFIX(prefix, color1, color2);                                        \
     std::string str = fmt::format("[PreLoader] ", fmt::localtime(_time64(0))); \
-    str += fmt::format(formatStr, args...);                                 \
+    str += fmt::format(formatStr, args...);                                    \
     str.append(1, '\n');
 
 template <typename... Args>
-void inline Info(const std::string& formatStr, const Args&... args)
-{
+void inline Info(const std::string& formatStr, const Args&... args) {
     LOG(COLOR_TIME, COLOR_INFO_PREFIX, " INFO ");
     fmt::print(fmt::fg(COLOR_INFO_TEXT), str);
 }
 
 template <typename... Args>
-void inline Warn(const std::string& formatStr, const Args&... args)
-{
+void inline Warn(const std::string& formatStr, const Args&... args) {
     LOG(COLOR_TIME, COLOR_WARN_PREFIX, " WARN ");
     fmt::print(fmt::fg(COLOR_WARN_TEXT) | fmt::emphasis::bold, str);
 }
 
 template <typename... Args>
-void inline Error(const std::string& formatStr, const Args&... args)
-{
+void inline Error(const std::string& formatStr, const Args&... args) {
     LOG(COLOR_TIME, COLOR_ERROR_PREFIX, " ERROR ");
     fmt::print(fmt::fg(COLOR_ERROR_TEXT) | fmt::emphasis::bold, str);
 }
\ No newline at end of file
diff --git a/PreLoader/PreLoader.cpp b/PreLoader/PreLoader.cpp
--- a/PreLoader/PreLoader.cpp
+++ b/PreLoader/PreLoader.cpp
@@ -14,21 +14,20 @@ using namespace std::filesystem;
 std::set<std::string> preloadList;
 
 void fixUpLibDir() {
-	WCHAR* buffer = new (std::nothrow) WCHAR[MAX_PATH_LENGTH];
-	if (!buffer)
-		return;
+    WCHAR* buffer = new (std::nothrow) WCHAR[MAX_PATH_LENGTH];
+    if (!buffer)
+        return;
 
-	DWORD length = GetEnvironmentVariableW(TEXT("PATH"), buffer, MAX_PATH_LENGTH);
-	std::wstring PATH(buffer, length);
-	length = GetCurrentDirectoryW(MAX_PATH_LENGTH, buffer);
-	std::wstring CWD(buffer, length);
+    DWORD length = GetEnvironmentVariableW(TEXT("PATH"), buffer, MAX_PATH_LENGTH);
+    std::wstring PATH(buffer, length);
+    length = GetCurrentDirectoryW(MAX_PATH_LENGTH, buffer);
+    std::wstring CWD(buffer, length);
 
-	SetEnvironmentVariableW(TEXT("PATH"), (CWD + L"\\plugins\\lib;" + PATH).c_str());
-	delete[] buffer;
+    SetEnvironmentVariableW(TEXT("PATH"), (CWD + L"\\plugins\\lib;" + PATH).c_str());
+    delete[] buffer;
 }
 
-std::wstring str2wstr(const std::string& str, UINT codePage)
-{
+std::wstring str2wstr(const std::string& str, UINT codePage) {
     auto len = MultiByteToWideChar(codePage, 0, str.c_str(), -1, nullptr, 0);
     auto* buffer = new wchar_t[len + 1];
     MultiByteToWideChar(codePage, 0, str.c_str(), -1, buffer, len + 1);
@@ -39,60 +38,56 @@ std::wstring str2wstr(const std::string& str, UINT codePage)
     return result;
 }
 
-wstring str2wstr(const string& str)
-{
+wstring str2wstr(const string& str) {
     return str2wstr(str, CP_UTF8);
 }
 
 string wstr2str(wstring wstr) {
-	auto  len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
-	char* buffer = new char[len + 1];
-	WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, buffer, len + 1, NULL, NULL);
-	buffer[len] = '\0';
-
-	string result = string(buffer);
-	delete[] buffer;
-	return result;
+    auto len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
+    char* buffer = new char[len + 1];
+    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, buffer, len + 1, NULL, NULL);
+    buffer[len] = '\0';
+
+    string result = string(buffer);
+    delete[] buffer;
+    return result;
 }
 
 bool loadLib(LPCTSTR libName, bool showFailInfo = true) {
-	if (LoadLibrary(libName)) {
+    if (LoadLibrary(libName)) {
         Info("{} Injected.", std::filesystem::path(wstr2str(libName)).filename().u8string());
-		return true;
-	} else {
-		if (showFailInfo) {
-			DWORD error_message_id = GetLastError();
-			Error("Can't load {} !", wstr2str(libName));
-			Error("Error code: {} !", error_message_id);
-			LPWSTR message_buffer = nullptr;
-			FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS |
-							  FORMAT_MESSAGE_FROM_SYSTEM,
-						  NULL, error_message_id, MAKELANGID(0x09, SUBLANG_DEFAULT),
-						  (LPWSTR)&message_buffer, 0, NULL);
-			Error("{}", wstr2str(message_buffer));
-			LocalFree(message_buffer);
-		}
-		return false;
-	}
+        return true;
+    } else {
+        if (showFailInfo) {
+            DWORD error_message_id = GetLastError();
+            Error("Can't load {} !", wstr2str(libName));
+            Error("Error code: {} !", error_message_id);
+            LPWSTR message_buffer = nullptr;
+            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS |
+                              FORMAT_MESSAGE_FROM_SYSTEM,
+                          NULL, error_message_id, MAKELANGID(0x09, SUBLANG_DEFAULT),
+                          (LPWSTR)&message_buffer, 0, NULL);
+            Error("{}", wstr2str(message_buffer));
+            LocalFree(message_buffer);
+        }
+        return false;
+    }
 }
 
-void loadPlugins()
-{
+void loadPlugins() {
     std::filesystem::create_directories("plugins");
     directory_iterator ent("plugins");
-    for (auto& file : ent)
-    {
+    for (auto& file : ent) {
         if (!file.is_regular_file())
             continue;
 
         auto& path = file.path();
         auto fileName = path.u8string();
-        if (fileName.find("LiteLoader.dll") != string::npos || fileName.find("LiteXLoader") != string::npos) // Skip Wrong file path
+        if (fileName.find("LiteLoader") != string::npos || fileName.find("LiteXLoader") != string::npos) // Skip Wrong file path
             continue;
 
         string ext = path.extension().u8string();
-        if (ext != ".dll")
-        {
+        if (ext != ".dll") {
             continue;
         }
 
@@ -101,12 +96,9 @@ void loadPlugins()
 
         string pluginFileName = path.filename().u8string();
         auto lib = LoadLibrary(str2wstr(fileName).c_str());
-        if (lib)
-        {
+        if (lib) {
             Info("Plugin <{}> Injected", pluginFileName);
-        }
-        else
-        {
+        } else {
             Error("Fail to load plugin [{}]", pluginFileName);
             Error("Error: Code[{}]", GetLastError());
         }
@@ -114,39 +106,39 @@ void loadPlugins()
 }
 
 bool loadLiteLoader() {
-	if (!exists(path(TEXT("LiteLoader.dll"))))
-		return false;
-	if (!loadLib(TEXT("LiteLoader.dll")))
-		return false;
-	return true;
+    if (!exists(path(TEXT("LiteLoader.dll"))))
+        return false;
+    if (!loadLib(TEXT("LiteLoader.dll")))
+        return false;
+    return true;
 }
 
 void loadDlls() {
-	if (exists(path(TEXT(".\\plugins\\preload.conf")))) {
-		std::wifstream dllList(TEXT(".\\plugins\\preload.conf"));
-		if (dllList) {
-			std::wstring dllName;
-			while (getline(dllList, dllName)) {
-				if (dllName.back() == TEXT('\n'))
-					dllName.pop_back();
-				if (dllName.back() == TEXT('\r'))
-					dllName.pop_back();
-
-				if (dllName.empty() || dllName.front() == TEXT('#'))
-					continue;
-				if (dllName.find(L"LiteLoader.dll") != std::wstring::npos)
-					continue;
-				loadLib(dllName.c_str());
+    if (exists(path(TEXT(".\\plugins\\preload.conf")))) {
+        std::wifstream dllList(TEXT(".\\plugins\\preload.conf"));
+        if (dllList) {
+            std::wstring dllName;
+            while (getline(dllList, dllName)) {
+                if (dllName.back() == TEXT('\n'))
+                    dllName.pop_back();
+                if (dllName.back() == TEXT('\r'))
+                    dllName.pop_back();
+
+                if (dllName.empty() || dllName.front() == TEXT('#'))
+                    continue;
+                if (dllName.find(L"LiteLoader.dll") != std::wstring::npos)
+                    continue;
+                loadLib(dllName.c_str());
                 preloadList.insert(wstr2str(dllName));
-			}
-			dllList.close();
-		}
-	} else {
-		std::wofstream dllList(TEXT(".\\plugins\\preload.conf"));
-		dllList.close();
-	}
-	if (!loadLiteLoader()) {
+            }
+            dllList.close();
+        }
+    } else {
+        std::wofstream dllList(TEXT(".\\plugins\\preload.conf"));
+        dllList.close();
+    }
+    if (!loadLiteLoader()) {
         Info("[LiteLoader] PreLoader is running as LiteLoaderCore...");
         loadPlugins();
-	}
+    }
 }
\ No newline at end of file
diff --git a/PreLoader/SymDB.cpp b/PreLoader/SymDB.cpp
--- a/PreLoader/SymDB.cpp
+++ b/PreLoader/SymDB.cpp
@@ -31,7 +31,7 @@ using std::list;
 using std::string, std::string_view;
 using std::unordered_map, std::unordered_multimap, std::vector;
 struct aphash {
-    size_t operator()(const string &x) const {
+    size_t operator()(const string& x) const {
         uint64_t rval = 0;
         for (size_t i = 0; x[i]; ++i) {
             if (i & 1) {
@@ -44,34 +44,28 @@ struct aphash {
     }
 };
 
-namespace MemoryMappedFile
-{
-struct Handle
-{
+namespace MemoryMappedFile {
+struct Handle {
     HANDLE file;
     HANDLE fileMapping;
     void* baseAddress;
 };
-	
-MemoryMappedFile::Handle Open(const wchar_t* path)
-{
+
+MemoryMappedFile::Handle Open(const wchar_t* path) {
     HANDLE file = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, nullptr);
-    if (file == INVALID_HANDLE_VALUE)
-    {
+    if (file == INVALID_HANDLE_VALUE) {
         return Handle{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr};
     }
 
     HANDLE fileMapping = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr);
-    if (fileMapping == nullptr)
-    {
+    if (fileMapping == nullptr) {
         CloseHandle(file);
 
         return Handle{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr};
     }
 
     void* baseAddress = MapViewOfFile(fileMapping, FILE_MAP_READ, 0, 0, 0);
-    if (baseAddress == nullptr)
-    {
+    if (baseAddress == nullptr) {
         CloseHandle(fileMapping);
         CloseHandle(file);
 
@@ -82,8 +76,7 @@ MemoryMappedFile::Handle Open(const wchar_t* path)
 }
 
 
-void Close(Handle& handle)
-{
+void Close(Handle& handle) {
     UnmapViewOfFile(handle.baseAddress);
     CloseHandle(handle.fileMapping);
     CloseHandle(handle.file);
@@ -93,12 +86,9 @@ void Close(Handle& handle)
     handle.baseAddress = nullptr;
 }
 } // namespace MemoryMappedFile
-namespace
-{
-PDB_NO_DISCARD static bool IsError(PDB::ErrorCode errorCode)
-{
-    switch (errorCode)
-    {
+namespace {
+PDB_NO_DISCARD static bool IsError(PDB::ErrorCode errorCode) {
+    switch (errorCode) {
         case PDB::ErrorCode::Success:
             return false;
 
@@ -125,12 +115,15 @@ PDB_NO_DISCARD static bool IsError(PDB::ErrorCode errorCode)
     return true;
 }
 
-PDB_NO_DISCARD static bool HasValidDBIStreams(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream)
-{
-    if (IsError(dbiStream.HasValidImageSectionStream(rawPdbFile))) return false;
-    if (IsError(dbiStream.HasValidPublicSymbolStream(rawPdbFile)))return false;
-    if (IsError(dbiStream.HasValidGlobalSymbolStream(rawPdbFile))) return false;
-    if (IsError(dbiStream.HasValidSectionContributionStream(rawPdbFile))) return false;
+PDB_NO_DISCARD static bool HasValidDBIStreams(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) {
+    if (IsError(dbiStream.HasValidImageSectionStream(rawPdbFile)))
+        return false;
+    if (IsError(dbiStream.HasValidPublicSymbolStream(rawPdbFile)))
+        return false;
+    if (IsError(dbiStream.HasValidGlobalSymbolStream(rawPdbFile)))
+        return false;
+    if (IsError(dbiStream.HasValidSectionContributionStream(rawPdbFile)))
+        return false;
     return true;
 }
 } // namespace
@@ -142,8 +135,7 @@ std::mutex dlsymLock;
 phmap::flat_hash_map<string, int, aphash>* funcMap;
 unordered_multimap<int, string*>* rvaMap;
 
-void InitFastDlsym(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream)
-{
+void InitFastDlsym(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) {
     Info("[Symbol] Loading symbols from pdb...");
     funcMap = new phmap::flat_hash_map<string, int, aphash>;
     const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile);
@@ -153,11 +145,11 @@ void InitFastDlsym(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStre
         const PDB::ArrayView<PDB::HashRecord> hashRecords = publicSymbolStream.GetRecords();
         const size_t count = hashRecords.GetLength();
 
-        for (const PDB::HashRecord& hashRecord : hashRecords)
-        {
+        for (const PDB::HashRecord& hashRecord : hashRecords) {
             const PDB::CodeView::DBI::Record* record = publicSymbolStream.GetRecord(symbolRecordStream, hashRecord);
             const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_PUB32.section, record->data.S_PUB32.offset);
-            if (rva == 0u) continue;
+            if (rva == 0u)
+                continue;
             funcMap->emplace(record->data.S_PUB32.name, rva);
 
             auto fake = FakeSymbol::getFakeSymbol(record->data.S_PUB32.name);
@@ -166,39 +158,37 @@ void InitFastDlsym(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStre
         }
         const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile);
         const PDB::ArrayView<PDB::ModuleInfoStream::Module> modules = moduleInfoStream.GetModules();
-        for (const PDB::ModuleInfoStream::Module& module : modules)
-        {
-            if (!module.HasSymbolStream()) continue;
+        for (const PDB::ModuleInfoStream::Module& module : modules) {
+            if (!module.HasSymbolStream())
+                continue;
             const PDB::ModuleSymbolStream moduleSymbolStream = module.CreateSymbolStream(rawPdbFile);
             moduleSymbolStream.ForEachSymbol([&imageSectionStream](const PDB::CodeView::DBI::Record* record) {
-                if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32)
-                {
+                if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32) {
                     const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LPROC32.section, record->data.S_LPROC32.offset);
                     string name = record->data.S_LPROC32.name;
                     if (name.find("lambda") != name.npos) {
                         funcMap->emplace(record->data.S_LPROC32.name, rva);
-                   }
+                    }
                 }
             });
         }
 
-		/*std::ofstream os;
+        /*std::ofstream os;
         os.open("SymList.txt");
-        string str; 
+        string str;
         for (auto iter = funcMap->begin(); funcMap->end() != iter; iter++)
         {
             str += fmt::sprintf("[%08d] %s\n",iter->second,iter->first);
         }
         os << str;
         os.close();*/
-		
+
         fastDlsymStat = 1;
         dlsymLock.lock();
         void* exportTableFn = GetProcAddress(GetModuleHandle(nullptr), "?initializeLogging@DedicatedServer@@AEAAXXZ");
         void* symdbFn = 0;
         auto iter = funcMap->find(string("?initializeLogging@DedicatedServer@@AEAAXXZ"));
-        if (iter != funcMap->end())
-        {
+        if (iter != funcMap->end()) {
             symdbFn = (void*)(imageBaseAddr + iter->second);
         }
         dlsymLock.unlock();
@@ -206,65 +196,55 @@ void InitFastDlsym(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStre
         fflush(stdout);
     }
 }
-void InitReverseLookup()
-{
+void InitReverseLookup() {
     Info("[Symbol] Loading Reverse Lookup Table");
     rvaMap = new unordered_multimap<int, string*>(funcMap->size());
     dlsymLock.lock();
-	for (auto& pair : *funcMap)
-	{
+    for (auto& pair : *funcMap) {
         rvaMap->insert({pair.second, (string*)&pair.first});
-	}
-    dlsymLock.unlock();	
+    }
+    dlsymLock.unlock();
 }
 
-void rawPdb()
-{
+void rawPdb() {
     const wchar_t* const pdbPath = LR"(./bedrock_server.pdb)";
     MemoryMappedFile::Handle pdbFile = MemoryMappedFile::Open(pdbPath);
-    if (!pdbFile.baseAddress)
-    {
+    if (!pdbFile.baseAddress) {
         Error("bedrock_server.pdb not found");
         return;
     }
-    if (IsError(PDB::ValidateFile(pdbFile.baseAddress)))
-    {
+    if (IsError(PDB::ValidateFile(pdbFile.baseAddress))) {
         MemoryMappedFile::Close(pdbFile);
         return;
     }
     const PDB::RawFile rawPdbFile = PDB::CreateRawFile(pdbFile.baseAddress);
-    if (IsError(PDB::HasValidDBIStream(rawPdbFile)))
-    {
+    if (IsError(PDB::HasValidDBIStream(rawPdbFile))) {
         MemoryMappedFile::Close(pdbFile);
         return;
     }
     const PDB::InfoStream infoStream(rawPdbFile);
-    if (infoStream.UsesDebugFastLink())
-    {
+    if (infoStream.UsesDebugFastLink()) {
         MemoryMappedFile::Close(pdbFile);
         return;
     }
     const PDB::DBIStream dbiStream = PDB::CreateDBIStream(rawPdbFile);
-    if (!HasValidDBIStreams(rawPdbFile, dbiStream))
-    {
+    if (!HasValidDBIStreams(rawPdbFile, dbiStream)) {
         MemoryMappedFile::Close(pdbFile);
         return;
     }
     InitFastDlsym(rawPdbFile, dbiStream);
 }
 
-extern _declspec(dllexport) std::vector<string> dlsym_reverse(int addr)
-{
+extern _declspec(dllexport) std::vector<string> dlsym_reverse(int addr) {
     if (!rvaMap)
         InitReverseLookup();
-	addr = addr - imageBaseAddr;
+    addr = addr - imageBaseAddr;
     auto const iter = rvaMap->equal_range(addr);
     std::vector<string> ret;
-	for (auto it = iter.first; it != iter.second; ++it)
-	{
-		ret.push_back(*it->second);
-	}
-	return ret;
+    for (auto it = iter.first; it != iter.second; ++it) {
+        ret.push_back(*it->second);
+    }
+    return ret;
 }
 
 extern "C" _declspec(dllexport) void* dlsym_real(const char* x) {
@@ -282,7 +262,7 @@ extern "C" _declspec(dllexport) void* dlsym_real(const char* x) {
         auto iter = funcMap->find(string(x));
         if (iter != funcMap->end()) {
             dlsymLock.unlock();
-            return (void *)(imageBaseAddr + iter->second);
+            return (void*)(imageBaseAddr + iter->second);
         } else {
             Error("Could not find function in memory: {}", x);
             Error("Plugin: {}", GetCallerModuleFileName());
@@ -298,8 +278,8 @@ inline static void HookFunction__begin() {
 inline static long HookFunction__finalize() {
     return DetourTransactionCommit();
 }
-static inline int realHook(void *oldfunc, void **poutold, void *newfunc) {
-    void *target = oldfunc;
+static inline int realHook(void* oldfunc, void** poutold, void* newfunc) {
+    void* target = oldfunc;
     HookFunction__begin();
     int rv = DetourAttach(&target, newfunc);
     HookFunction__finalize();
@@ -307,7 +287,7 @@ static inline int realHook(void *oldfunc, void **poutold, void *newfunc) {
     return rv;
 }
 extern "C" _declspec(dllexport) int HookFunction(void* oldfunc, void** poutold, void* newfunc) {
-    static unordered_map<void *, void **> ptr_pori;
+    static unordered_map<void*, void**> ptr_pori;
     auto it = ptr_pori.find(oldfunc);
     if (it == ptr_pori.end()) {
         int rv = realHook(oldfunc, poutold, newfunc);
@@ -316,7 +296,7 @@ extern "C" _declspec(dllexport) int HookFunction(void* oldfunc, void** poutold,
         ptr_pori[oldfunc] = poutold;
         return 0;
     } else {
-        *poutold    = *it->second;
+        *poutold = *it->second;
         *it->second = newfunc;
         return 0;
     }
diff --git a/PreLoader/Utils.cpp b/PreLoader/Utils.cpp
--- a/PreLoader/Utils.cpp
+++ b/PreLoader/Utils.cpp
@@ -1,16 +1,14 @@
 #include "pch.h"
 #include "Utils.h"
 #include <Psapi.h>
-std::string GetCallerModuleFileName(unsigned long FramesToSkip)
-{
+std::string GetCallerModuleFileName(unsigned long FramesToSkip) {
     static const int maxFrameCount = 1;
     void* frames[maxFrameCount];
     int frameCount = CaptureStackBackTrace(FramesToSkip + 2, maxFrameCount, frames, NULL);
 
     HANDLE hProcess = GetCurrentProcess();
 
-    if (0 < frameCount)
-    {
+    if (0 < frameCount) {
         HMODULE hModule;
         GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
                           (LPCWSTR)frames[0], &hModule);
diff --git a/PreLoader/dllmain.cpp b/PreLoader/dllmain.cpp
--- a/PreLoader/dllmain.cpp
+++ b/PreLoader/dllmain.cpp
@@ -5,17 +5,14 @@ void fixUpLibDir();
 void loadDlls();
 #pragma comment(linker, "/export:GetServerSymbol=LLPreLoader.dlsym_real")
 
-BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
-{
-    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
-    {
+BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
+    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
         system("chcp 65001>nul");
         loadconfig();
         fixUpLibDir();
         loadDlls();
     }
-    if (ul_reason_for_call == DLL_PROCESS_DETACH)
-    {
+    if (ul_reason_for_call == DLL_PROCESS_DETACH) {
     }
     return TRUE;
 }
\ No newline at end of file
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 [
 ![Latest Tag](https://img.shields.io/github/v/tag/LiteLDev/LiteLoader?label=LATEST%20TAG&style=for-the-badge)
 ![GitHub Releases (by Asset)](https://img.shields.io/github/downloads/LiteLDev/LiteLoader/latest/total?style=for-the-badge)
-](https://github.com/LiteLDev/LiteLoader/releases/latest)  
+](https://github.com/LiteLDev/LiteLoader/releases/latest)
 QQ Group: [656669024](https://jq.qq.com/?_wv=1027&k=lagwtrfh) QQ Group 2: [850517473](https://jq.qq.com/?_wv=1027&k=zeUbrETH)
 
 ##### English | [简体中文](README_zh-cn.md)
@@ -18,7 +18,7 @@ massive API, lots of packed utility interfaces, a rich event system and powerful
 
 `LiteLoader` provides a massive API, a powerful event system and a large number of encapsulated development infrastructure interfaces, providing a solid foundation for extending the Bedrock Edition **BDS** with more gameplay and functionality. With plugins, it is easy to extend the functionality of BDS, the associated development is easy to learn, and the development approach is flexible.
 
-Writing plugins in **C++，Golang，JavaScript，Lua，Python**  and other languages, which allows developers to easily extend and customize **BDS** functionality,
+Writing plugins in **C++, Golang, JavaScript, Lua, C#**  and other languages, which allows developers to easily extend and customize **BDS** functionality,
 making it easy to learn and extremely flexible.
 
 <br/>
@@ -48,7 +48,7 @@ void PluginInit()
     Event::PlayerAttackEvent::subscribe([](const Event::PlayerAttackEvent& ev) {
         Player* player = ev.mPlayer;
         Actor* actor = ev.mTarget;
-        logger.info("Player:{} attacks {} | at {} in Dimension {}", 
+        logger.info("Player:{} attacks {} | at {} in Dimension {}",
          player->getRealName(), actor->getTypeName(), actor->getPos().toString(),
             std::to_string(actor->getDimensionId()));
         return true;
@@ -61,19 +61,16 @@ void PluginInit()
 ```javascript
 // Register for shutdown command
 mc.listen("onServerStarted", () => {
-    const cmd = mc.newCommand("stopsvr", "close server", PermType.GameMasters);
+    const cmd = mc.newCommand("stopsvr", "close server");
     cmd.overload();
     cmd.setCallback((_cmd, ori, out, _res) => {
-        const pl = ori.player;
         out.success("stop command executed successfully");
         mc.broadcast(
-            `Player${pl.realName}Execute the stop command. The server will be shut down after 5 seconds`
+            `Player${ori.player.realName}Execute the stop command. The server will be shut down after 5 seconds`
         );
 
         // Execute stop command
-        setTimeout(() => {
-            mc.runcmd("stop");
-        }, 5000);
+        setTimeout(() => mc.runcmd("stop"), 5000);
     });
     cmd.setup();
 });
@@ -85,32 +82,33 @@ mc.listen("onServerStarted", () => {
 
 - 💻 Support for developing plugins in many different languages, Keeping the API uniform
 
-| Supported languages | `C++`，`JavaScript`，`Lua`，`Golang`，`.Net`|
-| -------------------------- | ------------------------------------ |
-| **Upcoming supported  languages** | `Python`，`Ruby`，`TypeScript` |
+| Supported languages               | `C++`, `Go`, `JavaScript`, `Lua`, `.NET` |
+| --------------------------------- | -------------------------------------------- |
+| **Upcoming supported languages**  | `Python`, `Ruby`, `TypeScript`               |
 
 - 📕 Smooth development experience with great compatibility
   - Auto-generated C++ headers, access to all `BDS` classes and functions, full toolchain support and evolving features
-  - For scripting language plugins, a multi-language code completion library, a powerful VSCode plugin, a hot-loading system ...... Many tools to help you write every line of code more efficiently
+  - For scripting language plugins, a multi-language code completion library, a powerful VSCode plugin, a hot-loading system...... Many tools to help you write every line of code more efficiently
   - When a version is updated, the API is guaranteed to be largely **backward compatible** and the plugin requires little or no code changes with the version update. With the `LiteLoader` series' unique symbol lookup technology, cross-version **auto-adaptation** is no longer a dream
 
 - 📋 Well documented and explained in detail
-  - Welcome to 👉[LiteLoader documentation](https://docs.litebds.com/)👈 to see more  
+  - Welcome to 👉[LiteLoader documentation](https://docs.litebds.com/)👈 to see more
 
 - 🎈 Numerous well-packaged interfaces
-  - Numerous game APIs support: players, entities, cubes, items, containers, NBTs, server systems ......
+  - Numerous game APIs support: players, entities, cubes, items, containers, NBTs, server systems......
   - Up to **50+** game events to listen to, no matter what happens,  the first to respond
 
 - 🛡 Secure, stable and versatile
-  - Fixes a number of vulnerabilities in BDS to ensure the stability and security of your server  
+  - Fixes a number of vulnerabilities in BDS to ensure the stability and security of your server
   - Extensive use of the seh exception protection framework to minimise the risk of server crashes
   - Supports running on Linux, MacOS platforms via **Wine**, bringing a free plugin experience to other platforms as well: write once, **share on multiple platforms**.
 
 - 🏆 Sound app ecosystem
-  - A large number of existing plugins, mature publishing platform, instantly 👉[Go to MineBBS](https://www.minebbs.com/resources/?prefix_id=67)👈 to find and download your favorite LL plugins  
+  - A large number of existing plugins, mature publishing platform, instantly 👉[Go to official forum](https://forum.litebds.com/)👈 to find and download your favorite LL plugins
+
 - 🏃 Open Source & Community Building
-  - The project is licensed under the `AGPL-3.0` open source license and will **never** be charged for or released as a commercial version.  
-  - The design philosophy is **decentralised** and you can be assured of a **free** plugin loading framework!  
+  - The project is licensed under the `AGPL-3.0` open source license and will **never** be charged for or released as a commercial version.
+  - The design philosophy is **decentralised** and you can be assured of a **free** plugin loading framework!
 
 ------
 
@@ -121,9 +119,9 @@ mc.listen("onServerStarted", () => {
 1. Download the latest <code>LiteLoader-<i>version</i>.zip</code> from [Releases](https://github.com/LiteLDev/LiteLoader/releases) or [Actions](https://github.com/LiteLDev/LiteLoader/actions),
 2. Unzip everything into the directory of `bedrock_server.exe`. If you are prompted with conflicting files during the decompression process, just select `Overwrite`.
 3. Ensure that the `bedrock_server.pdb` file exists.
-   Run `LLPeEditor.exe` to generate the BDS with the exported symbols (`bedrock_server_mod.exe`)  
-4. When the console output `Press any key to continue. . .` , press any key to close the window
-5. Execute `bedrock_server_mod.exe` and enjoy it !
+   Run `LLPeEditor.exe` to generate the BDS with the exported symbols (`bedrock_server_mod.exe`)
+4. When the console output `Press any key to continue . . . ` , press any key to close the window
+5. Execute `bedrock_server_mod.exe` and enjoy it!
 
 ### For Linux
 
@@ -144,13 +142,13 @@ docker pull shrbox/liteloaderbds
 docker create --name liteloader -p 19132:19132/udp -i -t shrbox/liteloaderbds
 ```
 
-Start server: `docker container start liteloader`  
-Force stop server(not recommended): `docker container stop liteloader`  
-Enter console: `docker attach liteloader`  
-Exit console: Press `Ctrl + P + Q`. If you press `Ctrl + C`, the server process will exit.  
-If you want to manage server files, use `docker volume --help` for more details.  
+Start server: `docker container start liteloader`<br>
+Force stop server(not recommended): `docker container stop liteloader`<br>
+Enter console: `docker attach liteloader`<br>
+Exit console: Press `Ctrl + P + Q`. If you press `Ctrl + C`, the server process will exit.<br>
+If you want to manage server files, use `docker volume --help` for more details.<br>
 
-Everything's done! Next, you can install **LiteLoader** plugins!  
+Everything's done! Next, you can install **LiteLoader** plugins!
 
 <br>
 
@@ -183,7 +181,7 @@ For more **installation and usage guides**,  come to 👉[LiteLoader documentati
 1. Compile, and select the appropriate PDB file as prompted to generate the dependency libs
 1. Copy the plugin to the plugins directory for testing
 
-For plugins development examples and guidance, please come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Usage/)👈  
+For plugins development examples and guidance, please come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Usage/)👈<br>
 If you have a revision request or need to add an API, please contact the author or post an Issue
 
 ### Developing plugins using scripting Languages
@@ -192,8 +190,8 @@ If you have a revision request or need to add an API, please contact the author
 2. Write the code
 3. Copy the plugin to the plugins directory for testing
 
-Please come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Development/)👈 for detailed **API documentation** and **plugin development tutorial**.  
-If you have a revision request or need to add an API, please feel free to contact the author or post an Issue  
+Please come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Development/)👈 for detailed **API documentation** and **plugin development tutorial**.
+If you have a revision request or need to add an API, please feel free to contact the author or post an Issue
 
 ### Example Plugins
 
@@ -203,19 +201,18 @@ You can also learn plugin development methods and tips here
 
 ### Development Aids - VSCode Development Aids & Complementary Libraries
 
-Use the LiteLoader development helper plugin developed by Moxicat  
-Helps you do better with **script plugins**!  
+Use the LiteLoader development helper plugin developed by Moxicat<br>
+Helps you do better with **script plugins**!<br>
 Code hint, auto-completion, auto-documentation, error alert, runtime debugging and so on
 
 [Click here](https://www.minebbs.com/resources/llscripthelper.2672/)
-View more description and introduction of this extension  
+View more description and introduction of this extension<br>
 VSCode extension store search `LLScriptHelper`, install **LLScriptHelper** and experience it instantly!
 
 ### Development Aids - Blockly-LXL Graphical Development Kit
 
-No programming foundation? Tired of complex language rules?  
-Have you ever thought that BDS plug-in development could be as easy as a puzzle?
-
+No programming foundation? Tired of complex language rules?<br>
+Have you ever thought that BDS plug-in development could be as easy as a puzzle?<br>
 Here it is! The Blockly-LXL graphical development kit from pa733 takes the plugin development experience to a new level!
 
 [Click here](https://www.minebbs.com/resources/blockly-lxl.2671/)
@@ -232,7 +229,7 @@ View related installation and usage instructions
 3. Open the `LiteLoader.sln` project file and click on the **Batch Generation** item in the **Generation** menu
 4. Bring up the batch generation dialog, check all the generation checkboxes on the right side of the dialog
 5. When you have finished selecting, click the **Generate** button in the dialog box to perform batch generation
-6. After successful compilation, go back to the project root directory and execute the `PackRelease.cmd` script in the Scripts folder.  
+6. After successful compilation, go back to the project root directory and execute the `PackRelease.cmd` script in the Scripts folder.<br>
    After execution, the contents of the `RELEASE` folder in the root directory will be the complete `LiteLoader` environment and all dependencies.
 
 <br/>
@@ -248,7 +245,7 @@ You can use the following methods to contribute to the `LiteLoader` project
 
 ⭐⭐⭐We welcome your contributions to LiteLoader!⭐⭐⭐
 
-If you are interested in contributing to LiteLoaderBDS, feel free to come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Maintenance/)👈 to view **Project Maintenance and Support Documentation**  
+If you are interested in contributing to LiteLoaderBDS, feel free to come to 👉[LiteLoader documentation](https://docs.litebds.com/en_US/Maintenance/)👈 to view **Project Maintenance and Support Documentation**
 
 ------
 
@@ -263,23 +260,23 @@ You must accept the Minecraft EULA.
 - If you violate the **EULA**, any legal liability is **IRRELEVANT** to the developers.
 - **NO WARRANTY**.
 
-Project|License
------|-----
-[LiteLoader](https://github.com/LiteLDev/LiteLoader)|AGPLv3 with extra restrictions&exceptions
-[BedrockX](https://github.com/Sysca11/BedrockX)|GPLv3 with extra restrictions&exceptions
-[ElementZero](https://github.com/Element-0/ElementZero)|GPLv3
-[ScriptX](https://github.com/Tencent/ScriptX)|Apache License Version 2.0
-[OpenSSL](https://github.com/openssl/openssl)|Apache-2.0 License
-[SimpleIni](https://github.com/brofield/simpleini)|MIT License
-[Nlohmann-Json](https://github.com/nlohmann/json)|MIT License
-[nbt-cpp](https://github.com/handtruth/nbt-cpp)|MIT License
-[Hash](https://github.com/Chocobo1/Hash)|GPLv3
-[ThreadPool](https://github.com/jhasse/ThreadPool)|Zlib License
-[LightWebSocketClient](https://github.com/cyanray/LightWebSocketClient)|MIT License
-[magic_enum](https://github.com/Neargye/magic_enum)|MIT License
-[dyncall](https://www.dyncall.org/index)|ISC license
-[vcproxy](https://github.com/pr701/vcproxy)|MIT License
-[RawPDB](https://github.com/MolecularMatters/raw_pdb)|BSD 2-Clause License
+| Project                                                                 | License                                   |
+| ----------------------------------------------------------------------- | ----------------------------------------- |
+| [LiteLoader](https://github.com/LiteLDev/LiteLoader)                    | AGPLv3 with extra restrictions&exceptions |
+| [BedrockX](https://github.com/Sysca11/BedrockX)                         | GPLv3 with extra restrictions&exceptions  |
+| [ElementZero](https://github.com/Element-0/ElementZero)                 | GPLv3                                     |
+| [ScriptX](https://github.com/Tencent/ScriptX)                           | Apache License Version 2.0                |
+| [OpenSSL](https://github.com/openssl/openssl)                           | Apache-2.0 License                        |
+| [SimpleIni](https://github.com/brofield/simpleini)                      | MIT License                               |
+| [Nlohmann-Json](https://github.com/nlohmann/json)                       | MIT License                               |
+| [nbt-cpp](https://github.com/handtruth/nbt-cpp)                         | MIT License                               |
+| [Hash](https://github.com/Chocobo1/Hash)                                | GPLv3                                     |
+| [ThreadPool](https://github.com/jhasse/ThreadPool)                      | Zlib License                              |
+| [LightWebSocketClient](https://github.com/cyanray/LightWebSocketClient) | MIT License                               |
+| [magic_enum](https://github.com/Neargye/magic_enum)                     | MIT License                               |
+| [dyncall](https://www.dyncall.org/index)                                | ISC license                               |
+| [vcproxy](https://github.com/pr701/vcproxy)                             | MIT License                               |
+| [RawPDB](https://github.com/MolecularMatters/raw_pdb)                   | BSD 2-Clause License                      |
 
 ### Extra Restrictions & Exceptions
 
@@ -289,7 +286,7 @@ or using it for commercial propose.
 > Do not do evil.
 
 Although we expected to build an open-source community, but forcing everything open-source will ruin this community. So
-you can write plugins based on `LiteLoader` with ANY open-source license or even don't publish your source code. but if
+you can write plugins based on `LiteLoader` with ANY open-source license or even do not publish your source code. but if
 you modified the framework, or write a new framework based on this framework, you MUST open-source it.
 
 If you want to reproduce and distribute this framework, you have to get our authorization!
@@ -301,9 +298,9 @@ If you want to reproduce and distribute this framework, you have to get our auth
 #### Important Contributors
 
 | ![ShrBox](https://avatars.githubusercontent.com/u/53301243?s=96&v=4) | ![dreamguxiang](https://avatars.githubusercontent.com/u/62042544?s=96&v=4) | ![WangYneos](https://avatars.githubusercontent.com/u/42824603?s=96&v=4) | ![wzy](https://avatars.githubusercontent.com/u/59381521?s=96&v=4) | ![xiaoqch](https://avatars.githubusercontent.com/u/37901097?s=96&v=4) | ![yqs112358](https://avatars.githubusercontent.com/u/37969157?s=96&v=4) | ![Sysca11](https://avatars.githubusercontent.com/u/46832985?s=96&v=4) | ![RimuruChan](https://avatars.githubusercontent.com/u/42002296?s=96&v=4) |
-|:--------------------------------------------------------------------:|:--------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:-----------------------------------------------------------------:|:---------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:---------------------------------------------------------------------:|:------------------------------------------------------------------------:|
+| :------------------------------------------------------------------: | :------------------------------------------------------------------------: | :---------------------------------------------------------------------: | :---------------------------------------------------------------: | :-------------------------------------------------------------------: | :---------------------------------------------------------------------: | :-------------------------------------------------------------------: | :----------------------------------------------------------------------: |
 |                 [@ShrBox](https://github.com/ShrBox)                 |              [@dreamguxiang](https://github.com/dreamguxiang)              |               [@WangYneos](https://github.com/WangYneos)                |               [@wzy](https://github.com/wzyyyyyyy)                |                [@xiaoqch](https://github.com/xiaoqch)                 |               [@yqs112358](https://github.com/yqs112358)                |                [@Sysca11](https://github.com/Sysca11)                 |               [@RimuruChan](https://github.com/RimuruChan)               |
 
 **Thanks to [JetBrains](https://www.jetbrains.com/) for allocating free open-source licences for IDEs such
-as [CLion](https://www.jetbrains.com/clion/)**.  
+as [CLion](https://www.jetbrains.com/clion/)**.<br>
 [<img src="https://upload.cc/i1/2021/12/29/XNohu5.png" width="200"/>](https://www.jetbrains.com/)
\ No newline at end of file
diff --git a/README_zh-cn.md b/README_zh-cn.md
--- a/README_zh-cn.md
+++ b/README_zh-cn.md
@@ -6,22 +6,22 @@
 [
 ![Latest Tag](https://img.shields.io/github/v/tag/LiteLDev/LiteLoader?label=LATEST%20TAG&style=for-the-badge)
 ![GitHub Releases (by Asset)](https://img.shields.io/github/downloads/LiteLDev/LiteLoader/latest/total?style=for-the-badge)
-](https://github.com/LiteLDev/LiteLoader/releases/latest)  
+](https://github.com/LiteLDev/LiteLoader/releases/latest)
 QQ群: [656669024](https://jq.qq.com/?_wv=1027&k=lagwtrfh) QQ2群: [850517473](https://jq.qq.com/?_wv=1027&k=zeUbrETH)
 
 ##### [English](README.md) | 简体中文
 
 ![LiteLoaderBDS](https://socialify.git.ci/liteldev/liteloaderbds/image?description=1&descriptionEditable=Lightweight%20%26%20Cross-language%0A%20BDS%20Plugin%20Loader&font=KoHo&forks=1&issues=1&logo=https%3A%2F%2Fraw.githubusercontent.com%2FLiteLDev%2FLiteLoaderBDS%2Fmain%2Fdocs%2F.vuepress%2Fpublic%2Fassets%2FLL-Logo.png&name=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Light)
 
-`LiteLoaderBDS` 是一个非官方的 `Minecraft` 服务端插件加载器，为基岩版官方服务端`Bedrock Dedicated Server`（以下简称**BDS**）提供插件开发支持 和 插件加载服务，弥补了官方行为包开发接口长期以来存在的一些不足。
+`LiteLoaderBDS` 是一个非官方的 `Minecraft` 服务端插件加载器，为基岩版专用服务器——`Bedrock Dedicated Server`（以下简称**BDS**）提供插件开发支持 和 插件加载服务，弥补了官方行为包开发接口长期以来存在的一些不足。
 
 `LiteLoader` 提供了海量的API、强大的事件系统以及大量封装的开发基础设施接口，为拓展基岩版**BDS**的更多玩法和功能提供了坚实的基础。通过插件，可以很容易地拓展BDS的功能，相关开发易于学习，且开发方式比较灵活。
 
-项目支持使用 **C++，Golang，JavaScript，Lua，Python** 等各种语言编写插件。同时，插件不需要随着**BDS**版本更新而不断修改代码，仅需本项目在底层适配更新即可，给插件开发与维护带来了很大的便利。  
+项目支持使用 **C++、Golang、JavaScript、Lua、C#** 等各种语言编写插件。同时，插件不需要随着**BDS**版本更新而不断修改代码，仅需本项目在底层适配更新即可，给插件开发与维护带来了很大的便利。
 
 ## 🎁 第一印象
 
-> “为什么我应该选择LiteLoader？”  
+> “为什么我应该选择LiteLoader？”<br>
 > 易于使用，直观的接口！
 
 #### C++语言示例插件
@@ -42,7 +42,7 @@ void PluginInit()
     Event::PlayerAttackEvent::subscribe([](const Event::PlayerAttackEvent& ev) {
         Player* player = ev.mPlayer;
         Actor* actor = ev.mTarget;
-        logger.info(u8"玩家:{} 攻击了 {} | 坐标 {} 维度 {}", 
+        logger.info(u8"玩家:{} 攻击了 {} | 坐标 {} 维度 {}",
          player->getRealName(), actor->getTypeName(), actor->getPos().toString(),
             std::to_string(actor->getDimensionId()));
         return true;
@@ -55,17 +55,14 @@ void PluginInit()
 ```javascript
 // 注册关服命令
 mc.listen("onServerStarted", () => {
-    const cmd = mc.newCommand("stopsvr", "关闭服务器", PermType.GameMasters);
+    const cmd = mc.newCommand("stopsvr", "关闭服务器");
     cmd.overload();
     cmd.setCallback((_cmd, ori, out, _res) => {
-        const pl = ori.player;
         out.success("关服命令执行成功");
-        mc.broadcast(`玩家${pl.realName}执行了关服命令。服务器将在5秒之后关闭`);
+        mc.broadcast(`玩家${ori.player.realName}执行了关服命令。服务器将在5秒之后关闭`);
 
         //执行关服命令
-        setTimeout(() => {
-            mc.runcmd("stop");
-        }, 5000);
+        setTimeout(() => mc.runcmd("stop"), 5000);
     });
     cmd.setup();
 });
@@ -77,32 +74,33 @@ mc.listen("onServerStarted", () => {
 
 - 💻 支持多种不同的语言开发插件，保持接口统一
 
-| 目前已支持的插件开发语言   | `C++`，`Golang`，`JavaScript`，`Lua` ，`.Net`|
-| -------------------------- | ------------------------------------ |
-| **即将支持的插件开发语言** | `Python`，`Ruby`，`TypeScript` |
+| 目前已支持的插件开发语言   | `C++`、`Go`、`JavaScript`、`Lua` 、`.NET` |
+| -------------------------- | --------------------------------------------- |
+| **即将支持的插件开发语言** | `Python`、`Ruby`、`TypeScript`                |
 
 - 📕 开发体验流畅，兼容性强
   - 拥有自动生成的C++头文件，可以访问`BDS`所有的类和功能，拥有完善的工具链支持，且功能不断发展中
-  - 对于脚本语言插件，拥有多语言代码补全库、强大的VSCode插件、热加载系统 ......众多辅助工具，帮你更有效地写好每一行代码
+  - 对于脚本语言插件，拥有多语言代码补全库、强大的VSCode插件、热加载系统……众多辅助工具，帮你更有效地写好每一行代码
   - 版本更新时，将保证 API 基本 **向下兼容**，插件几乎不需要随版本更新而修改代码。`LiteLoader`系列独有符号查找技术，跨版本 **自动适配** 不再是梦想
 
 - 📋 开发文档完善，讲解详细
-  - 欢迎 👉[移步 LiteLoader 文档站](https://docs.litebds.com/)👈 查看更多  
+  - 欢迎 👉[移步 LiteLoader 文档站](https://docs.litebds.com/)👈 查看更多<br>
 
 - 🎈 大量封装完善的的接口
   - 拥有众多游戏API支持：玩家，实体，方块，物品，容器，NBT，服务器系统……
   - 多达 **五十多种** 游戏事件监听，不管什么事情发生，都可以第一时间响应
 
 - 🛡 安全，稳定，通用
-  - 修复BDS中的一些漏洞，确保您的服务器的稳定性和安全性  
+  - 修复BDS中的一些漏洞，确保您的服务器的稳定性和安全性<br>
   - 广泛使用SEH异常保护框架，将服务器崩溃的风险降到最低
   - 支持通过 **Wine** 在Linux、MacOS平台运行，给其他平台也带来自由的插件体验：一次编写，**多平台共享**
 
 - 🏆 应用生态健全
-  - 海量现有插件，成熟发布平台，即刻 👉[前往MineBBS](https://www.minebbs.com/resources/?prefix_id=67)👈 查找并下载你喜欢的 LL 插件  
+  - 海量现有插件，成熟发布平台，即刻 👉[前往官方论坛](https://forum.litebds.com/)👈 查找并下载你喜欢的 LL 插件
+
 - 🏃 开源 & 社区共建
-  - 项目采用 `AGPL-3.0` 开源许可证，**永远不会** 收费或者推出商业版。  
-  - 设计思想采取 **去中心化** 设计，放心享受 **自由** 的插件加载框架！  
+  - 项目采用 `AGPL-3.0` 开源许可证，**永远不会** 收费或者推出商业版。<br>
+  - 设计思想采取 **去中心化** 设计，放心享受 **自由** 的插件加载框架！<br>
 
 ------
 
@@ -112,10 +110,10 @@ mc.listen("onServerStarted", () => {
 
 1. 前往 [MineBBS](https://www.minebbs.com/liteloader/) 或 [GitHub Release](https://github.com/LiteLDev/LiteLoader/releases) 下载最新的 `LiteLoader-版本号.zip`
 2. 将压缩文件内的所有内容解压到 `bedrock_server.exe` 所在的目录。如果解压的过程中提示文件有冲突，选择覆盖即可。
-3. 保证 `bedrock_server.pdb`文件存在。  
-   运行 `LLPeEditor.exe` 来生成具有导出符号的BDS（`bedrock_server_mod.exe`）  
-4. 当控制台输出 `请按任意键继续. . .` 时，按任意键关闭窗口
-3. 运行 `bedrock_server_mod.exe` 开服
+3. 保证 `bedrock_server.pdb`文件存在。
+   运行 `LLPeEditor.exe` 来生成具有导出符号的BDS（`bedrock_server_mod.exe`）
+4. 当控制台输出 `请按任意键继续. . . ` 时，按任意键关闭窗口
+5. 运行 `bedrock_server_mod.exe` 开服
 
 ### 对于 Linux 用户
 
@@ -136,11 +134,11 @@ docker pull shrbox/liteloaderbds
 docker create --name liteloader -p 19132:19132/udp -i -t shrbox/liteloaderbds
 ```
 
-启动服务器：`docker container start liteloader`  
-强制停止服务器（不推荐）：`docker container stop liteloader`  
-进入控制台：`docker attach liteloader`  
-退出控制台：按下 `Ctrl + P + Q`。如果按下 `Ctrl + C`，服务器进程将会终止。  
-如想管理服务端文件，使用命令 `docker volume --help` 了解详情。  
+启动服务器：`docker container start liteloader`<br>
+强制停止服务器（不推荐）：`docker container stop liteloader`<br>
+进入控制台：`docker attach liteloader`<br>
+退出控制台：按下 `Ctrl + P + Q`。如果按下 `Ctrl + C`，服务器进程将会终止。<br>
+如想管理服务端文件，使用命令 `docker volume --help` 了解详情。
 
 ## 🎯 下载 & 加载插件
 
@@ -171,8 +169,8 @@ docker create --name liteloader -p 19132:19132/udp -i -t shrbox/liteloaderbds
 1. 编译生成，并按提示选择相应的PDB文件以生成依赖库lib
 1. 复制插件到 plugins 目录进行测试
 
-具体插件开发示例与指导，请👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Usage/)👈查看  
-如果有修订需求或者有新增API的需要，欢迎联系作者或者发布Issue  
+具体插件开发示例与指导，请👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Usage/)👈查看
+如果有修订需求或者有新增API的需要，欢迎联系作者或者发布Issue
 
 ### 使用脚本语言开发插件
 
@@ -180,30 +178,30 @@ docker create --name liteloader -p 19132:19132/udp -i -t shrbox/liteloaderbds
 2. 编写代码
 3. 复制插件到 plugins 目录进行测试
 
-请👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Development/)👈查看详细的**API文档**和**插件开发教程**  
-如果有修订需求或者有新增API的需要，欢迎联系作者或者发布Issue  
+请👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Development/)👈查看详细的**API文档**和**插件开发教程**
+如果有修订需求或者有新增API的需要，欢迎联系作者或者发布Issue
 
 ### 示例插件
 
-[点击这里](https://github.com/LiteLDev) 查看更多开源的 LiteLoader 插件，作为示例插件。  
+[点击这里](https://github.com/LiteLDev) 查看更多开源的 LiteLoader 插件，作为示例插件。
 你可以直接在生产环境中使用它们
 也可以在这里学习插件开发的方法和技巧
 
 ### 开发辅助工具 - VSCode 开发辅助插件 & 补全库
 
-使用 Moxicat 开发的 LiteLoader 开发辅助插件  
-帮助你更好地完成**脚本插件**的开发!  
-代码提示、自动补全、自动文档、错误提醒、运行时调试......
-只有你想不到，没有他做不到  
+使用 Moxicat 开发的 LiteLoader 开发辅助插件
+帮助你更好地完成**脚本插件**的开发!
+代码提示、自动补全、自动文档、错误提醒、运行时调试……
+只有你想不到，没有他做不到
 用过绝不后悔的顶级插件开发体验!
 
 [点击这里](https://www.minebbs.com/resources/llscripthelper.2672/)
-查看扩展说明与介绍  
+查看扩展说明与介绍
 VSCode扩展商店搜索`LLScriptHelper`，安装**LLScriptHelper**，即刻体验
 
 ### 开发辅助工具 - Blockly-LXL 图形化开发套件
 
-没有编程基础？对复杂的语言规则感到厌烦?  
+没有编程基础？对复杂的语言规则感到厌烦?
 你有没有想过，BDS插件开发可以像拼图一样容易?
 
 看这里!pa733的 Blockly-LXL 图形化开发套件，将插件开发体验提升到了新的高度
@@ -224,7 +222,7 @@ VSCode扩展商店搜索`LLScriptHelper`，安装**LLScriptHelper**，即刻体
 3. 打开 `LiteLoader.sln` 项目文件，点击 **生成** 菜单中的 **批生成** 项
 4. 弹出批生成对话框，选中对话框右侧所有的生成复选框
 5. 选择完毕之后，点击对话框中的 **生成** 按钮，进行批生成
-6. 编译生成成功之后，返回到项目根目录，执行 Scripts 文件夹中的 `PackRelease.cmd` 脚本  
+6. 编译生成成功之后，返回到项目根目录，执行 Scripts 文件夹中的 `PackRelease.cmd` 脚本
    执行完之后，根目录 `RELEASE` 文件夹内的内容即为完整的 `LiteLoader` 环境及所有的依赖库
 
 ## 🎬 参与贡献
@@ -238,7 +236,7 @@ VSCode扩展商店搜索`LLScriptHelper`，安装**LLScriptHelper**，即刻体
 
 ⭐⭐⭐我们欢迎您的贡献！⭐⭐⭐
 
-PS：如果你有意为LL贡献代码，欢迎👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Maintenance/)👈查看 **项目维护与支持文档**  
+PS：如果你有意为LL贡献代码，欢迎👉[移步 LiteLoader 文档站](https://docs.litebds.com/zh_CN/Maintenance/)👈查看 **项目维护与支持文档**
 
 ------
 
@@ -253,21 +251,21 @@ PS：如果你有意为LL贡献代码，欢迎👉[移步 LiteLoader 文档站](
 
 另外，您需要遵守本项目的`AGPL-3.0`开源许可证条款，以及下列提到的各关联项目的开源许可证条款
 
-[LiteLoader](https://github.com/LiteLDev/LiteLoader) AGPLv3以及额外限制和例外  
-[BedrockX](https://github.com/Sysca11/BedrockX) GPLv3以及额外限制和例外  
-[ElementZero](https://github.com/Element-0/ElementZero) GPLv3  
-[ScriptX](https://github.com/Tencent/ScriptX) Apache License Version 2.0  
-[OpenSSL](https://github.com/openssl/openssl) Apache-2.0 License  
-[SimpleIni](https://github.com/brofield/simpleini) MIT License  
-[Nlohmann-Json](https://github.com/nlohmann/json) MIT License  
-[nbt-cpp](https://github.com/handtruth/nbt-cpp) MIT License  
-[Hash](https://github.com/Chocobo1/Hash) GPL v3  
-[ThreadPool](https://github.com/jhasse/ThreadPool) Zlib License  
-[LightWebSocketClient](https://github.com/cyanray/LightWebSocketClient) MIT License  
-[magic_enum](https://github.com/Neargye/magic_enum) MIT License  
-[dyncall](https://www.dyncall.org/index) ISC license  
-[vcproxy](https://github.com/pr701/vcproxy) MIT License 
-[RawPDB](https://github.com/MolecularMatters/raw_pdb) BSD 2-Clause License  
+[LiteLoader](https://github.com/LiteLDev/LiteLoader) AGPLv3以及额外限制和例外
+[BedrockX](https://github.com/Sysca11/BedrockX) GPLv3以及额外限制和例外
+[ElementZero](https://github.com/Element-0/ElementZero) GPLv3
+[ScriptX](https://github.com/Tencent/ScriptX) Apache License Version 2.0
+[OpenSSL](https://github.com/openssl/openssl) Apache-2.0 License
+[SimpleIni](https://github.com/brofield/simpleini) MIT License
+[Nlohmann-Json](https://github.com/nlohmann/json) MIT License
+[nbt-cpp](https://github.com/handtruth/nbt-cpp) MIT License
+[Hash](https://github.com/Chocobo1/Hash) GPL v3
+[ThreadPool](https://github.com/jhasse/ThreadPool) Zlib License
+[LightWebSocketClient](https://github.com/cyanray/LightWebSocketClient) MIT License
+[magic_enum](https://github.com/Neargye/magic_enum) MIT License
+[dyncall](https://www.dyncall.org/index) ISC license
+[vcproxy](https://github.com/pr701/vcproxy) MIT License
+[RawPDB](https://github.com/MolecularMatters/raw_pdb) BSD 2-Clause License
 
 ### 额外限制和例外
 
@@ -289,7 +287,7 @@ PS：如果你有意为LL贡献代码，欢迎👉[移步 LiteLoader 文档站](
 #### 重要贡献者
 
 | ![ShrBox](https://avatars.githubusercontent.com/u/53301243?s=96&v=4) | ![dreamguxiang](https://avatars.githubusercontent.com/u/62042544?s=96&v=4) | ![WangYneos](https://avatars.githubusercontent.com/u/42824603?s=96&v=4) | ![wzy](https://avatars.githubusercontent.com/u/59381521?s=96&v=4) | ![xiaoqch](https://avatars.githubusercontent.com/u/37901097?s=96&v=4) | ![yqs112358](https://avatars.githubusercontent.com/u/37969157?s=96&v=4) | ![Sysca11](https://avatars.githubusercontent.com/u/46832985?s=96&v=4) | ![RimuruChan](https://avatars.githubusercontent.com/u/42002296?s=96&v=4) |
-|:--------------------------------------------------------------------:|:--------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:-----------------------------------------------------------------:|:---------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:---------------------------------------------------------------------:|:------------------------------------------------------------------------:|
+| :------------------------------------------------------------------: | :------------------------------------------------------------------------: | :---------------------------------------------------------------------: | :---------------------------------------------------------------: | :-------------------------------------------------------------------: | :---------------------------------------------------------------------: | :-------------------------------------------------------------------: | :----------------------------------------------------------------------: |
 |                 [@ShrBox](https://github.com/ShrBox)                 |              [@dreamguxiang](https://github.com/dreamguxiang)              |               [@WangYneos](https://github.com/WangYneos)                |               [@wzy](https://github.com/wzyyyyyyy)                |                [@xiaoqch](https://github.com/xiaoqch)                 |               [@yqs112358](https://github.com/yqs112358)                |                [@Sysca11](https://github.com/Sysca11)                 |               [@RimuruChan](https://github.com/RimuruChan)               |
 
 **感谢 [JetBrains](https://www.jetbrains.com/) 给开源开发者分配免费的IDE许可证，例如 [CLion](https://www.jetbrains.com/clion/)** 。
diff --git a/RELEASE/plugins/LiteLoader/LangPack/en.json b/RELEASE/plugins/LiteLoader/LangPack/en.json
new file mode 100644
--- /dev/null
+++ b/RELEASE/plugins/LiteLoader/LangPack/en.json
@@ -0,0 +1,23 @@
+{
+    "api.parseJson.fail": "Json parse error",
+    "base.getDimName.0": "Overworld",
+    "base.getDimName.1": "Nether",
+    "base.getDimName.2": "End",
+    "base.getDimName.unknown": "Other dimension",
+    "init.fileMapping.fail": "Failed to load global shared data",
+    "init.idFile.fail": "Failed to initialize unique identification file! Code: ",
+    "init.llMoney.noFound": "LLMoney.dll not found, ScriptEngine Economy System won't work",
+    "init.loadConfig.fail": "Loading ScriptEngine config failed",
+    "init.mapFile.fail": "Global shared data mapping failed",
+    "llseapi.require.download.success": " - Successfully downloaded require! Path: ",
+    "llseapi.require.fail": " - Plugin require load failed",
+    "llseapi.require.network.fail": " - Download plugin require failed! Code: ",
+    "llseapi.require.success": " - Plugin require loaded successfully. Loaded: ",
+    "remoteCall.createEventObject.fail": "Creating Event Object failed",
+    "remoteCall.createMessageThread.fail": "Creating Message Thread failed",
+    "remoteCall.inRemoteEngine.fail": "Remote call error in remote engine",
+    "remoteCall.postMessage.fail": "Posting remote call information failed",
+    "remoteCall.postMessageReturn.fail": "Remote call post return value failed",
+    "remoteCall.timeout.fail": "Remote call timeout, call failed",
+    "remoteCall.waitFail.fail": "Remote call waiting failed, call failed"
+}
\ No newline at end of file
diff --git a/RELEASE/plugins/LiteLoader/LangPack/zh_CN.json b/RELEASE/plugins/LiteLoader/LangPack/zh_CN.json
new file mode 100644
--- /dev/null
+++ b/RELEASE/plugins/LiteLoader/LangPack/zh_CN.json
@@ -0,0 +1,26 @@
+{
+    "Detected the existence of another BDS process with the same path!": "检测到另一个相同的BDS进程存在!",
+    "Do you want to terminate the process with PID {}?  (y=Yes, n=No)": "您是否要强制终止该PID为 {} 的进程? (y=是, n=否)",
+    "This may cause the network port and the level to be occupied": "这可能会导致存档和端口占用",
+    "api.parseJson.fail": "Json解析发生错误！",
+    "base.getDimName.0": "主世界",
+    "base.getDimName.1": "下界",
+    "base.getDimName.2": "末地",
+    "base.getDimName.unknown": "其他维度",
+    "init.fileMapping.fail": "全局共享数据加载失败！",
+    "init.idFile.fail": "初始化唯一识别文件失败！错误码：",
+    "init.llMoney.noFound": "LLMoney.dll 未找到！LLSE经济系统将不会工作",
+    "init.loadConfig.fail": "LLSE配置文件加载失败！",
+    "init.mapFile.fail": "全局共享数据映射失败！",
+    "llseapi.require.download.success": " - 插件依赖包拉取成功！已安装到路径：",
+    "llseapi.require.fail": " - 插件依赖包加载失败！",
+    "llseapi.require.network.fail": " - 插件依赖包拉取网络请求失败！错误码：",
+    "llseapi.require.success": " - 插件依赖包加载成功。已加载：",
+    "remoteCall.createEventObject.fail": "创建事件对象失败！",
+    "remoteCall.createMessageThread.fail": "创建消息循环失败！",
+    "remoteCall.inRemoteEngine.fail": "在远程引擎中发生错误！",
+    "remoteCall.postMessage.fail": "递送远程调用信息失败！",
+    "remoteCall.postMessageReturn.fail": "远程调用传递返回值失败！",
+    "remoteCall.timeout.fail": "远程调用等待超时！调用失败",
+    "remoteCall.waitFail.fail": "远程调用等待失败！调用失败"
+}
\ No newline at end of file
diff --git a/RELEASE/plugins/LiteLoader/LangPack/zh_TW.json b/RELEASE/plugins/LiteLoader/LangPack/zh_TW.json
new file mode 100644
--- /dev/null
+++ b/RELEASE/plugins/LiteLoader/LangPack/zh_TW.json
@@ -0,0 +1,26 @@
+{
+    "Detected the existence of another BDS process with the same path!": "檢測到另一個相同的BDS進程存在!",
+    "Do you want to terminate the process with PID {}?  (y=Yes, n=No)": "您是否要強製終止該PID為 {} 的進程? (y=是, n=否)",
+    "This may cause the network port and the level to be occupied": "這可能會導致存檔和端口占用",
+    "api.parseJson.fail": "解析Json時發生錯誤！",
+    "base.getDimName.0": "主世界",
+    "base.getDimName.1": "地獄",
+    "base.getDimName.2": "終界",
+    "base.getDimName.unknown": "其他維度(世界)",
+    "init.fileMapping.fail": "加載全局共享數據失敗！",
+    "init.idFile.fail": "初始化唯一標識文件失敗！ 錯誤代碼：：",
+    "init.llMoney.noFound": "LLMoney.dll 未找到！ScriptEngine經濟系統將無法工作",
+    "init.loadConfig.fail": "加載ScriptEngine配置文件失敗！",
+    "init.mapFile.fail": "全局共享數據映射失敗！",
+    "llseapi.require.download.success": " - 插件所需拓展包下載成功！已安裝到至：",
+    "llseapi.require.fail": " - 插件所需拓展包加載失敗！",
+    "llseapi.require.network.fail": " - 插件所需拓展包下載請求失敗！錯誤代碼：",
+    "llseapi.require.success": " - 插件所需拓展包加載成功。已加載：",
+    "remoteCall.createEventObject.fail": "創建事件線程失敗",
+    "remoteCall.createMessageThread.fail": "創建消息線程失敗",
+    "remoteCall.inRemoteEngine.fail": "在遠程引擎中的遠程調用錯誤！",
+    "remoteCall.postMessage.fail": "發送遠程調用信息失敗！",
+    "remoteCall.postMessageReturn.fail": "遠程調用後返回值失敗！",
+    "remoteCall.timeout.fail": "遠程調用超時，調用失敗！",
+    "remoteCall.waitFail.fail": "遠程調用等待失敗，調用失敗！"
+}
\ No newline at end of file
diff --git a/ScriptEngine/API/APIHelp.cpp b/ScriptEngine/API/APIHelp.cpp
--- a/ScriptEngine/API/APIHelp.cpp
+++ b/ScriptEngine/API/APIHelp.cpp
@@ -28,15 +28,13 @@ using namespace std;
 
 //////////////////// APIs ////////////////////
 template <typename T>
-void PrintValue(T &out, Local<Value> v)
-{
-    switch (v.getKind())
-    {
+void PrintValue(T& out, Local<Value> v) {
+    switch (v.getKind()) {
         case ValueKind::kString:
             out << v.asString().toString();
             break;
         case ValueKind::kNumber:
-            if(CheckIsFloat(v))
+            if (CheckIsFloat(v))
                 out << v.asNumber().toDouble();
             else
                 out << v.asNumber().toInt64();
@@ -47,132 +45,106 @@ void PrintValue(T &out, Local<Value> v)
         case ValueKind::kNull:
             out << "<Null>";
             break;
-        case ValueKind::kArray:
-        {
+        case ValueKind::kArray: {
             Local<Array> arr = v.asArray();
-            if(arr.size() == 0)
+            if (arr.size() == 0)
                 out << "[]";
-            else
-            {
+            else {
                 static std::vector<Local<Array>> arrStack = {};
-                if (std::find(arrStack.begin(), arrStack.end(), arr) == arrStack.end())
-                {
+                if (std::find(arrStack.begin(), arrStack.end(), arr) == arrStack.end()) {
                     arrStack.push_back(arr);
                     out << '[';
                     PrintValue(out, arr.get(0));
-                    for (int i = 1; i < arr.size(); ++i)
-                    {
+                    for (int i = 1; i < arr.size(); ++i) {
                         out << ',';
                         PrintValue(out, arr.get(i));
                     }
                     out << ']';
                     arrStack.pop_back();
-                }
-                else
-                {
+                } else {
                     out << "<Recursive Array>";
                 }
             }
             break;
         }
-        case ValueKind::kObject:
-        {
+        case ValueKind::kObject: {
             // 自定义类型也会被识别为Object，优先处理
             // IntPos
             IntPos* intpos = IntPos::extractPos(v);
-            if (intpos != nullptr)
-            {
+            if (intpos != nullptr) {
                 out << DimId2Name(intpos->dim) << "(" << intpos->x << "," << intpos->y << "," << intpos->z << ")";
                 break;
             }
 
             // FloatPos
             FloatPos* floatpos = FloatPos::extractPos(v);
-            if (floatpos != nullptr)
-            {
+            if (floatpos != nullptr) {
                 out << fixed << setprecision(2) << DimId2Name(floatpos->dim) << "(" << floatpos->x << "," << floatpos->y << "," << floatpos->z << ")";
                 break;
             }
 
             // 其他自定义类型
-            if (IsInstanceOf<BlockClass>(v))
-            {
+            if (IsInstanceOf<BlockClass>(v)) {
                 out << "<Block>";
                 break;
             }
-            if (IsInstanceOf<KVDBClass>(v))
-            {
+            if (IsInstanceOf<KVDBClass>(v)) {
                 out << "<Database>";
                 break;
             }
-            if (IsInstanceOf<ConfJsonClass>(v))
-            {
+            if (IsInstanceOf<ConfJsonClass>(v)) {
                 out << "<ConfJson>";
                 break;
             }
-            if (IsInstanceOf<ConfIniClass>(v))
-            {
+            if (IsInstanceOf<ConfIniClass>(v)) {
                 out << "<ConfIni>";
                 break;
             }
-            if (IsInstanceOf<DeviceClass>(v))
-            {
+            if (IsInstanceOf<DeviceClass>(v)) {
                 out << "<DeviceInfo>";
                 break;
             }
-            if (IsInstanceOf<ContainerClass>(v))
-            {
+            if (IsInstanceOf<ContainerClass>(v)) {
                 out << "<Container>";
                 break;
             }
-            if (IsInstanceOf<EntityClass>(v))
-            {
+            if (IsInstanceOf<EntityClass>(v)) {
                 out << "<Entity>";
                 break;
             }
-            if (IsInstanceOf<SimpleFormClass>(v))
-            {
+            if (IsInstanceOf<SimpleFormClass>(v)) {
                 out << "<SimpleForm>";
                 break;
             }
-            if (IsInstanceOf<CustomFormClass>(v))
-            {
+            if (IsInstanceOf<CustomFormClass>(v)) {
                 out << "<CustomForm>";
                 break;
             }
-            if (IsInstanceOf<ItemClass>(v))
-            {
+            if (IsInstanceOf<ItemClass>(v)) {
                 out << "<Item>";
                 break;
             }
-            if (IsInstanceOf<PlayerClass>(v))
-            {
+            if (IsInstanceOf<PlayerClass>(v)) {
                 out << "<Player>";
                 break;
             }
-            if (IsNbtClass(v))
-            {
+            if (IsNbtClass(v)) {
                 out << "<NbtClass>";
                 break;
             }
-            if (IsInstanceOf<DBSessionClass>(v))
-            {
+            if (IsInstanceOf<DBSessionClass>(v)) {
                 out << "<DBSession>";
             }
-            if (IsInstanceOf<DBStmtClass>(v))
-            {
+            if (IsInstanceOf<DBStmtClass>(v)) {
                 out << "<DBStmt>";
             }
-            if (IsInstanceOf<HttpServerClass>(v))
-            {
+            if (IsInstanceOf<HttpServerClass>(v)) {
                 out << "<HttpServer>";
             }
-            if (IsInstanceOf<HttpRequestClass>(v))
-            {
+            if (IsInstanceOf<HttpRequestClass>(v)) {
                 out << "<HttpRequest>";
             }
-            if (IsInstanceOf<HttpResponseClass>(v))
-            {
+            if (IsInstanceOf<HttpResponseClass>(v)) {
                 out << "<HttpResponse>";
             }
 
@@ -180,43 +152,35 @@ void PrintValue(T &out, Local<Value> v)
             std::vector<std::string> keys = obj.getKeyNames();
             if (keys.empty())
                 out << "{}";
-            else
-            {
+            else {
                 static std::vector<Local<Object>> objStack = {};
-                if (std::find(objStack.begin(), objStack.end(), obj) == objStack.end())
-                {
+                if (std::find(objStack.begin(), objStack.end(), obj) == objStack.end()) {
                     objStack.push_back(obj);
                     out << '{';
                     out << keys[0] + ":";
                     PrintValue(out, obj.get(keys[0]));
-                    for (int i = 1; i < keys.size(); ++i)
-                    {
+                    for (int i = 1; i < keys.size(); ++i) {
                         out << "," + keys[i] + ":";
                         PrintValue(out, obj.get(keys[i]));
                     }
                     out << '}';
                     objStack.pop_back();
-                }
-                else
-                {
+                } else {
                     out << "<Recursive Object>";
                 }
             }
             break;
         }
-        case ValueKind::kByteBuffer:
-        {
+        case ValueKind::kByteBuffer: {
             Local<ByteBuffer> bytes = v.asByteBuffer();
-            out << ((const char*)bytes.getRawBytes(),bytes.byteLength());
+            out << ((const char*)bytes.getRawBytes(), bytes.byteLength());
             break;
         }
-        case ValueKind::kFunction:
-        {
+        case ValueKind::kFunction: {
             out << "<Function>";
             break;
         }
-        default:
-        {
+        default: {
             out << "<Unknown>";
             break;
         }
@@ -224,35 +188,28 @@ void PrintValue(T &out, Local<Value> v)
 }
 
 
-std::string ValueToString(Local<Value> v)
-{
+std::string ValueToString(Local<Value> v) {
     std::ostringstream sout;
     PrintValue(sout, v);
     return sout.str();
 }
 
-bool CheckIsFloat(const Local<Value> &num)
-{
-    try
-    {
+bool CheckIsFloat(const Local<Value>& num) {
+    try {
         return fabs(num.asNumber().toDouble() - num.asNumber().toInt64()) >= 1e-15;
-    }
-    catch (...)
-    {
+    } catch (...) {
         return false;
     }
 }
 
 ///////////////////// Json To Value /////////////////////
 
-Local<Value> BigInteger_Helper(fifo_json& i)
-{
-    if (i.is_number_integer())
-    {
-        if (i.is_number_unsigned())
-        {
+Local<Value> BigInteger_Helper(fifo_json& i) {
+    if (i.is_number_integer()) {
+        if (i.is_number_unsigned()) {
             auto ui = i.get<uint64_t>();
-            if (ui <= LLONG_MAX) return Number::newNumber((int64_t)ui);
+            if (ui <= LLONG_MAX)
+                return Number::newNumber((int64_t)ui);
             return Number::newNumber((double)ui);
         }
         return Number::newNumber(i.get<int64_t>());
@@ -260,151 +217,135 @@ Local<Value> BigInteger_Helper(fifo_json& i)
     return Local<Value>();
 }
 
-void JsonToValue_Helper(Local<Array> &res, fifo_json &j);
+void JsonToValue_Helper(Local<Array>& res, fifo_json& j);
 
-void JsonToValue_Helper(Local<Object> &res, const string &key, fifo_json &j)
-{
-    switch (j.type())
-    {
-    case fifo_json::value_t::string:
-        res.set(key, String::newString(j.get<string>()));
-        break;
-    case fifo_json::value_t::number_integer:
-    case fifo_json::value_t::number_unsigned:
-        res.set(key, BigInteger_Helper(j));
-        break;
-    case fifo_json::value_t::number_float:
-        res.set(key, Number::newNumber(j.get<double>()));
-        break;
-    case fifo_json::value_t::boolean:
-        res.set(key, Boolean::newBoolean(j.get<bool>()));
-        break;
-    case fifo_json::value_t::null:
-        res.set(key, Local<Value>());
-        break;
-    case fifo_json::value_t::array:
-    {
-        Local<Array> arrToAdd = Array::newArray();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(arrToAdd, *it);
-        res.set(key, arrToAdd);
-        break;
-    }
-    case fifo_json::value_t::object:
-    {
-        Local<Object> objToAdd = Object::newObject();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(objToAdd, it.key(), it.value());
-        res.set(key, objToAdd);
-        break;
-    }
-    default:
-        res.set(key, Local<Value>());
-        break;
+void JsonToValue_Helper(Local<Object>& res, const string& key, fifo_json& j) {
+    switch (j.type()) {
+        case fifo_json::value_t::string:
+            res.set(key, String::newString(j.get<string>()));
+            break;
+        case fifo_json::value_t::number_integer:
+        case fifo_json::value_t::number_unsigned:
+            res.set(key, BigInteger_Helper(j));
+            break;
+        case fifo_json::value_t::number_float:
+            res.set(key, Number::newNumber(j.get<double>()));
+            break;
+        case fifo_json::value_t::boolean:
+            res.set(key, Boolean::newBoolean(j.get<bool>()));
+            break;
+        case fifo_json::value_t::null:
+            res.set(key, Local<Value>());
+            break;
+        case fifo_json::value_t::array: {
+            Local<Array> arrToAdd = Array::newArray();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(arrToAdd, *it);
+            res.set(key, arrToAdd);
+            break;
+        }
+        case fifo_json::value_t::object: {
+            Local<Object> objToAdd = Object::newObject();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(objToAdd, it.key(), it.value());
+            res.set(key, objToAdd);
+            break;
+        }
+        default:
+            res.set(key, Local<Value>());
+            break;
     }
 }
 
-void JsonToValue_Helper(Local<Array> &res, fifo_json &j)
-{
-    switch (j.type())
-    {
-    case fifo_json::value_t::string:
-        res.add(String::newString(j.get<string>()));
-        break;
-    case fifo_json::value_t::number_integer:
-    case fifo_json::value_t::number_unsigned:
-        res.add(BigInteger_Helper(j));
-        break;
-    case fifo_json::value_t::number_float:
-        res.add(Number::newNumber(j.get<double>()));
-        break;
-    case fifo_json::value_t::boolean:
-        res.add(Boolean::newBoolean(j.get<bool>()));
-        break;
-    case fifo_json::value_t::null:
-        res.add(Local<Value>());
-        break;
-    case fifo_json::value_t::array:
-    {
-        Local<Array> arrToAdd = Array::newArray();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(arrToAdd, *it);
-        res.add(arrToAdd);
-        break;
-    }
-    case fifo_json::value_t::object:
-    {
-        Local<Object> objToAdd = Object::newObject();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(objToAdd, it.key(), it.value());
-        res.add(objToAdd);
-        break;
-    }
-    default:
-        res.add(Local<Value>());
-        break;
+void JsonToValue_Helper(Local<Array>& res, fifo_json& j) {
+    switch (j.type()) {
+        case fifo_json::value_t::string:
+            res.add(String::newString(j.get<string>()));
+            break;
+        case fifo_json::value_t::number_integer:
+        case fifo_json::value_t::number_unsigned:
+            res.add(BigInteger_Helper(j));
+            break;
+        case fifo_json::value_t::number_float:
+            res.add(Number::newNumber(j.get<double>()));
+            break;
+        case fifo_json::value_t::boolean:
+            res.add(Boolean::newBoolean(j.get<bool>()));
+            break;
+        case fifo_json::value_t::null:
+            res.add(Local<Value>());
+            break;
+        case fifo_json::value_t::array: {
+            Local<Array> arrToAdd = Array::newArray();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(arrToAdd, *it);
+            res.add(arrToAdd);
+            break;
+        }
+        case fifo_json::value_t::object: {
+            Local<Object> objToAdd = Object::newObject();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(objToAdd, it.key(), it.value());
+            res.add(objToAdd);
+            break;
+        }
+        default:
+            res.add(Local<Value>());
+            break;
     }
 }
 
-Local<Value> JsonToValue(fifo_json j)
-{
+Local<Value> JsonToValue(fifo_json j) {
     Local<Value> res;
 
-    switch (j.type())
-    {
-    case fifo_json::value_t::string:
-        res = String::newString(j.get<string>());
-        break;
-    case fifo_json::value_t::number_integer:
-    case fifo_json::value_t::number_unsigned:
-        res = BigInteger_Helper(j);
-        break;
-    case fifo_json::value_t::number_float:
-        res = Number::newNumber(j.get<double>());
-        break;
-    case fifo_json::value_t::boolean:
-        res = Boolean::newBoolean(j.get<bool>());
-        break;
-    case fifo_json::value_t::null:
-        res = Local<Value>();
-        break;
-    case fifo_json::value_t::array:
-    {
-        Local<Array> resArr = Array::newArray();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(resArr, *it);
-        res = resArr;
-        break;
-    }
-    case fifo_json::value_t::object:
-    {
-        Local<Object> resObj = Object::newObject();
-        for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
-            JsonToValue_Helper(resObj, it.key(), it.value());
-        res = resObj;
-        break;
-    }
-    default:
-        res = Local<Value>();
-        break;
+    switch (j.type()) {
+        case fifo_json::value_t::string:
+            res = String::newString(j.get<string>());
+            break;
+        case fifo_json::value_t::number_integer:
+        case fifo_json::value_t::number_unsigned:
+            res = BigInteger_Helper(j);
+            break;
+        case fifo_json::value_t::number_float:
+            res = Number::newNumber(j.get<double>());
+            break;
+        case fifo_json::value_t::boolean:
+            res = Boolean::newBoolean(j.get<bool>());
+            break;
+        case fifo_json::value_t::null:
+            res = Local<Value>();
+            break;
+        case fifo_json::value_t::array: {
+            Local<Array> resArr = Array::newArray();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(resArr, *it);
+            res = resArr;
+            break;
+        }
+        case fifo_json::value_t::object: {
+            Local<Object> resObj = Object::newObject();
+            for (fifo_json::iterator it = j.begin(); it != j.end(); ++it)
+                JsonToValue_Helper(resObj, it.key(), it.value());
+            res = resObj;
+            break;
+        }
+        default:
+            res = Local<Value>();
+            break;
     }
-    
+
     return res;
 }
 
-Local<Value> JsonToValue(std::string jsonStr)
-{
-    try
-    {
+Local<Value> JsonToValue(std::string jsonStr) {
+    try {
         if (jsonStr.empty())
             return String::newString("");
         if (jsonStr.front() == '\"' && jsonStr.back() == '\"')
-            return String::newString(jsonStr.substr(1,jsonStr.size()-2));
+            return String::newString(jsonStr.substr(1, jsonStr.size() - 2));
         auto j = fifo_json::parse(jsonStr, nullptr, true, true);
         return JsonToValue(j);
-    }
-    catch (const fifo_json::exception &e)
-    {
+    } catch (const fifo_json::exception& e) {
         logger.warn(tr("api.parseJson.fail") + TextEncoding::toUTF8(e.what()));
         return String::newString(jsonStr);
     }
@@ -415,156 +356,135 @@ Local<Value> JsonToValue(std::string jsonStr)
 
 void ValueToJson_Obj_Helper(fifo_json& res, const Local<Object>& v);
 
-void ValueToJson_Arr_Helper(fifo_json &res, const Local<Array> &v)
-{
-    for (int i = 0; i < v.size(); ++i)
-    {
-        switch (v.get(i).getKind())
-        {
-        case ValueKind::kString:
-            res.push_back(v.get(i).asString().toString());
-            break;
-        case ValueKind::kNumber:
-            if (CheckIsFloat(v.get(i)))
-                res.push_back(v.get(i).asNumber().toDouble());
-            else
-                res.push_back(v.get(i).asNumber().toInt64());
-            break;
-        case ValueKind::kBoolean:
-            res.push_back(v.get(i).asBoolean().value());
-            break;
-        case ValueKind::kNull:
-            res.push_back(nullptr);
-            break;
-        case ValueKind::kArray:
-        {
-            Local<Array> arrToAdd = v.get(i).asArray();
-            if (arrToAdd.size() == 0)
-                res.push_back(fifo_json::array());
-            else
-            {
-                fifo_json arrJson = fifo_json::array();
-                ValueToJson_Arr_Helper(arrJson, arrToAdd);
-                res.push_back(arrJson);
+void ValueToJson_Arr_Helper(fifo_json& res, const Local<Array>& v) {
+    for (int i = 0; i < v.size(); ++i) {
+        switch (v.get(i).getKind()) {
+            case ValueKind::kString:
+                res.push_back(v.get(i).asString().toString());
+                break;
+            case ValueKind::kNumber:
+                if (CheckIsFloat(v.get(i)))
+                    res.push_back(v.get(i).asNumber().toDouble());
+                else
+                    res.push_back(v.get(i).asNumber().toInt64());
+                break;
+            case ValueKind::kBoolean:
+                res.push_back(v.get(i).asBoolean().value());
+                break;
+            case ValueKind::kNull:
+                res.push_back(nullptr);
+                break;
+            case ValueKind::kArray: {
+                Local<Array> arrToAdd = v.get(i).asArray();
+                if (arrToAdd.size() == 0)
+                    res.push_back(fifo_json::array());
+                else {
+                    fifo_json arrJson = fifo_json::array();
+                    ValueToJson_Arr_Helper(arrJson, arrToAdd);
+                    res.push_back(arrJson);
+                }
+                break;
             }
-            break;
-        }
-        case ValueKind::kObject:
-        {
-            Local<Object> objToAdd = v.get(i).asObject();
-            if (objToAdd.getKeyNames().empty())
-                res.push_back(fifo_json::object());
-            else
-            {
-                fifo_json objJson = fifo_json::object();
-                ValueToJson_Obj_Helper(objJson, objToAdd);
-                res.push_back(objJson);
+            case ValueKind::kObject: {
+                Local<Object> objToAdd = v.get(i).asObject();
+                if (objToAdd.getKeyNames().empty())
+                    res.push_back(fifo_json::object());
+                else {
+                    fifo_json objJson = fifo_json::object();
+                    ValueToJson_Obj_Helper(objJson, objToAdd);
+                    res.push_back(objJson);
+                }
+                break;
             }
-            break;
-        }
-        default:
-            res.push_back(nullptr);
-            break;
+            default:
+                res.push_back(nullptr);
+                break;
         }
     }
 }
 
-void ValueToJson_Obj_Helper(fifo_json& res, const Local<Object>& v)
-{
+void ValueToJson_Obj_Helper(fifo_json& res, const Local<Object>& v) {
     auto keys = v.getKeyNames();
-    for (auto &key : keys)
-    {
-        switch (v.get(key).getKind())
-        {
+    for (auto& key : keys) {
+        switch (v.get(key).getKind()) {
+            case ValueKind::kString:
+                res.push_back({key, v.get(key).asString().toString()});
+                break;
+            case ValueKind::kNumber:
+                if (CheckIsFloat(v.get(key)))
+                    res.push_back({key, v.get(key).asNumber().toDouble()});
+                else
+                    res.push_back({key, v.get(key).asNumber().toInt64()});
+                break;
+            case ValueKind::kBoolean:
+                res.push_back({key, v.get(key).asBoolean().value()});
+                break;
+            case ValueKind::kNull:
+                res.push_back({key, nullptr});
+                break;
+            case ValueKind::kArray: {
+                Local<Array> arrToAdd = v.get(key).asArray();
+                if (arrToAdd.size() == 0)
+                    res.push_back({key, fifo_json::array()});
+                else {
+                    fifo_json arrJson = fifo_json::array();
+                    ValueToJson_Arr_Helper(arrJson, arrToAdd);
+                    res.push_back({key, arrJson});
+                }
+                break;
+            }
+            case ValueKind::kObject: {
+                Local<Object> objToAdd = v.get(key).asObject();
+                if (objToAdd.getKeyNames().empty())
+                    res.push_back({key, fifo_json::object()});
+                else {
+                    fifo_json objJson = fifo_json::object();
+                    ValueToJson_Obj_Helper(objJson, objToAdd);
+                    res.push_back({key, objJson});
+                }
+                break;
+            }
+            default:
+                res.push_back({key, nullptr});
+                break;
+        }
+    }
+}
+
+std::string ValueToJson(Local<Value> v, int formatIndent) {
+    string result;
+    switch (v.getKind()) {
         case ValueKind::kString:
-            res.push_back({ key,v.get(key).asString().toString() });
+            result = "\"" + v.asString().toString() + "\"";
             break;
         case ValueKind::kNumber:
-            if (CheckIsFloat(v.get(key)))
-                res.push_back({ key,v.get(key).asNumber().toDouble() });
-            else
-                res.push_back({ key,v.get(key).asNumber().toInt64() });
+            if (CheckIsFloat(v)) {
+                result = std::to_string(v.asNumber().toDouble());
+            } else {
+                result = std::to_string(v.asNumber().toInt64());
+            }
             break;
         case ValueKind::kBoolean:
-            res.push_back({ key,v.get(key).asBoolean().value() });
+            result = std::to_string(v.asBoolean().value());
             break;
         case ValueKind::kNull:
-            res.push_back({ key, nullptr });
+            result = "";
             break;
-        case ValueKind::kArray:
-        {
-            Local<Array> arrToAdd = v.get(key).asArray();
-            if (arrToAdd.size() == 0)
-                res.push_back({ key,fifo_json::array() });
-            else
-            {
-                fifo_json arrJson = fifo_json::array();
-                ValueToJson_Arr_Helper(arrJson, arrToAdd);
-                res.push_back({ key,arrJson });
-            }
+        case ValueKind::kArray: {
+            fifo_json jsonRes = fifo_json::array();
+            ValueToJson_Arr_Helper(jsonRes, v.asArray());
+            result = jsonRes.dump(formatIndent);
             break;
         }
-        case ValueKind::kObject:
-        {
-            Local<Object> objToAdd = v.get(key).asObject();
-            if (objToAdd.getKeyNames().empty())
-                res.push_back({ key,fifo_json::object() });
-            else
-            {
-                fifo_json objJson = fifo_json::object();
-                ValueToJson_Obj_Helper(objJson, objToAdd);
-                res.push_back({ key,objJson });
-            }
+        case ValueKind::kObject: {
+            fifo_json jsonRes = fifo_json::object();
+            ValueToJson_Obj_Helper(jsonRes, v.asObject());
+            result = jsonRes.dump(formatIndent);
             break;
         }
         default:
-            res.push_back({ key,nullptr });
+            result = "";
             break;
-        }
-    }
-}
-
-std::string ValueToJson(Local<Value> v,int formatIndent)
-{
-    string result;
-    switch (v.getKind())
-    {
-    case ValueKind::kString:
-        result = "\"" + v.asString().toString() + "\"";
-        break;
-    case ValueKind::kNumber:
-        if (CheckIsFloat(v))
-        {
-            result = std::to_string(v.asNumber().toDouble());
-        }
-        else
-        {
-            result = std::to_string(v.asNumber().toInt64());
-        }
-        break;
-    case ValueKind::kBoolean:
-        result = std::to_string(v.asBoolean().value());
-        break;
-    case ValueKind::kNull:
-        result = "";
-        break;
-    case ValueKind::kArray:
-    {
-        fifo_json jsonRes = fifo_json::array();
-        ValueToJson_Arr_Helper(jsonRes, v.asArray());
-        result = jsonRes.dump(formatIndent);
-        break;
-    }
-    case ValueKind::kObject:
-    {
-        fifo_json jsonRes = fifo_json::object();
-        ValueToJson_Obj_Helper(jsonRes, v.asObject());
-        result = jsonRes.dump(formatIndent);
-        break;
-    }
-    default:
-        result = "";
-        break;
     }
     return result;
 }
diff --git a/ScriptEngine/API/APIHelp.h b/ScriptEngine/API/APIHelp.h
--- a/ScriptEngine/API/APIHelp.h
+++ b/ScriptEngine/API/APIHelp.h
@@ -1,24 +1,24 @@
 ﻿#pragma once
 #include <ScriptX/ScriptX.h>
-using script::Local;
-using script::Value;
-using script::Number;
-using script::String;
+using script::Arguments;
+using script::Array;
 using script::Boolean;
 using script::ByteBuffer;
+using script::ClassDefine;
+using script::defineClass;
+using script::EngineScope;
+using script::Exception;
+using script::ExitEngineScope;
 using script::Function;
-using script::Array;
+using script::Local;
+using script::Number;
 using script::Object;
 using script::ScriptClass;
-using script::Arguments;
-using script::ClassDefine;
-using script::defineClass;
-using script::selectOverloadedFunc;
 using script::ScriptEngine;
 using script::ScriptEngineImpl;
-using script::EngineScope;
-using script::ExitEngineScope;
-using script::Exception;
+using script::selectOverloadedFunc;
+using script::String;
+using script::Value;
 using script::ValueKind;
 
 #include <Global.hpp>
@@ -32,15 +32,13 @@ using script::ValueKind;
 #include <magic_enum/magic_enum.hpp>
 
 // 输出异常信息
-inline void PrintException(const script::Exception& e)
-{
+inline void PrintException(const script::Exception& e) {
     ostringstream sout;
     sout << e;
     logger.error(sout.str());
 }
 
-inline void PrintScriptStackTrace(std::string const& msg = "")
-{
+inline void PrintScriptStackTrace(std::string const& msg = "") {
     if (!msg.empty())
         PrintException(script::Exception(msg));
     else
@@ -53,14 +51,13 @@ inline void PrintScriptStackTrace(std::string const& msg = "")
 
 // 实例类类型检查
 template <typename T>
-bool inline IsInstanceOf(Local<Value> v)
-{
+bool inline IsInstanceOf(Local<Value> v) {
     return EngineScope::currentEngine()->isInstanceOf<T>(v);
 }
 
 // 输出脚本调用堆栈，API名称，以及插件名
-#define LOG_ERROR_WITH_SCRIPT_INFO(...) \
-    PrintScriptStackTrace(__VA_ARGS__); \
+#define LOG_ERROR_WITH_SCRIPT_INFO(...)    \
+    PrintScriptStackTrace(__VA_ARGS__);    \
     logger.error("In API: " __FUNCTION__); \
     logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName)
 
@@ -74,128 +71,113 @@ bool inline IsInstanceOf(Local<Value> v)
 #define LOG_WRONG_ARGS_COUNT() LOG_ERROR_WITH_SCRIPT_INFO("Wrong number of arguments!");
 
 // 至少COUNT个参数
-#define CHECK_ARGS_COUNT(ARGS,COUNT) \
-    if(ARGS.size()<COUNT) \
-    { \
-        LOG_TOO_FEW_ARGS(); \
-        return Local<Value>(); \
+#define CHECK_ARGS_COUNT(ARGS, COUNT) \
+    if (ARGS.size() < COUNT) {        \
+        LOG_TOO_FEW_ARGS();           \
+        return Local<Value>();        \
     }
 
-// 检查是否TYPE类型 
-#define CHECK_ARG_TYPE(ARG,TYPE) \
-    if(ARG.getKind() != TYPE) \
-    { \
-        LOG_WRONG_ARG_TYPE(); \
-        return Local<Value>(); \
+// 检查是否TYPE类型
+#define CHECK_ARG_TYPE(ARG, TYPE) \
+    if (ARG.getKind() != TYPE) {  \
+        LOG_WRONG_ARG_TYPE();     \
+        return Local<Value>();    \
     }
 
 // 截获引擎异常
-#define CATCH(LOG) \
-    catch(const Exception& e) \
-    { \
-        logger.error(LOG##"\n"); PrintException(e); \
+#define CATCH(LOG)                                                   \
+    catch (const Exception& e) {                                     \
+        logger.error(LOG##"\n");                                     \
+        PrintException(e);                                           \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-        return Local<Value>(); \
-    } \
-    catch(const std::exception &e) \
-    { \
-        logger.error("C++ Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return Local<Value>(); \
-    } \
-    catch(const seh_exception &e) \
-    { \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return Local<Value>(); \
-    } \
-    catch(...) \
-    { \
-        logger.error("Uncaught Exception Detected!"); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return Local<Value>(); \
+        return Local<Value>();                                       \
+    }                                                                \
+    catch (const std::exception& e) {                                \
+        logger.error("C++ Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return Local<Value>();                                       \
+    }                                                                \
+    catch (const seh_exception& e) {                                 \
+        logger.error("SEH Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return Local<Value>();                                       \
+    }                                                                \
+    catch (...) {                                                    \
+        logger.error("Uncaught Exception Detected!");                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return Local<Value>();                                       \
     }
 
 // 至少COUNT个参数_Constructor
-#define CHECK_ARGS_COUNT_C(ARGS,COUNT) \
-    if(ARGS.size()<COUNT) \
-    { \
-        LOG_TOO_FEW_ARGS(); \
-        return nullptr; \
+#define CHECK_ARGS_COUNT_C(ARGS, COUNT) \
+    if (ARGS.size() < COUNT) {          \
+        LOG_TOO_FEW_ARGS();             \
+        return nullptr;                 \
     }
 
 // 检查是否TYPE类型_Constructor
-#define CHECK_ARG_TYPE_C(ARG,TYPE) \
-    if(ARG.getKind() != TYPE) \
-    { \
-        LOG_WRONG_ARG_TYPE(); \
-        return nullptr; \
+#define CHECK_ARG_TYPE_C(ARG, TYPE) \
+    if (ARG.getKind() != TYPE) {    \
+        LOG_WRONG_ARG_TYPE();       \
+        return nullptr;             \
     }
 
 // 检查是否TYPE类型_Setter
 #define CHECK_ARG_TYPE_S(ARG, TYPE) \
-    if (ARG.getKind() != TYPE)      \
-    {                               \
+    if (ARG.getKind() != TYPE) {    \
         LOG_WRONG_ARG_TYPE();       \
-        return;             \
+        return;                     \
     }
 
 // 截获引擎异常_Constructor
-#define CATCH_C(LOG) \
-    catch(const Exception& e) \
-    { \
-        logger.error(LOG##"\n"); PrintException(e); \
+#define CATCH_C(LOG)                                                 \
+    catch (const Exception& e) {                                     \
+        logger.error(LOG##"\n");                                     \
+        PrintException(e);                                           \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-        return nullptr; \
-    } \
-    catch(const std::exception &e) \
-    { \
-        logger.error("C++ Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return nullptr; \
-    } \
-    catch(const seh_exception &e) \
-    { \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return nullptr; \
-    } \
-    catch(...) \
-    { \
-        logger.error("Uncaught Exception Detected!"); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-        return nullptr; \
+        return nullptr;                                              \
+    }                                                                \
+    catch (const std::exception& e) {                                \
+        logger.error("C++ Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return nullptr;                                              \
+    }                                                                \
+    catch (const seh_exception& e) {                                 \
+        logger.error("SEH Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return nullptr;                                              \
+    }                                                                \
+    catch (...) {                                                    \
+        logger.error("Uncaught Exception Detected!");                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+        return nullptr;                                              \
     }
 
 // 截获引擎异常_Setter
 #define CATCH_S(LOG)                                                 \
-    catch (const Exception& e)                                       \
-    {                                                                \
+    catch (const Exception& e) {                                     \
         logger.error(LOG##"\n");                                     \
         PrintException(e);                                           \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
         return;                                                      \
     }                                                                \
-    catch (const std::exception& e)                                  \
-    {                                                                \
+    catch (const std::exception& e) {                                \
         logger.error("C++ Uncaught Exception Detected!");            \
         logger.error(TextEncoding::toUTF8(e.what()));                \
         LOG_ERROR_WITH_SCRIPT_INFO();                                \
         return;                                                      \
     }                                                                \
-    catch (const seh_exception& e)                                   \
-    {                                                                \
+    catch (const seh_exception& e) {                                 \
         logger.error("SEH Uncaught Exception Detected!");            \
         logger.error(TextEncoding::toUTF8(e.what()));                \
         LOG_ERROR_WITH_SCRIPT_INFO();                                \
         return;                                                      \
     }                                                                \
-    catch (...)                                                      \
-    {                                                                \
+    catch (...) {                                                    \
         logger.error("Uncaught Exception Detected!");                \
         LOG_ERROR_WITH_SCRIPT_INFO();                                \
         return;                                                      \
@@ -203,104 +185,86 @@ bool inline IsInstanceOf(Local<Value> v)
 
 
 // 截获引擎异常_Constructor
-#define CATCH_WITHOUT_RETURN(LOG) \
-    catch(const Exception& e) \
-    { \
-        logger.error(LOG##"\n"); PrintException(e); \
+#define CATCH_WITHOUT_RETURN(LOG)                                    \
+    catch (const Exception& e) {                                     \
+        logger.error(LOG##"\n");                                     \
+        PrintException(e);                                           \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-    } \
-    catch(const std::exception &e) \
-    { \
-        logger.error("C++ Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-    } \
-    catch(const seh_exception &e) \
-    { \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
-    } \
-    catch(...) \
-    { \
-        logger.error("Uncaught Exception Detected!"); \
-        LOG_ERROR_WITH_SCRIPT_INFO(); \
+    }                                                                \
+    catch (const std::exception& e) {                                \
+        logger.error("C++ Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+    }                                                                \
+    catch (const seh_exception& e) {                                 \
+        logger.error("SEH Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
+    }                                                                \
+    catch (...) {                                                    \
+        logger.error("Uncaught Exception Detected!");                \
+        LOG_ERROR_WITH_SCRIPT_INFO();                                \
     }
 
 // 截获回调函数异常
-#define CATCH_IN_CALLBACK(callback) \
-catch (const Exception& e) \
-{ \
-    PrintException(e); \
-    logger.error(std::string("In callback for ") + callback); \
-    logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-}
+#define CATCH_IN_CALLBACK(callback)                                  \
+    catch (const Exception& e) {                                     \
+        PrintException(e);                                           \
+        logger.error(std::string("In callback for ") + callback);    \
+        logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
+    }
 
 // 判断是否为浮点数
 bool CheckIsFloat(const Local<Value>& num);
 
 // 序列化
 template <typename T>
-void PrintValue(T &out, Local<Value> v);
+void PrintValue(T& out, Local<Value> v);
 
-template void PrintValue(std::ostream & out, Local<Value> v);
-template void PrintValue(Logger::OutputStream & out, Local<Value> v);
+template void PrintValue(std::ostream& out, Local<Value> v);
+template void PrintValue(Logger::OutputStream& out, Local<Value> v);
 
 std::string ValueToString(Local<Value> v);
 
 // Json 序列化 反序列化
 Local<Value> JsonToValue(std::string jsonStr);
 Local<Value> JsonToValue(fifo_json j);
-std::string ValueToJson(Local<Value> v,int formatIndent = -1);
+std::string ValueToJson(Local<Value> v, int formatIndent = -1);
 
 // Get the enum's ClassDefine<void> object
 // Limitation: enum values must be in range of [-128, 128)
 template <typename Type>
-struct EnumDefineBuilder
-{
+struct EnumDefineBuilder {
     template <Type val>
-    inline static Local<Value> serialize()
-    {
+    inline static Local<Value> serialize() {
         return Number::newNumber(static_cast<int>(val));
     }
-    inline static Local<Value> keys()
-    {
-        try
-        {
+    inline static Local<Value> keys() {
+        try {
             auto arr = Array::newArray();
-            for (auto& name : magic_enum::enum_names<Type>())
-            {
+            for (auto& name : magic_enum::enum_names<Type>()) {
                 arr.add(String::newString(name));
             }
             return arr;
-        }
-        catch (const std::exception&)
-        {
+        } catch (const std::exception&) {
             logger.error("Error in " __FUNCTION__);
         }
         return Local<Value>();
     }
-    inline static Local<Value> toObject()
-    {
-        try
-        {
+    inline static Local<Value> toObject() {
+        try {
             auto obj = Object::newObject();
-            for (auto& [value, name] : magic_enum::enum_entries<Type>())
-            {
+            for (auto& [value, name] : magic_enum::enum_entries<Type>()) {
                 obj.set(String::newString(name), Number::newNumber((int)value));
             }
             return obj;
-        }
-        catch (const std::exception&)
-        {
+        } catch (const std::exception&) {
             logger.error("Error in " __FUNCTION__);
         }
         return Local<Value>();
     }
-    inline static Local<Value> getName(const Arguments& args)
-    {
-        try
-        {
+    inline static Local<Value> getName(const Arguments& args) {
+        try {
             if (args.size() < 1)
                 return Local<Value>();
             if (args[0].isString())
@@ -308,55 +272,42 @@ struct EnumDefineBuilder
             if (args[0].isNumber())
                 return String::newString(magic_enum::enum_name(static_cast<Type>(args[0].toInt())));
             return Local<Value>();
-        }
-        catch (const std::exception&)
-        {
+        } catch (const std::exception&) {
             logger.error("Error in " __FUNCTION__);
         }
         return Local<Value>();
     }
 
-    inline static Local<Value> toString()
-    {
-        try
-        {
-            return String::newString(typeid(Type).name()+5);
-        }
-        catch (const std::exception&)
-        {
+    inline static Local<Value> toString() {
+        try {
+            return String::newString(typeid(Type).name() + 5);
+        } catch (const std::exception&) {
             logger.error("Error in " __FUNCTION__);
         }
         return Local<Value>();
     }
     template <Type val, std::enable_if_t<std::is_enum_v<Type>, char> max = static_cast<char>(*magic_enum::enum_values<Type>().rbegin())>
-    inline static void buildBuilder(script::ClassDefineBuilder<void>& builder)
-    {
+    inline static void buildBuilder(script::ClassDefineBuilder<void>& builder) {
         if constexpr (static_cast<char>(val) > max)
             return;
-        if constexpr (!magic_enum::enum_name(val).empty())
-        {
+        if constexpr (!magic_enum::enum_name(val).empty()) {
             fmt::print("{} = {},\n", magic_enum::enum_name(val), static_cast<int>(val));
             builder.property(magic_enum::enum_name(val).data(), &serialize<val>);
         }
         buildBuilder<static_cast<Type>((static_cast<char>(val) + 1)), max>(builder);
     }
     template <std::enable_if_t<std::is_enum_v<Type>, char> max = static_cast<char>(*magic_enum::enum_values<Type>().rbegin())>
-    inline static ClassDefine<void> build(std::string const& enumName)
-    {
+    inline static ClassDefine<void> build(std::string const& enumName) {
         script::ClassDefineBuilder<void> builder = defineClass(enumName);
-        //fmt::print("枚举 {} 可能取值：\n", enumName);
-        //buildBuilder<*magic_enum::enum_values<Type>().begin(), max>(builder);
+        // fmt::print("枚举 {} 可能取值：\n", enumName);
+        // buildBuilder<*magic_enum::enum_values<Type>().begin(), max>(builder);
 
-        for (auto& [val, name] : magic_enum::enum_entries<Type>())
-        {
-            //fmt::print("{} = {},\n", name, static_cast<int>(val));
+        for (auto& [val, name] : magic_enum::enum_entries<Type>()) {
+            // fmt::print("{} = {},\n", name, static_cast<int>(val));
             builder.property(std::string(name), [=]() -> Local<Value> {
-                try
-                {
+                try {
                     return Number::newNumber(static_cast<int>(val));
-                }
-                catch (const std::exception&)
-                {
+                } catch (const std::exception&) {
                     logger.error("Error in get {}.{}", enumName, name);
                 }
                 return Local<Value>();
@@ -364,9 +315,9 @@ struct EnumDefineBuilder
         }
 
         builder.property("keys", &keys);
-        //builder.property("object", &toObject);
+        // builder.property("object", &toObject);
         builder.function("getName", &getName);
-        //fmt::print("\n");
+        // fmt::print("\n");
         return builder.build();
     }
 };
diff --git a/ScriptEngine/API/BaseAPI.cpp b/ScriptEngine/API/BaseAPI.cpp
--- a/ScriptEngine/API/BaseAPI.cpp
+++ b/ScriptEngine/API/BaseAPI.cpp
@@ -47,71 +47,58 @@ ClassDefine<DirectionAngle> DirectionAngleBuilder =
         .instanceFunction("toString", &DirectionAngle::toString)
 
         .build();
-        
 
-//////////////////// IntPos ////////////////////   
 
-IntPos* IntPos::create(const Arguments& args)
-{
-    if(args.size() < 3)
+//////////////////// IntPos ////////////////////
+
+IntPos* IntPos::create(const Arguments& args) {
+    if (args.size() < 3)
         return nullptr;
-    try
-    {
-        IntPos *p = new IntPos(args.thiz());
+    try {
+        IntPos* p = new IntPos(args.thiz());
         p->x = args[0].asNumber().toInt32();
         p->y = args[1].asNumber().toInt32();
         p->z = args[2].asNumber().toInt32();
         p->dim = args[3].asNumber().toInt32();
         return p;
-    }
-    catch(...)
-    {
+    } catch (...) {
         return nullptr;
     }
 }
 
-Local<Object> IntPos::newPos(int x, int y, int z, int dim)
-{
-    return EngineScope::currentEngine()->newNativeClass<IntPos>(x,y,z,dim);
+Local<Object> IntPos::newPos(int x, int y, int z, int dim) {
+    return EngineScope::currentEngine()->newNativeClass<IntPos>(x, y, z, dim);
 }
 
-Local<Object> IntPos::newPos(const BlockPos &b, int dim)
-{
+Local<Object> IntPos::newPos(const BlockPos& b, int dim) {
     return IntPos::newPos(b.x, b.y, b.z, dim);
 }
 
-Local<Object> IntPos::newPos(const IntVec4 &v)
-{
+Local<Object> IntPos::newPos(const IntVec4& v) {
     return IntPos::newPos(v.x, v.y, v.z, v.dim);
 }
 
-Local<Object> IntPos::newPos(const BlockPos* b, int dim)
-{
+Local<Object> IntPos::newPos(const BlockPos* b, int dim) {
     return IntPos::newPos(b->x, b->y, b->z, dim);
 }
 
-Local<Object> IntPos::newPos(const BlockPos* b, BlockSource* bs)
-{
+Local<Object> IntPos::newPos(const BlockPos* b, BlockSource* bs) {
     return IntPos::newPos(b->x, b->y, b->z, (int)bs->getDimensionId());
 }
 
-IntPos* IntPos::extractPos(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<IntPos>(v))
+IntPos* IntPos::extractPos(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<IntPos>(v))
         return EngineScope::currentEngine()->getNativeInstance<IntPos>(v);
     else
         return nullptr;
 }
 
-Local<Value> IntPos::getDim()
-{
+Local<Value> IntPos::getDim() {
     return String::newString(DimId2Name(dim));
 }
 
-Local<Value> IntPos::toString()
-{
-    try
-    {
+Local<Value> IntPos::toString() {
+    try {
         return String::newString(fmt::format("{}({}, {}, {})", DimId2Name(dim), x, y, z));
     }
     CATCH("Fail in toString!");
@@ -119,73 +106,61 @@ Local<Value> IntPos::toString()
 
 //////////////////// FloatPos ////////////////////
 
-FloatPos* FloatPos::create(const Arguments& args)
-{
-    if(args.size() < 3)
+FloatPos* FloatPos::create(const Arguments& args) {
+    if (args.size() < 3)
         return nullptr;
-    try
-    {
-        FloatPos *p = new FloatPos(args.thiz());
+    try {
+        FloatPos* p = new FloatPos(args.thiz());
         p->x = args[0].asNumber().toFloat();
         p->y = args[1].asNumber().toFloat();
         p->z = args[2].asNumber().toFloat();
         p->dim = args[3].asNumber().toInt32();
         return p;
-    }
-    catch(...)
-    {
+    } catch (...) {
         return nullptr;
     }
 }
 
-Local<Object> FloatPos::newPos(double x, double y, double z, int dim)
-{
-    return EngineScope::currentEngine()->newNativeClass<FloatPos>(x,y,z,dim);
+Local<Object> FloatPos::newPos(double x, double y, double z, int dim) {
+    return EngineScope::currentEngine()->newNativeClass<FloatPos>(x, y, z, dim);
 }
 
-Local<Object> FloatPos::newPos(const Vec3 &v, int dim)
-{
+Local<Object> FloatPos::newPos(const Vec3& v, int dim) {
     return FloatPos::newPos(v.x, v.y, v.z, dim);
 }
 
-Local<Object> FloatPos::newPos(const FloatVec4 &v)
-{
+Local<Object> FloatPos::newPos(const FloatVec4& v) {
     return FloatPos::newPos(v.x, v.y, v.z, v.dim);
 }
 
-FloatPos* FloatPos::extractPos(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<FloatPos>(v))
+FloatPos* FloatPos::extractPos(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<FloatPos>(v))
         return EngineScope::currentEngine()->getNativeInstance<FloatPos>(v);
     else
         return nullptr;
 }
 
-Local<Value> FloatPos::getDim()
-{
+Local<Value> FloatPos::getDim() {
     string name;
-    switch (dim)
-    {
-    case 0:
-        name = tr("base.getDimName.0");
-        break;
-    case 1:
-        name = tr("base.getDimName.1");
-        break;
-    case 2:
-        name = tr("base.getDimName.2");
-        break;
-    default:
-        name = tr("base.getDimName.unknown");
-        break;
+    switch (dim) {
+        case 0:
+            name = tr("base.getDimName.0");
+            break;
+        case 1:
+            name = tr("base.getDimName.1");
+            break;
+        case 2:
+            name = tr("base.getDimName.2");
+            break;
+        default:
+            name = tr("base.getDimName.unknown");
+            break;
     }
     return String::newString(name);
 }
 
-Local<Value> FloatPos::toString()
-{
-    try
-    {
+Local<Value> FloatPos::toString() {
+    try {
         return String::newString(fmt::format("{}({}, {}, {})", DimId2Name(dim), x, y, z));
     }
     CATCH("Fail in toString!");
@@ -193,37 +168,29 @@ Local<Value> FloatPos::toString()
 
 //////////////////// DirectionAngle ////////////////////
 
-DirectionAngle* DirectionAngle::create(const Arguments& args)
-{
+DirectionAngle* DirectionAngle::create(const Arguments& args) {
     if (args.size() < 2)
         return nullptr;
-    try
-    {
+    try {
         DirectionAngle* pa = new DirectionAngle(args.thiz());
         pa->pitch = args[0].asNumber().toDouble();
         pa->yaw = args[1].asNumber().toDouble();
         return pa;
-    }
-    catch (...)
-    {
+    } catch (...) {
         return nullptr;
     }
 }
 
-Local<Value> DirectionAngle::toString()
-{
-    try
-    {
+Local<Value> DirectionAngle::toString() {
+    try {
         return String::newString(fmt::format("({}, {})", pitch, yaw));
     }
     CATCH("Fail in toString");
 }
 
-Local<Value> DirectionAngle::toFacing()
-{
+Local<Value> DirectionAngle::toFacing() {
     int facing = -1;
-    switch (Facing::convertYRotationToFacingDirection(yaw))
-    {
+    switch (Facing::convertYRotationToFacingDirection(yaw)) {
         case 2:
             facing = 0;
             break;
@@ -240,56 +207,47 @@ Local<Value> DirectionAngle::toFacing()
     return Number::newNumber(facing);
 }
 
-Local<Object> DirectionAngle::newAngle(float pitch, float yaw)
-{
+Local<Object> DirectionAngle::newAngle(float pitch, float yaw) {
     return EngineScope::currentEngine()->newNativeClass<DirectionAngle>(pitch, yaw);
 }
 
 //////////////////// APIs ////////////////////
 
-Local<Value> McClass::newIntPos(const Arguments& args)
-{
+Local<Value> McClass::newIntPos(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 4)
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[2], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[3], ValueKind::kNumber)
 
-    try
-    {
+    try {
         return IntPos::newPos(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt());
     }
     CATCH("Fail in NewIntPos!")
 }
 
-Local<Value> McClass::newFloatPos(const Arguments& args)
-{
+Local<Value> McClass::newFloatPos(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 4)
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[2], ValueKind::kNumber)
     CHECK_ARG_TYPE(args[3], ValueKind::kNumber)
 
-    try
-    {
+    try {
         return FloatPos::newPos(args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt());
     }
     CATCH("Fail in NewFloatPos!")
 }
 
-Local<Value> McClass::getBDSVersion(const Arguments& args)
-{
-    try
-    {
+Local<Value> McClass::getBDSVersion(const Arguments& args) {
+    try {
         return String::newString(LL::getBdsVersion());
     }
     CATCH("Fail in GetBDSVersion!")
 }
 
-Local<Value> McClass::getServerProtocolVersion(const Arguments& args)
-{
-    try
-    {
+Local<Value> McClass::getServerProtocolVersion(const Arguments& args) {
+    try {
         return Number::newNumber(LL::getServerProtocolVersion());
     }
     CATCH("Fail in GetServerProtocolVersion!")
diff --git a/ScriptEngine/API/BaseAPI.h b/ScriptEngine/API/BaseAPI.h
--- a/ScriptEngine/API/BaseAPI.h
+++ b/ScriptEngine/API/BaseAPI.h
@@ -8,74 +8,116 @@ class BlockSource;
 extern ClassDefine<void> DamageCauseEnumBuilder;
 
 //////////////////// Classes ////////////////////
-class IntPos : public IntVec4, public ScriptClass
-{
+class IntPos : public IntVec4, public ScriptClass {
 public:
-	explicit IntPos(const Local<Object>& scriptObj) : ScriptClass(scriptObj) {}
+    explicit IntPos(const Local<Object>& scriptObj)
+    : ScriptClass(scriptObj) {
+    }
     static IntPos* create(const Arguments& args);
 
-    static Local<Object> newPos(int x, int y, int z, int dim=-1);
-    static Local<Object> newPos(const BlockPos &b, int dim=-1);
+    static Local<Object> newPos(int x, int y, int z, int dim = -1);
+    static Local<Object> newPos(const BlockPos& b, int dim = -1);
     static Local<Object> newPos(const BlockPos* b, int dim = -1);
-    static Local<Object> newPos(const BlockPos* b, BlockSource *bs);
-    static Local<Object> newPos(const IntVec4 &v);
+    static Local<Object> newPos(const BlockPos* b, BlockSource* bs);
+    static Local<Object> newPos(const IntVec4& v);
     static IntPos* extractPos(Local<Value> v);
 
-    Local<Value> getX() { return Number::newNumber(x); }
-    Local<Value> getY() { return Number::newNumber(y); }
-    Local<Value> getZ() { return Number::newNumber(z); }
+    Local<Value> getX() {
+        return Number::newNumber(x);
+    }
+    Local<Value> getY() {
+        return Number::newNumber(y);
+    }
+    Local<Value> getZ() {
+        return Number::newNumber(z);
+    }
     Local<Value> getDim();
-    Local<Value> getDimId() { return Number::newNumber(dim); }
-    void setX(const Local<Value>& value) { x = value.asNumber().toInt64(); }
-    void setY(const Local<Value>& value) { y = value.asNumber().toInt64(); }
-    void setZ(const Local<Value>& value) { z = value.asNumber().toInt64(); }
-    void setDimId(const Local<Value>& value) { dim = value.asNumber().toInt32(); }
+    Local<Value> getDimId() {
+        return Number::newNumber(dim);
+    }
+    void setX(const Local<Value>& value) {
+        x = value.asNumber().toInt64();
+    }
+    void setY(const Local<Value>& value) {
+        y = value.asNumber().toInt64();
+    }
+    void setZ(const Local<Value>& value) {
+        z = value.asNumber().toInt64();
+    }
+    void setDimId(const Local<Value>& value) {
+        dim = value.asNumber().toInt32();
+    }
     Local<Value> toString();
 };
 extern ClassDefine<IntPos> IntPosBuilder;
 
-class FloatPos : public FloatVec4, public ScriptClass
-{
+class FloatPos : public FloatVec4, public ScriptClass {
 public:
-	explicit FloatPos(const Local<Object>& scriptObj) : ScriptClass(scriptObj) {}
+    explicit FloatPos(const Local<Object>& scriptObj)
+    : ScriptClass(scriptObj) {
+    }
     static FloatPos* create(const Arguments& args);
 
-    static Local<Object> newPos(double x, double y, double z, int dim=-1);
-    static Local<Object> newPos(const Vec3 &v, int dim=-1);
-    static Local<Object> newPos(const FloatVec4 &v);
+    static Local<Object> newPos(double x, double y, double z, int dim = -1);
+    static Local<Object> newPos(const Vec3& v, int dim = -1);
+    static Local<Object> newPos(const FloatVec4& v);
     static FloatPos* extractPos(Local<Value> v);
 
-    Local<Value> getX() { return Number::newNumber(x); }
-    Local<Value> getY() { return Number::newNumber(y); }
-    Local<Value> getZ() { return Number::newNumber(z); }
+    Local<Value> getX() {
+        return Number::newNumber(x);
+    }
+    Local<Value> getY() {
+        return Number::newNumber(y);
+    }
+    Local<Value> getZ() {
+        return Number::newNumber(z);
+    }
     Local<Value> getDim();
-    Local<Value> getDimId() { return Number::newNumber(dim); }
+    Local<Value> getDimId() {
+        return Number::newNumber(dim);
+    }
     Local<Value> toString();
 
 
-    void setX(const Local<Value>& value) { x = value.asNumber().toInt64(); }
-    void setY(const Local<Value>& value) { y = value.asNumber().toInt64(); }
-    void setZ(const Local<Value>& value) { z = value.asNumber().toInt64(); }
-    void setDimId(const Local<Value>& value) { dim = value.asNumber().toInt32(); }
+    void setX(const Local<Value>& value) {
+        x = value.asNumber().toInt64();
+    }
+    void setY(const Local<Value>& value) {
+        y = value.asNumber().toInt64();
+    }
+    void setZ(const Local<Value>& value) {
+        z = value.asNumber().toInt64();
+    }
+    void setDimId(const Local<Value>& value) {
+        dim = value.asNumber().toInt32();
+    }
 };
 extern ClassDefine<FloatPos> FloatPosBuilder;
 
-class DirectionAngle : public ScriptClass
-{
+class DirectionAngle : public ScriptClass {
 public:
     double pitch = 0, yaw = 0;
 
-    explicit DirectionAngle(const Local<Object>& scriptObj) : ScriptClass(scriptObj) {}
+    explicit DirectionAngle(const Local<Object>& scriptObj)
+    : ScriptClass(scriptObj) {
+    }
     static DirectionAngle* create(const Arguments& args);
-    
+
     static Local<Object> newAngle(float pitch, float yaw);
-    Local<Value> getPitch() { return Number::newNumber(pitch); }
-    Local<Value> getYaw() { return Number::newNumber(yaw); }
-    void setPitch(const Local<Value>& value) { pitch = value.asNumber().toDouble(); }
-    void setYaw(const Local<Value>& value) { yaw = value.asNumber().toDouble(); }
+    Local<Value> getPitch() {
+        return Number::newNumber(pitch);
+    }
+    Local<Value> getYaw() {
+        return Number::newNumber(yaw);
+    }
+    void setPitch(const Local<Value>& value) {
+        pitch = value.asNumber().toDouble();
+    }
+    void setYaw(const Local<Value>& value) {
+        yaw = value.asNumber().toDouble();
+    }
     Local<Value> toString();
 
     Local<Value> toFacing();
-
 };
 extern ClassDefine<DirectionAngle> DirectionAngleBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/BlockAPI.cpp b/ScriptEngine/API/BlockAPI.cpp
--- a/ScriptEngine/API/BlockAPI.cpp
+++ b/ScriptEngine/API/BlockAPI.cpp
@@ -20,7 +20,7 @@ ClassDefine<BlockClass> BlockClassBuilder =
     defineClass<BlockClass>("LLSE_Block")
         .constructor(nullptr)
         .instanceFunction("getRawPtr", &BlockClass::getRawPtr)
-        
+
         .instanceProperty("name", &BlockClass::getName)
         .instanceProperty("type", &BlockClass::getType)
         .instanceProperty("id", &BlockClass::getId)
@@ -35,8 +35,9 @@ ClassDefine<BlockClass> BlockClassBuilder =
         .instanceFunction("hasBlockEntity", &BlockClass::hasBlockEntity)
         .instanceFunction("getBlockEntity", &BlockClass::getBlockEntity)
         .instanceFunction("removeBlockEntity", &BlockClass::removeBlockEntity)
+        .instanceFunction("destroy", &BlockClass::destroyBlock)
 
-        //For Compatibility
+        // For Compatibility
         .instanceFunction("setTag", &BlockClass::setNbt)
         .instanceFunction("getTag", &BlockClass::getNbt)
         .build();
@@ -45,133 +46,126 @@ ClassDefine<BlockClass> BlockClassBuilder =
 //////////////////// Classes ////////////////////
 
 BlockClass::BlockClass(Block const* p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}),block(const_cast<Block*>(p))
-{
-    preloadData({ 0,0,0 }, -1);
+: ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}), block(const_cast<Block*>(p)) {
+    preloadData({0, 0, 0}, -1);
 }
 
 BlockClass::BlockClass(Block const* p, BlockPos bp, int dim)
-    :ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}),block(const_cast<Block*>(p))
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}), block(const_cast<Block*>(p)) {
     preloadData(bp, dim);
 }
 
-//生成函数
-Local<Object> BlockClass::newBlock(Block const* p, BlockPos const* pos, int dim)
-{
-    auto newp = new BlockClass(p,*pos,dim);
+// generating function
+Local<Object> BlockClass::newBlock(Block const* p, BlockPos const* pos, int dim) {
+    auto newp = new BlockClass(p, *pos, dim);
     return newp->getScriptObject();
 }
-Local<Object> BlockClass::newBlock(BlockPos const* pos, int dim)
-{
+Local<Object> BlockClass::newBlock(BlockPos const* pos, int dim) {
     return BlockClass::newBlock(Level::getBlock(const_cast<BlockPos*>(pos), dim), pos, dim);
 }
-Local<Object> BlockClass::newBlock(const BlockPos& pos, int dim)
-{
-    return newBlock((BlockPos*) & pos, dim);
+Local<Object> BlockClass::newBlock(const BlockPos& pos, int dim) {
+    return newBlock((BlockPos*)&pos, dim);
 }
-Local<Object> BlockClass::newBlock(Block const* p, BlockPos const* pos, BlockSource const* bs)
-{
-    auto newp = new BlockClass(p,*pos,bs->getDimensionId());
+Local<Object> BlockClass::newBlock(Block const* p, BlockPos const* pos, BlockSource const* bs) {
+    auto newp = new BlockClass(p, *pos, bs->getDimensionId());
     return newp->getScriptObject();
 }
-Local<Object> BlockClass::newBlock(IntVec4 pos)
-{
-    BlockPos bp = { pos.x, pos.y, pos.z };
-    return BlockClass::newBlock(Level::getBlock(bp,pos.dim), &bp, pos.dim);
+Local<Object> BlockClass::newBlock(IntVec4 pos) {
+    BlockPos bp = {pos.x, pos.y, pos.z};
+    return BlockClass::newBlock(Level::getBlock(bp, pos.dim), &bp, pos.dim);
 }
-Local<Object> BlockClass::newBlock(BlockInstance block)
-{
+Local<Object> BlockClass::newBlock(BlockInstance block) {
     BlockPos bp = block.getPosition();
     return BlockClass::newBlock(block.getBlock(), &bp, block.getDimensionId());
 }
-Block* BlockClass::extract(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<BlockClass>(v))
+Block* BlockClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<BlockClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<BlockClass>(v)->get();
     else
         return nullptr;
 }
 
-//成员函数
-void BlockClass::preloadData(BlockPos bp, int dim)
-{
+// member function
+void BlockClass::preloadData(BlockPos bp, int dim) {
     name = block->getTypeName(); // TODO
     type = block->getTypeName();
     id = block->getId();
-    pos = { bp.x,bp.y,bp.z,dim };
+    pos = {bp.x, bp.y, bp.z, dim};
 }
 
-Local<Value> BlockClass::getName()
-{
-    try{
-        // 已预加载
+Local<Value> BlockClass::getName() {
+    try {
+        // preloaded
         return String::newString(name);
     }
     CATCH("Fail in getBlockName!");
 }
 
-Local<Value> BlockClass::getType()
-{
-    try{
-        // 已预加载
+Local<Value> BlockClass::getType() {
+    try {
+        // preloaded
         return String::newString(type);
     }
     CATCH("Fail in getBlockType!");
 }
 
-Local<Value> BlockClass::getId()
-{
+Local<Value> BlockClass::getId() {
     try {
-        // 已预加载
+        // preloaded
         return Number::newNumber(id);
     }
     CATCH("Fail in getBlockId!");
 }
 
-Local<Value> BlockClass::getPos()
-{
-    try{
-        // 已预加载
+Local<Value> BlockClass::getPos() {
+    try {
+        // preloaded
         return IntPos::newPos(pos);
     }
     CATCH("Fail in getBlockPos!");
 }
 
-Local<Value> BlockClass::getTileData()
-{
-    try{
-        // 已预加载
+Local<Value> BlockClass::getTileData() {
+    try {
+        // preloaded
         return Number::newNumber(block->getTileData());
     }
     CATCH("Fail in getTileData!");
 }
 
-Local<Value> BlockClass::getRawPtr(const Arguments& args)
-{
+Local<Value> BlockClass::getRawPtr(const Arguments& args) {
     try {
         return Number::newNumber((intptr_t)block);
     }
     CATCH("Fail in getRawPtr!");
 }
 
-Local<Value> BlockClass::getNbt(const Arguments& args)
-{
+Local<Value> BlockClass::destroyBlock(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kBoolean);
+
+    try {
+        // same as `Level::getBlockInstance(pos.getBlockPos(), pos.dim).breakNaturally()` when drop
+        return Boolean::newBoolean(Global<Level>->destroyBlock(*Level::getBlockSource(pos.dim), pos.getBlockPos(), args[0].asBoolean().value()));
+    }
+    CATCH("Fail in destroyBlock!");
+}
+
+Local<Value> BlockClass::getNbt(const Arguments& args) {
     try {
         return NbtCompoundClass::pack(std::move(block->getNbt()));
     }
     CATCH("Fail in getNbt!");
 }
 
-Local<Value> BlockClass::setNbt(const Arguments& args)
-{
+Local<Value> BlockClass::setNbt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         auto nbt = NbtCompoundClass::extract(args[0]);
         if (!nbt)
-            return Local<Value>();    //Null
-        
+            return Local<Value>(); // Null
+
         // update Pre Data
         Level::setBlock(pos.getBlockPos(), pos.dim, (CompoundTag*)nbt);
         preloadData(pos.getBlockPos(), pos.getDimensionId());
@@ -180,128 +174,103 @@ Local<Value> BlockClass::setNbt(const Arguments& args)
     CATCH("Fail in setNbt!")
 }
 
-Local<Value> BlockClass::getBlockState(const Arguments& args)
-{
+Local<Value> BlockClass::getBlockState(const Arguments& args) {
     try {
         auto list = block->getNbt();
-        try
-        {
+        try {
             return Tag2Value((Tag*)list->get<Tag>("states"), true);
-        }
-        catch (...)
-        {
+        } catch (...) {
             return Array::newArray();
         }
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         return Object::newObject();
     }
     CATCH("Fail in getBlockState!")
 }
 
-Local<Value> BlockClass::hasContainer(const Arguments& args)
-{
+Local<Value> BlockClass::hasContainer(const Arguments& args) {
     try {
-        auto bl = Level::getBlockInstance({ pos.x, pos.y, pos.z }, pos.dim);
+        auto bl = Level::getBlockInstance({pos.x, pos.y, pos.z}, pos.dim);
         return Boolean::newBoolean(bl.hasContainer());
     }
     CATCH("Fail in hasContainer!");
 }
 
-Local<Value> BlockClass::getContainer(const Arguments& args)
-{
+Local<Value> BlockClass::getContainer(const Arguments& args) {
     try {
-        Container *container = Level::getBlockInstance({ pos.x, pos.y, pos.z }, pos.dim).getContainer();
+        Container* container = Level::getBlockInstance({pos.x, pos.y, pos.z}, pos.dim).getContainer();
         return container ? ContainerClass::newContainer(container) : Local<Value>();
     }
     CATCH("Fail in getContainer!");
 }
 
-Local<Value> BlockClass::hasBlockEntity(const Arguments& args)
-{
+Local<Value> BlockClass::hasBlockEntity(const Arguments& args) {
     try {
         return Boolean::newBoolean(block->hasBlockEntity());
     }
     CATCH("Fail in hasBlockEntity!");
 }
 
-Local<Value> BlockClass::getBlockEntity(const Arguments& args)
-{
+Local<Value> BlockClass::getBlockEntity(const Arguments& args) {
     try {
         BlockInstance bl = Level::getBlockInstance(pos.getBlockPos(), pos.dim);
         BlockActor* be = bl.getBlockEntity();
-        return be ? BlockEntityClass::newBlockEntity(be,pos.dim) : Local<Value>();
+        return be ? BlockEntityClass::newBlockEntity(be, pos.dim) : Local<Value>();
     }
     CATCH("Fail in getBlockEntity!");
 }
 
-Local<Value> BlockClass::removeBlockEntity(const Arguments& args)
-{
+Local<Value> BlockClass::removeBlockEntity(const Arguments& args) {
     try {
         BlockSource* bs = Level::getBlockSource(pos.dim);
-        bs->removeBlockEntity(pos.getBlockPos());       //==========???
+        bs->removeBlockEntity(pos.getBlockPos()); //==========???
         return Boolean::newBoolean(true);
     }
     CATCH("Fail in removeBlockEntity!");
 }
 
-//公用API
-Local<Value> McClass::getBlock(const Arguments& args)
-{
+// public API
+Local<Value> McClass::getBlock(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
-    try{
+    try {
         IntVec4 pos;
-        if (args.size() == 1)
-        {
+        if (args.size() == 1) {
             // IntPos
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = posObj->toIntVec4();
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if(args.size() == 4)
-        {
+        } else if (args.size() == 4) {
             // Number Pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
-            pos = { args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt() };
-        }
-        else
-        {
+            pos = {args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()};
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
-        auto block = Level::getBlockEx(pos.getBlockPos(),pos.dim);
-        if (!block)
-        {
+        auto block = Level::getBlockEx(pos.getBlockPos(), pos.dim);
+        if (!block) {
             // LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -311,93 +280,71 @@ Local<Value> McClass::getBlock(const Arguments& args)
     CATCH("Fail in GetBlock!")
 }
 
-Local<Value> McClass::setBlock(const Arguments& args)
-{
+Local<Value> McClass::setBlock(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
 
-    try
-    {
+    try {
         IntVec4 pos;
         Local<Value> block;
-        unsigned short tileData=0;
-        if (args.size() == 2|| args.size() == 3)
-        {
-            if (args.size() == 3)
-            {
+        unsigned short tileData = 0;
+        if (args.size() == 2 || args.size() == 3) {
+            if (args.size() == 3) {
                 CHECK_ARG_TYPE(args[1], ValueKind::kString);
                 CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
                 tileData = args[2].toInt();
             }
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                     block = args[1];
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = posObj->toIntVec4();
                     block = args[1];
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 5|| args.size() == 6)
-        {
+        } else if (args.size() == 5 || args.size() == 6) {
             // Number Pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
-            pos = { args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt() };
+            pos = {args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()};
             block = args[4];
-            if (args.size() == 6)
-            {
+            if (args.size() == 6) {
                 CHECK_ARG_TYPE(args[4], ValueKind::kString);
                 CHECK_ARG_TYPE(args[5], ValueKind::kNumber);
                 tileData = args[5].toInt();
             }
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
 
-        if (block.isString())
-        {
-            //方块名
+        if (block.isString()) {
+            // block name
             return Boolean::newBoolean(Level::setBlock(pos.getBlockPos(), pos.dim, block.toStr(), tileData));
-        }
-        else if (IsInstanceOf<NbtCompoundClass>(block))
-        {
-            //Nbt
+        } else if (IsInstanceOf<NbtCompoundClass>(block)) {
+            // Nbt
             Tag* nbt = NbtCompoundClass::extract(block);
             return Boolean::newBoolean(Level::setBlock(pos.getBlockPos(), pos.dim, (CompoundTag*)nbt));
-        }
-        else
-        {
-            //其他方块对象
+        } else {
+            // other block object
             Block* bl = BlockClass::extract(block);
-            if (!bl)
-            {
+            if (!bl) {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
@@ -407,55 +354,43 @@ Local<Value> McClass::setBlock(const Arguments& args)
     CATCH("Fail in SetBlock!")
 }
 
-Local<Value> McClass::spawnParticle(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args, 2)      
+Local<Value> McClass::spawnParticle(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
 
-    try
-    {
+    try {
         FloatVec4 pos;
         Local<Value> type;
 
-        if (args.size() == 2)
-        {
+        if (args.size() == 2) {
             // IntPos
             CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                     type = args[1];
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                     type = args[1];
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 5)
-        {
+        } else if (args.size() == 5) {
             // Number Pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -463,11 +398,9 @@ Local<Value> McClass::spawnParticle(const Arguments& args)
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[4], ValueKind::kString);
 
-            pos = {  args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt() };
+            pos = {args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt()};
             type = args[4];
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
diff --git a/ScriptEngine/API/BlockAPI.h b/ScriptEngine/API/BlockAPI.h
--- a/ScriptEngine/API/BlockAPI.h
+++ b/ScriptEngine/API/BlockAPI.h
@@ -7,13 +7,12 @@
 
 //////////////////// Classes ////////////////////
 class Block;
-class BlockClass : public ScriptClass
-{
+class BlockClass : public ScriptClass {
 private:
-    Block *block;
+    Block* block;
 
     // Pre data
-    std::string name,type;
+    std::string name, type;
     int id;
     IntVec4 pos;
 
@@ -22,12 +21,10 @@ class BlockClass : public ScriptClass
     BlockClass(Block const* p, BlockPos bp, int dim);
 
     void preloadData(BlockPos bp, int dim);
-    Block* get()
-    {
+    Block* get() {
         return block;
     }
-    BlockInstance toBlockInstance()
-    {
+    BlockInstance toBlockInstance() {
         return BlockInstance::createBlockInstance(block, pos.getBlockPos(), pos.getDimensionId());
     }
 
@@ -55,5 +52,6 @@ class BlockClass : public ScriptClass
     Local<Value> hasBlockEntity(const Arguments& args);
     Local<Value> getBlockEntity(const Arguments& args);
     Local<Value> removeBlockEntity(const Arguments& args);
+    Local<Value> destroyBlock(const Arguments& args);
 };
 extern ClassDefine<BlockClass> BlockClassBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/BlockEntityAPI.cpp b/ScriptEngine/API/BlockEntityAPI.cpp
--- a/ScriptEngine/API/BlockEntityAPI.cpp
+++ b/ScriptEngine/API/BlockEntityAPI.cpp
@@ -10,93 +10,85 @@
 //////////////////// Class Definition ////////////////////
 
 ClassDefine<BlockEntityClass> BlockEntityClassBuilder =
-	defineClass<BlockEntityClass>("LLSE_BlockEntity")
-		.constructor(nullptr)
-		.instanceFunction("getRawPtr", &BlockEntityClass::getRawPtr)
+    defineClass<BlockEntityClass>("LLSE_BlockEntity")
+        .constructor(nullptr)
+        .instanceFunction("getRawPtr", &BlockEntityClass::getRawPtr)
 
-		.instanceProperty("pos", &BlockEntityClass::getPos)
-		.instanceProperty("type", &BlockEntityClass::getType)
+        .instanceProperty("pos", &BlockEntityClass::getPos)
+        .instanceProperty("type", &BlockEntityClass::getType)
 
-		.instanceFunction("setNbt", &BlockEntityClass::setNbt)
-		.instanceFunction("getNbt", &BlockEntityClass::getNbt)
-		.instanceFunction("getBlock", &BlockEntityClass::getBlock)
-		.build();
+        .instanceFunction("setNbt", &BlockEntityClass::setNbt)
+        .instanceFunction("getNbt", &BlockEntityClass::getNbt)
+        .instanceFunction("getBlock", &BlockEntityClass::getBlock)
+        .build();
 
 
 //////////////////// Classes ////////////////////
 
 BlockEntityClass::BlockEntityClass(BlockActor* be, int dim)
-	:ScriptClass(ScriptClass::ConstructFromCpp<BlockEntityClass>{}),blockEntity(be),dim(dim)
-{ }
+: ScriptClass(ScriptClass::ConstructFromCpp<BlockEntityClass>{}), blockEntity(be), dim(dim) {
+}
 
-Local<Object> BlockEntityClass::newBlockEntity(BlockActor * be,int dim)
-{
-	auto newp = new BlockEntityClass(be, dim);
-	return newp->getScriptObject();
+Local<Object> BlockEntityClass::newBlockEntity(BlockActor* be, int dim) {
+    auto newp = new BlockEntityClass(be, dim);
+    return newp->getScriptObject();
 }
 
 //生成函数
-BlockActor* BlockEntityClass::extract(Local<Value> v)
-{
-	if (EngineScope::currentEngine()->isInstanceOf<BlockEntityClass>(v))
-		return EngineScope::currentEngine()->getNativeInstance<BlockEntityClass>(v)->get();
-	else
-		return nullptr;
+BlockActor* BlockEntityClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<BlockEntityClass>(v))
+        return EngineScope::currentEngine()->getNativeInstance<BlockEntityClass>(v)->get();
+    else
+        return nullptr;
 }
 
 //成员函数
-Local<Value> BlockEntityClass::getRawPtr(const Arguments& args)
-{
-	try {
-		return Number::newNumber((intptr_t)blockEntity);
-	}
-	CATCH("Fail in getRawPtr!")
+Local<Value> BlockEntityClass::getRawPtr(const Arguments& args) {
+    try {
+        return Number::newNumber((intptr_t)blockEntity);
+    }
+    CATCH("Fail in getRawPtr!")
 }
 
-Local<Value> BlockEntityClass::getPos()
-{
-	try {
-		return IntPos::newPos(blockEntity->getPosition(), dim);
-	}
-	CATCH("Fail in getBlockEntityPos!")
+Local<Value> BlockEntityClass::getPos() {
+    try {
+        return IntPos::newPos(blockEntity->getPosition(), dim);
+    }
+    CATCH("Fail in getBlockEntityPos!")
 }
 
-Local<Value> BlockEntityClass::getType()
-{
-	try {
-		return Number::newNumber((int)blockEntity->getType());
-	}
-	CATCH("Fail in getBlockEntityType!")
+Local<Value> BlockEntityClass::getType() {
+    try {
+        return Number::newNumber((int)blockEntity->getType());
+    }
+    CATCH("Fail in getBlockEntityType!")
 }
 
-Local<Value> BlockEntityClass::getNbt(const Arguments& args)
-{
-	try {
-		return NbtCompoundClass::pack(std::move(blockEntity->getNbt()));
-	}
-	CATCH("Fail in getNbt!")
+Local<Value> BlockEntityClass::getNbt(const Arguments& args) {
+    try {
+        return NbtCompoundClass::pack(std::move(blockEntity->getNbt()));
+    }
+    CATCH("Fail in getNbt!")
 }
 
-Local<Value> BlockEntityClass::setNbt(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
+Local<Value> BlockEntityClass::setNbt(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
 
-	try {
-		auto nbt = NbtCompoundClass::extract(args[0]);
-		if (!nbt)
-			return Local<Value>();    //Null
+    try {
+        auto nbt = NbtCompoundClass::extract(args[0]);
+        if (!nbt)
+            return Local<Value>(); // Null
 
-		blockEntity->setNbt(nbt, Level::getBlockSource(dim));
-		return Boolean::newBoolean(true);
-	}
-	CATCH("Fail in setNbt!")
+        blockEntity->setNbt(nbt, Level::getBlockSource(dim));
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in setNbt!")
 }
 
-Local<Value> BlockEntityClass::getBlock(const Arguments& args)
-{
-	try {
-		BlockPos bp = blockEntity->getPosition();
-		return BlockClass::newBlock(Level::getBlock(bp, dim), &bp, dim);
-	}
-	CATCH("Fail in getBlock!")
+Local<Value> BlockEntityClass::getBlock(const Arguments& args) {
+    try {
+        BlockPos bp = blockEntity->getPosition();
+        return BlockClass::newBlock(Level::getBlock(bp, dim), &bp, dim);
+    }
+    CATCH("Fail in getBlock!")
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/BlockEntityAPI.h b/ScriptEngine/API/BlockEntityAPI.h
--- a/ScriptEngine/API/BlockEntityAPI.h
+++ b/ScriptEngine/API/BlockEntityAPI.h
@@ -5,17 +5,15 @@
 
 //////////////////// Classes ////////////////////
 class BlockActor;
-class BlockEntityClass : public ScriptClass
-{
+class BlockEntityClass : public ScriptClass {
 private:
     BlockActor* blockEntity;
     int dim;
 
 public:
-    explicit BlockEntityClass(BlockActor* be,int dim);
+    explicit BlockEntityClass(BlockActor* be, int dim);
 
-    BlockActor* get()
-    {
+    BlockActor* get() {
         return blockEntity;
     }
 
diff --git a/ScriptEngine/API/CommandAPI.cpp b/ScriptEngine/API/CommandAPI.cpp
--- a/ScriptEngine/API/CommandAPI.cpp
+++ b/ScriptEngine/API/CommandAPI.cpp
@@ -56,20 +56,17 @@ ClassDefine<CommandClass> CommandClassBuilder =
 
 //////////////////// Helper ////////////////////
 
-bool LLSERemoveCmdCallback(script::ScriptEngine* engine)
-{
+bool LLSERemoveCmdCallback(script::ScriptEngine* engine) {
     erase_if(localShareData->commandCallbacks, [&engine](auto& data) {
         return data.second.fromEngine == engine;
     });
     return true;
 }
 
-Local<Value> convertResult(DynamicCommand::Result const& result)
-{
+Local<Value> convertResult(DynamicCommand::Result const& result) {
     if (!result.isSet)
-        return Local<Value>(); //null
-    switch (result.type)
-    {
+        return Local<Value>(); // null
+    switch (result.type) {
         case DynamicCommand::ParameterType::Bool:
             return Boolean::newBoolean(result.getRaw<bool>());
         case DynamicCommand::ParameterType::Int:
@@ -78,31 +75,25 @@ Local<Value> convertResult(DynamicCommand::Result const& result)
             return Number::newNumber(result.getRaw<float>());
         case DynamicCommand::ParameterType::String:
             return String::newString(result.getRaw<std::string>());
-        case DynamicCommand::ParameterType::Actor:
-        {
+        case DynamicCommand::ParameterType::Actor: {
             auto arr = Array::newArray();
-            for (auto i : result.get<std::vector<Actor*>>())
-            {
+            for (auto i : result.get<std::vector<Actor*>>()) {
                 arr.add(EntityClass::newEntity(i));
             }
             return arr;
         }
-        case DynamicCommand::ParameterType::Player:
-        {
+        case DynamicCommand::ParameterType::Player: {
             auto arr = Array::newArray();
-            for (auto i : result.get<std::vector<Player*>>())
-            {
+            for (auto i : result.get<std::vector<Player*>>()) {
                 arr.add(PlayerClass::newPlayer(i));
             }
             return arr;
         }
-        case DynamicCommand::ParameterType::BlockPos:
-        {
+        case DynamicCommand::ParameterType::BlockPos: {
             auto dim = result.origin->getDimension();
             return IntPos::newPos(result.get<BlockPos>(), dim ? (int)dim->getDimensionId() : -1);
         }
-        case DynamicCommand::ParameterType::Vec3:
-        {
+        case DynamicCommand::ParameterType::Vec3: {
             auto dim = result.origin->getDimension();
             return FloatPos::newPos(result.get<Vec3>(), dim ? (int)dim->getDimensionId() : -1);
         }
@@ -127,23 +118,19 @@ Local<Value> convertResult(DynamicCommand::Result const& result)
         case DynamicCommand::ParameterType::ActorType:
             return String::newString(result.getRaw<ActorDefinitionIdentifier const*>()->getCanonicalName());
         default:
-            return Local<Value>(); //null
+            return Local<Value>(); // null
             break;
     }
 }
 
 template <typename T>
-std::enable_if_t<std::is_enum_v<T>, T> parseEnum(Local<Value> const& value)
-{
-    if (value.isString())
-    {
+std::enable_if_t<std::is_enum_v<T>, T> parseEnum(Local<Value> const& value) {
+    if (value.isString()) {
         auto tmp = magic_enum::enum_cast<T>(value.toStr());
         if (!tmp.has_value())
             throw std::runtime_error("Unable to parse Enum value");
         return tmp.value();
-    }
-    else if (value.isNumber())
-    {
+    } else if (value.isNumber()) {
         return (T)value.toInt();
     }
     throw std::runtime_error("Unable to parse Enum value");
@@ -151,25 +138,21 @@ std::enable_if_t<std::is_enum_v<T>, T> parseEnum(Local<Value> const& value)
 
 //////////////////// MC APIs ////////////////////
 
-Local<Value> McClass::runcmd(const Arguments& args)
-{
+Local<Value> McClass::runcmd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try
-    {
+    try {
         return Boolean::newBoolean(Level::executeCommand(args[0].asString().toString()));
     }
     CATCH("Fail in RunCmd!")
 }
 
-Local<Value> McClass::runcmdEx(const Arguments& args)
-{
+Local<Value> McClass::runcmdEx(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try
-    {
+    try {
         std::pair<bool, string> result = Level::executeCommandEx(args[0].asString().toString());
         Local<Object> resObj = Object::newObject();
         resObj.set("success", result.first);
@@ -179,19 +162,16 @@ Local<Value> McClass::runcmdEx(const Arguments& args)
     CATCH("Fail in RunCmdEx!")
 }
 
-//name, description, permission, flag, alias
-Local<Value> McClass::newCommand(const Arguments& args)
-{
+// name, description, permission, flag, alias
+Local<Value> McClass::newCommand(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         auto name = args[0].toStr();
         auto instance = DynamicCommand::getInstance(name);
-        if (instance)
-        {
+        if (instance) {
             logger.info("Dynamic command {} already exists, changes will not be applied except for setOverload!", name);
             return CommandClass::newCommand(const_cast<std::add_pointer_t<std::remove_cv_t<std::remove_pointer_t<decltype(instance)>>>>(instance));
         }
@@ -200,29 +180,23 @@ Local<Value> McClass::newCommand(const Arguments& args)
         CommandPermissionLevel permission = CommandPermissionLevel::GameMasters;
         CommandFlag flag = {(CommandFlagValue)0x80};
         std::string alias = "";
-        if (args.size() > 2)
-        {
+        if (args.size() > 2) {
             permission = parseEnum<CommandPermissionLevel>(args[2]);
-            if (args.size() > 3)
-            {
+            if (args.size() > 3) {
                 CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
                 flag = {(CommandFlagValue)args[3].toInt()};
-                if (args.size() > 4)
-                {
+                if (args.size() > 4) {
                     CHECK_ARG_TYPE(args[4], ValueKind::kString);
                     alias = args[4].toStr();
                 }
             }
         }
         auto command = DynamicCommand::createCommand(name, desc, permission, flag);
-        if (command)
-        {
+        if (command) {
             if (!alias.empty())
                 command->setAlias(alias);
             return CommandClass::newCommand(std::move(command));
-        }
-        else
-        {
+        } else {
             return Boolean::newBoolean(false);
         }
     }
@@ -232,68 +206,59 @@ Local<Value> McClass::newCommand(const Arguments& args)
 //////////////////// Command APIs ////////////////////
 
 CommandClass::CommandClass(std::unique_ptr<DynamicCommandInstance>&& p)
-    : ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{})
-    , uptr(std::move(p))
-    , ptr(uptr.get())
-    , registered(false){};
+: ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{})
+, uptr(std::move(p))
+, ptr(uptr.get())
+, registered(false){};
 
 CommandClass::CommandClass(DynamicCommandInstance* p)
-    : ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{})
-    , uptr()
-    , ptr(p)
-    , registered(true){};
+: ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{})
+, uptr()
+, ptr(p)
+, registered(true){};
 
-Local<Object> CommandClass::newCommand(std::unique_ptr<DynamicCommandInstance>&& p)
-{
+Local<Object> CommandClass::newCommand(std::unique_ptr<DynamicCommandInstance>&& p) {
     auto newp = new CommandClass(std::move(p));
     return newp->getScriptObject();
 }
 
-Local<Object> CommandClass::newCommand(DynamicCommandInstance* p)
-{
+Local<Object> CommandClass::newCommand(DynamicCommandInstance* p) {
     auto newp = new CommandClass(p);
     return newp->getScriptObject();
 }
 
-Local<Value> CommandClass::getName()
-{
-    try
-    {
+Local<Value> CommandClass::getName() {
+    try {
         return String::newString(get()->getCommandName());
     }
     CATCH("Fail in getCommandName!")
 }
 
-Local<Value> CommandClass::setAlias(const Arguments& args)
-{
+Local<Value> CommandClass::setAlias(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
-    try
-    {
+    try {
         if (registered)
-            return Boolean::newBoolean(true); //TODO
+            return Boolean::newBoolean(true); // TODO
         return Boolean::newBoolean(get()->setAlias(args[0].toStr()));
     }
     CATCH("Fail in setAlias!")
 }
 
 // string, vector<string>
-Local<Value> CommandClass::setEnum(const Arguments& args)
-{
+Local<Value> CommandClass::setEnum(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
     CHECK_ARG_TYPE(args[1], ValueKind::kArray)
-    try
-    {
+    try {
         if (registered)
-            return Local<Value>(); //TODO
+            return Local<Value>(); // TODO
         auto enumName = args[0].toStr();
         auto enumArr = args[1].asArray();
         if (enumArr.size() == 0 || !enumArr.get(0).isString())
             return Local<Value>();
         vector<string> enumValues;
-        for (int i = 0; i < enumArr.size(); ++i)
-        {
+        for (int i = 0; i < enumArr.size(); ++i) {
             enumValues.push_back(enumArr.get(i).toStr());
         }
         return String::newString(get()->setEnum(enumName, std::move(enumValues)));
@@ -305,14 +270,12 @@ Local<Value> CommandClass::setEnum(const Arguments& args)
 // name, type, description, identifier, option
 // name, type, optional, description, option
 // name, type, description, option
-Local<Value> CommandClass::newParameter(const Arguments& args)
-{
+Local<Value> CommandClass::newParameter(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         if (registered)
-            return Boolean::newBoolean(true); //TODO
+            return Boolean::newBoolean(true); // TODO
         auto name = args[0].toStr();
         DynamicCommand::ParameterType type = parseEnum<DynamicCommand::ParameterType>(args[1]);
         std::string description = "";
@@ -337,14 +300,12 @@ Local<Value> CommandClass::newParameter(const Arguments& args)
 
 // name, type, description, identifier, option
 // name, type, description, option
-Local<Value> CommandClass::mandatory(const Arguments& args)
-{
+Local<Value> CommandClass::mandatory(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         if (registered)
-            return Boolean::newBoolean(true); //TODO
+            return Boolean::newBoolean(true); // TODO
         auto name = args[0].toStr();
         DynamicCommand::ParameterType type = parseEnum<DynamicCommand::ParameterType>(args[1]);
         std::string description = "";
@@ -367,14 +328,12 @@ Local<Value> CommandClass::mandatory(const Arguments& args)
 
 // name, type, description, identifier, option
 // name, type, description, option
-Local<Value> CommandClass::optional(const Arguments& args)
-{
+Local<Value> CommandClass::optional(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         if (registered)
-            return Boolean::newBoolean(true); //TODO
+            return Boolean::newBoolean(true); // TODO
         auto name = args[0].toStr();
         DynamicCommand::ParameterType type = parseEnum<DynamicCommand::ParameterType>(args[1]);
         std::string description = "";
@@ -397,55 +356,41 @@ Local<Value> CommandClass::optional(const Arguments& args)
 
 // vector<identifier>
 // vector<index>
-Local<Value> CommandClass::addOverload(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandClass::addOverload(const Arguments& args) {
+    try {
         if (registered)
-            return Boolean::newBoolean(true); //TODO
+            return Boolean::newBoolean(true); // TODO
         auto command = get();
         if (args.size() == 0)
             return Boolean::newBoolean(command->addOverload(std::vector<DynamicCommandInstance::ParameterIndex>{}));
-        if (args[0].isNumber())
-        {
+        if (args[0].isNumber()) {
             std::vector<DynamicCommandInstance::ParameterIndex> params;
-            for (int i = 0; i < args.size(); ++i)
-            {
+            for (int i = 0; i < args.size(); ++i) {
                 CHECK_ARG_TYPE(args[i], ValueKind::kNumber);
                 params.emplace_back(command, (size_t)args[i].asNumber().toInt64());
             }
             return Boolean::newBoolean(command->addOverload(std::move(params)));
-        }
-        else if (args[0].isString())
-        {
+        } else if (args[0].isString()) {
             std::vector<std::string> params;
-            for (int i = 0; i < args.size(); ++i)
-            {
+            for (int i = 0; i < args.size(); ++i) {
                 CHECK_ARG_TYPE(args[i], ValueKind::kString);
                 params.emplace_back(args[i].toStr());
             }
             return Boolean::newBoolean(command->addOverload(std::move(params)));
-        }
-        else if (args[0].isArray())
-        {
+        } else if (args[0].isArray()) {
             auto arr = args[0].asArray();
             if (arr.size() == 0)
                 return Boolean::newBoolean(command->addOverload(std::vector<DynamicCommandInstance::ParameterIndex>{}));
-            if (arr.get(0).isNumber())
-            {
+            if (arr.get(0).isNumber()) {
                 std::vector<DynamicCommandInstance::ParameterIndex> params;
-                for (int i = 0; i < arr.size(); ++i)
-                {
+                for (int i = 0; i < arr.size(); ++i) {
                     CHECK_ARG_TYPE(arr.get(i), ValueKind::kNumber);
                     params.emplace_back(command, (size_t)arr.get(i).asNumber().toInt64());
                 }
                 return Boolean::newBoolean(command->addOverload(std::move(params)));
-            }
-            else if (arr.get(0).isString())
-            {
+            } else if (arr.get(0).isString()) {
                 std::vector<std::string> params;
-                for (int i = 0; i < arr.size(); ++i)
-                {
+                for (int i = 0; i < arr.size(); ++i) {
                     CHECK_ARG_TYPE(arr.get(i), ValueKind::kString);
                     params.emplace_back(arr.get(i).toStr());
                 }
@@ -459,18 +404,15 @@ Local<Value> CommandClass::addOverload(const Arguments& args)
 }
 
 void onExecute(DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output,
-               std::unordered_map<std::string, DynamicCommand::Result>& results)
-{
+               std::unordered_map<std::string, DynamicCommand::Result>& results) {
     auto instance = command.getInstance();
     auto& commandName = instance->getCommandName();
-    if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end())
-    {
+    if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end()) {
         logger.warn("Command {} failed to execute, is the plugin unloaded?", commandName);
         return;
     }
     EngineScope enter(localShareData->commandCallbacks[commandName].fromEngine);
-    try
-    {
+    try {
         Local<Object> args = Object::newObject();
         auto cmd = CommandClass::newCommand(const_cast<DynamicCommandInstance*>(instance));
         auto ori = CommandOriginClass::newCommandOrigin(&origin);
@@ -484,34 +426,29 @@ void onExecute(DynamicCommand const& command, CommandOrigin const& origin, Comma
 
 // not complete
 void onExecute2(DynamicCommand const& command, CommandOrigin const& origin, CommandOutput& output,
-               std::unordered_map<std::string, DynamicCommand::Result>& results)
-{
+                std::unordered_map<std::string, DynamicCommand::Result>& results) {
     auto instance = command.getInstance();
     auto& commandName = instance->getCommandName();
-    if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end())
-    {
+    if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end()) {
         logger.warn("Command {} failed to execute, is the plugin unloaded?", commandName);
         return;
     }
     EngineScope enter(localShareData->commandCallbacks[commandName].fromEngine);
-    try
-    {
-        //auto ctx = CommandContextClass::newCommandContext(&command, &origin, &output, &results);
-        //Local<Object> args = Object::newObject();
-        //for (auto& [name, param] : results)
-        //    args.set(name, convertResult(param));
-        //localShareData->commandCallbacks[commandName].func.get().call({}, ctx, args);
+    try {
+        // auto ctx = CommandContextClass::newCommandContext(&command, &origin, &output, &results);
+        // Local<Object> args = Object::newObject();
+        // for (auto& [name, param] : results)
+        //     args.set(name, convertResult(param));
+        // localShareData->commandCallbacks[commandName].func.get().call({}, ctx, args);
     }
     CATCH_WITHOUT_RETURN("Fail in executing command \"" + commandName + "\"!")
 }
 
 // function (command, origin, output, results){}
-Local<Value> CommandClass::setCallback(const Arguments& args)
-{
+Local<Value> CommandClass::setCallback(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
-    try
-    {
+    try {
         auto func = args[0].asFunction();
         DynamicCommandInstance* command = get();
         auto& commandName = command->getCommandName();
@@ -525,12 +462,9 @@ Local<Value> CommandClass::setCallback(const Arguments& args)
 }
 
 // setup(Function<Command, Origin, Output, Map<String, Any>>)
-Local<Value> CommandClass::setup(const Arguments& args)
-{
-    try
-    {
-        if (args.size() > 0)
-        {
+Local<Value> CommandClass::setup(const Arguments& args) {
+    try {
+        if (args.size() > 0) {
             setCallback(args);
         }
         if (registered)
@@ -540,27 +474,22 @@ Local<Value> CommandClass::setup(const Arguments& args)
     CATCH("Fail in setup!")
 }
 
-Local<Value> CommandClass::isRegistered()
-{
+Local<Value> CommandClass::isRegistered() {
     return Boolean::newBoolean(registered);
 }
 
-Local<Value> CommandClass::toString(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandClass::toString(const Arguments& args) {
+    try {
         return String::newString(fmt::format("<Command({})>", get()->getCommandName()));
     }
     CATCH("Fail in toString!");
 }
 
-Local<Value> CommandClass::setSoftEnum(const Arguments& args)
-{
+Local<Value> CommandClass::setSoftEnum(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kArray);
-    try
-    {
+    try {
         auto name = args[0].toStr();
         auto enums = parseStringList(args[1].asArray());
         return String::newString(get()->setSoftEnum(name, std::move(enums)));
@@ -568,13 +497,11 @@ Local<Value> CommandClass::setSoftEnum(const Arguments& args)
     CATCH("Fail in setSoftEnum!");
 }
 
-Local<Value> CommandClass::addSoftEnumValues(const Arguments& args)
-{
+Local<Value> CommandClass::addSoftEnumValues(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kArray);
-    try
-    {
+    try {
         auto name = args[0].toStr();
         auto enums = parseStringList(args[1].asArray());
         return Boolean::newBoolean(get()->addSoftEnumValues(name, std::move(enums)));
@@ -582,13 +509,11 @@ Local<Value> CommandClass::addSoftEnumValues(const Arguments& args)
     CATCH("Fail in addSoftEnumValues!");
 }
 
-Local<Value> CommandClass::removeSoftEnumValues(const Arguments& args)
-{
+Local<Value> CommandClass::removeSoftEnumValues(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kArray);
-    try
-    {
+    try {
         auto name = args[0].toStr();
         auto enums = parseStringList(args[1].asArray());
         return Boolean::newBoolean(get()->removeSoftEnumValues(name, std::move(enums)));
@@ -596,22 +521,18 @@ Local<Value> CommandClass::removeSoftEnumValues(const Arguments& args)
     CATCH("Fail in removeSoftEnumValues!");
 }
 
-Local<Value> CommandClass::getSoftEnumValues(const Arguments& args)
-{
+Local<Value> CommandClass::getSoftEnumValues(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         auto name = args[0].toStr();
         return getStringArray(get()->getSoftEnumValues(name));
     }
     CATCH("Fail in getSoftEnumValues");
 }
 
-Local<Value> CommandClass::getSoftEnumNames(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandClass::getSoftEnumNames(const Arguments& args) {
+    try {
         return getStringArray(get()->getSoftEnumNames());
     }
     CATCH("Fail in getSoftEnumNames");
diff --git a/ScriptEngine/API/CommandAPI.h b/ScriptEngine/API/CommandAPI.h
--- a/ScriptEngine/API/CommandAPI.h
+++ b/ScriptEngine/API/CommandAPI.h
@@ -8,31 +8,25 @@ extern ClassDefine<void> ParamOptionStaticBuilder;
 
 bool LLSERemoveCmdCallback(script::ScriptEngine* engine);
 
-class CommandClass : public ScriptClass
-{
+class CommandClass : public ScriptClass {
     std::unique_ptr<DynamicCommandInstance> uptr;
     DynamicCommandInstance* ptr;
     bool registered = false;
-    inline DynamicCommandInstance* get()
-    {
+    inline DynamicCommandInstance* get() {
         return ptr;
     }
-    inline std::vector<std::string> parseStringList(Local<Array> arr)
-    {
+    inline std::vector<std::string> parseStringList(Local<Array> arr) {
         if (arr.size() == 0 || !arr.get(0).isString())
             return {};
         std::vector<std::string> strs;
-        for (size_t i = 0; i < arr.size(); i++)
-        {
+        for (size_t i = 0; i < arr.size(); ++i) {
             strs.push_back(arr.get(i).toStr());
         }
         return std::move(strs);
     }
-    inline Local<Value> getStringArray(std::vector<std::string> values)
-    {
+    inline Local<Value> getStringArray(std::vector<std::string> values) {
         Local<Array> arr = Array::newArray(values.size());
-        for (auto& str : values)
-        {
+        for (auto& str : values) {
             arr.add(String::newString(str));
         }
         return arr;
diff --git a/ScriptEngine/API/CommandCompatibleAPI.cpp b/ScriptEngine/API/CommandCompatibleAPI.cpp
--- a/ScriptEngine/API/CommandCompatibleAPI.cpp
+++ b/ScriptEngine/API/CommandCompatibleAPI.cpp
@@ -18,27 +18,22 @@ using namespace std;
 
 //////////////////// Helper ////////////////////
 
-bool RegisterCmd(const string& cmd, const string& describe, int cmdLevel)
-{
-    ::Global<CommandRegistry>->registerCommand(cmd, describe.c_str(), (CommandPermissionLevel)cmdLevel, { (CommandFlagValue)0 },
-        { (CommandFlagValue)0x80 });
+bool RegisterCmd(const string& cmd, const string& describe, int cmdLevel) {
+    ::Global<CommandRegistry>->registerCommand(cmd, describe.c_str(), (CommandPermissionLevel)cmdLevel, {(CommandFlagValue)0},
+                                               {(CommandFlagValue)0x80});
     return true;
 }
 
 // Helper
-void LLSERegisterNewCmd(bool isPlayerCmd, string cmd, const string& describe, int level, Local<Function> func)
-{
+void LLSERegisterNewCmd(bool isPlayerCmd, string cmd, const string& describe, int level, Local<Function> func) {
     if (cmd[0] == '/')
         cmd = cmd.erase(0, 1);
 
-    if (isPlayerCmd)
-    {
-        localShareData->playerCmdCallbacks[cmd] = { EngineScope::currentEngine(),level,script::Global<Function>(func) };
+    if (isPlayerCmd) {
+        localShareData->playerCmdCallbacks[cmd] = {EngineScope::currentEngine(), level, script::Global<Function>(func)};
         globalShareData->playerRegisteredCmd[cmd] = LLSE_BACKEND_TYPE;
-    }
-    else
-    {
-        localShareData->consoleCmdCallbacks[cmd] = { EngineScope::currentEngine(),level,script::Global<Function>(func) };
+    } else {
+        localShareData->consoleCmdCallbacks[cmd] = {EngineScope::currentEngine(), level, script::Global<Function>(func)};
         globalShareData->consoleRegisteredCmd[cmd] = LLSE_BACKEND_TYPE;
     }
 
@@ -46,11 +41,10 @@ void LLSERegisterNewCmd(bool isPlayerCmd, string cmd, const string& describe, in
     if (isCmdRegisterEnabled)
         RegisterCmd(cmd, describe, level);
     else
-        toRegCmdQueue.push_back({ cmd, describe, level });
+        toRegCmdQueue.push_back({cmd, describe, level});
 }
 
-bool LLSERemoveCmdRegister(ScriptEngine* engine)
-{
+bool LLSERemoveCmdRegister(ScriptEngine* engine) {
     erase_if(localShareData->playerCmdCallbacks, [&engine](auto& data) {
         return data.second.fromEngine == engine;
     });
@@ -61,8 +55,7 @@ bool LLSERemoveCmdRegister(ScriptEngine* engine)
 }
 // Helper
 
-Local<Value> McClass::regPlayerCmd(const Arguments& args)
-{
+Local<Value> McClass::regPlayerCmd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 3);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
@@ -75,8 +68,7 @@ Local<Value> McClass::regPlayerCmd(const Arguments& args)
         string describe = args[1].asString().toString();
         int level = 0;
 
-        if (args.size() >= 4)
-        {
+        if (args.size() >= 4) {
             int newLevel = args[3].asNumber().toInt32();
             if (newLevel >= 0 && newLevel <= 3)
                 level = newLevel;
@@ -88,8 +80,7 @@ Local<Value> McClass::regPlayerCmd(const Arguments& args)
     CATCH("Fail in RegisterPlayerCmd!");
 }
 
-Local<Value> McClass::regConsoleCmd(const Arguments& args)
-{
+Local<Value> McClass::regConsoleCmd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 3);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
@@ -105,21 +96,18 @@ Local<Value> McClass::regConsoleCmd(const Arguments& args)
     CATCH("Fail in RegisterConsoleCmd!");
 }
 
-//Helper
-bool SendCmdOutput(const std::string& output)
-{
+// Helper
+bool SendCmdOutput(const std::string& output) {
     string finalOutput(output);
     finalOutput += "\r\n";
 
     SymCall("??$_Insert_string@DU?$char_traits@D@std@@_K@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@QEBD_K@Z",
-        ostream&, ostream&, const char*, unsigned)
-        (cout, finalOutput.c_str(), finalOutput.size());
+            ostream&, ostream&, const char*, unsigned)(cout, finalOutput.c_str(), finalOutput.size());
     return true;
 }
-//Helper
+// Helper
 
-Local<Value> McClass::sendCmdOutput(const Arguments& args)
-{
+Local<Value> McClass::sendCmdOutput(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -129,27 +117,22 @@ Local<Value> McClass::sendCmdOutput(const Arguments& args)
     CATCH("Fail in SendCmdOutput!");
 }
 
-void ProcessRegCmdQueue()
-{
-    for (auto& cmdData : toRegCmdQueue)
-    {
+void ProcessRegCmdQueue() {
+    for (auto& cmdData : toRegCmdQueue) {
         RegisterCmd(cmdData.cmd, cmdData.describe, cmdData.level);
     }
     toRegCmdQueue.clear();
 }
 
-string LLSEFindCmdReg(bool isPlayerCmd, const string& cmd, vector<string>& receiveParas, bool *fromOtherEngine)
-{
+string LLSEFindCmdReg(bool isPlayerCmd, const string& cmd, vector<string>& receiveParas, bool* fromOtherEngine) {
     std::unordered_map<std::string, std::string>& registeredMap =
         isPlayerCmd ? globalShareData->playerRegisteredCmd : globalShareData->consoleRegisteredCmd;
-    for (auto& [prefix,fromEngine] : registeredMap)
-    {
+    for (auto& [prefix, fromEngine] : registeredMap) {
         if (cmd == prefix || (cmd.find(prefix) == 0 && cmd[prefix.size()] == ' '))
-            //如果命令与注册前缀全匹配，或者目标前缀后面为空格
+        //如果命令与注册前缀全匹配，或者目标前缀后面为空格
         {
-            //Matched
-            if (fromEngine != LLSE_BACKEND_TYPE)
-            {
+            // Matched
+            if (fromEngine != LLSE_BACKEND_TYPE) {
                 *fromOtherEngine = true;
                 return string();
             }
@@ -159,19 +142,16 @@ string LLSEFindCmdReg(bool isPlayerCmd, const string& cmd, vector<string>& recei
     std::map<std::string, CmdCallbackData, CmdCallbackMapCmp>& cmdMap =
         isPlayerCmd ? localShareData->playerCmdCallbacks : localShareData->consoleCmdCallbacks;
 
-    for (auto& cmdData : cmdMap)
-    {
+    for (auto& cmdData : cmdMap) {
         string prefix = cmdData.first;
         if (cmd == prefix || (cmd.find(prefix) == 0 && cmd[prefix.size()] == ' '))
-            //如果命令与注册前缀全匹配，或者目标前缀后面为空格
+        //如果命令与注册前缀全匹配，或者目标前缀后面为空格
         {
-            //Matched
-            if (cmd.size() > prefix.size())
-            {
+            // Matched
+            if (cmd.size() > prefix.size()) {
                 //除了注册前缀之外还有额外参数
                 receiveParas = SplitCmdLine(cmd.substr(prefix.size() + 1));
-            }
-            else
+            } else
                 receiveParas = vector<string>();
 
             return prefix;
@@ -180,13 +160,11 @@ string LLSEFindCmdReg(bool isPlayerCmd, const string& cmd, vector<string>& recei
     return string();
 }
 
-bool CallPlayerCmdCallback(Player* player, const string& cmdPrefix, const vector<string> &paras)
-{
+bool CallPlayerCmdCallback(Player* player, const string& cmdPrefix, const vector<string>& paras) {
     EngineScope enter(localShareData->playerCmdCallbacks[cmdPrefix].fromEngine);
     auto cmdData = localShareData->playerCmdCallbacks[cmdPrefix];
     Local<Value> res{};
-    try
-    {
+    try {
         Local<Array> args = Array::newArray();
         for (auto& para : paras)
             args.add(String::newString(para));
@@ -199,13 +177,11 @@ bool CallPlayerCmdCallback(Player* player, const string& cmdPrefix, const vector
     return true;
 }
 
-bool CallServerCmdCallback(const string& cmdPrefix, const vector<string>& paras)
-{
+bool CallServerCmdCallback(const string& cmdPrefix, const vector<string>& paras) {
     EngineScope enter(localShareData->consoleCmdCallbacks[cmdPrefix].fromEngine);
     auto cmdData = localShareData->consoleCmdCallbacks[cmdPrefix];
     Local<Value> res{};
-    try
-    {
+    try {
         Local<Array> args = Array::newArray();
         for (auto& para : paras)
             args.add(String::newString(para));
diff --git a/ScriptEngine/API/CommandCompatibleAPI.h b/ScriptEngine/API/CommandCompatibleAPI.h
--- a/ScriptEngine/API/CommandCompatibleAPI.h
+++ b/ScriptEngine/API/CommandCompatibleAPI.h
@@ -6,7 +6,7 @@
 //////////////////// LLSE Event Callbacks ////////////////////
 
 class Player;
-//helper
+// helper
 std::vector<std::string> SplitCmdLine(const std::string& paras);
 
 // 命令回调查询
diff --git a/ScriptEngine/API/CommandOriginAPI.cpp b/ScriptEngine/API/CommandOriginAPI.cpp
--- a/ScriptEngine/API/CommandOriginAPI.cpp
+++ b/ScriptEngine/API/CommandOriginAPI.cpp
@@ -42,66 +42,53 @@ ClassDefine<CommandOriginClass> CommandOriginClassBuilder =
 //////////////////// APIs ////////////////////
 
 CommandOriginClass::CommandOriginClass(CommandOrigin const* p)
-    : ScriptClass(ScriptClass::ConstructFromCpp<CommandOriginClass>{})
-    , ptr(p){};
+: ScriptClass(ScriptClass::ConstructFromCpp<CommandOriginClass>{})
+, ptr(p){};
 
-Local<Object> CommandOriginClass::newCommandOrigin(CommandOrigin const* p)
-{
+Local<Object> CommandOriginClass::newCommandOrigin(CommandOrigin const* p) {
     auto newp = new CommandOriginClass(p);
     return newp->getScriptObject();
 }
 
-Local<Value> CommandOriginClass::getOriginType()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getOriginType() {
+    try {
         return Number::newNumber((int)get()->getOriginType());
     }
     CATCH("Fail in getOriginType!");
 }
 
-Local<Value> CommandOriginClass::getOriginTypeName()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getOriginTypeName() {
+    try {
         return String::newString(magic_enum::enum_name((OriginType)get()->getOriginType()));
     }
     CATCH("Fail in getOriginTypeName!");
 }
 
-Local<Value> CommandOriginClass::getOriginName()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getOriginName() {
+    try {
         return String::newString(get()->getName());
     }
     CATCH("Fail in getOriginName!");
 }
 
-Local<Value> CommandOriginClass::getBlockPosition()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getBlockPosition() {
+    try {
         auto dim = get()->getDimension();
         return IntPos::newPos(get()->getBlockPosition(), dim ? (int)dim->getDimensionId() : 0);
     }
     CATCH("Fail in getBlockPosition!");
 }
 
-Local<Value> CommandOriginClass::getPosition()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getPosition() {
+    try {
         auto dim = get()->getDimension();
         return FloatPos::newPos(get()->getWorldPosition(), dim ? (int)dim->getDimensionId() : 0);
     }
     CATCH("Fail in getPosition!");
 }
 
-Local<Value> CommandOriginClass::getEntity()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getEntity() {
+    try {
         auto entity = get()->getEntity();
         if (!entity)
             return Local<Value>();
@@ -110,10 +97,8 @@ Local<Value> CommandOriginClass::getEntity()
     CATCH("Fail in getEntity!");
 }
 
-Local<Value> CommandOriginClass::getPlayer()
-{
-    try
-    {
+Local<Value> CommandOriginClass::getPlayer() {
+    try {
         auto player = get()->getPlayer();
         if (!player)
             return Local<Value>();
@@ -122,19 +107,15 @@ Local<Value> CommandOriginClass::getPlayer()
     CATCH("Fail in getPlayer!");
 }
 
-Local<Value> CommandOriginClass::getNbt(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandOriginClass::getNbt(const Arguments& args) {
+    try {
         return NbtCompoundClass::pack(std::make_unique<CompoundTag>(get()->serialize()));
     }
     CATCH("Fail in getNbt!");
 }
 
-Local<Value> CommandOriginClass::toString()
-{
-    try
-    {
+Local<Value> CommandOriginClass::toString() {
+    try {
         return String::newString("<CommandOrigin>");
     }
     CATCH("Fail in toString!");
diff --git a/ScriptEngine/API/CommandOriginAPI.h b/ScriptEngine/API/CommandOriginAPI.h
--- a/ScriptEngine/API/CommandOriginAPI.h
+++ b/ScriptEngine/API/CommandOriginAPI.h
@@ -7,11 +7,9 @@ extern ClassDefine<void> OriginTypeStaticBuilder;
 extern ClassDefine<CommandOriginClass> CommandOriginClassBuilder;
 
 
-class CommandOriginClass : public ScriptClass
-{
+class CommandOriginClass : public ScriptClass {
     CommandOrigin const* ptr;
-    inline CommandOrigin const* get()
-    {
+    inline CommandOrigin const* get() {
         return ptr;
     }
 
diff --git a/ScriptEngine/API/CommandOutputAPI.cpp b/ScriptEngine/API/CommandOutputAPI.cpp
--- a/ScriptEngine/API/CommandOutputAPI.cpp
+++ b/ScriptEngine/API/CommandOutputAPI.cpp
@@ -19,54 +19,46 @@ ClassDefine<CommandOutputClass> CommandOutputClassBuilder =
 //////////////////// APIs ////////////////////
 
 CommandOutputClass::CommandOutputClass(CommandOutput* p)
-    : ScriptClass(ScriptClass::ConstructFromCpp<CommandOutputClass>{})
-    , ptr(p){};
+: ScriptClass(ScriptClass::ConstructFromCpp<CommandOutputClass>{})
+, ptr(p){};
 
-Local<Object> CommandOutputClass::newCommandOutput(CommandOutput* p)
-{
+Local<Object> CommandOutputClass::newCommandOutput(CommandOutput* p) {
     auto newp = new CommandOutputClass(p);
     return newp->getScriptObject();
 }
 
-//MCAPI bool empty() const;
-Local<Value> CommandOutputClass::empty()
-{
-    try
-    {
+// MCAPI bool empty() const;
+Local<Value> CommandOutputClass::empty() {
+    try {
         return Boolean::newBoolean(get()->empty());
     }
     CATCH("Fail in empty!");
 }
 
 
-    //MCAPI int getSuccessCount() const;
-Local<Value> CommandOutputClass::getSuccessCount()
-{
-    try
-    {
+// MCAPI int getSuccessCount() const;
+Local<Value> CommandOutputClass::getSuccessCount() {
+    try {
         return Number::newNumber(get()->getSuccessCount());
     }
     CATCH("Fail in getSuccessCount!");
 };
 
-//MCAPI enum CommandOutputType getType() const;
-//Local<Value> CommandOutputClass::getType()
+// MCAPI enum CommandOutputType getType() const;
+// Local<Value> CommandOutputClass::getType()
 //{
-//    try
-//    {
-//        return String::newString(magic_enum::enum_name(get()->getType()));
-//    }
-//    CATCH("Fail in getType!");
-//};
-
-//MCAPI void success(std::string const&, std::vector<class CommandOutputParameter> const&);
-//MCAPI void success();
-Local<Value> CommandOutputClass::success(const Arguments& args)
-{
-    try
-    {
-        if (args.size() == 0)
-        {
+//     try
+//     {
+//         return String::newString(magic_enum::enum_name(get()->getType()));
+//     }
+//     CATCH("Fail in getType!");
+// };
+
+// MCAPI void success(std::string const&, std::vector<class CommandOutputParameter> const&);
+// MCAPI void success();
+Local<Value> CommandOutputClass::success(const Arguments& args) {
+    try {
+        if (args.size() == 0) {
             get()->success();
             return Boolean::newBoolean(true);
         }
@@ -78,10 +70,8 @@ Local<Value> CommandOutputClass::success(const Arguments& args)
     CATCH("Fail in success!");
 };
 
-Local<Value> CommandOutputClass::addMessage(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandOutputClass::addMessage(const Arguments& args) {
+    try {
         CHECK_ARG_TYPE(args[0], ValueKind::kString);
         auto msg = args[0].toStr();
         get()->addMessage(msg);
@@ -90,13 +80,11 @@ Local<Value> CommandOutputClass::addMessage(const Arguments& args)
     CATCH("Fail in addMessage!");
 };
 
-//MCAPI void error(std::string const&, std::vector<class CommandOutputParameter> const&);
-Local<Value> CommandOutputClass::error(const Arguments& args)
-{
+// MCAPI void error(std::string const&, std::vector<class CommandOutputParameter> const&);
+Local<Value> CommandOutputClass::error(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         auto msg = args[0].toStr();
         get()->error(msg);
         return Boolean::newBoolean(true);
@@ -104,13 +92,9 @@ Local<Value> CommandOutputClass::error(const Arguments& args)
     CATCH("Fail in error!");
 };
 
-Local<Value> CommandOutputClass::toString(const Arguments& args)
-{
-    try
-    {
+Local<Value> CommandOutputClass::toString(const Arguments& args) {
+    try {
         return String::newString("<CommandOutput>");
     }
     CATCH("Fail in toString!");
 };
-
-
diff --git a/ScriptEngine/API/CommandOutputAPI.h b/ScriptEngine/API/CommandOutputAPI.h
--- a/ScriptEngine/API/CommandOutputAPI.h
+++ b/ScriptEngine/API/CommandOutputAPI.h
@@ -5,11 +5,9 @@
 class CommandOutputClass;
 extern ClassDefine<CommandOutputClass> CommandOutputClassBuilder;
 
-class CommandOutputClass : public ScriptClass
-{
+class CommandOutputClass : public ScriptClass {
     CommandOutput* ptr;
-    inline CommandOutput* get()
-    {
+    inline CommandOutput* get() {
         return ptr;
     }
 
@@ -17,54 +15,54 @@ class CommandOutputClass : public ScriptClass
     CommandOutputClass(CommandOutput* p);
     static Local<Object> newCommandOutput(CommandOutput* p);
 
-    //MCAPI bool empty() const;
+    // MCAPI bool empty() const;
     Local<Value> empty();
 
-    //MCAPI int getSuccessCount() const;
+    // MCAPI int getSuccessCount() const;
     Local<Value> getSuccessCount();
 
-    //MCAPI enum CommandOutputType getType() const;
-    //Local<Value> getType();
+    // MCAPI enum CommandOutputType getType() const;
+    // Local<Value> getType();
 
-    //MCAPI void success(std::string const&, std::vector<class CommandOutputParameter> const&);
-    //MCAPI void success();
+    // MCAPI void success(std::string const&, std::vector<class CommandOutputParameter> const&);
+    // MCAPI void success();
     Local<Value> success(const Arguments& args);
 
     Local<Value> addMessage(const Arguments& args);
 
-    //MCAPI void error(std::string const&, std::vector<class CommandOutputParameter> const&);
+    // MCAPI void error(std::string const&, std::vector<class CommandOutputParameter> const&);
     Local<Value> error(const Arguments& args);
 
-    //MCAPI void setHasPlayerText();
-    //Local<Value> setHasPlayerText()
+    // MCAPI void setHasPlayerText();
+    // Local<Value> setHasPlayerText()
     //{
-    //    try
-    //    {
-    //        get()->setHasPlayerText();
-    //        return Boolean::newBoolean(true);
-    //    }
-    //    CATCH("Fail in getBlockPosition!");
-    //};
-    //MCAPI bool wantsData() const;
-    //Local<Value> wantsData()
+    //     try
+    //     {
+    //         get()->setHasPlayerText();
+    //         return Boolean::newBoolean(true);
+    //     }
+    //     CATCH("Fail in getBlockPosition!");
+    // };
+    // MCAPI bool wantsData() const;
+    // Local<Value> wantsData()
     //{
-    //    try
-    //    {
-    //        return Boolean::newBoolean(get()->wantsData());
-    //    }
-    //    CATCH("Fail in getBlockPosition!");
-    //};
-    //MCAPI void addToResultList(std::string const&, std::string const&);
-    //MCAPI void addToResultList(std::string const&, class Actor const&);
-    //Local<Value> addToResultList(const Arguments& args);
-    //MCAPI void forceOutput(std::string const&, std::vector<class CommandOutputParameter> const&);
-    //Local<Value> forceOutput(const Arguments& args);
-    //MCAPI class CommandPropertyBag const& getData() const;
-    //Local<Value> getData() const;
-    //MCAPI std::vector<class CommandOutputMessage> const& getMessages() const;
-    //Local<Value> getMessages() const;
-    //MCAPI void load(enum CommandOutputType, int, std::vector<class CommandOutputMessage>&&, std::unique_ptr<class CommandPropertyBag>&&);
-    //Local<Value> load(const Arguments& args);
+    //     try
+    //     {
+    //         return Boolean::newBoolean(get()->wantsData());
+    //     }
+    //     CATCH("Fail in getBlockPosition!");
+    // };
+    // MCAPI void addToResultList(std::string const&, std::string const&);
+    // MCAPI void addToResultList(std::string const&, class Actor const&);
+    // Local<Value> addToResultList(const Arguments& args);
+    // MCAPI void forceOutput(std::string const&, std::vector<class CommandOutputParameter> const&);
+    // Local<Value> forceOutput(const Arguments& args);
+    // MCAPI class CommandPropertyBag const& getData() const;
+    // Local<Value> getData() const;
+    // MCAPI std::vector<class CommandOutputMessage> const& getMessages() const;
+    // Local<Value> getMessages() const;
+    // MCAPI void load(enum CommandOutputType, int, std::vector<class CommandOutputMessage>&&, std::unique_ptr<class CommandPropertyBag>&&);
+    // Local<Value> load(const Arguments& args);
 
     Local<Value> toString(const Arguments& args);
 };
diff --git a/ScriptEngine/API/ContainerAPI.cpp b/ScriptEngine/API/ContainerAPI.cpp
--- a/ScriptEngine/API/ContainerAPI.cpp
+++ b/ScriptEngine/API/ContainerAPI.cpp
@@ -8,201 +8,181 @@ using namespace std;
 //////////////////// Class Definition ////////////////////
 
 ClassDefine<ContainerClass> ContainerClassBuilder =
-	defineClass<ContainerClass>("LLSE_Container")
-		.constructor(nullptr)
-		.instanceFunction("getRawPtr", &ContainerClass::getRawPtr)
-
-		.instanceProperty("size", &ContainerClass::getSize)
-		.instanceProperty("type", &ContainerClass::getType)
-
-		.instanceFunction("addItem", &ContainerClass::addItem)
-		.instanceFunction("addItemToFirstEmptySlot", &ContainerClass::addItemToFirstEmptySlot)
-		.instanceFunction("hasRoomFor", &ContainerClass::hasRoomFor)
-		.instanceFunction("removeItem", &ContainerClass::removeItem)
-		.instanceFunction("getItem", &ContainerClass::getItem)
-		.instanceFunction("setItem", &ContainerClass::setItem)
-		.instanceFunction("getAllItems", &ContainerClass::getAllItems)
-		.instanceFunction("removeAllItems", &ContainerClass::removeAllItems)
-		.instanceFunction("isEmpty", &ContainerClass::isEmpty)
-
-		//For Compatibility
-		.instanceFunction("getSlot", &ContainerClass::getItem)
-		.instanceFunction("getAllSlots", &ContainerClass::getAllItems)
-		.build();
+    defineClass<ContainerClass>("LLSE_Container")
+        .constructor(nullptr)
+        .instanceFunction("getRawPtr", &ContainerClass::getRawPtr)
+
+        .instanceProperty("size", &ContainerClass::getSize)
+        .instanceProperty("type", &ContainerClass::getType)
+
+        .instanceFunction("addItem", &ContainerClass::addItem)
+        .instanceFunction("addItemToFirstEmptySlot", &ContainerClass::addItemToFirstEmptySlot)
+        .instanceFunction("hasRoomFor", &ContainerClass::hasRoomFor)
+        .instanceFunction("removeItem", &ContainerClass::removeItem)
+        .instanceFunction("getItem", &ContainerClass::getItem)
+        .instanceFunction("setItem", &ContainerClass::setItem)
+        .instanceFunction("getAllItems", &ContainerClass::getAllItems)
+        .instanceFunction("removeAllItems", &ContainerClass::removeAllItems)
+        .instanceFunction("isEmpty", &ContainerClass::isEmpty)
+
+        // For Compatibility
+        .instanceFunction("getSlot", &ContainerClass::getItem)
+        .instanceFunction("getAllSlots", &ContainerClass::getAllItems)
+        .build();
 
 //////////////////// Classes ////////////////////
 
 ContainerClass::ContainerClass(Container* p)
-	:ScriptClass(ScriptClass::ConstructFromCpp<ContainerClass>{}), container(p)
-{ }
+: ScriptClass(ScriptClass::ConstructFromCpp<ContainerClass>{}), container(p) {
+}
 
 //生成函数
-Local<Object> ContainerClass::newContainer(Container* p)
-{
-	auto newp = new ContainerClass(p);
-	return newp->getScriptObject();
+Local<Object> ContainerClass::newContainer(Container* p) {
+    auto newp = new ContainerClass(p);
+    return newp->getScriptObject();
 }
-Container* ContainerClass::extract(Local<Value> v)
-{
-	if (EngineScope::currentEngine()->isInstanceOf<ContainerClass>(v))
-		return EngineScope::currentEngine()->getNativeInstance<ContainerClass>(v)->get();
-	else
-		return nullptr;
+Container* ContainerClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<ContainerClass>(v))
+        return EngineScope::currentEngine()->getNativeInstance<ContainerClass>(v)->get();
+    else
+        return nullptr;
 }
 
 //成员函数
-Local<Value> ContainerClass::getSize()
-{
-	try {
-		return Number::newNumber(container->getSize());
-	}
-	CATCH("Fail in getSize!")
+Local<Value> ContainerClass::getSize() {
+    try {
+        return Number::newNumber(container->getSize());
+    }
+    CATCH("Fail in getSize!")
 }
 
-Local<Value> ContainerClass::getType()
-{
-	try {
-		return String::newString(container->getTypeName());
-	}
-	CATCH("Fail in getType!")
+Local<Value> ContainerClass::getType() {
+    try {
+        return String::newString(container->getTypeName());
+    }
+    CATCH("Fail in getType!")
 }
 
-Local<Value> ContainerClass::getRawPtr(const Arguments& args)
-{
-	try {
-		return Number::newNumber((intptr_t)container);
-	}
-	CATCH("Fail in getRawPtr!")
+Local<Value> ContainerClass::getRawPtr(const Arguments& args) {
+    try {
+        return Number::newNumber((intptr_t)container);
+    }
+    CATCH("Fail in getRawPtr!")
 }
 
-Local<Value> ContainerClass::addItem(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
+Local<Value> ContainerClass::addItem(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
 
-	try {
-		ItemStack* item = ItemClass::extract(args[0]);
-		if (!item)
-		{
+    try {
+        ItemStack* item = ItemClass::extract(args[0]);
+        if (!item) {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
-		return Boolean::newBoolean(container->addItem_s(item));
-	}
-	CATCH("Fail in addItem!");
+            return Local<Value>();
+        }
+        return Boolean::newBoolean(container->addItem_s(item));
+    }
+    CATCH("Fail in addItem!");
 }
 
-Local<Value> ContainerClass::addItemToFirstEmptySlot(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
+Local<Value> ContainerClass::addItemToFirstEmptySlot(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
 
-	try {
-		ItemStack* item = ItemClass::extract(args[0]);
-		if (!item)
-        {
+    try {
+        ItemStack* item = ItemClass::extract(args[0]);
+        if (!item) {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
-		return Boolean::newBoolean(container->addItemToFirstEmptySlot_s(item));
-	}
-	CATCH("Fail in addItemToFirstEmptySlot!");
+            return Local<Value>();
+        }
+        return Boolean::newBoolean(container->addItemToFirstEmptySlot_s(item));
+    }
+    CATCH("Fail in addItemToFirstEmptySlot!");
 }
 
-Local<Value> ContainerClass::hasRoomFor(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
+Local<Value> ContainerClass::hasRoomFor(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
 
-	try {
-		ItemStack* item = ItemClass::extract(args[0]);
-		if (!item)
-        {
+    try {
+        ItemStack* item = ItemClass::extract(args[0]);
+        if (!item) {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
-		return Boolean::newBoolean(container->hasRoomForItem(*item));
-	}
-	CATCH("Fail in hasRoomFor!");
+            return Local<Value>();
+        }
+        return Boolean::newBoolean(container->hasRoomForItem(*item));
+    }
+    CATCH("Fail in hasRoomFor!");
 }
 
-Local<Value> ContainerClass::removeItem(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 2);
-	CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-	CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
-
-	try {
-		container->removeItem_s(args[0].toInt(), args[1].toInt());
-		return Boolean::newBoolean(true);
-	}
-	CATCH("Fail in removeItem!");
+Local<Value> ContainerClass::removeItem(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+    CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
+
+    try {
+        container->removeItem_s(args[0].toInt(), args[1].toInt());
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in removeItem!");
 }
 
-Local<Value> ContainerClass::getItem(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
-	CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-
-	try {
-		ItemStack* item = (ItemStack*) & container->getItem(args[0].toInt());
-		if (!item)
-		{
-			LOG_ERROR_WITH_SCRIPT_INFO("Fail to get slot from container!");
-			return Local<Value>();
-		}
-		return ItemClass::newItem(item);
-	}
-	CATCH("Fail in getItem!");
+Local<Value> ContainerClass::getItem(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
+    try {
+        ItemStack* item = (ItemStack*)&container->getItem(args[0].toInt());
+        if (!item) {
+            LOG_ERROR_WITH_SCRIPT_INFO("Fail to get slot from container!");
+            return Local<Value>();
+        }
+        return ItemClass::newItem(item);
+    }
+    CATCH("Fail in getItem!");
 }
 
-Local<Value> ContainerClass::setItem(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 2);
-	CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+Local<Value> ContainerClass::setItem(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-	try {
-		ItemStack* item = ItemClass::extract(args[1]);
-		if (!item)
-		{
+    try {
+        ItemStack* item = ItemClass::extract(args[1]);
+        if (!item) {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		ItemStack* itemOld = (ItemStack*)&container->getItem(args[0].toInt());
-		if (!itemOld)
-			return Boolean::newBoolean(false);
+        ItemStack* itemOld = (ItemStack*)&container->getItem(args[0].toInt());
+        if (!itemOld)
+            return Boolean::newBoolean(false);
 
-		return Boolean::newBoolean(itemOld->setItem(item));
-	}
-	CATCH("Fail in getItem!");
+        return Boolean::newBoolean(itemOld->setItem(item));
+    }
+    CATCH("Fail in getItem!");
 }
 
-Local<Value> ContainerClass::getAllItems(const Arguments& args)
-{
-	try {
-		auto list = container->getAllSlots();
-
-		Local<Array> res = Array::newArray();
-		for (auto& item : list)
-		{
-			res.add(ItemClass::newItem((ItemStack*)item));
-		}
-		return res;
-	}
-	CATCH("Fail in getAllItems!");
+Local<Value> ContainerClass::getAllItems(const Arguments& args) {
+    try {
+        auto list = container->getAllSlots();
+
+        Local<Array> res = Array::newArray();
+        for (auto& item : list) {
+            res.add(ItemClass::newItem((ItemStack*)item));
+        }
+        return res;
+    }
+    CATCH("Fail in getAllItems!");
 }
 
-Local<Value> ContainerClass::removeAllItems(const Arguments& args)
-{
-	try {
-		container->removeAllItems();
-		return Boolean::newBoolean(true);
-	}
-	CATCH("Fail in removeAllItems!");
+Local<Value> ContainerClass::removeAllItems(const Arguments& args) {
+    try {
+        container->removeAllItems();
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in removeAllItems!");
 }
 
-Local<Value> ContainerClass::isEmpty(const Arguments& args)
-{
-	try {
-		return Boolean::newBoolean(container->isEmpty());
-	}
-	CATCH("Fail in isEmpty!");
+Local<Value> ContainerClass::isEmpty(const Arguments& args) {
+    try {
+        return Boolean::newBoolean(container->isEmpty());
+    }
+    CATCH("Fail in isEmpty!");
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/ContainerAPI.h b/ScriptEngine/API/ContainerAPI.h
--- a/ScriptEngine/API/ContainerAPI.h
+++ b/ScriptEngine/API/ContainerAPI.h
@@ -4,16 +4,14 @@
 
 //////////////////// Classes ////////////////////
 class Container;
-class ContainerClass : public ScriptClass
-{
+class ContainerClass : public ScriptClass {
 private:
     Container* container;
 
 public:
     explicit ContainerClass(Container* p);
 
-    Container* get()
-    {
+    Container* get() {
         return container;
     }
 
diff --git a/ScriptEngine/API/DataAPI.cpp b/ScriptEngine/API/DataAPI.cpp
--- a/ScriptEngine/API/DataAPI.cpp
+++ b/ScriptEngine/API/DataAPI.cpp
@@ -53,7 +53,7 @@ ClassDefine<ConfJsonClass> ConfJsonClassBuilder =
         .instanceFunction("set", &ConfJsonClass::set)
         .instanceFunction("delete", &ConfJsonClass::del)
         .instanceFunction("reload", selectOverloadedFunc<Local<Value> (ConfJsonClass::*)(const Arguments&)>(&ConfJsonClass::reload))
-        .instanceFunction("close", selectOverloadedFunc<Local<Value>(ConfJsonClass::*)(const Arguments&)>(&ConfJsonClass::close))
+        .instanceFunction("close", selectOverloadedFunc<Local<Value> (ConfJsonClass::*)(const Arguments&)>(&ConfJsonClass::close))
         .instanceFunction("getPath", &ConfJsonClass::getPath)
         .instanceFunction("read", &ConfJsonClass::read)
         .instanceFunction("write", &ConfJsonClass::write)
@@ -69,8 +69,8 @@ ClassDefine<ConfIniClass> ConfIniClassBuilder =
         .instanceFunction("getFloat", &ConfIniClass::getFloat)
         .instanceFunction("getBool", &ConfIniClass::getBool)
         .instanceFunction("delete", &ConfIniClass::del)
-        .instanceFunction("reload", selectOverloadedFunc<Local<Value>(ConfIniClass::*)(const Arguments&)>(&ConfIniClass::reload))
-        .instanceFunction("close", selectOverloadedFunc<Local<Value>(ConfIniClass::*)(const Arguments&)>(&ConfIniClass::close))
+        .instanceFunction("reload", selectOverloadedFunc<Local<Value> (ConfIniClass::*)(const Arguments&)>(&ConfIniClass::reload))
+        .instanceFunction("close", selectOverloadedFunc<Local<Value> (ConfIniClass::*)(const Arguments&)>(&ConfIniClass::close))
         .instanceFunction("getPath", &ConfIniClass::getPath)
         .instanceFunction("read", &ConfIniClass::read)
         .instanceFunction("write", &ConfIniClass::write)
@@ -80,22 +80,18 @@ ClassDefine<ConfIniClass> ConfIniClassBuilder =
 //////////////////// Classes ConfBase ////////////////////
 
 ConfBaseClass::ConfBaseClass(const string& dir)
-    : confPath(dir)
-{ }
+: confPath(dir) {
+}
 
-Local<Value> ConfBaseClass::getPath(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfBaseClass::getPath(const Arguments& args) {
+    try {
         return String::newString(confPath);
     }
     CATCH("Fail in confGetPath!")
 }
 
-Local<Value> ConfBaseClass::read(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfBaseClass::read(const Arguments& args) {
+    try {
         auto content = ReadAllFile(confPath);
         if (!content)
             return Local<Value>();
@@ -109,24 +105,20 @@ Local<Value> ConfBaseClass::read(const Arguments& args)
 
 // 生成函数
 ConfJsonClass::ConfJsonClass(const Local<Object>& scriptObj, const string& path, const string& defContent)
-    : ScriptClass(scriptObj), ConfBaseClass(path)
-{
+: ScriptClass(scriptObj), ConfBaseClass(path) {
     jsonConf = CreateJson(path, defContent);
 }
 
 ConfJsonClass::ConfJsonClass(const string& path, const string& defContent)
-    : ScriptClass(ScriptClass::ConstructFromCpp<ConfJsonClass>{}), ConfBaseClass(path)
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<ConfJsonClass>{}), ConfBaseClass(path) {
     jsonConf = CreateJson(path, defContent);
 }
 
-ConfJsonClass::~ConfJsonClass()
-{
+ConfJsonClass::~ConfJsonClass() {
     close();
 }
 
-ConfJsonClass* ConfJsonClass::constructor(const Arguments& args)
-{
+ConfJsonClass* ConfJsonClass::constructor(const Arguments& args) {
     CHECK_ARGS_COUNT_C(args, 1);
     CHECK_ARG_TYPE_C(args[0], ValueKind::kString);
     if (args.size() >= 2)
@@ -145,23 +137,17 @@ ConfJsonClass* ConfJsonClass::constructor(const Arguments& args)
     CATCH_C("Fail in Open JsonConfigFile!");
 }
 
-Local<Value> ConfJsonClass::init(const Arguments& args)
-{
+Local<Value> ConfJsonClass::init(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         return JsonToValue(jsonConf.at(args[0].toStr()));
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         jsonConf[args[0].toStr()] = fifo_json::parse(ValueToJson(args[1]));
         flush();
         return args[1];
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         jsonConf[args[0].toStr()] = fifo_json::parse(ValueToJson(args[1]));
         flush();
         return args[1];
@@ -169,70 +155,52 @@ Local<Value> ConfJsonClass::init(const Arguments& args)
     CATCH("Fail in confJsonSet!");
 }
 
-Local<Value> ConfJsonClass::get(const Arguments& args)
-{
+Local<Value> ConfJsonClass::get(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         return JsonToValue(jsonConf.at(args[0].toStr()));
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         return args.size() >= 2 ? args[1] : Local<Value>();
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         return args.size() >= 2 ? args[1] : Local<Value>();
     }
     CATCH("Fail in confJsonGet!")
 }
 
-Local<Value> ConfJsonClass::set(const Arguments& args)
-{
+Local<Value> ConfJsonClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         jsonConf[args[0].toStr()] = fifo_json::parse(ValueToJson(args[1]));
         return Boolean::newBoolean(flush());
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in confJsonSet!");
 }
 
-Local<Value> ConfJsonClass::del(const Arguments& args)
-{
+Local<Value> ConfJsonClass::del(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         if (jsonConf.erase(args[0].toStr()) <= 0)
             return Boolean::newBoolean(false);
 
         return Boolean::newBoolean(flush());
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in confJsonDelete!");
 }
 
-Local<Value> ConfJsonClass::reload(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfJsonClass::reload(const Arguments& args) {
+    try {
         return Boolean::newBoolean(reload());
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         logger.error("Fail to parse json content in file!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -241,22 +209,18 @@ Local<Value> ConfJsonClass::reload(const Arguments& args)
     CATCH("Fail in confJsonReload!");
 }
 
-Local<Value> ConfJsonClass::close(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfJsonClass::close(const Arguments& args) {
+    try {
         return Boolean::newBoolean(close());
     }
     CATCH("Fail in confJsonClose!");
 }
 
-Local<Value> ConfJsonClass::write(const Arguments& args)
-{
+Local<Value> ConfJsonClass::write(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         bool res = WriteAllFile(confPath, args[0].toStr(), false);
         reload();
         return Boolean::newBoolean(res);
@@ -264,27 +228,22 @@ Local<Value> ConfJsonClass::write(const Arguments& args)
     CATCH("Fail in confJsonWrite!");
 }
 
-bool ConfJsonClass::flush()
-{
+bool ConfJsonClass::flush() {
     ofstream jsonFile(confPath);
-    if (jsonFile.is_open())
-    {
+    if (jsonFile.is_open()) {
         jsonFile << jsonConf.dump(4);
         jsonFile.close();
         return true;
-    }
-    else
+    } else
         return false;
 }
 
-bool ConfJsonClass::close()
-{
+bool ConfJsonClass::close() {
     reload();
     return true;
 }
 
-bool ConfJsonClass::reload()
-{
+bool ConfJsonClass::reload() {
     auto jsonTexts = ReadAllFile(confPath);
     if (!jsonTexts)
         return false;
@@ -298,24 +257,20 @@ bool ConfJsonClass::reload()
 
 // 生成函数
 ConfIniClass::ConfIniClass(const Local<Object>& scriptObj, const string& path, const string& defContent)
-    : ScriptClass(scriptObj), ConfBaseClass(path)
-{
+: ScriptClass(scriptObj), ConfBaseClass(path) {
     iniConf = SimpleIni::create(path, defContent);
 }
 
 ConfIniClass::ConfIniClass(const string& path, const string& defContent)
-    : ScriptClass(ScriptClass::ConstructFromCpp<ConfIniClass>{}), ConfBaseClass(path)
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<ConfIniClass>{}), ConfBaseClass(path) {
     iniConf = SimpleIni::create(path, defContent);
 }
 
-ConfIniClass::~ConfIniClass()
-{
+ConfIniClass::~ConfIniClass() {
     close();
 }
 
-ConfIniClass* ConfIniClass::constructor(const Arguments& args)
-{
+ConfIniClass* ConfIniClass::constructor(const Arguments& args) {
     CHECK_ARGS_COUNT_C(args, 1);
     CHECK_ARG_TYPE_C(args[0], ValueKind::kString);
     if (args.size() >= 2)
@@ -334,39 +289,33 @@ ConfIniClass* ConfIniClass::constructor(const Arguments& args)
     CATCH_C("Fail in Open JsonConfigFile!");
 }
 
-bool ConfIniClass::flush()
-{
+bool ConfIniClass::flush() {
     return iniConf->SaveFile(iniConf->filePath.c_str(), true);
 }
 
-bool ConfIniClass::close()
-{
-    if (isValid())
-    {
+bool ConfIniClass::close() {
+    if (isValid()) {
         reload();
         delete iniConf;
         iniConf = nullptr;
     }
     return true;
 }
-bool ConfIniClass::reload()
-{
+bool ConfIniClass::reload() {
     if (!isValid())
         return false;
 
     delete iniConf;
-    iniConf = SimpleIni::create(confPath,"");
+    iniConf = SimpleIni::create(confPath, "");
     return true;
 }
 
-Local<Value> ConfIniClass::init(const Arguments& args)
-{
+Local<Value> ConfIniClass::init(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 3);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
@@ -374,101 +323,87 @@ Local<Value> ConfIniClass::init(const Arguments& args)
         string key = args[1].toStr();
         Local<Value> res;
 
-        switch (args[2].getKind())
-        {
-        case ValueKind::kString:
-        {
-            string def = args[2].toStr();
-            string data = iniConf->getString(section, key, def);
-            if (data == def)
-            {
-                iniConf->setString(section, key, def);
-                flush();
-            }
-            res = String::newString(data);
-            break;
-        }
-        case ValueKind::kNumber:
-        {
-            if (CheckIsFloat(args[2]))
-            {
-                // Float
-                float def = args[2].asNumber().toFloat();
-                float data = iniConf->getFloat(section, key, def);
-                if (data == def)
-                {
-                    iniConf->setFloat(section, key, def);
+        switch (args[2].getKind()) {
+            case ValueKind::kString: {
+                string def = args[2].toStr();
+                string data = iniConf->getString(section, key, def);
+                if (data == def) {
+                    iniConf->setString(section, key, def);
                     flush();
                 }
-                res = Number::newNumber(data);
+                res = String::newString(data);
+                break;
             }
-            else
-            {
-                // Int
-                int def = args[2].toInt();
-                int data = iniConf->getInt(section, key, def);
-                if (data == def)
-                {
-                    iniConf->setInt(section, key, def);
-                    flush();
+            case ValueKind::kNumber: {
+                if (CheckIsFloat(args[2])) {
+                    // Float
+                    float def = args[2].asNumber().toFloat();
+                    float data = iniConf->getFloat(section, key, def);
+                    if (data == def) {
+                        iniConf->setFloat(section, key, def);
+                        flush();
+                    }
+                    res = Number::newNumber(data);
+                } else {
+                    // Int
+                    int def = args[2].toInt();
+                    int data = iniConf->getInt(section, key, def);
+                    if (data == def) {
+                        iniConf->setInt(section, key, def);
+                        flush();
+                    }
+                    res = Number::newNumber(data);
                 }
-                res = Number::newNumber(data);
+                break;
             }
-            break;
-        }
-        case ValueKind::kBoolean:
-        {
-            bool def = args[2].asBoolean().value();
-            bool data = iniConf->getBool(section, key, def);
-            if (data == def)
-            {
-                iniConf->setBool(section, key, def);
-                flush();
+            case ValueKind::kBoolean: {
+                bool def = args[2].asBoolean().value();
+                bool data = iniConf->getBool(section, key, def);
+                if (data == def) {
+                    iniConf->setBool(section, key, def);
+                    flush();
+                }
+                res = Boolean::newBoolean(data);
+                break;
             }
-            res = Boolean::newBoolean(data);
-            break;
-        }
-        default:
-            LOG_ERROR_WITH_SCRIPT_INFO("Ini file don't support this type of data!");
-            return Local<Value>();
-            break;
+            default:
+                LOG_ERROR_WITH_SCRIPT_INFO("Ini file don't support this type of data!");
+                return Local<Value>();
+                break;
         }
         return res;
     }
     CATCH("Fail in confIniInit!")
 }
 
-Local<Value> ConfIniClass::set(const Arguments& args)
-{
+Local<Value> ConfIniClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 3);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
-        
+
         string section = args[0].toStr();
         string key = args[1].toStr();
-        switch (args[2].getKind())
-        {
-        case ValueKind::kString:
-            iniConf->setString(section, key, args[2].toStr());
-            break;
-        case ValueKind::kNumber:
-            if (CheckIsFloat(args[2]))
-                iniConf->setFloat(section, key, args[2].asNumber().toFloat());
-            else
-                iniConf->setInt(section, key, args[2].toInt());
-            break;
-        case ValueKind::kBoolean:
-            iniConf->setBool(section, key, args[2].asBoolean().value());
-            break;
-        default:
-            LOG_ERROR_WITH_SCRIPT_INFO("Ini file don't support this type of data!");
-            return Local<Value>();
-            break;
+        switch (args[2].getKind()) {
+            case ValueKind::kString:
+                iniConf->setString(section, key, args[2].toStr());
+                break;
+            case ValueKind::kNumber:
+                if (CheckIsFloat(args[2]))
+                    iniConf->setFloat(section, key, args[2].asNumber().toFloat());
+                else
+                    iniConf->setInt(section, key, args[2].toInt());
+                break;
+            case ValueKind::kBoolean:
+                iniConf->setBool(section, key, args[2].asBoolean().value());
+                break;
+            default:
+                LOG_ERROR_WITH_SCRIPT_INFO("Ini file don't support this type of data!");
+                return Local<Value>();
+                break;
         }
         flush();
         return Boolean::newBoolean(true);
@@ -476,90 +411,80 @@ Local<Value> ConfIniClass::set(const Arguments& args)
     CATCH("Fail in confIniSet!")
 }
 
-Local<Value> ConfIniClass::getStr(const Arguments& args)
-{
+Local<Value> ConfIniClass::getStr(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kString)
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
-        return String::newString(iniConf->getString(args[0].toStr(), args[1].toStr(), 
-            args.size() >= 3 ? args[2].toStr() : ""));
+        return String::newString(iniConf->getString(args[0].toStr(), args[1].toStr(),
+                                                    args.size() >= 3 ? args[2].toStr() : ""));
     }
     CATCH("Fail in confIniGetStr!")
 }
 
-Local<Value> ConfIniClass::getInt(const Arguments& args)
-{
+Local<Value> ConfIniClass::getInt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber)
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
-        return Number::newNumber(iniConf->getInt(args[0].toStr(), args[1].toStr(), 
-            args.size() >= 3 ? args[2].asNumber().toInt32() : 0));
+        return Number::newNumber(iniConf->getInt(args[0].toStr(), args[1].toStr(),
+                                                 args.size() >= 3 ? args[2].asNumber().toInt32() : 0));
     }
     CATCH("Fail in ConfIniGetInt!");
 }
 
-Local<Value> ConfIniClass::getFloat(const Arguments& args)
-{
+Local<Value> ConfIniClass::getFloat(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
-        return Number::newNumber(iniConf->getFloat(args[0].toStr(), args[1].toStr(), 
-            args.size() >= 3 ? (float)args[2].asNumber().toDouble() : 0.0));
+        return Number::newNumber(iniConf->getFloat(args[0].toStr(), args[1].toStr(),
+                                                   args.size() >= 3 ? (float)args[2].asNumber().toDouble() : 0.0));
     }
     CATCH("Fail in ConfIniGetFloat!");
 }
 
-Local<Value> ConfIniClass::getBool(const Arguments& args)
-{
+Local<Value> ConfIniClass::getBool(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kBoolean);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
-        return Boolean::newBoolean(iniConf->getBool(args[0].toStr(), args[1].toStr(), 
-            args.size() >= 3 ? args[2].asBoolean().value() : false));
+        return Boolean::newBoolean(iniConf->getBool(args[0].toStr(), args[1].toStr(),
+                                                    args.size() >= 3 ? args[2].asBoolean().value() : false));
     }
     CATCH("Fail in ConfIniGetBool");
 }
 
-Local<Value> ConfIniClass::del(const Arguments& args)
-{
+Local<Value> ConfIniClass::del(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
@@ -570,22 +495,18 @@ Local<Value> ConfIniClass::del(const Arguments& args)
     CATCH("Fail in confIniDelete!");
 }
 
-Local<Value> ConfIniClass::reload(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfIniClass::reload(const Arguments& args) {
+    try {
         return Boolean::newBoolean(reload());
     }
     CATCH("Fail in confReload!");
 }
 
-Local<Value> ConfIniClass::write(const Arguments& args)
-{
+Local<Value> ConfIniClass::write(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         bool res = WriteAllFile(confPath, args[0].toStr(), false);
         reload();
         return Boolean::newBoolean(res);
@@ -593,10 +514,8 @@ Local<Value> ConfIniClass::write(const Arguments& args)
     CATCH("Fail in confIniWrite!");
 }
 
-Local<Value> ConfIniClass::close(const Arguments& args)
-{
-    try
-    {
+Local<Value> ConfIniClass::close(const Arguments& args) {
+    try {
         return Boolean::newBoolean(close());
     }
     CATCH("Fail in confClose!");
@@ -605,25 +524,19 @@ Local<Value> ConfIniClass::close(const Arguments& args)
 
 //////////////////// APIs ////////////////////
 
-Local<Value> MoneyClass::set(const Arguments& args)
-{
+Local<Value> MoneyClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(EconomySystem::setMoney(args[0].toStr(), args[1].asNumber().toInt64()));
-    }
-    catch (const std::invalid_argument& e)
-    {
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneySet!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Boolean::newBoolean(false);
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneySet!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -632,24 +545,18 @@ Local<Value> MoneyClass::set(const Arguments& args)
     CATCH("Fail in MoneySet!");
 }
 
-Local<Value> MoneyClass::get(const Arguments& args)
-{
+Local<Value> MoneyClass::get(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         return Number::newNumber(EconomySystem::getMoney(args[0].toStr()));
-    }
-    catch (const std::invalid_argument& e)
-    {
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneyGet!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Number::newNumber(0);
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneyGet!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -658,25 +565,19 @@ Local<Value> MoneyClass::get(const Arguments& args)
     CATCH("Fail in MoneyGet!");
 }
 
-Local<Value> MoneyClass::add(const Arguments& args)
-{
+Local<Value> MoneyClass::add(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(EconomySystem::addMoney(args[0].toStr(), args[1].asNumber().toInt64()));
-    }
-    catch (const std::invalid_argument& e)
-    {
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneyAdd!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Boolean::newBoolean(false);
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneyAdd!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -685,25 +586,19 @@ Local<Value> MoneyClass::add(const Arguments& args)
     CATCH("Fail in MoneyAdd!");
 }
 
-Local<Value> MoneyClass::reduce(const Arguments& args)
-{
+Local<Value> MoneyClass::reduce(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(EconomySystem::reduceMoney(args[0].toStr(), args[1].asNumber().toInt64()));
-    }
-    catch (const std::invalid_argument& e)
-    {
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneyReduce!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Boolean::newBoolean(false);
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneyReduce!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -712,30 +607,24 @@ Local<Value> MoneyClass::reduce(const Arguments& args)
     CATCH("Fail in MoneyReduce!");
 }
 
-Local<Value> MoneyClass::trans(const Arguments& args)
-{
+Local<Value> MoneyClass::trans(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 3);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
     CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
 
-    try
-    {
+    try {
         string note = "";
         if (args.size() >= 4 && args[3].getKind() == ValueKind::kString)
             note = args[3].toStr();
         return Boolean::newBoolean(EconomySystem::transMoney(args[0].toStr(), args[1].toStr(),
-                args[2].asNumber().toInt64(), note));
-    }
-    catch (const std::invalid_argument& e)
-    {
+                                                             args[2].asNumber().toInt64(), note));
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneyTrans!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Boolean::newBoolean(false);
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneyTrans!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -744,15 +633,13 @@ Local<Value> MoneyClass::trans(const Arguments& args)
     CATCH("Fail in MoneyTrans!");
 }
 
-Local<Value> MoneyClass::getHistory(const Arguments& args)
-{
+Local<Value> MoneyClass::getHistory(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
-        string res{ EconomySystem::getMoneyHist(args[0].toStr(), args[1].asNumber().toInt64()) };
+    try {
+        string res{EconomySystem::getMoneyHist(args[0].toStr(), args[1].asNumber().toInt64())};
         auto list = SplitStrWithPattern(res, "\n");
         // from -> to money time (note)
 
@@ -760,8 +647,7 @@ Local<Value> MoneyClass::getHistory(const Arguments& args)
 
         string from, to, time1, time2, note, tmp;
         long long money;
-        for(auto &str : list)
-        {
+        for (auto& str : list) {
             if (str.back() == '\n')
                 str.pop_back();
 
@@ -789,16 +675,12 @@ Local<Value> MoneyClass::getHistory(const Arguments& args)
             arr.add(obj);
         }
         return arr;
-    }
-    catch (const std::invalid_argument& e)
-    {
+    } catch (const std::invalid_argument& e) {
         logger.error("Bad argument in MoneyGetHintory!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
         return Local<Value>();
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error("Bad argument in MoneyGetHintory!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -807,63 +689,51 @@ Local<Value> MoneyClass::getHistory(const Arguments& args)
     CATCH("Fail in MoneyGetHintory!");
 }
 
-Local<Value> MoneyClass::clearHistory(const Arguments& args)
-{
+Local<Value> MoneyClass::clearHistory(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(EconomySystem::clearMoneyHist(args[0].asNumber().toInt64()));
     }
     CATCH("Fail in MoneyClearHistory!");
 }
 
-Local<Value> DataClass::xuid2name(const Arguments& args)
-{
+Local<Value> DataClass::xuid2name(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         return String::newString(PlayerInfo::fromXuid(args[0].toStr()));
     }
     CATCH("Fail in Xuid2Name!");
 }
 
-Local<Value> DataClass::name2xuid(const Arguments& args)
-{
+Local<Value> DataClass::name2xuid(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         return String::newString(PlayerInfo::getXuid(args[0].toStr()));
     }
     CATCH("Fail in Name2Xuid!");
 }
 
-Local<Value> DataClass::toJson(const Arguments& args)
-{
+Local<Value> DataClass::toJson(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         int spaces = -1;
-        if (args.size() >= 2)
-        {
+        if (args.size() >= 2) {
             int newSpaces = args[1].toInt();
             if (newSpaces > 0)
                 spaces = newSpaces;
         }
-        try
-        {
-            return String::newString(ValueToJson(args[0],spaces));
-        }
-        catch (...)
-        {
+        try {
+            return String::newString(ValueToJson(args[0], spaces));
+        } catch (...) {
             LOG_ERROR_WITH_SCRIPT_INFO("Failed to transform into Json.");
             return Local<Value>();
         }
@@ -871,19 +741,14 @@ Local<Value> DataClass::toJson(const Arguments& args)
     CATCH("Fail in ToJson!");
 }
 
-Local<Value> DataClass::parseJson(const Arguments& args)
-{
+Local<Value> DataClass::parseJson(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
-        try
-        {
+    try {
+        try {
             return JsonToValue(args[0].toStr());
-        }
-        catch (...)
-        {
+        } catch (...) {
             LOG_ERROR_WITH_SCRIPT_INFO("Failed to parse from Json.");
             return Local<Value>();
         }
@@ -891,21 +756,17 @@ Local<Value> DataClass::parseJson(const Arguments& args)
     CATCH("Fail in ParseJson!");
 }
 
-Local<Value> DataClass::toMD5(const Arguments& args)
-{
+Local<Value> DataClass::toMD5(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         string data;
         if (args[0].isString())
             data = args[0].toStr();
-        else if (args[0].isByteBuffer())
-        {
+        else if (args[0].isByteBuffer()) {
             Local<ByteBuffer> buf = args[0].asByteBuffer();
             data = string((char*)buf.getRawBytes(), buf.byteLength());
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -914,21 +775,17 @@ Local<Value> DataClass::toMD5(const Arguments& args)
     CATCH("Fail in ToMD5!");
 }
 
-Local<Value> DataClass::toSHA1(const Arguments& args)
-{
+Local<Value> DataClass::toSHA1(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         string data;
         if (args[0].isString())
             data = args[0].toStr();
-        else if (args[0].isByteBuffer())
-        {
+        else if (args[0].isByteBuffer()) {
             Local<ByteBuffer> buf = args[0].asByteBuffer();
             data = string((char*)buf.getRawBytes(), buf.byteLength());
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -937,21 +794,17 @@ Local<Value> DataClass::toSHA1(const Arguments& args)
     CATCH("Fail in ToSHA1!");
 }
 
-Local<Value> DataClass::toBase64(const Arguments& args)
-{
+Local<Value> DataClass::toBase64(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         string data;
         if (args[0].isString())
             data = args[0].toStr();
-        else if (args[0].isByteBuffer())
-        {
+        else if (args[0].isByteBuffer()) {
             Local<ByteBuffer> buf = args[0].asByteBuffer();
             data = string((char*)buf.getRawBytes(), buf.byteLength());
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -960,25 +813,20 @@ Local<Value> DataClass::toBase64(const Arguments& args)
     CATCH("Fail in ToBase64!");
 }
 
-Local<Value> DataClass::fromBase64(const Arguments& args)
-{
+Local<Value> DataClass::fromBase64(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
     try {
         bool isBinary = false;
-        if (args.size() > 1)
-        {
+        if (args.size() > 1) {
             CHECK_ARG_TYPE(args[1], ValueKind::kBoolean);
             isBinary = args[1].asBoolean().value();
         }
         auto data = base64_decode(args[0].toStr());
-        if (isBinary)
-        {
+        if (isBinary) {
             return ByteBuffer::newByteBuffer((void*)data.c_str(), data.size());
-        }
-        else
-        {
+        } else {
             return String::newString(data);
         }
     }
@@ -988,28 +836,24 @@ Local<Value> DataClass::fromBase64(const Arguments& args)
 
 // For Compability
 
-Local<Value> KVDBClass::newDb(const string& dir)
-{
+Local<Value> KVDBClass::newDb(const string& dir) {
     auto newp = new KVDBClass(dir);
 
     if (newp->isValid())
         return newp->getScriptObject();
-    else
-    {
+    else {
         delete newp;
         return Local<Value>();
     }
 }
 
-Local<Value> ConfJsonClass::newConf(const string& path, const string& defContent)
-{
+Local<Value> ConfJsonClass::newConf(const string& path, const string& defContent) {
     auto newp = new ConfJsonClass(path, defContent);
     return newp->getScriptObject();
 }
 
 
-Local<Value> ConfIniClass::newConf(const string& path, const string& defContent)
-{
+Local<Value> ConfIniClass::newConf(const string& path, const string& defContent) {
     auto newp = new ConfIniClass(path, defContent);
     if (newp)
         return newp->getScriptObject();
@@ -1017,9 +861,11 @@ Local<Value> ConfIniClass::newConf(const string& path, const string& defContent)
         return Local<Value>();
 }
 
-Local<Value> DataClass::openConfig(const Arguments& args)
-{
-    enum GlobalConfType { json, ini };
+Local<Value> DataClass::openConfig(const Arguments& args) {
+    enum GlobalConfType {
+        json,
+        ini
+    };
 
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
@@ -1035,21 +881,18 @@ Local<Value> DataClass::openConfig(const Arguments& args)
         if (path.empty())
             return Boolean::newBoolean(false);
 
-        if (args.size() >= 2)
-        {
+        if (args.size() >= 2) {
             string fileType = args[1].toStr();
             if (fileType == "json" || fileType == "Json")
                 confType = GlobalConfType::json;
         }
 
-        if (confType == GlobalConfType::ini)
-        {
+        if (confType == GlobalConfType::ini) {
             if (args.size() >= 3)
                 return ConfIniClass::newConf(path, args[2].toStr());
             else
                 return ConfIniClass::newConf(path);
-        }
-        else    //json
+        } else // json
         {
             if (args.size() >= 3)
                 return ConfJsonClass::newConf(path, args[2].toStr());
@@ -1060,8 +903,7 @@ Local<Value> DataClass::openConfig(const Arguments& args)
     CATCH("Fail in OpenConfig!");
 }
 
-Local<Value> DataClass::openDB(const Arguments& args)
-{
+Local<Value> DataClass::openDB(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
diff --git a/ScriptEngine/API/DataAPI.h b/ScriptEngine/API/DataAPI.h
--- a/ScriptEngine/API/DataAPI.h
+++ b/ScriptEngine/API/DataAPI.h
@@ -8,8 +8,7 @@
 
 //////////////////// Data Static ////////////////////
 
-class DataClass
-{
+class DataClass {
 public:
     static Local<Value> xuid2name(const Arguments& args);
     static Local<Value> name2xuid(const Arguments& args);
@@ -30,8 +29,7 @@ extern ClassDefine<void> DataClassBuilder;
 
 //////////////////// Money Static ////////////////////
 
-class MoneyClass
-{
+class MoneyClass {
 public:
     static Local<Value> set(const Arguments& args);
     static Local<Value> get(const Arguments& args);
@@ -46,8 +44,7 @@ extern ClassDefine<void> MoneyClassBuilder;
 
 //////////////////// Classes ////////////////////
 
-class ConfBaseClass
-{
+class ConfBaseClass {
 protected:
     std::string confPath;
     virtual bool flush() = 0;
@@ -65,8 +62,7 @@ class ConfBaseClass
 };
 
 
-class ConfJsonClass : public ScriptClass, public ConfBaseClass
-{
+class ConfJsonClass : public ScriptClass, public ConfBaseClass {
 private:
     fifo_json jsonConf;
     bool flush() override;
@@ -93,8 +89,7 @@ class ConfJsonClass : public ScriptClass, public ConfBaseClass
 extern ClassDefine<ConfJsonClass> ConfJsonClassBuilder;
 
 
-class ConfIniClass : public ScriptClass, public ConfBaseClass
-{
+class ConfIniClass : public ScriptClass, public ConfBaseClass {
 private:
     SimpleIni* iniConf;
     bool flush() override;
@@ -107,8 +102,7 @@ class ConfIniClass : public ScriptClass, public ConfBaseClass
     ~ConfIniClass();
     static ConfIniClass* constructor(const Arguments& args);
 
-    bool isValid()
-    {
+    bool isValid() {
         return iniConf != nullptr;
     }
 
diff --git a/ScriptEngine/API/DatabaseAPI.cpp b/ScriptEngine/API/DatabaseAPI.cpp
--- a/ScriptEngine/API/DatabaseAPI.cpp
+++ b/ScriptEngine/API/DatabaseAPI.cpp
@@ -1,33 +1,30 @@
 #include "DatabaseAPI.h"
 using namespace DB;
 
-#define CATCH_AND_THROW(LOG) \
-    catch(const Exception& e) \
-    { \
-        logger.error(LOG##"\n"); PrintException(e); \
+#define CATCH_AND_THROW(LOG)                                         \
+    catch (const Exception& e) {                                     \
+        logger.error(LOG##"\n");                                     \
+        PrintException(e);                                           \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-        return Local<Value>(); \
-    } \
-    catch(const std::exception &e) \
-    { \
-        throw Exception(TextEncoding::toUTF8(e.what())); \
-    } \
-    catch(const seh_exception &e) \
-    { \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        PrintScriptStackTrace(); \
-        logger.error(std::string("In API: ") + __FUNCTION__); \
+        return Local<Value>();                                       \
+    }                                                                \
+    catch (const std::exception& e) {                                \
+        throw Exception(TextEncoding::toUTF8(e.what()));             \
+    }                                                                \
+    catch (const seh_exception& e) {                                 \
+        logger.error("SEH Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        PrintScriptStackTrace();                                     \
+        logger.error(std::string("In API: ") + __FUNCTION__);        \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-        return Local<Value>(); \
-    } \
-    catch(...) \
-    { \
-        logger.error("Uncaught Exception Detected!"); \
-        PrintScriptStackTrace(); \
-        logger.error(std::string("In API: ") + __FUNCTION__); \
+        return Local<Value>();                                       \
+    }                                                                \
+    catch (...) {                                                    \
+        logger.error("Uncaught Exception Detected!");                \
+        PrintScriptStackTrace();                                     \
+        logger.error(std::string("In API: ") + __FUNCTION__);        \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-        return Local<Value>(); \
+        return Local<Value>();                                       \
     }
 
 //////////////////// Class Definition ////////////////////
@@ -72,10 +69,8 @@ ClassDefine<DBStmtClass> DBStmtClassBuilder =
 
 //////////////////// Functions ////////////////////
 
-Any LocalValueToAny(const Local<Value>& val)
-{
-    switch (val.getKind())
-    {
+Any LocalValueToAny(const Local<Value>& val) {
+    switch (val.getKind()) {
         case ValueKind::kObject:
         case ValueKind::kArray:
             throw std::exception("Cannot convert script object(array) to Any");
@@ -92,11 +87,9 @@ Any LocalValueToAny(const Local<Value>& val)
         case ValueKind::kString:
             return Any(val.asString().toString());
         case ValueKind::kByteBuffer:
-            switch (val.asByteBuffer().getType())
-            {
+            switch (val.asByteBuffer().getType()) {
                 case ByteBuffer::Type::kInt8:
-                case ByteBuffer::Type::kUint8:
-                {
+                case ByteBuffer::Type::kUint8: {
                     auto buf = (uint8_t*)val.asByteBuffer().getRawBytes();
                     return Any(ByteArray(buf, buf + val.asByteBuffer().elementCount()));
                 }
@@ -111,10 +104,8 @@ Any LocalValueToAny(const Local<Value>& val)
 }
 
 template <>
-Local<Value> any_to(const Any& val)
-{
-    switch (val.type)
-    {
+Local<Value> any_to(const Any& val) {
+    switch (val.type) {
         case Any::Type::Null:
             return Local<Value>();
         case Any::Type::Boolean:
@@ -129,24 +120,21 @@ Local<Value> any_to(const Any& val)
             return Number::newNumber(val.value.floating);
         case Any::Type::String:
             return String::newString(*val.value.string);
-        case Any::Type::Date:
-        {
+        case Any::Type::Date: {
             auto obj = Object::newObject();
             obj.set("Y", val.value.date->year);
             obj.set("M", val.value.date->month);
             obj.set("D", val.value.date->day);
             return obj;
         }
-        case Any::Type::Time:
-        {
+        case Any::Type::Time: {
             auto obj = Object::newObject();
             obj.set("h", val.value.time->hour);
             obj.set("m", val.value.time->minute);
             obj.set("s", val.value.time->second);
             return obj;
         }
-        case Any::Type::DateTime:
-        {
+        case Any::Type::DateTime: {
             auto obj = Object::newObject();
             obj.set("Y", val.value.datetime->date.year);
             obj.set("M", val.value.datetime->date.month);
@@ -164,10 +152,8 @@ Local<Value> any_to(const Any& val)
     return Local<Value>();
 }
 
-Local<Value> RowSetToLocalValue(const RowSet& rows)
-{
-    if (rows.empty() || !rows.header)
-    {
+Local<Value> RowSetToLocalValue(const RowSet& rows) {
+    if (rows.empty() || !rows.header) {
         return Local<Value>();
     }
     Local<Array> arr = Array::newArray();
@@ -175,8 +161,7 @@ Local<Value> RowSetToLocalValue(const RowSet& rows)
     for (auto& col : *rows.header)
         header.add(String::newString(col));
     arr.add(header);
-    for (auto& row : rows)
-    {
+    for (auto& row : rows) {
         Local<Array> rowValues = Array::newArray();
         for (auto& col : row)
             rowValues.add(col.get<Local<Value>>());
@@ -185,8 +170,7 @@ Local<Value> RowSetToLocalValue(const RowSet& rows)
     return arr;
 }
 
-Local<Value> RowToLocalValue(const Row& row)
-{
+Local<Value> RowToLocalValue(const Row& row) {
     auto result = Object::newObject();
     row.forEach([&](const std::string& key, const Any& value) {
         result.set(key, value.get<Local<Value>>());
@@ -199,34 +183,29 @@ Local<Value> RowToLocalValue(const Row& row)
 
 // 生成函数
 KVDBClass::KVDBClass(const Local<Object>& scriptObj, const string& dir)
-    : ScriptClass(scriptObj)
-    , kvdb(KVDB::create(dir))
-{
+: ScriptClass(scriptObj)
+, kvdb(KVDB::create(dir)) {
     unloadCallbackIndex = ENGINE_OWN_DATA()->addUnloadCallback([&](ScriptEngine* engine) {
         kvdb.reset();
     });
 }
 
 KVDBClass::KVDBClass(const string& dir)
-    : ScriptClass(script::ScriptClass::ConstructFromCpp<KVDBClass>{})
-    , kvdb(KVDB::create(dir))
-{
+: ScriptClass(script::ScriptClass::ConstructFromCpp<KVDBClass>{})
+, kvdb(KVDB::create(dir)) {
     unloadCallbackIndex = ENGINE_OWN_DATA()->addUnloadCallback([&](ScriptEngine* engine) {
         kvdb.reset();
     });
 }
 
-KVDBClass::~KVDBClass()
-{
+KVDBClass::~KVDBClass() {
 }
 
-KVDBClass* KVDBClass::constructor(const Arguments& args)
-{
+KVDBClass* KVDBClass::constructor(const Arguments& args) {
     CHECK_ARGS_COUNT_C(args, 1);
     CHECK_ARG_TYPE_C(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto res = new KVDBClass(args.thiz(), args[0].toStr());
         if (res->isValid())
             return res;
@@ -236,13 +215,11 @@ KVDBClass* KVDBClass::constructor(const Arguments& args)
     CATCH_C("Fail in Open Database!");
 }
 
-Local<Value> KVDBClass::get(const Arguments& args)
-{
+Local<Value> KVDBClass::get(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
@@ -255,13 +232,11 @@ Local<Value> KVDBClass::get(const Arguments& args)
     CATCH_AND_THROW("Fail in DbGet!");
 }
 
-Local<Value> KVDBClass::set(const Arguments& args)
-{
+Local<Value> KVDBClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
@@ -271,13 +246,11 @@ Local<Value> KVDBClass::set(const Arguments& args)
     CATCH_AND_THROW("Fail in DbSet!");
 }
 
-Local<Value> KVDBClass::del(const Arguments& args)
-{
+Local<Value> KVDBClass::del(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         if (!isValid())
             return Local<Value>();
 
@@ -286,29 +259,24 @@ Local<Value> KVDBClass::del(const Arguments& args)
     CATCH_AND_THROW("Fail in DbDel!");
 }
 
-Local<Value> KVDBClass::close(const Arguments& args)
-{
+Local<Value> KVDBClass::close(const Arguments& args) {
     ENGINE_OWN_DATA()->removeUnloadCallback(unloadCallbackIndex);
     unloadCallbackIndex = -1;
-    try
-    {
+    try {
         kvdb.reset();
         return Boolean::newBoolean(true);
     }
     CATCH_AND_THROW("Fail in DbClose!");
 }
 
-Local<Value> KVDBClass::listKey(const Arguments& args)
-{
-    try
-    {
+Local<Value> KVDBClass::listKey(const Arguments& args) {
+    try {
         if (!isValid())
             return Local<Value>();
 
         auto list = kvdb->getAllKeys();
         Local<Array> arr = Array::newArray();
-        for (auto& key : list)
-        {
+        for (auto& key : list) {
             arr.add(String::newString(key));
         }
         return arr;
@@ -320,52 +288,39 @@ Local<Value> KVDBClass::listKey(const Arguments& args)
 
 // 生成函数
 DBSessionClass::DBSessionClass(const Local<Object>& scriptObj, const ConnParams& params)
-    : ScriptClass(scriptObj)
-    , session(Session::create(params))
-{
+: ScriptClass(scriptObj)
+, session(Session::create(params)) {
     session->setDebugOutput(true);
 }
 DBSessionClass::DBSessionClass(const ConnParams& params)
-    : ScriptClass(script::ScriptClass::ConstructFromCpp<DBSessionClass>{})
-    , session(Session::create(params))
-{
+: ScriptClass(script::ScriptClass::ConstructFromCpp<DBSessionClass>{})
+, session(Session::create(params)) {
     session->setDebugOutput(true);
 }
 
-DBSessionClass::~DBSessionClass()
-{
+DBSessionClass::~DBSessionClass() {
 }
 
-DBSessionClass* DBSessionClass::constructor(const Arguments& args)
-{
-    try
-    {
+DBSessionClass* DBSessionClass::constructor(const Arguments& args) {
+    try {
         DBSessionClass* result = nullptr;
-        switch (args.size())
-        {
-            case 1:
-            {
+        switch (args.size()) {
+            case 1: {
                 // When the first argument is a string, it is a url or file path.
-                if (args[0].isString())
-                {
+                if (args[0].isString()) {
                     result = new DBSessionClass(args.thiz(), ConnParams(args[0].asString().toString()));
-                }
-                else if (args[0].isObject())
-                {
+                } else if (args[0].isObject()) {
                     auto obj = args[0].asObject();
                     ConnParams params;
                     for (auto& key : obj.getKeys())
                         params[key.toString()] = LocalValueToAny(obj.get(key));
                     result = new DBSessionClass(args.thiz(), params);
-                }
-                else
-                {
+                } else {
                     LOG_WRONG_ARG_TYPE();
                 }
                 break;
             }
-            case 2:
-            {
+            case 2: {
                 CHECK_ARG_TYPE_C(args[0], ValueKind::kString);
                 CHECK_ARG_TYPE_C(args[1], ValueKind::kObject);
                 auto obj = args[1].asObject();
@@ -385,63 +340,53 @@ DBSessionClass* DBSessionClass::constructor(const Arguments& args)
     CATCH_C("Fail in Open Database!");
 }
 
-Local<Value> DBSessionClass::query(const Arguments& args)
-{
+Local<Value> DBSessionClass::query(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto res = session->query(args[0].asString().toString());
         return RowSetToLocalValue(res);
     }
     CATCH_AND_THROW("Fail in query!");
 }
 
-Local<Value> DBSessionClass::exec(const Arguments& args)
-{
+Local<Value> DBSessionClass::exec(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         session->execute(args[0].asString().toString());
         return this->getScriptObject();
     }
     CATCH_AND_THROW("Fail in exec!");
 }
 
-Local<Value> DBSessionClass::prepare(const Arguments& args)
-{
+Local<Value> DBSessionClass::prepare(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto stmt = new DBStmtClass(session->prepare(args[0].asString().toString()));
         return stmt->getScriptObject();
     }
     CATCH_AND_THROW("Fail in exec!");
 }
 
-Local<Value> DBSessionClass::close(const Arguments& args)
-{
+Local<Value> DBSessionClass::close(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         session->close();
         return Boolean::newBoolean(true);
     }
     CATCH_WITHOUT_RETURN("Fail in close!");
     return Boolean::newBoolean(false);
 }
-Local<Value> DBSessionClass::isOpen(const Arguments& args)
-{
+Local<Value> DBSessionClass::isOpen(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(session->isOpen());
     }
     CATCH_AND_THROW("Fail in isOpen!");
@@ -451,25 +396,20 @@ Local<Value> DBSessionClass::isOpen(const Arguments& args)
 
 // 生成函数
 DBStmtClass::DBStmtClass(const Local<Object>& scriptObj, const DB::SharedPointer<DB::Stmt>& stmt)
-    : ScriptClass(scriptObj)
-    , stmt(stmt)
-{
+: ScriptClass(scriptObj)
+, stmt(stmt) {
 }
 
 DBStmtClass::DBStmtClass(const DB::SharedPointer<DB::Stmt>& stmt)
-    : ScriptClass(script::ScriptClass::ConstructFromCpp<DBStmtClass>{})
-    , stmt(stmt)
-{
+: ScriptClass(script::ScriptClass::ConstructFromCpp<DBStmtClass>{})
+, stmt(stmt) {
 }
 
-DBStmtClass::~DBStmtClass()
-{
+DBStmtClass::~DBStmtClass() {
 }
 
-Local<Value> DBStmtClass::getAffectedRows()
-{
-    try
-    {
+Local<Value> DBStmtClass::getAffectedRows() {
+    try {
         auto res = stmt->getAffectedRows();
         if (res == (uint64_t)-1)
             return Number::newNumber(-1);
@@ -480,10 +420,8 @@ Local<Value> DBStmtClass::getAffectedRows()
     CATCH_AND_THROW("Fail in getAffectedRows!");
 }
 
-Local<Value> DBStmtClass::getInsertId()
-{
-    try
-    {
+Local<Value> DBStmtClass::getInsertId() {
+    try {
         auto res = stmt->getInsertId();
         if (res == (uint64_t)-1)
             return Number::newNumber(-1);
@@ -494,25 +432,18 @@ Local<Value> DBStmtClass::getInsertId()
     CATCH_AND_THROW("Fail in getInsertId!");
 }
 
-Local<Value> DBStmtClass::bind(const Arguments& args)
-{
-    try
-    {
-        switch (args.size())
-        {
-            case 1:
-            {
-                switch (args[0].getKind())
-                {
-                    case ValueKind::kArray:
-                    {
+Local<Value> DBStmtClass::bind(const Arguments& args) {
+    try {
+        switch (args.size()) {
+            case 1: {
+                switch (args[0].getKind()) {
+                    case ValueKind::kArray: {
                         auto arr = args[0].asArray();
                         for (size_t i = 0; i < arr.size(); ++i)
                             stmt->bind(LocalValueToAny(arr.get(i)));
                         break;
                     }
-                    case ValueKind::kObject:
-                    {
+                    case ValueKind::kObject: {
                         auto obj = args[0].asObject();
                         for (auto& key : obj.getKeys())
                             stmt->bind(LocalValueToAny(obj.get(key)), key.toString());
@@ -523,18 +454,12 @@ Local<Value> DBStmtClass::bind(const Arguments& args)
                 }
                 break;
             }
-            case 2:
-            {
-                if (args[1].isNumber())
-                {
+            case 2: {
+                if (args[1].isNumber()) {
                     stmt->bind(LocalValueToAny(args[0]), (int)args[1].asNumber().toInt64());
-                }
-                else if (args[1].isString())
-                {
+                } else if (args[1].isString()) {
                     stmt->bind(LocalValueToAny(args[0]), args[1].asString().toString());
-                }
-                else
-                {
+                } else {
                     LOG_WRONG_ARG_TYPE();
                 }
             }
@@ -544,57 +469,46 @@ Local<Value> DBStmtClass::bind(const Arguments& args)
     CATCH_AND_THROW("Fail in bind!");
 }
 
-Local<Value> DBStmtClass::execute(const Arguments& args)
-{
+Local<Value> DBStmtClass::execute(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         stmt->execute();
         return this->getScriptObject();
     }
     CATCH_AND_THROW("Fail in reset!");
 }
 
-Local<Value> DBStmtClass::step(const Arguments& args)
-{
+Local<Value> DBStmtClass::step(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         return Boolean::newBoolean(stmt->step());
     }
     CATCH_WITHOUT_RETURN("Fail in step!");
     return Boolean::newBoolean(false);
 }
 
-Local<Value> DBStmtClass::fetch(const Arguments& args)
-{
+Local<Value> DBStmtClass::fetch(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         return RowToLocalValue(stmt->fetch());
     }
     CATCH_AND_THROW("Fail in fetch!");
 }
 
-Local<Value> DBStmtClass::fetchAll(const Arguments& args)
-{
-    try
-    {
-        switch (args.size())
-        {
+Local<Value> DBStmtClass::fetchAll(const Arguments& args) {
+    try {
+        switch (args.size()) {
             case 0:
                 return RowSetToLocalValue(stmt->fetchAll());
-            case 1:
-            {
+            case 1: {
                 CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
                 auto func = args[0].asFunction();
                 stmt->fetchAll([&](const Row& row) {
                     auto res = func.call({}, RowToLocalValue(row));
-                    if (res.isBoolean())
-                    {
+                    if (res.isBoolean()) {
                         return res.asBoolean().value();
                     }
                     return true;
@@ -606,36 +520,30 @@ Local<Value> DBStmtClass::fetchAll(const Arguments& args)
     CATCH_AND_THROW("Fail in fetchAll!");
 }
 
-Local<Value> DBStmtClass::reset(const Arguments& args)
-{
+Local<Value> DBStmtClass::reset(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         stmt->reset();
         return this->getScriptObject();
     }
     CATCH_AND_THROW("Fail in reset!");
 }
 
-Local<Value> DBStmtClass::reexec(const Arguments& args)
-{
+Local<Value> DBStmtClass::reexec(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         stmt->reexec();
         return this->getScriptObject();
     }
     CATCH_AND_THROW("Fail in reexec!");
 }
 
-Local<Value> DBStmtClass::clear(const Arguments& args)
-{
+Local<Value> DBStmtClass::clear(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
-    try
-    {
+    try {
         stmt->clear();
         return this->getScriptObject();
     }
diff --git a/ScriptEngine/API/DatabaseAPI.h b/ScriptEngine/API/DatabaseAPI.h
--- a/ScriptEngine/API/DatabaseAPI.h
+++ b/ScriptEngine/API/DatabaseAPI.h
@@ -6,8 +6,7 @@
 //////////////////// Classes ////////////////////
 
 //// KVDB
-class KVDBClass : public ScriptClass
-{
+class KVDBClass : public ScriptClass {
 private:
     std::unique_ptr<KVDB> kvdb;
     int unloadCallbackIndex = -1;
@@ -18,8 +17,7 @@ class KVDBClass : public ScriptClass
     ~KVDBClass();
     static KVDBClass* constructor(const Arguments& args);
 
-    bool isValid()
-    {
+    bool isValid() {
         return kvdb->isValid();
     }
 
@@ -36,8 +34,7 @@ extern ClassDefine<KVDBClass> KVDBClassBuilder;
 
 
 //// SQLDB
-class DBSessionClass : public ScriptClass
-{
+class DBSessionClass : public ScriptClass {
 private:
     DB::SharedPointer<DB::Session> session;
 
@@ -55,8 +52,7 @@ class DBSessionClass : public ScriptClass
 };
 extern ClassDefine<DBSessionClass> DBSessionClassBuilder;
 
-class DBStmtClass : public ScriptClass
-{
+class DBStmtClass : public ScriptClass {
 private:
     DB::SharedPointer<DB::Stmt> stmt;
 
diff --git a/ScriptEngine/API/DeviceAPI.cpp b/ScriptEngine/API/DeviceAPI.cpp
--- a/ScriptEngine/API/DeviceAPI.cpp
+++ b/ScriptEngine/API/DeviceAPI.cpp
@@ -10,48 +10,44 @@ using namespace std;
 //////////////////// Class Definition ////////////////////
 
 ClassDefine<DeviceClass> DeviceClassBuilder =
-	defineClass<DeviceClass>("LLSE_Device")
-		.constructor(nullptr)
+    defineClass<DeviceClass>("LLSE_Device")
+        .constructor(nullptr)
         .instanceProperty("ip", &DeviceClass::getIP)
-		.instanceProperty("avgPing", &DeviceClass::getAvgPing)
-		.instanceProperty("avgPacketLoss", &DeviceClass::getAvgPacketLoss)
+        .instanceProperty("avgPing", &DeviceClass::getAvgPing)
+        .instanceProperty("avgPacketLoss", &DeviceClass::getAvgPacketLoss)
+        .instanceProperty("lastPing", &DeviceClass::getLastPing)
+        .instanceProperty("lastPacketLoss", &DeviceClass::getLastPacketLoss)
         .instanceProperty("os", &DeviceClass::getOs)
+        .instanceProperty("serverAddress", &DeviceClass::getServerAddress)
         .instanceProperty("clientId", &DeviceClass::getClientId)
-		.build();
+        .build();
 
 
 //////////////////// Classes ////////////////////
 
 //生成函数
-Local<Object> DeviceClass::newDevice(Player* p)
-{
+Local<Object> DeviceClass::newDevice(Player* p) {
     auto newp = new DeviceClass(p);
     return newp->getScriptObject();
 }
 
 //成员函数
-void DeviceClass::setPlayer(Player* player)
-{
-    __try
-    {
+void DeviceClass::setPlayer(Player* player) {
+    __try {
         id = player->getUniqueID();
-    }
-    __except (EXCEPTION_EXECUTE_HANDLER)
-    {
+    } __except (EXCEPTION_EXECUTE_HANDLER) {
         isValid = false;
     }
 }
 
-Player* DeviceClass::getPlayer()
-{
+Player* DeviceClass::getPlayer() {
     if (!isValid)
         return nullptr;
     else
         return ::Global<Level>->getPlayer(id);
 }
 
-Local<Value> DeviceClass::getIP()
-{
+Local<Value> DeviceClass::getIP() {
     try {
         Player* player = getPlayer();
         if (!player)
@@ -62,8 +58,7 @@ Local<Value> DeviceClass::getIP()
     CATCH("Fail in GetIP!")
 }
 
-Local<Value> DeviceClass::getAvgPing()
-{
+Local<Value> DeviceClass::getAvgPing() {
     try {
         Player* player = getPlayer();
         if (!player)
@@ -74,20 +69,42 @@ Local<Value> DeviceClass::getAvgPing()
     CATCH("Fail in getAvgPing!")
 }
 
-Local<Value> DeviceClass::getAvgPacketLoss()
-{
+Local<Value> DeviceClass::getAvgPacketLoss() {
     try {
         Player* player = getPlayer();
         if (!player)
             return Local<Value>();
 
-        return  Number::newNumber(0);       //=================???
+        return Number::newNumber(player->getAvgPacketLoss());
     }
     CATCH("Fail in getAvgPacketLoss!")
 }
 
-Local<Value> DeviceClass::getOs()
-{
+Local<Value> DeviceClass::getLastPing() {
+    try {
+        Player* player = getPlayer();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        return Number::newNumber(player->getLastPing());
+    }
+    CATCH("Fail in getLastPing!")
+}
+
+Local<Value> DeviceClass::getLastPacketLoss() {
+    try {
+        Player* player = getPlayer();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        return Number::newNumber(player->getLastPacketLoss());
+    }
+    CATCH("Fail in getLastPacketLoss!")
+}
+
+Local<Value> DeviceClass::getOs() {
     try {
         Player* player = getPlayer();
         if (!player)
@@ -98,14 +115,25 @@ Local<Value> DeviceClass::getOs()
     CATCH("Fail in getOs!")
 }
 
-Local<Value> DeviceClass::getClientId()
-{
+Local<Value> DeviceClass::getServerAddress() {
+    try {
+        Player* player = getPlayer();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        return String::newString(player->getServerAddress());
+    }
+    CATCH("Fail in getServerAddress!")
+}
+
+Local<Value> DeviceClass::getClientId() {
     try {
         Player* player = getPlayer();
         if (!player)
             return Local<Value>();
 
-        return String::newString(player->getClientId());       //=============???
+        return String::newString(player->getClientId()); //=============???
     }
     CATCH("Fail in getClientId!")
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/DeviceAPI.h b/ScriptEngine/API/DeviceAPI.h
--- a/ScriptEngine/API/DeviceAPI.h
+++ b/ScriptEngine/API/DeviceAPI.h
@@ -4,16 +4,14 @@
 
 //////////////////// Classes ////////////////////
 class Player;
-class DeviceClass : public ScriptClass
-{
+class DeviceClass : public ScriptClass {
 private:
     ActorUniqueID id;
     bool isValid = true;
 
 public:
     explicit DeviceClass(Player* p)
-        :ScriptClass(ScriptClass::ConstructFromCpp<DeviceClass>{})
-    {
+    : ScriptClass(ScriptClass::ConstructFromCpp<DeviceClass>{}) {
         setPlayer(p);
     }
 
@@ -26,7 +24,10 @@ class DeviceClass : public ScriptClass
     Local<Value> getIP();
     Local<Value> getAvgPing();
     Local<Value> getAvgPacketLoss();
+    Local<Value> getLastPing();
+    Local<Value> getLastPacketLoss();
     Local<Value> getOs();
+    Local<Value> getServerAddress();
     Local<Value> getClientId();
 };
 extern ClassDefine<DeviceClass> DeviceClassBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/EntityAPI.cpp b/ScriptEngine/API/EntityAPI.cpp
--- a/ScriptEngine/API/EntityAPI.cpp
+++ b/ScriptEngine/API/EntityAPI.cpp
@@ -32,8 +32,8 @@ ClassDefine<EntityClass> EntityClassBuilder =
         .instanceProperty("health", &EntityClass::getHealth)
         .instanceProperty("inAir", &EntityClass::getInAir)
         .instanceProperty("inWater", &EntityClass::getInWater)
-        .instanceProperty("speed",&EntityClass::getSpeed)
-        .instanceProperty("direction",&EntityClass::getDirection)
+        .instanceProperty("speed", &EntityClass::getSpeed)
+        .instanceProperty("direction", &EntityClass::getDirection)
         .instanceProperty("uniqueId", &EntityClass::getUniqueID)
 
         .instanceFunction("teleport", &EntityClass::teleport)
@@ -59,7 +59,7 @@ ClassDefine<EntityClass> EntityClassBuilder =
         .instanceFunction("getBlockFromViewVector", &EntityClass::getBlockFromViewVector)
         .instanceFunction("quickEvalMolangScript", &EntityClass::quickEvalMolangScript)
 
-        //For Compatibility
+        // For Compatibility
         .instanceFunction("setTag", &EntityClass::setNbt)
         .instanceFunction("getTag", &EntityClass::getNbt)
         .build();
@@ -68,21 +68,18 @@ ClassDefine<EntityClass> EntityClassBuilder =
 //////////////////// Classes ////////////////////
 
 //生成函数
-Local<Object> EntityClass::newEntity(Actor *p)
-{
+Local<Object> EntityClass::newEntity(Actor* p) {
     auto newp = new EntityClass(p);
     return newp->getScriptObject();
 }
-Actor* EntityClass::extract(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<EntityClass>(v))
+Actor* EntityClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<EntityClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<EntityClass>(v)->get();
     else
         return nullptr;
 }
 
-std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v)
-{
+std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v) {
     if (IsInstanceOf<EntityClass>(v))
         return EntityClass::extract(v);
     if (IsInstanceOf<PlayerClass>(v))
@@ -91,28 +88,22 @@ std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v)
 }
 
 //成员函数
-void EntityClass::set(Actor* actor)
-{
-    __try
-    {
+void EntityClass::set(Actor* actor) {
+    __try {
         id = actor->getUniqueID();
-    }
-    __except(EXCEPTION_EXECUTE_HANDLER)
-    {
+    } __except (EXCEPTION_EXECUTE_HANDLER) {
         isValid = false;
     }
 }
 
-Actor* EntityClass::get()
-{
+Actor* EntityClass::get() {
     if (!isValid)
         return nullptr;
     else
         return Level::getEntity(id);
 }
 
-Local<Value> EntityClass::getRawPtr(const Arguments& args)
-{
+Local<Value> EntityClass::getRawPtr(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -123,8 +114,7 @@ Local<Value> EntityClass::getRawPtr(const Arguments& args)
     CATCH("Fail in getRawPtr!")
 }
 
-Local<Value> EntityClass::getUniqueID()
-{
+Local<Value> EntityClass::getUniqueID() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -135,9 +125,8 @@ Local<Value> EntityClass::getUniqueID()
     CATCH("Fail in getUniqueID!")
 }
 #include <MC/CommandUtils.hpp>
-Local<Value> EntityClass::getName()
-{ 
-    try{
+Local<Value> EntityClass::getName() {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -147,8 +136,7 @@ Local<Value> EntityClass::getName()
     CATCH("Fail in getEntityName!")
 }
 
-Local<Value> EntityClass::getType()
-{
+Local<Value> EntityClass::getType() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -159,8 +147,7 @@ Local<Value> EntityClass::getType()
     CATCH("Fail in getEntityType!")
 }
 
-Local<Value> EntityClass::getId()
-{
+Local<Value> EntityClass::getId() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -171,9 +158,8 @@ Local<Value> EntityClass::getId()
     CATCH("Fail in getEntityId!")
 }
 
-Local<Value> EntityClass::getPos()
-{ 
-    try{
+Local<Value> EntityClass::getPos() {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -183,8 +169,7 @@ Local<Value> EntityClass::getPos()
     CATCH("Fail in GetEntityPos!")
 }
 
-Local<Value> EntityClass::getBlockPos()
-{
+Local<Value> EntityClass::getBlockPos() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -195,9 +180,8 @@ Local<Value> EntityClass::getBlockPos()
     CATCH("Fail in GetEntityBlockPos!")
 }
 
-Local<Value> EntityClass::getMaxHealth()
-{
-    try{
+Local<Value> EntityClass::getMaxHealth() {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -207,9 +191,8 @@ Local<Value> EntityClass::getMaxHealth()
     CATCH("Fail in GetMaxHealth!")
 }
 
-Local<Value> EntityClass::getHealth()
-{
-    try{
+Local<Value> EntityClass::getHealth() {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -219,9 +202,8 @@ Local<Value> EntityClass::getHealth()
     CATCH("Fail in GetHealth!")
 }
 
-Local<Value> EntityClass::getInAir()
-{
-    try{
+Local<Value> EntityClass::getInAir() {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -231,8 +213,7 @@ Local<Value> EntityClass::getInAir()
     CATCH("Fail in getInAir!")
 }
 
-Local<Value> EntityClass::getInWater()
-{
+Local<Value> EntityClass::getInWater() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -243,8 +224,7 @@ Local<Value> EntityClass::getInWater()
     CATCH("Fail in getInWater!")
 }
 
-Local<Value> EntityClass::getSpeed()
-{
+Local<Value> EntityClass::getSpeed() {
     try {
         Actor* entity = get();
         if (!entity)
@@ -255,68 +235,55 @@ Local<Value> EntityClass::getSpeed()
     CATCH("Fail in getSpeed!")
 }
 
-Local<Value> EntityClass::getDirection()
-{
+Local<Value> EntityClass::getDirection() {
     try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
 
-        Vec2 *vec = entity->getDirection();
-        return DirectionAngle::newAngle(vec->x, vec->y); 
+        Vec2* vec = entity->getDirection();
+        return DirectionAngle::newAngle(vec->x, vec->y);
     }
     CATCH("Fail in getDirection!")
 }
 
-Local<Value> EntityClass::teleport(const Arguments& args)
-{
+Local<Value> EntityClass::teleport(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    if (args.size() == 4)
-    {
+    if (args.size() == 4) {
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
     }
-    
-    try{
+
+    try {
         FloatVec4 pos;
 
-        if (args.size() == 1)
-        {
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+        if (args.size() == 1) {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 4)
-        {
+        } else if (args.size() == 4) {
             // number pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -327,13 +294,11 @@ Local<Value> EntityClass::teleport(const Arguments& args)
             pos.y = args[1].asNumber().toFloat();
             pos.z = args[2].asNumber().toFloat();
             pos.dim = args[3].toInt();
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
-        
+
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -344,9 +309,8 @@ Local<Value> EntityClass::teleport(const Arguments& args)
     CATCH("Fail in teleportEntity!")
 }
 
-Local<Value> EntityClass::kill(const Arguments& args)
-{
-    try{
+Local<Value> EntityClass::kill(const Arguments& args) {
+    try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
@@ -357,8 +321,7 @@ Local<Value> EntityClass::kill(const Arguments& args)
     CATCH("Fail in killEntity!")
 }
 
-Local<Value> EntityClass::isPlayer(const Arguments& args)
-{
+Local<Value> EntityClass::isPlayer(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -369,8 +332,7 @@ Local<Value> EntityClass::isPlayer(const Arguments& args)
     CATCH("Fail in isPlayer!")
 }
 
-Local<Value> EntityClass::toPlayer(const Arguments& args)
-{
+Local<Value> EntityClass::toPlayer(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity || !entity->isPlayer())
@@ -385,8 +347,7 @@ Local<Value> EntityClass::toPlayer(const Arguments& args)
     CATCH("Fail in toPlayer!");
 }
 
-Local<Value> EntityClass::isItemEntity(const Arguments& args)
-{
+Local<Value> EntityClass::isItemEntity(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -397,8 +358,7 @@ Local<Value> EntityClass::isItemEntity(const Arguments& args)
     CATCH("Fail in isPlayer!")
 }
 
-Local<Value> EntityClass::toItem(const Arguments& args)
-{
+Local<Value> EntityClass::toItem(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity || !entity->isItemActor())
@@ -413,20 +373,18 @@ Local<Value> EntityClass::toItem(const Arguments& args)
     CATCH("Fail in toItem!");
 }
 
-Local<Value> EntityClass::getBlockStandingOn(const Arguments& args)
-{
+Local<Value> EntityClass::getBlockStandingOn(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
 
-        return BlockClass::newBlock(entity->getBlockPosCurrentlyStandingOn(nullptr), (int)entity->getDimensionId());    //===========?
+        return BlockClass::newBlock(entity->getBlockPosCurrentlyStandingOn(nullptr), (int)entity->getDimensionId()); //===========?
     }
     CATCH("Fail in getBlockStandingOn!");
 }
 
-Local<Value> EntityClass::getArmor(const Arguments& args)
-{
+Local<Value> EntityClass::getArmor(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -437,8 +395,7 @@ Local<Value> EntityClass::getArmor(const Arguments& args)
     CATCH("Fail in getArmor!");
 }
 
-Local<Value> EntityClass::refreshItems(const Arguments& args)
-{
+Local<Value> EntityClass::refreshItems(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -449,35 +406,32 @@ Local<Value> EntityClass::refreshItems(const Arguments& args)
     CATCH("Fail in refreshItems!");
 }
 
-Local<Value> EntityClass::hasContainer(const Arguments& args)
-{
+Local<Value> EntityClass::hasContainer(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
 
         Vec3 pos = entity->getPosition();
-        return Boolean::newBoolean(Level::hasContainer({ pos.x, pos.y, pos.z }, entity->getDimensionId()));
+        return Boolean::newBoolean(Level::hasContainer({pos.x, pos.y, pos.z}, entity->getDimensionId()));
     }
     CATCH("Fail in hasContainer!");
 }
 
-Local<Value> EntityClass::getContainer(const Arguments& args)
-{
+Local<Value> EntityClass::getContainer(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
             return Local<Value>();
 
         Vec3 pos = entity->getPosition();
-        Container* container = Level::getContainer({ pos.x, pos.y, pos.z }, entity->getDimensionId());
+        Container* container = Level::getContainer({pos.x, pos.y, pos.z}, entity->getDimensionId());
         return container ? ContainerClass::newContainer(container) : Local<Value>();
     }
     CATCH("Fail in getContainer!");
 }
 
-Local<Value> EntityClass::hurt(const Arguments& args)
-{
+Local<Value> EntityClass::hurt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -492,8 +446,7 @@ Local<Value> EntityClass::hurt(const Arguments& args)
     CATCH("Fail in hurt!");
 }
 
-Local<Value> EntityClass::setOnFire(const Arguments& args)
-{
+Local<Value> EntityClass::setOnFire(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -509,8 +462,7 @@ Local<Value> EntityClass::setOnFire(const Arguments& args)
     CATCH("Fail in setOnFire!")
 }
 
-Local<Value> EntityClass::getNbt(const Arguments& args)
-{
+Local<Value> EntityClass::getNbt(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -521,8 +473,7 @@ Local<Value> EntityClass::getNbt(const Arguments& args)
     CATCH("Fail in getNbt!")
 }
 
-Local<Value> EntityClass::setNbt(const Arguments& args)
-{
+Local<Value> EntityClass::setNbt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -532,15 +483,14 @@ Local<Value> EntityClass::setNbt(const Arguments& args)
 
         auto nbt = NbtCompoundClass::extract(args[0]);
         if (!nbt)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
 
         return Boolean::newBoolean(entity->setNbt(nbt));
     }
     CATCH("Fail in setNbt!")
 }
 
-Local<Value> EntityClass::addTag(const Arguments& args)
-{
+Local<Value> EntityClass::addTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -554,8 +504,7 @@ Local<Value> EntityClass::addTag(const Arguments& args)
     CATCH("Fail in addTag!");
 }
 
-Local<Value> EntityClass::removeTag(const Arguments& args)
-{
+Local<Value> EntityClass::removeTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -569,8 +518,7 @@ Local<Value> EntityClass::removeTag(const Arguments& args)
     CATCH("Fail in removeTag!");
 }
 
-Local<Value> EntityClass::hasTag(const Arguments& args)
-{
+Local<Value> EntityClass::hasTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -584,8 +532,7 @@ Local<Value> EntityClass::hasTag(const Arguments& args)
     CATCH("Fail in hasTag!");
 }
 
-Local<Value> EntityClass::getAllTags(const Arguments& args)
-{
+Local<Value> EntityClass::getAllTags(const Arguments& args) {
     try {
         Actor* entity = get();
         if (!entity)
@@ -600,17 +547,14 @@ Local<Value> EntityClass::getAllTags(const Arguments& args)
     CATCH("Fail in getAllTags!");
 }
 
-Local<Value> EntityClass::getEntityFromViewVector(const Arguments& args)
-{
+Local<Value> EntityClass::getEntityFromViewVector(const Arguments& args) {
 
-    try
-    {
+    try {
         Actor* actor = get();
         if (!actor)
             return Local<Value>();
         float maxDistance = 5.25f;
-        if (args.size() > 0)
-        {
+        if (args.size() > 0) {
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             maxDistance = args[0].asNumber().toFloat();
         }
@@ -622,10 +566,8 @@ Local<Value> EntityClass::getEntityFromViewVector(const Arguments& args)
     CATCH("Fail in getEntityFromViewVector!");
 }
 
-Local<Value> EntityClass::getBlockFromViewVector(const Arguments& args)
-{
-    try
-    {
+Local<Value> EntityClass::getBlockFromViewVector(const Arguments& args) {
+    try {
         Actor* actor = get();
         if (!actor)
             return Local<Value>();
@@ -634,23 +576,19 @@ Local<Value> EntityClass::getBlockFromViewVector(const Arguments& args)
         float maxDistance = 5.25f;
         bool ignoreBorderBlocks = true;
         bool fullOnly = false;
-        if (args.size() > 0)
-        {
+        if (args.size() > 0) {
             CHECK_ARG_TYPE(args[0], ValueKind::kBoolean);
             includeLiquid = args[0].asBoolean().value();
         }
-        if (args.size() > 1)
-        {
+        if (args.size() > 1) {
             CHECK_ARG_TYPE(args[1], ValueKind::kBoolean);
             solidOnly = args[1].asBoolean().value();
         }
-        if (args.size() > 2)
-        {
+        if (args.size() > 2) {
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             maxDistance = args[2].asNumber().toFloat();
         }
-        if (args.size() > 3)
-        {
+        if (args.size() > 3) {
             CHECK_ARG_TYPE(args[3], ValueKind::kBoolean);
             fullOnly = args[3].asBoolean().value();
         }
@@ -663,15 +601,15 @@ Local<Value> EntityClass::getBlockFromViewVector(const Arguments& args)
 }
 
 Local<Value> EntityClass::quickEvalMolangScript(const Arguments& args) {
-	CHECK_ARGS_COUNT(args, 1);
-	CHECK_ARG_TYPE(args[0], ValueKind::kString);
-	try {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kString);
+    try {
         Actor* actor = get();
         if (!actor)
-			return Local<Value>();
-		return Number::newNumber(actor->quickEvalMolangScript(args[0].toStr()));
-	}
-	CATCH("Fail in quickEvalMolangScript!");
+            return Local<Value>();
+        return Number::newNumber(actor->quickEvalMolangScript(args[0].toStr()));
+    }
+    CATCH("Fail in quickEvalMolangScript!");
 }
 
 Local<Value> McClass::getAllEntities(const Arguments& args) {
@@ -686,70 +624,55 @@ Local<Value> McClass::getAllEntities(const Arguments& args) {
     CATCH("Fail in GetAllEntities");
 }
 
-Local<Value> McClass::cloneMob(const Arguments& args)
-{
+Local<Value> McClass::cloneMob(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
 
-    try
-    {
+    try {
         Actor* ac = EntityClass::extract(args[0]);
-        if (!ac)
-        {
+        if (!ac) {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>(); // Null
         }
-		
+
         FloatVec4 pos;
 
-        if (args.size() == 2)
-        {
-            if (IsInstanceOf<IntPos>(args[1]))
-            {
+        if (args.size() == 2) {
+            if (IsInstanceOf<IntPos>(args[1])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[1]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[1])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 5)
-        {
+        } else if (args.size() == 5) {
             // Number Pos
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[4], ValueKind::kNumber);
             pos = {args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].asNumber().toFloat(), args[4].toInt()};
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
-        auto entity = Level::cloneMob(pos.getVec3(), pos.dim,ac);
+        auto entity = Level::cloneMob(pos.getVec3(), pos.dim, ac);
         if (!entity)
             return Local<Value>(); // Null
         else
@@ -758,8 +681,7 @@ Local<Value> McClass::cloneMob(const Arguments& args)
     CATCH("Fail in CloneMob!");
 }
 
-Local<Value> McClass::spawnMob(const Arguments& args)
-{
+Local<Value> McClass::spawnMob(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -767,124 +689,99 @@ Local<Value> McClass::spawnMob(const Arguments& args)
         string name = args[0].toStr();
         FloatVec4 pos;
 
-        if (args.size() == 2)
-        {
-            if (IsInstanceOf<IntPos>(args[1]))
-            {
+        if (args.size() == 2) {
+            if (IsInstanceOf<IntPos>(args[1])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[1]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[1])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 5)
-        {
+        } else if (args.size() == 5) {
             // Number Pos
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[4], ValueKind::kNumber);
-            pos = { args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].asNumber().toFloat(), args[4].toInt() };
-        }
-        else
-        {
+            pos = {args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].asNumber().toFloat(), args[4].toInt()};
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
         auto entity = Level::spawnMob(pos.getVec3(), pos.dim, name);
         if (!entity)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
         else
             return EntityClass::newEntity(entity);
     }
     CATCH("Fail in SpawnMob!");
 }
 
-Local<Value> McClass::explode(const Arguments& args)
-{
+Local<Value> McClass::explode(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 6);
 
     try {
         FloatVec4 pos;
         int beginIndex;
-        if (args.size() == 6)
-        {
+        if (args.size() == 6) {
             // PosObj
             beginIndex = 1;
 
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 9)
-        {
+        } else if (args.size() == 9) {
             // Number Pos
             beginIndex = 4;
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
-            pos = { args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt() };
-        }
-        else
-        {
+            pos = {args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt()};
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
-        auto source = EntityClass::extract(args[beginIndex + 0]); //Can be nullptr
-        
+        auto source = EntityClass::extract(args[beginIndex + 0]); // Can be nullptr
+
         CHECK_ARG_TYPE(args[beginIndex + 1], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[beginIndex + 2], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[beginIndex + 3], ValueKind::kBoolean);
diff --git a/ScriptEngine/API/EntityAPI.h b/ScriptEngine/API/EntityAPI.h
--- a/ScriptEngine/API/EntityAPI.h
+++ b/ScriptEngine/API/EntityAPI.h
@@ -4,23 +4,21 @@
 
 //////////////////// Classes ////////////////////
 class Actor;
-class EntityClass : public ScriptClass
-{
+class EntityClass : public ScriptClass {
 private:
     ActorUniqueID id;
     bool isValid = true;
 
 public:
-	explicit EntityClass(Actor *p)
-        :ScriptClass(ScriptClass::ConstructFromCpp<EntityClass>{})
-    {
+    explicit EntityClass(Actor* p)
+    : ScriptClass(ScriptClass::ConstructFromCpp<EntityClass>{}) {
         set(p);
     }
 
     void set(Actor* actor);
     Actor* get();
 
-    static Local<Object> newEntity(Actor *p);
+    static Local<Object> newEntity(Actor* p);
     static Actor* extract(Local<Value> v);
     static std::optional<Actor*> tryExtractActor(Local<Value> v);
     Local<Value> getRawPtr(const Arguments& args);
@@ -52,7 +50,7 @@ class EntityClass : public ScriptClass
     Local<Value> hasContainer(const Arguments& args);
     Local<Value> getContainer(const Arguments& args);
     Local<Value> refreshItems(const Arguments& args);
-    
+
     Local<Value> getNbt(const Arguments& args);
     Local<Value> setNbt(const Arguments& args);
     Local<Value> addTag(const Arguments& args);
@@ -61,7 +59,7 @@ class EntityClass : public ScriptClass
     Local<Value> getAllTags(const Arguments& args);
     Local<Value> getEntityFromViewVector(const Arguments& args);
     Local<Value> getBlockFromViewVector(const Arguments& args);
-        
+
     Local<Value> quickEvalMolangScript(const Arguments& args);
 };
 extern ClassDefine<EntityClass> EntityClassBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/EventAPI.cpp b/ScriptEngine/API/EventAPI.cpp
--- a/ScriptEngine/API/EventAPI.cpp
+++ b/ScriptEngine/API/EventAPI.cpp
@@ -41,252 +41,325 @@ using namespace std;
 
 //////////////////// Listeners ////////////////////
 
-enum class EVENT_TYPES : int
-{
+enum class EVENT_TYPES : int {
     /* Player Events */
-    onPreJoin = 0, onJoin, onLeft, onRespawn, onPlayerDie, onPlayerCmd, onChat,
-    onChangeDim, onJump, onSneak, onAttackEntity, onAttackBlock, onUseItem, onUseItemOn,
-    onTakeItem, onDropItem, onEat, onConsumeTotem, onEffectAdded, onEffectUpdated,
-    onEffectRemoved, onStartDestroyBlock, onDestroyBlock, onPlaceBlock, onOpenContainer,
-    onCloseContainer, onInventoryChange, onMove, onChangeSprinting, onSetArmor, onUseRespawnAnchor,
+    onPreJoin = 0,
+    onJoin,
+    onLeft,
+    onRespawn,
+    onPlayerDie,
+    onPlayerCmd,
+    onChat,
+    onChangeDim,
+    onJump,
+    onSneak,
+    onAttackEntity,
+    onAttackBlock,
+    onUseItem,
+    onUseItemOn,
+    onTakeItem,
+    onDropItem,
+    onEat,
+    onConsumeTotem,
+    onEffectAdded,
+    onEffectUpdated,
+    onEffectRemoved,
+    onStartDestroyBlock,
+    onDestroyBlock,
+    onPlaceBlock,
+    afterPlaceBlock,
+    onOpenContainer,
+    onCloseContainer,
+    onInventoryChange,
+    onMove,
+    onChangeSprinting,
+    onSetArmor,
+    onUseRespawnAnchor,
     onOpenContainerScreen,
+    onExperienceAdd,
+    onBedEnter,
     /* Entity Events */
-    onMobDie, onMobHurt, onEntityExplode, onProjectileHitEntity, onWitherBossDestroy, onRide,
-    onStepOnPressurePlate, onSpawnProjectile, onProjectileCreated, onNpcCmd, onChangeArmorStand,
+    onMobDie,
+    onMobHurt,
+    onEntityExplode,
+    onProjectileHitEntity,
+    onWitherBossDestroy,
+    onRide,
+    onStepOnPressurePlate,
+    onSpawnProjectile,
+    onProjectileCreated,
+    onNpcCmd,
+    onChangeArmorStand,
     onEntityTransformation,
     /* Block Events */
-    onBlockInteracted, onBlockChanged, onBlockExplode, onRespawnAnchorExplode, onBlockExploded,
-    onFireSpread, onCmdBlockExecute, onContainerChange, onProjectileHitBlock, onRedStoneUpdate,
-    onHopperSearchItem, onHopperPushOut, onPistonTryPush, onPistonPush, onFarmLandDecay,
-    onUseFrameBlock, onLiquidFlow,
+    onBlockInteracted,
+    onBlockChanged,
+    onBlockExplode,
+    onRespawnAnchorExplode,
+    onBlockExploded,
+    onFireSpread,
+    onCmdBlockExecute,
+    onContainerChange,
+    onProjectileHitBlock,
+    onRedStoneUpdate,
+    onHopperSearchItem,
+    onHopperPushOut,
+    onPistonTryPush,
+    onPistonPush,
+    onFarmLandDecay,
+    onUseFrameBlock,
+    onLiquidFlow,
     /* Other Events */
-    onScoreChanged, onTick, onServerStarted, onConsoleCmd, onConsoleOutput,
+    onScoreChanged,
+    onTick,
+    onServerStarted,
+    onConsoleCmd,
+    onConsoleOutput,
     /* Economic Events */
-    onMoneyAdd, onMoneyReduce, onMoneyTrans, onMoneySet,
-    beforeMoneyAdd, beforeMoneyReduce, beforeMoneyTrans, beforeMoneySet,
+    onMoneyAdd,
+    onMoneyReduce,
+    onMoneyTrans,
+    onMoneySet,
+    beforeMoneyAdd,
+    beforeMoneyReduce,
+    beforeMoneyTrans,
+    beforeMoneySet,
     /* Outdated Events */
-    onAttack,onExplode,onBedExplode,onMobSpawn,
+    onAttack,
+    onExplode,
+    onBedExplode,
+    onMobSpawn,
     /* Internal */
-    onFormSelected, EVENT_COUNT
+    onFormSelected,
+    EVENT_COUNT
 };
 static const std::unordered_map<string, EVENT_TYPES> EventsMap{
-    {"onPreJoin",EVENT_TYPES::onPreJoin},
-    {"onJoin",EVENT_TYPES::onJoin},
-    {"onLeft",EVENT_TYPES::onLeft},
-    {"onPlayerCmd",EVENT_TYPES::onPlayerCmd},
-    {"onChat",EVENT_TYPES::onChat},
-    {"onPlayerDie",EVENT_TYPES::onPlayerDie},
-    {"onRespawn",EVENT_TYPES::onRespawn},
-    {"onChangeDim",EVENT_TYPES::onChangeDim},
-    {"onJump",EVENT_TYPES::onJump},
-    {"onSneak",EVENT_TYPES::onSneak},
-    {"onAttack",EVENT_TYPES::onAttackEntity},
-    {"onAttackEntity",EVENT_TYPES::onAttackEntity},
-    {"onAttackBlock",EVENT_TYPES::onAttackBlock},
-    {"onEat",EVENT_TYPES::onEat},
-    {"onMove",EVENT_TYPES::onMove},
-    {"onChangeSprinting",EVENT_TYPES::onChangeSprinting},
-    {"onSpawnProjectile",EVENT_TYPES::onSpawnProjectile},
-    {"onProjectileCreated",EVENT_TYPES::onProjectileCreated},
-    {"onSetArmor",EVENT_TYPES::onSetArmor},
-    {"onRide",EVENT_TYPES::onRide},
-    {"onStepOnPressurePlate",EVENT_TYPES::onStepOnPressurePlate},
-    {"onMobDie",EVENT_TYPES::onMobDie},
-    {"onMobHurt",EVENT_TYPES::onMobHurt},
-    {"onUseItem",EVENT_TYPES::onUseItem},
-    {"onTakeItem",EVENT_TYPES::onTakeItem},
-    {"onDropItem",EVENT_TYPES::onDropItem},
-    {"onUseItemOn",EVENT_TYPES::onUseItemOn},
-    {"onInventoryChange",EVENT_TYPES::onInventoryChange},
-    {"onChangeArmorStand",EVENT_TYPES::onChangeArmorStand},
-    {"onStartDestroyBlock",EVENT_TYPES::onStartDestroyBlock},
-    {"onDestroyBlock",EVENT_TYPES::onDestroyBlock},
-    {"onWitherBossDestroy",EVENT_TYPES::onWitherBossDestroy},
-    {"onPlaceBlock",EVENT_TYPES::onPlaceBlock},
-    {"onExplode",EVENT_TYPES::onExplode},
-    {"onBedExplode",EVENT_TYPES::onBedExplode},
-    {"onRespawnAnchorExplode",EVENT_TYPES::onRespawnAnchorExplode},
-    {"onBlockExploded",EVENT_TYPES::onBlockExploded},
-    {"onEntityExplode",EVENT_TYPES::onEntityExplode},
-    {"onBlockExplode",EVENT_TYPES::onBlockExplode},
-    {"onLiquidFlow",EVENT_TYPES::onLiquidFlow},
-    {"onOpenContainer",EVENT_TYPES::onOpenContainer},
-    {"onCloseContainer",EVENT_TYPES::onCloseContainer},
-    {"onContainerChangeSlot",EVENT_TYPES::onContainerChange},
-    {"onContainerChange",EVENT_TYPES::onContainerChange},
-    {"onOpenContainerScreen",EVENT_TYPES::onOpenContainerScreen},
-    {"onCmdBlockExecute",EVENT_TYPES::onCmdBlockExecute},
-    {"onRedStoneUpdate",EVENT_TYPES::onRedStoneUpdate},
-    {"onProjectileHitBlock",EVENT_TYPES::onProjectileHitBlock},
-    {"onProjectileHitEntity",EVENT_TYPES::onProjectileHitEntity},
-    {"onEntityTransformation",EVENT_TYPES::onEntityTransformation},
-    {"onBlockInteracted",EVENT_TYPES::onBlockInteracted},
-    {"onUseRespawnAnchor",EVENT_TYPES::onUseRespawnAnchor},
-    {"onFarmLandDecay",EVENT_TYPES::onFarmLandDecay},
-    {"onUseFrameBlock",EVENT_TYPES::onUseFrameBlock},
-    {"onPistonTryPush",EVENT_TYPES::onPistonTryPush},
-    {"onPistonPush",EVENT_TYPES::onPistonPush},
-    {"onHopperSearchItem",EVENT_TYPES::onHopperSearchItem},
-    {"onHopperPushOut",EVENT_TYPES::onHopperPushOut},
-    {"onFireSpread",EVENT_TYPES::onFireSpread},
-    {"onBlockChanged",EVENT_TYPES::onBlockChanged},
-    {"onNpcCmd",EVENT_TYPES::onNpcCmd},
-    {"onScoreChanged",EVENT_TYPES::onScoreChanged},
-    {"onServerStarted",EVENT_TYPES::onServerStarted},
-    {"onConsoleCmd",EVENT_TYPES::onConsoleCmd},
-    {"onConsoleOutput",EVENT_TYPES::onConsoleOutput},
-    {"onTick",EVENT_TYPES::onTick},
-    {"beforeMoneyAdd",EVENT_TYPES::beforeMoneyAdd},
-    {"beforeMoneyReduce",EVENT_TYPES::beforeMoneyReduce},
-    {"beforeMoneyTrans",EVENT_TYPES::beforeMoneyTrans},
-    {"beforeMoneySet",EVENT_TYPES::beforeMoneySet},
-    {"onMoneyAdd",EVENT_TYPES::onMoneyAdd},
-    {"onMoneyReduce",EVENT_TYPES::onMoneyReduce},
-    {"onMoneyTrans",EVENT_TYPES::onMoneyTrans},
-    {"onMoneySet",EVENT_TYPES::onMoneySet},
-    {"onFormSelected",EVENT_TYPES::onFormSelected},
-    {"onConsumeTotem",EVENT_TYPES::onConsumeTotem},
-    {"onEffectAdded",EVENT_TYPES::onEffectAdded},
-    {"onEffectRemoved",EVENT_TYPES::onEffectRemoved},
-    {"onEffectUpdated",EVENT_TYPES::onEffectUpdated},
-    {"onMobSpawn", EVENT_TYPES::onMobSpawn}};
-struct ListenerListType
-{
-    ScriptEngine *engine;
+    {"onPreJoin", EVENT_TYPES::onPreJoin},
+    {"onJoin", EVENT_TYPES::onJoin},
+    {"onLeft", EVENT_TYPES::onLeft},
+    {"onPlayerCmd", EVENT_TYPES::onPlayerCmd},
+    {"onChat", EVENT_TYPES::onChat},
+    {"onPlayerDie", EVENT_TYPES::onPlayerDie},
+    {"onRespawn", EVENT_TYPES::onRespawn},
+    {"onChangeDim", EVENT_TYPES::onChangeDim},
+    {"onJump", EVENT_TYPES::onJump},
+    {"onSneak", EVENT_TYPES::onSneak},
+    {"onAttack", EVENT_TYPES::onAttackEntity},
+    {"onAttackEntity", EVENT_TYPES::onAttackEntity},
+    {"onAttackBlock", EVENT_TYPES::onAttackBlock},
+    {"onEat", EVENT_TYPES::onEat},
+    {"onMove", EVENT_TYPES::onMove},
+    {"onChangeSprinting", EVENT_TYPES::onChangeSprinting},
+    {"onSpawnProjectile", EVENT_TYPES::onSpawnProjectile},
+    {"onProjectileCreated", EVENT_TYPES::onProjectileCreated},
+    {"onSetArmor", EVENT_TYPES::onSetArmor},
+    {"onRide", EVENT_TYPES::onRide},
+    {"onStepOnPressurePlate", EVENT_TYPES::onStepOnPressurePlate},
+    {"onMobDie", EVENT_TYPES::onMobDie},
+    {"onMobHurt", EVENT_TYPES::onMobHurt},
+    {"onUseItem", EVENT_TYPES::onUseItem},
+    {"onTakeItem", EVENT_TYPES::onTakeItem},
+    {"onDropItem", EVENT_TYPES::onDropItem},
+    {"onUseItemOn", EVENT_TYPES::onUseItemOn},
+    {"onInventoryChange", EVENT_TYPES::onInventoryChange},
+    {"onChangeArmorStand", EVENT_TYPES::onChangeArmorStand},
+    {"onStartDestroyBlock", EVENT_TYPES::onStartDestroyBlock},
+    {"onDestroyBlock", EVENT_TYPES::onDestroyBlock},
+    {"onWitherBossDestroy", EVENT_TYPES::onWitherBossDestroy},
+    {"onPlaceBlock", EVENT_TYPES::onPlaceBlock},
+    {"onExplode", EVENT_TYPES::onExplode},
+    {"onBedExplode", EVENT_TYPES::onBedExplode},
+    {"onRespawnAnchorExplode", EVENT_TYPES::onRespawnAnchorExplode},
+    {"onBlockExploded", EVENT_TYPES::onBlockExploded},
+    {"onEntityExplode", EVENT_TYPES::onEntityExplode},
+    {"onBlockExplode", EVENT_TYPES::onBlockExplode},
+    {"onLiquidFlow", EVENT_TYPES::onLiquidFlow},
+    {"onOpenContainer", EVENT_TYPES::onOpenContainer},
+    {"onCloseContainer", EVENT_TYPES::onCloseContainer},
+    {"onContainerChangeSlot", EVENT_TYPES::onContainerChange},
+    {"onContainerChange", EVENT_TYPES::onContainerChange},
+    {"onOpenContainerScreen", EVENT_TYPES::onOpenContainerScreen},
+    {"onCmdBlockExecute", EVENT_TYPES::onCmdBlockExecute},
+    {"onRedStoneUpdate", EVENT_TYPES::onRedStoneUpdate},
+    {"onProjectileHitBlock", EVENT_TYPES::onProjectileHitBlock},
+    {"onProjectileHitEntity", EVENT_TYPES::onProjectileHitEntity},
+    {"onEntityTransformation", EVENT_TYPES::onEntityTransformation},
+    {"onBlockInteracted", EVENT_TYPES::onBlockInteracted},
+    {"onUseRespawnAnchor", EVENT_TYPES::onUseRespawnAnchor},
+    {"onFarmLandDecay", EVENT_TYPES::onFarmLandDecay},
+    {"onUseFrameBlock", EVENT_TYPES::onUseFrameBlock},
+    {"onPistonTryPush", EVENT_TYPES::onPistonTryPush},
+    {"onPistonPush", EVENT_TYPES::onPistonPush},
+    {"onHopperSearchItem", EVENT_TYPES::onHopperSearchItem},
+    {"onHopperPushOut", EVENT_TYPES::onHopperPushOut},
+    {"onFireSpread", EVENT_TYPES::onFireSpread},
+    {"onBlockChanged", EVENT_TYPES::onBlockChanged},
+    {"onNpcCmd", EVENT_TYPES::onNpcCmd},
+    {"onScoreChanged", EVENT_TYPES::onScoreChanged},
+    {"onServerStarted", EVENT_TYPES::onServerStarted},
+    {"onConsoleCmd", EVENT_TYPES::onConsoleCmd},
+    {"onConsoleOutput", EVENT_TYPES::onConsoleOutput},
+    {"onTick", EVENT_TYPES::onTick},
+    {"beforeMoneyAdd", EVENT_TYPES::beforeMoneyAdd},
+    {"beforeMoneyReduce", EVENT_TYPES::beforeMoneyReduce},
+    {"beforeMoneyTrans", EVENT_TYPES::beforeMoneyTrans},
+    {"beforeMoneySet", EVENT_TYPES::beforeMoneySet},
+    {"onMoneyAdd", EVENT_TYPES::onMoneyAdd},
+    {"onMoneyReduce", EVENT_TYPES::onMoneyReduce},
+    {"onMoneyTrans", EVENT_TYPES::onMoneyTrans},
+    {"onMoneySet", EVENT_TYPES::onMoneySet},
+    {"onFormSelected", EVENT_TYPES::onFormSelected},
+    {"onConsumeTotem", EVENT_TYPES::onConsumeTotem},
+    {"onEffectAdded", EVENT_TYPES::onEffectAdded},
+    {"onEffectRemoved", EVENT_TYPES::onEffectRemoved},
+    {"onEffectUpdated", EVENT_TYPES::onEffectUpdated},
+    {"onMobSpawn", EVENT_TYPES::onMobSpawn},
+    {"onExperienceAdd", EVENT_TYPES::onExperienceAdd},
+    {"onBedEnter", EVENT_TYPES::onBedEnter}};
+struct ListenerListType {
+    ScriptEngine* engine;
     script::Global<Function> func;
 };
 //监听器表
 static std::list<ListenerListType> listenerList[int(EVENT_TYPES::EVENT_COUNT)];
 //监听器历史
-static bool hasListened[int(EVENT_TYPES::EVENT_COUNT)] = { 0 };
+static bool hasListened[int(EVENT_TYPES::EVENT_COUNT)] = {0};
 
 //监听器异常拦截
-string EventTypeToString(EVENT_TYPES e)
-{
+string EventTypeToString(EVENT_TYPES e) {
     for (auto& [k, v] : EventsMap)
         if (v == e)
             return k;
     return "Unknown";
 }
 
-#define LISTENER_CATCH(TYPE) \
-    catch(const Exception& e) \
-    { \
-        logger.error("Event Callback Failed!"); \
-        logger.error << e << logger.endl; \
-        logger.error("In Event: " + EventTypeToString(TYPE)); \
+#define LISTENER_CATCH(TYPE)                                         \
+    catch (const Exception& e) {                                     \
+        logger.error("Event Callback Failed!");                      \
+        logger.error << e << logger.endl;                            \
+        logger.error("In Event: " + EventTypeToString(TYPE));        \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-    } \
-    catch (const std::exception& e) \
-    { \
-        logger.error("Event Callback Failed!"); \
-        logger.error("C++ Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        PrintScriptStackTrace(); \
-        logger.error("In Event: " + EventTypeToString(TYPE)); \
+    }                                                                \
+    catch (const std::exception& e) {                                \
+        logger.error("Event Callback Failed!");                      \
+        logger.error("C++ Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        PrintScriptStackTrace();                                     \
+        logger.error("In Event: " + EventTypeToString(TYPE));        \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-    } \
-    catch (const seh_exception& e) \
-    { \
-        logger.error("Event Callback Failed!"); \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
-        PrintScriptStackTrace(); \
-        logger.error("In Event: " + EventTypeToString(TYPE)); \
+    }                                                                \
+    catch (const seh_exception& e) {                                 \
+        logger.error("Event Callback Failed!");                      \
+        logger.error("SEH Uncaught Exception Detected!");            \
+        logger.error(TextEncoding::toUTF8(e.what()));                \
+        PrintScriptStackTrace();                                     \
+        logger.error("In Event: " + EventTypeToString(TYPE));        \
         logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName); \
-    } \
+    }
 
 //调用事件监听函数，拦截不执行original
-#define CallEventRtnVoid(TYPE,...) \
-    std::list<ListenerListType> &nowList = listenerList[int(TYPE)]; \
-    bool passToBDS = true; \
-    for(auto &listener : nowList) { \
-        EngineScope enter(listener.engine); \
-        try{ \
-            auto result = listener.func.get().call({},__VA_ARGS__); \
-            if(result.isBoolean() && result.asBoolean().value() == false) \
-                passToBDS = false; \
-        } \
-        LISTENER_CATCH(TYPE) \
-    }\
-    if(!passToBDS) { return; }
+#define CallEventRtnVoid(TYPE, ...)                                        \
+    std::list<ListenerListType>& nowList = listenerList[int(TYPE)];        \
+    bool passToBDS = true;                                                 \
+    for (auto& listener : nowList) {                                       \
+        EngineScope enter(listener.engine);                                \
+        try {                                                              \
+            auto result = listener.func.get().call({}, __VA_ARGS__);       \
+            if (result.isBoolean() && result.asBoolean().value() == false) \
+                passToBDS = false;                                         \
+        }                                                                  \
+        LISTENER_CATCH(TYPE)                                               \
+    }                                                                      \
+    if (!passToBDS) {                                                      \
+        return;                                                            \
+    }
 
 //调用事件监听函数，拦截返回false
-#define CallEvent(TYPE,...) \
-    std::list<ListenerListType> &nowList = listenerList[int(TYPE)]; \
-    bool passToBDS = true; \
-    for(auto &listener : nowList) { \
-        EngineScope enter(listener.engine); \
-        try{ \
-            auto result = listener.func.get().call({},__VA_ARGS__); \
-            if(result.isBoolean() && result.asBoolean().value() == false) \
-                passToBDS = false; \
-        } \
-        LISTENER_CATCH(TYPE) \
-    }\
-    if(!passToBDS) { return false; } else { return true; }
+#define CallEvent(TYPE, ...)                                               \
+    std::list<ListenerListType>& nowList = listenerList[int(TYPE)];        \
+    bool passToBDS = true;                                                 \
+    for (auto& listener : nowList) {                                       \
+        EngineScope enter(listener.engine);                                \
+        try {                                                              \
+            auto result = listener.func.get().call({}, __VA_ARGS__);       \
+            if (result.isBoolean() && result.asBoolean().value() == false) \
+                passToBDS = false;                                         \
+        }                                                                  \
+        LISTENER_CATCH(TYPE)                                               \
+    }                                                                      \
+    if (!passToBDS) {                                                      \
+        return false;                                                      \
+    } else {                                                               \
+        return true;                                                       \
+    }
 
 //调用事件监听函数，拦截返回RETURN_VALUE
-#define CallEventRtnValue(TYPE,RETURN_VALUE,...) \
-    std::list<ListenerListType> &nowList = listenerList[int(TYPE)]; \
-    bool passToBDS = true; \
-    for(auto &listener : nowList) { \
-        EngineScope enter(listener.engine); \
-        try{ \
-            auto result = listener.func.get().call({},__VA_ARGS__); \
-            if(result.isBoolean() && result.asBoolean().value() == false) \
-                passToBDS = false; \
-        } \
-        LISTENER_CATCH(TYPE) \
-    }\
-    if(!passToBDS) { return RETURN_VALUE; }
+#define CallEventRtnValue(TYPE, RETURN_VALUE, ...)                         \
+    std::list<ListenerListType>& nowList = listenerList[int(TYPE)];        \
+    bool passToBDS = true;                                                 \
+    for (auto& listener : nowList) {                                       \
+        EngineScope enter(listener.engine);                                \
+        try {                                                              \
+            auto result = listener.func.get().call({}, __VA_ARGS__);       \
+            if (result.isBoolean() && result.asBoolean().value() == false) \
+                passToBDS = false;                                         \
+        }                                                                  \
+        LISTENER_CATCH(TYPE)                                               \
+    }                                                                      \
+    if (!passToBDS) {                                                      \
+        return RETURN_VALUE;                                               \
+    }
 
 //模拟事件调用监听
-#define FakeCallEvent(ENGINE,TYPE,...) \
-    { \
+#define FakeCallEvent(ENGINE, TYPE, ...)                                \
+    {                                                                   \
         std::list<ListenerListType>& nowList = listenerList[int(TYPE)]; \
-        for (auto &listener : nowList) { \
-            if (listener.engine == ENGINE) { \
-                EngineScope enter(listener.engine); \
-                try { listener.func.get().call({},__VA_ARGS__); } \
-                LISTENER_CATCH(TYPE) \
-                break; \
-            } \
-        } \
+        for (auto& listener : nowList) {                                \
+            if (listener.engine == ENGINE) {                            \
+                EngineScope enter(listener.engine);                     \
+                try {                                                   \
+                    listener.func.get().call({}, __VA_ARGS__);          \
+                }                                                       \
+                LISTENER_CATCH(TYPE)                                    \
+                break;                                                  \
+            }                                                           \
+        }                                                               \
     }
 
 //延迟调用事件
-#define CallEventDelayed(TYPE,...) \
-    std::list<ListenerListType> &nowList = listenerList[int(TYPE)]; \
-    for(auto &listener : nowList) { \
-        EngineScope enter(listener.engine); \
-        try{ \
-            NewTimeout(listener.func.get(), { __VA_ARGS__ }, 5); \
-        } \
-        LISTENER_CATCH(TYPE) \
-    }\
+#define CallEventDelayed(TYPE, ...)                                 \
+    std::list<ListenerListType>& nowList = listenerList[int(TYPE)]; \
+    for (auto& listener : nowList) {                                \
+        EngineScope enter(listener.engine);                         \
+        try {                                                       \
+            NewTimeout(listener.func.get(), {__VA_ARGS__}, 5);      \
+        }                                                           \
+        LISTENER_CATCH(TYPE)                                        \
+    }
 
 //异常检查
-#define IF_LISTENED(TYPE) if(!listenerList[int(TYPE)].empty()) { try
-#define IF_LISTENED_END(TYPE) \
-    catch(...) \
-    { \
-        logger.error("Event Callback Failed!"); \
-        logger.error("Uncaught Exception Detected!"); \
+#define IF_LISTENED(TYPE)                   \
+    if (!listenerList[int(TYPE)].empty()) { \
+        try
+#define IF_LISTENED_END(TYPE)                                 \
+    catch (...) {                                             \
+        logger.error("Event Callback Failed!");               \
+        logger.error("Uncaught Exception Detected!");         \
         logger.error("In Event: " + EventTypeToString(TYPE)); \
-    } } return true;
+    }                                                         \
+    }                                                         \
+    return true;
 
 
 //////////////////// APIs ////////////////////
 
-Local<Value> McClass::listen(const Arguments& args)
-{
+Local<Value> McClass::listen(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
-    try{
-        return Boolean::newBoolean(LLSEAddEventListener(EngineScope::currentEngine(),args[0].toStr(),args[1].asFunction()));
+    try {
+        return Boolean::newBoolean(LLSEAddEventListener(EngineScope::currentEngine(), args[0].toStr(), args[1].asFunction()));
     }
     CATCH("Fail to Bind Listener!");
 }
@@ -294,30 +367,24 @@ Local<Value> McClass::listen(const Arguments& args)
 
 //////////////////// Funcs ////////////////////
 
-bool LLSEAddEventListener(ScriptEngine *engine, const string &eventName, const Local<Function> &func)
-{
+bool LLSEAddEventListener(ScriptEngine* engine, const string& eventName, const Local<Function>& func) {
     try {
         int eventId = int(EventsMap.at(eventName));
-        listenerList[eventId].push_back({ engine,script::Global<Function>(func) });
-        if (!hasListened[eventId])
-        {
+        listenerList[eventId].push_back({engine, script::Global<Function>(func)});
+        if (!hasListened[eventId]) {
             hasListened[eventId] = true;
             EnableEventListener(eventId);
         }
         return true;
-    }
-    catch (const std::logic_error& e)
-    {
+    } catch (const std::logic_error& e) {
         logger.error("Event \"" + eventName + "\" No Found!\n");
         logger.error("In Plugin: " + ENGINE_GET_DATA(engine)->pluginName);
         return false;
     }
 }
 
-bool LLSERemoveAllEventListeners(ScriptEngine* engine)
-{
-    for (auto& listeners : listenerList)
-    {
+bool LLSERemoveAllEventListeners(ScriptEngine* engine) {
+    for (auto& listeners : listenerList) {
         listeners.remove_if([engine](auto& listener) {
             return listener.engine == engine;
         });
@@ -325,26 +392,23 @@ bool LLSERemoveAllEventListeners(ScriptEngine* engine)
     return true;
 }
 
-bool LLSECallEventsOnHotLoad(ScriptEngine* engine)
-{
+bool LLSECallEventsOnHotLoad(ScriptEngine* engine) {
     FakeCallEvent(engine, EVENT_TYPES::onServerStarted);
 
     auto players = Level::getAllPlayers();
     for (auto& pl : players)
         FakeCallEvent(engine, EVENT_TYPES::onPreJoin, PlayerClass::newPlayer(pl));
-    for(auto &pl : players)
+    for (auto& pl : players)
         FakeCallEvent(engine, EVENT_TYPES::onJoin, PlayerClass::newPlayer(pl));
 
     return true;
 }
 
-bool LLSECallEventsOnHotUnload(ScriptEngine* engine)
-{
+bool LLSECallEventsOnHotUnload(ScriptEngine* engine) {
     auto players = Level::getAllPlayers();
     for (auto& pl : players)
         FakeCallEvent(engine, EVENT_TYPES::onLeft, PlayerClass::newPlayer(pl));
-    for (auto& [index, cb] : ENGINE_GET_DATA(engine)->unloadCallbacks)
-    {
+    for (auto& [index, cb] : ENGINE_GET_DATA(engine)->unloadCallbacks) {
         cb(engine);
     }
     ENGINE_GET_DATA(engine)->unloadCallbacks.clear();
@@ -353,779 +417,712 @@ bool LLSECallEventsOnHotUnload(ScriptEngine* engine)
 
 //////////////////// Events ////////////////////
 
-void EnableEventListener(int eventId)
-{
+void EnableEventListener(int eventId) {
     using namespace Event;
 
-    switch ((EVENT_TYPES)eventId)
-    {
-    case EVENT_TYPES::onJoin:
-        Event::PlayerJoinEvent::subscribe([](const PlayerJoinEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onJoin)
-            {
-                CallEvent(EVENT_TYPES::onJoin, PlayerClass::newPlayer((Player*)ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onJoin);
-        });
-        break;
+    switch ((EVENT_TYPES)eventId) {
+        case EVENT_TYPES::onJoin:
+            Event::PlayerJoinEvent::subscribe([](const PlayerJoinEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onJoin) {
+                    CallEvent(EVENT_TYPES::onJoin, PlayerClass::newPlayer((Player*)ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onJoin);
+            });
+            break;
 
-    case EVENT_TYPES::onPreJoin:
-        Event::PlayerPreJoinEvent::subscribe([](const PlayerPreJoinEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onPreJoin)
-            {
-                CallEvent(EVENT_TYPES::onPreJoin, PlayerClass::newPlayer((Player*)ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onPreJoin);
-        });
-        break;
+        case EVENT_TYPES::onPreJoin:
+            Event::PlayerPreJoinEvent::subscribe([](const PlayerPreJoinEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onPreJoin) {
+                    CallEvent(EVENT_TYPES::onPreJoin, PlayerClass::newPlayer((Player*)ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onPreJoin);
+            });
+            break;
 
-    case EVENT_TYPES::onLeft:
-        Event::PlayerLeftEvent::subscribe([](const PlayerLeftEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onLeft)
-            {
-                CallEvent(EVENT_TYPES::onLeft, PlayerClass::newPlayer((Player*)ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onLeft);
-        });
-        break;
+        case EVENT_TYPES::onLeft:
+            Event::PlayerLeftEvent::subscribe([](const PlayerLeftEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onLeft) {
+                    CallEvent(EVENT_TYPES::onLeft, PlayerClass::newPlayer((Player*)ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onLeft);
+            });
+            break;
 
-    case EVENT_TYPES::onChat:
-        Event::PlayerChatEvent::subscribe([](const PlayerChatEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onChat)
-            {
-                CallEvent(EVENT_TYPES::onChat, PlayerClass::newPlayer(ev.mPlayer), ev.mMessage);
-            }
-            IF_LISTENED_END(EVENT_TYPES::onChat);
-        });
-        break;
+        case EVENT_TYPES::onChat:
+            Event::PlayerChatEvent::subscribe([](const PlayerChatEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onChat) {
+                    CallEvent(EVENT_TYPES::onChat, PlayerClass::newPlayer(ev.mPlayer), ev.mMessage);
+                }
+                IF_LISTENED_END(EVENT_TYPES::onChat);
+            });
+            break;
 
-    case EVENT_TYPES::onChangeDim:
-        Event::PlayerChangeDimEvent::subscribe([](const PlayerChangeDimEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onChangeDim)
-            {
-                CallEvent(EVENT_TYPES::onChangeDim, PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mToDimensionId));      //======???
-            }
-            IF_LISTENED_END(EVENT_TYPES::onChangeDim);
-        });
-        break;
+        case EVENT_TYPES::onChangeDim:
+            Event::PlayerChangeDimEvent::subscribe([](const PlayerChangeDimEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onChangeDim) {
+                    CallEvent(EVENT_TYPES::onChangeDim, PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mToDimensionId)); //======???
+                }
+                IF_LISTENED_END(EVENT_TYPES::onChangeDim);
+            });
+            break;
 
-    case EVENT_TYPES::onAttackEntity:
-        Event::PlayerAttackEvent::subscribe([](const PlayerAttackEvent& ev)
-        {   
-            IF_LISTENED(EVENT_TYPES::onAttackEntity)
-            {
-                if (ev.mTarget)
-                {
-                    CallEvent(EVENT_TYPES::onAttackEntity, PlayerClass::newPlayer(ev.mPlayer), EntityClass::newEntity(ev.mTarget));
+        case EVENT_TYPES::onAttackEntity:
+            Event::PlayerAttackEvent::subscribe([](const PlayerAttackEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onAttackEntity) {
+                    if (ev.mTarget) {
+                        CallEvent(EVENT_TYPES::onAttackEntity, PlayerClass::newPlayer(ev.mPlayer), EntityClass::newEntity(ev.mTarget));
+                    }
                 }
-            }
-            IF_LISTENED_END(EVENT_TYPES::onAttackEntity);
-        });
-        break;
+                IF_LISTENED_END(EVENT_TYPES::onAttackEntity);
+            });
+            break;
 
-    case EVENT_TYPES::onAttackBlock:
-        Event::PlayerAttackBlockEvent::subscribe([](const PlayerAttackBlockEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onAttackBlock)
-            {
-                CallEvent(EVENT_TYPES::onAttackBlock,
-                    PlayerClass::newPlayer(ev.mPlayer),
-                    BlockClass::newBlock(ev.mBlockInstance),
-                    !ev.mItemStack->isNull() ? ItemClass::newItem(ev.mItemStack) : Local<Value>()
-                );
-            }
-            IF_LISTENED_END(EVENT_TYPES::onAttackBlock);
-        });
-        break;
+        case EVENT_TYPES::onAttackBlock:
+            Event::PlayerAttackBlockEvent::subscribe([](const PlayerAttackBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onAttackBlock) {
+                    CallEvent(EVENT_TYPES::onAttackBlock,
+                              PlayerClass::newPlayer(ev.mPlayer),
+                              BlockClass::newBlock(ev.mBlockInstance),
+                              !ev.mItemStack->isNull() ? ItemClass::newItem(ev.mItemStack) : Local<Value>());
+                }
+                IF_LISTENED_END(EVENT_TYPES::onAttackBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onPlayerDie:
-        Event::PlayerDieEvent::subscribe([](const PlayerDieEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onPlayerDie)
-            {
-                Actor* source = ev.mDamageSource->getEntity();
-                CallEvent(EVENT_TYPES::onPlayerDie, PlayerClass::newPlayer(ev.mPlayer),
-                    (source ? EntityClass::newEntity(source) : Local<Value>()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onPlayerDie);
-        });
-        break;
+        case EVENT_TYPES::onPlayerDie:
+            Event::PlayerDieEvent::subscribe([](const PlayerDieEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onPlayerDie) {
+                    Actor* source = ev.mDamageSource->getEntity();
+                    CallEvent(EVENT_TYPES::onPlayerDie, PlayerClass::newPlayer(ev.mPlayer),
+                              (source ? EntityClass::newEntity(source) : Local<Value>()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onPlayerDie);
+            });
+            break;
 
-    case EVENT_TYPES::onRespawn:
-        Event::PlayerRespawnEvent::subscribe([](const PlayerRespawnEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onRespawn)
-            {
-                CallEvent(EVENT_TYPES::onRespawn, PlayerClass::newPlayer((Player*)ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onRespawn)
-        });
-        break;
-
-    case EVENT_TYPES::onStartDestroyBlock:
-        Event::PlayerStartDestroyBlockEvent::subscribe([](const PlayerStartDestroyBlockEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onStartDestroyBlock)
-            {
-                CallEvent(EVENT_TYPES::onStartDestroyBlock, PlayerClass::newPlayer(ev.mPlayer),
-                    BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onStartDestroyBlock);
-        });
-        break;
+        case EVENT_TYPES::onRespawn:
+            Event::PlayerRespawnEvent::subscribe([](const PlayerRespawnEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onRespawn) {
+                    CallEvent(EVENT_TYPES::onRespawn, PlayerClass::newPlayer((Player*)ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onRespawn)
+            });
+            break;
 
-    case EVENT_TYPES::onDestroyBlock:
-        Event::PlayerDestroyBlockEvent::subscribe([](const PlayerDestroyBlockEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onDestroyBlock)
-            {
-                CallEvent(EVENT_TYPES::onDestroyBlock, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onDestroyBlock);
-        });
-        break;
+        case EVENT_TYPES::onStartDestroyBlock:
+            Event::PlayerStartDestroyBlockEvent::subscribe([](const PlayerStartDestroyBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onStartDestroyBlock) {
+                    CallEvent(EVENT_TYPES::onStartDestroyBlock, PlayerClass::newPlayer(ev.mPlayer),
+                              BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onStartDestroyBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onPlaceBlock:
-        Event::PlayerPlaceBlockEvent::subscribe([](const PlayerPlaceBlockEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onPlaceBlock)
-            {
-                CallEvent(EVENT_TYPES::onPlaceBlock, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onPlaceBlock);
-        });
-        break;
+        case EVENT_TYPES::onDestroyBlock:
+            Event::PlayerDestroyBlockEvent::subscribe([](const PlayerDestroyBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onDestroyBlock) {
+                    CallEvent(EVENT_TYPES::onDestroyBlock, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onDestroyBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onMove:
-        Event::PlayerMoveEvent::subscribe([](const PlayerMoveEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onMove)
-            {
-                CallEvent(EVENT_TYPES::onMove, PlayerClass::newPlayer(ev.mPlayer),
-                    FloatPos::newPos(ev.mPos, ev.mPlayer->getDimensionId()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onMove);
-        });
-        break;
+        case EVENT_TYPES::onPlaceBlock:
+            Event::PlayerPlaceBlockEvent::subscribe([](const PlayerPlaceBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onPlaceBlock) {
+                    CallEvent(EVENT_TYPES::onPlaceBlock, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onPlaceBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onJump:
-        Event::PlayerJumpEvent::subscribe([](const PlayerJumpEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onJump)
-            {
-                CallEvent(EVENT_TYPES::onJump, PlayerClass::newPlayer(ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onJump);
-        });
-        break;
+        case EVENT_TYPES::afterPlaceBlock:
+            Event::BlockPlacedByPlayerEvent::subscribe([](const BlockPlacedByPlayerEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::afterPlaceBlock) {
+                    CallEvent(EVENT_TYPES::afterPlaceBlock, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::afterPlaceBlock);
+                });
+            break;
 
-    case EVENT_TYPES::onDropItem:
-        Event::PlayerDropItemEvent::subscribe([](const PlayerDropItemEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onDropItem)
-            {
-                CallEvent(EVENT_TYPES::onDropItem, PlayerClass::newPlayer(ev.mPlayer), ItemClass::newItem(ev.mItemStack));       //###### Q lost items ######
-            }
-            IF_LISTENED_END(EVENT_TYPES::onDropItem);
-        });
-        break;
-
-    case EVENT_TYPES::onTakeItem:
-        Event::PlayerPickupItemEvent::subscribe([](const PlayerPickupItemEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onTakeItem)
-            {
-                CallEvent(EVENT_TYPES::onTakeItem, PlayerClass::newPlayer(ev.mPlayer),
-                    EntityClass::newEntity(ev.mItemEntity), ev.mItemStack ? ItemClass::newItem(ev.mItemStack) : Local<Value>());
-            }
-            IF_LISTENED_END(EVENT_TYPES::onTakeItem);
-        });
-        break;
+        case EVENT_TYPES::onMove:
+            Event::PlayerMoveEvent::subscribe([](const PlayerMoveEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onMove) {
+                    CallEvent(EVENT_TYPES::onMove, PlayerClass::newPlayer(ev.mPlayer),
+                              FloatPos::newPos(ev.mPos, ev.mPlayer->getDimensionId()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onMove);
+            });
+            break;
 
-    case EVENT_TYPES::onOpenContainer:
-        Event::PlayerOpenContainerEvent::subscribe([](const PlayerOpenContainerEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onOpenContainer)
-            {
-                CallEvent(EVENT_TYPES::onOpenContainer, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onOpenContainer);
-        });
-        break;
+        case EVENT_TYPES::onJump:
+            Event::PlayerJumpEvent::subscribe([](const PlayerJumpEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onJump) {
+                    CallEvent(EVENT_TYPES::onJump, PlayerClass::newPlayer(ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onJump);
+            });
+            break;
 
-    case EVENT_TYPES::onCloseContainer:
-        Event::PlayerCloseContainerEvent::subscribe([](const PlayerCloseContainerEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onCloseContainer)
-            {
-                CallEvent(EVENT_TYPES::onCloseContainer, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onCloseContainer);
-        });
-        break;
-
-    case EVENT_TYPES::onInventoryChange:
-        Event::PlayerInventoryChangeEvent::subscribe([](const PlayerInventoryChangeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onInventoryChange)
-            {
-                CallEvent(EVENT_TYPES::onInventoryChange, PlayerClass::newPlayer(ev.mPlayer), ev.mSlot,
-                    ItemClass::newItem(ev.mPreviousItemStack), ItemClass::newItem(ev.mNewItemStack));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onInventoryChange);
-        });
-        break;
+        case EVENT_TYPES::onDropItem:
+            Event::PlayerDropItemEvent::subscribe([](const PlayerDropItemEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onDropItem) {
+                    CallEvent(EVENT_TYPES::onDropItem, PlayerClass::newPlayer(ev.mPlayer), ItemClass::newItem(ev.mItemStack)); //###### Q lost items ######
+                }
+                IF_LISTENED_END(EVENT_TYPES::onDropItem);
+            });
+            break;
 
-    case EVENT_TYPES::onUseItem:
-        Event::PlayerUseItemEvent::subscribe([](const PlayerUseItemEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onUseItem)
-            {
-                CallEvent(EVENT_TYPES::onUseItem, PlayerClass::newPlayer((Player*)ev.mPlayer), ItemClass::newItem(ev.mItemStack));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onUseItem);
-        });
-        break;
-
-    case EVENT_TYPES::onUseItemOn:
-        Event::PlayerUseItemOnEvent::subscribe([](const PlayerUseItemOnEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onUseItemOn)
-            {
-                CallEvent(EVENT_TYPES::onUseItemOn, PlayerClass::newPlayer((Player*)ev.mPlayer),
-                          ItemClass::newItem(ev.mItemStack), BlockClass::newBlock(ev.mBlockInstance),
-                          Number::newNumber(ev.mFace), FloatPos::newPos(ev.mClickPos));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onUseItemOn);
-        });
-        break;
-
-    case EVENT_TYPES::onContainerChange:
-        Event::ContainerChangeEvent::subscribe([](const ContainerChangeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onContainerChange)
-            {
-                CallEvent(EVENT_TYPES::onContainerChange, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance),
-                    ev.mSlot, ItemClass::newItem(ev.mPreviousItemStack), ItemClass::newItem(ev.mNewItemStack));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onContainerChange);
-        });
-        break;
-
-    case EVENT_TYPES::onChangeArmorStand:
-        Event::ArmorStandChangeEvent::subscribe([](const ArmorStandChangeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onChangeArmorStand)
-            {
-                CallEvent(EVENT_TYPES::onChangeArmorStand, EntityClass::newEntity((Actor*)ev.mArmorStand),
-                    PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mSlot));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onChangeArmorStand);
-        });
-        break;
+        case EVENT_TYPES::onTakeItem:
+            Event::PlayerPickupItemEvent::subscribe([](const PlayerPickupItemEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onTakeItem) {
+                    CallEvent(EVENT_TYPES::onTakeItem, PlayerClass::newPlayer(ev.mPlayer),
+                              EntityClass::newEntity(ev.mItemEntity), ev.mItemStack ? ItemClass::newItem(ev.mItemStack) : Local<Value>());
+                }
+                IF_LISTENED_END(EVENT_TYPES::onTakeItem);
+            });
+            break;
 
-    case EVENT_TYPES::onChangeSprinting:
-        Event::PlayerSprintEvent::subscribe([](const PlayerSprintEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onChangeSprinting)
-            {
-                CallEvent(EVENT_TYPES::onChangeSprinting, PlayerClass::newPlayer(ev.mPlayer),
-                    Boolean::newBoolean(ev.mIsSprinting));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onChangeSprinting);
-        });
-        break;
+        case EVENT_TYPES::onOpenContainer:
+            Event::PlayerOpenContainerEvent::subscribe([](const PlayerOpenContainerEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onOpenContainer) {
+                    CallEvent(EVENT_TYPES::onOpenContainer, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onOpenContainer);
+            });
+            break;
 
-    case EVENT_TYPES::onSneak:
-        Event::PlayerSneakEvent::subscribe([](const PlayerSneakEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onSneak)
-            {
-                CallEvent(EVENT_TYPES::onSneak, PlayerClass::newPlayer(ev.mPlayer), Boolean::newBoolean(ev.mIsSneaking));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onSneak);
-        });
-        break;
+        case EVENT_TYPES::onCloseContainer:
+            Event::PlayerCloseContainerEvent::subscribe([](const PlayerCloseContainerEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onCloseContainer) {
+                    CallEvent(EVENT_TYPES::onCloseContainer, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onCloseContainer);
+            });
+            break;
 
-    case EVENT_TYPES::onOpenContainerScreen:
-        Event::PlayerOpenContainerScreenEvent::subscribe([](const PlayerOpenContainerScreenEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onOpenContainerScreen)
-            {
-                CallEvent(EVENT_TYPES::onOpenContainerScreen, PlayerClass::newPlayer(ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onOpenContainerScreen);
-        });
-        break;
-
-    case EVENT_TYPES::onSetArmor:
-        Event::PlayerSetArmorEvent::subscribe([](const PlayerSetArmorEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onSetArmor)
-            {
-                CallEvent(EVENT_TYPES::onSetArmor, PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mSlot),
-                    ItemClass::newItem(ev.mArmorItem));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onSetArmor);
-        });
-        break;
+        case EVENT_TYPES::onInventoryChange:
+            Event::PlayerInventoryChangeEvent::subscribe([](const PlayerInventoryChangeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onInventoryChange) {
+                    CallEvent(EVENT_TYPES::onInventoryChange, PlayerClass::newPlayer(ev.mPlayer), ev.mSlot,
+                              ItemClass::newItem(ev.mPreviousItemStack), ItemClass::newItem(ev.mNewItemStack));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onInventoryChange);
+            });
+            break;
 
-    case EVENT_TYPES::onEat:
-        Event::PlayerEatEvent::subscribe([](const PlayerEatEvent& ev)
-        {
-            IF_LISTENED(EVENT_TYPES::onEat)
-            {
-                CallEvent(EVENT_TYPES::onEat, PlayerClass::newPlayer(ev.mPlayer), ItemClass::newItem(ev.mFoodItem));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onEat);
-        });
-        break;
+        case EVENT_TYPES::onUseItem:
+            Event::PlayerUseItemEvent::subscribe([](const PlayerUseItemEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onUseItem) {
+                    CallEvent(EVENT_TYPES::onUseItem, PlayerClass::newPlayer((Player*)ev.mPlayer), ItemClass::newItem(ev.mItemStack));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onUseItem);
+            });
+            break;
 
-    case EVENT_TYPES::onConsumeTotem:
-        Event::PlayerConsumeTotemEvent::subscribe([](const PlayerConsumeTotemEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onConsumeTotem)
-            {
-                CallEvent(EVENT_TYPES::onConsumeTotem, PlayerClass::newPlayer(ev.mPlayer));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onConsumeTotem);
-        });
-        break;
-
-    case EVENT_TYPES::onEffectAdded:
-    case EVENT_TYPES::onEffectRemoved:
-    case EVENT_TYPES::onEffectUpdated:
-        Event::PlayerEffectChangedEvent::subscribe([](const PlayerEffectChangedEvent& ev) {
-            if (ev.mEventType == PlayerEffectChangedEvent::EventType::Add)
-            {
-                IF_LISTENED(EVENT_TYPES::onEffectAdded)
-                {
-                    CallEvent(EVENT_TYPES::onEffectAdded, PlayerClass::newPlayer(ev.mPlayer),
-                        String::newString(ev.mEffect->getComponentName().getString()));
-                }
-                IF_LISTENED_END(EVENT_TYPES::onEffectAdded);
-            }
-            else if (ev.mEventType == PlayerEffectChangedEvent::EventType::Remove)
-            {
-                IF_LISTENED(EVENT_TYPES::onEffectRemoved)
-                {
-                    CallEvent(EVENT_TYPES::onEffectRemoved, PlayerClass::newPlayer(ev.mPlayer),
-                        String::newString(ev.mEffect->getComponentName().getString()));
-                }
-                IF_LISTENED_END(EVENT_TYPES::onEffectRemoved);
-            }
-            else if (ev.mEventType == PlayerEffectChangedEvent::EventType::Update)
-            {
-                IF_LISTENED(EVENT_TYPES::onEffectUpdated)
-                {
-                    CallEvent(EVENT_TYPES::onEffectUpdated, PlayerClass::newPlayer(ev.mPlayer),
-                        String::newString(ev.mEffect->getComponentName().getString()));
-                }
-                IF_LISTENED_END(EVENT_TYPES::onEffectUpdated);
-            }
-            return true;
-        });
-        break;
+        case EVENT_TYPES::onUseItemOn:
+            Event::PlayerUseItemOnEvent::subscribe([](const PlayerUseItemOnEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onUseItemOn) {
+                    CallEvent(EVENT_TYPES::onUseItemOn, PlayerClass::newPlayer((Player*)ev.mPlayer),
+                              ItemClass::newItem(ev.mItemStack), BlockClass::newBlock(ev.mBlockInstance),
+                              Number::newNumber(ev.mFace), FloatPos::newPos(ev.mClickPos));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onUseItemOn);
+            });
+            break;
 
-    case EVENT_TYPES::onUseRespawnAnchor:
-        Event::PlayerUseRespawnAnchorEvent::subscribe([](const PlayerUseRespawnAnchorEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onUseRespawnAnchor)
-            {
-                BlockInstance bl(ev.mBlockInstance);
-                CallEvent(EVENT_TYPES::onUseRespawnAnchor, PlayerClass::newPlayer(ev.mPlayer),
-                    IntPos::newPos(bl.getPosition(), bl.getDimensionId()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onUseRespawnAnchor);
-        });
-        break;
+        case EVENT_TYPES::onContainerChange:
+            Event::ContainerChangeEvent::subscribe([](const ContainerChangeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onContainerChange) {
+                    CallEvent(EVENT_TYPES::onContainerChange, PlayerClass::newPlayer(ev.mPlayer), BlockClass::newBlock(ev.mBlockInstance),
+                              ev.mSlot, ItemClass::newItem(ev.mPreviousItemStack), ItemClass::newItem(ev.mNewItemStack));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onContainerChange);
+            });
+            break;
 
-    case EVENT_TYPES::onRide:
-        Event::EntityRideEvent::subscribe([](const EntityRideEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onRide)
-            {
-                CallEvent(EVENT_TYPES::onRide, EntityClass::newEntity(ev.mRider), EntityClass::newEntity(ev.mVehicle));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onRide);
-        });
-        break;
-
-    case EVENT_TYPES::onEntityExplode:
-        Event::EntityExplodeEvent::subscribe([](const EntityExplodeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onEntityExplode)
-            {
-                CallEvent(EVENT_TYPES::onEntityExplode, ev.mActor ? EntityClass::newEntity(ev.mActor) : Local<Value>(),
-                    FloatPos::newPos(ev.mPos, ev.mDimension->getDimensionId()),
-                    Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
-                    Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onEntityExplode);
-        });
-        break;
+        case EVENT_TYPES::onChangeArmorStand:
+            Event::ArmorStandChangeEvent::subscribe([](const ArmorStandChangeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onChangeArmorStand) {
+                    CallEvent(EVENT_TYPES::onChangeArmorStand, EntityClass::newEntity((Actor*)ev.mArmorStand),
+                              PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mSlot));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onChangeArmorStand);
+            });
+            break;
+
+        case EVENT_TYPES::onChangeSprinting:
+            Event::PlayerSprintEvent::subscribe([](const PlayerSprintEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onChangeSprinting) {
+                    CallEvent(EVENT_TYPES::onChangeSprinting, PlayerClass::newPlayer(ev.mPlayer),
+                              Boolean::newBoolean(ev.mIsSprinting));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onChangeSprinting);
+            });
+            break;
+
+        case EVENT_TYPES::onSneak:
+            Event::PlayerSneakEvent::subscribe([](const PlayerSneakEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onSneak) {
+                    CallEvent(EVENT_TYPES::onSneak, PlayerClass::newPlayer(ev.mPlayer), Boolean::newBoolean(ev.mIsSneaking));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onSneak);
+            });
+            break;
+
+        case EVENT_TYPES::onOpenContainerScreen:
+            Event::PlayerOpenContainerScreenEvent::subscribe([](const PlayerOpenContainerScreenEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onOpenContainerScreen) {
+                    CallEvent(EVENT_TYPES::onOpenContainerScreen, PlayerClass::newPlayer(ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onOpenContainerScreen);
+            });
+            break;
+
+        case EVENT_TYPES::onSetArmor:
+            Event::PlayerSetArmorEvent::subscribe([](const PlayerSetArmorEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onSetArmor) {
+                    CallEvent(EVENT_TYPES::onSetArmor, PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mSlot),
+                              ItemClass::newItem(ev.mArmorItem));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onSetArmor);
+            });
+            break;
 
-    case EVENT_TYPES::onBlockExplode:
-        Event::BlockExplodeEvent::subscribe([](const BlockExplodeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onBlockExplode)
-            {
+        case EVENT_TYPES::onEat:
+            Event::PlayerEatEvent::subscribe([](const PlayerEatEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onEat) {
+                    CallEvent(EVENT_TYPES::onEat, PlayerClass::newPlayer(ev.mPlayer), ItemClass::newItem(ev.mFoodItem));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onEat);
+            });
+            break;
+
+        case EVENT_TYPES::onConsumeTotem:
+            Event::PlayerConsumeTotemEvent::subscribe([](const PlayerConsumeTotemEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onConsumeTotem) {
+                    CallEvent(EVENT_TYPES::onConsumeTotem, PlayerClass::newPlayer(ev.mPlayer));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onConsumeTotem);
+            });
+            break;
+
+        case EVENT_TYPES::onEffectAdded:
+        case EVENT_TYPES::onEffectRemoved:
+        case EVENT_TYPES::onEffectUpdated:
+            Event::PlayerEffectChangedEvent::subscribe([](const PlayerEffectChangedEvent& ev) {
+                if (ev.mEventType == PlayerEffectChangedEvent::EventType::Add) {
+                    IF_LISTENED(EVENT_TYPES::onEffectAdded) {
+                        CallEvent(EVENT_TYPES::onEffectAdded, PlayerClass::newPlayer(ev.mPlayer),
+                                  String::newString(ev.mEffect->getComponentName().getString()));
+                    }
+                    IF_LISTENED_END(EVENT_TYPES::onEffectAdded);
+                } else if (ev.mEventType == PlayerEffectChangedEvent::EventType::Remove) {
+                    IF_LISTENED(EVENT_TYPES::onEffectRemoved) {
+                        CallEvent(EVENT_TYPES::onEffectRemoved, PlayerClass::newPlayer(ev.mPlayer),
+                                  String::newString(ev.mEffect->getComponentName().getString()));
+                    }
+                    IF_LISTENED_END(EVENT_TYPES::onEffectRemoved);
+                } else if (ev.mEventType == PlayerEffectChangedEvent::EventType::Update) {
+                    IF_LISTENED(EVENT_TYPES::onEffectUpdated) {
+                        CallEvent(EVENT_TYPES::onEffectUpdated, PlayerClass::newPlayer(ev.mPlayer),
+                                  String::newString(ev.mEffect->getComponentName().getString()));
+                    }
+                    IF_LISTENED_END(EVENT_TYPES::onEffectUpdated);
+                }
+                return true;
+            });
+            break;
+
+        case EVENT_TYPES::onUseRespawnAnchor:
+            Event::PlayerUseRespawnAnchorEvent::subscribe([](const PlayerUseRespawnAnchorEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onUseRespawnAnchor) {
+                    BlockInstance bl(ev.mBlockInstance);
+                    CallEvent(EVENT_TYPES::onUseRespawnAnchor, PlayerClass::newPlayer(ev.mPlayer),
+                              IntPos::newPos(bl.getPosition(), bl.getDimensionId()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onUseRespawnAnchor);
+            });
+            break;
+
+        case EVENT_TYPES::onRide:
+            Event::EntityRideEvent::subscribe([](const EntityRideEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onRide) {
+                    CallEvent(EVENT_TYPES::onRide, EntityClass::newEntity(ev.mRider), EntityClass::newEntity(ev.mVehicle));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onRide);
+            });
+            break;
+
+        case EVENT_TYPES::onEntityExplode:
+            Event::EntityExplodeEvent::subscribe([](const EntityExplodeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onEntityExplode) {
+                    CallEvent(EVENT_TYPES::onEntityExplode, ev.mActor ? EntityClass::newEntity(ev.mActor) : Local<Value>(),
+                              FloatPos::newPos(ev.mPos, ev.mDimension->getDimensionId()),
+                              Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
+                              Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onEntityExplode);
+            });
+            break;
+
+        case EVENT_TYPES::onBlockExplode:
+            Event::BlockExplodeEvent::subscribe([](const BlockExplodeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onBlockExplode) {
+                    BlockInstance bl(ev.mBlockInstance);
+                    CallEvent(EVENT_TYPES::onBlockExplode, BlockClass::newBlock(bl),
+                              IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
+                              Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
+                              Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onBlockExplode);
+            });
+            break;
+
+        case EVENT_TYPES::onExplode:
+            /// Explode events ↓↓ recently deleted.
+            Event::EntityExplodeEvent::subscribe([](const EntityExplodeEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onExplode) {
+                    CallEvent(EVENT_TYPES::onExplode, ev.mActor ? EntityClass::newEntity(ev.mActor) : Local<Value>(),
+                              FloatPos::newPos(ev.mPos, ev.mDimension->getDimensionId()),
+                              Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
+                              Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onExplode);
+            });
+            break;
+
+        case EVENT_TYPES::onRespawnAnchorExplode:
+        case EVENT_TYPES::onBedExplode:
+            Event::BlockExplodeEvent::subscribe([](const BlockExplodeEvent& ev) {
                 BlockInstance bl(ev.mBlockInstance);
-                CallEvent(EVENT_TYPES::onBlockExplode, BlockClass::newBlock(bl),
-                    IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
-                    Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
-                    Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onBlockExplode);
-        });
-        break;
-
-    case EVENT_TYPES::onExplode:
-        /// Explode events ↓↓ recently deleted.
-        Event::EntityExplodeEvent::subscribe([](const EntityExplodeEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onExplode)
-            {
-                CallEvent(EVENT_TYPES::onExplode, ev.mActor ? EntityClass::newEntity(ev.mActor) : Local<Value>(),
-                    FloatPos::newPos(ev.mPos, ev.mDimension->getDimensionId()),
-                    Number::newNumber(ev.mRadius), Number::newNumber(ev.mMaxResistance),
-                    Boolean::newBoolean(ev.mBreaking), Boolean::newBoolean(ev.mFire));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onExplode);
-        });
-        break;
+                if (bl.getBlock() == VanillaBlocks::mRespawnAnchor) {
+                    IF_LISTENED(EVENT_TYPES::onRespawnAnchorExplode) {
+                        CallEvent(EVENT_TYPES::onRespawnAnchorExplode, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
+                                  Local<Value>());
+                    }
+                    IF_LISTENED_END(EVENT_TYPES::onRespawnAnchorExplode);
+                } else {
+                    IF_LISTENED(EVENT_TYPES::onBedExplode) {
+                        CallEvent(EVENT_TYPES::onBedExplode, IntPos::newPos(bl.getPosition(), bl.getDimensionId()));
+                    }
+                    IF_LISTENED_END(EVENT_TYPES::onBedExplode);
+                }
+            });
+            /// Explode events ↑↑ recently deleted.
+            break;
 
-    case EVENT_TYPES::onRespawnAnchorExplode:
-    case EVENT_TYPES::onBedExplode:
-        Event::BlockExplodeEvent::subscribe([](const BlockExplodeEvent& ev)
-        {
-            BlockInstance bl(ev.mBlockInstance);
-            if (bl.getBlock() == VanillaBlocks::mRespawnAnchor) {
-                IF_LISTENED(EVENT_TYPES::onRespawnAnchorExplode)
-                {
-                    CallEvent(EVENT_TYPES::onRespawnAnchorExplode, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
-                        Local<Value>());
-                }
-                IF_LISTENED_END(EVENT_TYPES::onRespawnAnchorExplode);
-            }
-            else
-            {
-                IF_LISTENED(EVENT_TYPES::onBedExplode)
-                {
-                    CallEvent(EVENT_TYPES::onBedExplode, IntPos::newPos(bl.getPosition(), bl.getDimensionId()));
+        case EVENT_TYPES::onBlockExploded:
+            Event::BlockExplodedEvent::subscribe([](const BlockExplodedEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onBlockExploded) {
+                    CallEvent(EVENT_TYPES::onBlockExploded, BlockClass::newBlock(ev.mBlockInstance),
+                              EntityClass::newEntity(ev.mExplodeSource));
                 }
-                IF_LISTENED_END(EVENT_TYPES::onBedExplode);
-            }
-        });
-        /// Explode events ↑↑ recently deleted.
-        break;
-
-    case EVENT_TYPES::onBlockExploded:
-        Event::BlockExplodedEvent::subscribe([](const BlockExplodedEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onBlockExploded)
-            {
-                CallEvent(EVENT_TYPES::onBlockExploded, BlockClass::newBlock(ev.mBlockInstance),
-                    EntityClass::newEntity(ev.mExplodeSource));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onBlockExploded);
-        });
-        break;
-
-    case EVENT_TYPES::onCmdBlockExecute:
-        Event::CmdBlockExecuteEvent::subscribe([](const CmdBlockExecuteEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onCmdBlockExecute)
-            {
-                if (ev.mIsMinecart)
-                {
-                    CallEvent(EVENT_TYPES::onCmdBlockExecute, String::newString(ev.mCommand),
-                        FloatPos::newPos(ev.mMinecart->getPosition(), ev.mMinecart->getDimensionId()), true);
-                }
-                else
-                {
-                    BlockInstance bl = ev.mBlockInstance;
-                    CallEvent(EVENT_TYPES::onCmdBlockExecute, String::newString(ev.mCommand),
-                        FloatPos::newPos(bl.getPosition().toVec3(), bl.getDimensionId()), true);
+                IF_LISTENED_END(EVENT_TYPES::onBlockExploded);
+            });
+            break;
+
+        case EVENT_TYPES::onCmdBlockExecute:
+            Event::CmdBlockExecuteEvent::subscribe([](const CmdBlockExecuteEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onCmdBlockExecute) {
+                    if (ev.mIsMinecart) {
+                        CallEvent(EVENT_TYPES::onCmdBlockExecute, String::newString(ev.mCommand),
+                                  FloatPos::newPos(ev.mMinecart->getPosition(), ev.mMinecart->getDimensionId()), true);
+                    } else {
+                        BlockInstance bl = ev.mBlockInstance;
+                        CallEvent(EVENT_TYPES::onCmdBlockExecute, String::newString(ev.mCommand),
+                                  FloatPos::newPos(bl.getPosition().toVec3(), bl.getDimensionId()), true);
+                    }
                 }
-            }
-            IF_LISTENED_END(EVENT_TYPES::onCmdBlockExecute);
-        });
-        break;
-
-    case EVENT_TYPES::onRedStoneUpdate:
-        Event::RedStoneUpdateEvent::subscribe([](const RedStoneUpdateEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onRedStoneUpdate)
-            {
-                CallEvent(EVENT_TYPES::onRedStoneUpdate, BlockClass::newBlock(ev.mBlockInstance),
-                    Number::newNumber(ev.mRedStonePower), Boolean::newBoolean(ev.mIsActivated));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onRedStoneUpdate);
-        });
-        break;
-
-    case EVENT_TYPES::onWitherBossDestroy:
-        Event::WitherBossDestroyEvent::subscribe([](const WitherBossDestroyEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onWitherBossDestroy)
-            {
-                AABB range = ev.mDestroyRange;
-                int dimId = ((Actor*)ev.mWitherBoss)->getDimensionId();
-                CallEvent(EVENT_TYPES::onWitherBossDestroy, EntityClass::newEntity((Actor*)ev.mWitherBoss),
-                    IntPos::newPos(range.min.toBlockPos(), dimId), IntPos::newPos(range.max.toBlockPos(), dimId));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onWitherBossDestroy);
-        });
-        break;
-
-    case EVENT_TYPES::onMobHurt:
-        Event::MobHurtEvent::subscribe([](const MobHurtEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onMobHurt)
-            {
-                Actor* source = nullptr;
-                if (ev.mDamageSource->isEntitySource())
-                {
-                    if (ev.mDamageSource->isChildEntitySource())
-                        source = Level::getEntity(ev.mDamageSource->getEntityUniqueID());
-                    else
+                IF_LISTENED_END(EVENT_TYPES::onCmdBlockExecute);
+            });
+            break;
+
+        case EVENT_TYPES::onRedStoneUpdate:
+            Event::RedStoneUpdateEvent::subscribe([](const RedStoneUpdateEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onRedStoneUpdate) {
+                    CallEvent(EVENT_TYPES::onRedStoneUpdate, BlockClass::newBlock(ev.mBlockInstance),
+                              Number::newNumber(ev.mRedStonePower), Boolean::newBoolean(ev.mIsActivated));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onRedStoneUpdate);
+            });
+            break;
+
+        case EVENT_TYPES::onWitherBossDestroy:
+            Event::WitherBossDestroyEvent::subscribe([](const WitherBossDestroyEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onWitherBossDestroy) {
+                    AABB range = ev.mDestroyRange;
+                    int dimId = ((Actor*)ev.mWitherBoss)->getDimensionId();
+                    CallEvent(EVENT_TYPES::onWitherBossDestroy, EntityClass::newEntity((Actor*)ev.mWitherBoss),
+                              IntPos::newPos(range.min.toBlockPos(), dimId), IntPos::newPos(range.max.toBlockPos(), dimId));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onWitherBossDestroy);
+            });
+            break;
+
+        case EVENT_TYPES::onMobHurt:
+            Event::MobHurtEvent::subscribe([](const MobHurtEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onMobHurt) {
+                    Actor* source = nullptr;
+                    if (ev.mDamageSource->isEntitySource()) {
+                        if (ev.mDamageSource->isChildEntitySource())
+                            source = Level::getEntity(ev.mDamageSource->getEntityUniqueID());
+                        else
+                            source = Level::getEntity(ev.mDamageSource->getDamagingEntityUniqueID());
+                    }
+
+                    CallEvent(EVENT_TYPES::onMobHurt, EntityClass::newEntity(ev.mMob),
+                              source ? EntityClass::newEntity(source) : Local<Value>(),
+                              float(ev.mDamage), Number::newNumber((int)ev.mDamageSource->getCause()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onMobHurt)
+            });
+            break;
+
+        case EVENT_TYPES::onStepOnPressurePlate:
+            Event::EntityStepOnPressurePlateEvent::subscribe([](const EntityStepOnPressurePlateEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onStepOnPressurePlate) {
+                    CallEvent(EVENT_TYPES::onStepOnPressurePlate, EntityClass::newEntity(ev.mActor), BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onStepOnPressurePlate);
+            });
+            break;
+
+        case EVENT_TYPES::onMobDie:
+            Event::MobDieEvent::subscribe([](const MobDieEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onMobDie) {
+                    Actor* source = nullptr;
+                    if (ev.mDamageSource->isEntitySource()) {
                         source = Level::getEntity(ev.mDamageSource->getDamagingEntityUniqueID());
+                        if (ev.mDamageSource->isChildEntitySource())
+                            source = source->getOwner();
+                    }
+
+                    CallEvent(EVENT_TYPES::onMobDie, EntityClass::newEntity((Actor*)ev.mMob),
+                              (source ? EntityClass::newEntity(source) : Local<Value>()), Number::newNumber((int)ev.mDamageSource->getCause()));
                 }
+                IF_LISTENED_END(EVENT_TYPES::onMobDie);
+            });
+            break;
 
-                CallEvent(EVENT_TYPES::onMobHurt, EntityClass::newEntity(ev.mMob),
-                    source ? EntityClass::newEntity(source) : Local<Value>(),
-                          float(ev.mDamage), Number::newNumber((int)ev.mDamageSource->getCause()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onMobHurt)
-        });
-        break;
+        case EVENT_TYPES::onNpcCmd:
+            Event::NpcCmdEvent::subscribe([](const NpcCmdEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onNpcCmd) {
+                    CallEvent(EVENT_TYPES::onNpcCmd, EntityClass::newEntity(ev.mNpc), PlayerClass::newPlayer(ev.mPlayer),
+                              String::newString(ev.mCommand));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onNpcCmd);
+            });
+            break;
 
-    case EVENT_TYPES::onStepOnPressurePlate:
-        Event::EntityStepOnPressurePlateEvent::subscribe([](const EntityStepOnPressurePlateEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onStepOnPressurePlate)
-            {
-                CallEvent(EVENT_TYPES::onStepOnPressurePlate, EntityClass::newEntity(ev.mActor), BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onStepOnPressurePlate);
-        });
-        break;
-
-    case EVENT_TYPES::onMobDie:
-        Event::MobDieEvent::subscribe([](const MobDieEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onMobDie)
-            {
-                Actor* source = nullptr;
-                if (ev.mDamageSource->isEntitySource())
-                {
-                    source = Level::getEntity(ev.mDamageSource->getDamagingEntityUniqueID());
-                    if (ev.mDamageSource->isChildEntitySource())
-                        source = source->getOwner();
-                }
-
-                CallEvent(EVENT_TYPES::onMobDie, EntityClass::newEntity((Actor*)ev.mMob),
-                          (source ? EntityClass::newEntity(source) : Local<Value>()), Number::newNumber((int)ev.mDamageSource->getCause()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onMobDie);
-        });
-        break;
-
-    case EVENT_TYPES::onNpcCmd:
-        Event::NpcCmdEvent::subscribe([](const NpcCmdEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onNpcCmd)
-            {
-                CallEvent(EVENT_TYPES::onNpcCmd, EntityClass::newEntity(ev.mNpc), PlayerClass::newPlayer(ev.mPlayer),
-                    String::newString(ev.mCommand));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onNpcCmd);
-        });
-        break;
+        case EVENT_TYPES::onSpawnProjectile:
+            Event::ProjectileSpawnEvent::subscribe([](const ProjectileSpawnEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onSpawnProjectile) {
+                    CallEvent(EVENT_TYPES::onSpawnProjectile, EntityClass::newEntity(ev.mShooter), String::newString(ev.mType));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onSpawnProjectile);
+            });
+            break;
 
-    case EVENT_TYPES::onSpawnProjectile:
-        Event::ProjectileSpawnEvent::subscribe([](const ProjectileSpawnEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onSpawnProjectile)
-            {
-                CallEvent(EVENT_TYPES::onSpawnProjectile, EntityClass::newEntity(ev.mShooter), String::newString(ev.mType));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onSpawnProjectile);
-        });
-        break;
+        case EVENT_TYPES::onProjectileCreated:
+            Event::ProjectileCreatedEvent::subscribe([](const ProjectileCreatedEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onProjectileCreated) {
+                    CallEvent(EVENT_TYPES::onProjectileCreated, EntityClass::newEntity(ev.mShooter), EntityClass::newEntity(ev.mProjectile));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onProjectileCreated);
+            });
+            break;
 
-    case EVENT_TYPES::onProjectileCreated:
-        Event::ProjectileCreatedEvent::subscribe([](const ProjectileCreatedEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onProjectileCreated)
-            {
-                CallEvent(EVENT_TYPES::onProjectileCreated, EntityClass::newEntity(ev.mShooter), EntityClass::newEntity(ev.mProjectile));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onProjectileCreated);
-        });
-        break;
+        case EVENT_TYPES::onProjectileHitEntity:
+            Event::ProjectileHitEntityEvent::subscribe([](const ProjectileHitEntityEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onProjectileHitEntity) {
+                    CallEvent(EVENT_TYPES::onProjectileHitEntity, EntityClass::newEntity(ev.mTarget), EntityClass::newEntity(ev.mSource));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onProjectileHitEntity);
+            });
+            break;
 
-    case EVENT_TYPES::onProjectileHitEntity:
-        Event::ProjectileHitEntityEvent::subscribe([](const ProjectileHitEntityEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onProjectileHitEntity)
-            {
-                CallEvent(EVENT_TYPES::onProjectileHitEntity, EntityClass::newEntity(ev.mTarget), EntityClass::newEntity(ev.mSource));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onProjectileHitEntity);
-        });
-        break;
+        case EVENT_TYPES::onEntityTransformation:
+            Event::EntityTransformEvent::subscribe([](const EntityTransformEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onEntityTransformation) {
+                    CallEvent(EVENT_TYPES::onEntityTransformation, String::newString(to_string(ev.mBeforeEntityUniqueId->id)), EntityClass::newEntity(ev.mAfterEntity));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onEntityTransformation);
+            });
+            break;
 
-    case EVENT_TYPES::onEntityTransformation:
-        Event::EntityTransformEvent::subscribe([](const EntityTransformEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onEntityTransformation)
-            {
-                CallEvent(EVENT_TYPES::onEntityTransformation, String::newString(to_string(ev.mBeforeEntityUniqueId->id)), EntityClass::newEntity(ev.mAfterEntity));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onEntityTransformation);
-        });
-        break;
-
-    case EVENT_TYPES::onProjectileHitBlock:
-        Event::ProjectileHitBlockEvent::subscribe([](const ProjectileHitBlockEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onProjectileHitBlock)
-            {
-                CallEvent(EVENT_TYPES::onProjectileHitBlock, BlockClass::newBlock(ev.mBlockInstance),
-                    EntityClass::newEntity(ev.mSource));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onProjectileHitBlock);
-        });
-        break;
+        case EVENT_TYPES::onProjectileHitBlock:
+            Event::ProjectileHitBlockEvent::subscribe([](const ProjectileHitBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onProjectileHitBlock) {
+                    CallEvent(EVENT_TYPES::onProjectileHitBlock, BlockClass::newBlock(ev.mBlockInstance),
+                              EntityClass::newEntity(ev.mSource));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onProjectileHitBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onLiquidFlow:
-        Event::LiquidSpreadEvent::subscribe([](const LiquidSpreadEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onLiquidFlow)
-            {
-                CallEvent(EVENT_TYPES::onLiquidFlow, BlockClass::newBlock(ev.mBlockInstance), IntPos::newPos(ev.mTarget, ev.mDimensionId));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onLiquidFlow);
-        });
-        break;
-
-    case EVENT_TYPES::onUseFrameBlock:
-        Event::PlayerUseFrameBlockEvent::subscribe([](const PlayerUseFrameBlockEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onUseFrameBlock)
-            {
-                CallEvent(EVENT_TYPES::onUseFrameBlock, PlayerClass::newPlayer(ev.mPlayer),
-                    BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onUseFrameBlock);
-        });
-        break;
-
-    case EVENT_TYPES::onBlockInteracted:
-        Event::BlockInteractedEvent::subscribe([](const BlockInteractedEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onBlockInteracted)
-            {
-                CallEvent(EVENT_TYPES::onBlockInteracted, PlayerClass::newPlayer(ev.mPlayer),
-                    BlockClass::newBlock(ev.mBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onBlockInteracted);
-        });
-        break;
+        case EVENT_TYPES::onLiquidFlow:
+            Event::LiquidSpreadEvent::subscribe([](const LiquidSpreadEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onLiquidFlow) {
+                    CallEvent(EVENT_TYPES::onLiquidFlow, BlockClass::newBlock(ev.mBlockInstance), IntPos::newPos(ev.mTarget, ev.mDimensionId));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onLiquidFlow);
+            });
+            break;
 
-    case EVENT_TYPES::onFarmLandDecay:
-        Event::FarmLandDecayEvent::subscribe([](const FarmLandDecayEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onFarmLandDecay)
-            {
-                BlockInstance bl(ev.mBlockInstance);
-                CallEvent(EVENT_TYPES::onFarmLandDecay, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
-                    EntityClass::newEntity(ev.mActor));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onFarmLandDecay);
-        });
-        break;
-
-    case EVENT_TYPES::onPistonTryPush:
-        Event::PistonTryPushEvent::subscribe([](const PistonTryPushEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onPistonTryPush)
-            {
-                BlockInstance bl(ev.mPistonBlockInstance);
-                CallEvent(EVENT_TYPES::onPistonTryPush, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
-                    BlockClass::newBlock(ev.mTargetBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onPistonTryPush);
-        });
-        break;
-
-    case EVENT_TYPES::onPistonPush:
-        Event::PistonPushEvent::subscribe([](const PistonPushEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onPistonPush)
-            {
-                BlockInstance bl(ev.mPistonBlockInstance);
-                CallEvent(EVENT_TYPES::onPistonPush, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
-                    BlockClass::newBlock(ev.mTargetBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onPistonPush);
-        });
-        break;
+        case EVENT_TYPES::onUseFrameBlock:
+            Event::PlayerUseFrameBlockEvent::subscribe([](const PlayerUseFrameBlockEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onUseFrameBlock) {
+                    CallEvent(EVENT_TYPES::onUseFrameBlock, PlayerClass::newPlayer(ev.mPlayer),
+                              BlockClass::newBlock(ev.mBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onUseFrameBlock);
+            });
+            break;
 
-    case EVENT_TYPES::onHopperSearchItem:
-        Event::HopperSearchItemEvent::subscribe([](const HopperSearchItemEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onHopperSearchItem)
-            {
-                if (ev.isMinecart)
-                {
-                    CallEvent(EVENT_TYPES::onHopperSearchItem, FloatPos::newPos(ev.mMinecartPos, ev.mDimensionId), ev.isMinecart);
+        case EVENT_TYPES::onBlockInteracted:
+            Event::BlockInteractedEvent::subscribe([](const BlockInteractedEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onBlockInteracted) {
+                    CallEvent(EVENT_TYPES::onBlockInteracted, PlayerClass::newPlayer(ev.mPlayer),
+                              BlockClass::newBlock(ev.mBlockInstance));
                 }
-                else
-                {
-                    BlockInstance bl = ev.mHopperBlock;
-                    CallEvent(EVENT_TYPES::onHopperSearchItem, FloatPos::newPos(bl.getPosition().toVec3(), ev.mDimensionId), ev.isMinecart);
+                IF_LISTENED_END(EVENT_TYPES::onBlockInteracted);
+            });
+            break;
+
+        case EVENT_TYPES::onFarmLandDecay:
+            Event::FarmLandDecayEvent::subscribe([](const FarmLandDecayEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onFarmLandDecay) {
+                    BlockInstance bl(ev.mBlockInstance);
+                    CallEvent(EVENT_TYPES::onFarmLandDecay, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
+                              EntityClass::newEntity(ev.mActor));
                 }
-            }
-            IF_LISTENED_END(EVENT_TYPES::onHopperSearchItem);
-        });
-        break;
+                IF_LISTENED_END(EVENT_TYPES::onFarmLandDecay);
+            });
+            break;
 
-    case EVENT_TYPES::onHopperPushOut:
-        Event::HopperPushOutEvent::subscribe([](const HopperPushOutEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onHopperPushOut)
-            {
-                CallEvent(EVENT_TYPES::onHopperPushOut, FloatPos::newPos(ev.mPos, ev.mDimensionId));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onHopperPushOut);
-        });
-        break;
+        case EVENT_TYPES::onPistonTryPush:
+            Event::PistonTryPushEvent::subscribe([](const PistonTryPushEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onPistonTryPush) {
+                    BlockInstance bl(ev.mPistonBlockInstance);
+                    CallEvent(EVENT_TYPES::onPistonTryPush, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
+                              BlockClass::newBlock(ev.mTargetBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onPistonTryPush);
+            });
+            break;
 
-    case EVENT_TYPES::onFireSpread:
-        Event::FireSpreadEvent::subscribe([](const FireSpreadEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onFireSpread)
-            {
-                CallEvent(EVENT_TYPES::onFireSpread, IntPos::newPos(ev.mTarget, ev.mDimensionId));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onFireSpread);
-        });
-        break;
-
-    case EVENT_TYPES::onBlockChanged:
-        Event::BlockChangedEvent::subscribe([](const BlockChangedEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onBlockChanged)
-            {
-                CallEvent(EVENT_TYPES::onBlockChanged, BlockClass::newBlock(ev.mPreviousBlockInstance),
-                    BlockClass::newBlock(ev.mNewBlockInstance));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onBlockChanged);
-        });
-        break;
-
-    case EVENT_TYPES::onScoreChanged:
-        Event::PlayerScoreChangedEvent::subscribe([](const PlayerScoreChangedEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onScoreChanged)
-            {
-                CallEvent(EVENT_TYPES::onScoreChanged, PlayerClass::newPlayer(ev.mPlayer),
-                    Number::newNumber(ev.mScore), String::newString(ev.mObjective->getName()),
-                    String::newString(ev.mObjective->getDisplayName()));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onScoreChanged);
-        });
-        break;
+        case EVENT_TYPES::onPistonPush:
+            Event::PistonPushEvent::subscribe([](const PistonPushEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onPistonPush) {
+                    BlockInstance bl(ev.mPistonBlockInstance);
+                    CallEvent(EVENT_TYPES::onPistonPush, IntPos::newPos(bl.getPosition(), bl.getDimensionId()),
+                              BlockClass::newBlock(ev.mTargetBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onPistonPush);
+            });
+            break;
 
-    case EVENT_TYPES::onConsoleOutput:
-        Event::ConsoleOutputEvent::subscribe([](const ConsoleOutputEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onConsoleOutput)
-            {
-                CallEvent(EVENT_TYPES::onConsoleOutput, String::newString(ev.mOutput));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onConsoleOutput);
-        });
-        break;
-    case EVENT_TYPES::onMobSpawn:
-        Event::MobSpawnEvent::subscribe([](const MobSpawnEvent& ev) {
-            IF_LISTENED(EVENT_TYPES::onMobSpawn)
-            {
-                CallEvent(EVENT_TYPES::onMobSpawn, String::newString(ev.mTypeName), FloatPos::newPos(ev.mPos, ev.mDimensionId));
-            }
-            IF_LISTENED_END(EVENT_TYPES::onMobSpawn);
-        });
-        break;
-    default:
-        break;
+        case EVENT_TYPES::onHopperSearchItem:
+            Event::HopperSearchItemEvent::subscribe([](const HopperSearchItemEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onHopperSearchItem) {
+                    if (ev.isMinecart) {
+                        CallEvent(EVENT_TYPES::onHopperSearchItem, FloatPos::newPos(ev.mMinecartPos, ev.mDimensionId), ev.isMinecart);
+                    } else {
+                        BlockInstance bl = ev.mHopperBlock;
+                        CallEvent(EVENT_TYPES::onHopperSearchItem, FloatPos::newPos(bl.getPosition().toVec3(), ev.mDimensionId), ev.isMinecart);
+                    }
+                }
+                IF_LISTENED_END(EVENT_TYPES::onHopperSearchItem);
+            });
+            break;
+
+        case EVENT_TYPES::onHopperPushOut:
+            Event::HopperPushOutEvent::subscribe([](const HopperPushOutEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onHopperPushOut) {
+                    CallEvent(EVENT_TYPES::onHopperPushOut, FloatPos::newPos(ev.mPos, ev.mDimensionId));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onHopperPushOut);
+            });
+            break;
+
+        case EVENT_TYPES::onFireSpread:
+            Event::FireSpreadEvent::subscribe([](const FireSpreadEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onFireSpread) {
+                    CallEvent(EVENT_TYPES::onFireSpread, IntPos::newPos(ev.mTarget, ev.mDimensionId));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onFireSpread);
+            });
+            break;
+
+        case EVENT_TYPES::onBlockChanged:
+            Event::BlockChangedEvent::subscribe([](const BlockChangedEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onBlockChanged) {
+                    CallEvent(EVENT_TYPES::onBlockChanged, BlockClass::newBlock(ev.mPreviousBlockInstance),
+                              BlockClass::newBlock(ev.mNewBlockInstance));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onBlockChanged);
+            });
+            break;
+
+        case EVENT_TYPES::onScoreChanged:
+            Event::PlayerScoreChangedEvent::subscribe([](const PlayerScoreChangedEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onScoreChanged) {
+                    CallEvent(EVENT_TYPES::onScoreChanged, PlayerClass::newPlayer(ev.mPlayer),
+                              Number::newNumber(ev.mScore), String::newString(ev.mObjective->getName()),
+                              String::newString(ev.mObjective->getDisplayName()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onScoreChanged);
+            });
+            break;
+
+        case EVENT_TYPES::onConsoleOutput:
+            Event::ConsoleOutputEvent::subscribe([](const ConsoleOutputEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onConsoleOutput) {
+                    CallEvent(EVENT_TYPES::onConsoleOutput, String::newString(ev.mOutput));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onConsoleOutput);
+            });
+            break;
+
+        case EVENT_TYPES::onMobSpawn:
+            Event::MobSpawnEvent::subscribe([](const MobSpawnEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onMobSpawn) {
+                    CallEvent(EVENT_TYPES::onMobSpawn, String::newString(ev.mTypeName), FloatPos::newPos(ev.mPos, ev.mDimensionId));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onMobSpawn);
+            });
+            break;
+
+        case EVENT_TYPES::onExperienceAdd:
+            Event::PlayerExperienceAddEvent::subscribe([](const PlayerExperienceAddEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onExperienceAdd) {
+                    CallEvent(EVENT_TYPES::onExperienceAdd, PlayerClass::newPlayer(ev.mPlayer), Number::newNumber(ev.mExp));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onExperienceAdd);
+            });
+            break;
+
+        case EVENT_TYPES::onBedEnter:
+            Event::PlayerBedEnterEvent::subscribe([](const PlayerBedEnterEvent& ev) {
+                IF_LISTENED(EVENT_TYPES::onBedEnter) {
+                    BlockInstance bl(*ev.mBlockInstance);
+                    CallEvent(EVENT_TYPES::onBedEnter, PlayerClass::newPlayer(ev.mPlayer), IntPos::newPos(bl.getPosition(), bl.getDimensionId()));
+                }
+                IF_LISTENED_END(EVENT_TYPES::onBedEnter);
+            });
+            break;
+
+        default:
+            break;
     }
 }
 
-void InitBasicEventListeners()
-{
+void InitBasicEventListeners() {
     using namespace Event;
 
-    Event::PlayerCmdEvent::subscribe([](const PlayerCmdEvent& ev)
-    {
+    Event::PlayerCmdEvent::subscribe([](const PlayerCmdEvent& ev) {
         string cmd = ev.mCommand;
         Player* player = ev.mPlayer;
 
@@ -1133,40 +1130,33 @@ void InitBasicEventListeners()
         bool isFromOtherEngine = false;
         string prefix = LLSEFindCmdReg(true, cmd, paras, &isFromOtherEngine);
 
-        if (!prefix.empty())
-        {
-            //LLSE Registered Cmd
+        if (!prefix.empty()) {
+            // LLSE Registered Cmd
             int perm = localShareData->playerCmdCallbacks[prefix].perm;
 
-            if (player->getCommandPermissionLevel() >= perm)
-            {
+            if (player->getCommandPermissionLevel() >= perm) {
                 bool callbackRes = CallPlayerCmdCallback(player, prefix, paras);
-                IF_LISTENED(EVENT_TYPES::onPlayerCmd)
-                {
+                IF_LISTENED(EVENT_TYPES::onPlayerCmd) {
                     CallEvent(EVENT_TYPES::onPlayerCmd, PlayerClass::newPlayer(player), String::newString(cmd));
                 }
                 IF_LISTENED_END(EVENT_TYPES::onPlayerCmd);
                 if (!callbackRes)
                     return false;
             }
-        }
-        else
-        {
+        } else {
             if (isFromOtherEngine)
                 return false;
 
-            //Other Cmd
-            IF_LISTENED(EVENT_TYPES::onPlayerCmd)
-            {
+            // Other Cmd
+            IF_LISTENED(EVENT_TYPES::onPlayerCmd) {
                 CallEvent(EVENT_TYPES::onPlayerCmd, PlayerClass::newPlayer(player), String::newString(cmd));
             }
             IF_LISTENED_END(EVENT_TYPES::onPlayerCmd);
         }
         return true;
     });
-    
-    Event::ConsoleCmdEvent::subscribe_ref([](ConsoleCmdEvent& ev)
-    {
+
+    Event::ConsoleCmdEvent::subscribe_ref([](ConsoleCmdEvent& ev) {
         string cmd = ev.mCommand;
 
         // PreProcess
@@ -1175,32 +1165,27 @@ void InitBasicEventListeners()
         if (!ProcessOldHotManageCommand(ev.mCommand))
             return false;
 
-        //CallEvents
+        // CallEvents
         vector<string> paras;
         bool isFromOtherEngine = false;
         string prefix = LLSEFindCmdReg(false, cmd, paras, &isFromOtherEngine);
 
-        if (!prefix.empty())
-        {
-            //LLSE Registered Cmd
+        if (!prefix.empty()) {
+            // LLSE Registered Cmd
 
             bool callbackRes = CallServerCmdCallback(prefix, paras);
-            IF_LISTENED(EVENT_TYPES::onConsoleCmd)
-            {
+            IF_LISTENED(EVENT_TYPES::onConsoleCmd) {
                 CallEvent(EVENT_TYPES::onConsoleCmd, String::newString(cmd));
             }
             IF_LISTENED_END(EVENT_TYPES::onConsoleCmd);
             if (!callbackRes)
                 return false;
-        }
-        else
-        {
+        } else {
             if (isFromOtherEngine)
                 return false;
 
-            //Other Cmd
-            IF_LISTENED(EVENT_TYPES::onConsoleCmd)
-            {
+            // Other Cmd
+            IF_LISTENED(EVENT_TYPES::onConsoleCmd) {
                 CallEvent(EVENT_TYPES::onConsoleCmd, String::newString(cmd));
             }
             IF_LISTENED_END(EVENT_TYPES::onConsoleCmd);
@@ -1208,39 +1193,37 @@ void InitBasicEventListeners()
         return true;
     });
 
-// Plugin Hot Management
+    // Plugin Hot Management
     Event::ScriptPluginManagerEvent::subscribe_ref([](ScriptPluginManagerEvent& ev) {
         // if (!LL::isDebugMode())
         //     return false;
         if (ev.pluginExtention != LLSE_PLUGINS_EXTENSION)
             return true;
 
-        switch (ev.operation)
-        {
-        case ScriptPluginManagerEvent::Operation::Load:
-            if (PluginManager::loadPlugin(ev.target, true, true))
-                ev.success = true;
-            break;
+        switch (ev.operation) {
+            case ScriptPluginManagerEvent::Operation::Load:
+                if (PluginManager::loadPlugin(ev.target, true, true))
+                    ev.success = true;
+                break;
 
-        case ScriptPluginManagerEvent::Operation::Unload:
-            if (PluginManager::unloadPlugin(ev.target))
-                ev.success = true;
-            break;
+            case ScriptPluginManagerEvent::Operation::Unload:
+                if (PluginManager::unloadPlugin(ev.target))
+                    ev.success = true;
+                break;
 
-        case ScriptPluginManagerEvent::Operation::Reload:
-            if (PluginManager::reloadPlugin(ev.target))
-                ev.success = true;
-            break;
+            case ScriptPluginManagerEvent::Operation::Reload:
+                if (PluginManager::reloadPlugin(ev.target))
+                    ev.success = true;
+                break;
 
-        default:
-            break;
+            default:
+                break;
         }
         return true;
     });
 
-// For RegisterCmd...
-    Event::RegCmdEvent::subscribe([](const RegCmdEvent& ev)
-    {
+    // For RegisterCmd...
+    Event::RegCmdEvent::subscribe([](const RegCmdEvent& ev) {
         isCmdRegisterEnabled = true;
 
         //处理延迟注册
@@ -1249,11 +1232,9 @@ void InitBasicEventListeners()
     });
 
 
-// ===== onServerStarted =====
-    Event::ServerStartedEvent::subscribe([](Event::ServerStartedEvent ev)
-    {
-        IF_LISTENED(EVENT_TYPES::onServerStarted)
-        {
+    // ===== onServerStarted =====
+    Event::ServerStartedEvent::subscribe([](Event::ServerStartedEvent ev) {
+        IF_LISTENED(EVENT_TYPES::onServerStarted) {
             CallEventDelayed(EVENT_TYPES::onServerStarted);
         }
         IF_LISTENED_END(EVENT_TYPES::onServerStarted);
@@ -1261,10 +1242,8 @@ void InitBasicEventListeners()
     });
 }
 
-inline bool CallTickEvent()
-{
-    IF_LISTENED(EVENT_TYPES::onTick)
-    {
+inline bool CallTickEvent() {
+    IF_LISTENED(EVENT_TYPES::onTick) {
         CallEvent(EVENT_TYPES::onTick);
     }
     IF_LISTENED_END(EVENT_TYPES::onTick);
@@ -1272,27 +1251,21 @@ inline bool CallTickEvent()
 
 // 植入tick
 THook(void, "?tick@ServerLevel@@UEAAXXZ",
-    void* _this)
-{
-    try
-    {
+      void* _this) {
+    try {
         std::list<ScriptEngine*> tmpList;
         {
             SRWLockSharedHolder lock(globalShareData->engineListLock);
             // low efficiency
             tmpList = globalShareData->globalEngineList;
         }
-        for (auto engine : tmpList)
-        {
-            if (EngineManager::isValid(engine) && EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE)
-            {
+        for (auto engine : tmpList) {
+            if (EngineManager::isValid(engine) && EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE) {
                 EngineScope enter(engine);
                 engine->messageQueue()->loopQueue(script::utils::MessageQueue::LoopType::kLoopOnce);
             }
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Error occurred in Engine Message Loop!");
         logger.error("Uncaught Exception Detected!");
     }
@@ -1327,87 +1300,67 @@ THook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVLecte
 }
 */
 
-bool MoneyBeforeEventCallback(LLMoneyEvent type, xuid_t from, xuid_t to, money_t value)
-{
-    switch (type)
-    {
-    case LLMoneyEvent::Add:
-    {
-        IF_LISTENED(EVENT_TYPES::beforeMoneyAdd)
-        {
-            CallEvent(EVENT_TYPES::beforeMoneyAdd, String::newString(to), Number::newNumber(value));
+bool MoneyBeforeEventCallback(LLMoneyEvent type, xuid_t from, xuid_t to, money_t value) {
+    switch (type) {
+        case LLMoneyEvent::Add: {
+            IF_LISTENED(EVENT_TYPES::beforeMoneyAdd) {
+                CallEvent(EVENT_TYPES::beforeMoneyAdd, String::newString(to), Number::newNumber(value));
+            }
+            IF_LISTENED_END(EVENT_TYPES::beforeMoneyAdd);
+            break;
         }
-        IF_LISTENED_END(EVENT_TYPES::beforeMoneyAdd);
-        break;
-    }
-    case LLMoneyEvent::Reduce:
-    {
-        IF_LISTENED(EVENT_TYPES::beforeMoneyReduce)
-        {
-            CallEvent(EVENT_TYPES::beforeMoneyReduce, String::newString(to), Number::newNumber(value));
+        case LLMoneyEvent::Reduce: {
+            IF_LISTENED(EVENT_TYPES::beforeMoneyReduce) {
+                CallEvent(EVENT_TYPES::beforeMoneyReduce, String::newString(to), Number::newNumber(value));
+            }
+            IF_LISTENED_END(EVENT_TYPES::beforeMoneyReduce);
+            break;
         }
-        IF_LISTENED_END(EVENT_TYPES::beforeMoneyReduce);
-        break;
-    }
-    case LLMoneyEvent::Trans:
-    {
-        IF_LISTENED(EVENT_TYPES::beforeMoneyTrans)
-        {
-            CallEvent(EVENT_TYPES::beforeMoneyTrans, String::newString(from), String::newString(to), Number::newNumber(value));
+        case LLMoneyEvent::Trans: {
+            IF_LISTENED(EVENT_TYPES::beforeMoneyTrans) {
+                CallEvent(EVENT_TYPES::beforeMoneyTrans, String::newString(from), String::newString(to), Number::newNumber(value));
+            }
+            IF_LISTENED_END(EVENT_TYPES::beforeMoneyTrans);
+            break;
         }
-        IF_LISTENED_END(EVENT_TYPES::beforeMoneyTrans);
-        break;
-    }
-    case LLMoneyEvent::Set:
-    {
-        IF_LISTENED(EVENT_TYPES::beforeMoneySet)
-        {
-            CallEvent(EVENT_TYPES::beforeMoneySet, String::newString(to), Number::newNumber(value));
+        case LLMoneyEvent::Set: {
+            IF_LISTENED(EVENT_TYPES::beforeMoneySet) {
+                CallEvent(EVENT_TYPES::beforeMoneySet, String::newString(to), Number::newNumber(value));
+            }
+            IF_LISTENED_END(EVENT_TYPES::beforeMoneySet);
+            break;
         }
-        IF_LISTENED_END(EVENT_TYPES::beforeMoneySet);
-        break;
-    }
-    default:
-        break;
+        default:
+            break;
     }
     return true;
 }
 
-bool MoneyEventCallback(LLMoneyEvent type, xuid_t from, xuid_t to, money_t value)
-{
-    switch (type)
-    {
-        case LLMoneyEvent::Add:
-        {
-            IF_LISTENED(EVENT_TYPES::onMoneyAdd)
-            {
+bool MoneyEventCallback(LLMoneyEvent type, xuid_t from, xuid_t to, money_t value) {
+    switch (type) {
+        case LLMoneyEvent::Add: {
+            IF_LISTENED(EVENT_TYPES::onMoneyAdd) {
                 CallEvent(EVENT_TYPES::onMoneyAdd, String::newString(to), Number::newNumber(value));
             }
             IF_LISTENED_END(EVENT_TYPES::onMoneyAdd);
             break;
         }
-        case LLMoneyEvent::Reduce:
-        {
-            IF_LISTENED(EVENT_TYPES::onMoneyReduce)
-            {
+        case LLMoneyEvent::Reduce: {
+            IF_LISTENED(EVENT_TYPES::onMoneyReduce) {
                 CallEvent(EVENT_TYPES::onMoneyReduce, String::newString(to), Number::newNumber(value));
             }
             IF_LISTENED_END(EVENT_TYPES::onMoneyReduce);
             break;
         }
-        case LLMoneyEvent::Trans:
-        {
-            IF_LISTENED(EVENT_TYPES::onMoneyTrans)
-            {
+        case LLMoneyEvent::Trans: {
+            IF_LISTENED(EVENT_TYPES::onMoneyTrans) {
                 CallEvent(EVENT_TYPES::onMoneyTrans, String::newString(from), String::newString(to), Number::newNumber(value));
             }
             IF_LISTENED_END(EVENT_TYPES::onMoneyTrans);
             break;
         }
-        case LLMoneyEvent::Set:
-        {
-            IF_LISTENED(EVENT_TYPES::onMoneySet)
-            {
+        case LLMoneyEvent::Set: {
+            IF_LISTENED(EVENT_TYPES::onMoneySet) {
                 CallEvent(EVENT_TYPES::onMoneySet, String::newString(to), Number::newNumber(value));
             }
             IF_LISTENED_END(EVENT_TYPES::onMoneySet);
diff --git a/ScriptEngine/API/FileSystemAPI.cpp b/ScriptEngine/API/FileSystemAPI.cpp
--- a/ScriptEngine/API/FileSystemAPI.cpp
+++ b/ScriptEngine/API/FileSystemAPI.cpp
@@ -13,9 +13,10 @@ using namespace std;
 
 //////////////////// Class Definition ////////////////////
 
-enum class FileOpenMode : int
-{
-    ReadMode, WriteMode, AppendMode
+enum class FileOpenMode : int {
+    ReadMode,
+    WriteMode,
+    AppendMode
 };
 
 ClassDefine<FileClass> FileClassBuilder =
@@ -48,7 +49,7 @@ ClassDefine<FileClass> FileClassBuilder =
         .property("ReadMode", [] { return Number::newNumber((int)FileOpenMode::ReadMode); })
         .property("WriteMode", [] { return Number::newNumber((int)FileOpenMode::WriteMode); })
         .property("AppendMode", [] { return Number::newNumber((int)FileOpenMode::AppendMode); })
-    
+
         .function("readFrom", &FileClass::readFromStatic)
         .function("writeTo", &FileClass::writeToStatic)
         .function("writeLine", &FileClass::writeLineStatic)
@@ -64,7 +65,7 @@ ClassDefine<FileClass> FileClassBuilder =
         .function("getFileSize", &FileClass::getFileSize)
         .function("getFilesList", &FileClass::getFilesList)
 
-        //For Compatibility
+        // For Compatibility
         .function("open", &FileClass::open)
         .build();
 
@@ -72,23 +73,20 @@ ClassDefine<FileClass> FileClassBuilder =
 
 //生成函数
 FileClass::FileClass(const Local<Object>& scriptObj, std::fstream&& f, const std::string& path, bool isBinary)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->file = std::move(f);
     this->path = path;
     this->isBinary = isBinary;
 }
 
 FileClass::FileClass(std::fstream&& f, const std::string& path, bool isBinary)
-    :ScriptClass(ScriptClass::ConstructFromCpp<FileClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<FileClass>{}) {
     this->file = std::move(f);
     this->path = path;
     this->isBinary = isBinary;
 }
 
-FileClass* FileClass::constructor(const Arguments& args)
-{
+FileClass* FileClass::constructor(const Arguments& args) {
     CHECK_ARGS_COUNT_C(args, 2);
     CHECK_ARG_TYPE_C(args[0], ValueKind::kString);
     CHECK_ARG_TYPE_C(args[1], ValueKind::kNumber);
@@ -101,42 +99,34 @@ FileClass* FileClass::constructor(const Arguments& args)
 
         FileOpenMode fMode = (FileOpenMode)(args[1].toInt());
         // Auto Create
-        if (fMode == FileOpenMode::ReadMode || fMode == FileOpenMode::WriteMode)
-        {
+        if (fMode == FileOpenMode::ReadMode || fMode == FileOpenMode::WriteMode) {
             fstream tmp(path, ios_base::app);
             tmp.flush();
             tmp.close();
         }
 
         ios_base::openmode mode = ios_base::in;
-        if (fMode == FileOpenMode::WriteMode)
-        {
+        if (fMode == FileOpenMode::WriteMode) {
             mode |= ios_base::out;
-            //mode |= ios_base::ate;
+            // mode |= ios_base::ate;
             mode |= ios_base::trunc;
-        }
-        else if (fMode == FileOpenMode::AppendMode)
-        {
+        } else if (fMode == FileOpenMode::AppendMode) {
             mode |= ios_base::app;
         }
 
         bool isBinary = false;
-        if (args.size() >= 3 && args[2].asBoolean().value())
-        {
+        if (args.size() >= 3 && args[2].asBoolean().value()) {
             isBinary = true;
             mode |= ios_base::binary;
         }
 
         fstream fs(path, mode);
-        if (!fs.is_open())
-        {
+        if (!fs.is_open()) {
             LOG_ERROR_WITH_SCRIPT_INFO("Fail to Open File " + path + "!\n");
             return nullptr;
         }
         return new FileClass(args.thiz(), std::move(fs), path, isBinary);
-    }
-    catch (const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Open File " + args[0].asString().toString() + "!\n");
         return nullptr;
     }
@@ -144,24 +134,21 @@ FileClass* FileClass::constructor(const Arguments& args)
 }
 
 //成员函数
-Local<Value> FileClass::getPath()
-{
+Local<Value> FileClass::getPath() {
     try {
         return String::newString(path);
     }
     CATCH("Fail in getPath!");
 }
 
-Local<Value> FileClass::getAbsolutePath()
-{
+Local<Value> FileClass::getAbsolutePath() {
     try {
         return String::newString(canonical(filesystem::path(str2wstr(path))).u8string());
     }
     CATCH("Fail in getAbsolutePath!");
 }
 
-Local<Value> FileClass::getSize()
-{
+Local<Value> FileClass::getSize() {
     try {
         size_t cur = file.tellg();
         file.seekg(0, file.end);
@@ -173,8 +160,7 @@ Local<Value> FileClass::getSize()
     CATCH("Fail in getPath!");
 }
 
-Local<Value> FileClass::readSync(const Arguments& args)
-{
+Local<Value> FileClass::readSync(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -184,15 +170,14 @@ Local<Value> FileClass::readSync(const Arguments& args)
         file.read(buf, cnt);
         size_t bytes = file.gcount();
 
-        Local<Value> res = isBinary ? ByteBuffer::newByteBuffer(buf, bytes).asValue() : String::newString(string_view(buf,bytes)).asValue();
+        Local<Value> res = isBinary ? ByteBuffer::newByteBuffer(buf, bytes).asValue() : String::newString(string_view(buf, bytes)).asValue();
         delete[] buf;
         return res;
     }
     CATCH("Fail in readSync!");
 }
 
-Local<Value> FileClass::readLineSync(const Arguments& args)
-{
+Local<Value> FileClass::readLineSync(const Arguments& args) {
     try {
         string buf;
         getline(file, buf);
@@ -201,8 +186,7 @@ Local<Value> FileClass::readLineSync(const Arguments& args)
     CATCH("Fail in readLineSync!");
 }
 
-Local<Value> FileClass::readAllSync(const Arguments& args)
-{
+Local<Value> FileClass::readAllSync(const Arguments& args) {
     try {
         string res((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
         return isBinary ? ByteBuffer::newByteBuffer(res.data(), res.size()).asValue() : String::newString(res).asValue();
@@ -210,21 +194,15 @@ Local<Value> FileClass::readAllSync(const Arguments& args)
     CATCH("Fail in readAllSync!");
 }
 
-Local<Value> FileClass::writeSync(const Arguments& args)
-{
+Local<Value> FileClass::writeSync(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
-        if (args[0].isString())
-        {
+        if (args[0].isString()) {
             file << args[0].toStr();
-        }
-        else if (args[0].isByteBuffer())
-        {
+        } else if (args[0].isByteBuffer()) {
             file.write((char*)args[0].asByteBuffer().getRawBytes(), args[0].asByteBuffer().byteLength());
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -233,8 +211,7 @@ Local<Value> FileClass::writeSync(const Arguments& args)
     CATCH("Fail in writeSync!");
 }
 
-Local<Value> FileClass::writeLineSync(const Arguments& args)
-{
+Local<Value> FileClass::writeLineSync(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -245,19 +222,17 @@ Local<Value> FileClass::writeLineSync(const Arguments& args)
     CATCH("Fail in writeLineSync!");
 }
 
-Local<Value> FileClass::read(const Arguments& args)
-{
+Local<Value> FileClass::read(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
     try {
         int cnt = args[0].toInt();
-        script::Global<Function> callbackFunc{ args[1].asFunction() };
+        script::Global<Function> callbackFunc{args[1].asFunction()};
 
-        pool.enqueue([cnt, fp{ &file }, isBinary { isBinary }, lock { &lock },
-            callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }] ()
-        {
+        pool.enqueue([cnt, fp{&file}, isBinary{isBinary}, lock{&lock},
+                      callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}]() {
             if (LL::isServerStopping())
                 return;
             if (!EngineManager::isValid(engine))
@@ -270,12 +245,11 @@ Local<Value> FileClass::read(const Arguments& args)
             lock->unlock();
 
             EngineScope scope(engine);
-            try
-            {
+            try {
                 Local<Value> res = isBinary ? ByteBuffer::newByteBuffer(buf, bytes).asValue() : String::newString(string_view(buf, bytes)).asValue();
                 delete[] buf;
                 // dangerous
-                NewTimeout(callback.get(), { res }, 1);
+                NewTimeout(callback.get(), {res}, 1);
             }
             CATCH_IN_CALLBACK("ReadFile")
         });
@@ -284,17 +258,15 @@ Local<Value> FileClass::read(const Arguments& args)
     CATCH("Fail in read!");
 }
 
-Local<Value> FileClass::readLine(const Arguments& args)
-{
+Local<Value> FileClass::readLine(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
-        script::Global<Function> callbackFunc{ args[0].asFunction() };
+        script::Global<Function> callbackFunc{args[0].asFunction()};
 
-        pool.enqueue([fp{ &file }, lock{ &lock },
-            callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }] ()
-        {
+        pool.enqueue([fp{&file}, lock{&lock},
+                      callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}]() {
             if (LL::isServerStopping())
                 return;
             if (!EngineManager::isValid(engine))
@@ -306,9 +278,8 @@ Local<Value> FileClass::readLine(const Arguments& args)
             lock->unlock();
 
             EngineScope scope(engine);
-            try
-            {
-                NewTimeout(callback.get(), { String::newString(buf) }, 1);
+            try {
+                NewTimeout(callback.get(), {String::newString(buf)}, 1);
             }
             CATCH_IN_CALLBACK("FileReadLine")
         });
@@ -317,17 +288,15 @@ Local<Value> FileClass::readLine(const Arguments& args)
     CATCH("Fail in readLine!");
 }
 
-Local<Value> FileClass::readAll(const Arguments& args)
-{
+Local<Value> FileClass::readAll(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
-        script::Global<Function> callbackFunc{ args[0].asFunction() };
+        script::Global<Function> callbackFunc{args[0].asFunction()};
 
-        pool.enqueue([fp{ &file }, isBinary{ isBinary }, lock{ &lock },
-            callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }]()
-        {
+        pool.enqueue([fp{&file}, isBinary{isBinary}, lock{&lock},
+                      callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}]() {
             if (LL::isServerStopping())
                 return;
             if (!EngineManager::isValid(engine))
@@ -338,10 +307,9 @@ Local<Value> FileClass::readAll(const Arguments& args)
             lock->unlock();
 
             EngineScope scope(engine);
-            try
-            {
+            try {
                 Local<Value> readed = isBinary ? ByteBuffer::newByteBuffer(res.data(), res.size()).asValue() : String::newString(res).asValue();
-                NewTimeout(callback.get(), { readed }, 1);
+                NewTimeout(callback.get(), {readed}, 1);
             }
             CATCH_IN_CALLBACK("FileReadAll")
         });
@@ -350,37 +318,30 @@ Local<Value> FileClass::readAll(const Arguments& args)
     CATCH("Fail in readAll!");
 }
 
-Local<Value> FileClass::write(const Arguments& args)
-{
+Local<Value> FileClass::write(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
-    
+
     try {
         string data;
         bool isString = true;
-        if (args[0].isString())
-        {
+        if (args[0].isString()) {
             data = std::move(args[0].toStr());
-        }
-        else if (args[0].isByteBuffer())
-        {
+        } else if (args[0].isByteBuffer()) {
             isString = false;
             data = std::move(string((char*)args[0].asByteBuffer().getRawBytes(), args[0].asByteBuffer().byteLength()));
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
 
         script::Global<Function> callbackFunc;
-        if (args.size() >= 2) 
+        if (args.size() >= 2)
             callbackFunc = args[1].asFunction();
 
-        pool.enqueue([fp{ &file }, lock{ &lock }, data{ std::move(data) }, isString, 
-            callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }]()
-        {
+        pool.enqueue([fp{&file}, lock{&lock}, data{std::move(data)}, isString,
+                      callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}]() {
             if (LL::isServerStopping())
                 return;
             if (!EngineManager::isValid(engine))
@@ -394,12 +355,10 @@ Local<Value> FileClass::write(const Arguments& args)
             bool isOk = !fp->fail() && !fp->bad();
             lock->unlock();
 
-            if (!callback.isEmpty())
-            {
+            if (!callback.isEmpty()) {
                 EngineScope scope(engine);
-                try
-                {
-                    NewTimeout(callback.get(), { Boolean::newBoolean(isOk) }, 1);
+                try {
+                    NewTimeout(callback.get(), {Boolean::newBoolean(isOk)}, 1);
                 }
                 CATCH_IN_CALLBACK("WriteFile")
             }
@@ -409,23 +368,21 @@ Local<Value> FileClass::write(const Arguments& args)
     CATCH("Fail in write!");
 }
 
-Local<Value> FileClass::writeLine(const Arguments& args)
-{
+Local<Value> FileClass::writeLine(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
     try {
-        string data{ std::move(args[0].toStr()) };
+        string data{std::move(args[0].toStr())};
 
         script::Global<Function> callbackFunc;
         if (args.size() >= 2)
             callbackFunc = args[1].asFunction();
 
-        pool.enqueue([fp{ &file }, lock{ &lock }, data{ std::move(data) }, 
-            callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }]()
-        {
+        pool.enqueue([fp{&file}, lock{&lock}, data{std::move(data)},
+                      callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}]() {
             if (LL::isServerStopping())
                 return;
             if (!EngineManager::isValid(engine))
@@ -436,12 +393,10 @@ Local<Value> FileClass::writeLine(const Arguments& args)
             bool isOk = !fp->fail() && !fp->bad();
             lock->unlock();
 
-            if (!callback.isEmpty())
-            {
+            if (!callback.isEmpty()) {
                 EngineScope scope(engine);
-                try
-                {
-                    NewTimeout(callback.get(), { Boolean::newBoolean(isOk) }, 1);
+                try {
+                    NewTimeout(callback.get(), {Boolean::newBoolean(isOk)}, 1);
                 }
                 CATCH_IN_CALLBACK("FileWriteLine")
             }
@@ -451,32 +406,25 @@ Local<Value> FileClass::writeLine(const Arguments& args)
     CATCH("Fail in writeLine!");
 }
 
-Local<Value> FileClass::seekTo(const Arguments& args)
-{
+Local<Value> FileClass::seekTo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kBoolean);
 
     try {
         int pos = args[0].toInt();
-        if (args[1].asBoolean().value())
-        {
-            //relative
+        if (args[1].asBoolean().value()) {
+            // relative
             ios_base::seekdir way = ios_base::cur;
             file.seekg(pos, way);
             file.seekp(pos, way);
-        }
-        else
-        {
-            //absolute
-            if (pos >= 0)
-            {
+        } else {
+            // absolute
+            if (pos >= 0) {
                 ios_base::seekdir way = ios_base::beg;
                 file.seekg(pos, way);
                 file.seekp(pos, way);
-            }
-            else
-            {
+            } else {
                 ios_base::seekdir way = ios_base::end;
                 file.seekg(0, way);
                 file.seekp(0, way);
@@ -487,8 +435,7 @@ Local<Value> FileClass::seekTo(const Arguments& args)
     CATCH("Fail in seekTo!");
 }
 
-Local<Value> FileClass::setSize(const Arguments& args)
-{
+Local<Value> FileClass::setSize(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -498,8 +445,7 @@ Local<Value> FileClass::setSize(const Arguments& args)
     CATCH("Fail in setSize!");
 }
 
-Local<Value> FileClass::close(const Arguments& args)
-{
+Local<Value> FileClass::close(const Arguments& args) {
     try {
         file.close();
         return Boolean::newBoolean(true);
@@ -507,19 +453,16 @@ Local<Value> FileClass::close(const Arguments& args)
     CATCH("Fail in flush!");
 }
 
-Local<Value> FileClass::isEOF(const Arguments& args)
-{
+Local<Value> FileClass::isEOF(const Arguments& args) {
     try {
         return Boolean::newBoolean(file.eof());
     }
     CATCH("Fail in isEOF!");
 }
 
-Local<Value> FileClass::flush(const Arguments& args)
-{
+Local<Value> FileClass::flush(const Arguments& args) {
     try {
-        pool.enqueue([fp{ &file }, lock{ &lock }]()
-        {
+        pool.enqueue([fp{&file}, lock{&lock}]() {
             lock->lock();
             fp->flush();
             lock->unlock();
@@ -529,8 +472,7 @@ Local<Value> FileClass::flush(const Arguments& args)
     CATCH("Fail in flush!");
 }
 
-Local<Value> FileClass::errorCode(const Arguments& args)
-{
+Local<Value> FileClass::errorCode(const Arguments& args) {
     try {
         file.flush();
         return Number::newNumber(errno);
@@ -538,8 +480,7 @@ Local<Value> FileClass::errorCode(const Arguments& args)
     CATCH("Fail in flush!");
 }
 
-Local<Value> FileClass::clear(const Arguments& args)
-{
+Local<Value> FileClass::clear(const Arguments& args) {
     try {
         file.clear();
         return Boolean::newBoolean(true);
@@ -550,111 +491,92 @@ Local<Value> FileClass::clear(const Arguments& args)
 
 //////////////////// APIs ////////////////////
 
-Local<Value> DirCreate(const Arguments& args)
-{
+Local<Value> DirCreate(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try{
+    try {
         return Boolean::newBoolean(CreateDirs(args[0].toStr()));
-    }
-    catch(const filesystem_error& e)
-    {
-        LOG_ERROR_WITH_SCRIPT_INFO("Fail to Create Dir "+ args[0].asString().toString() +"!\n");
+    } catch (const filesystem_error& e) {
+        LOG_ERROR_WITH_SCRIPT_INFO("Fail to Create Dir " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in CreateDir!");
 }
 
-Local<Value> PathDelete(const Arguments& args)
-{
+Local<Value> PathDelete(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try{
+    try {
         return Boolean::newBoolean(remove_all(args[0].asString().toString()) > 0);
-    }
-    catch(const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Delete " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in DeletePath!");
 }
 
-Local<Value> PathExists(const Arguments& args)
-{
+Local<Value> PathExists(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try{
+    try {
         return Boolean::newBoolean(filesystem::exists(str2wstr(args[0].asString().toString())));
-    }
-    catch(const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Check " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in ExistsPath!");
 }
 
-Local<Value> PathCopy(const Arguments& args)
-{
+Local<Value> PathCopy(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try{
-        copy(args[0].asString().toString(),args[1].asString().toString());
+    try {
+        copy(args[0].asString().toString(), args[1].asString().toString());
         return Boolean::newBoolean(true);
-    }
-    catch(const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Copy " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in CopyPath!");
 }
 
-Local<Value> PathRename(const Arguments& args)
-{
+Local<Value> PathRename(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try{
-        rename(args[0].asString().toString(),args[1].asString().toString());
+    try {
+        rename(args[0].asString().toString(), args[1].asString().toString());
         return Boolean::newBoolean(true);
-    }
-    catch(const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Rename " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in RenamePath!");
 }
 
-Local<Value> PathMove(const Arguments& args)
-{
+Local<Value> PathMove(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try{
-        copy(args[0].asString().toString(),args[1].asString().toString());
+    try {
+        copy(args[0].asString().toString(), args[1].asString().toString());
         remove_all(args[0].asString().toString());
         return Boolean::newBoolean(true);
-    }
-    catch(const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Move " + args[0].asString().toString() + "!\n");
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in MovePath!");
 }
 
-Local<Value> CheckIsDir(const Arguments& args)
-{
+Local<Value> CheckIsDir(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -664,17 +586,14 @@ Local<Value> CheckIsDir(const Arguments& args)
             return Boolean::newBoolean(false);
 
         return Boolean::newBoolean(directory_entry(p).is_directory());
-    }
-    catch (const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Get Type of " + args[0].asString().toString() + "!\n");
         return Local<Value>();
     }
     CATCH("Fail in GetFilesList!");
 }
 
-Local<Value> GetFileSize(const Arguments& args)
-{
+Local<Value> GetFileSize(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -682,22 +601,19 @@ Local<Value> GetFileSize(const Arguments& args)
         path p(args[0].toStr());
         if (!exists(p))
             return Number::newNumber(0);
-        if(directory_entry(p).is_directory())
+        if (directory_entry(p).is_directory())
             return Number::newNumber(0);
 
         auto sz = file_size(p);
         return Number::newNumber((int64_t)sz);
-    }
-    catch (const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Get Size of " + args[0].asString().toString() + "!\n");
         return Local<Value>();
     }
     CATCH("Fail in GetFilesList!");
 }
 
-Local<Value> GetFilesList(const Arguments& args)
-{
+Local<Value> GetFilesList(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -712,27 +628,25 @@ Local<Value> GetFilesList(const Arguments& args)
     CATCH("Fail in GetFilesList!");
 }
 
-Local<Value> FileReadFrom(const Arguments& args)
-{
+Local<Value> FileReadFrom(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    
-    try{
+
+    try {
         auto content = ReadAllFile(args[0].toStr());
-        if(!content)
-            return Local<Value>();  //Null
+        if (!content)
+            return Local<Value>(); // Null
         return String::newString(*content);
     }
     CATCH("Fail in FileReadAll!");
 }
 
-Local<Value> FileWriteTo(const Arguments& args)
-{
+Local<Value> FileWriteTo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
-    
-    try{
+
+    try {
         string path = args[0].toStr();
         CreateDirs(path);
         return Boolean::newBoolean(WriteAllFile(path, args[1].toStr(), false));
@@ -740,18 +654,17 @@ Local<Value> FileWriteTo(const Arguments& args)
     CATCH("Fail in FileWriteAll!");
 }
 
-Local<Value> FileWriteLine(const Arguments& args)
-{
+Local<Value> FileWriteLine(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
-    
-    try{
+
+    try {
         string path = args[0].toStr();
         CreateDirs(path);
 
-        std::ofstream fileWrite(path,std::ios::app);
-        if(!fileWrite)
+        std::ofstream fileWrite(path, std::ios::app);
+        if (!fileWrite)
             return Boolean::newBoolean(false);
         fileWrite << args[1].toStr() << std::endl;
         return Boolean::newBoolean(fileWrite.good());
@@ -762,8 +675,7 @@ Local<Value> FileWriteLine(const Arguments& args)
 
 //////////////////// For Compatibility ////////////////////
 
-Local<Value> OpenFile(const Arguments& args)
-{
+Local<Value> OpenFile(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -776,41 +688,34 @@ Local<Value> OpenFile(const Arguments& args)
 
         FileOpenMode fMode = (FileOpenMode)(args[1].toInt());
         ios_base::openmode mode = ios_base::in;
-        if (fMode == FileOpenMode::WriteMode)
-        {
+        if (fMode == FileOpenMode::WriteMode) {
             fstream tmp(path, ios_base::app);
             tmp.flush();
             tmp.close();
             mode |= ios_base::out;
-        }
-        else if (fMode == FileOpenMode::AppendMode)
+        } else if (fMode == FileOpenMode::AppendMode)
             mode |= ios_base::app;
 
         bool isBinary = false;
-        if (args.size() >= 3 && args[2].asBoolean().value())
-        {
+        if (args.size() >= 3 && args[2].asBoolean().value()) {
             isBinary = true;
             mode |= ios_base::binary;
         }
 
         fstream fs(path, mode);
-        if (!fs.is_open())
-        {
+        if (!fs.is_open()) {
             LOG_ERROR_WITH_SCRIPT_INFO("Fail to Open File " + path + "!\n");
             return Local<Value>();
         }
         return FileClass::newFile(std::move(fs), path, isBinary);
-    }
-    catch (const filesystem_error& e)
-    {
+    } catch (const filesystem_error& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Fail to Open File " + args[0].asString().toString() + "!\n");
         return Local<Value>();
     }
     CATCH("Fail in OpenFile!");
 }
 
-Local<Object> FileClass::newFile(std::fstream&& f, const std::string& path, bool isBinary)
-{
+Local<Object> FileClass::newFile(std::fstream&& f, const std::string& path, bool isBinary) {
     auto newp = new FileClass(std::move(f), path, isBinary);
     return newp->getScriptObject();
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/FileSystemAPI.h b/ScriptEngine/API/FileSystemAPI.h
--- a/ScriptEngine/API/FileSystemAPI.h
+++ b/ScriptEngine/API/FileSystemAPI.h
@@ -25,8 +25,7 @@ Local<Value> GetFilesList(const Arguments& args);
 
 
 //////////////////// Classes ////////////////////
-class FileClass : public ScriptClass
-{
+class FileClass : public ScriptClass {
 private:
     std::fstream file;
     string path;
@@ -41,7 +40,7 @@ class FileClass : public ScriptClass
     Local<Value> getPath();
     Local<Value> getAbsolutePath();
     Local<Value> getSize();
-    
+
     Local<Value> readSync(const Arguments& args);
     Local<Value> readLineSync(const Arguments& args);
     Local<Value> readAllSync(const Arguments& args);
@@ -62,22 +61,48 @@ class FileClass : public ScriptClass
     Local<Value> errorCode(const Arguments& args);
     Local<Value> clear(const Arguments& args);
 
-    static Local<Value> readFromStatic(const Arguments& args) { return FileReadFrom(args); }
-    static Local<Value> writeToStatic(const Arguments& args) { return FileWriteTo(args); }
-    static Local<Value> writeLineStatic(const Arguments& args) { return FileWriteLine(args); }
+    static Local<Value> readFromStatic(const Arguments& args) {
+        return FileReadFrom(args);
+    }
+    static Local<Value> writeToStatic(const Arguments& args) {
+        return FileWriteTo(args);
+    }
+    static Local<Value> writeLineStatic(const Arguments& args) {
+        return FileWriteLine(args);
+    }
 
-    static Local<Value> createDir(const Arguments& args) { return DirCreate(args); }
-    static Local<Value> copy(const Arguments& args) { return PathCopy(args); }
-    static Local<Value> move(const Arguments& args) { return PathMove(args); }
-    static Local<Value> rename(const Arguments& args) { return PathRename(args); }
-    static Local<Value> del(const Arguments& args) { return PathDelete(args); }
-    static Local<Value> exists(const Arguments& args) { return PathExists(args); }
-    static Local<Value> checkIsDir(const Arguments& args) { return CheckIsDir(args); }
-    static Local<Value> getFileSize(const Arguments& args) { return GetFileSize(args); }
-    static Local<Value> getFilesList(const Arguments& args) { return GetFilesList(args); }
+    static Local<Value> createDir(const Arguments& args) {
+        return DirCreate(args);
+    }
+    static Local<Value> copy(const Arguments& args) {
+        return PathCopy(args);
+    }
+    static Local<Value> move(const Arguments& args) {
+        return PathMove(args);
+    }
+    static Local<Value> rename(const Arguments& args) {
+        return PathRename(args);
+    }
+    static Local<Value> del(const Arguments& args) {
+        return PathDelete(args);
+    }
+    static Local<Value> exists(const Arguments& args) {
+        return PathExists(args);
+    }
+    static Local<Value> checkIsDir(const Arguments& args) {
+        return CheckIsDir(args);
+    }
+    static Local<Value> getFileSize(const Arguments& args) {
+        return GetFileSize(args);
+    }
+    static Local<Value> getFilesList(const Arguments& args) {
+        return GetFilesList(args);
+    }
 
-    //For Compatibility
+    // For Compatibility
     static Local<Object> newFile(std::fstream&& f, const std::string& path, bool isBinary);
-    static Local<Value> open(const Arguments& args) { return OpenFile(args); }
+    static Local<Value> open(const Arguments& args) {
+        return OpenFile(args);
+    }
 };
 extern ClassDefine<FileClass> FileClassBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/GameUtilsAPI.cpp b/ScriptEngine/API/GameUtilsAPI.cpp
--- a/ScriptEngine/API/GameUtilsAPI.cpp
+++ b/ScriptEngine/API/GameUtilsAPI.cpp
@@ -4,28 +4,28 @@
 using namespace std;
 
 ClassDefine<void> TextClassBuilder =
-	defineClass("Format")
-		.property("Black",		[]() { return String::newString("§0"); })
-		.property("DarkBlue",	[]() { return String::newString("§1"); })
-		.property("DarkGreen",	[]() { return String::newString("§2"); })
-		.property("DarkAqua",	[]() { return String::newString("§3"); })
-		.property("DarkRed",	[]() { return String::newString("§4"); })
-		.property("DarkPurple", []() { return String::newString("§5"); })
-		.property("Gold",		[]() { return String::newString("§6"); })
-		.property("Gray",		[]() { return String::newString("§7"); })
-		.property("DarkGray",	[]() { return String::newString("§8"); })
-		.property("Blue",		[]() { return String::newString("§9"); })
-		.property("Green",		[]() { return String::newString("§a"); })
-		.property("Aqua",		[]() { return String::newString("§b"); })
-		.property("Red",		[]() { return String::newString("§c"); })
-		.property("LightPurple", []() { return String::newString("§d"); })
-		.property("Yellow",		[]() { return String::newString("§e"); })
-		.property("White",		[]() { return String::newString("§f"); })
-		.property("MinecoinGold", []() { return String::newString("§g"); })
-		.property("Bold",		[]() { return String::newString("§l"); })
-		.property("Italics",	[]() { return String::newString("§o"); })
-		.property("Underline",	[]() { return String::newString("§n"); })
-		.property("StrikeThrough", []() { return String::newString("§m"); })
-		.property("Random",		[]() { return String::newString("§k"); })
-		.property("Clear",		[]() { return String::newString("§r"); })
-		.build();
\ No newline at end of file
+    defineClass("Format")
+        .property("Black", []() { return String::newString("§0"); })
+        .property("DarkBlue", []() { return String::newString("§1"); })
+        .property("DarkGreen", []() { return String::newString("§2"); })
+        .property("DarkAqua", []() { return String::newString("§3"); })
+        .property("DarkRed", []() { return String::newString("§4"); })
+        .property("DarkPurple", []() { return String::newString("§5"); })
+        .property("Gold", []() { return String::newString("§6"); })
+        .property("Gray", []() { return String::newString("§7"); })
+        .property("DarkGray", []() { return String::newString("§8"); })
+        .property("Blue", []() { return String::newString("§9"); })
+        .property("Green", []() { return String::newString("§a"); })
+        .property("Aqua", []() { return String::newString("§b"); })
+        .property("Red", []() { return String::newString("§c"); })
+        .property("LightPurple", []() { return String::newString("§d"); })
+        .property("Yellow", []() { return String::newString("§e"); })
+        .property("White", []() { return String::newString("§f"); })
+        .property("MinecoinGold", []() { return String::newString("§g"); })
+        .property("Bold", []() { return String::newString("§l"); })
+        .property("Italics", []() { return String::newString("§o"); })
+        .property("Underline", []() { return String::newString("§n"); })
+        .property("StrikeThrough", []() { return String::newString("§m"); })
+        .property("Random", []() { return String::newString("§k"); })
+        .property("Clear", []() { return String::newString("§r"); })
+        .build();
\ No newline at end of file
diff --git a/ScriptEngine/API/GuiAPI.cpp b/ScriptEngine/API/GuiAPI.cpp
--- a/ScriptEngine/API/GuiAPI.cpp
+++ b/ScriptEngine/API/GuiAPI.cpp
@@ -38,80 +38,69 @@ ClassDefine<CustomFormClass> CustomFormClassBuilder =
 //////////////////// Simple Form ////////////////////
 
 SimpleFormClass::SimpleFormClass()
-    :ScriptClass(ScriptClass::ConstructFromCpp<SimpleFormClass>{}),form("","")
-{ }
+: ScriptClass(ScriptClass::ConstructFromCpp<SimpleFormClass>{}), form("", "") {
+}
 
 //生成函数
-Local<Object> SimpleFormClass::newForm()
-{
+Local<Object> SimpleFormClass::newForm() {
     auto newp = new SimpleFormClass();
     return newp->getScriptObject();
 }
 
-Form::SimpleForm* SimpleFormClass::extract(Local<Value> v)
-{
+Form::SimpleForm* SimpleFormClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<SimpleFormClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<SimpleFormClass>(v)->get();
     else
         return nullptr;
 }
 
-bool SimpleFormClass::sendForm(Form::SimpleForm* form, Player* player, script::Local<Function> &callback)
-{
-    script::Global<Function> callbackFunc{ callback };
+bool SimpleFormClass::sendForm(Form::SimpleForm* form, Player* player, script::Local<Function>& callback) {
+    script::Global<Function> callbackFunc{callback};
 
     return form->sendTo(player,
-        [engine{ EngineScope::currentEngine() }, callback{ std::move(callbackFunc) }]
-        (Player* pl, int chosen)
-        {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-            if (callback.isEmpty())
-                return;
-
-            EngineScope scope(engine);
-            try
-            {
-                if(chosen < 0)
-                    callback.get().call({}, PlayerClass::newPlayer(pl), Local<Value>());
-                else
-                    callback.get().call({}, PlayerClass::newPlayer(pl), Number::newNumber(chosen));
-            }
-            CATCH_WITHOUT_RETURN("Fail in form callback!")
-        });
+                        [engine{EngineScope::currentEngine()}, callback{std::move(callbackFunc)}](Player* pl, int chosen) {
+                            if (LL::isServerStopping())
+                                return;
+                            if (!EngineManager::isValid(engine))
+                                return;
+                            if (callback.isEmpty())
+                                return;
+
+                            EngineScope scope(engine);
+                            try {
+                                if (chosen < 0)
+                                    callback.get().call({}, PlayerClass::newPlayer(pl), Local<Value>());
+                                else
+                                    callback.get().call({}, PlayerClass::newPlayer(pl), Number::newNumber(chosen));
+                            }
+                            CATCH_WITHOUT_RETURN("Fail in form callback!")
+                        });
 }
 
 //成员函数
-Local<Value> SimpleFormClass::setTitle(const Arguments& args)
-{
+Local<Value> SimpleFormClass::setTitle(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         form.title = args[0].toStr();
         return this->getScriptObject();
     }
     CATCH("Fail in setTitle!")
 }
 
-Local<Value> SimpleFormClass::setContent(const Arguments& args)
-{
+Local<Value> SimpleFormClass::setContent(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         form.content = args[0].toStr();
         return this->getScriptObject();
     }
     CATCH("Fail in setTitle!")
 }
 
-Local<Value> SimpleFormClass::addButton(const Arguments& args)
-{
+Local<Value> SimpleFormClass::addButton(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     if (args.size() >= 2)
@@ -126,179 +115,165 @@ Local<Value> SimpleFormClass::addButton(const Arguments& args)
 }
 
 
-
 //////////////////// Custom Form ////////////////////
 
 CustomFormClass::CustomFormClass()
-    :ScriptClass(ScriptClass::ConstructFromCpp<CustomFormClass>{}),form("")
-{ }
+: ScriptClass(ScriptClass::ConstructFromCpp<CustomFormClass>{}), form("") {
+}
 
 
 //生成函数
-Local<Object> CustomFormClass::newForm()
-{
+Local<Object> CustomFormClass::newForm() {
     auto newp = new CustomFormClass();
     return newp->getScriptObject();
 }
 
-CustomForm* CustomFormClass::extract(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<CustomFormClass>(v))
+CustomForm* CustomFormClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<CustomFormClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<CustomFormClass>(v)->get();
     else
         return nullptr;
 }
 
 //成员函数
-bool CustomFormClass::sendForm(Form::CustomForm* form, Player* player, script::Local<Function>& callback)
-{
-    script::Global<Function> callbackFunc{ callback };
+bool CustomFormClass::sendForm(Form::CustomForm* form, Player* player, script::Local<Function>& callback) {
+    script::Global<Function> callbackFunc{callback};
 
     return form->sendToForRawJson(player,
-        [engine{EngineScope::currentEngine()}, callback{std::move(callbackFunc)}]
-    (Player* pl, string data)
-    {
-        if (LL::isServerStopping())
-            return;
-        if (!EngineManager::isValid(engine))
-            return;
-        if (callback.isEmpty())
-            return;
-
-        EngineScope scope(engine);
-        try
-        {
-            callback.get().call({}, PlayerClass::newPlayer(pl), JsonToValue(data));
-        }
-        CATCH_WITHOUT_RETURN("Fail in form callback!")
-    });
+                                  [engine{EngineScope::currentEngine()}, callback{std::move(callbackFunc)}](Player* pl, string data) {
+                                      if (LL::isServerStopping())
+                                          return;
+                                      if (!EngineManager::isValid(engine))
+                                          return;
+                                      if (callback.isEmpty())
+                                          return;
+
+                                      EngineScope scope(engine);
+                                      try {
+                                          callback.get().call({}, PlayerClass::newPlayer(pl), JsonToValue(data));
+                                      }
+                                      CATCH_WITHOUT_RETURN("Fail in form callback!")
+                                  });
 }
 
-Local<Value> CustomFormClass::setTitle(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> CustomFormClass::setTitle(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try{
+    try {
         form.title = args[0].toStr();
         return this->getScriptObject();
     }
     CATCH("Fail in setTitle!")
 }
 
-Local<Value> CustomFormClass::addLabel(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> CustomFormClass::addLabel(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try{
+    try {
         form.append(Label(args[0].toStr(), args[0].toStr()));
         return this->getScriptObject();
     }
     CATCH("Fail in addLabel!")
 }
 
-Local<Value> CustomFormClass::addInput(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
-    if(args.size() >= 2)
-        CHECK_ARG_TYPE(args[1],ValueKind::kString);
-    if(args.size() >= 3)
-        CHECK_ARG_TYPE(args[2],ValueKind::kString);
+Local<Value> CustomFormClass::addInput(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    if (args.size() >= 2)
+        CHECK_ARG_TYPE(args[1], ValueKind::kString);
+    if (args.size() >= 3)
+        CHECK_ARG_TYPE(args[2], ValueKind::kString);
 
-    try{
+    try {
         string placeholder = args.size() >= 2 ? args[1].toStr() : "";
         string def = args.size() >= 3 ? args[2].toStr() : "";
-        
+
         form.append(Input(args[0].toStr(), args[0].toStr(), placeholder, def));
         return this->getScriptObject();
     }
     CATCH("Fail in addInput!")
 }
 
-Local<Value> CustomFormClass::addSwitch(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
-    if(args.size() >= 2)
-        CHECK_ARG_TYPE(args[1],ValueKind::kBoolean);
+Local<Value> CustomFormClass::addSwitch(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    if (args.size() >= 2)
+        CHECK_ARG_TYPE(args[1], ValueKind::kBoolean);
 
-    try{
+    try {
         bool def = args.size() >= 2 ? args[1].asBoolean().value() : false;
-        
+
         form.append(Toggle(args[0].toStr(), args[0].toStr(), def));
         return this->getScriptObject();
     }
     CATCH("Fail in addSwitch!")
 }
 
-Local<Value> CustomFormClass::addDropdown(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,2)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
-    CHECK_ARG_TYPE(args[1],ValueKind::kArray);
-    if(args.size() >= 3)
-        CHECK_ARG_TYPE(args[2],ValueKind::kNumber);
+Local<Value> CustomFormClass::addDropdown(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    CHECK_ARG_TYPE(args[1], ValueKind::kArray);
+    if (args.size() >= 3)
+        CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
 
-    try{
+    try {
         auto optionsArr = args[1].asArray();
         vector<string> options;
         for (int i = 0; i < optionsArr.size(); ++i)
             options.push_back(optionsArr.get(i).toStr());
 
         int def = args.size() >= 3 ? args[2].asNumber().toInt32() : 0;
-        
+
         form.append(Dropdown(args[0].toStr(), args[0].toStr(), options, def));
         return this->getScriptObject();
     }
     CATCH("Fail in addDropdown!")
 }
 
-Local<Value> CustomFormClass::addSlider(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,3)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
-    CHECK_ARG_TYPE(args[1],ValueKind::kNumber);
-    CHECK_ARG_TYPE(args[2],ValueKind::kNumber);
-    if(args.size() >= 4)
-        CHECK_ARG_TYPE(args[3],ValueKind::kNumber);
-    if(args.size() >= 5)
-        CHECK_ARG_TYPE(args[4],ValueKind::kNumber);
-
-    try{
+Local<Value> CustomFormClass::addSlider(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 3)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
+    CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
+    if (args.size() >= 4)
+        CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
+    if (args.size() >= 5)
+        CHECK_ARG_TYPE(args[4], ValueKind::kNumber);
+
+    try {
         int minValue = args[1].asNumber().toInt32();
         int maxValue = args[2].asNumber().toInt32();
-        if(minValue >= maxValue)
+        if (minValue >= maxValue)
             maxValue = minValue + 1;
-        
+
         int step = args.size() >= 4 ? args[3].asNumber().toInt32() : 1;
         int defValue = args.size() >= 5 ? args[4].asNumber().toInt32() : minValue;
         if (defValue < minValue || defValue > maxValue)
             defValue = minValue;
-        
+
         form.append(Slider(args[0].toStr(), args[0].toStr(), minValue, maxValue, step, defValue));
         return this->getScriptObject();
     }
     CATCH("Fail in addSlider!")
 }
 
-Local<Value> CustomFormClass::addStepSlider(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,2)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
-    CHECK_ARG_TYPE(args[1],ValueKind::kArray);
-    if(args.size() >= 3)
-        CHECK_ARG_TYPE(args[2],ValueKind::kNumber);
+Local<Value> CustomFormClass::addStepSlider(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    CHECK_ARG_TYPE(args[1], ValueKind::kArray);
+    if (args.size() >= 3)
+        CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
 
-    try{
+    try {
         auto stepsArr = args[1].asArray();
         vector<string> steps;
         for (int i = 0; i < stepsArr.size(); ++i)
             steps.push_back(stepsArr.get(i).toStr());
 
         int defIndex = args.size() >= 3 ? args[2].asNumber().toInt32() : 0;
-        
+
         form.append(StepSlider(args[0].toStr(), args[0].toStr(), steps, defIndex));
         return this->getScriptObject();
     }
@@ -308,12 +283,10 @@ Local<Value> CustomFormClass::addStepSlider(const Arguments& args)
 
 //////////////////// APIs ////////////////////
 
-Local<Value> McClass::newSimpleForm(const Arguments& args)
-{
+Local<Value> McClass::newSimpleForm(const Arguments& args) {
     return SimpleFormClass::newForm();
 }
 
-Local<Value> McClass::newCustomForm(const Arguments& args)
-{
+Local<Value> McClass::newCustomForm(const Arguments& args) {
     return CustomFormClass::newForm();
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/GuiAPI.h b/ScriptEngine/API/GuiAPI.h
--- a/ScriptEngine/API/GuiAPI.h
+++ b/ScriptEngine/API/GuiAPI.h
@@ -5,22 +5,20 @@
 
 //////////////////// Classes ////////////////////
 
-class SimpleFormClass : public ScriptClass
-{
+class SimpleFormClass : public ScriptClass {
 private:
     Form::SimpleForm form;
 
 public:
     SimpleFormClass();
 
-    Form::SimpleForm* get()
-    {
+    Form::SimpleForm* get() {
         return &form;
     }
-    
+
     static Local<Object> newForm();
     static Form::SimpleForm* extract(Local<Value> v);
-    static bool sendForm(Form::SimpleForm* form, Player* player, script::Local<Function> &callback);
+    static bool sendForm(Form::SimpleForm* form, Player* player, script::Local<Function>& callback);
 
     Local<Value> setTitle(const Arguments& args);
     Local<Value> setContent(const Arguments& args);
@@ -29,22 +27,20 @@ class SimpleFormClass : public ScriptClass
 extern ClassDefine<SimpleFormClass> SimpleFormClassBuilder;
 
 
-class CustomFormClass : public ScriptClass
-{
+class CustomFormClass : public ScriptClass {
 private:
     Form::CustomForm form;
 
 public:
     CustomFormClass();
 
-    Form::CustomForm* get()
-    {
+    Form::CustomForm* get() {
         return &form;
     }
 
     static Local<Object> newForm();
     static Form::CustomForm* extract(Local<Value> v);
-    static bool sendForm(Form::CustomForm* form, Player* player, script::Local<Function> &callback);
+    static bool sendForm(Form::CustomForm* form, Player* player, script::Local<Function>& callback);
 
     Local<Value> setTitle(const Arguments& args);
     Local<Value> addLabel(const Arguments& args);
diff --git a/ScriptEngine/API/ItemAPI.cpp b/ScriptEngine/API/ItemAPI.cpp
--- a/ScriptEngine/API/ItemAPI.cpp
+++ b/ScriptEngine/API/ItemAPI.cpp
@@ -32,7 +32,7 @@ ClassDefine<ItemClass> ItemClassBuilder =
         .instanceFunction("setNbt", &ItemClass::setNbt)
         .instanceFunction("getNbt", &ItemClass::getNbt)
 
-        //For Compatibility
+        // For Compatibility
         .instanceFunction("setTag", &ItemClass::setNbt)
         .instanceFunction("getTag", &ItemClass::getNbt)
         .build();
@@ -40,29 +40,25 @@ ClassDefine<ItemClass> ItemClassBuilder =
 
 //////////////////// Classes ////////////////////
 
-ItemClass::ItemClass(ItemStack *p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<ItemClass>{}),item(p)
-{
+ItemClass::ItemClass(ItemStack* p)
+: ScriptClass(ScriptClass::ConstructFromCpp<ItemClass>{}), item(p) {
     preloadData();
 }
 
 //生成函数
-Local<Object> ItemClass::newItem(ItemStack *p)
-{
+Local<Object> ItemClass::newItem(ItemStack* p) {
     auto newp = new ItemClass(p);
     return newp->getScriptObject();
 }
-ItemStack* ItemClass::extract(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<ItemClass>(v))
+ItemStack* ItemClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<ItemClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<ItemClass>(v)->get();
     else
         return nullptr;
 }
 
 //成员函数
-void ItemClass::preloadData()
-{
+void ItemClass::preloadData() {
     name = item->getCustomName();
     if (name.empty())
         name = item->getName();
@@ -73,26 +69,23 @@ void ItemClass::preloadData()
     aux = item->getAux();
 }
 
-Local<Value> ItemClass::getName()
-{ 
-    try{
+Local<Value> ItemClass::getName() {
+    try {
         //已预加载
         return String::newString(name);
     }
     CATCH("Fail in GetItemName!");
 }
 
-Local<Value> ItemClass::getType()
-{
-    try{
+Local<Value> ItemClass::getType() {
+    try {
         //已预加载
         return String::newString(type);
     }
     CATCH("Fail in GetType!");
 }
 
-Local<Value> ItemClass::getId()
-{
+Local<Value> ItemClass::getId() {
     try {
         //已预加载
         return Number::newNumber(id);
@@ -100,68 +93,61 @@ Local<Value> ItemClass::getId()
     CATCH("Fail in GetType!");
 }
 
-Local<Value> ItemClass::getCount()
-{
-    try{
+Local<Value> ItemClass::getCount() {
+    try {
         //已预加载
         return Number::newNumber(count);
     }
     CATCH("Fail in GetCount!");
 }
 
-Local<Value> ItemClass::getAux()
-{
-    try{
+Local<Value> ItemClass::getAux() {
+    try {
         //已预加载
         return Number::newNumber(aux);
     }
     CATCH("Fail in GetAux!");
 }
 
-Local<Value> ItemClass::getRawPtr(const Arguments& args)
-{
+Local<Value> ItemClass::getRawPtr(const Arguments& args) {
     try {
         return Number::newNumber((intptr_t)item);
     }
     CATCH("Fail in getRawPtr!");
 }
 
-Local<Value> ItemClass::set(const Arguments& args)
-{
+Local<Value> ItemClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         auto itemNew = ItemClass::extract(args[0]);
         if (!itemNew)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
 
         return Boolean::newBoolean(item->setItem(itemNew));
     }
     CATCH("Fail in set!");
 }
 
-Local<Value> ItemClass::clone(const Arguments& args)
-{
+Local<Value> ItemClass::clone(const Arguments& args) {
     try {
         auto item = get();
         if (!item)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
 
         return ItemClass::newItem(item->clone_s());
     }
     CATCH("Fail in cloneItem!");
 }
 
-Local<Value> ItemClass::isNull(const Arguments& args)
-{
-    try{
+Local<Value> ItemClass::isNull(const Arguments& args) {
+    try {
         return Boolean::newBoolean(item->isNull());
     }
     CATCH("Fail in isNull!");
 }
 
-Local<Value> ItemClass::setNull(const Arguments& args)
-{
+Local<Value> ItemClass::setNull(const Arguments& args) {
     try {
         item->setNull();
         return Boolean::newBoolean(true);
@@ -169,8 +155,7 @@ Local<Value> ItemClass::setNull(const Arguments& args)
     CATCH("Fail in setNull!");
 }
 
-Local<Value> ItemClass::setAux(const Arguments& args)
-{
+Local<Value> ItemClass::setAux(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -181,45 +166,41 @@ Local<Value> ItemClass::setAux(const Arguments& args)
     CATCH("Fail in setAux!");
 }
 
-Local<Value> ItemClass::setLore(const Arguments& args)
-{
+Local<Value> ItemClass::setLore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kArray);
 
-    try{
+    try {
         auto arr = args[0].asArray();
         std::vector<std::string> lores;
-        for(int i=0;i<arr.size();++i)
-        {
+        for (int i = 0; i < arr.size(); ++i) {
             auto value = arr.get(i);
-            if(value.getKind() == ValueKind::kString)
+            if (value.getKind() == ValueKind::kString)
                 lores.push_back(value.asString().toString());
         }
-        if(lores.empty())
+        if (lores.empty())
             return Boolean::newBoolean(false);
-        
+
         item->setLore(lores);
         return Boolean::newBoolean(true);
     }
     CATCH("Fail in SetLore!");
 }
 
-Local<Value> ItemClass::getNbt(const Arguments& args)
-{
+Local<Value> ItemClass::getNbt(const Arguments& args) {
     try {
         return NbtCompoundClass::pack(std::move(item->getNbt()));
     }
     CATCH("Fail in getNbt!");
 }
 
-Local<Value> ItemClass::setNbt(const Arguments& args)
-{
+Local<Value> ItemClass::setNbt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         auto nbt = NbtCompoundClass::extract(args[0]);
         if (!nbt)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
         auto item = get();
         item->setNbt(nbt);
         // update Pre Data
@@ -229,44 +210,34 @@ Local<Value> ItemClass::setNbt(const Arguments& args)
     CATCH("Fail in setNbt!");
 }
 
-Local<Value> McClass::newItem(const Arguments& args)
-{
+Local<Value> McClass::newItem(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
-        if (args[0].isString())
-        {
-            //name & count
-            if (args.size() >= 2 && args[1].isNumber())
-            {
+        if (args[0].isString()) {
+            // name & count
+            if (args.size() >= 2 && args[1].isNumber()) {
                 string type = args[0].toStr();
                 int cnt = args[1].toInt();
 
-                ItemStack* item = ItemStack::create(type,cnt);
+                ItemStack* item = ItemStack::create(type, cnt);
                 if (!item)
-                    return Local<Value>();    //Null
+                    return Local<Value>(); // Null
                 else
                     return ItemClass::newItem(item);
-            }
-            else
-            {
+            } else {
                 LOG_TOO_FEW_ARGS();
                 return Local<Value>();
             }
-        }
-        else
-        {
+        } else {
             CompoundTag* nbt = (CompoundTag*)NbtCompoundClass::extract(args[0]);
-            if (nbt)
-            {
+            if (nbt) {
                 ItemStack* item = ItemStack::create(nbt->clone());
                 if (!item)
-                    return Local<Value>();    //Null
+                    return Local<Value>(); // Null
                 else
                     return ItemClass::newItem(item);
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
@@ -275,73 +246,57 @@ Local<Value> McClass::newItem(const Arguments& args)
     CATCH("Fail in NewItem!");
 }
 
-Local<Value> McClass::spawnItem(const Arguments& args)
-{
+Local<Value> McClass::spawnItem(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
 
     try {
         FloatVec4 pos;
-        if (args.size() == 2)
-        {
-            if (IsInstanceOf<IntPos>(args[1]))
-            {
+        if (args.size() == 2) {
+            if (IsInstanceOf<IntPos>(args[1])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[1]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[1])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[1]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 5)
-        {
+        } else if (args.size() == 5) {
             // Number Pos
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[4], ValueKind::kNumber);
-            pos = { args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].asNumber().toFloat(), args[4].toInt() };
-        }
-        else
-        {
+            pos = {args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].asNumber().toFloat(), args[4].toInt()};
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
 
 
         ItemStack* it = ItemClass::extract(args[0]);
-        if (it)
-        {
-            //By Item
+        if (it) {
+            // By Item
             Actor* entity = Level::spawnItem(pos.getVec3(), pos.dim, it);
             if (!entity)
-                return Local<Value>();    //Null
+                return Local<Value>(); // Null
             else
                 return EntityClass::newEntity(entity);
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
diff --git a/ScriptEngine/API/ItemAPI.h b/ScriptEngine/API/ItemAPI.h
--- a/ScriptEngine/API/ItemAPI.h
+++ b/ScriptEngine/API/ItemAPI.h
@@ -5,25 +5,23 @@
 
 //////////////////// Classes ////////////////////
 class ItemStack;
-class ItemClass : public ScriptClass
-{
+class ItemClass : public ScriptClass {
 private:
-    ItemStack *item;
+    ItemStack* item;
 
     // Pre data
-    std::string name,type;
+    std::string name, type;
     int id, count, aux;
 
 public:
-	explicit ItemClass(ItemStack *p);
+    explicit ItemClass(ItemStack* p);
     void preloadData();
 
-    ItemStack *get()
-    {
+    ItemStack* get() {
         return item;
     }
 
-    static Local<Object> newItem(ItemStack *p);
+    static Local<Object> newItem(ItemStack* p);
     static ItemStack* extract(Local<Value> v);
     Local<Value> getRawPtr(const Arguments& args);
 
diff --git a/ScriptEngine/API/LlAPI.cpp b/ScriptEngine/API/LlAPI.cpp
--- a/ScriptEngine/API/LlAPI.cpp
+++ b/ScriptEngine/API/LlAPI.cpp
@@ -34,14 +34,13 @@ ClassDefine<void> LlClassBuilder =
         .build();
 
 
-Local<Value> LlClass::registerPlugin(const Arguments& args)
-{
+Local<Value> LlClass::registerPlugin(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kString);
-    //if (args.size() >= 3)
-    //    CHECK_ARG_TYPE(args[2], ValueKind::kObject);
+    // if (args.size() >= 3)
+    //     CHECK_ARG_TYPE(args[2], ValueKind::kObject);
     if (args.size() >= 4)
         CHECK_ARG_TYPE(args[3], ValueKind::kObject);
 
@@ -50,88 +49,71 @@ Local<Value> LlClass::registerPlugin(const Arguments& args)
         string desc = args.size() >= 2 ? args[1].toStr() : "";
 
         LL::Version ver = LL::Version(1, 0, 0);
-        if (args.size() >= 3)
-        {
-            if (args[2].isArray())
-            {
+        if (args.size() >= 3) {
+            if (args[2].isArray()) {
                 Local<Array> verInfo = args[2].asArray();
-                if (verInfo.size() >= 1)
-                {
+                if (verInfo.size() >= 1) {
                     Local<Value> major = verInfo.get(0);
                     if (major.isNumber())
                         ver.major = major.toInt();
                 }
-                if (verInfo.size() >= 2)
-                {
+                if (verInfo.size() >= 2) {
                     Local<Value> minor = verInfo.get(1);
                     if (minor.isNumber())
                         ver.minor = minor.toInt();
                 }
-                if (verInfo.size() >= 3)
-                {
+                if (verInfo.size() >= 3) {
                     Local<Value> revision = verInfo.get(2);
                     if (revision.isNumber())
                         ver.revision = revision.toInt();
                 }
-            }
-            else if (args[2].isObject())
-            {
+            } else if (args[2].isObject()) {
                 Local<Object> verInfo = args[2].asObject();
-                if (verInfo.has("major"))
-                {
+                if (verInfo.has("major")) {
                     Local<Value> major = verInfo.get("major");
                     if (major.isNumber())
                         ver.major = major.toInt();
                 }
-                if (verInfo.has("minor"))
-                {
+                if (verInfo.has("minor")) {
                     Local<Value> minor = verInfo.get("minor");
                     if (minor.isNumber())
                         ver.minor = minor.toInt();
                 }
-                if (verInfo.has("revision"))
-                {
+                if (verInfo.has("revision")) {
                     Local<Value> revision = verInfo.get("revision");
                     if (revision.isNumber())
                         ver.revision = revision.toInt();
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Boolean::newBoolean(false);
             }
         }
 
         map<string, string> other;
-        if (args.size() >= 4)
-        {
+        if (args.size() >= 4) {
             Local<Object> otherInfo = args[3].asObject();
             auto keys = otherInfo.getKeyNames();
-            for (auto& key : keys)
-            {
+            for (auto& key : keys) {
                 other[key] = otherInfo.get(key).toStr();
             }
         }
 
         ENGINE_OWN_DATA()->pluginName = ENGINE_OWN_DATA()->logger.title = name;
         return Boolean::newBoolean(PluginManager::registerPlugin(ENGINE_OWN_DATA()->pluginFilePath,
-            name, desc, ver, other));
+                                                                 name, desc, ver, other));
     }
     CATCH("Fail in LLSERegisterPlugin!");
 }
 
-Local<Value> LlClass::getPluginInfo(const Arguments& args)
-{
+Local<Value> LlClass::getPluginInfo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         std::string name = args[0].toStr();
         auto plugin = LL::getPlugin(name);
-        if (plugin)
-        {
+        if (plugin) {
             auto result = Object::newObject();
             result.set("name", plugin->name);
             result.set("desc", plugin->desc);
@@ -143,8 +125,7 @@ Local<Value> LlClass::getPluginInfo(const Arguments& args)
             result.set("versionStr", plugin->version.toString(true));
             result.set("filePath", plugin->filePath);
             auto others = Object::newObject();
-            for (auto& [k, v] : plugin->others)
-            {
+            for (auto& [k, v] : plugin->others) {
                 others.set(k, v);
             }
             result.set("others", others);
@@ -155,9 +136,8 @@ Local<Value> LlClass::getPluginInfo(const Arguments& args)
     CATCH("Fail in getPluginInfo");
 }
 
-Local<Value> LlClass::version(const Arguments& args)
-{
-    try{
+Local<Value> LlClass::version(const Arguments& args) {
+    try {
         Local<Object> ver = Object::newObject();
         ver.set("major", LITELOADER_VERSION_MAJOR);
         ver.set("minor", LITELOADER_VERSION_MINOR);
@@ -168,17 +148,14 @@ Local<Value> LlClass::version(const Arguments& args)
     CATCH("Fail in LLSEGetVersion!")
 }
 
-Local<Value> LlClass::versionString(const Arguments& args)
-{
-    try
-    {
+Local<Value> LlClass::versionString(const Arguments& args) {
+    try {
         return String::newString(LL::getLoaderVersionString());
     }
     CATCH("Fail in LLSEGetVersionString!")
 }
 
-Local<Value> LlClass::requireVersion(const Arguments& args)
-{
+Local<Value> LlClass::requireVersion(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     if (args.size() >= 2)
@@ -188,19 +165,16 @@ Local<Value> LlClass::requireVersion(const Arguments& args)
 
     try {
         return Boolean::newBoolean(!IsVersionLess(LITELOADER_VERSION_MAJOR, LITELOADER_VERSION_MINOR, LITELOADER_VERSION_REVISION,
-            args[0].toInt(), (args.size() >= 2) ? args[1].toInt() : 0, (args.size() >= 3) ? args[2].toInt() : 0));
+                                                  args[0].toInt(), (args.size() >= 2) ? args[1].toInt() : 0, (args.size() >= 3) ? args[2].toInt() : 0));
     }
     CATCH("Fail in LLSERequireVersion!")
 }
 
-Local<Value> LlClass::listPlugins(const Arguments& args)
-{
-    try
-    {
+Local<Value> LlClass::listPlugins(const Arguments& args) {
+    try {
         Local<Array> plugins = Array::newArray();
         auto list = PluginManager::getAllPlugins();
-        for(auto &plugin : list)
-        {
+        for (auto& plugin : list) {
             plugins.add(String::newString(plugin.second->name));
         }
         return plugins;
@@ -208,22 +182,19 @@ Local<Value> LlClass::listPlugins(const Arguments& args)
     CATCH("Fail in LLSEListPlugins!")
 }
 
-Local<Value> LlClass::require(const Arguments& args)
-{
+Local<Value> LlClass::require(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kString)
 
-    try
-    {
+    try {
         bool existing = false;
         string require = args[0].toStr();
         string thisName = ENGINE_OWN_DATA()->pluginName;
 
         //已加载插件
-        if (PluginManager::getPlugin(require) != nullptr)
-        {
+        if (PluginManager::getPlugin(require) != nullptr) {
             logger.info(thisName + tr("llseapi.require.success") + require);
             return Boolean::newBoolean(true);
         }
@@ -231,21 +202,16 @@ Local<Value> LlClass::require(const Arguments& args)
         //插件目录
         existing = false;
         string requirePath = "";
-        
-        //Direct
+
+        // Direct
         std::error_code ec;
-        if (filesystem::exists(str2wstr(require), ec))
-        {
+        if (filesystem::exists(str2wstr(require), ec)) {
             requirePath = require;
             existing = true;
-        }
-        else
-        {
+        } else {
             auto list = GetFileNameList(LLSE_PLUGINS_LOAD_DIR);
-            for (auto fileName : list)
-            {
-                if (fileName == require)
-                {
+            for (auto fileName : list) {
+                if (fileName == require) {
                     requirePath = string(LLSE_PLUGINS_LOAD_DIR) + "/" + require;
                     existing = true;
                     break;
@@ -253,16 +219,12 @@ Local<Value> LlClass::require(const Arguments& args)
             }
         }
 
-        if (existing)
-        { 
+        if (existing) {
             bool success = PluginManager::loadPlugin(requirePath);
-            if (success)
-            {
+            if (success) {
                 logger.info(thisName + tr("llseapi.require.success") + require);
                 return Boolean::newBoolean(true);
-            }
-            else
-            {
+            } else {
                 logger.error(thisName + tr("llseapi.require.fail"));
                 return Boolean::newBoolean(false);
             }
@@ -271,32 +233,25 @@ Local<Value> LlClass::require(const Arguments& args)
         //依赖库目录
         existing = false;
         auto list = GetFileNameList(LLSE_DEPENDS_DIR);
-        for (auto fileName : list)
-        {
-            if (fileName == require)
-            {
+        for (auto fileName : list) {
+            if (fileName == require) {
                 existing = true;
                 break;
             }
         }
-        if (existing)
-        {
+        if (existing) {
             bool success = PluginManager::loadPlugin(string(LLSE_DEPENDS_DIR) + "/" + require);
-            if (success)
-            {
+            if (success) {
                 logger.info(thisName + tr("llseapi.require.success") + require);
                 return Boolean::newBoolean(true);
-            }
-            else
-            {
+            } else {
                 logger.error(thisName + tr("llseapi.require.fail"));
                 return Boolean::newBoolean(false);
             }
         }
 
-        //HTTP(s)下载
-        if (args.size() == 1)
-        {
+        // HTTP(s)下载
+        if (args.size() == 1) {
             logger.error(thisName + tr("llseapi.require.fail"));
             return Boolean::newBoolean(false);
         }
@@ -305,8 +260,7 @@ Local<Value> LlClass::require(const Arguments& args)
         int status;
         string result, downloadPath = string(LLSE_DEPENDS_DIR) + "/" + require;
 
-        if (!HttpGetSync(remotePath, &status, &result) || status != 200)
-        {
+        if (!HttpGetSync(remotePath, &status, &result) || status != 200) {
             logger.error(thisName + tr("llseapi.require.network.fail") + to_string(status));
             return Boolean::newBoolean(false);
         }
@@ -316,13 +270,10 @@ Local<Value> LlClass::require(const Arguments& args)
 
         //下载完毕安装
         bool success = PluginManager::loadPlugin(downloadPath);
-        if (success)
-        {
+        if (success) {
             logger.info(thisName + tr("llseapi.require.success") + require);
             return Boolean::newBoolean(true);
-        }
-        else
-        {
+        } else {
             logger.error(thisName + tr("llseapi.require.fail"));
             return Boolean::newBoolean(false);
         }
@@ -330,12 +281,10 @@ Local<Value> LlClass::require(const Arguments& args)
     CATCH("Fail in LLSERequire!")
 }
 
-Local<Value> LlClass::eval(const Arguments& args)
-{
+Local<Value> LlClass::eval(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    try
-    {
+    try {
         return EngineScope::currentEngine()->eval(args[0].toStr());
     }
     CATCH("Fail in LLSEEval!")
diff --git a/ScriptEngine/API/LlAPI.h b/ScriptEngine/API/LlAPI.h
--- a/ScriptEngine/API/LlAPI.h
+++ b/ScriptEngine/API/LlAPI.h
@@ -4,8 +4,7 @@
 
 //////////////////// LLSE Static ////////////////////
 
-class LlClass
-{
+class LlClass {
 public:
     static Local<Value> registerPlugin(const Arguments& args);
     static Local<Value> version(const Arguments& args);
diff --git a/ScriptEngine/API/LoggerAPI.cpp b/ScriptEngine/API/LoggerAPI.cpp
--- a/ScriptEngine/API/LoggerAPI.cpp
+++ b/ScriptEngine/API/LoggerAPI.cpp
@@ -32,15 +32,12 @@ ClassDefine<void> LoggerClassBuilder =
 
 
 ////////////////// Helper //////////////////
-string inline GetTimeStrHelper()
-{
+string inline GetTimeStrHelper() {
     return Raw_GetDateTimeStr();
 }
 
-string& StrReplace(string& str, const string& to_replaced, const string& new_str)
-{
-    for (string::size_type pos(0); pos != string::npos; pos += new_str.length())
-    {
+string& StrReplace(string& str, const string& to_replaced, const string& new_str) {
+    for (string::size_type pos(0); pos != string::npos; pos += new_str.length()) {
         pos = str.find(to_replaced, pos);
         if (pos != string::npos)
             str.replace(pos, to_replaced.length(), new_str);
@@ -51,18 +48,16 @@ string& StrReplace(string& str, const string& to_replaced, const string& new_str
 }
 ////////////////// Helper //////////////////
 
-void inline LogDataHelper(Logger::OutputStream *outStream, const Arguments& args)
-{
-    for(int i = 0; i < args.size(); ++i)
-        PrintValue(*outStream,args[i]);
+void inline LogDataHelper(Logger::OutputStream* outStream, const Arguments& args) {
+    for (int i = 0; i < args.size(); ++i)
+        PrintValue(*outStream, args[i]);
     (*outStream) << Logger::endl;
 }
 
-Local<Value> LoggerClass::log(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
+Local<Value> LoggerClass::log(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
 
-    try{
+    try {
         auto globalConf = ENGINE_OWN_DATA();
         LogDataHelper(&globalConf->logger.info, args);
         return Boolean::newBoolean(true);
@@ -70,9 +65,8 @@ Local<Value> LoggerClass::log(const Arguments& args)
     CATCH("Fail in LoggerLog!")
 }
 
-Local<Value> LoggerClass::debug(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
+Local<Value> LoggerClass::debug(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
 
     try {
         auto globalConf = ENGINE_OWN_DATA();
@@ -82,10 +76,9 @@ Local<Value> LoggerClass::debug(const Arguments& args)
     CATCH("Fail in LoggerDebug!")
 }
 
-Local<Value> LoggerClass::info(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    
+Local<Value> LoggerClass::info(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
     try {
         auto globalConf = ENGINE_OWN_DATA();
         LogDataHelper(&globalConf->logger.info, args);
@@ -94,10 +87,9 @@ Local<Value> LoggerClass::info(const Arguments& args)
     CATCH("Fail in LoggerInfo!")
 }
 
-Local<Value> LoggerClass::warn(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    
+Local<Value> LoggerClass::warn(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
     try {
         auto globalConf = ENGINE_OWN_DATA();
         LogDataHelper(&globalConf->logger.warn, args);
@@ -106,10 +98,9 @@ Local<Value> LoggerClass::warn(const Arguments& args)
     CATCH("Fail in LoggerWarn!")
 }
 
-Local<Value> LoggerClass::error(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    
+Local<Value> LoggerClass::error(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
     try {
         auto globalConf = ENGINE_OWN_DATA();
         LogDataHelper(&globalConf->logger.error, args);
@@ -118,10 +109,9 @@ Local<Value> LoggerClass::error(const Arguments& args)
     CATCH("Fail in LoggerError!")
 }
 
-Local<Value> LoggerClass::fatal(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    
+Local<Value> LoggerClass::fatal(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
     try {
         auto globalConf = ENGINE_OWN_DATA();
         LogDataHelper(&globalConf->logger.fatal, args);
@@ -130,10 +120,9 @@ Local<Value> LoggerClass::fatal(const Arguments& args)
     CATCH("Fail in LoggerFatal!")
 }
 
-Local<Value> LoggerClass::setTitle(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> LoggerClass::setTitle(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
     try {
         ENGINE_OWN_DATA()->logger.title = args[0].asString().toString();
@@ -143,8 +132,7 @@ Local<Value> LoggerClass::setTitle(const Arguments& args)
 }
 
 ///////////////// Helper /////////////////
-void UpdateMaxLogLevel()
-{
+void UpdateMaxLogLevel() {
     auto data = ENGINE_OWN_DATA();
     data->maxLogLevel = data->logger.consoleLevel;
     if (data->maxLogLevel < data->logger.fileLevel)
@@ -154,17 +142,15 @@ void UpdateMaxLogLevel()
 }
 ///////////////// Helper /////////////////
 
-Local<Value> LoggerClass::setConsole(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kBoolean)
-    if(args.size() >= 2)
+Local<Value> LoggerClass::setConsole(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kBoolean)
+    if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
 
     try {
         ENGINE_OWN_DATA()->toConsole = args[0].asBoolean().value();
-        if (args.size() >= 2)
-        {
+        if (args.size() >= 2) {
             ENGINE_OWN_DATA()->logger.consoleLevel = args[1].toInt();
             UpdateMaxLogLevel();
         }
@@ -173,10 +159,9 @@ Local<Value> LoggerClass::setConsole(const Arguments& args)
     CATCH("Fail in LoggerSetConsole!")
 }
 
-Local<Value> LoggerClass::setFile(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> LoggerClass::setFile(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
 
@@ -184,8 +169,7 @@ Local<Value> LoggerClass::setFile(const Arguments& args)
         string newFile = args[0].asString().toString();
         ENGINE_OWN_DATA()->logger.setFile(newFile, ios::app);
 
-        if (args.size() >= 2)
-        {
+        if (args.size() >= 2) {
             ENGINE_OWN_DATA()->logger.fileLevel = args[1].toInt();
             UpdateMaxLogLevel();
         }
@@ -194,18 +178,16 @@ Local<Value> LoggerClass::setFile(const Arguments& args)
     CATCH("Fail in LoggerSetFile!")
 }
 
-Local<Value> LoggerClass::setPlayer(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
+Local<Value> LoggerClass::setPlayer(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
     if (args.size() >= 2)
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
 
     try {
-        Player *p = PlayerClass::extract(args[0]);
+        Player* p = PlayerClass::extract(args[0]);
         ENGINE_OWN_DATA()->logger.player = p;
 
-        if (args.size() >= 2)
-        {
+        if (args.size() >= 2) {
             ENGINE_OWN_DATA()->logger.playerLevel = args[1].toInt();
             UpdateMaxLogLevel();
         }
@@ -214,8 +196,7 @@ Local<Value> LoggerClass::setPlayer(const Arguments& args)
     CATCH("Fail in LoggerSetPlayer!")
 }
 
-Local<Value> LoggerClass::setLogLevel(const Arguments& args)
-{
+Local<Value> LoggerClass::setLogLevel(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber)
 
diff --git a/ScriptEngine/API/LoggerAPI.h b/ScriptEngine/API/LoggerAPI.h
--- a/ScriptEngine/API/LoggerAPI.h
+++ b/ScriptEngine/API/LoggerAPI.h
@@ -4,8 +4,7 @@
 
 //////////////////// Classes ////////////////////
 
-class LoggerClass
-{
+class LoggerClass {
 public:
     static Local<Value> log(const Arguments& args);
     static Local<Value> debug(const Arguments& args);
diff --git a/ScriptEngine/API/McAPI.cpp b/ScriptEngine/API/McAPI.cpp
--- a/ScriptEngine/API/McAPI.cpp
+++ b/ScriptEngine/API/McAPI.cpp
@@ -1,44 +1,44 @@
 #include "McAPI.h"
 
 ClassDefine<void> McClassBuilder =
-	defineClass("mc")
-		.function("getBDSVersion", &McClass::getBDSVersion)
+    defineClass("mc")
+        .function("getBDSVersion", &McClass::getBDSVersion)
         .function("getServerProtocolVersion", &McClass::getServerProtocolVersion)
         .function("runcmd", &McClass::runcmd)
-		.function("runcmdEx", &McClass::runcmdEx)
-		.function("regPlayerCmd", &McClass::regPlayerCmd)
-		.function("newCommand", &McClass::newCommand)
-		.function("broadcast", &McClass::broadcast)
-		.function("listen", &McClass::listen)
-		.function("getPlayer", &McClass::getPlayer)
-		.function("getOnlinePlayers", &McClass::getOnlinePlayers)
-		.function("getAllEntities", McClass::getAllEntities)
-		.function("newItem", &McClass::newItem)
-		.function("spawnMob", &McClass::spawnMob)
+        .function("runcmdEx", &McClass::runcmdEx)
+        .function("regPlayerCmd", &McClass::regPlayerCmd)
+        .function("newCommand", &McClass::newCommand)
+        .function("broadcast", &McClass::broadcast)
+        .function("listen", &McClass::listen)
+        .function("getPlayer", &McClass::getPlayer)
+        .function("getOnlinePlayers", &McClass::getOnlinePlayers)
+        .function("getAllEntities", McClass::getAllEntities)
+        .function("newItem", &McClass::newItem)
+        .function("spawnMob", &McClass::spawnMob)
         .function("cloneMob", &McClass::cloneMob)
-		.function("spawnItem", &McClass::spawnItem)
+        .function("spawnItem", &McClass::spawnItem)
         .function("spawnSimulatedPlayer", &McClass::spawnSimulatedPlayer)
-		.function("explode", &McClass::explode)
-		.function("getBlock", &McClass::getBlock)
-		.function("setBlock", &McClass::setBlock)
-		.function("spawnParticle", &McClass::spawnParticle)
-		.function("newSimpleForm", &McClass::newSimpleForm)
-		.function("newCustomForm", &McClass::newCustomForm)
-		.function("regConsoleCmd", &McClass::regConsoleCmd)
-		.function("setMotd", &McClass::setMotd)
-		.function("sendCmdOutput", &McClass::sendCmdOutput)
-		.function("newIntPos", &McClass::newIntPos)
-		.function("newFloatPos", &McClass::newFloatPos)
-		.function("getDisplayObjective", &McClass::getDisplayObjective)
-		.function("clearDisplayObjective", &McClass::clearDisplayObjective)
-		.function("getScoreObjective", &McClass::getScoreObjective)
-		.function("newScoreObjective", &McClass::newScoreObjective)
-		.function("removeScoreObjective", &McClass::removeScoreObjective)
-		.function("getAllScoreObjectives", &McClass::getAllScoreObjectives)
+        .function("explode", &McClass::explode)
+        .function("getBlock", &McClass::getBlock)
+        .function("setBlock", &McClass::setBlock)
+        .function("spawnParticle", &McClass::spawnParticle)
+        .function("newSimpleForm", &McClass::newSimpleForm)
+        .function("newCustomForm", &McClass::newCustomForm)
+        .function("regConsoleCmd", &McClass::regConsoleCmd)
+        .function("setMotd", &McClass::setMotd)
+        .function("sendCmdOutput", &McClass::sendCmdOutput)
+        .function("newIntPos", &McClass::newIntPos)
+        .function("newFloatPos", &McClass::newFloatPos)
+        .function("getDisplayObjective", &McClass::getDisplayObjective)
+        .function("clearDisplayObjective", &McClass::clearDisplayObjective)
+        .function("getScoreObjective", &McClass::getScoreObjective)
+        .function("newScoreObjective", &McClass::newScoreObjective)
+        .function("removeScoreObjective", &McClass::removeScoreObjective)
+        .function("getAllScoreObjectives", &McClass::getAllScoreObjectives)
 
-		//For Compatity
-		.function("getAllScoreObjective", &McClass::getAllScoreObjectives)
-		.function("getDisplayObjectives", &McClass::getDisplayObjective)
-		.function("crash", &McClass::crashBDS)
-        	.function("setMaxPlayers", &McClass::setMaxNumPlayers)
-        	.build();
+        // For Compatity
+        .function("getAllScoreObjective", &McClass::getAllScoreObjectives)
+        .function("getDisplayObjectives", &McClass::getDisplayObjective)
+        .function("crash", &McClass::crashBDS)
+        .function("setMaxPlayers", &McClass::setMaxNumPlayers)
+        .build();
diff --git a/ScriptEngine/API/McAPI.h b/ScriptEngine/API/McAPI.h
--- a/ScriptEngine/API/McAPI.h
+++ b/ScriptEngine/API/McAPI.h
@@ -3,8 +3,7 @@
 #include <string>
 
 
-class McClass
-{
+class McClass {
 public:
     static Local<Value> getBDSVersion(const Arguments& args);
     static Local<Value> getServerProtocolVersion(const Arguments& args);
diff --git a/ScriptEngine/API/NbtAPI.cpp b/ScriptEngine/API/NbtAPI.cpp
--- a/ScriptEngine/API/NbtAPI.cpp
+++ b/ScriptEngine/API/NbtAPI.cpp
@@ -37,7 +37,7 @@ ClassDefine<void> NbtStaticBuilder =
         .property("List", &NbtStatic::getType<Tag::Type::List>)
         .property("Compound", &NbtStatic::getType<Tag::Type::Compound>)
 
-        //For Compatibility
+        // For Compatibility
         .function("createTag", &NbtStatic::newTag)
         .function("newTag", &NbtStatic::newTag)
         .build();
@@ -177,19 +177,16 @@ ClassDefine<NbtCompoundClass> NbtCompoundClassBuilder =
 //////////////////// Classes NbtEnd ////////////////////
 
 NbtEndClass::NbtEndClass(const Local<Object>& scriptObj, std::unique_ptr<EndTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtEndClass::NbtEndClass(std::unique_ptr<EndTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtEndClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtEndClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtEndClass* NbtEndClass::constructor(const Arguments& args)
-{
+NbtEndClass* NbtEndClass::constructor(const Arguments& args) {
     try {
         auto tag = EndTag::create();
         return new NbtEndClass(args.thiz(), std::move(tag));
@@ -197,67 +194,56 @@ NbtEndClass* NbtEndClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create EndTag!");
 }
 
-EndTag* NbtEndClass::extract(Local<Value> v)
-{
+EndTag* NbtEndClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtEndClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtEndClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtEndClass::pack(EndTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtEndClass::pack(EndTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<EndTag> nbt(tag);
-            auto *nbtObj = new NbtEndClass(std::move(nbt));
+            auto* nbtObj = new NbtEndClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtEndClass(Tag::asTypedTag<EndTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtEnd!");
 }
 
-Local<Value> NbtEndClass::pack(std::unique_ptr<EndTag> tag)
-{
-    try
-    {
+Local<Value> NbtEndClass::pack(std::unique_ptr<EndTag> tag) {
+    try {
         return (new NbtEndClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtEnd!");
 }
 
-Local<Value> NbtEndClass::getType(const Arguments& args)
-{
+Local<Value> NbtEndClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::End);
 }
 
-Local<Value> NbtEndClass::get(const Arguments& args)
-{
+Local<Value> NbtEndClass::get(const Arguments& args) {
     try {
         return Local<Value>();
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtEndClass::toString(const Arguments& args)
-{
+Local<Value> NbtEndClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtEndClass::set(const Arguments& args)
-{
+Local<Value> NbtEndClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
 
     try {
@@ -270,19 +256,16 @@ Local<Value> NbtEndClass::set(const Arguments& args)
 //////////////////// Classes NbtByte ////////////////////
 
 NbtByteClass::NbtByteClass(const Local<Object>& scriptObj, std::unique_ptr<ByteTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtByteClass::NbtByteClass(std::unique_ptr<ByteTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtByteClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtByteClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtByteClass* NbtByteClass::constructor(const Arguments& args)
-{
+NbtByteClass* NbtByteClass::constructor(const Arguments& args) {
     try {
         auto tag = ByteTag::create((char)args[0].toInt());
         return new NbtByteClass(args.thiz(), std::move(tag));
@@ -290,67 +273,56 @@ NbtByteClass* NbtByteClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create ByteTag!");
 }
 
-ByteTag* NbtByteClass::extract(Local<Value> v)
-{
+ByteTag* NbtByteClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtByteClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtByteClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtByteClass::pack(ByteTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtByteClass::pack(ByteTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<ByteTag> nbt(tag);
             auto* nbtObj = new NbtByteClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtByteClass(Tag::asTypedTag<ByteTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtByte!");
 }
 
-Local<Value> NbtByteClass::pack(std::unique_ptr<ByteTag> tag)
-{
-    try
-    {
+Local<Value> NbtByteClass::pack(std::unique_ptr<ByteTag> tag) {
+    try {
         return (new NbtByteClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtByte!");
 }
 
-Local<Value> NbtByteClass::getType(const Arguments& args)
-{
+Local<Value> NbtByteClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Byte);
 }
 
-Local<Value> NbtByteClass::get(const Arguments& args)
-{
+Local<Value> NbtByteClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtByteClass::toString(const Arguments& args)
-{
+Local<Value> NbtByteClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtByteClass::set(const Arguments& args)
-{
+Local<Value> NbtByteClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -363,19 +335,16 @@ Local<Value> NbtByteClass::set(const Arguments& args)
 //////////////////// Classes NbtInt ////////////////////
 
 NbtIntClass::NbtIntClass(const Local<Object>& scriptObj, std::unique_ptr<IntTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtIntClass::NbtIntClass(std::unique_ptr<IntTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtIntClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtIntClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtIntClass* NbtIntClass::constructor(const Arguments& args)
-{
+NbtIntClass* NbtIntClass::constructor(const Arguments& args) {
     try {
         auto tag = IntTag::create(args[0].toInt());
         return new NbtIntClass(args.thiz(), std::move(tag));
@@ -383,67 +352,56 @@ NbtIntClass* NbtIntClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create IntTag!");
 }
 
-IntTag* NbtIntClass::extract(Local<Value> v)
-{
+IntTag* NbtIntClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtIntClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtIntClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtIntClass::pack(IntTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtIntClass::pack(IntTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<IntTag> nbt(tag);
             auto* nbtObj = new NbtIntClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtIntClass(Tag::asTypedTag<IntTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtInt!");
 }
 
-Local<Value> NbtIntClass::pack(std::unique_ptr<IntTag> tag)
-{
-    try
-    {
+Local<Value> NbtIntClass::pack(std::unique_ptr<IntTag> tag) {
+    try {
         return (new NbtIntClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtInt!");
 }
 
-Local<Value> NbtIntClass::getType(const Arguments& args)
-{
+Local<Value> NbtIntClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Int);
 }
 
-Local<Value> NbtIntClass::get(const Arguments& args)
-{
+Local<Value> NbtIntClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtIntClass::toString(const Arguments& args)
-{
+Local<Value> NbtIntClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtIntClass::set(const Arguments& args)
-{
+Local<Value> NbtIntClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
 
     try {
@@ -456,19 +414,16 @@ Local<Value> NbtIntClass::set(const Arguments& args)
 //////////////////// Classes NbtShort ////////////////////
 
 NbtShortClass::NbtShortClass(const Local<Object>& scriptObj, std::unique_ptr<ShortTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtShortClass::NbtShortClass(std::unique_ptr<ShortTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtShortClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtShortClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtShortClass* NbtShortClass::constructor(const Arguments& args)
-{
+NbtShortClass* NbtShortClass::constructor(const Arguments& args) {
     try {
         auto tag = ShortTag::create(args[0].toInt());
         return new NbtShortClass(args.thiz(), std::move(tag));
@@ -476,67 +431,56 @@ NbtShortClass* NbtShortClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create ShortTag!");
 }
 
-ShortTag* NbtShortClass::extract(Local<Value> v)
-{
+ShortTag* NbtShortClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtShortClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtShortClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtShortClass::pack(ShortTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtShortClass::pack(ShortTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<ShortTag> nbt(tag);
             auto* nbtObj = new NbtShortClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtShortClass(Tag::asTypedTag<ShortTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtShort!");
 }
 
-Local<Value> NbtShortClass::pack(std::unique_ptr<ShortTag> tag)
-{
-    try
-    {
+Local<Value> NbtShortClass::pack(std::unique_ptr<ShortTag> tag) {
+    try {
         return (new NbtShortClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtShort!");
 }
 
-Local<Value> NbtShortClass::getType(const Arguments& args)
-{
+Local<Value> NbtShortClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Short);
 }
 
-Local<Value> NbtShortClass::get(const Arguments& args)
-{
+Local<Value> NbtShortClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtShortClass::toString(const Arguments& args)
-{
+Local<Value> NbtShortClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtShortClass::set(const Arguments& args)
-{
+Local<Value> NbtShortClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -549,19 +493,16 @@ Local<Value> NbtShortClass::set(const Arguments& args)
 //////////////////// Classes NbtLong ////////////////////
 
 NbtLongClass::NbtLongClass(const Local<Object>& scriptObj, std::unique_ptr<Int64Tag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtLongClass::NbtLongClass(std::unique_ptr<Int64Tag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtLongClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtLongClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtLongClass* NbtLongClass::constructor(const Arguments& args)
-{
+NbtLongClass* NbtLongClass::constructor(const Arguments& args) {
     try {
         auto tag = Int64Tag::create(args[0].asNumber().toInt64());
         return new NbtLongClass(args.thiz(), std::move(tag));
@@ -569,67 +510,56 @@ NbtLongClass* NbtLongClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create LongTag!");
 }
 
-Int64Tag* NbtLongClass::extract(Local<Value> v)
-{
+Int64Tag* NbtLongClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtLongClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtLongClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtLongClass::pack(Int64Tag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtLongClass::pack(Int64Tag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<Int64Tag> nbt(tag);
             auto* nbtObj = new NbtLongClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtLongClass(Tag::asTypedTag<Int64Tag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtLong!");
 }
 
-Local<Value> NbtLongClass::pack(std::unique_ptr<Int64Tag> tag)
-{
-    try
-    {
+Local<Value> NbtLongClass::pack(std::unique_ptr<Int64Tag> tag) {
+    try {
         return (new NbtLongClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtLong!");
 }
 
-Local<Value> NbtLongClass::getType(const Arguments& args)
-{
+Local<Value> NbtLongClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Int64);
 }
 
-Local<Value> NbtLongClass::get(const Arguments& args)
-{
+Local<Value> NbtLongClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtLongClass::toString(const Arguments& args)
-{
+Local<Value> NbtLongClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtLongClass::set(const Arguments& args)
-{
+Local<Value> NbtLongClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -642,19 +572,16 @@ Local<Value> NbtLongClass::set(const Arguments& args)
 //////////////////// Classes NbtFloat ////////////////////
 
 NbtFloatClass::NbtFloatClass(const Local<Object>& scriptObj, std::unique_ptr<FloatTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtFloatClass::NbtFloatClass(std::unique_ptr<FloatTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtFloatClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtFloatClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtFloatClass* NbtFloatClass::constructor(const Arguments& args)
-{
+NbtFloatClass* NbtFloatClass::constructor(const Arguments& args) {
     try {
         auto tag = FloatTag::create(args[0].asNumber().toFloat());
         return new NbtFloatClass(args.thiz(), std::move(tag));
@@ -662,67 +589,56 @@ NbtFloatClass* NbtFloatClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create FloatTag!");
 }
 
-FloatTag* NbtFloatClass::extract(Local<Value> v)
-{
+FloatTag* NbtFloatClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtFloatClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtFloatClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtFloatClass::pack(FloatTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtFloatClass::pack(FloatTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<FloatTag> nbt(tag);
             auto* nbtObj = new NbtFloatClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtFloatClass(Tag::asTypedTag<FloatTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtFloat!");
 }
 
-Local<Value> NbtFloatClass::pack(std::unique_ptr<FloatTag> tag)
-{
-    try
-    {
+Local<Value> NbtFloatClass::pack(std::unique_ptr<FloatTag> tag) {
+    try {
         return (new NbtFloatClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtFloat!");
 }
 
-Local<Value> NbtFloatClass::getType(const Arguments& args)
-{
+Local<Value> NbtFloatClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Float);
 }
 
-Local<Value> NbtFloatClass::get(const Arguments& args)
-{
+Local<Value> NbtFloatClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtFloatClass::toString(const Arguments& args)
-{
+Local<Value> NbtFloatClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtFloatClass::set(const Arguments& args)
-{
+Local<Value> NbtFloatClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -735,19 +651,16 @@ Local<Value> NbtFloatClass::set(const Arguments& args)
 //////////////////// Classes NbtDouble ////////////////////
 
 NbtDoubleClass::NbtDoubleClass(const Local<Object>& scriptObj, std::unique_ptr<DoubleTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtDoubleClass::NbtDoubleClass(std::unique_ptr<DoubleTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtDoubleClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtDoubleClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtDoubleClass* NbtDoubleClass::constructor(const Arguments& args)
-{
+NbtDoubleClass* NbtDoubleClass::constructor(const Arguments& args) {
     try {
         auto tag = DoubleTag::create(args[0].asNumber().toDouble());
         return new NbtDoubleClass(args.thiz(), std::move(tag));
@@ -755,67 +668,56 @@ NbtDoubleClass* NbtDoubleClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create DoubleTag!");
 }
 
-DoubleTag* NbtDoubleClass::extract(Local<Value> v)
-{
+DoubleTag* NbtDoubleClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtDoubleClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtDoubleClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtDoubleClass::pack(DoubleTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtDoubleClass::pack(DoubleTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<DoubleTag> nbt(tag);
             auto* nbtObj = new NbtDoubleClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtDoubleClass(Tag::asTypedTag<DoubleTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtDouble!");
 }
 
-Local<Value> NbtDoubleClass::pack(std::unique_ptr<DoubleTag> tag)
-{
-    try
-    {
+Local<Value> NbtDoubleClass::pack(std::unique_ptr<DoubleTag> tag) {
+    try {
         return (new NbtDoubleClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtDouble!");
 }
 
-Local<Value> NbtDoubleClass::getType(const Arguments& args)
-{
+Local<Value> NbtDoubleClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Double);
 }
 
-Local<Value> NbtDoubleClass::get(const Arguments& args)
-{
+Local<Value> NbtDoubleClass::get(const Arguments& args) {
     try {
         return Number::newNumber(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtDoubleClass::toString(const Arguments& args)
-{
+Local<Value> NbtDoubleClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtDoubleClass::set(const Arguments& args)
-{
+Local<Value> NbtDoubleClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -828,19 +730,16 @@ Local<Value> NbtDoubleClass::set(const Arguments& args)
 //////////////////// Classes NbtString ////////////////////
 
 NbtStringClass::NbtStringClass(const Local<Object>& scriptObj, std::unique_ptr<StringTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtStringClass::NbtStringClass(std::unique_ptr<StringTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtStringClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtStringClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtStringClass* NbtStringClass::constructor(const Arguments& args)
-{
+NbtStringClass* NbtStringClass::constructor(const Arguments& args) {
     try {
         auto tag = StringTag::create(args[0].toStr());
         return new NbtStringClass(args.thiz(), std::move(tag));
@@ -848,67 +747,56 @@ NbtStringClass* NbtStringClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create StringTag!");
 }
 
-StringTag* NbtStringClass::extract(Local<Value> v)
-{
+StringTag* NbtStringClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtStringClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtStringClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtStringClass::pack(StringTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtStringClass::pack(StringTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<StringTag> nbt(tag);
             auto* nbtObj = new NbtStringClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtStringClass(Tag::asTypedTag<StringTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtString!");
 }
 
-Local<Value> NbtStringClass::pack(std::unique_ptr<StringTag> tag)
-{
-    try
-    {
+Local<Value> NbtStringClass::pack(std::unique_ptr<StringTag> tag) {
+    try {
         return (new NbtStringClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtString!");
 }
 
-Local<Value> NbtStringClass::getType(const Arguments& args)
-{
+Local<Value> NbtStringClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::String);
 }
 
-Local<Value> NbtStringClass::get(const Arguments& args)
-{
+Local<Value> NbtStringClass::get(const Arguments& args) {
     try {
         return String::newString(nbt->get());
     }
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtStringClass::toString(const Arguments& args)
-{
+Local<Value> NbtStringClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtStringClass::set(const Arguments& args)
-{
+Local<Value> NbtStringClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -921,19 +809,16 @@ Local<Value> NbtStringClass::set(const Arguments& args)
 //////////////////// Classes NbtByteArray ////////////////////
 
 NbtByteArrayClass::NbtByteArrayClass(const Local<Object>& scriptObj, std::unique_ptr<ByteArrayTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtByteArrayClass::NbtByteArrayClass(std::unique_ptr<ByteArrayTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtByteArrayClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtByteArrayClass>{}) {
     this->nbt = std::move(p);
 }
 
-NbtByteArrayClass* NbtByteArrayClass::constructor(const Arguments& args)
-{
+NbtByteArrayClass* NbtByteArrayClass::constructor(const Arguments& args) {
     try {
         auto buf = args[0].asByteBuffer();
         auto tag = ByteArrayTag::create((char*)buf.getRawBytes(), buf.byteLength());
@@ -942,47 +827,39 @@ NbtByteArrayClass* NbtByteArrayClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create ByteArrayTag!");
 }
 
-ByteArrayTag* NbtByteArrayClass::extract(Local<Value> v)
-{
+ByteArrayTag* NbtByteArrayClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtByteArrayClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtByteArrayClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtByteArrayClass::pack(ByteArrayTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtByteArrayClass::pack(ByteArrayTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<ByteArrayTag> nbt(tag);
             auto* nbtObj = new NbtByteArrayClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtByteArrayClass(Tag::asTypedTag<ByteArrayTag>(tag->copy())))->getScriptObject();
     }
     CATCH("Fail in construct NbtByteArray!");
 }
 
-Local<Value> NbtByteArrayClass::pack(std::unique_ptr<ByteArrayTag> tag)
-{
-    try
-    {
+Local<Value> NbtByteArrayClass::pack(std::unique_ptr<ByteArrayTag> tag) {
+    try {
         return (new NbtByteArrayClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtByteArray!");
 }
 
-Local<Value> NbtByteArrayClass::getType(const Arguments& args)
-{
+Local<Value> NbtByteArrayClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::ByteArray);
 }
 
-Local<Value> NbtByteArrayClass::get(const Arguments& args)
-{
+Local<Value> NbtByteArrayClass::get(const Arguments& args) {
     try {
         auto& data = nbt->value();
         return ByteBuffer::newByteBuffer(data.data.get(), data.size);
@@ -990,25 +867,22 @@ Local<Value> NbtByteArrayClass::get(const Arguments& args)
     CATCH("Fail in NbtValueGet!")
 }
 
-Local<Value> NbtByteArrayClass::toString(const Arguments& args)
-{
+Local<Value> NbtByteArrayClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtByteArrayClass::set(const Arguments& args)
-{
+Local<Value> NbtByteArrayClass::set(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         Local<ByteBuffer> buf = args[0].asByteBuffer();
-        return Boolean::newBoolean(nbt->set(TagMemoryChunk((char*)buf.getRawBytes(),buf.byteLength())));
+        return Boolean::newBoolean(nbt->set(TagMemoryChunk((char*)buf.getRawBytes(), buf.byteLength())));
     }
     CATCH("Fail in NbtValueSet!")
 }
@@ -1017,22 +891,18 @@ Local<Value> NbtByteArrayClass::set(const Arguments& args)
 //////////////////// Classes NbtList ////////////////////
 
 NbtListClass::NbtListClass(const Local<Object>& scriptObj, std::unique_ptr<ListTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     this->nbt = std::move(p);
 }
 
 NbtListClass::NbtListClass(std::unique_ptr<ListTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtListClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtListClass>{}) {
     this->nbt = std::move(p);
 }
 
 ////////////////// Helper //////////////////
-void NbtListClassAddHelper(ListTag *tag, Local<Array> &arr)
-{
-    if (arr.size() > 0)
-    {
+void NbtListClassAddHelper(ListTag* tag, Local<Array>& arr) {
+    if (arr.size() > 0) {
         Local<Value> t = arr.get(0);
         if (IsInstanceOf<NbtEndClass>(t))
             for (int i = 0; i < arr.size(); ++i)
@@ -1067,40 +937,31 @@ void NbtListClassAddHelper(ListTag *tag, Local<Array> &arr)
         else if (IsInstanceOf<NbtCompoundClass>(t))
             for (int i = 0; i < arr.size(); ++i)
                 tag->add(NbtCompoundClass::extract(arr.get(i))->clone());
-        else if (t.isArray())
-        {
-            for (int i = 0; i < arr.size(); ++i)
-            {
+        else if (t.isArray()) {
+            for (int i = 0; i < arr.size(); ++i) {
                 auto arrTag = ListTag::create();
                 auto data = arr.get(i).asArray();
                 NbtListClassAddHelper(arrTag.get(), data);
                 tag->add(std::move(arrTag));
             }
-        }
-        else if (t.isObject())
-        {
-            for (int i = 0; i < arr.size(); ++i)
-            {
+        } else if (t.isObject()) {
+            for (int i = 0; i < arr.size(); ++i) {
                 auto objTag = CompoundTag::create();
                 auto data = arr.get(i).asObject();
                 NbtCompoundClassAddHelper(objTag.get(), data);
                 tag->add(std::move(objTag));
             }
-        }
-        else
-        {
+        } else {
             throw script::Exception("Wrong Type of data to set into NBT List!");
         }
     }
 }
 
-NbtListClass* NbtListClass::constructor(const Arguments& args)
-{
+NbtListClass* NbtListClass::constructor(const Arguments& args) {
     try {
         auto tag = ListTag::create();
 
-        if (args.size() >= 1 && args[0].isArray())
-        {
+        if (args.size() >= 1 && args[0].isArray()) {
             auto arr = args[0].asArray();
             NbtListClassAddHelper(tag.get(), arr);
         }
@@ -1110,66 +971,54 @@ NbtListClass* NbtListClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create ListTag!");
 }
 
-ListTag* NbtListClass::extract(Local<Value> v)
-{
+ListTag* NbtListClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtListClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtListClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtListClass::pack(ListTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtListClass::pack(ListTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<ListTag> nbt(tag);
             auto* nbtObj = new NbtListClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtListClass(tag->copyList()))->getScriptObject();
     }
     CATCH("Fail in construct NbtList!");
 }
 
-Local<Value> NbtListClass::pack(std::unique_ptr<ListTag> tag)
-{
-    try
-    {
+Local<Value> NbtListClass::pack(std::unique_ptr<ListTag> tag) {
+    try {
         return (new NbtListClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtList!");
 }
 
-Local<Value> NbtListClass::getType(const Arguments& args)
-{
+Local<Value> NbtListClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::List);
 }
 
-Local<Value> NbtListClass::getSize(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtListClass::getSize(const Arguments& args) {
+    try {
         return Number::newNumber((int)nbt->getSize());
     }
     CATCH("Fail in NBT GetSize!");
 }
 
-Local<Value> NbtListClass::getTypeOf(const Arguments& args)
-{
+Local<Value> NbtListClass::getTypeOf(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             return Local<Value>();
         }
 
@@ -1178,26 +1027,19 @@ Local<Value> NbtListClass::getTypeOf(const Arguments& args)
     CATCH("Fail in NBT GetTypeOf!");
 }
 
-Local<Value> NbtListClass::setEnd(const Arguments& args)
-{
+Local<Value> NbtListClass::setEnd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::End)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::End) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asEndTag()->set();
         }
         return this->getScriptObject();
@@ -1205,27 +1047,20 @@ Local<Value> NbtListClass::setEnd(const Arguments& args)
     CATCH("Fail in NBT SetEnd!");
 }
 
-Local<Value> NbtListClass::setByte(const Arguments& args)
-{
+Local<Value> NbtListClass::setByte(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Byte)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Byte) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asByteTag()->set(args[1].toInt());
         }
         return this->getScriptObject();
@@ -1233,27 +1068,20 @@ Local<Value> NbtListClass::setByte(const Arguments& args)
     CATCH("Fail in NBT SetByte!");
 }
 
-Local<Value> NbtListClass::setInt(const Arguments& args)
-{
+Local<Value> NbtListClass::setInt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Int)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Int) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asIntTag()->set(args[1].toInt());
         }
         return this->getScriptObject();
@@ -1261,27 +1089,20 @@ Local<Value> NbtListClass::setInt(const Arguments& args)
     CATCH("Fail in NBT SetInt!");
 }
 
-Local<Value> NbtListClass::setShort(const Arguments& args)
-{
+Local<Value> NbtListClass::setShort(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Short)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Short) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asShortTag()->set(args[1].toInt());
         }
         return this->getScriptObject();
@@ -1289,27 +1110,20 @@ Local<Value> NbtListClass::setShort(const Arguments& args)
     CATCH("Fail in NBT SetShort!");
 }
 
-Local<Value> NbtListClass::setLong(const Arguments& args)
-{
+Local<Value> NbtListClass::setLong(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Int64)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Int64) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asInt64Tag()->set(args[1].asNumber().toInt64());
         }
         return this->getScriptObject();
@@ -1317,27 +1131,20 @@ Local<Value> NbtListClass::setLong(const Arguments& args)
     CATCH("Fail in NBT SetLong!");
 }
 
-Local<Value> NbtListClass::setFloat(const Arguments& args)
-{
+Local<Value> NbtListClass::setFloat(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Float)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Float) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asFloatTag()->set(args[1].asNumber().toFloat());
         }
         return this->getScriptObject();
@@ -1345,27 +1152,20 @@ Local<Value> NbtListClass::setFloat(const Arguments& args)
     CATCH("Fail in NBT SetFloat!");
 }
 
-Local<Value> NbtListClass::setDouble(const Arguments& args)
-{
+Local<Value> NbtListClass::setDouble(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::Double)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::Double) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asDoubleTag()->set(args[1].asNumber().toDouble());
         }
         return this->getScriptObject();
@@ -1373,27 +1173,20 @@ Local<Value> NbtListClass::setDouble(const Arguments& args)
     CATCH("Fail in NBT SetDouble!");
 }
 
-Local<Value> NbtListClass::setString(const Arguments& args)
-{
+Local<Value> NbtListClass::setString(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::String)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::String) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             list[index]->asStringTag()->set(args[1].toStr());
         }
 
@@ -1402,27 +1195,20 @@ Local<Value> NbtListClass::setString(const Arguments& args)
     CATCH("Fail in NBT SetString!");
 }
 
-Local<Value> NbtListClass::setByteArray(const Arguments& args)
-{
+Local<Value> NbtListClass::setByteArray(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
     CHECK_ARG_TYPE(args[1], ValueKind::kByteBuffer);
 
-    try
-    {
+    try {
         auto list = nbt->get();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
-        }
-        else if (list[0]->getTagType() != Tag::Type::ByteArray)
-        {
+        } else if (list[0]->getTagType() != Tag::Type::ByteArray) {
             LOG_ERROR_WITH_SCRIPT_INFO("Set wrong type of element into NBT List!");
-        }
-        else
-        {
+        } else {
             auto data = args[1].asByteBuffer();
             list[index]->asByteArrayTag()->set(TagMemoryChunk((char*)data.getRawBytes(), data.byteLength()));
         }
@@ -1431,68 +1217,42 @@ Local<Value> NbtListClass::setByteArray(const Arguments& args)
     CATCH("Fail in NBT SetByteArray!");
 }
 
-Local<Value> NbtListClass::setTag(const Arguments& args)
-{
+Local<Value> NbtListClass::setTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
-        auto &list = nbt->value();
+    try {
+        auto& list = nbt->value();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
             return Local<Value>();
         }
 
-        if (IsInstanceOf<NbtEndClass>(args[1]))
-        {
+        if (IsInstanceOf<NbtEndClass>(args[1])) {
             list[index] = NbtEndClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtByteClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtByteClass>(args[1])) {
             list[index] = NbtByteClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtShortClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtShortClass>(args[1])) {
             list[index] = NbtShortClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtIntClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtIntClass>(args[1])) {
             list[index] = NbtIntClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtLongClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtLongClass>(args[1])) {
             list[index] = NbtLongClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtFloatClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtFloatClass>(args[1])) {
             list[index] = NbtFloatClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtDoubleClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtDoubleClass>(args[1])) {
             list[index] = NbtDoubleClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtStringClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtStringClass>(args[1])) {
             list[index] = NbtStringClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtByteArrayClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtByteArrayClass>(args[1])) {
             list[index] = NbtByteArrayClass::extract(args[1])->copy().release();
-        }
-        else if (IsInstanceOf<NbtListClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtListClass>(args[1])) {
             list[index] = NbtListClass::extract(args[1])->copyList().release();
-        }
-        else if (IsInstanceOf<NbtCompoundClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtCompoundClass>(args[1])) {
             list[index] = NbtCompoundClass::extract(args[1])->clone().release();
-        }
-        else
-        {
+        } else {
             LOG_ERROR_WITH_SCRIPT_INFO("Unknown type! Cannot set Tag into List");
             return Local<Value>();
         }
@@ -1501,58 +1261,33 @@ Local<Value> NbtListClass::setTag(const Arguments& args)
     CATCH("Fail in NBT SetTag!");
 }
 
-Local<Value> NbtListClass::addTag(const Arguments& args)
-{
+Local<Value> NbtListClass::addTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
-    try
-    {
-        if (IsInstanceOf<NbtEndClass>(args[0]))
-        {
+    try {
+        if (IsInstanceOf<NbtEndClass>(args[0])) {
             nbt->add(NbtEndClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtByteClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtByteClass>(args[0])) {
             nbt->add(NbtByteClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtShortClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtShortClass>(args[0])) {
             nbt->add(NbtShortClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtIntClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtIntClass>(args[0])) {
             nbt->add(NbtIntClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtLongClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtLongClass>(args[0])) {
             nbt->add(NbtLongClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtFloatClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtFloatClass>(args[0])) {
             nbt->add(NbtFloatClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtDoubleClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtDoubleClass>(args[0])) {
             nbt->add(NbtDoubleClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtStringClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtStringClass>(args[0])) {
             nbt->add(NbtStringClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtByteArrayClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtByteArrayClass>(args[0])) {
             nbt->add(NbtByteArrayClass::extract(args[0])->copy());
-        }
-        else if (IsInstanceOf<NbtListClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtListClass>(args[0])) {
             nbt->add(NbtListClass::extract(args[0])->copyList());
-        }
-        else if (IsInstanceOf<NbtCompoundClass>(args[0]))
-        {
+        } else if (IsInstanceOf<NbtCompoundClass>(args[0])) {
             nbt->add(NbtCompoundClass::extract(args[0])->clone());
-        }
-        else
-        {
+        } else {
             LOG_ERROR_WITH_SCRIPT_INFO("Unknown type! Cannot add Tag into List");
             return Local<Value>();
         }
@@ -1561,40 +1296,34 @@ Local<Value> NbtListClass::addTag(const Arguments& args)
     CATCH("Fail in NBT AddTag!");
 }
 
-Local<Value> NbtListClass::removeTag(const Arguments& args)
-{
+Local<Value> NbtListClass::removeTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             LOG_ERROR_WITH_SCRIPT_INFO("Bad Index of NBT List!");
             return Local<Value>();
         }
 
-        list.erase(list.begin() + index);       //===== delete?
+        list.erase(list.begin() + index); //===== delete?
         return this->getScriptObject();
     }
     CATCH("Fail in NBT SetTag!");
 }
 
-Local<Value> NbtListClass::getData(const Arguments& args)
-{
+Local<Value> NbtListClass::getData(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             return Local<Value>();
         }
 
@@ -1603,75 +1332,68 @@ Local<Value> NbtListClass::getData(const Arguments& args)
     CATCH("Fail in NBTgetData!")
 }
 
-Local<Value> NbtListClass::getTag(const Arguments& args)
-{
+Local<Value> NbtListClass::getTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto index = args[0].toInt();
 
-        if (index >= list.size() || index < 0)
-        {
+        if (index >= list.size() || index < 0) {
             return Local<Value>();
         }
 
         Local<Value> res;
-        switch (list[index]->getTagType())
-        {
-        case Tag::Type::End:
-            res = NbtEndClass::pack(list[index]->asEndTag(), true);     //share ptr
-            break;
-        case Tag::Type::Byte:
-            res = NbtByteClass::pack(list[index]->asByteTag(), true);     //share ptr
-            break;
-        case Tag::Type::Short:
-            res = NbtShortClass::pack(list[index]->asShortTag(), true);     //share ptr
-            break;
-        case Tag::Type::Int:
-            res = NbtIntClass::pack(list[index]->asIntTag(), true);     //share ptr
-            break;
-        case Tag::Type::Int64:
-            res = NbtLongClass::pack(list[index]->asInt64Tag(), true);     //share ptr
-            break;
-        case Tag::Type::Float:
-            res = NbtFloatClass::pack(list[index]->asFloatTag(), true);     //share ptr
-            break;
-        case Tag::Type::Double:
-            res = NbtDoubleClass::pack(list[index]->asDoubleTag(), true);     //share ptr
-            break;
-        case Tag::Type::String:
-            res = NbtStringClass::pack(list[index]->asStringTag(), true);     //share ptr
-            break;
-        case Tag::Type::ByteArray:
-            res = NbtByteArrayClass::pack(list[index]->asByteArrayTag(), true);     //share ptr
-            break;
-        case Tag::Type::List:
-            res = NbtListClass::pack(list[index]->asListTag(), true);     //share ptr
-            break;
-        case Tag::Type::Compound:
-            res = NbtCompoundClass::pack(list[index]->asCompoundTag(), true);     //share ptr
-            break;
-        default:
-            res = Local<Value>();
-            break;
+        switch (list[index]->getTagType()) {
+            case Tag::Type::End:
+                res = NbtEndClass::pack(list[index]->asEndTag(), true); // share ptr
+                break;
+            case Tag::Type::Byte:
+                res = NbtByteClass::pack(list[index]->asByteTag(), true); // share ptr
+                break;
+            case Tag::Type::Short:
+                res = NbtShortClass::pack(list[index]->asShortTag(), true); // share ptr
+                break;
+            case Tag::Type::Int:
+                res = NbtIntClass::pack(list[index]->asIntTag(), true); // share ptr
+                break;
+            case Tag::Type::Int64:
+                res = NbtLongClass::pack(list[index]->asInt64Tag(), true); // share ptr
+                break;
+            case Tag::Type::Float:
+                res = NbtFloatClass::pack(list[index]->asFloatTag(), true); // share ptr
+                break;
+            case Tag::Type::Double:
+                res = NbtDoubleClass::pack(list[index]->asDoubleTag(), true); // share ptr
+                break;
+            case Tag::Type::String:
+                res = NbtStringClass::pack(list[index]->asStringTag(), true); // share ptr
+                break;
+            case Tag::Type::ByteArray:
+                res = NbtByteArrayClass::pack(list[index]->asByteArrayTag(), true); // share ptr
+                break;
+            case Tag::Type::List:
+                res = NbtListClass::pack(list[index]->asListTag(), true); // share ptr
+                break;
+            case Tag::Type::Compound:
+                res = NbtCompoundClass::pack(list[index]->asCompoundTag(), true); // share ptr
+                break;
+            default:
+                res = Local<Value>();
+                break;
         }
         return res;
     }
     CATCH("Fail in NBT GetTag!");
 }
 
-Local<Value> NbtListClass::toArray(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtListClass::toArray(const Arguments& args) {
+    try {
         auto& list = nbt->value();
         Local<Array> arr = Array::newArray();
 
-        for (auto& tag : list)
-        {
+        for (auto& tag : list) {
             arr.add(Tag2Value(tag, true));
         }
         return arr;
@@ -1679,13 +1401,11 @@ Local<Value> NbtListClass::toArray(const Arguments& args)
     CATCH("Fail in NBTtoArray!");
 }
 
-Local<Value> NbtListClass::toString(const Arguments& args)
-{
+Local<Value> NbtListClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
@@ -1695,25 +1415,20 @@ Local<Value> NbtListClass::toString(const Arguments& args)
 //////////////////// Classes NbtCompound ////////////////////
 
 NbtCompoundClass::NbtCompoundClass(const Local<Object>& scriptObj, std::unique_ptr<CompoundTag> p)
-    :ScriptClass(scriptObj)
-{
+: ScriptClass(scriptObj) {
     nbt = std::move(p);
 }
 
 NbtCompoundClass::NbtCompoundClass(std::unique_ptr<CompoundTag> p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<NbtCompoundClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<NbtCompoundClass>{}) {
     nbt = std::move(p);
 }
 
 ////////////////// Helper //////////////////
-void NbtCompoundClassAddHelper(CompoundTag* tag, Local<Object>& obj)
-{
+void NbtCompoundClassAddHelper(CompoundTag* tag, Local<Object>& obj) {
     auto keys = obj.getKeyNames();
-    if (keys.size() > 0)
-    {
-        for (int i = 0; i < keys.size(); ++i)
-        {
+    if (keys.size() > 0) {
+        for (int i = 0; i < keys.size(); ++i) {
             Local<Value> t = obj.get(keys[i]);
             if (IsInstanceOf<NbtEndClass>(t))
                 tag->put(keys[i], NbtEndClass::extract(obj.get(keys[i]))->copy());
@@ -1737,35 +1452,28 @@ void NbtCompoundClassAddHelper(CompoundTag* tag, Local<Object>& obj)
                 tag->put(keys[i], NbtListClass::extract(obj.get(keys[i]))->copyList());
             else if (IsInstanceOf<NbtCompoundClass>(t))
                 tag->put(keys[i], NbtCompoundClass::extract(obj.get(keys[i]))->clone());
-            else if (t.isArray())
-            {
+            else if (t.isArray()) {
                 auto arrTag = ListTag::create();
                 auto data = obj.get(keys[i]).asArray();
                 NbtListClassAddHelper(arrTag.get(), data);
                 tag->put(keys[i], std::move(arrTag));
-            }
-            else if (t.isObject())
-            {
+            } else if (t.isObject()) {
                 auto objTag = CompoundTag::create();
                 auto data = obj.get(keys[i]).asObject();
                 NbtCompoundClassAddHelper(objTag.get(), data);
                 tag->put(keys[i], std::move(objTag));
-            }
-            else
-            {
+            } else {
                 LOG_ERROR_WITH_SCRIPT_INFO("Wrong Type of data to set into NBT Compound!");
             }
         }
     }
 }
 
-NbtCompoundClass* NbtCompoundClass::constructor(const Arguments& args)
-{
+NbtCompoundClass* NbtCompoundClass::constructor(const Arguments& args) {
     try {
         auto tag = CompoundTag::create();
 
-        if (args.size() >= 1 && args[0].isObject())
-        {
+        if (args.size() >= 1 && args[0].isObject()) {
             auto obj = args[0].asObject();
             NbtCompoundClassAddHelper(tag.get(), obj);
         }
@@ -1775,54 +1483,44 @@ NbtCompoundClass* NbtCompoundClass::constructor(const Arguments& args)
     CATCH_C("Fail in Create ListTag!");
 }
 
-CompoundTag* NbtCompoundClass::extract(Local<Value> v)
-{
+CompoundTag* NbtCompoundClass::extract(Local<Value> v) {
     if (EngineScope::currentEngine()->isInstanceOf<NbtCompoundClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<NbtCompoundClass>(v)->nbt.get();
     else
         return nullptr;
 }
 
-Local<Value> NbtCompoundClass::pack(CompoundTag* tag, bool noDelete)
-{
-    try
-    {
-        if (noDelete)           // unique_ptr 共享指针 + noDelete
+Local<Value> NbtCompoundClass::pack(CompoundTag* tag, bool noDelete) {
+    try {
+        if (noDelete) // unique_ptr 共享指针 + noDelete
         {
             std::unique_ptr<CompoundTag> nbt(tag);
             auto* nbtObj = new NbtCompoundClass(std::move(nbt));
             nbtObj->canDelete = false;
             return nbtObj->getScriptObject();
-        }
-        else
+        } else
             return (new NbtCompoundClass(tag->clone()))->getScriptObject();
     }
     CATCH("Fail in construct NbtCompound!");
 }
 
-Local<Value> NbtCompoundClass::pack(std::unique_ptr<CompoundTag> tag)
-{
-    try
-    {
+Local<Value> NbtCompoundClass::pack(std::unique_ptr<CompoundTag> tag) {
+    try {
         return (new NbtCompoundClass(std::move(tag)))->getScriptObject();
     }
     CATCH("Fail in construct NbtCompound!");
 }
 
-Local<Value> NbtCompoundClass::getType(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::getType(const Arguments& args) {
     return Number::newNumber((int)Tag::Type::Compound);
 }
 
 
-Local<Value> NbtCompoundClass::getKeys(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtCompoundClass::getKeys(const Arguments& args) {
+    try {
         Local<Array> arr = Array::newArray();
         auto& list = nbt->value();
-        for (auto& [k, v] : list)
-        {
+        for (auto& [k, v] : list) {
             arr.add(String::newString(k));
         }
 
@@ -1831,32 +1529,26 @@ Local<Value> NbtCompoundClass::getKeys(const Arguments& args)
     CATCH("Fail in NBT GetKeys!");
 }
 
-Local<Value> NbtCompoundClass::getTypeOf(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::getTypeOf(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto key = args[0].toStr();
 
         return Number::newNumber(int(list.at(key).getTagType()));
-    }
-    catch (const out_of_range& e)
-    {
+    } catch (const out_of_range& e) {
         return Local<Value>();
     }
     CATCH("Fail in NBT GetTypeOf!");
 }
 
-Local<Value> NbtCompoundClass::setEnd(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setEnd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         nbt->putByte(key, (char)0);
 
@@ -1865,14 +1557,12 @@ Local<Value> NbtCompoundClass::setEnd(const Arguments& args)
     CATCH("Fail in NBT SetEnd!");
 }
 
-Local<Value> NbtCompoundClass::setByte(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setByte(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = char(args[1].toInt());
         nbt->putByte(key, data);
@@ -1882,14 +1572,12 @@ Local<Value> NbtCompoundClass::setByte(const Arguments& args)
     CATCH("Fail in NBT SetByte!");
 }
 
-Local<Value> NbtCompoundClass::setInt(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setInt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = int(args[1].toInt());
         nbt->putInt(key, data);
@@ -1899,14 +1587,12 @@ Local<Value> NbtCompoundClass::setInt(const Arguments& args)
     CATCH("Fail in NBT SetInt!");
 }
 
-Local<Value> NbtCompoundClass::setShort(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setShort(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = short(args[1].toInt());
         nbt->putShort(key, data);
@@ -1916,14 +1602,12 @@ Local<Value> NbtCompoundClass::setShort(const Arguments& args)
     CATCH("Fail in NBT SetShort!");
 }
 
-Local<Value> NbtCompoundClass::setLong(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setLong(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = args[1].asNumber().toInt64();
         nbt->putInt64(key, data);
@@ -1933,14 +1617,12 @@ Local<Value> NbtCompoundClass::setLong(const Arguments& args)
     CATCH("Fail in NBT SetLong!");
 }
 
-Local<Value> NbtCompoundClass::setFloat(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setFloat(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = args[1].asNumber().toFloat();
         nbt->putFloat(key, data);
@@ -1950,14 +1632,12 @@ Local<Value> NbtCompoundClass::setFloat(const Arguments& args)
     CATCH("Fail in NBT SetFloat!");
 }
 
-Local<Value> NbtCompoundClass::setDouble(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setDouble(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto key = args[0].toStr();
         auto data = args[1].asNumber().toDouble();
@@ -1968,14 +1648,12 @@ Local<Value> NbtCompoundClass::setDouble(const Arguments& args)
     CATCH("Fail in NBT SetDouble!");
 }
 
-Local<Value> NbtCompoundClass::setString(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setString(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = args[1].toStr();
         nbt->putString(key, data);
@@ -1985,14 +1663,12 @@ Local<Value> NbtCompoundClass::setString(const Arguments& args)
     CATCH("Fail in NBT SetString!");
 }
 
-Local<Value> NbtCompoundClass::setByteArray(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setByteArray(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kByteBuffer);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
         auto data = args[1].asByteBuffer();
 
@@ -2002,61 +1678,36 @@ Local<Value> NbtCompoundClass::setByteArray(const Arguments& args)
     CATCH("Fail in NBT SetString!");
 }
 
-Local<Value> NbtCompoundClass::setTag(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::setTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
 
-        if (IsInstanceOf<NbtEndClass>(args[1]))
-        {
+        if (IsInstanceOf<NbtEndClass>(args[1])) {
             nbt->put(key, std::move(NbtEndClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtByteClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtByteClass>(args[1])) {
             nbt->put(key, std::move(NbtByteClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtShortClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtShortClass>(args[1])) {
             nbt->put(key, std::move(NbtShortClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtIntClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtIntClass>(args[1])) {
             nbt->put(key, std::move(NbtIntClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtLongClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtLongClass>(args[1])) {
             nbt->put(key, std::move(NbtLongClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtFloatClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtFloatClass>(args[1])) {
             nbt->put(key, std::move(NbtFloatClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtDoubleClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtDoubleClass>(args[1])) {
             nbt->put(key, std::move(NbtDoubleClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtStringClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtStringClass>(args[1])) {
             nbt->put(key, std::move(NbtStringClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtByteArrayClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtByteArrayClass>(args[1])) {
             nbt->put(key, std::move(NbtByteArrayClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtListClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtListClass>(args[1])) {
             nbt->put(key, std::move(NbtListClass::extract(args[1])->copy()));
-        }
-        else if (IsInstanceOf<NbtCompoundClass>(args[1]))
-        {
+        } else if (IsInstanceOf<NbtCompoundClass>(args[1])) {
             nbt->put(key, std::move(NbtCompoundClass::extract(args[1])->copy()));
-        }
-        else
-        {
+        } else {
             LOG_ERROR_WITH_SCRIPT_INFO("Unknown type! Cannot set Tag into Compound");
             return Local<Value>();
         }
@@ -2065,113 +1716,97 @@ Local<Value> NbtCompoundClass::setTag(const Arguments& args)
     CATCH("Fail in NBT SetTag!");
 }
 
-Local<Value> NbtCompoundClass::removeTag(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::removeTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto key = args[0].toStr();
 
         list.erase(key);
         return this->getScriptObject();
-    }
-    catch (const out_of_range& e)
-    {
+    } catch (const out_of_range& e) {
         LOG_ERROR_WITH_SCRIPT_INFO("Key no found in NBT Compound!");
         return Local<Value>();
     }
     CATCH("Fail in NBT RemoveTag!");
 }
 
-Local<Value> NbtCompoundClass::getData(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::getData(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto& list = nbt->value();
         auto key = args[0].toStr();
 
         return Tag2Value(list.at(key).asTag());
-    }
-    catch (const out_of_range& e)
-    {
+    } catch (const out_of_range& e) {
         return Local<Value>();
     }
     CATCH("Fail in NBT GetData!")
 }
 
-Local<Value> NbtCompoundClass::getTag(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::getTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         auto key = args[0].toStr();
 
         Local<Value> res;
-        switch (nbt->value().at(key).getTagType())
-        {
-        case Tag::Type::End:
-            res = NbtEndClass::pack(nbt->value().at(key).asEndTag(), true);     //share ptr
-            break;
-        case Tag::Type::Byte:
-            res = NbtByteClass::pack((ByteTag*)nbt->getByteTag(key), true);     //share ptr
-            break;
-        case Tag::Type::Short:
-            res = NbtShortClass::pack((ShortTag*)nbt->getShortTag(key), true);     //share ptr
-            break;
-        case Tag::Type::Int:
-            res = NbtIntClass::pack((IntTag*)nbt->getIntTag(key), true);     //share ptr
-            break;
-        case Tag::Type::Int64:
-            res = NbtLongClass::pack((Int64Tag*)nbt->getInt64Tag(key), true);     //share ptr
-            break;
-        case Tag::Type::Float:
-            res = NbtFloatClass::pack((FloatTag*)nbt->getFloatTag(key), true);     //share ptr
-            break;
-        case Tag::Type::Double:
-            res = NbtDoubleClass::pack((DoubleTag*)nbt->getDoubleTag(key), true);     //share ptr
-            break;
-        case Tag::Type::String:
-            res = NbtStringClass::pack((StringTag*)nbt->getStringTag(key), true);     //share ptr
-            break;
-        case Tag::Type::ByteArray:
-            res = NbtByteArrayClass::pack((ByteArrayTag*)nbt->getByteArrayTag(key), true);     //share ptr
-            break;
-        case Tag::Type::List:
-            res = NbtListClass::pack((ListTag*)nbt->getListTag(key), true);     //share ptr
-            break;
-        case Tag::Type::Compound:
-            res = NbtCompoundClass::pack((CompoundTag*)nbt->getCompoundTag(key), true);     //share ptr
-            break;
-        default:
-            res = Local<Value>();
-            break;
+        switch (nbt->value().at(key).getTagType()) {
+            case Tag::Type::End:
+                res = NbtEndClass::pack(nbt->value().at(key).asEndTag(), true); // share ptr
+                break;
+            case Tag::Type::Byte:
+                res = NbtByteClass::pack((ByteTag*)nbt->getByteTag(key), true); // share ptr
+                break;
+            case Tag::Type::Short:
+                res = NbtShortClass::pack((ShortTag*)nbt->getShortTag(key), true); // share ptr
+                break;
+            case Tag::Type::Int:
+                res = NbtIntClass::pack((IntTag*)nbt->getIntTag(key), true); // share ptr
+                break;
+            case Tag::Type::Int64:
+                res = NbtLongClass::pack((Int64Tag*)nbt->getInt64Tag(key), true); // share ptr
+                break;
+            case Tag::Type::Float:
+                res = NbtFloatClass::pack((FloatTag*)nbt->getFloatTag(key), true); // share ptr
+                break;
+            case Tag::Type::Double:
+                res = NbtDoubleClass::pack((DoubleTag*)nbt->getDoubleTag(key), true); // share ptr
+                break;
+            case Tag::Type::String:
+                res = NbtStringClass::pack((StringTag*)nbt->getStringTag(key), true); // share ptr
+                break;
+            case Tag::Type::ByteArray:
+                res = NbtByteArrayClass::pack((ByteArrayTag*)nbt->getByteArrayTag(key), true); // share ptr
+                break;
+            case Tag::Type::List:
+                res = NbtListClass::pack((ListTag*)nbt->getListTag(key), true); // share ptr
+                break;
+            case Tag::Type::Compound:
+                res = NbtCompoundClass::pack((CompoundTag*)nbt->getCompoundTag(key), true); // share ptr
+                break;
+            default:
+                res = Local<Value>();
+                break;
         }
         return res;
-    }
-    catch (const out_of_range& e)
-    {
+    } catch (const out_of_range& e) {
         return Local<Value>();
     }
     CATCH("Fail in NBT GetTag!");
 }
 
-Local<Value> NbtCompoundClass::toObject(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtCompoundClass::toObject(const Arguments& args) {
+    try {
         auto& comp = nbt->value();
         Local<Object> obj = Object::newObject();
 
-        for (auto& [k, v] : comp)
-        {
+        for (auto& [k, v] : comp) {
             obj.set(k, Tag2Value(v.asTag(), true));
         }
         return obj;
@@ -2179,10 +1814,8 @@ Local<Value> NbtCompoundClass::toObject(const Arguments& args)
     CATCH("Fail in NBT ToObject!");
 }
 
-Local<Value> NbtCompoundClass::toSNBT(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtCompoundClass::toSNBT(const Arguments& args) {
+    try {
         int indent = args.size() >= 1 ? args[0].toInt() : -1;
         if (indent == -1)
             return String::newString(nbt->toSNBT(0, SnbtFormat::Minimize));
@@ -2192,37 +1825,31 @@ Local<Value> NbtCompoundClass::toSNBT(const Arguments& args)
     CATCH("Fail in toSNBT!");
 }
 
-Local<Value> NbtCompoundClass::toBinaryNBT(const Arguments& args)
-{
-    try
-    {
+Local<Value> NbtCompoundClass::toBinaryNBT(const Arguments& args) {
+    try {
         auto res = nbt->toBinaryNBT();
         return ByteBuffer::newByteBuffer(res.data(), res.size());
     }
     CATCH("Fail in toBinaryNBT!");
 }
 
-Local<Value> NbtCompoundClass::toString(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::toString(const Arguments& args) {
     if (args.size() >= 1)
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
-    try
-    {
+    try {
         return String::newString(nbt->toJson(args.size() >= 1 ? args[0].toInt() : -1));
     }
     CATCH("Fail in NBTtoJson!");
 }
 
-Local<Value> NbtCompoundClass::destroy(const Arguments& args)
-{
+Local<Value> NbtCompoundClass::destroy(const Arguments& args) {
     return Boolean::newBoolean(true);
 }
 
 //////////////////// APIs ////////////////////
 
-Local<Value> NbtStatic::newTag(const Arguments& args)
-{
+Local<Value> NbtStatic::newTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -2230,132 +1857,108 @@ Local<Value> NbtStatic::newTag(const Arguments& args)
         auto type = args[0].toInt();
 
         Local<Value> res;
-        switch (type)
-        {
-        case Tag::Type::End:
-        {
-            auto tag = EndTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set();
+        switch (type) {
+            case Tag::Type::End: {
+                auto tag = EndTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set();
+                }
+                res = NbtEndClass::pack(std::move(tag));
+                break;
             }
-            res = NbtEndClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Byte:
-        {
-            auto tag = ByteTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].toInt());
+            case Tag::Type::Byte: {
+                auto tag = ByteTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].toInt());
+                }
+                res = NbtByteClass::pack(std::move(tag));
+                break;
             }
-            res = NbtByteClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Short:
-        {
-            auto tag = ShortTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].toInt());
+            case Tag::Type::Short: {
+                auto tag = ShortTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].toInt());
+                }
+                res = NbtShortClass::pack(std::move(tag));
+                break;
             }
-            res = NbtShortClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Int:
-        {
-            auto tag = IntTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].toInt());
+            case Tag::Type::Int: {
+                auto tag = IntTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].toInt());
+                }
+                res = NbtIntClass::pack(std::move(tag));
+                break;
             }
-            res = NbtIntClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Int64:
-        {
-            auto tag = Int64Tag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].asNumber().toInt64());
+            case Tag::Type::Int64: {
+                auto tag = Int64Tag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].asNumber().toInt64());
+                }
+                res = NbtLongClass::pack(std::move(tag));
+                break;
             }
-            res = NbtLongClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Float:
-        {
-            auto tag = FloatTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].asNumber().toFloat());
+            case Tag::Type::Float: {
+                auto tag = FloatTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].asNumber().toFloat());
+                }
+                res = NbtFloatClass::pack(std::move(tag));
+                break;
             }
-            res = NbtFloatClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Double:
-        {
-            auto tag = DoubleTag::create();
-            if (args.size() >= 2 && args[1].isNumber())
-            {
-                tag->set(args[1].asNumber().toDouble());
+            case Tag::Type::Double: {
+                auto tag = DoubleTag::create();
+                if (args.size() >= 2 && args[1].isNumber()) {
+                    tag->set(args[1].asNumber().toDouble());
+                }
+                res = NbtDoubleClass::pack(std::move(tag));
+                break;
             }
-            res = NbtDoubleClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::String:
-        {
-            auto tag = StringTag::create();
-            if (args.size() >= 2 && args[1].isString())
-            {
-                tag->set(args[1].toStr());
+            case Tag::Type::String: {
+                auto tag = StringTag::create();
+                if (args.size() >= 2 && args[1].isString()) {
+                    tag->set(args[1].toStr());
+                }
+                res = NbtStringClass::pack(std::move(tag));
+                break;
             }
-            res = NbtStringClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::ByteArray:
-        {
-            auto tag = ByteArrayTag::create();
-            if (args.size() >= 2 && args[1].isByteBuffer())
-            {
-                Local<ByteBuffer> buf = args[1].asByteBuffer();
-                tag->set(TagMemoryChunk((char*)buf.getRawBytes(), buf.byteLength()));
+            case Tag::Type::ByteArray: {
+                auto tag = ByteArrayTag::create();
+                if (args.size() >= 2 && args[1].isByteBuffer()) {
+                    Local<ByteBuffer> buf = args[1].asByteBuffer();
+                    tag->set(TagMemoryChunk((char*)buf.getRawBytes(), buf.byteLength()));
+                }
+                res = NbtByteArrayClass::pack(std::move(tag));
+                break;
             }
-            res = NbtByteArrayClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::List:
-        {
-            auto tag = ListTag::create();
-            if (args.size() >= 2 && args[1].isArray())
-            {
-                Local<Array> arr = args[1].asArray();
-                NbtListClassAddHelper(tag.get(), arr);
+            case Tag::Type::List: {
+                auto tag = ListTag::create();
+                if (args.size() >= 2 && args[1].isArray()) {
+                    Local<Array> arr = args[1].asArray();
+                    NbtListClassAddHelper(tag.get(), arr);
+                }
+                res = NbtListClass::pack(std::move(tag));
+                break;
             }
-            res = NbtListClass::pack(std::move(tag));
-            break;
-        }
-        case Tag::Type::Compound:
-        {
-            auto tag = CompoundTag::create();
-            if (args.size() >= 2 && args[1].isObject())
-            {
-                Local<Object> obj = args[1].asObject();
-                NbtCompoundClassAddHelper(tag.get(), obj);
+            case Tag::Type::Compound: {
+                auto tag = CompoundTag::create();
+                if (args.size() >= 2 && args[1].isObject()) {
+                    Local<Object> obj = args[1].asObject();
+                    NbtCompoundClassAddHelper(tag.get(), obj);
+                }
+                res = NbtCompoundClass::pack(std::move(tag));
+                break;
             }
-            res = NbtCompoundClass::pack(std::move(tag));
-            break;
-        }
-        default:
-            res = Local<Value>();
-            break;
+            default:
+                res = Local<Value>();
+                break;
         }
         return res;
     }
     CATCH("Fail in NBT CreateTag!");
 }
 
-Local<Value> NbtStatic::parseSNBT(const Arguments& args)
-{
+Local<Value> NbtStatic::parseSNBT(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -2369,8 +1972,7 @@ Local<Value> NbtStatic::parseSNBT(const Arguments& args)
     CATCH("Fail in parseSNBT!");
 }
 
-Local<Value> NbtStatic::parseBinaryNBT(const Arguments& args)
-{
+Local<Value> NbtStatic::parseBinaryNBT(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kByteBuffer);
 
@@ -2388,14 +1990,8 @@ Local<Value> NbtStatic::parseBinaryNBT(const Arguments& args)
 
 //////////////////// Helper ////////////////////
 
-bool IsNbtClass(Local<Value> value)
-{
-    return IsInstanceOf<NbtEndClass>(value) || IsInstanceOf<NbtByteClass>(value)
-        || IsInstanceOf<NbtShortClass>(value) || IsInstanceOf<NbtIntClass>(value)
-        || IsInstanceOf<NbtLongClass>(value) || IsInstanceOf<NbtFloatClass>(value)
-        || IsInstanceOf<NbtDoubleClass>(value) || IsInstanceOf<NbtStringClass>(value)
-        || IsInstanceOf<NbtByteArrayClass>(value) || IsInstanceOf<NbtListClass>(value)
-        || IsInstanceOf<NbtCompoundClass>(value);
+bool IsNbtClass(Local<Value> value) {
+    return IsInstanceOf<NbtEndClass>(value) || IsInstanceOf<NbtByteClass>(value) || IsInstanceOf<NbtShortClass>(value) || IsInstanceOf<NbtIntClass>(value) || IsInstanceOf<NbtLongClass>(value) || IsInstanceOf<NbtFloatClass>(value) || IsInstanceOf<NbtDoubleClass>(value) || IsInstanceOf<NbtStringClass>(value) || IsInstanceOf<NbtByteArrayClass>(value) || IsInstanceOf<NbtListClass>(value) || IsInstanceOf<NbtCompoundClass>(value);
 }
 
 
@@ -2403,173 +1999,162 @@ bool IsNbtClass(Local<Value> value)
 
 Local<Value> Tag2Value_CompoundHelper(CompoundTag* nbt, bool autoExpansion = false);
 
-Local<Value> Tag2Value_ListHelper(ListTag* nbt, bool autoExpansion = false)
-{
+Local<Value> Tag2Value_ListHelper(ListTag* nbt, bool autoExpansion = false) {
     Local<Array> res = Array::newArray();
 
     auto& list = nbt->asListTag()->value();
-    for (auto& tag : list)
-    {
-        switch (tag->getTagType())
-        {
-        case Tag::Type::End:
-            res.add(Local<Value>());
-            break;
-        case Tag::Type::Byte:
-            res.add(Number::newNumber(tag->asByteTag()->value()));
-            break;
-        case Tag::Type::Short:
-            res.add(Number::newNumber(tag->asShortTag()->value()));
-            break;
-        case Tag::Type::Int:
-            res.add(Number::newNumber(tag->asIntTag()->value()));
-            break;
-        case Tag::Type::Int64:
-            res.add(Number::newNumber(tag->asInt64Tag()->value()));
-            break;
-        case Tag::Type::Float:
-            res.add(Number::newNumber(tag->asFloatTag()->value()));
-            break;
-        case Tag::Type::Double:
-            res.add(Number::newNumber(tag->asDoubleTag()->value()));
-            break;
-        case Tag::Type::String:
-            res.add(String::newString(tag->asStringTag()->value()));
-            break;
-        case Tag::Type::ByteArray:
-        {
-            auto& data = tag->asByteArrayTag()->value();
-            res.add(ByteBuffer::newByteBuffer(data.data.get(), data.size));
-            break;
-        }
-        case Tag::Type::List:
-            if (!autoExpansion)
-                res.add(NbtListClass::pack(tag->asListTag()));
-            else
-                res.add(Tag2Value_ListHelper(tag->asListTag(), autoExpansion));
-            break;
-        case Tag::Type::Compound:
-            if (!autoExpansion)
-                res.add(NbtCompoundClass::pack(tag->asCompoundTag()));
-            else
-                res.add(Tag2Value_CompoundHelper(tag->asCompoundTag(), autoExpansion));
-        default:
-            res.add(Local<Value>());
-            break;
+    for (auto& tag : list) {
+        switch (tag->getTagType()) {
+            case Tag::Type::End:
+                res.add(Local<Value>());
+                break;
+            case Tag::Type::Byte:
+                res.add(Number::newNumber(tag->asByteTag()->value()));
+                break;
+            case Tag::Type::Short:
+                res.add(Number::newNumber(tag->asShortTag()->value()));
+                break;
+            case Tag::Type::Int:
+                res.add(Number::newNumber(tag->asIntTag()->value()));
+                break;
+            case Tag::Type::Int64:
+                res.add(Number::newNumber(tag->asInt64Tag()->value()));
+                break;
+            case Tag::Type::Float:
+                res.add(Number::newNumber(tag->asFloatTag()->value()));
+                break;
+            case Tag::Type::Double:
+                res.add(Number::newNumber(tag->asDoubleTag()->value()));
+                break;
+            case Tag::Type::String:
+                res.add(String::newString(tag->asStringTag()->value()));
+                break;
+            case Tag::Type::ByteArray: {
+                auto& data = tag->asByteArrayTag()->value();
+                res.add(ByteBuffer::newByteBuffer(data.data.get(), data.size));
+                break;
+            }
+            case Tag::Type::List:
+                if (!autoExpansion)
+                    res.add(NbtListClass::pack(tag->asListTag()));
+                else
+                    res.add(Tag2Value_ListHelper(tag->asListTag(), autoExpansion));
+                break;
+            case Tag::Type::Compound:
+                if (!autoExpansion)
+                    res.add(NbtCompoundClass::pack(tag->asCompoundTag()));
+                else
+                    res.add(Tag2Value_CompoundHelper(tag->asCompoundTag(), autoExpansion));
+            default:
+                res.add(Local<Value>());
+                break;
         }
     }
     return res;
 }
 
-Local<Value> Tag2Value_CompoundHelper(CompoundTag* nbt, bool autoExpansion)
-{
+Local<Value> Tag2Value_CompoundHelper(CompoundTag* nbt, bool autoExpansion) {
     Local<Object> res = Object::newObject();
 
     auto& list = nbt->asCompoundTag()->value();
-    for (auto& [key, tag] : list)
-    {
-        switch (tag.getTagType())
-        {
+    for (auto& [key, tag] : list) {
+        switch (tag.getTagType()) {
+            case Tag::Type::End:
+                res.set(key, Local<Value>());
+                break;
+            case Tag::Type::Byte:
+                res.set(key, Number::newNumber(tag.asByteTag()->get()));
+                break;
+            case Tag::Type::Short:
+                res.set(key, Number::newNumber(tag.asShortTag()->get()));
+                break;
+            case Tag::Type::Int:
+                res.set(key, Number::newNumber(tag.asIntTag()->get()));
+                break;
+            case Tag::Type::Int64:
+                res.set(key, Number::newNumber(tag.asInt64Tag()->get()));
+                break;
+            case Tag::Type::Float:
+                res.set(key, Number::newNumber(tag.asFloatTag()->get()));
+                break;
+            case Tag::Type::Double:
+                res.set(key, Number::newNumber(tag.asDoubleTag()->get()));
+                break;
+            case Tag::Type::String:
+                res.set(key, String::newString(tag.asStringTag()->get()));
+                break;
+            case Tag::Type::ByteArray: {
+                auto& data = tag.asByteArrayTag()->value();
+                res.set(key, ByteBuffer::newByteBuffer(data.data.get(), data.size));
+                break;
+            }
+            case Tag::Type::List:
+                if (!autoExpansion)
+                    res.set(key, NbtListClass::pack(tag.asListTag()));
+                else
+                    res.set(key, Tag2Value_ListHelper(tag.asListTag(), autoExpansion));
+                break;
+            case Tag::Type::Compound:
+                if (!autoExpansion)
+                    res.set(key, NbtCompoundClass::pack(tag.asCompoundTag()));
+                else
+                    res.set(key, Tag2Value_CompoundHelper(tag.asCompoundTag(), autoExpansion));
+            default:
+                res.set(key, Local<Value>());
+                break;
+        }
+    }
+    return res;
+}
+
+Local<Value> Tag2Value(Tag* nbt, bool autoExpansion) {
+    Local<Value> value;
+
+    switch (nbt->getTagType()) {
         case Tag::Type::End:
-            res.set(key, Local<Value>());
+            value = Number::newNumber(0);
             break;
         case Tag::Type::Byte:
-            res.set(key, Number::newNumber(tag.asByteTag()->get()));
+            value = Number::newNumber(nbt->asByteTag()->get());
             break;
         case Tag::Type::Short:
-            res.set(key, Number::newNumber(tag.asShortTag()->get()));
+            value = Number::newNumber(nbt->asShortTag()->get());
             break;
         case Tag::Type::Int:
-            res.set(key, Number::newNumber(tag.asIntTag()->get()));
+            value = Number::newNumber(nbt->asIntTag()->get());
             break;
         case Tag::Type::Int64:
-            res.set(key, Number::newNumber(tag.asInt64Tag()->get()));
+            value = Number::newNumber(nbt->asInt64Tag()->get());
             break;
         case Tag::Type::Float:
-            res.set(key, Number::newNumber(tag.asFloatTag()->get()));
+            value = Number::newNumber(nbt->asFloatTag()->get());
             break;
         case Tag::Type::Double:
-            res.set(key, Number::newNumber(tag.asDoubleTag()->get()));
+            value = Number::newNumber(nbt->asDoubleTag()->get());
             break;
         case Tag::Type::String:
-            res.set(key, String::newString(tag.asStringTag()->get()));
+            value = String::newString(nbt->asStringTag()->get());
             break;
-        case Tag::Type::ByteArray:
-        {
-            auto& data = tag.asByteArrayTag()->value();
-            res.set(key, ByteBuffer::newByteBuffer(data.data.get(), data.size));
+        case Tag::Type::ByteArray: {
+            auto& data = nbt->asByteArrayTag()->value();
+            value = ByteBuffer::newByteBuffer(data.data.get(), data.size);
             break;
         }
         case Tag::Type::List:
             if (!autoExpansion)
-                res.set(key, NbtListClass::pack(tag.asListTag()));
+                value = NbtListClass::pack(nbt->asListTag());
             else
-                res.set(key, Tag2Value_ListHelper(tag.asListTag(), autoExpansion));
+                value = Tag2Value_ListHelper(nbt->asListTag(), autoExpansion);
             break;
         case Tag::Type::Compound:
             if (!autoExpansion)
-                res.set(key, NbtCompoundClass::pack(tag.asCompoundTag()));
+                value = NbtCompoundClass::pack(nbt->asCompoundTag());
             else
-                res.set(key, Tag2Value_CompoundHelper(tag.asCompoundTag(), autoExpansion));
+                value = Tag2Value_CompoundHelper(nbt->asCompoundTag(), autoExpansion);
+            break;
         default:
-            res.set(key, Local<Value>());
+            value = Local<Value>();
             break;
-        }
-    }
-    return res;
-}
-
-Local<Value> Tag2Value(Tag* nbt, bool autoExpansion)
-{
-    Local<Value> value;
-
-    switch (nbt->getTagType())
-    {
-    case Tag::Type::End:
-        value = Number::newNumber(0);
-        break;
-    case Tag::Type::Byte:
-        value = Number::newNumber(nbt->asByteTag()->get());
-        break;
-    case Tag::Type::Short:
-        value = Number::newNumber(nbt->asShortTag()->get());
-        break;
-    case Tag::Type::Int:
-        value = Number::newNumber(nbt->asIntTag()->get());
-        break;
-    case Tag::Type::Int64:
-        value = Number::newNumber(nbt->asInt64Tag()->get());
-        break;
-    case Tag::Type::Float:
-        value = Number::newNumber(nbt->asFloatTag()->get());
-        break;
-    case Tag::Type::Double:
-        value = Number::newNumber(nbt->asDoubleTag()->get());
-        break;
-    case Tag::Type::String:
-        value = String::newString(nbt->asStringTag()->get());
-        break;
-    case Tag::Type::ByteArray:
-    {
-        auto& data = nbt->asByteArrayTag()->value();
-        value = ByteBuffer::newByteBuffer(data.data.get(), data.size);
-        break;
-    }
-    case Tag::Type::List:
-        if (!autoExpansion)
-            value = NbtListClass::pack(nbt->asListTag());
-        else
-            value = Tag2Value_ListHelper(nbt->asListTag(), autoExpansion);
-        break;
-    case Tag::Type::Compound:
-        if (!autoExpansion)
-            value = NbtCompoundClass::pack(nbt->asCompoundTag());
-        else
-            value = Tag2Value_CompoundHelper(nbt->asCompoundTag(), autoExpansion);
-        break;
-    default:
-        value = Local<Value>();
-        break;
     }
     return value;
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/NbtAPI.h b/ScriptEngine/API/NbtAPI.h
--- a/ScriptEngine/API/NbtAPI.h
+++ b/ScriptEngine/API/NbtAPI.h
@@ -16,34 +16,34 @@
 extern struct Tag;
 extern ClassDefine<void> NbtStaticBuilder;
 
-//NBT Static
-class NbtStatic : public ScriptClass
-{
+// NBT Static
+class NbtStatic : public ScriptClass {
 public:
     static Local<Value> newTag(const Arguments& args);
     static Local<Value> parseSNBT(const Arguments& args);
     static Local<Value> parseBinaryNBT(const Arguments& args);
 
-    template<Tag::Type T>
-    static Local<Value> getType()
-    {
+    template <Tag::Type T>
+    static Local<Value> getType() {
         return Number::newNumber((int)T);
     }
 };
 extern ClassDefine<void> NbtStaticBuilder;
 
 
-//NBT End
+// NBT End
 class EndTag;
-class NbtEndClass : public ScriptClass
-{
+class NbtEndClass : public ScriptClass {
 public:
     std::unique_ptr<EndTag> nbt;
     bool canDelete = true;
 
     explicit NbtEndClass(const Local<Object>& scriptObj, std::unique_ptr<EndTag> p);
     explicit NbtEndClass(std::unique_ptr<EndTag> p);
-    ~NbtEndClass() { if (!canDelete) nbt.release(); }
+    ~NbtEndClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtEndClass* constructor(const Arguments& args);
     static EndTag* extract(Local<Value> v);
@@ -58,16 +58,18 @@ class NbtEndClass : public ScriptClass
 extern ClassDefine<NbtEndClass> NbtEndClassBuilder;
 
 
-//NBT Byte
-class NbtByteClass : public ScriptClass 
-{
+// NBT Byte
+class NbtByteClass : public ScriptClass {
 public:
     std::unique_ptr<ByteTag> nbt;
     bool canDelete = true;
 
     explicit NbtByteClass(const Local<Object>& scriptObj, std::unique_ptr<ByteTag> p);
     explicit NbtByteClass(std::unique_ptr<ByteTag> p);
-    ~NbtByteClass() { if (!canDelete) nbt.release(); }
+    ~NbtByteClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtByteClass* constructor(const Arguments& args);
     static ByteTag* extract(Local<Value> v);
@@ -82,16 +84,18 @@ class NbtByteClass : public ScriptClass
 extern ClassDefine<NbtByteClass> NbtByteClassBuilder;
 
 
-//NBT Short
-class NbtShortClass : public ScriptClass
-{
+// NBT Short
+class NbtShortClass : public ScriptClass {
 public:
     std::unique_ptr<ShortTag> nbt;
     bool canDelete = true;
 
     explicit NbtShortClass(const Local<Object>& scriptObj, std::unique_ptr<ShortTag> p);
     explicit NbtShortClass(std::unique_ptr<ShortTag> p);
-    ~NbtShortClass() { if (!canDelete) nbt.release(); }
+    ~NbtShortClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtShortClass* constructor(const Arguments& args);
     static ShortTag* extract(Local<Value> v);
@@ -106,22 +110,24 @@ class NbtShortClass : public ScriptClass
 extern ClassDefine<NbtShortClass> NbtShortClassBuilder;
 
 
-//NBT Int
-class NbtIntClass : public ScriptClass
-{
+// NBT Int
+class NbtIntClass : public ScriptClass {
 public:
     std::unique_ptr<IntTag> nbt;
     bool canDelete = true;
 
     explicit NbtIntClass(const Local<Object>& scriptObj, std::unique_ptr<IntTag> p);
     explicit NbtIntClass(std::unique_ptr<IntTag> p);
-    ~NbtIntClass() { if (!canDelete) nbt.release(); }
+    ~NbtIntClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtIntClass* constructor(const Arguments& args);
     static IntTag* extract(Local<Value> v);
     static Local<Value> pack(IntTag* tag, bool noDelete = false);
     static Local<Value> pack(std::unique_ptr<IntTag> tag);
-    
+
     Local<Value> getType(const Arguments& args);
     Local<Value> set(const Arguments& args);
     Local<Value> get(const Arguments& args);
@@ -130,16 +136,18 @@ class NbtIntClass : public ScriptClass
 extern ClassDefine<NbtIntClass> NbtIntClassBuilder;
 
 
-//NBT Long
-class NbtLongClass : public ScriptClass
-{
+// NBT Long
+class NbtLongClass : public ScriptClass {
 public:
     std::unique_ptr<Int64Tag> nbt;
     bool canDelete = true;
 
     explicit NbtLongClass(const Local<Object>& scriptObj, std::unique_ptr<Int64Tag> p);
     explicit NbtLongClass(std::unique_ptr<Int64Tag> p);
-    ~NbtLongClass() { if (!canDelete) nbt.release(); }
+    ~NbtLongClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtLongClass* constructor(const Arguments& args);
     static Int64Tag* extract(Local<Value> v);
@@ -154,16 +162,18 @@ class NbtLongClass : public ScriptClass
 extern ClassDefine<NbtLongClass> NbtLongClassBuilder;
 
 
-//NBT Float
-class NbtFloatClass : public ScriptClass
-{
+// NBT Float
+class NbtFloatClass : public ScriptClass {
 public:
     std::unique_ptr<FloatTag> nbt;
     bool canDelete = true;
 
     explicit NbtFloatClass(const Local<Object>& scriptObj, std::unique_ptr<FloatTag> p);
     explicit NbtFloatClass(std::unique_ptr<FloatTag> p);
-    ~NbtFloatClass() { if (!canDelete) nbt.release(); }
+    ~NbtFloatClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtFloatClass* constructor(const Arguments& args);
     static FloatTag* extract(Local<Value> v);
@@ -178,16 +188,18 @@ class NbtFloatClass : public ScriptClass
 extern ClassDefine<NbtFloatClass> NbtFloatClassBuilder;
 
 
-//NBT Double
-class NbtDoubleClass : public ScriptClass
-{
+// NBT Double
+class NbtDoubleClass : public ScriptClass {
 public:
     std::unique_ptr<DoubleTag> nbt;
     bool canDelete = true;
 
     explicit NbtDoubleClass(const Local<Object>& scriptObj, std::unique_ptr<DoubleTag> p);
     explicit NbtDoubleClass(std::unique_ptr<DoubleTag> p);
-    ~NbtDoubleClass() { if (!canDelete) nbt.release(); }
+    ~NbtDoubleClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtDoubleClass* constructor(const Arguments& args);
     static DoubleTag* extract(Local<Value> v);
@@ -202,16 +214,18 @@ class NbtDoubleClass : public ScriptClass
 extern ClassDefine<NbtDoubleClass> NbtDoubleClassBuilder;
 
 
-//NBT String
-class NbtStringClass : public ScriptClass
-{
+// NBT String
+class NbtStringClass : public ScriptClass {
 public:
     std::unique_ptr<StringTag> nbt;
     bool canDelete = true;
 
     explicit NbtStringClass(const Local<Object>& scriptObj, std::unique_ptr<StringTag> p);
     explicit NbtStringClass(std::unique_ptr<StringTag> p);
-    ~NbtStringClass() { if (!canDelete) nbt.release(); }
+    ~NbtStringClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtStringClass* constructor(const Arguments& args);
     static StringTag* extract(Local<Value> v);
@@ -226,16 +240,18 @@ class NbtStringClass : public ScriptClass
 extern ClassDefine<NbtStringClass> NbtStringClassBuilder;
 
 
-//NBT ByteArray
-class NbtByteArrayClass : public ScriptClass
-{
+// NBT ByteArray
+class NbtByteArrayClass : public ScriptClass {
 public:
     std::unique_ptr<ByteArrayTag> nbt;
     bool canDelete = true;
 
     explicit NbtByteArrayClass(const Local<Object>& scriptObj, std::unique_ptr<ByteArrayTag> p);
     explicit NbtByteArrayClass(std::unique_ptr<ByteArrayTag> p);
-    ~NbtByteArrayClass() { if (!canDelete) nbt.release(); }
+    ~NbtByteArrayClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtByteArrayClass* constructor(const Arguments& args);
     static ByteArrayTag* extract(Local<Value> v);
@@ -250,22 +266,24 @@ class NbtByteArrayClass : public ScriptClass
 extern ClassDefine<NbtByteArrayClass> NbtByteArrayClassBuilder;
 
 
-//NBT List
-class NbtListClass : public ScriptClass
-{
+// NBT List
+class NbtListClass : public ScriptClass {
 public:
     std::unique_ptr<ListTag> nbt;
     bool canDelete = true;
 
     explicit NbtListClass(const Local<Object>& scriptObj, std::unique_ptr<ListTag> p);
     explicit NbtListClass(std::unique_ptr<ListTag> p);
-    ~NbtListClass() { if (!canDelete) nbt.release(); }
+    ~NbtListClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtListClass* constructor(const Arguments& args);
     static ListTag* extract(Local<Value> v);
     static Local<Value> pack(ListTag* tag, bool noDelete = false);
     static Local<Value> pack(std::unique_ptr<ListTag> tag);
-    
+
     Local<Value> getType(const Arguments& args);
     Local<Value> getSize(const Arguments& args);
     Local<Value> getTypeOf(const Arguments& args);
@@ -292,16 +310,18 @@ class NbtListClass : public ScriptClass
 extern ClassDefine<NbtListClass> NbtListClassBuilder;
 
 
-//NBT Compound
-class NbtCompoundClass : public ScriptClass
-{
+// NBT Compound
+class NbtCompoundClass : public ScriptClass {
 public:
     std::unique_ptr<CompoundTag> nbt;
     bool canDelete = true;
 
     explicit NbtCompoundClass(const Local<Object>& scriptObj, std::unique_ptr<CompoundTag> p);
     explicit NbtCompoundClass(std::unique_ptr<CompoundTag> p);
-    ~NbtCompoundClass() { if (!canDelete) nbt.release(); }
+    ~NbtCompoundClass() {
+        if (!canDelete)
+            nbt.release();
+    }
 
     static NbtCompoundClass* constructor(const Arguments& args);
     static CompoundTag* extract(Local<Value> v);
@@ -337,7 +357,7 @@ class NbtCompoundClass : public ScriptClass
 extern ClassDefine<NbtCompoundClass> NbtCompoundClassBuilder;
 
 
-//Helper
+// Helper
 bool IsNbtClass(Local<Value> value);
 Local<Value> Tag2Value(Tag* nbt, bool autoExpansion = false);
 void NbtCompoundClassAddHelper(CompoundTag* tag, Local<Object>& obj);
diff --git a/ScriptEngine/API/NetworkAPI.cpp b/ScriptEngine/API/NetworkAPI.cpp
--- a/ScriptEngine/API/NetworkAPI.cpp
+++ b/ScriptEngine/API/NetworkAPI.cpp
@@ -21,7 +21,7 @@ ClassDefine<void> NetworkClassBuilder =
         .function("httpPost", &NetworkClass::httpPost)
         .function("httpGetSync", &NetworkClass::httpGetSync)
 
-        //For compatibility
+        // For compatibility
         .function("newWebSocket", &NetworkClass::newWebSocket)
         .build();
 
@@ -97,25 +97,21 @@ ClassDefine<HttpResponseClass> HttpResponseClassBuilder =
 
 //生成函数
 WSClientClass::WSClientClass(const Local<Object>& scriptObj)
-    : ScriptClass(scriptObj)
-    , ws(std::make_shared<WebSocketClient>())
-{
+: ScriptClass(scriptObj)
+, ws(std::make_shared<WebSocketClient>()) {
     initListeners();
 }
 
 WSClientClass::WSClientClass()
-    : ScriptClass(ScriptClass::ConstructFromCpp<WSClientClass>{})
-    , ws(std::make_shared<WebSocketClient>())
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<WSClientClass>{})
+, ws(std::make_shared<WebSocketClient>()) {
     initListeners();
 }
 
-void WSClientClass::initListeners()
-{
+void WSClientClass::initListeners() {
     ws->OnTextReceived([nowList{&listeners[int(WSClientEvents::onTextReceived)]}](WebSocketClient& client, string msg) {
         if (!nowList->empty())
-            for (auto& listener : *nowList)
-            {
+            for (auto& listener : *nowList) {
                 if (!EngineManager::isValid(listener.engine))
                     return;
                 EngineScope enter(listener.engine);
@@ -126,8 +122,7 @@ void WSClientClass::initListeners()
 
     ws->OnBinaryReceived([nowList{&listeners[int(WSClientEvents::onBinaryReceived)]}](WebSocketClient& client, vector<uint8_t> data) {
         if (!nowList->empty())
-            for (auto& listener : *nowList)
-            {
+            for (auto& listener : *nowList) {
                 if (!EngineManager::isValid(listener.engine))
                     return;
                 EngineScope enter(listener.engine);
@@ -137,8 +132,7 @@ void WSClientClass::initListeners()
 
     ws->OnError([nowList{&listeners[int(WSClientEvents::onError)]}](WebSocketClient& client, string msg) {
         if (!nowList->empty())
-            for (auto& listener : *nowList)
-            {
+            for (auto& listener : *nowList) {
                 if (!EngineManager::isValid(listener.engine))
                     return;
                 EngineScope enter(listener.engine);
@@ -148,8 +142,7 @@ void WSClientClass::initListeners()
 
     ws->OnLostConnection([nowList{&listeners[int(WSClientEvents::onLostConnection)]}](WebSocketClient& client, int code) {
         if (!nowList->empty())
-            for (auto& listener : *nowList)
-            {
+            for (auto& listener : *nowList) {
                 if (!EngineManager::isValid(listener.engine))
                     return;
                 EngineScope enter(listener.engine);
@@ -158,8 +151,7 @@ void WSClientClass::initListeners()
     });
 }
 
-void WSClientClass::initListeners_s()
-{
+void WSClientClass::initListeners_s() {
     ws->OnTextReceived([nowList{&listeners[int(WSClientEvents::onTextReceived)]}, engine = EngineScope::currentEngine()](WebSocketClient& client, string msg) {
         if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
             return;
@@ -168,8 +160,7 @@ void WSClientClass::initListeners_s()
                 return;
             EngineScope enter(engine);
             if (!nowList->empty())
-                for (auto& listener : *nowList)
-                {
+                for (auto& listener : *nowList) {
                     listener.func.get().call({}, {String::newString(msg)});
                 }
         });
@@ -183,8 +174,7 @@ void WSClientClass::initListeners_s()
                 return;
             EngineScope enter(engine);
             if (!nowList->empty())
-                for (auto& listener : *nowList)
-                {
+                for (auto& listener : *nowList) {
                     listener.func.get().call({}, {ByteBuffer::newByteBuffer(data.data(), data.size())});
                 }
         });
@@ -198,8 +188,7 @@ void WSClientClass::initListeners_s()
                 return;
             EngineScope enter(engine);
             if (!nowList->empty())
-                for (auto& listener : *nowList)
-                {
+                for (auto& listener : *nowList) {
                     listener.func.get().call({}, {String::newString(msg)});
                 }
         });
@@ -213,85 +202,72 @@ void WSClientClass::initListeners_s()
                 return;
             EngineScope enter(engine);
             if (!nowList->empty())
-                for (auto& listener : *nowList)
-                {
+                for (auto& listener : *nowList) {
                     listener.func.get().call({}, {Number::newNumber(code)});
                 }
         });
     });
 }
 
-void WSClientClass::clearListeners()
-{
+void WSClientClass::clearListeners() {
     ws->OnTextReceived([](WebSocketClient&, std::string) {});
     ws->OnBinaryReceived([](WebSocketClient&, std::vector<uint8_t>) {});
     ws->OnError([](WebSocketClient&, std::string) {});
     ws->OnLostConnection([](WebSocketClient&, int) {});
 }
 
-WSClientClass* WSClientClass::constructor(const Arguments& args)
-{
+WSClientClass* WSClientClass::constructor(const Arguments& args) {
     return new WSClientClass(args.thiz());
 }
 
 //成员函数
-void WSClientClass::addListener(const string& event, Local<Function> func)
-{
+void WSClientClass::addListener(const string& event, Local<Function> func) {
     if (event == "onTextReceived")
-        listeners[(int)WSClientEvents::onTextReceived].push_back({ EngineScope::currentEngine(), script::Global<Function>(func) });
+        listeners[(int)WSClientEvents::onTextReceived].push_back({EngineScope::currentEngine(), script::Global<Function>(func)});
     else if (event == "onBinaryReceived")
-        listeners[(int)WSClientEvents::onBinaryReceived].push_back({ EngineScope::currentEngine(), script::Global<Function>(func) });
+        listeners[(int)WSClientEvents::onBinaryReceived].push_back({EngineScope::currentEngine(), script::Global<Function>(func)});
     else if (event == "onError")
-        listeners[(int)WSClientEvents::onError].push_back({ EngineScope::currentEngine(), script::Global<Function>(func) });
+        listeners[(int)WSClientEvents::onError].push_back({EngineScope::currentEngine(), script::Global<Function>(func)});
     else if (event == "onLostConnection")
-        listeners[(int)WSClientEvents::onLostConnection].push_back({ EngineScope::currentEngine(), script::Global<Function>(func) });
-    else
-    {
+        listeners[(int)WSClientEvents::onLostConnection].push_back({EngineScope::currentEngine(), script::Global<Function>(func)});
+    else {
         LOG_ERROR_WITH_SCRIPT_INFO("WSClient Event \"" + event + "\" No Found!\n");
-    }  
+    }
 }
 
-Local<Value> WSClientClass::getStatus()
-{
+Local<Value> WSClientClass::getStatus() {
     try {
         return Number::newNumber((int)ws->GetStatus());
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Local<Value>();
     }
     CATCH("Fail in getStatus!");
 }
 
-Local<Value> WSClientClass::connect(const Arguments& args)
-{
+Local<Value> WSClientClass::connect(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    //if (args.size() > 1 && args[1].isFunction())
-    //    return connectAsync(args);
+    // if (args.size() > 1 && args[1].isFunction())
+    //     return connectAsync(args);
     try {
 
         string target = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "ConnectToWebsocketServer", target);
         ws->Connect(target);
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in connect!");
 }
 
 // 异步连接ws客户端
-Local<Value> WSClientClass::connectAsync(const Arguments& args)
-{
+Local<Value> WSClientClass::connectAsync(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
-    try
-    {
+    try {
         string target = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "ConnectToWebsocketServer", target);
 
@@ -302,16 +278,12 @@ Local<Value> WSClientClass::connectAsync(const Arguments& args)
                 SetThreadDescription(GetCurrentThread(), L"LLSE Connect WebSocket");
 #endif // DEBUG
                 _set_se_translator(seh_exception::TranslateSEHtoCE);
-                try
-                {
+                try {
                     bool result = false;
-                    try
-                    {
+                    try {
                         ws->Connect(target);
                         result = true;
-                    }
-                    catch (const std::runtime_error& e)
-                    {
+                    } catch (const std::runtime_error& e) {
                         result = false;
                     }
                     if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
@@ -321,15 +293,11 @@ Local<Value> WSClientClass::connectAsync(const Arguments& args)
                     if (callback.isEmpty())
                         return;
                     NewTimeout(callback.get(), {Boolean::newBoolean(result)}, 0);
-                }
-                catch (const seh_exception& e)
-                {
+                } catch (const seh_exception& e) {
                     logger.error("SEH Uncaught Exception Detected!\n{}", e.what());
                     logger.error("In WSClientClass::connectAsync");
                     logger.error("In Plugin: " + pluginName);
-                }
-                catch (...)
-                {
+                } catch (...) {
                     logger.error("WSClientClass::connectAsync Failed!");
                     logger.error("Uncaught Exception Detected!");
                     logger.error("In Plugin: " + pluginName);
@@ -337,16 +305,13 @@ Local<Value> WSClientClass::connectAsync(const Arguments& args)
             })
             .detach();
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in connectAsync!");
 }
 
-Local<Value> WSClientClass::send(const Arguments& args)
-{
+Local<Value> WSClientClass::send(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -354,22 +319,18 @@ Local<Value> WSClientClass::send(const Arguments& args)
             ws->SendText(args[0].toStr());
         else if (args[0].isByteBuffer())
             ws->SendBinary((char*)args[0].asByteBuffer().getRawBytes(), args[0].asByteBuffer().byteLength());
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in send!");
 }
 
-Local<Value> WSClientClass::listen(const Arguments& args)
-{
+Local<Value> WSClientClass::listen(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -377,47 +338,36 @@ Local<Value> WSClientClass::listen(const Arguments& args)
     try {
         addListener(args[0].toStr(), args[1].asFunction());
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in listen!");
 }
 
-Local<Value> WSClientClass::close(const Arguments& args)
-{
+Local<Value> WSClientClass::close(const Arguments& args) {
     try {
         ws->Close();
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in close!");
 }
 
-Local<Value> WSClientClass::shutdown(const Arguments& args)
-{
+Local<Value> WSClientClass::shutdown(const Arguments& args) {
     try {
         ws->Shutdown();
         return Boolean::newBoolean(true);
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Boolean::newBoolean(false);
     }
     CATCH("Fail in shutdown!");
 }
 
-Local<Value> WSClientClass::errorCode(const Arguments& args)
-{
+Local<Value> WSClientClass::errorCode(const Arguments& args) {
     try {
         return Number::newNumber(WSAGetLastError());
-    }
-    catch (const std::runtime_error& e)
-    {
+    } catch (const std::runtime_error& e) {
         return Local<Value>();
     }
     CATCH("Fail in errorCode!");
@@ -427,60 +377,53 @@ Local<Value> WSClientClass::errorCode(const Arguments& args)
 
 using namespace httplib;
 
-#define ADD_CALLBACK(method, path, func) \
-callbacks.emplace(make_pair(path, HttpServerCallback{EngineScope::currentEngine(), script::Global<Function>{func}, HttpRequestType::method, path})); \
-svr->##method##(path.c_str(), [this, engine = EngineScope::currentEngine()](const Request& req, Response& resp) { \
-    if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())      \
-        return;                                                                                   \
-    auto task = Schedule::nextTick([this, engine, req, &resp] {                                   \
-        if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())  \
-            return;                                                 \
-        EngineScope enter(engine);                                  \
-        for (auto& [k, v] : this->callbacks)                        \
-        {                                                           \
-            if (v.type != HttpRequestType::method) return;          \
-            std::regex rgx(k);                                      \
-            std::smatch matches;                                    \
-            if (std::regex_match(req.path, matches, rgx))           \
-            {                                                       \
-                if (matches == req.matches)                         \
-                {                                                   \
-                    auto reqObj = new HttpRequestClass(req);        \
-                    auto respObj = new HttpResponseClass(resp);     \
-                    v.func.get().call({}, reqObj, respObj);         \
-                    resp = *respObj->get();                         \
-                    break;                                          \
-                }                                                   \
-            }                                                       \
-        }                                                           \
-    });                                                             \
-    while (!task.isFinished())                                      \
-        std::this_thread::sleep_for(std::chrono::milliseconds(1));                                                                                  \
-});                                                                                                                                                 
+#define ADD_CALLBACK(method, path, func)                                                                                                                 \
+    callbacks.emplace(make_pair(path, HttpServerCallback{EngineScope::currentEngine(), script::Global<Function>{func}, HttpRequestType::method, path})); \
+    svr->##method##(path.c_str(), [this, engine = EngineScope::currentEngine()](const Request& req, Response& resp) {                                    \
+        if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())                                                         \
+            return;                                                                                                                                      \
+        auto task = Schedule::nextTick([this, engine, req, &resp] {                                                                                      \
+            if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())                                                     \
+                return;                                                                                                                                  \
+            EngineScope enter(engine);                                                                                                                   \
+            for (auto& [k, v] : this->callbacks) {                                                                                                       \
+                if (v.type != HttpRequestType::method)                                                                                                   \
+                    return;                                                                                                                              \
+                std::regex rgx(k);                                                                                                                       \
+                std::smatch matches;                                                                                                                     \
+                if (std::regex_match(req.path, matches, rgx)) {                                                                                          \
+                    if (matches == req.matches) {                                                                                                        \
+                        auto reqObj = new HttpRequestClass(req);                                                                                         \
+                        auto respObj = new HttpResponseClass(resp);                                                                                      \
+                        v.func.get().call({}, reqObj, respObj);                                                                                          \
+                        resp = *respObj->get();                                                                                                          \
+                        break;                                                                                                                           \
+                    }                                                                                                                                    \
+                }                                                                                                                                        \
+            }                                                                                                                                            \
+        });                                                                                                                                              \
+        while (!task.isFinished())                                                                                                                       \
+            std::this_thread::sleep_for(std::chrono::milliseconds(1));                                                                                   \
+    });
 
 HttpServerClass::HttpServerClass(const Local<Object>& scriptObj)
-    : ScriptClass(scriptObj)
-    , svr(new Server)
-{
+: ScriptClass(scriptObj)
+, svr(new Server) {
 }
 HttpServerClass::HttpServerClass()
-    : ScriptClass(ScriptClass::ConstructFromCpp<HttpServerClass>{})
-    , svr(new Server)
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<HttpServerClass>{})
+, svr(new Server) {
 }
 
-HttpServerClass::~HttpServerClass()
-{
+HttpServerClass::~HttpServerClass() {
     svr->stop();
 }
 
-HttpServerClass* HttpServerClass::constructor(const Arguments& args)
-{
+HttpServerClass* HttpServerClass::constructor(const Arguments& args) {
     return new HttpServerClass(args.thiz());
 }
 
-Local<Value> HttpServerClass::onGet(const Arguments& args)
-{
+Local<Value> HttpServerClass::onGet(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -525,8 +468,7 @@ Local<Value> HttpServerClass::onGet(const Arguments& args)
     CATCH("Fail in onGet")
 }
 
-Local<Value> HttpServerClass::onPut(const Arguments& args)
-{
+Local<Value> HttpServerClass::onPut(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -540,8 +482,7 @@ Local<Value> HttpServerClass::onPut(const Arguments& args)
     CATCH("Fail in onPut!");
 }
 
-Local<Value> HttpServerClass::onPost(const Arguments& args)
-{
+Local<Value> HttpServerClass::onPost(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -555,8 +496,7 @@ Local<Value> HttpServerClass::onPost(const Arguments& args)
     CATCH("Fail in onPost!");
 }
 
-Local<Value> HttpServerClass::onPatch(const Arguments& args)
-{
+Local<Value> HttpServerClass::onPatch(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -570,8 +510,7 @@ Local<Value> HttpServerClass::onPatch(const Arguments& args)
     CATCH("Fail in onPatch!");
 }
 
-Local<Value> HttpServerClass::onDelete(const Arguments& args)
-{
+Local<Value> HttpServerClass::onDelete(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -585,8 +524,7 @@ Local<Value> HttpServerClass::onDelete(const Arguments& args)
     CATCH("Fail in onDelete!");
 }
 
-Local<Value> HttpServerClass::onOptions(const Arguments& args)
-{
+Local<Value> HttpServerClass::onOptions(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -601,18 +539,15 @@ Local<Value> HttpServerClass::onOptions(const Arguments& args)
 }
 
 
-
-Local<Value> HttpServerClass::onPreRouting(const Arguments& args)
-{
+Local<Value> HttpServerClass::onPreRouting(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
         preRoutingCallback = {EngineScope::currentEngine(), script::Global{args[0].asFunction()}};
-        svr->set_pre_routing_handler([this, engine = EngineScope::currentEngine()]
-                                     (const Request& req, Response& resp) {
+        svr->set_pre_routing_handler([this, engine = EngineScope::currentEngine()](const Request& req, Response& resp) {
             if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
-                    return Server::HandlerResponse::Unhandled;
+                return Server::HandlerResponse::Unhandled;
             bool handled = false;
             auto task = Schedule::nextTick([this, engine, req, &resp, &handled] {
                 if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
@@ -621,8 +556,7 @@ Local<Value> HttpServerClass::onPreRouting(const Arguments& args)
                 auto reqObj = new HttpRequestClass(req);
                 auto respObj = new HttpResponseClass(resp);
                 auto res = this->preRoutingCallback.func.get().call({}, reqObj, respObj);
-                if (res.isBoolean() && res.asBoolean().value() == false)
-                {
+                if (res.isBoolean() && res.asBoolean().value() == false) {
                     handled = true;
                 }
                 resp = *respObj->get();
@@ -636,17 +570,15 @@ Local<Value> HttpServerClass::onPreRouting(const Arguments& args)
     CATCH("Fail in onPreRouting!");
 }
 
-Local<Value> HttpServerClass::onPostRouting(const Arguments& args)
-{
+Local<Value> HttpServerClass::onPostRouting(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
         postRoutingCallback = {EngineScope::currentEngine(), script::Global{args[0].asFunction()}};
-        svr->set_post_routing_handler([this, engine = EngineScope::currentEngine()]
-                                     (const Request& req, Response& resp) {
+        svr->set_post_routing_handler([this, engine = EngineScope::currentEngine()](const Request& req, Response& resp) {
             if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
-                    return;
+                return;
             auto task = Schedule::nextTick([this, engine, req, &resp] {
                 if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
                     return;
@@ -664,17 +596,15 @@ Local<Value> HttpServerClass::onPostRouting(const Arguments& args)
     CATCH("Fail in onPostRouting!");
 }
 
-Local<Value> HttpServerClass::onError(const Arguments& args)
-{
+Local<Value> HttpServerClass::onError(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
         errorCallback = {EngineScope::currentEngine(), script::Global{args[0].asFunction()}};
-        svr->set_error_handler([this, engine = EngineScope::currentEngine()]
-                               (const Request& req, Response& resp) {
+        svr->set_error_handler([this, engine = EngineScope::currentEngine()](const Request& req, Response& resp) {
             if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
-                    return;
+                return;
             auto task = Schedule::nextTick([this, engine, req, &resp] {
                 if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
                     return;
@@ -692,17 +622,15 @@ Local<Value> HttpServerClass::onError(const Arguments& args)
     CATCH("Fail in onError!");
 }
 
-Local<Value> HttpServerClass::onException(const Arguments& args)
-{
+Local<Value> HttpServerClass::onException(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
 
     try {
         exceptionCallback = {EngineScope::currentEngine(), script::Global{args[0].asFunction()}};
-        svr->set_exception_handler([this, engine = EngineScope::currentEngine()]
-                                   (const Request& req, Response& resp, std::exception& e) {
+        svr->set_exception_handler([this, engine = EngineScope::currentEngine()](const Request& req, Response& resp, std::exception& e) {
             if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
-                    return;
+                return;
             auto task = Schedule::nextTick([this, engine, req, &resp, e] {
                 if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
                     return;
@@ -720,53 +648,43 @@ Local<Value> HttpServerClass::onException(const Arguments& args)
     CATCH("Fail in onException!");
 }
 
-Local<Value> HttpServerClass::listen(const Arguments& args)
-{
-    if (args.size() == 1)
-    {
+Local<Value> HttpServerClass::listen(const Arguments& args) {
+    if (args.size() == 1) {
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-    }
-    else if (args.size() == 2)
-    {
+    } else if (args.size() == 2) {
         CHECK_ARG_TYPE(args[0], ValueKind::kString);
         CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
-    }
-    else
-    {
+    } else {
         LOG_WRONG_ARG_TYPE();
         return Local<Value>();
     }
-    
+
     try {
         string addr = "127.0.0.1";
         int port = 80;
-        if (args.size() == 2)
-        {
+        if (args.size() == 2) {
             addr = args[0].toStr();
             port = args[1].asNumber().toInt32();
-        }
-        else
-        {
+        } else {
             port = args[0].asNumber().toInt32();
         }
-        if (port < 0 || port > 65535)
-        {
+        if (port < 0 || port > 65535) {
             throw script::Exception("Invalid port number! (0~65535)");
         }
 
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "StartHttpServer", fmt::format("on {}:{}", addr, port));
-        
+
         thread th([this](string addr, int port) {
             svr->listen(addr.c_str(), port);
-        }, addr, port);
+        },
+                  addr, port);
         th.detach();
         return this->getScriptObject(); // return self
     }
     CATCH("Fail in listen!");
 }
 
-Local<Value> HttpServerClass::stop(const Arguments& args)
-{
+Local<Value> HttpServerClass::stop(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
     try {
@@ -777,8 +695,7 @@ Local<Value> HttpServerClass::stop(const Arguments& args)
     CATCH("Fail in stop!");
 }
 
-Local<Value> HttpServerClass::isRunning(const Arguments& args)
-{
+Local<Value> HttpServerClass::isRunning(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
     try {
@@ -787,15 +704,12 @@ Local<Value> HttpServerClass::isRunning(const Arguments& args)
     CATCH("Fail in isRunning!");
 }
 
-Local<Object> Headers2Object(const Headers& headers) 
-{
+Local<Object> Headers2Object(const Headers& headers) {
     auto obj = Object::newObject();
-    for (auto& header : headers)
-    {
+    for (auto& header : headers) {
         obj.set(header.first, Array::newArray());
     }
-    for (auto& header : headers)
-    {
+    for (auto& header : headers) {
         auto arr = obj.get(header.first).asArray();
         arr.add(String::newString(header.second));
         obj.set(header.first, arr);
@@ -803,11 +717,9 @@ Local<Object> Headers2Object(const Headers& headers)
     return obj;
 }
 
-Local<Object> Params2Object(const Params& params) 
-{
+Local<Object> Params2Object(const Params& params) {
     auto obj = Object::newObject();
-    for (auto& param : params)
-    {
+    for (auto& param : params) {
         if (params.count(param.first) == 1)
             obj.set(param.first, param.second);
         else {
@@ -823,31 +735,26 @@ Local<Object> Params2Object(const Params& params)
 }
 
 HttpRequestClass::HttpRequestClass(const Local<Object>& scriptObj, const Request& req)
-    : ScriptClass(scriptObj)
-    , req(new Request(req))
-{
+: ScriptClass(scriptObj)
+, req(new Request(req)) {
 }
 HttpRequestClass::HttpRequestClass(const Request& req)
-    : ScriptClass(ScriptClass::ConstructFromCpp<HttpRequestClass>{})
-    , req(new Request(req))
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<HttpRequestClass>{})
+, req(new Request(req)) {
 }
 
-std::shared_ptr<Request> HttpRequestClass::get()
-{
+std::shared_ptr<Request> HttpRequestClass::get() {
     return req;
 }
 
-Local<Value> HttpRequestClass::getHeaders()
-{
+Local<Value> HttpRequestClass::getHeaders() {
     try {
         return Headers2Object(req->headers);
     }
     CATCH("Fail in getHeaders!");
 }
 
-Local<Value> HttpRequestClass::getHeader(const Arguments& args)
-{
+Local<Value> HttpRequestClass::getHeader(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -857,8 +764,7 @@ Local<Value> HttpRequestClass::getHeader(const Arguments& args)
             return Array::newArray();
         auto value = req->headers.equal_range(key);
         auto arr = Array::newArray();
-        for (auto it = value.first; it != value.second; ++it)
-        {
+        for (auto it = value.first; it != value.second; ++it) {
             arr.add(String::newString(it->second));
         }
         return arr;
@@ -866,48 +772,42 @@ Local<Value> HttpRequestClass::getHeader(const Arguments& args)
     CATCH("Fail in getHeader!");
 }
 
-Local<Value> HttpRequestClass::getBody()
-{
+Local<Value> HttpRequestClass::getBody() {
     try {
         return String::newString(req->body);
     }
     CATCH("Fail in getBody!");
 }
 
-Local<Value> HttpRequestClass::getMethod()
-{
+Local<Value> HttpRequestClass::getMethod() {
     try {
         return String::newString(req->method);
     }
     CATCH("Fail in getMethod!");
 }
 
-Local<Value> HttpRequestClass::getPath()
-{
+Local<Value> HttpRequestClass::getPath() {
     try {
         return String::newString(req->path);
     }
     CATCH("Fail in getPath!");
 }
 
-Local<Value> HttpRequestClass::getParams()
-{
+Local<Value> HttpRequestClass::getParams() {
     try {
         return Params2Object(req->params);
     }
     CATCH("Fail in getParams!");
 }
 
-Local<Value> HttpRequestClass::getRemoteAddr()
-{
+Local<Value> HttpRequestClass::getRemoteAddr() {
     try {
         return String::newString(req->remote_addr);
     }
     CATCH("Fail in getRemoteAddr!");
 }
 
-Local<Value> HttpRequestClass::getRemotePort()
-{
+Local<Value> HttpRequestClass::getRemotePort() {
     try {
         return Number::newNumber(req->remote_port);
     }
@@ -915,21 +815,18 @@ Local<Value> HttpRequestClass::getRemotePort()
 }
 
 
-Local<Value> HttpRequestClass::getVersion()
-{
+Local<Value> HttpRequestClass::getVersion() {
     try {
         return String::newString(req->version);
     }
     CATCH("Fail in getVersion!");
 }
 
-Local<Value> HttpRequestClass::getRegexMatches()
-{
+Local<Value> HttpRequestClass::getRegexMatches() {
     try {
         auto smt = req->matches;
         auto arr = Array::newArray();
-        for (auto& match : smt)
-        {
+        for (auto& match : smt) {
             arr.add(String::newString(match));
         }
         return arr;
@@ -938,23 +835,19 @@ Local<Value> HttpRequestClass::getRegexMatches()
 }
 
 HttpResponseClass::HttpResponseClass(const Local<Object>& scriptObj, const Response& resp)
-    : ScriptClass(scriptObj)
-    , resp(new Response(resp))
-{
+: ScriptClass(scriptObj)
+, resp(new Response(resp)) {
 }
 HttpResponseClass::HttpResponseClass(const Response& resp)
-    : ScriptClass(ScriptClass::ConstructFromCpp<HttpResponseClass>{})
-    , resp(new Response(resp))
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<HttpResponseClass>{})
+, resp(new Response(resp)) {
 }
 
-std::shared_ptr<Response> HttpResponseClass::get()
-{
+std::shared_ptr<Response> HttpResponseClass::get() {
     return resp;
 }
 
-Local<Value> HttpResponseClass::setHeader(const Arguments& args)
-{
+Local<Value> HttpResponseClass::setHeader(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -971,8 +864,7 @@ Local<Value> HttpResponseClass::setHeader(const Arguments& args)
     CATCH("Fail in setHeader!");
 }
 
-Local<Value> HttpResponseClass::getHeader(const Arguments& args)
-{
+Local<Value> HttpResponseClass::getHeader(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -982,8 +874,7 @@ Local<Value> HttpResponseClass::getHeader(const Arguments& args)
             return Array::newArray();
         auto value = resp->headers.equal_range(key);
         auto arr = Array::newArray();
-        for (auto it = value.first; it != value.second; ++it)
-        {
+        for (auto it = value.first; it != value.second; ++it) {
             arr.add(String::newString(it->second));
         }
         return arr;
@@ -991,10 +882,9 @@ Local<Value> HttpResponseClass::getHeader(const Arguments& args)
     CATCH("Fail in getHeader!");
 }
 
-Local<Value> HttpResponseClass::write(const Arguments& args)
-{
+Local<Value> HttpResponseClass::write(const Arguments& args) {
     try {
-        for (size_t i = 0ULL; i < args.size(); i++) {
+        for (size_t i = 0ULL, mEnd = args.size(); i < mEnd; ++i) {
             resp->body += ValueToString(args[i]);
         }
         return this->getScriptObject();
@@ -1002,19 +892,16 @@ Local<Value> HttpResponseClass::write(const Arguments& args)
     CATCH("Fail in write!");
 }
 
-void HttpResponseClass::setHeaders(const Local<Value>& headers)
-{
+void HttpResponseClass::setHeaders(const Local<Value>& headers) {
     CHECK_ARG_TYPE_S(headers, ValueKind::kObject);
 
     try {
         auto keys = headers.asObject().getKeys();
-        for (auto& key : keys)
-        {
+        for (auto& key : keys) {
             auto key_str = key.toString();
             auto value = headers.asObject().get(key);
             if (value.isArray()) {
-                for (size_t i = 0ULL; i < value.asArray().size(); ++i)
-                {
+                for (size_t i = 0ULL; i < value.asArray().size(); ++i) {
                     resp->headers.insert(make_pair(key_str, ValueToString(value.asArray().get(i))));
                 }
                 return;
@@ -1026,8 +913,7 @@ void HttpResponseClass::setHeaders(const Local<Value>& headers)
     CATCH_S("Fail in setHeaders!");
 }
 
-void HttpResponseClass::setStatus(const Local<Value>& status) 
-{
+void HttpResponseClass::setStatus(const Local<Value>& status) {
     CHECK_ARG_TYPE_S(status, ValueKind::kNumber);
 
     try {
@@ -1036,8 +922,7 @@ void HttpResponseClass::setStatus(const Local<Value>& status)
     CATCH_S("Fail in setStatus!");
 }
 
-void HttpResponseClass::setBody(const Local<Value>& body)
-{
+void HttpResponseClass::setBody(const Local<Value>& body) {
     CHECK_ARG_TYPE_S(body, ValueKind::kString);
 
     try {
@@ -1046,8 +931,7 @@ void HttpResponseClass::setBody(const Local<Value>& body)
     CATCH_S("Fail in setBody!");
 }
 
-void HttpResponseClass::setReason(const Local<Value>& reason)
-{
+void HttpResponseClass::setReason(const Local<Value>& reason) {
     CHECK_ARG_TYPE_S(reason, ValueKind::kString);
 
     try {
@@ -1056,8 +940,7 @@ void HttpResponseClass::setReason(const Local<Value>& reason)
     CATCH_S("Fail in setReason!");
 }
 
-void HttpResponseClass::setVersion(const Local<Value>& version)
-{
+void HttpResponseClass::setVersion(const Local<Value>& version) {
     CHECK_ARG_TYPE_S(version, ValueKind::kString);
 
     try {
@@ -1066,40 +949,35 @@ void HttpResponseClass::setVersion(const Local<Value>& version)
     CATCH_S("Fail in setVersion!");
 }
 
-Local<Value> HttpResponseClass::getHeaders()
-{
+Local<Value> HttpResponseClass::getHeaders() {
     try {
         return Headers2Object(resp->headers);
     }
     CATCH("Fail in getHeaders!");
 }
 
-Local<Value> HttpResponseClass::getStatus()
-{
+Local<Value> HttpResponseClass::getStatus() {
     try {
         return Number::newNumber(resp->status);
     }
     CATCH("Fail in getStatus!");
 }
 
-Local<Value> HttpResponseClass::getBody()
-{
+Local<Value> HttpResponseClass::getBody() {
     try {
         return String::newString(resp->body);
     }
     CATCH("Fail in getBody!");
 }
 
-Local<Value> HttpResponseClass::getReason()
-{
+Local<Value> HttpResponseClass::getReason() {
     try {
         return String::newString(resp->reason);
     }
     CATCH("Fail in getReason!");
 }
 
-Local<Value> HttpResponseClass::getVersion()
-{
+Local<Value> HttpResponseClass::getVersion() {
     try {
         return String::newString(resp->version);
     }
@@ -1108,46 +986,38 @@ Local<Value> HttpResponseClass::getVersion()
 
 //////////////////// APIs ////////////////////
 
-Local<Value> NetworkClass::httpGet(const Arguments& args)
-{
+Local<Value> NetworkClass::httpGet(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     if (args.size() > 2) {
         CHECK_ARG_TYPE(args[1], ValueKind::kObject);
         CHECK_ARG_TYPE(args[2], ValueKind::kFunction);
-    }
-    else
-    {
+    } else {
         CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
     }
 
-    try
-    {
+    try {
         string target = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "HttpGet", target);
-        script::Global<Function> callbackFunc{args[args.size()-1].asFunction()};
+        script::Global<Function> callbackFunc{args[args.size() - 1].asFunction()};
 
         auto lambda = [callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}](int status, string body) {
             if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
                 return;
 
             EngineScope scope(engine);
-            try
-            {
+            try {
                 NewTimeout(callback.get(), {Number::newNumber(status), String::newString(body)}, 1);
                 // callback.get().call({}, {Number::newNumber(status), String::newString(body)});
             }
             CATCH_IN_CALLBACK("HttpGet")
         };
-        if (args.size() > 2)
-        {
+        if (args.size() > 2) {
             httplib::Headers maps;
             auto obj = args[1].asObject();
             auto keys = obj.getKeyNames();
-            if (keys.size() > 0)
-            {
-                for (size_t i = 0; i < keys.size(); i++)
-                {
+            if (keys.size() > 0) {
+                for (size_t i = 0ULL, mEnd = keys.size(); i < mEnd; ++i) {
                     maps.insert({keys[i], obj.get(keys[i]).toStr()});
                 }
             }
@@ -1158,26 +1028,21 @@ Local<Value> NetworkClass::httpGet(const Arguments& args)
     CATCH("Fail in HttpGet");
 }
 
-Local<Value> NetworkClass::httpPost(const Arguments& args)
-{
+Local<Value> NetworkClass::httpPost(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 4);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[2], ValueKind::kString);
-    if (args.size() > 4)
-    {
+    if (args.size() > 4) {
         CHECK_ARG_TYPE(args[1], ValueKind::kObject);
         CHECK_ARG_TYPE(args[3], ValueKind::kString);
         CHECK_ARG_TYPE(args[4], ValueKind::kFunction);
-    }
-    else
-    {
+    } else {
         CHECK_ARG_TYPE(args[1], ValueKind::kString);
         CHECK_ARG_TYPE(args[3], ValueKind::kFunction);
     }
-    
-    
-    try
-    {
+
+
+    try {
         string target = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "HttpPost", target);
         script::Global<Function> callbackFunc{args[args.size() - 1].asFunction()};
@@ -1187,35 +1052,30 @@ Local<Value> NetworkClass::httpPost(const Arguments& args)
                 return;
 
             EngineScope scope(engine);
-            try
-            {
+            try {
                 NewTimeout(callback.get(), {Number::newNumber(status), String::newString(body)}, 1);
                 // callback.get().call({}, {Number::newNumber(status), String::newString(body)});
             }
             CATCH_IN_CALLBACK("HttpPost")
         };
-        if (args.size() > 4)
-        {
+        if (args.size() > 4) {
             httplib::Headers maps;
             auto obj = args[1].asObject();
             auto keys = obj.getKeyNames();
-            if (keys.size() > 0)
-            {
-                for (size_t i = 0; i < keys.size(); i++)
-                {
+            if (keys.size() > 0) {
+                for (size_t i = 0ULL, mEnd = keys.size(); i < mEnd; ++i) {
                     maps.insert({keys[i], obj.get(keys[i]).toStr()});
                 }
             }
-            
-            return Boolean::newBoolean(HttpPost(target, maps ,args[2].toStr(), args[3].toStr(), lambda));
+
+            return Boolean::newBoolean(HttpPost(target, maps, args[2].toStr(), args[3].toStr(), lambda));
         }
         return Boolean::newBoolean(HttpPost(target, args[1].toStr(), args[2].toStr(), lambda));
     }
     CATCH("Fail in HttpPost");
 }
 
-Local<Value> NetworkClass::httpGetSync(const Arguments& args)
-{
+Local<Value> NetworkClass::httpGetSync(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1235,15 +1095,13 @@ Local<Value> NetworkClass::httpGetSync(const Arguments& args)
 }
 
 
-//For compatibility
-Local<Value> NetworkClass::newWebSocket(const Arguments& args)
-{
+// For compatibility
+Local<Value> NetworkClass::newWebSocket(const Arguments& args) {
     auto newp = new WSClientClass();
     return newp->getScriptObject();
 }
 
-Local<Object> WSClientClass::newWSClient()
-{
+Local<Object> WSClientClass::newWSClient() {
     auto newp = new WSClientClass();
     return newp->getScriptObject();
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/NetworkAPI.h b/ScriptEngine/API/NetworkAPI.h
--- a/ScriptEngine/API/NetworkAPI.h
+++ b/ScriptEngine/API/NetworkAPI.h
@@ -8,25 +8,30 @@ using namespace cyanray;
 
 //////////////////// Types ////////////////////
 
-enum class WSClientEvents : char
-{
-    onTextReceived = 0, onBinaryReceived, onError, onLostConnection,
+enum class WSClientEvents : char {
+    onTextReceived = 0,
+    onBinaryReceived,
+    onError,
+    onLostConnection,
     EVENT_COUNT
 };
 
-struct ListenerListType
-{
+struct ListenerListType {
     ScriptEngine* engine;
     script::Global<Function> func;
 };
 
-enum class HttpRequestType : char
-{
-    Get = 0, Post, Put, Delete, Options, Patch, Head
+enum class HttpRequestType : char {
+    Get = 0,
+    Post,
+    Put,
+    Delete,
+    Options,
+    Patch,
+    Head
 };
 
-struct HttpServerCallback
-{
+struct HttpServerCallback {
     ScriptEngine* engine;
     script::Global<Function> func;
     HttpRequestType type;
@@ -35,14 +40,13 @@ struct HttpServerCallback
 
 //////////////////// Network Static ////////////////////
 
-class NetworkClass
-{
+class NetworkClass {
 public:
     static Local<Value> httpGet(const Arguments& args);
     static Local<Value> httpPost(const Arguments& args);
     static Local<Value> httpGetSync(const Arguments& args);
 
-    //For Compatibility
+    // For Compatibility
     static Local<Value> newWebSocket(const Arguments& args);
 };
 extern ClassDefine<void> NetworkClassBuilder;
@@ -50,8 +54,7 @@ extern ClassDefine<void> NetworkClassBuilder;
 
 //////////////////// Classes ////////////////////
 
-class WSClientClass : public ScriptClass
-{
+class WSClientClass : public ScriptClass {
 private:
     std::shared_ptr<WebSocketClient> ws;
     std::list<ListenerListType> listeners[(int)WSClientEvents::EVENT_COUNT];
@@ -63,8 +66,7 @@ class WSClientClass : public ScriptClass
     void initListeners();
     void initListeners_s();
     void clearListeners();
-    ~WSClientClass()
-    {
+    ~WSClientClass() {
         ws->Shutdown();
     }
     static WSClientClass* constructor(const Arguments& args);
@@ -79,13 +81,12 @@ class WSClientClass : public ScriptClass
     Local<Value> shutdown(const Arguments& args);
     Local<Value> errorCode(const Arguments& args);
 
-    //For Compatibility
+    // For Compatibility
     static Local<Object> newWSClient();
 };
 extern ClassDefine<WSClientClass> WSClientClassBuilder;
 
-class HttpServerClass : public ScriptClass
-{
+class HttpServerClass : public ScriptClass {
 
 protected:
     std::shared_ptr<httplib::Server> svr = nullptr;
@@ -109,21 +110,20 @@ class HttpServerClass : public ScriptClass
     Local<Value> onPostRouting(const Arguments& args);
     Local<Value> onError(const Arguments& args);
     Local<Value> onException(const Arguments& args);
-    
+
     Local<Value> listen(const Arguments& args);
     Local<Value> stop(const Arguments& args);
     Local<Value> isRunning(const Arguments& args);
 };
 extern ClassDefine<HttpServerClass> HttpServerClassBuilder;
 
-class HttpRequestClass : public ScriptClass
-{
+class HttpRequestClass : public ScriptClass {
     std::shared_ptr<httplib::Request> req;
 
 public:
     HttpRequestClass(const Local<Object>& scriptObj, const httplib::Request& req = {});
     HttpRequestClass(const httplib::Request& req = {});
-    //static HttpRequestClass* constructor(const Arguments& args);
+    // static HttpRequestClass* constructor(const Arguments& args);
     std::shared_ptr<httplib::Request> get();
 
     Local<Value> getHeaders();
@@ -136,18 +136,17 @@ class HttpRequestClass : public ScriptClass
     Local<Value> getRemotePort();
     Local<Value> getVersion();
     Local<Value> getRegexMatches();
-    //Local<Value> getMultiFormData();
+    // Local<Value> getMultiFormData();
 };
 extern ClassDefine<HttpRequestClass> HttpRequestClassBuilder;
 
-class HttpResponseClass : public ScriptClass
-{
+class HttpResponseClass : public ScriptClass {
     std::shared_ptr<httplib::Response> resp;
 
 public:
     HttpResponseClass(const Local<Object>& scriptObj, const httplib::Response& resp = {});
     HttpResponseClass(const httplib::Response& resp);
-    //static HttpResponseClass* constructor(const Arguments& args);
+    // static HttpResponseClass* constructor(const Arguments& args);
     std::shared_ptr<httplib::Response> get();
 
     Local<Value> setHeader(const Arguments& args);
diff --git a/ScriptEngine/API/PlayerAPI.cpp b/ScriptEngine/API/PlayerAPI.cpp
--- a/ScriptEngine/API/PlayerAPI.cpp
+++ b/ScriptEngine/API/PlayerAPI.cpp
@@ -42,6 +42,7 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceProperty("name", &PlayerClass::getName)
         .instanceProperty("pos", &PlayerClass::getPos)
         .instanceProperty("blockPos", &PlayerClass::getBlockPos)
+        .instanceProperty("lastDeathPos", &PlayerClass::getLastDeathPos)
         .instanceProperty("realName", &PlayerClass::getRealName)
         .instanceProperty("xuid", &PlayerClass::getXuid)
         .instanceProperty("uuid", &PlayerClass::getUuid)
@@ -52,10 +53,11 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceProperty("inAir", &PlayerClass::getInAir)
         .instanceProperty("inWater", &PlayerClass::getInWater)
         .instanceProperty("sneaking", &PlayerClass::getSneaking)
-        .instanceProperty("speed",&PlayerClass::getSpeed)
+        .instanceProperty("speed", &PlayerClass::getSpeed)
         .instanceProperty("direction", &PlayerClass::getDirection)
         .instanceProperty("uniqueId", &PlayerClass::getUniqueID)
         .instanceProperty("langCode", &PlayerClass::getLangCode)
+        .instanceProperty("isLoading", &PlayerClass::isLoading)
 
         .instanceFunction("isOP", &PlayerClass::isOP)
         .instanceFunction("setPermLevel", &PlayerClass::setPermLevel)
@@ -88,8 +90,8 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceFunction("getInventory", &PlayerClass::getInventory)
         .instanceFunction("getArmor", &PlayerClass::getArmor)
         .instanceFunction("getEnderChest", &PlayerClass::getEnderChest)
-        .instanceFunction("getRespawnPosition",&PlayerClass::getRespawnPosition)
-        .instanceFunction("setRespawnPosition",&PlayerClass::setRespawnPosition)
+        .instanceFunction("getRespawnPosition", &PlayerClass::getRespawnPosition)
+        .instanceFunction("setRespawnPosition", &PlayerClass::setRespawnPosition)
         .instanceFunction("refreshItems", &PlayerClass::refreshItems)
 
         .instanceFunction("getScore", &PlayerClass::getScore)
@@ -102,10 +104,17 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceFunction("setBossBar", &PlayerClass::setBossBar)
         .instanceFunction("removeBossBar", &PlayerClass::removeBossBar)
         .instanceFunction("addLevel", &PlayerClass::addLevel)
+        .instanceFunction("reduceLevel", &PlayerClass::reduceLevel)
         .instanceFunction("getLevel", &PlayerClass::getLevel)
+        .instanceFunction("setLevel", &PlayerClass::setLevel)
         .instanceFunction("resetLevel", &PlayerClass::resetLevel)
-        .instanceFunction("getXpNeededForNextLevel", &PlayerClass::getXpNeededForNextLevel)
         .instanceFunction("addExperience", &PlayerClass::addExperience)
+        .instanceFunction("reduceExperience", &PlayerClass::reduceExperience)
+        .instanceFunction("getCurrentExperience", &PlayerClass::getCurrentExperience)
+        .instanceFunction("setCurrentExperience", &PlayerClass::setCurrentExperience)
+        .instanceFunction("getTotalExperience", &PlayerClass::getTotalExperience)
+        .instanceFunction("setTotalExperience", &PlayerClass::setTotalExperience)
+        .instanceFunction("getXpNeededForNextLevel", &PlayerClass::getXpNeededForNextLevel)
 
         .instanceFunction("sendSimpleForm", &PlayerClass::sendSimpleForm)
         .instanceFunction("sendModalForm", &PlayerClass::sendModalForm)
@@ -129,11 +138,11 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceFunction("getBlockFromViewVector", &PlayerClass::getBlockFromViewVector)
         .instanceFunction("quickEvalMolangScript", &PlayerClass::quickEvalMolangScript)
 
-        //SimulatedPlayer API
+        // SimulatedPlayer API
         .instanceFunction("isSimulatedPlayer", &PlayerClass::isSimulatedPlayer)
         .instanceFunction("simulateSneak", &PlayerClass::simulateSneak)
         .instanceFunction("simulateAttack", &PlayerClass::simulateAttack)
-        .instanceFunction("simulateDestory", &PlayerClass::simulateDestory)
+        .instanceFunction("simulateDestroy", &PlayerClass::simulateDestroy)
         .instanceFunction("simulateDisconnect", &PlayerClass::simulateDisconnect)
         .instanceFunction("simulateInteract", &PlayerClass::simulateInteract)
         .instanceFunction("simulateJump", &PlayerClass::simulateJump)
@@ -149,8 +158,8 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
         .instanceFunction("simulateStopMoving", &PlayerClass::simulateStopMoving)
         .instanceFunction("simulateStopUsingItem", &PlayerClass::simulateStopUsingItem)
         .instanceFunction("simulateStopSneaking", &PlayerClass::simulateStopSneaking)
-        
-        //For Compatibility
+
+        // For Compatibility
         .instanceProperty("ip", &PlayerClass::getIP)
         .instanceFunction("setTag", &PlayerClass::setNbt)
         .instanceFunction("getTag", &PlayerClass::getNbt)
@@ -164,86 +173,77 @@ ClassDefine<PlayerClass> PlayerClassBuilder =
 
 //生成函数
 PlayerClass::PlayerClass(Player* p)
-    :ScriptClass(ScriptClass::ConstructFromCpp<PlayerClass>{})
-{
+: ScriptClass(ScriptClass::ConstructFromCpp<PlayerClass>{}) {
     set(p);
 }
-Local<Object> PlayerClass::newPlayer(Player *p)
-{
+Local<Object> PlayerClass::newPlayer(Player* p) {
     auto newp = new PlayerClass(p);
     return newp->getScriptObject();
 }
-Player* PlayerClass::extract(Local<Value> v)
-{
-    if(EngineScope::currentEngine()->isInstanceOf<PlayerClass>(v))
+Player* PlayerClass::extract(Local<Value> v) {
+    if (EngineScope::currentEngine()->isInstanceOf<PlayerClass>(v))
         return EngineScope::currentEngine()->getNativeInstance<PlayerClass>(v)->get();
     else
         return nullptr;
 }
 
 //公用API
-Local<Value> McClass::getPlayer(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> McClass::getPlayer(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try{
+    try {
         string target = args[0].toStr();
         if (target.empty())
             return Local<Value>();
 
-        transform(target.begin(), target.end(), target.begin(), ::tolower);	//lower case the string
+        transform(target.begin(), target.end(), target.begin(), ::tolower); // lower case the string
         auto playerList = Level::getAllPlayers();
-        int delta = 2147483647;	//c++ int max
+        int delta = 2147483647; // c++ int max
         Player* found = nullptr;
 
-        for(Player *p : playerList)
-        {
-            if(p->getXuid() == target)
+        for (Player* p : playerList) {
+            if (p->getXuid() == target)
                 return PlayerClass::newPlayer(p);
 
             string pName = p->getName();
             transform(pName.begin(), pName.end(), pName.begin(), ::tolower);
 
-            if(pName.find(target) == 0)
-            {	
-                //0 ís the index where the "target" appear in "pName"
+            if (pName.find(target) == 0) {
+                // 0 ís the index where the "target" appear in "pName"
                 int curDelta = pName.length() - target.length();
                 if (curDelta == 0)
                     return PlayerClass::newPlayer(p);
 
-                if(curDelta < delta){
+                if (curDelta < delta) {
                     found = p;
                     delta = curDelta;
                 }
             }
         }
-        return found ? PlayerClass::newPlayer(found) : Local<Value>();	//Player/Null
+        return found ? PlayerClass::newPlayer(found) : Local<Value>(); // Player/Null
     }
     CATCH("Fail in GetPlayer!")
 }
 
-Local<Value> McClass::getOnlinePlayers(const Arguments& args)
-{
-    try{
+Local<Value> McClass::getOnlinePlayers(const Arguments& args) {
+    try {
         auto players = Level::getAllPlayers();
         Local<Array> list = Array::newArray();
-        for(auto p : players)
+        for (auto p : players)
             list.add(PlayerClass::newPlayer(p));
         return list;
     }
     CATCH("Fail in GetOnlinePlayers!")
 }
 
-Local<Value> McClass::broadcast(const Arguments& args)
-{
+Local<Value> McClass::broadcast(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
     try {
         TextType type = TextType::RAW;
-        if (args.size() >= 2 && args[1].isNumber())
-        {
+        if (args.size() >= 2 && args[1].isNumber()) {
             int newType = args[1].asNumber().toInt32();
             if (newType >= 0 && newType <= 9)
                 type = (TextType)newType;
@@ -255,29 +255,23 @@ Local<Value> McClass::broadcast(const Arguments& args)
 }
 
 //成员函数
-void PlayerClass::set(Player* player)
-{
-    __try
-    {
+void PlayerClass::set(Player* player) {
+    __try {
         id = player->getUniqueID();
-    }
-    __except (EXCEPTION_EXECUTE_HANDLER)
-    {
+    } __except (EXCEPTION_EXECUTE_HANDLER) {
         isValid = false;
     }
 }
 
-Player* PlayerClass::get()
-{
+Player* PlayerClass::get() {
     if (!isValid)
         return nullptr;
     else
         return Global<Level>->getPlayer(id);
 }
 
-Local<Value> PlayerClass::getName()
-{ 
-    try{
+Local<Value> PlayerClass::getName() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -287,44 +281,50 @@ Local<Value> PlayerClass::getName()
     CATCH("Fail in getPlayerName!")
 }
 
-Local<Value> PlayerClass::getPos()
-{ 
-    try{
+Local<Value> PlayerClass::getPos() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return FloatPos::newPos(player->getPosition(),player->getDimensionId());
+        return FloatPos::newPos(player->getPosition(), player->getDimensionId());
     }
     CATCH("Fail in getPlayerPos!")
 }
 
-Local<Value> PlayerClass::getBlockPos()
-{
+Local<Value> PlayerClass::getBlockPos() {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return IntPos::newPos(player->getBlockPos(),player->getDimensionId());
+        return IntPos::newPos(player->getBlockPos(), player->getDimensionId());
     }
     CATCH("Fail in getPlayerBlockPos!")
 }
 
-Local<Value> PlayerClass::getXuid()
-{
-    try{
+Local<Value> PlayerClass::getLastDeathPos() {
+    try {
+        Player* player = get();
+        if (!player || player->hasDiedBefore()) {
+            return Local<Value>();
+        }
+
+        return IntPos::newPos(player->getLastDeathPos().value(), player->getLastDeathDimension().value());
+    }
+    CATCH("Fail in getLastDeathPos!")
+}
+
+Local<Value> PlayerClass::getXuid() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         string xuid;
-        try
-        {
+        try {
             xuid = player->getXuid();
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.debug("Fail in getXuid!");
             xuid = PlayerInfo::getXuid(player->getRealName());
         }
@@ -333,20 +333,16 @@ Local<Value> PlayerClass::getXuid()
     CATCH("Fail in getXuid!")
 }
 
-Local<Value> PlayerClass::getUuid()
-{
-    try{
+Local<Value> PlayerClass::getUuid() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         string uuid;
-        try
-        {
+        try {
             uuid = player->getUuid();
-        }
-        catch (...)
-        {
+        } catch (...) {
             logger.debug("Fail in getUuid!");
             uuid = PlayerInfo::getUUID(player->getRealName());
         }
@@ -355,9 +351,8 @@ Local<Value> PlayerClass::getUuid()
     CATCH("Fail in getUuid!")
 }
 
-Local<Value> PlayerClass::getRealName()
-{
-    try{
+Local<Value> PlayerClass::getRealName() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -367,9 +362,8 @@ Local<Value> PlayerClass::getRealName()
     CATCH("Fail in getRealName!")
 }
 
-Local<Value> PlayerClass::getIP()
-{
-    try{
+Local<Value> PlayerClass::getIP() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -379,8 +373,7 @@ Local<Value> PlayerClass::getIP()
     CATCH("Fail in GetIP!")
 }
 
-Local<Value> PlayerClass::getPermLevel()
-{
+Local<Value> PlayerClass::getPermLevel() {
     try {
         Player* player = get();
         if (!player)
@@ -391,21 +384,19 @@ Local<Value> PlayerClass::getPermLevel()
     CATCH("Fail in getPlayerPermLevel!")
 }
 
-Local<Value> PlayerClass::getGameMode()
-{
+Local<Value> PlayerClass::getGameMode() {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return Number::newNumber(player->getPlayerGameType());      //==========???
+        return Number::newNumber(player->getPlayerGameType()); //==========???
     }
     CATCH("Fail in getGameMode!")
 }
 
-Local<Value> PlayerClass::getSneaking()
-{
-    try{
+Local<Value> PlayerClass::getSneaking() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -415,8 +406,7 @@ Local<Value> PlayerClass::getSneaking()
     CATCH("Fail in getSneaking!")
 }
 
-Local<Value> PlayerClass::getSpeed()
-{
+Local<Value> PlayerClass::getSpeed() {
     try {
         Player* player = get();
         if (!player)
@@ -427,8 +417,7 @@ Local<Value> PlayerClass::getSpeed()
     CATCH("Fail in getSpeed!")
 }
 
-Local<Value> PlayerClass::getDirection()
-{
+Local<Value> PlayerClass::getDirection() {
     try {
         Player* player = get();
         if (!player)
@@ -440,9 +429,8 @@ Local<Value> PlayerClass::getDirection()
     CATCH("Fail in getDirection!")
 }
 
-Local<Value> PlayerClass::getMaxHealth()
-{
-    try{
+Local<Value> PlayerClass::getMaxHealth() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -452,9 +440,8 @@ Local<Value> PlayerClass::getMaxHealth()
     CATCH("Fail in GetMaxHealth!")
 }
 
-Local<Value> PlayerClass::getHealth()
-{
-    try{
+Local<Value> PlayerClass::getHealth() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -464,9 +451,8 @@ Local<Value> PlayerClass::getHealth()
     CATCH("Fail in GetHealth!")
 }
 
-Local<Value> PlayerClass::getInAir()
-{
-    try{
+Local<Value> PlayerClass::getInAir() {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -476,8 +462,7 @@ Local<Value> PlayerClass::getInAir()
     CATCH("Fail in GetInAir!")
 }
 
-Local<Value> PlayerClass::getInWater()
-{
+Local<Value> PlayerClass::getInWater() {
     try {
         Player* player = get();
         if (!player)
@@ -488,8 +473,7 @@ Local<Value> PlayerClass::getInWater()
     CATCH("Fail in getInWater!")
 }
 
-Local<Value> PlayerClass::getRawPtr(const Arguments& args)
-{
+Local<Value> PlayerClass::getRawPtr(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -500,8 +484,7 @@ Local<Value> PlayerClass::getRawPtr(const Arguments& args)
     CATCH("Fail in getRawPtr!")
 }
 
-Local<Value> PlayerClass::getUniqueID()
-{
+Local<Value> PlayerClass::getUniqueID() {
     try {
         Player* player = get();
         if (!player)
@@ -512,8 +495,7 @@ Local<Value> PlayerClass::getUniqueID()
     CATCH("Fail in getUniqueID!")
 }
 
-Local<Value> PlayerClass::getLangCode()
-{
+Local<Value> PlayerClass::getLangCode() {
     try {
         auto result = get()->getLanguageCode();
         return String::newString(result);
@@ -521,48 +503,49 @@ Local<Value> PlayerClass::getLangCode()
     CATCH("Fail in getLangCode!");
 }
 
-Local<Value> PlayerClass::teleport(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    
-    try{
+Local<Value> PlayerClass::isLoading() {
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        return Boolean::newBoolean(player->isLoading());
+    }
+    CATCH("Fail in isLoading!")
+}
+
+Local<Value> PlayerClass::teleport(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
+    try {
         FloatVec4 pos;
 
-        if (args.size() == 1)
-        {
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+        if (args.size() == 1) {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos.x = posObj->x;
                     pos.y = posObj->y;
                     pos.z = posObj->z;
                     pos.dim = posObj->dim;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 4)
-        {
+        } else if (args.size() == 4) {
             // number pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -573,9 +556,7 @@ Local<Value> PlayerClass::teleport(const Arguments& args)
             pos.y = args[1].asNumber().toFloat();
             pos.z = args[2].asNumber().toFloat();
             pos.dim = args[3].toInt();
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -584,27 +565,25 @@ Local<Value> PlayerClass::teleport(const Arguments& args)
         if (!player)
             return Local<Value>();
         player->teleport(pos.getVec3(), pos.dim);
-        return Boolean::newBoolean(true);               //=========???
+        return Boolean::newBoolean(true); //=========???
     }
     CATCH("Fail in TeleportPlayer!")
 }
 
-Local<Value> PlayerClass::kill(const Arguments& args)
-{
-    try{
+Local<Value> PlayerClass::kill(const Arguments& args) {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         player->kill();
-        return Boolean::newBoolean(true);           //=======???
+        return Boolean::newBoolean(true); //=======???
     }
     CATCH("Fail in KillPlayer!")
 }
 
-Local<Value> PlayerClass::isOP(const Arguments& args)
-{
-    try{
+Local<Value> PlayerClass::isOP(const Arguments& args) {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -614,22 +593,20 @@ Local<Value> PlayerClass::isOP(const Arguments& args)
     CATCH("Fail in IsOP!")
 }
 
-Local<Value> PlayerClass::setPermLevel(const Arguments& args)
-{
+Local<Value> PlayerClass::setPermLevel(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         bool res = false;
         int newPerm = args[0].asNumber().toInt32();
-        if (newPerm >= 0 || newPerm <= 4)
-        {
+        if (newPerm >= 0 || newPerm <= 4) {
             RecordOperation(ENGINE_OWN_DATA()->pluginName, "Set Permission Level",
-                fmt::format("Set Player {} Permission Level as {}.", player->getRealName(), newPerm));
+                            fmt::format("Set Player {} Permission Level as {}.", player->getRealName(), newPerm));
             player->setPermissions((CommandPermissionLevel)newPerm);
             res = true;
         }
@@ -638,8 +615,7 @@ Local<Value> PlayerClass::setPermLevel(const Arguments& args)
     CATCH("Fail in setPlayerPermLevel!");
 }
 
-Local<Value> PlayerClass::setGameMode(const Arguments& args)
-{
+Local<Value> PlayerClass::setGameMode(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -650,8 +626,7 @@ Local<Value> PlayerClass::setGameMode(const Arguments& args)
 
         bool res = false;
         int newMode = args[0].asNumber().toInt32();
-        if (newMode >= 0 || newMode <= 3)
-        {
+        if (newMode >= 0 || newMode <= 3) {
             player->setPlayerGameType((GameType)newMode);
             res = true;
         }
@@ -660,12 +635,11 @@ Local<Value> PlayerClass::setGameMode(const Arguments& args)
     CATCH("Fail in setGameMode!");
 }
 
-Local<Value> PlayerClass::runcmd(const Arguments& args)
-{
+Local<Value> PlayerClass::runcmd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -675,41 +649,38 @@ Local<Value> PlayerClass::runcmd(const Arguments& args)
     CATCH("Fail in runcmd!");
 }
 
-Local<Value> PlayerClass::kick(const Arguments& args)
-{
-    if(args.size() >= 1)
-        CHECK_ARG_TYPE(args[0],ValueKind::kString);
+Local<Value> PlayerClass::kick(const Arguments& args) {
+    if (args.size() >= 1)
+        CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try{
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        string msg="正在从服务器断开连接";
-        if(args.size() >= 1)
+        string msg = "disconnectionScreen.disconnected";
+        if (args.size() >= 1)
             msg = args[0].toStr();
-        
+
         player->kick(msg);
-        return Boolean::newBoolean(true);       //=======???
+        return Boolean::newBoolean(true); //=======???
     }
     CATCH("Fail in kickPlayer!");
 }
 
-Local<Value> PlayerClass::tell(const Arguments& args)
-{
+Local<Value> PlayerClass::tell(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try{
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         TextType type = TextType::RAW;
-        if(args.size() >= 2 && args[1].isNumber())
-        {
+        if (args.size() >= 2 && args[1].isNumber()) {
             int newType = args[1].asNumber().toInt32();
-            if(newType >= 0 && newType <= 9)
+            if (newType >= 0 && newType <= 9)
                 type = (TextType)newType;
         }
 
@@ -719,8 +690,7 @@ Local<Value> PlayerClass::tell(const Arguments& args)
     CATCH("Fail in tell!");
 }
 
-Local<Value> PlayerClass::talkAs(const Arguments& args)
-{
+Local<Value> PlayerClass::talkAs(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -735,8 +705,7 @@ Local<Value> PlayerClass::talkAs(const Arguments& args)
     CATCH("Fail in talkAs!");
 }
 
-Local<Value> PlayerClass::talkTo(const Arguments& args)
-{
+Local<Value> PlayerClass::talkTo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -754,8 +723,7 @@ Local<Value> PlayerClass::talkTo(const Arguments& args)
     CATCH("Fail in talkTo!");
 }
 
-Local<Value> PlayerClass::getHand(const Arguments& args)
-{
+Local<Value> PlayerClass::getHand(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -766,20 +734,18 @@ Local<Value> PlayerClass::getHand(const Arguments& args)
     CATCH("Fail in getHand!");
 }
 
-Local<Value> PlayerClass::getOffHand(const Arguments& args)
-{
+Local<Value> PlayerClass::getOffHand(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return ItemClass::newItem((ItemStack*) & player->getOffhandSlot());
+        return ItemClass::newItem((ItemStack*)&player->getOffhandSlot());
     }
     CATCH("Fail in getOffHand!");
 }
 
-Local<Value> PlayerClass::getInventory(const Arguments& args)
-{
+Local<Value> PlayerClass::getInventory(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -790,8 +756,7 @@ Local<Value> PlayerClass::getInventory(const Arguments& args)
     CATCH("Fail in getInventory!");
 }
 
-Local<Value> PlayerClass::getArmor(const Arguments& args)
-{
+Local<Value> PlayerClass::getArmor(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -802,8 +767,7 @@ Local<Value> PlayerClass::getArmor(const Arguments& args)
     CATCH("Fail in getArmor!");
 }
 
-Local<Value> PlayerClass::getEnderChest(const Arguments& args)
-{
+Local<Value> PlayerClass::getEnderChest(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -814,8 +778,7 @@ Local<Value> PlayerClass::getEnderChest(const Arguments& args)
     CATCH("Fail in getEnderChest!");
 }
 
-Local<Value> PlayerClass::getRespawnPosition(const Arguments& args)
-{
+Local<Value> PlayerClass::getRespawnPosition(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -826,60 +789,47 @@ Local<Value> PlayerClass::getRespawnPosition(const Arguments& args)
             if (region)
                 position.first = region->getHeightmapPos(position.first);
         }
-        return IntPos::newPos(position.first,position.second);
+        return IntPos::newPos(position.first, position.second);
     }
     CATCH("Fail in getRespawnPosition!")
 }
 
-Local<Value> PlayerClass::setRespawnPosition(const Arguments& args)
-{
+Local<Value> PlayerClass::setRespawnPosition(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
         IntVec4 pos;
-        if (args.size() == 1)
-        {
+        if (args.size() == 1) {
             // IntPos
-            if (IsInstanceOf<IntPos>(args[0]))
-            {
+            if (IsInstanceOf<IntPos>(args[0])) {
                 // IntPos
                 IntPos* posObj = IntPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = *posObj;
                 }
-            }
-            else if (IsInstanceOf<FloatPos>(args[0]))
-            {
+            } else if (IsInstanceOf<FloatPos>(args[0])) {
                 // FloatPos
                 FloatPos* posObj = FloatPos::extractPos(args[0]);
                 if (posObj->dim < 0)
                     return Boolean::newBoolean(false);
-                else
-                {
+                else {
                     pos = posObj->toIntVec4();
                 }
-            }
-            else
-            {
+            } else {
                 LOG_WRONG_ARG_TYPE();
                 return Local<Value>();
             }
-        }
-        else if (args.size() == 4)
-        {
+        } else if (args.size() == 4) {
             // Number Pos
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
             pos = {args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()};
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARGS_COUNT();
             return Local<Value>();
         }
@@ -889,8 +839,7 @@ Local<Value> PlayerClass::setRespawnPosition(const Arguments& args)
     CATCH("Fail in setRespawnPosition!")
 }
 
-Local<Value> PlayerClass::refreshItems(const Arguments& args)
-{
+Local<Value> PlayerClass::refreshItems(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -901,12 +850,11 @@ Local<Value> PlayerClass::refreshItems(const Arguments& args)
     CATCH("Fail in refreshItems!");
 }
 
-Local<Value> PlayerClass::rename(const Arguments& args)
-{
+Local<Value> PlayerClass::rename(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -916,8 +864,7 @@ Local<Value> PlayerClass::rename(const Arguments& args)
     CATCH("Fail in RenamePlayer!");
 }
 
-Local<Value> PlayerClass::addLevel(const Arguments& args)
-{
+Local<Value> PlayerClass::addLevel(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -932,8 +879,23 @@ Local<Value> PlayerClass::addLevel(const Arguments& args)
     CATCH("Fail in addLevel!");
 }
 
-Local<Value> PlayerClass::getLevel(const Arguments& args)
-{
+Local<Value> PlayerClass::reduceLevel(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        player->addLevels(-args[0].toInt());
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in reduceLevel!");
+}
+
+Local<Value> PlayerClass::getLevel(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -944,33 +906,34 @@ Local<Value> PlayerClass::getLevel(const Arguments& args)
     CATCH("Fail in getLevel!")
 }
 
-Local<Value> PlayerClass::resetLevel(const Arguments& args)
-{
+Local<Value> PlayerClass::setLevel(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        player->resetPlayerLevel();
+        player->addLevels(args[0].toInt() - player->getPlayerLevel());
         return Boolean::newBoolean(true);
     }
-    CATCH("Fail in resetLevel!")
+    CATCH("Fail in setLevel!");
 }
 
-Local<Value> PlayerClass::getXpNeededForNextLevel(const Arguments& args)
-{
+Local<Value> PlayerClass::resetLevel(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return Number::newNumber(player->getXpNeededForNextLevel());
+        player->resetPlayerLevel();
+        return Boolean::newBoolean(true);
     }
-    CATCH("Fail in getXpNeededForNextLevel!")
+    CATCH("Fail in resetLevel!")
 }
 
-Local<Value> PlayerClass::addExperience(const Arguments& args)
-{
+Local<Value> PlayerClass::addExperience(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -985,8 +948,89 @@ Local<Value> PlayerClass::addExperience(const Arguments& args)
     CATCH("Fail in addExperience!");
 }
 
-Local<Value> PlayerClass::transServer(const Arguments& args)
-{
+Local<Value> PlayerClass::reduceExperience(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        player->reduceExperience(args[0].toInt());
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in reduceExperience!");
+}
+
+Local<Value> PlayerClass::getCurrentExperience(const Arguments& arg) {
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+        return Number::newNumber(player->getCurrentExperience());
+    }
+    CATCH("Fail in getCurrentExperience!")
+}
+
+Local<Value> PlayerClass::setCurrentExperience(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        player->setCurrentExperience(args[0].toInt());
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in setCurrentExperience!");
+}
+
+Local<Value> PlayerClass::getTotalExperience(const Arguments& arg) {
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+        return Number::newNumber((int64_t)player->getTotalExperience());
+    }
+    CATCH("Fail in getTotalExperience!")
+}
+
+Local<Value> PlayerClass::setTotalExperience(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
+
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        player->setTotalExperience(args[0].asNumber().toInt64());
+        return Boolean::newBoolean(true);
+    }
+    CATCH("Fail in setTotalExperience!");
+}
+
+Local<Value> PlayerClass::getXpNeededForNextLevel(const Arguments& args) {
+    try {
+        Player* player = get();
+        if (!player) {
+            return Local<Value>();
+        }
+
+        return Number::newNumber(player->getXpNeededForNextLevel());
+    }
+    CATCH("Fail in getXpNeededForNextLevel!")
+}
+
+Local<Value> PlayerClass::transServer(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2)
     CHECK_ARG_TYPE(args[0], ValueKind::kString)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
@@ -996,39 +1040,36 @@ Local<Value> PlayerClass::transServer(const Arguments& args)
         if (!player)
             return Local<Value>();
 
-        return Boolean::newBoolean(player->transferServer(args[0].toStr(), (short) args[1].toInt()));
+        return Boolean::newBoolean(player->transferServer(args[0].toStr(), (short)args[1].toInt()));
     }
     CATCH("Fail in transServer!");
 }
 
-Local<Value> PlayerClass::crash(const Arguments& args)
-{
+Local<Value> PlayerClass::crash(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "Crash Player",
-            "Execute player.crash() to crash player <" + player->getRealName() + ">");
+                        "Execute player.crash() to crash player <" + player->getRealName() + ">");
         return Boolean::newBoolean(player->crashClient());
     }
     CATCH("Fail in crashPlayer!");
 }
 
-Local<Value> PlayerClass::getBlockStandingOn(const Arguments& args)
-{
+Local<Value> PlayerClass::getBlockStandingOn(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
-        return BlockClass::newBlock(player->getBlockPosCurrentlyStandingOn(nullptr),player->getDimensionId());
+        return BlockClass::newBlock(player->getBlockPosCurrentlyStandingOn(nullptr), player->getDimensionId());
     }
     CATCH("Fail in getBlockStandingOn!");
 }
 
-Local<Value> PlayerClass::getDevice(const Arguments& args)
-{
+Local<Value> PlayerClass::getDevice(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1039,12 +1080,11 @@ Local<Value> PlayerClass::getDevice(const Arguments& args)
     CATCH("Fail in getDevice!");
 }
 
-Local<Value> PlayerClass::getScore(const Arguments& args)
-{
+Local<Value> PlayerClass::getScore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1054,13 +1094,12 @@ Local<Value> PlayerClass::getScore(const Arguments& args)
     CATCH("Fail in getScore!");
 }
 
-Local<Value> PlayerClass::setScore(const Arguments& args)
-{
+Local<Value> PlayerClass::setScore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1070,13 +1109,12 @@ Local<Value> PlayerClass::setScore(const Arguments& args)
     CATCH("Fail in setScore!");
 }
 
-Local<Value> PlayerClass::addScore(const Arguments& args)
-{
+Local<Value> PlayerClass::addScore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1086,13 +1124,12 @@ Local<Value> PlayerClass::addScore(const Arguments& args)
     CATCH("Fail in addScore!");
 }
 
-Local<Value> PlayerClass::reduceScore(const Arguments& args)
-{
+Local<Value> PlayerClass::reduceScore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
-    
-    try{
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1102,8 +1139,7 @@ Local<Value> PlayerClass::reduceScore(const Arguments& args)
     CATCH("Fail in reduceScore!");
 }
 
-Local<Value> PlayerClass::deleteScore(const Arguments& args)
-{
+Local<Value> PlayerClass::deleteScore(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1117,16 +1153,14 @@ Local<Value> PlayerClass::deleteScore(const Arguments& args)
     CATCH("Fail in deleteScore!");
 }
 
-Local<Value> PlayerClass::setSidebar(const Arguments& args)
-{
+Local<Value> PlayerClass::setSidebar(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kObject);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
-    
-    try
-    {
+
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1134,8 +1168,7 @@ Local<Value> PlayerClass::setSidebar(const Arguments& args)
         std::vector<std::pair<std::string, int>> data;
         auto source = args[1].asObject();
         auto keys = source.getKeyNames();
-        for (auto& key : keys)
-        {
+        for (auto& key : keys) {
             data.push_back(make_pair(key, source.get(key).toInt()));
         }
 
@@ -1148,9 +1181,8 @@ Local<Value> PlayerClass::setSidebar(const Arguments& args)
     CATCH("Fail in setSidebar!")
 }
 
-Local<Value> PlayerClass::removeSidebar(const Arguments& args)
-{
-    try{
+Local<Value> PlayerClass::removeSidebar(const Arguments& args) {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1160,18 +1192,15 @@ Local<Value> PlayerClass::removeSidebar(const Arguments& args)
     CATCH("Fail in removeSidebar!")
 }
 
-Local<Value> PlayerClass::setBossBar(const Arguments& args)
-{
+Local<Value> PlayerClass::setBossBar(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
-    if (args[0].getKind() == ValueKind::kNumber)
-    {
+    if (args[0].getKind() == ValueKind::kNumber) {
         CHECK_ARGS_COUNT(args, 4);
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[1], ValueKind::kString);
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
         CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
-        try
-        {
+        try {
             Player* player = get();
             if (!player)
                 return Local<Value>();
@@ -1193,15 +1222,15 @@ Local<Value> PlayerClass::setBossBar(const Arguments& args)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
     if (args.size() >= 3)
         CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
-    try{
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         int percent = args[1].toInt();
-        if(percent < 0)
+        if (percent < 0)
             percent = 0;
-        else if(percent > 100)
+        else if (percent > 100)
             percent = 100;
         float value = (float)percent / 100;
         BossEventColour colour = BossEventColour::Red;
@@ -1213,12 +1242,9 @@ Local<Value> PlayerClass::setBossBar(const Arguments& args)
     CATCH("Fail in setBossBar!")
 }
 
-Local<Value> PlayerClass::removeBossBar(const Arguments& args)
-{
-    if (args.size() == 0)
-    {
-        try
-        {
+Local<Value> PlayerClass::removeBossBar(const Arguments& args) {
+    if (args.size() == 0) {
+        try {
             Player* player = get();
             if (!player)
                 return Local<Value>();
@@ -1227,13 +1253,10 @@ Local<Value> PlayerClass::removeBossBar(const Arguments& args)
             return Boolean::newBoolean(true);
         }
         CATCH("Fail in removeBossBar!")
-    }
-    else
-    {
+    } else {
         CHECK_ARGS_COUNT(args, 1);
         CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-        try
-        {
+        try {
             Player* player = get();
             if (!player)
                 return Local<Value>();
@@ -1245,8 +1268,7 @@ Local<Value> PlayerClass::removeBossBar(const Arguments& args)
     }
 }
 
-Local<Value> PlayerClass::sendSimpleForm(const Arguments& args)
-{
+Local<Value> PlayerClass::sendSimpleForm(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 4);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
@@ -1254,8 +1276,7 @@ Local<Value> PlayerClass::sendSimpleForm(const Arguments& args)
     CHECK_ARG_TYPE(args[3], ValueKind::kArray);
     CHECK_ARG_TYPE(args[4], ValueKind::kFunction);
 
-    try
-    {   
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1269,45 +1290,39 @@ Local<Value> PlayerClass::sendSimpleForm(const Arguments& args)
             return Local<Value>();
 
         vector<string> texts, images;
-        for (int i = 0; i < textsArr.size(); ++i)
-        {
+        for (int i = 0; i < textsArr.size(); ++i) {
             texts.push_back(textsArr.get(i).toStr());
         }
-        for (int i = 0; i < imagesArr.size(); ++i)
-        {
+        for (int i = 0; i < imagesArr.size(); ++i) {
             images.push_back(imagesArr.get(i).toStr());
         }
 
         player->sendSimpleFormPacket(args[0].toStr(), args[1].toStr(), texts, images,
-            [id{ player->getUniqueID() }, engine{ EngineScope::currentEngine() },
-            callback{ script::Global(args[4].asFunction()) }]
-        (int chosen)
-        {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-
-            Player* pl = Global<Level>->getPlayer(id);
-            if (!pl)
-                return;
-
-            EngineScope scope(engine);
-            try
-            {
-                callback.get().call({}, PlayerClass::newPlayer(pl),
-                    chosen >= 0 ? Number::newNumber(chosen) : Local<Value>());
-            }
-            CATCH_IN_CALLBACK("sendSimpleForm")
-        });
+                                     [id{player->getUniqueID()}, engine{EngineScope::currentEngine()},
+                                      callback{script::Global(args[4].asFunction())}](int chosen) {
+                                         if (LL::isServerStopping())
+                                             return;
+                                         if (!EngineManager::isValid(engine))
+                                             return;
+
+                                         Player* pl = Global<Level>->getPlayer(id);
+                                         if (!pl)
+                                             return;
+
+                                         EngineScope scope(engine);
+                                         try {
+                                             callback.get().call({}, PlayerClass::newPlayer(pl),
+                                                                 chosen >= 0 ? Number::newNumber(chosen) : Local<Value>());
+                                         }
+                                         CATCH_IN_CALLBACK("sendSimpleForm")
+                                     });
 
         return Number::newNumber(1);
     }
     CATCH("Fail in sendSimpleForm!");
 }
 
-Local<Value> PlayerClass::sendModalForm(const Arguments& args)
-{
+Local<Value> PlayerClass::sendModalForm(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 5);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
@@ -1321,40 +1336,36 @@ Local<Value> PlayerClass::sendModalForm(const Arguments& args)
             return Local<Value>();
 
         player->sendModalFormPacket(args[0].toStr(), args[1].toStr(), args[2].toStr(), args[3].toStr(),
-            [id{ player->getUniqueID() }, engine{ EngineScope::currentEngine() },
-            callback{ script::Global(args[4].asFunction()) }]
-        (bool chosen)
-        {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-
-            Player* pl = Global<Level>->getPlayer(id);
-            if (!pl)
-                return;
-
-            EngineScope scope(engine);
-            try
-            {
-                callback.get().call({}, PlayerClass::newPlayer(pl),
-                    chosen >= 0 ? Boolean::newBoolean(chosen) : Local<Value>());
-            }
-            CATCH_IN_CALLBACK("sendModalForm")
-        });
+                                    [id{player->getUniqueID()}, engine{EngineScope::currentEngine()},
+                                     callback{script::Global(args[4].asFunction())}](bool chosen) {
+                                        if (LL::isServerStopping())
+                                            return;
+                                        if (!EngineManager::isValid(engine))
+                                            return;
+
+                                        Player* pl = Global<Level>->getPlayer(id);
+                                        if (!pl)
+                                            return;
+
+                                        EngineScope scope(engine);
+                                        try {
+                                            callback.get().call({}, PlayerClass::newPlayer(pl),
+                                                                chosen >= 0 ? Boolean::newBoolean(chosen) : Local<Value>());
+                                        }
+                                        CATCH_IN_CALLBACK("sendModalForm")
+                                    });
 
         return Number::newNumber(2);
     }
     CATCH("Fail in sendModalForm!");
 }
 
-Local<Value> PlayerClass::sendCustomForm(const Arguments& args)
-{
+Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
-    try{
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1362,31 +1373,26 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args)
         string data = fifo_json::parse(args[0].toStr()).dump();
 
         player->sendCustomFormPacket(data,
-            [id{ player->getUniqueID() }, engine{ EngineScope::currentEngine() },
-            callback{ script::Global(args[1].asFunction()) }]
-            (string result)
-        {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-
-            Player* pl = Global<Level>->getPlayer(id);
-            if (!pl)
-                return;
-
-            EngineScope scope(engine);
-            try
-            {
-                callback.get().call({}, PlayerClass::newPlayer(pl),
-                    result != "null" ? JsonToValue(result) : Local<Value>());
-            }
-            CATCH_IN_CALLBACK("sendCustomForm")
-        });
+                                     [id{player->getUniqueID()}, engine{EngineScope::currentEngine()},
+                                      callback{script::Global(args[1].asFunction())}](string result) {
+                                         if (LL::isServerStopping())
+                                             return;
+                                         if (!EngineManager::isValid(engine))
+                                             return;
+
+                                         Player* pl = Global<Level>->getPlayer(id);
+                                         if (!pl)
+                                             return;
+
+                                         EngineScope scope(engine);
+                                         try {
+                                             callback.get().call({}, PlayerClass::newPlayer(pl),
+                                                                 result != "null" ? JsonToValue(result) : Local<Value>());
+                                         }
+                                         CATCH_IN_CALLBACK("sendCustomForm")
+                                     });
         return Number::newNumber(3);
-    }
-    catch (const fifo_json::exception& e)
-    {
+    } catch (const fifo_json::exception& e) {
         logger.error("Fail to parse Json string in sendCustomForm!");
         logger.error(TextEncoding::toUTF8(e.what()));
         PrintScriptStackTrace();
@@ -1395,8 +1401,7 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args)
     CATCH("Fail in sendCustomForm!");
 }
 
-Local<Value> PlayerClass::sendForm(const Arguments& args)
-{
+Local<Value> PlayerClass::sendForm(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
 
@@ -1408,18 +1413,13 @@ Local<Value> PlayerClass::sendForm(const Arguments& args)
         bool res = false;
 
         Form::SimpleForm* form = SimpleFormClass::extract(args[0]);
-        if (IsInstanceOf<SimpleFormClass>(args[0]))
-        {
+        if (IsInstanceOf<SimpleFormClass>(args[0])) {
             Local<Function> callback = args[1].asFunction();
             res = SimpleFormClass::sendForm(SimpleFormClass::extract(args[0]), player, callback);
-        }
-        else if (IsInstanceOf<CustomFormClass>(args[0]))
-        {
+        } else if (IsInstanceOf<CustomFormClass>(args[0])) {
             Local<Function> callback = args[1].asFunction();
             res = CustomFormClass::sendForm(CustomFormClass::extract(args[0]), player, callback);
-        }
-        else
-        {
+        } else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -1448,34 +1448,30 @@ Local<Value> PlayerClass::sendPacket(const Arguments& args)
     return Local<Value>();
 }*/
 
-Local<Value> PlayerClass::setExtraData(const Arguments& args)
-{
+Local<Value> PlayerClass::setExtraData(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         string key = args[0].toStr();
-        if(key.empty())
+        if (key.empty())
             return Boolean::newBoolean(false);
-    
+
         ENGINE_OWN_DATA()->playerDataDB[player->getRealName() + "-" + key] = args[1];
         return Boolean::newBoolean(true);
     }
     CATCH("Fail in setExtraData!");
 }
 
-Local<Value> PlayerClass::getExtraData(const Arguments& args)
-{
+Local<Value> PlayerClass::getExtraData(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
@@ -1494,29 +1490,26 @@ Local<Value> PlayerClass::getExtraData(const Arguments& args)
     CATCH("Fail in getExtraData!");
 }
 
-Local<Value> PlayerClass::delExtraData(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> PlayerClass::delExtraData(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try
-    {
+    try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         string key = args[0].toStr();
-        if(key.empty())
+        if (key.empty())
             return Boolean::newBoolean(false);
-    
+
         ENGINE_OWN_DATA()->playerDataDB.erase(player->getRealName() + "-" + key);
         return Boolean::newBoolean(true);
     }
     CATCH("Fail in delExtraData!")
 }
 
-Local<Value> PlayerClass::hurt(const Arguments& args)
-{
+Local<Value> PlayerClass::hurt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -1531,8 +1524,7 @@ Local<Value> PlayerClass::hurt(const Arguments& args)
     CATCH("Fail in hurt!");
 }
 
-Local<Value> PlayerClass::setOnFire(const Arguments& args)
-{
+Local<Value> PlayerClass::setOnFire(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
 
@@ -1548,8 +1540,7 @@ Local<Value> PlayerClass::setOnFire(const Arguments& args)
     CATCH("Fail in setOnFire!");
 }
 
-Local<Value> PlayerClass::refreshChunks(const Arguments& args)
-{
+Local<Value> PlayerClass::refreshChunks(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1561,8 +1552,7 @@ Local<Value> PlayerClass::refreshChunks(const Arguments& args)
     CATCH("Fail in refreshChunks!");
 }
 
-Local<Value> PlayerClass::giveItem(const Arguments& args)
-{
+Local<Value> PlayerClass::giveItem(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -1572,15 +1562,14 @@ Local<Value> PlayerClass::giveItem(const Arguments& args)
 
         auto item = ItemClass::extract(args[0]);
         if (!item)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
 
         return Boolean::newBoolean(player->giveItem(item));
     }
     CATCH("Fail in giveItem!");
 }
 
-Local<Value> PlayerClass::clearItem(const Arguments& args)
-{
+Local<Value> PlayerClass::clearItem(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1594,8 +1583,7 @@ Local<Value> PlayerClass::clearItem(const Arguments& args)
     CATCH("Fail in clearItem!");
 }
 
-Local<Value> PlayerClass::isSprinting(const Arguments& args)
-{
+Local<Value> PlayerClass::isSprinting(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 0);
 
     try {
@@ -1608,8 +1596,7 @@ Local<Value> PlayerClass::isSprinting(const Arguments& args)
     CATCH("Fail in isSprinting!");
 }
 
-Local<Value> PlayerClass::setSprinting(const Arguments& args)
-{
+Local<Value> PlayerClass::setSprinting(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kBoolean);
 
@@ -1624,8 +1611,7 @@ Local<Value> PlayerClass::setSprinting(const Arguments& args)
     CATCH("Fail in setSprinting!");
 }
 
-Local<Value> PlayerClass::getNbt(const Arguments& args)
-{
+Local<Value> PlayerClass::getNbt(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1636,8 +1622,7 @@ Local<Value> PlayerClass::getNbt(const Arguments& args)
     CATCH("Fail in getNbt!")
 }
 
-Local<Value> PlayerClass::setNbt(const Arguments& args)
-{
+Local<Value> PlayerClass::setNbt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -1647,15 +1632,14 @@ Local<Value> PlayerClass::setNbt(const Arguments& args)
 
         auto nbt = NbtCompoundClass::extract(args[0]);
         if (!nbt)
-            return Local<Value>();    //Null
+            return Local<Value>(); // Null
 
         return Boolean::newBoolean(player->setNbt(nbt));
     }
     CATCH("Fail in setNbt!")
 }
 
-Local<Value> PlayerClass::addTag(const Arguments& args)
-{
+Local<Value> PlayerClass::addTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1669,8 +1653,7 @@ Local<Value> PlayerClass::addTag(const Arguments& args)
     CATCH("Fail in addTag!");
 }
 
-Local<Value> PlayerClass::removeTag(const Arguments& args)
-{
+Local<Value> PlayerClass::removeTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1684,8 +1667,7 @@ Local<Value> PlayerClass::removeTag(const Arguments& args)
     CATCH("Fail in removeTag!");
 }
 
-Local<Value> PlayerClass::hasTag(const Arguments& args)
-{
+Local<Value> PlayerClass::hasTag(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
@@ -1699,8 +1681,7 @@ Local<Value> PlayerClass::hasTag(const Arguments& args)
     CATCH("Fail in hasTag!");
 }
 
-Local<Value> PlayerClass::getAllTags(const Arguments& args)
-{
+Local<Value> PlayerClass::getAllTags(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1715,28 +1696,23 @@ Local<Value> PlayerClass::getAllTags(const Arguments& args)
     CATCH("Fail in getAllTags!");
 }
 
-Local<Value> PlayerClass::getAbilities(const Arguments& args)
-{
+Local<Value> PlayerClass::getAbilities(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
             return Local<Value>();
 
         auto list = player->getNbt();
-        try
-        {
+        try {
             return Tag2Value((Tag*)list->getCompoundTag("abilities"), true);
-        }
-        catch (...)
-        {
+        } catch (...) {
             return Object::newObject();
         }
     }
     CATCH("Fail in getAbilities!");
 }
 
-Local<Value> PlayerClass::getAttributes(const Arguments& args)
-{
+Local<Value> PlayerClass::getAttributes(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1745,28 +1721,23 @@ Local<Value> PlayerClass::getAttributes(const Arguments& args)
         Local<Array> res = Array::newArray();
 
         auto list = player->getNbt();
-        try
-        {
+        try {
             ListTag* attr = (ListTag*)list->getListTag("Attributes");
 
             Local<Array> arr = Array::newArray();
-            for (auto& tag : attr->value())
-            {
+            for (auto& tag : attr->value()) {
                 arr.add(Tag2Value(tag, true));
             }
             return arr;
-        }
-        catch (...)
-        {
+        } catch (...) {
             return Array::newArray();
         }
     }
     CATCH("Fail in getAttributes!");
 }
 
-Local<Value> PlayerClass::getEntityFromViewVector(const Arguments& args)
-{
-    
+Local<Value> PlayerClass::getEntityFromViewVector(const Arguments& args) {
+
     try {
         Player* player = get();
         if (!player)
@@ -1784,8 +1755,7 @@ Local<Value> PlayerClass::getEntityFromViewVector(const Arguments& args)
     CATCH("Fail in getEntityFromViewVector!");
 }
 
-Local<Value> PlayerClass::getBlockFromViewVector(const Arguments& args)
-{
+Local<Value> PlayerClass::getBlockFromViewVector(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1819,10 +1789,8 @@ Local<Value> PlayerClass::getBlockFromViewVector(const Arguments& args)
     CATCH("Fail in getBlockFromViewVector!");
 }
 
-Local<Value> PlayerClass::isSimulatedPlayer(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::isSimulatedPlayer(const Arguments& args) {
+    try {
         return Boolean::newBoolean(get()->isSimulatedPlayer());
     }
     CATCH("Fail in isSimulatedPlayer!");
@@ -1833,7 +1801,8 @@ Local<Value> PlayerClass::quickEvalMolangScript(const Arguments& args) {
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     try {
         Player* actor = get();
-        if (!actor) return Local<Value>();
+        if (!actor)
+            return Local<Value>();
         return Number::newNumber(actor->quickEvalMolangScript(args[0].toStr()));
     }
     CATCH("Fail in quickEvalMolangScript!");
@@ -1842,8 +1811,7 @@ Local<Value> PlayerClass::quickEvalMolangScript(const Arguments& args) {
 
 //////////////////// For Compatibility ////////////////////
 
-Local<Value> PlayerClass::getAllItems(const Arguments& args)
-{
+Local<Value> PlayerClass::getAllItems(const Arguments& args) {
     try {
         Player* player = get();
         if (!player)
@@ -1857,32 +1825,29 @@ Local<Value> PlayerClass::getAllItems(const Arguments& args)
 
         Local<Object> result = Object::newObject();
 
-        //hand
+        // hand
         result.set("hand", ItemClass::newItem(hand));
 
-        //offHand
+        // offHand
         result.set("offHand", ItemClass::newItem(offHand));
 
-        //inventory
+        // inventory
         Local<Array> inventoryArr = Array::newArray();
-        for (const ItemStack* item : inventory)
-        {
+        for (const ItemStack* item : inventory) {
             inventoryArr.add(ItemClass::newItem((ItemStack*)item));
         }
         result.set("inventory", inventoryArr);
 
-        //armor
+        // armor
         Local<Array> armorArr = Array::newArray();
-        for (const ItemStack* item : armor)
-        {
+        for (const ItemStack* item : armor) {
             armorArr.add(ItemClass::newItem((ItemStack*)item));
         }
         result.set("armor", armorArr);
 
-        //endChest
+        // endChest
         Local<Array> endChestArr = Array::newArray();
-        for (const ItemStack* item : endChest)
-        {
+        for (const ItemStack* item : endChest) {
             endChestArr.add(ItemClass::newItem((ItemStack*)item));
         }
         result.set("endChest", endChestArr);
@@ -1892,8 +1857,7 @@ Local<Value> PlayerClass::getAllItems(const Arguments& args)
     CATCH("Fail in getAllItems!")
 }
 
-Local<Value> PlayerClass::removeItem(const Arguments& args)
-{
+Local<Value> PlayerClass::removeItem(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     try {
         Player* player = get();
@@ -1920,7 +1884,8 @@ Local<Value> PlayerClass::sendToast(const Arguments& args) {
     try {
         Player* player = get();
 
-        if (!player) return Local<Value>();
+        if (!player)
+            return Local<Value>();
 
         player->sendToastPacket(args[0].toStr(), args[1].toStr());
         return Boolean::newBoolean(true);
diff --git a/ScriptEngine/API/PlayerAPI.h b/ScriptEngine/API/PlayerAPI.h
--- a/ScriptEngine/API/PlayerAPI.h
+++ b/ScriptEngine/API/PlayerAPI.h
@@ -6,12 +6,11 @@ class SimulatedPlayer;
 //////////////////// Classes ////////////////////
 class Player;
 class ActorUniqueID;
-class PlayerClass : public ScriptClass
-{
+class PlayerClass : public ScriptClass {
 private:
     ActorUniqueID id;
     bool isValid = true;
-    
+
 public:
     explicit PlayerClass(Player* p);
 
@@ -19,13 +18,14 @@ class PlayerClass : public ScriptClass
     Player* get();
     SimulatedPlayer* asSimulatedPlayer();
 
-    static Local<Object> newPlayer(Player *p);
+    static Local<Object> newPlayer(Player* p);
     static Player* extract(Local<Value> v);
     Local<Value> getRawPtr(const Arguments& args);
 
     Local<Value> getName();
     Local<Value> getPos();
     Local<Value> getBlockPos();
+    Local<Value> getLastDeathPos();
     Local<Value> getRealName();
     Local<Value> getXuid();
     Local<Value> getUuid();
@@ -40,6 +40,7 @@ class PlayerClass : public ScriptClass
     Local<Value> getDirection();
     Local<Value> getUniqueID();
     Local<Value> getLangCode();
+    Local<Value> isLoading();
 
     Local<Value> isOP(const Arguments& args);
     Local<Value> setPermLevel(const Arguments& args);
@@ -85,16 +86,23 @@ class PlayerClass : public ScriptClass
     Local<Value> setBossBar(const Arguments& args);
     Local<Value> removeBossBar(const Arguments& args);
     Local<Value> addLevel(const Arguments& args);
+    Local<Value> reduceLevel(const Arguments& args);
     Local<Value> getLevel(const Arguments& arg);
+    Local<Value> setLevel(const Arguments& arg);
     Local<Value> resetLevel(const Arguments& arg);
-    Local<Value> getXpNeededForNextLevel(const Arguments& arg);
     Local<Value> addExperience(const Arguments& args);
+    Local<Value> reduceExperience(const Arguments& args);
+    Local<Value> getCurrentExperience(const Arguments& arg);
+    Local<Value> setCurrentExperience(const Arguments& arg);
+    Local<Value> getTotalExperience(const Arguments& arg);
+    Local<Value> setTotalExperience(const Arguments& arg);
+    Local<Value> getXpNeededForNextLevel(const Arguments& arg);
 
     Local<Value> sendSimpleForm(const Arguments& args);
     Local<Value> sendModalForm(const Arguments& args);
     Local<Value> sendCustomForm(const Arguments& args);
     Local<Value> sendForm(const Arguments& args);
-    //Local<Value> sendPacket(const Arguments& args);
+    // Local<Value> sendPacket(const Arguments& args);
 
     Local<Value> setExtraData(const Arguments& args);
     Local<Value> getExtraData(const Arguments& args);
@@ -115,10 +123,10 @@ class PlayerClass : public ScriptClass
     Local<Value> quickEvalMolangScript(const Arguments& args);
 
     // SimulatedPlayer API (API/SimulatedPlayerAPI.cpp)
-    
+
     Local<Value> simulateSneak(const Arguments& args);
     Local<Value> simulateAttack(const Arguments& args);
-    Local<Value> simulateDestory(const Arguments& args);
+    Local<Value> simulateDestroy(const Arguments& args);
     Local<Value> simulateDisconnect(const Arguments& args);
     Local<Value> simulateInteract(const Arguments& args);
     Local<Value> simulateJump(const Arguments& args);
@@ -138,7 +146,7 @@ class PlayerClass : public ScriptClass
     // bool simulateSetItem(class ItemStack&, bool, int);
     // bool simulateGiveItem(class ItemStack&, bool);
 
-    //For Compatibility
+    // For Compatibility
     Local<Value> getIP();
     Local<Value> getAllItems(const Arguments& args);
     Local<Value> removeItem(const Arguments& args);
diff --git a/ScriptEngine/API/RemoteCallAPI.cpp b/ScriptEngine/API/RemoteCallAPI.cpp
--- a/ScriptEngine/API/RemoteCallAPI.cpp
+++ b/ScriptEngine/API/RemoteCallAPI.cpp
@@ -26,8 +26,7 @@ using namespace std;
 //////////////////// Remote Call ////////////////////
 
 RemoteCall::ValueType pack(Local<Value> value);
-RemoteCall::ValueType pack(Local<Object> value)
-{
+RemoteCall::ValueType pack(Local<Object> value) {
     // Player*, Actor*, ItemStack*, Block*, BlockActor*, Container*, Vec3, BlockPos, CompoundTag*
     if (IsInstanceOf<PlayerClass>(value))
         return PlayerClass::extract(value);
@@ -35,8 +34,7 @@ RemoteCall::ValueType pack(Local<Object> value)
         return EntityClass::extract(value);
     if (IsInstanceOf<ItemClass>(value))
         return ItemClass::extract(value);
-    if (IsInstanceOf<BlockClass>(value))
-    {
+    if (IsInstanceOf<BlockClass>(value)) {
         auto blk = EngineScope::currentEngine()->getNativeInstance<BlockClass>(value);
         return blk->toBlockInstance();
     }
@@ -44,8 +42,7 @@ RemoteCall::ValueType pack(Local<Object> value)
         return BlockEntityClass::extract(value);
     if (IsInstanceOf<ContainerClass>(value))
         return ContainerClass::extract(value);
-    if (IsInstanceOf<FloatPos>(value))
-    {
+    if (IsInstanceOf<FloatPos>(value)) {
         auto pos = FloatPos::extractPos(value);
         return std::make_pair(pos->getVec3(), pos->getDimensionId());
     }
@@ -60,18 +57,16 @@ RemoteCall::ValueType pack(Local<Object> value)
         result.emplace(k, pack(value.get(k)));
     return std::move(result);
 }
-RemoteCall::ValueType pack(Local<Array> value)
-{
+RemoteCall::ValueType pack(Local<Array> value) {
     std::vector<RemoteCall::ValueType> result;
-    for (size_t index = 0; index < value.size(); index++)
+    for (size_t index = 0ULL, mEnd = value.size(); index < mEnd; ++index) {
         result.push_back(pack(value.get(index)));
+    }
     return std::move(result);
 }
 
-RemoteCall::ValueType pack(Local<Value> value)
-{
-    switch (value.getKind())
-    {
+RemoteCall::ValueType pack(Local<Value> value) {
+    switch (value.getKind()) {
         case script::ValueKind::kNull:
             return nullptr;
             break;
@@ -81,8 +76,7 @@ RemoteCall::ValueType pack(Local<Value> value)
         case script::ValueKind::kString:
             return value.toStr();
             break;
-        case script::ValueKind::kNumber:
-        {
+        case script::ValueKind::kNumber: {
             auto num = value.asNumber();
             return RemoteCall::NumberType(num.toInt64(), num.toDouble());
             break;
@@ -111,67 +105,52 @@ RemoteCall::ValueType pack(Local<Value> value)
 }
 
 // Player*, Actor*, ItemStack*, Block*, BlockActor*, Container*, Vec3, BlockPos, CompoundTag*
-Local<Value> _extractValue(bool v)
-{
+Local<Value> _extractValue(bool v) {
     return Boolean::newBoolean(v);
 };
-Local<Value> _extractValue(std::string v)
-{
+Local<Value> _extractValue(std::string v) {
     return String::newString(v);
 };
-Local<Value> _extractValue(std::nullptr_t v)
-{
+Local<Value> _extractValue(std::nullptr_t v) {
     return Local<Value>();
 };
-Local<Value> _extractValue(std::string* v)
-{
+Local<Value> _extractValue(std::string* v) {
     return Local<Value>();
 };
-Local<Value> _extractValue(Player* v)
-{
+Local<Value> _extractValue(Player* v) {
     return PlayerClass::newPlayer(v);
 };
-Local<Value> _extractValue(Actor* v)
-{
+Local<Value> _extractValue(Actor* v) {
     return EntityClass::newEntity(v);
 };
-Local<Value> _extractValue(Block* v)
-{
+Local<Value> _extractValue(Block* v) {
     return BlockClass::newBlock(const_cast<Block*>(v), &BlockPos::ZERO, -1);
 };
-Local<Value> _extractValue(BlockActor* const& v)
-{
+Local<Value> _extractValue(BlockActor* const& v) {
     return BlockEntityClass::newBlockEntity(v, -1);
 };
-Local<Value> _extractValue(Container* v)
-{
+Local<Value> _extractValue(Container* v) {
     return ContainerClass::newContainer(v);
 };
-Local<Value> _extractValue(RemoteCall::WorldPosType v)
-{
+Local<Value> _extractValue(RemoteCall::WorldPosType v) {
     return FloatPos::newPos(v.pos, v.dimId);
 };
-Local<Value> _extractValue(RemoteCall::BlockPosType v)
-{
+Local<Value> _extractValue(RemoteCall::BlockPosType v) {
     return IntPos::newPos(v.pos, v.dimId);
 };
-Local<Value> _extractValue(RemoteCall::BlockType v)
-{
+Local<Value> _extractValue(RemoteCall::BlockType v) {
     return BlockClass::newBlock(v.get<BlockInstance>());
 };
-Local<Value> _extractValue(RemoteCall::NumberType v)
-{
+Local<Value> _extractValue(RemoteCall::NumberType v) {
     return Number::newNumber(v.get<double>());
 };
-Local<Value> _extractValue(RemoteCall::ItemType&& v)
-{
+Local<Value> _extractValue(RemoteCall::ItemType&& v) {
     if (v.own)
         return ItemClass::newItem(v.tryGetUniquePtr().release());
     else
         return ItemClass::newItem(const_cast<ItemStack*>(v.ptr));
 };
-Local<Value> _extractValue(RemoteCall::NbtType&& v)
-{
+Local<Value> _extractValue(RemoteCall::NbtType&& v) {
     if (v.own)
         return NbtCompoundClass::pack(v.tryGetUniquePtr());
     else
@@ -180,13 +159,12 @@ Local<Value> _extractValue(RemoteCall::NbtType&& v)
 
 Local<Value> extract(RemoteCall::ValueType&& val);
 
-Local<Value> extractValue(RemoteCall::Value&& val)
-{
+Local<Value> extractValue(RemoteCall::Value&& val) {
     static_assert(std::variant_size_v<RemoteCall::Value> == 13);
-    switch (val.index())
-    {
+    switch (val.index()) {
 #define Extra(index) \
-    case index: return _extractValue(std::move(std::get<index>(val)));
+    case index:      \
+        return _extractValue(std::move(std::get<index>(val)));
         Extra(0);
         Extra(1);
         Extra(2);
@@ -205,28 +183,23 @@ Local<Value> extractValue(RemoteCall::Value&& val)
             break;
     }
 };
-Local<Value> extractValue(std::vector<RemoteCall::ValueType>&& val)
-{
+Local<Value> extractValue(std::vector<RemoteCall::ValueType>&& val) {
     auto arr = Array::newArray();
     for (auto& v : val)
         arr.add(extract(std::move(v)));
     return arr;
 };
-Local<Value> extractValue(std::unordered_map<std::string, RemoteCall::ValueType>&& val)
-{
+Local<Value> extractValue(std::unordered_map<std::string, RemoteCall::ValueType>&& val) {
     auto obj = Object::newObject();
-    for (auto& [k, v] : val)
-    {
+    for (auto& [k, v] : val) {
         obj.set(k, extract(std::move(v)));
     }
     return obj;
 };
 
-Local<Value> extract(RemoteCall::ValueType&& val)
-{
+Local<Value> extract(RemoteCall::ValueType&& val) {
     static_assert(std::variant_size_v<RemoteCall::ValueType::Type> == 3);
-    switch (val.value.index())
-    {
+    switch (val.value.index()) {
         case 0:
             return extractValue(std::move(std::get<0>(val.value)));
         case 1:
@@ -240,26 +213,22 @@ Local<Value> extract(RemoteCall::ValueType&& val)
     }
 }
 
-Local<Value> MakeRemoteCall(const string& nameSpace, const string& funcName, const Arguments& args)
-{
+Local<Value> MakeRemoteCall(const string& nameSpace, const string& funcName, const Arguments& args) {
     auto& func = RemoteCall::importFunc(nameSpace, funcName);
-    if (!func)
-    {
+    if (!func) {
         logger.error("Fail to import! Function [{}::{}] has not been exported!", nameSpace, funcName);
         logger.error("In plugin <{}>", ENGINE_OWN_DATA()->pluginName);
         return Local<Value>();
     }
 
     std::vector<RemoteCall::ValueType> params;
-    for (int i = 0; i < args.size(); ++i)
-    {
+    for (int i = 0; i < args.size(); ++i) {
         params.emplace_back(pack(args[i]));
     }
     return extract(func(std::move(params)));
 }
 
-bool LLSEExportFunc(ScriptEngine* engine, const Local<Function>& func, const string& nameSpace, const string& funcName)
-{
+bool LLSEExportFunc(ScriptEngine* engine, const Local<Function>& func, const string& nameSpace, const string& funcName) {
     // Putting script::Global value into lambda capture list may cause crash
     // script::Global<Function> callback = script::Global<Function>(func);
     std::string identifier = nameSpace + "::" + funcName;
@@ -267,18 +236,15 @@ bool LLSEExportFunc(ScriptEngine* engine, const Local<Function>& func, const str
         if (LL::isServerStopping() || !EngineManager::isValid(engine) || engine->isDestroying())
             return "";
         EngineScope enter(engine);
-        try
-        {
+        try {
             auto iter = ENGINE_GET_DATA(engine)->exportFuncs.find(identifier);
-            if (iter == ENGINE_GET_DATA(engine)->exportFuncs.end())
-            {
+            if (iter == ENGINE_GET_DATA(engine)->exportFuncs.end()) {
                 logger.debug("");
                 return "";
             }
             auto scriptCallback = iter->second.callback.get();
             std::vector<script::Local<Value>> scriptParams;
-            for (auto& param : params)
-            {
+            for (auto& param : params) {
                 scriptParams.emplace_back(extract(std::move(param)));
             }
             return pack(scriptCallback.call({}, scriptParams));
@@ -286,21 +252,18 @@ bool LLSEExportFunc(ScriptEngine* engine, const Local<Function>& func, const str
         CATCH_WITHOUT_RETURN("Fail in Remote Call");
         return "";
     };
-    if (RemoteCall::exportFunc(nameSpace, funcName, std::move(cb)))
-    {
+    if (RemoteCall::exportFunc(nameSpace, funcName, std::move(cb))) {
         ENGINE_GET_DATA(engine)->exportFuncs.emplace(identifier, RemoteCallData{nameSpace, funcName, script::Global<Function>(func)});
         return true;
     }
     return false;
 }
 
-bool LLSERemoveAllExportedFuncs(ScriptEngine* engine)
-{
+bool LLSERemoveAllExportedFuncs(ScriptEngine* engine) {
     // enter scope to prevent crash in script::Global::~Global()
     EngineScope enter(engine);
     std::vector<std::pair<std::string, std::string>> funcs;
-    for (auto& [key, data] : ENGINE_GET_DATA(engine)->exportFuncs)
-    {
+    for (auto& [key, data] : ENGINE_GET_DATA(engine)->exportFuncs) {
         funcs.emplace_back(data.nameSpace, data.funcName);
     }
     int count = RemoteCall::removeFuncs(std::move(funcs));
@@ -311,24 +274,19 @@ bool LLSERemoveAllExportedFuncs(ScriptEngine* engine)
 
 //////////////////// APIs ////////////////////
 
-Local<Value> LlClass::exportFunc(const Arguments& args)
-{
+Local<Value> LlClass::exportFunc(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kFunction);
     CHECK_ARG_TYPE(args[1], ValueKind::kString);
 
-    try
-    {
+    try {
         std::string nameSpace;
         std::string funcName;
-        if (args.size() > 2)
-        {
+        if (args.size() > 2) {
             CHECK_ARG_TYPE(args[2], ValueKind::kString);
             nameSpace = args[1].toStr();
             funcName = args[2].toStr();
-        }
-        else
-        {
+        } else {
             nameSpace = DEFAULT_REMOTE_CALL_NAME_SPACE;
             funcName = args[1].toStr();
         }
@@ -337,23 +295,18 @@ Local<Value> LlClass::exportFunc(const Arguments& args)
     CATCH("Fail in LLSEExport!");
 }
 
-Local<Value> LlClass::importFunc(const Arguments& args)
-{
+Local<Value> LlClass::importFunc(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         std::string nameSpace;
         std::string funcName;
-        if (args.size() > 1)
-        {
+        if (args.size() > 1) {
             CHECK_ARG_TYPE(args[1], ValueKind::kString);
             nameSpace = args[0].toStr();
             funcName = args[1].toStr();
-        }
-        else
-        {
+        } else {
             nameSpace = DEFAULT_REMOTE_CALL_NAME_SPACE;
             funcName = args[0].toStr();
         }
@@ -366,23 +319,18 @@ Local<Value> LlClass::importFunc(const Arguments& args)
     CATCH("Fail in LLSEImport!")
 }
 
-Local<Value> LlClass::hasFuncExported(const Arguments& args)
-{
+Local<Value> LlClass::hasFuncExported(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         std::string nameSpace;
         std::string funcName;
-        if (args.size() > 1)
-        {
+        if (args.size() > 1) {
             CHECK_ARG_TYPE(args[1], ValueKind::kString);
             nameSpace = args[0].toStr();
             funcName = args[1].toStr();
-        }
-        else
-        {
+        } else {
             nameSpace = DEFAULT_REMOTE_CALL_NAME_SPACE;
             funcName = args[0].toStr();
         }
diff --git a/ScriptEngine/API/ScoreboardAPI.cpp b/ScriptEngine/API/ScoreboardAPI.cpp
--- a/ScriptEngine/API/ScoreboardAPI.cpp
+++ b/ScriptEngine/API/ScoreboardAPI.cpp
@@ -11,329 +11,295 @@ using namespace std;
 //////////////////// Class Definition ////////////////////
 
 ClassDefine<ObjectiveClass> ObjectiveClassBuilder =
-	defineClass<ObjectiveClass>("LLSE_Objective")
-		.constructor(nullptr)
-		.instanceProperty("name", &ObjectiveClass::getName)
-		.instanceProperty("displayName", &ObjectiveClass::getDisplayName)
+    defineClass<ObjectiveClass>("LLSE_Objective")
+        .constructor(nullptr)
+        .instanceProperty("name", &ObjectiveClass::getName)
+        .instanceProperty("displayName", &ObjectiveClass::getDisplayName)
 
-		.instanceFunction("setDisplay", &ObjectiveClass::setDisplay)
-		.instanceFunction("setScore", &ObjectiveClass::setScore)
-		.instanceFunction("addScore", &ObjectiveClass::addScore)
-		.instanceFunction("reduceScore", &ObjectiveClass::reduceScore)
-		.instanceFunction("deleteScore", &ObjectiveClass::deleteScore)
-		.instanceFunction("getScore", &ObjectiveClass::getScore)
-		.build();
+        .instanceFunction("setDisplay", &ObjectiveClass::setDisplay)
+        .instanceFunction("setScore", &ObjectiveClass::setScore)
+        .instanceFunction("addScore", &ObjectiveClass::addScore)
+        .instanceFunction("reduceScore", &ObjectiveClass::reduceScore)
+        .instanceFunction("deleteScore", &ObjectiveClass::deleteScore)
+        .instanceFunction("getScore", &ObjectiveClass::getScore)
+        .build();
 
 
 //////////////////// Classes ////////////////////
 
-Local<Object> ObjectiveClass::newObjective(Objective* obj)
-{
-	auto newp = new ObjectiveClass(obj);
-	return newp->getScriptObject();
+Local<Object> ObjectiveClass::newObjective(Objective* obj) {
+    auto newp = new ObjectiveClass(obj);
+    return newp->getScriptObject();
 }
 
-void ObjectiveClass::set(Objective* obj)
-{
-	if (obj)
-	{
-		objname = obj->getName();
-		isValid = true;
-	}
+void ObjectiveClass::set(Objective* obj) {
+    if (obj) {
+        objname = obj->getName();
+        isValid = true;
+    }
 }
 
-Objective* ObjectiveClass::get()
-{
-	if (isValid)
-		return ::Global<Scoreboard>->getObjective(objname);
-	return nullptr;
+Objective* ObjectiveClass::get() {
+    if (isValid)
+        return ::Global<Scoreboard>->getObjective(objname);
+    return nullptr;
 }
 
-Local<Value> ObjectiveClass::getName()
-{
-	try {
-		return String::newString(objname);
-	}
-	CATCH("Fail in getName!")
+Local<Value> ObjectiveClass::getName() {
+    try {
+        return String::newString(objname);
+    }
+    CATCH("Fail in getName!")
 }
 
-Local<Value> ObjectiveClass::getDisplayName()
-{
-	try {
-		Objective* obj = get();
-		if (!obj)
-			return Local<Value>();
-		return String::newString(obj->getDisplayName());
-	}
-	CATCH("Fail in getDisplayName!")
+Local<Value> ObjectiveClass::getDisplayName() {
+    try {
+        Objective* obj = get();
+        if (!obj)
+            return Local<Value>();
+        return String::newString(obj->getDisplayName());
+    }
+    CATCH("Fail in getDisplayName!")
 }
 
-Local<Value> ObjectiveClass::setDisplay(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1)
-	CHECK_ARG_TYPE(args[0], ValueKind::kString)
-	if (args.size() == 2)
-		CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
-
-	try {
-		Objective* obj = get();
-		if (!obj)
-			return Local<Value>();
-
-		string slot = args[0].toStr();
-		int sort = 0;
-		if (args.size() == 2)
-			sort = args[1].toInt();
-
-		return Boolean::newBoolean(obj->setDisplay(slot, (ObjectiveSortOrder)sort));
-	}
-	CATCH("Fail in setDisplay");
+Local<Value> ObjectiveClass::setDisplay(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    if (args.size() == 2)
+        CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
+
+    try {
+        Objective* obj = get();
+        if (!obj)
+            return Local<Value>();
+
+        string slot = args[0].toStr();
+        int sort = 0;
+        if (args.size() == 2)
+            sort = args[1].toInt();
+
+        return Boolean::newBoolean(obj->setDisplay(slot, (ObjectiveSortOrder)sort));
+    }
+    CATCH("Fail in setDisplay");
 }
 
-Local<Value> ObjectiveClass::setScore(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 2)
-	CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
-
-	try {
-		int score = args[1].toInt();
-		Local<Value> rtn;
-
-		string id;
-		if (args[0].isString())
-		{
-			string id = args[0].toStr();
-			std::optional<int> res = Scoreboard::setScore(objname, id, score);
-			if (res)
-				rtn = Number::newNumber(*res);
-		}
-		else if (IsInstanceOf<PlayerClass>(args[0]))
-		{
-			auto pl = PlayerClass::extract(args[0]);
-			if(Scoreboard::setScore(pl,objname,score))
-				rtn = Number::newNumber(Scoreboard::getScore(pl,objname));
-		}
-		else
-		{
+Local<Value> ObjectiveClass::setScore(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
+    CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
+
+    try {
+        int score = args[1].toInt();
+        Local<Value> rtn;
+
+        string id;
+        if (args[0].isString()) {
+            string id = args[0].toStr();
+            std::optional<int> res = Scoreboard::setScore(objname, id, score);
+            if (res)
+                rtn = Number::newNumber(*res);
+        } else if (IsInstanceOf<PlayerClass>(args[0])) {
+            auto pl = PlayerClass::extract(args[0]);
+            if (Scoreboard::setScore(pl, objname, score))
+                rtn = Number::newNumber(Scoreboard::getScore(pl, objname));
+        } else {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		return rtn;
-	}
-	CATCH("Fail in setScore");
+        return rtn;
+    }
+    CATCH("Fail in setScore");
 }
 
-Local<Value> ObjectiveClass::addScore(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 2)
-	CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
-
-	try {
-		int score = args[1].toInt();
-		Local<Value> rtn;
-
-		string id;
-		if (args[0].isString())
-		{
-			string id = args[0].toStr();
-			std::optional<int> res = Scoreboard::addScore(objname, id, score);
-			if (res)
-				rtn = Number::newNumber(*res);
-		}
-		else if (IsInstanceOf<PlayerClass>(args[0]))
-		{
-			auto pl = PlayerClass::extract(args[0]);
-			if (Scoreboard::addScore(pl, objname, score))
-				rtn = Number::newNumber(Scoreboard::getScore(pl, objname));
-		}
-		else
-        {
+Local<Value> ObjectiveClass::addScore(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
+    CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
+
+    try {
+        int score = args[1].toInt();
+        Local<Value> rtn;
+
+        string id;
+        if (args[0].isString()) {
+            string id = args[0].toStr();
+            std::optional<int> res = Scoreboard::addScore(objname, id, score);
+            if (res)
+                rtn = Number::newNumber(*res);
+        } else if (IsInstanceOf<PlayerClass>(args[0])) {
+            auto pl = PlayerClass::extract(args[0]);
+            if (Scoreboard::addScore(pl, objname, score))
+                rtn = Number::newNumber(Scoreboard::getScore(pl, objname));
+        } else {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		return rtn;
-	}
-	CATCH("Fail in addScore");
+        return rtn;
+    }
+    CATCH("Fail in addScore");
 }
 
-Local<Value> ObjectiveClass::reduceScore(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 2)
-	CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
-
-	try {
-		int score = args[1].toInt();
-		Local<Value> rtn;
-
-		string id;
-		if (args[0].isString())
-		{
-			string id = args[0].toStr();
-			std::optional<int> res = Scoreboard::reduceScore(objname, id, score);
-			if (res)
-				rtn = Number::newNumber(*res);
-		}
-		else if (IsInstanceOf<PlayerClass>(args[0]))
-		{
-			auto pl = PlayerClass::extract(args[0]);
-			if (Scoreboard::reduceScore(pl, objname, score))
-				rtn = Number::newNumber(Scoreboard::getScore(pl, objname));
-		}
-		else
-        {
+Local<Value> ObjectiveClass::reduceScore(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 2)
+    CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
+
+    try {
+        int score = args[1].toInt();
+        Local<Value> rtn;
+
+        string id;
+        if (args[0].isString()) {
+            string id = args[0].toStr();
+            std::optional<int> res = Scoreboard::reduceScore(objname, id, score);
+            if (res)
+                rtn = Number::newNumber(*res);
+        } else if (IsInstanceOf<PlayerClass>(args[0])) {
+            auto pl = PlayerClass::extract(args[0]);
+            if (Scoreboard::reduceScore(pl, objname, score))
+                rtn = Number::newNumber(Scoreboard::getScore(pl, objname));
+        } else {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		return rtn;
-	}
-	CATCH("Fail in removeScore");
+        return rtn;
+    }
+    CATCH("Fail in removeScore");
 }
 
-Local<Value> ObjectiveClass::deleteScore(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1)
-
-	try {
-		string id;
-		if (args[0].isString())
-			id = args[0].toStr();
-		else if (IsInstanceOf<PlayerClass>(args[0]))
-			id = PlayerClass::extract(args[0])->getRealName();
-		else
-        {
+Local<Value> ObjectiveClass::deleteScore(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
+    try {
+        string id;
+        if (args[0].isString())
+            id = args[0].toStr();
+        else if (IsInstanceOf<PlayerClass>(args[0]))
+            id = PlayerClass::extract(args[0])->getRealName();
+        else {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		bool res = Scoreboard::removeFromObjective(objname, id);
+        bool res = Scoreboard::removeFromObjective(objname, id);
 
-		return Boolean::newBoolean(res);
-	}
-	CATCH("Fail in deleteScore");
+        return Boolean::newBoolean(res);
+    }
+    CATCH("Fail in deleteScore");
 }
 
-Local<Value> ObjectiveClass::getScore(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1)
-		
-	try {
-		string id;
-		if (args[0].isString())
-			id = args[0].toStr();
-		else if (IsInstanceOf<PlayerClass>(args[0]))
-			id = PlayerClass::extract(args[0])->getRealName();
-		else
-        {
+Local<Value> ObjectiveClass::getScore(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+
+    try {
+        string id;
+        if (args[0].isString())
+            id = args[0].toStr();
+        else if (IsInstanceOf<PlayerClass>(args[0]))
+            id = PlayerClass::extract(args[0])->getRealName();
+        else {
             LOG_WRONG_ARG_TYPE();
-			return Local<Value>();
-		}
+            return Local<Value>();
+        }
 
-		int res = Scoreboard::getScore(objname, id);
+        int res = Scoreboard::getScore(objname, id);
 
-		return Number::newNumber(res);
-	}
-	CATCH("Fail in getScore");
+        return Number::newNumber(res);
+    }
+    CATCH("Fail in getScore");
 }
 
 //////////////////// APIs ////////////////////
 
-Local<Value> McClass::getDisplayObjective(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
-	CHECK_ARG_TYPE(args[0], ValueKind::kString);
+Local<Value> McClass::getDisplayObjective(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-	try {
-		string slot = args[0].toStr();
-		auto res = ::Global<Scoreboard>->getDisplayObjective(slot);
+    try {
+        string slot = args[0].toStr();
+        auto res = ::Global<Scoreboard>->getDisplayObjective(slot);
 
-		if (!res) return Local<Value>();
-		return ObjectiveClass::newObjective((Objective*)res);
-	}
-	CATCH("Fail in GetDisplayObjective");
+        if (!res)
+            return Local<Value>();
+        return ObjectiveClass::newObjective((Objective*)res);
+    }
+    CATCH("Fail in GetDisplayObjective");
 }
 
-Local<Value> McClass::clearDisplayObjective(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
-	CHECK_ARG_TYPE(args[0], ValueKind::kString);
+Local<Value> McClass::clearDisplayObjective(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-	try {
-		string slot = args[0].toStr();
-		auto res = ::Global<Scoreboard>->clearDisplayObjective(slot);
+    try {
+        string slot = args[0].toStr();
+        auto res = ::Global<Scoreboard>->clearDisplayObjective(slot);
 
-		if (!res) return Local<Value>();
-		return ObjectiveClass::newObjective(res);
-	}
-	CATCH("Fail in ClearDisplayObjective");
+        if (!res)
+            return Local<Value>();
+        return ObjectiveClass::newObjective(res);
+    }
+    CATCH("Fail in ClearDisplayObjective");
 }
 
-Local<Value> McClass::getScoreObjective(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1);
-	CHECK_ARG_TYPE(args[0], ValueKind::kString);
+Local<Value> McClass::getScoreObjective(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1);
+    CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-	try {
-		string name = args[0].toStr();
-		auto res = ::Global<Scoreboard>->getObjective(name);
+    try {
+        string name = args[0].toStr();
+        auto res = ::Global<Scoreboard>->getObjective(name);
 
-		if (!res) return Local<Value>();
-		return ObjectiveClass::newObjective(res);
-	}
-	CATCH("Fail in GetScoreObjective");
+        if (!res)
+            return Local<Value>();
+        return ObjectiveClass::newObjective(res);
+    }
+    CATCH("Fail in GetScoreObjective");
 }
 
-Local<Value> McClass::newScoreObjective(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1)
-	CHECK_ARG_TYPE(args[0], ValueKind::kString)
-	if(args.size()>=2)
-		CHECK_ARG_TYPE(args[1], ValueKind::kString)
-
-	try {
-		string name = args[0].toStr();
-		string display = name;
-		if (args.size() >= 2)
-			display = args[1].toStr();
-
-		auto obj = Scoreboard::newObjective(name, display);
-		return obj ? ObjectiveClass::newObjective(obj) : Local<Value>();
-	}
-	CATCH("Fail in NewScoreObjective!")
+Local<Value> McClass::newScoreObjective(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+    if (args.size() >= 2)
+        CHECK_ARG_TYPE(args[1], ValueKind::kString)
+
+    try {
+        string name = args[0].toStr();
+        string display = name;
+        if (args.size() >= 2)
+            display = args[1].toStr();
+
+        auto obj = Scoreboard::newObjective(name, display);
+        return obj ? ObjectiveClass::newObjective(obj) : Local<Value>();
+    }
+    CATCH("Fail in NewScoreObjective!")
 }
 
-Local<Value> McClass::removeScoreObjective(const Arguments& args)
-{
-	CHECK_ARGS_COUNT(args, 1)
-	CHECK_ARG_TYPE(args[0], ValueKind::kString)
-
-	try {
-		string name = args[0].toStr();
-		auto obj = ::Global<Scoreboard>->getObjective(name);
-		if (obj)
-		{
-			::Global<Scoreboard>->removeObjective(obj);
-			return Boolean::newBoolean(true);
-		}
-		return Boolean::newBoolean(false);
-	}
-	CATCH("Fail in RemoveScoreObjective!")
+Local<Value> McClass::removeScoreObjective(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
+
+    try {
+        string name = args[0].toStr();
+        auto obj = ::Global<Scoreboard>->getObjective(name);
+        if (obj) {
+            ::Global<Scoreboard>->removeObjective(obj);
+            return Boolean::newBoolean(true);
+        }
+        return Boolean::newBoolean(false);
+    }
+    CATCH("Fail in RemoveScoreObjective!")
 }
 
-Local<Value> McClass::getAllScoreObjectives(const Arguments& args)
-{
-	try {
-		Local<Array> res = Array::newArray();
-
-		auto objs = ::Global<Scoreboard>->getObjectives();
-		for (auto& obj : objs)
-		{
-			if (obj)
-				res.add(ObjectiveClass::newObjective((Objective*)obj));
-		}
-		return res;
-	}
-	CATCH("Fail in GetAllScoreObjectives!")
+Local<Value> McClass::getAllScoreObjectives(const Arguments& args) {
+    try {
+        Local<Array> res = Array::newArray();
+
+        auto objs = ::Global<Scoreboard>->getObjectives();
+        for (auto& obj : objs) {
+            if (obj)
+                res.add(ObjectiveClass::newObjective((Objective*)obj));
+        }
+        return res;
+    }
+    CATCH("Fail in GetAllScoreObjectives!")
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/ScoreboardAPI.h b/ScriptEngine/API/ScoreboardAPI.h
--- a/ScriptEngine/API/ScoreboardAPI.h
+++ b/ScriptEngine/API/ScoreboardAPI.h
@@ -4,27 +4,26 @@
 
 //////////////////// Classes ////////////////////
 class Objective;
-class ObjectiveClass : public ScriptClass
-{
-	std::string objname;
-	bool isValid = false;
+class ObjectiveClass : public ScriptClass {
+    std::string objname;
+    bool isValid = false;
+
 public:
-	explicit ObjectiveClass(Objective* obj)
-		:ScriptClass(ScriptClass::ConstructFromCpp<ObjectiveClass>{})
-	{
-		set(obj);
-	}
+    explicit ObjectiveClass(Objective* obj)
+    : ScriptClass(ScriptClass::ConstructFromCpp<ObjectiveClass>{}) {
+        set(obj);
+    }
 
-	void set(Objective* obj);
-	Objective* get();
-	static Local<Object> newObjective(Objective* obj);
-	Local<Value> getName();
-	Local<Value> getDisplayName();
-	Local<Value> setDisplay(const Arguments& args);
-	Local<Value> setScore(const Arguments& args);
-	Local<Value> addScore(const Arguments& args);
-	Local<Value> reduceScore(const Arguments& args);
-	Local<Value> deleteScore(const Arguments& args);
-	Local<Value> getScore(const Arguments& args);
+    void set(Objective* obj);
+    Objective* get();
+    static Local<Object> newObjective(Objective* obj);
+    Local<Value> getName();
+    Local<Value> getDisplayName();
+    Local<Value> setDisplay(const Arguments& args);
+    Local<Value> setScore(const Arguments& args);
+    Local<Value> addScore(const Arguments& args);
+    Local<Value> reduceScore(const Arguments& args);
+    Local<Value> deleteScore(const Arguments& args);
+    Local<Value> getScore(const Arguments& args);
 };
 extern ClassDefine<ObjectiveClass> ObjectiveClassBuilder;
\ No newline at end of file
diff --git a/ScriptEngine/API/ScriptAPI.cpp b/ScriptEngine/API/ScriptAPI.cpp
--- a/ScriptEngine/API/ScriptAPI.cpp
+++ b/ScriptEngine/API/ScriptAPI.cpp
@@ -15,8 +15,7 @@ using namespace std;
 
 //////////////////// APIs ////////////////////
 
-Local<Value> Log(const Arguments& args)
-{
+Local<Value> Log(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -31,35 +30,63 @@ Local<Value> Log(const Arguments& args)
 }
 
 //#include <LiteLoader/Main/Config.h>
-Local<Value> ColorLog(const Arguments& args)
-{
+Local<Value> ColorLog(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
         std::string prefix = "";
-        switch (H(args[0].asString().toString().c_str()))
-        {
-            case H("dk_blue")  : prefix = "\x1b[34m";  break;
-            case H("dk_green") : prefix = "\x1b[32m";  break;
-            case H("bt_blue")  : prefix = "\x1b[36m";  break;
-            case H("dk_red")   : prefix = "\x1b[31m";  break;
-            case H("purple")   : prefix = "\x1b[35m";  break;
-            case H("dk_yellow"): prefix = "\x1b[33m";  break;
-            case H("grey")     : prefix = "\x1b[37m";  break;
-            case H("sky_blue") : prefix = "\x1b[94m";  break;
-            case H("blue")     : prefix = "\x1b[94m";  break;
-            case H("green")    : prefix = "\x1b[92m"; break;
-            case H("cyan")     : prefix = "\x1b[36m"; break;
-            case H("red")      : prefix = "\x1b[91m"; break;
-            case H("pink")     : prefix = "\x1b[95m"; break;
-            case H("yellow")   : prefix = "\x1b[93m"; break;
-            case H("white")    : prefix = "\x1b[97m"; break;
-            default: 
+        switch (H(args[0].asString().toString().c_str())) {
+            case H("dk_blue"):
+                prefix = "\x1b[34m";
+                break;
+            case H("dk_green"):
+                prefix = "\x1b[32m";
+                break;
+            case H("bt_blue"):
+                prefix = "\x1b[36m";
+                break;
+            case H("dk_red"):
+                prefix = "\x1b[31m";
+                break;
+            case H("purple"):
+                prefix = "\x1b[35m";
+                break;
+            case H("dk_yellow"):
+                prefix = "\x1b[33m";
+                break;
+            case H("grey"):
+                prefix = "\x1b[37m";
+                break;
+            case H("sky_blue"):
+                prefix = "\x1b[94m";
+                break;
+            case H("blue"):
+                prefix = "\x1b[94m";
+                break;
+            case H("green"):
+                prefix = "\x1b[92m";
+                break;
+            case H("cyan"):
+                prefix = "\x1b[36m";
+                break;
+            case H("red"):
+                prefix = "\x1b[91m";
+                break;
+            case H("pink"):
+                prefix = "\x1b[95m";
+                break;
+            case H("yellow"):
+                prefix = "\x1b[93m";
+                break;
+            case H("white"):
+                prefix = "\x1b[97m";
+                break;
+            default:
                 LOG_ERROR_WITH_SCRIPT_INFO("Invalid color!");
                 break;
         }
-        //if (!LL::globalConfig.colorLog)
-        //    prefix = "";
+        // if (!LL::globalConfig.colorLog)
+        //     prefix = "";
         auto& infoOut = ENGINE_OWN_DATA()->logger.info;
         infoOut << prefix;
         for (int i = 1; i < args.size(); ++i)
@@ -70,8 +97,7 @@ Local<Value> ColorLog(const Arguments& args)
     CATCH("Fail in Log!");
 }
 
-Local<Value> FastLog(const Arguments& args)
-{
+Local<Value> FastLog(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
 
     try {
@@ -80,7 +106,7 @@ Local<Value> FastLog(const Arguments& args)
             PrintValue(sout, args[i]);
         sout << endl;
 
-        pool.enqueue([str{ sout.str() }, pluginName{ ENGINE_OWN_DATA()->pluginName }]() {
+        pool.enqueue([str{sout.str()}, pluginName{ENGINE_OWN_DATA()->pluginName}]() {
             Logger fastLogger(pluginName);
             fastLogger.info(str);
         });
@@ -92,14 +118,12 @@ Local<Value> FastLog(const Arguments& args)
 
 //////////////////// APIs ////////////////////
 
-Local<Value> SetTimeout(const Arguments& args)
-{
+Local<Value> SetTimeout(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
     try {
         bool isFunc = args[0].getKind() == ValueKind::kFunction;
-        if (!isFunc && args[0].getKind() != ValueKind::kString)
-        {
+        if (!isFunc && args[0].getKind() != ValueKind::kString) {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -116,15 +140,13 @@ Local<Value> SetTimeout(const Arguments& args)
     CATCH("Fail in SetTimeout!")
 }
 
-Local<Value> SetInterval(const Arguments& args)
-{
+Local<Value> SetInterval(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2)
     CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
 
     try {
         bool isFunc = args[0].getKind() == ValueKind::kFunction;
-        if (!isFunc && args[0].getKind() != ValueKind::kString)
-        {
+        if (!isFunc && args[0].getKind() != ValueKind::kString) {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -133,7 +155,7 @@ Local<Value> SetInterval(const Arguments& args)
         if (timeout <= 0)
             timeout = 1;
 
-        if(isFunc)
+        if (isFunc)
             return Number::newNumber(NewInterval(args[0].asFunction(), {}, timeout));
         else
             return Number::newNumber(NewInterval(args[0].asString(), timeout));
@@ -142,8 +164,7 @@ Local<Value> SetInterval(const Arguments& args)
 }
 
 // ClearInterval
-Local<Value> ClearInterval(const Arguments& args)
-{
+Local<Value> ClearInterval(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber)
 
diff --git a/ScriptEngine/API/ServerAPI.cpp b/ScriptEngine/API/ServerAPI.cpp
--- a/ScriptEngine/API/ServerAPI.cpp
+++ b/ScriptEngine/API/ServerAPI.cpp
@@ -6,21 +6,19 @@
 #include <MC/ServerNetworkHandler.hpp>
 #include <SafeGuardRecord.h>
 
-Local<Value> McClass::setMotd(const Arguments& args)
-{
-    CHECK_ARGS_COUNT(args,1)
-    CHECK_ARG_TYPE(args[0],ValueKind::kString)
+Local<Value> McClass::setMotd(const Arguments& args) {
+    CHECK_ARGS_COUNT(args, 1)
+    CHECK_ARG_TYPE(args[0], ValueKind::kString)
 
-    try{
+    try {
         return Boolean::newBoolean(LL::setServerMotd(args[0].asString().toString()));
     }
     CATCH("Fail in SetServerMotd!")
 }
 
-Local<Value> McClass::crashBDS(const Arguments& args)               //===========???
+Local<Value> McClass::crashBDS(const Arguments& args) //===========???
 {
-    if (LL::isDebugMode())
-    {
+    if (LL::isDebugMode()) {
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "Crash Server", "Execute mc.crash() to crash server.");
         throw;
         return Boolean::newBoolean(true);
@@ -28,12 +26,11 @@ Local<Value> McClass::crashBDS(const Arguments& args)               //==========
     return Boolean::newBoolean(false);
 }
 
-Local<Value> McClass::setMaxNumPlayers(const Arguments& args)
-{
+Local<Value> McClass::setMaxNumPlayers(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1)
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber)
 
-    try{
+    try {
         int back = Global<ServerNetworkHandler>->setMaxNumPlayers(args[0].asNumber().toInt32());
         Global<ServerNetworkHandler>->updateServerAnnouncement();
         return Boolean::newBoolean(back == 0 ? true : false);
diff --git a/ScriptEngine/API/SimulatedPlayerAPI.cpp b/ScriptEngine/API/SimulatedPlayerAPI.cpp
--- a/ScriptEngine/API/SimulatedPlayerAPI.cpp
+++ b/ScriptEngine/API/SimulatedPlayerAPI.cpp
@@ -31,17 +31,13 @@
 using namespace std;
 
 
-
-Local<Value> McClass::spawnSimulatedPlayer(const Arguments& args)
-{
+Local<Value> McClass::spawnSimulatedPlayer(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
 
-    try
-    {
+    try {
         std::string name = args[0].toStr();
-        if (args.size() == 1)
-        {
+        if (args.size() == 1) {
             if (auto sp = SimulatedPlayer::create(name))
                 return PlayerClass::newPlayer(sp);
             else
@@ -53,21 +49,16 @@ Local<Value> McClass::spawnSimulatedPlayer(const Arguments& args)
             auto pos = IntPos::extractPos(args[1]);
             bpos = pos->getBlockPos();
             dimid = pos->getDimensionId();
-        }
-        else if (IsInstanceOf<FloatPos>(args[1]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[1])) {
             auto pos = FloatPos::extractPos(args[1]);
             bpos = pos->getVec3();
             dimid = pos->getDimensionId();
-        }
-        else
-        {
+        } else {
             CHECK_ARGS_COUNT(args, 4);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
-            if (args.size() > 4)
-            {
+            if (args.size() > 4) {
                 CHECK_ARG_TYPE(args[4], ValueKind::kNumber);
                 dimid = args[4].toInt();
             }
@@ -81,19 +72,15 @@ Local<Value> McClass::spawnSimulatedPlayer(const Arguments& args)
     CATCH("Fail in " __FUNCTION__ "!")
 }
 
-SimulatedPlayer* PlayerClass::asSimulatedPlayer()
-{
-    if (get()->isSimulatedPlayer())
-    {
+SimulatedPlayer* PlayerClass::asSimulatedPlayer() {
+    if (get()->isSimulatedPlayer()) {
         return static_cast<SimulatedPlayer*>(get());
     }
     return nullptr;
 }
 
-Local<Value> PlayerClass::simulateSneak(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateSneak(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -105,64 +92,55 @@ Local<Value> PlayerClass::simulateSneak(const Arguments& args)
 
 // bool simulateAttack(class Actor*);
 // bool simulateAttack();
-Local<Value> PlayerClass::simulateAttack(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateAttack(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
-        
-        if (args.size()==0)
+
+        if (args.size() == 0)
             return Boolean::newBoolean(sp->simulateAttack());
-        
-        if (auto actor = EntityClass::tryExtractActor(args[0]))
-        {
+
+        if (auto actor = EntityClass::tryExtractActor(args[0])) {
             if (!*actor)
                 return Local<Value>();
             return Boolean::newBoolean(sp->simulateAttack(*actor));
         }
-        
+
         LOG_WRONG_ARG_TYPE();
         return Local<Value>();
     }
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
-// bool simulateDestory(); // LIAPI
+// bool simulateDestroy(); // LIAPI
 // bool simulateDestroyBlock(class BlockPos const&, enum ScriptFacing);
-Local<Value> PlayerClass::simulateDestory(const Arguments& args){
-    try
-    {
+Local<Value> PlayerClass::simulateDestroy(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
-        
+
         if (args.size() == 0)
-            return Boolean::newBoolean(sp->simulateDestory());
-        
+            return Boolean::newBoolean(sp->simulateDestroy());
+
         int dimid = sp->getDimensionId();
         BlockPos bpos;
         size_t index = 0;
         ScriptModuleMinecraft::ScriptFacing face = (ScriptModuleMinecraft::ScriptFacing)0;
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[index]);
             if (dimid != pos->getDimensionId())
                 return Local<Value>();
             bpos = pos->getBlockPos();
             index = 1;
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[index]);
             if (dimid != pos->getDimensionId())
                 return Local<Value>();
             bpos = pos->getVec3();
             index = 1;
-        }
-        else if (IsInstanceOf<BlockClass>(args[0]))
-        {
+        } else if (IsInstanceOf<BlockClass>(args[0])) {
             auto block = EngineScope::currentEngine()->getNativeInstance<BlockClass>(args[0]);
             auto pos = IntPos::extractPos(block->getPos());
             if (dimid != pos->getDimensionId())
@@ -171,8 +149,7 @@ Local<Value> PlayerClass::simulateDestory(const Arguments& args){
             index = 1;
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 4);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -181,27 +158,23 @@ Local<Value> PlayerClass::simulateDestory(const Arguments& args){
             index = 3;
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
-        if (args.size() > index)
-        {
+        if (args.size() > index) {
             CHECK_ARG_TYPE(args[index], ValueKind::kNumber);
             face = (ScriptModuleMinecraft::ScriptFacing)args[index].toInt();
         }
-        //TODO
+        // TODO
         return Boolean::newBoolean(sp->simulateDestroyBlock(bpos, face));
     }
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
 // void simulateDisconnect();
-Local<Value> PlayerClass::simulateDisconnect(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateDisconnect(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -214,17 +187,15 @@ Local<Value> PlayerClass::simulateDisconnect(const Arguments& args)
 // bool simulateInteract(class Actor&);
 // bool simulateInteract(class BlockPos const&, enum ScriptFacing);
 // bool simulateInteract();
-Local<Value> PlayerClass::simulateInteract(const Arguments& args){
-    try
-    {
+Local<Value> PlayerClass::simulateInteract(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         if (args.size() == 0)
             return Boolean::newBoolean(sp->simulateInteract());
-        
-        if (auto actor = EntityClass::tryExtractActor(args[0]))
-        {
+
+        if (auto actor = EntityClass::tryExtractActor(args[0])) {
             if (!*actor)
                 return Local<Value>();
             return Boolean::newBoolean(sp->simulateInteract(**actor));
@@ -234,24 +205,19 @@ Local<Value> PlayerClass::simulateInteract(const Arguments& args){
         BlockPos bpos;
         size_t index = 0;
         ScriptModuleMinecraft::ScriptFacing face = (ScriptModuleMinecraft::ScriptFacing)0;
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[index]);
             if (dimid != pos->getDimensionId())
                 return Local<Value>();
             bpos = pos->getBlockPos();
             index = 1;
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[index]);
             if (dimid != pos->getDimensionId())
                 return Local<Value>();
             bpos = pos->getVec3();
             index = 1;
-        }
-        else if (IsInstanceOf<BlockClass>(args[0]))
-        {
+        } else if (IsInstanceOf<BlockClass>(args[0])) {
             auto block = EngineScope::currentEngine()->getNativeInstance<BlockClass>(args[0]);
             auto pos = IntPos::extractPos(block->getPos());
             if (dimid != pos->getDimensionId())
@@ -260,8 +226,7 @@ Local<Value> PlayerClass::simulateInteract(const Arguments& args){
             index = 1;
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 4);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -270,8 +235,7 @@ Local<Value> PlayerClass::simulateInteract(const Arguments& args){
             index = 3;
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
@@ -282,9 +246,8 @@ Local<Value> PlayerClass::simulateInteract(const Arguments& args){
 };
 
 // bool simulateJump();
-Local<Value> PlayerClass::simulateJump(const Arguments& args){
-    try
-    {
+Local<Value> PlayerClass::simulateJump(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -294,32 +257,26 @@ Local<Value> PlayerClass::simulateJump(const Arguments& args){
 };
 
 // void simulateLocalMove(class Vec3 const&, float);
-Local<Value> PlayerClass::simulateLocalMove(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateLocalMove(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    try
-    {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         Vec3 target;
         float speed = 1.0f;
         size_t index = 0;
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[0]);
             target = pos->getBlockPos().toVec3();
             index += 1;
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[0]);
             target = pos->getVec3();
             index += 1;
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 3);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -328,18 +285,16 @@ Local<Value> PlayerClass::simulateLocalMove(const Arguments& args)
             index += 3;
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
-        
-        if (args.size() > index)
-        {
+
+        if (args.size() > index) {
             CHECK_ARG_TYPE(args[index], ValueKind::kNumber);
             speed = args[index].asNumber().toFloat();
         }
-        
+
         sp->simulateLocalMove(target, speed);
         return Boolean::newBoolean(true);
     }
@@ -347,32 +302,26 @@ Local<Value> PlayerClass::simulateLocalMove(const Arguments& args)
 }
 
 // void simulateWorldMove(class Vec3 const&, float);
-Local<Value> PlayerClass::simulateWorldMove(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateWorldMove(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    try
-    {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         Vec3 target;
         float speed = 1.0f;
         size_t index = 0;
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[0]);
             target = pos->getBlockPos().toVec3();
             index += 1;
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[0]);
             target = pos->getVec3();
             index += 1;
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 3);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -381,14 +330,12 @@ Local<Value> PlayerClass::simulateWorldMove(const Arguments& args)
             index += 3;
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
 
-        if (args.size() > index)
-        {
+        if (args.size() > index) {
             CHECK_ARG_TYPE(args[index], ValueKind::kNumber);
             speed = args[index].asNumber().toFloat();
         }
@@ -400,32 +347,26 @@ Local<Value> PlayerClass::simulateWorldMove(const Arguments& args)
 };
 
 // void simulateMoveToLocation(class Vec3 const&, float);
-Local<Value> PlayerClass::simulateMoveTo(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateMoveTo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    try
-    {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         Vec3 target;
         float speed = 1.0f;
         size_t index = 0;
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[0]);
             target = pos->getBlockPos().toVec3();
             index += 1;
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[0]);
             target = pos->getVec3();
             index += 1;
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 3);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
@@ -434,14 +375,12 @@ Local<Value> PlayerClass::simulateMoveTo(const Arguments& args)
             index += 3;
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
 
-        if (args.size() > index)
-        {
+        if (args.size() > index) {
             CHECK_ARG_TYPE(args[index], ValueKind::kNumber);
             speed = args[index].asNumber().toFloat();
         }
@@ -455,55 +394,43 @@ Local<Value> PlayerClass::simulateMoveTo(const Arguments& args)
 // void simulateLookAt(class Actor&);
 // void simulateLookAt(class BlockPos const&);
 // void simulateLookAt(class Vec3 const&);
-Local<Value> PlayerClass::simulateLookAt(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateLookAt(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    try
-    {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         Vec3 target;
         int dimid = sp->getDimensionId();
-        if (IsInstanceOf<IntPos>(args[0]))
-        {
+        if (IsInstanceOf<IntPos>(args[0])) {
             auto pos = IntPos::extractPos(args[0]);
             auto did = pos->getDimensionId();
-            if (dimid == did || did < 0 || did > 2)
-            {
+            if (dimid == did || did < 0 || did > 2) {
                 sp->simulateLookAt(pos->getBlockPos());
                 return Boolean::newBoolean(true);
             }
             logger.debug("Can't simulate look at other dimension!");
             return Boolean::newBoolean(false);
-        }
-        else if (IsInstanceOf<FloatPos>(args[0]))
-        {
+        } else if (IsInstanceOf<FloatPos>(args[0])) {
             auto pos = FloatPos::extractPos(args[0]);
             auto did = pos->getDimensionId();
-            if (dimid == did || did < 0 || did > 2)
-            {
+            if (dimid == did || did < 0 || did > 2) {
                 sp->simulateLookAt(pos->getVec3());
                 return Boolean::newBoolean(true);
             }
             logger.debug("Can't simulate look at other dimension!");
             return Boolean::newBoolean(false);
-        }
-        else if (IsInstanceOf<BlockClass>(args[0]))
-        {
+        } else if (IsInstanceOf<BlockClass>(args[0])) {
             auto block = EngineScope::currentEngine()->getNativeInstance<BlockClass>(args[0]);
             auto pos = IntPos::extractPos(block->getPos());
             auto did = pos->getDimensionId();
-            if (dimid == did || did < 0 || did > 2)
-            {
+            if (dimid == did || did < 0 || did > 2) {
                 sp->simulateLookAt(pos->getBlockPos());
                 return Boolean::newBoolean(true);
             }
             logger.debug("Can't simulate look at other dimension!");
             return Boolean::newBoolean(false);
-        }
-        else if (auto actor = EntityClass::tryExtractActor(args[0]))
-        {
+        } else if (auto actor = EntityClass::tryExtractActor(args[0])) {
             if (!*actor)
                 return Local<Value>();
             sp->simulateLookAt(**actor);
@@ -516,12 +443,10 @@ Local<Value> PlayerClass::simulateLookAt(const Arguments& args)
 };
 
 // void simulateSetBodyRotation(float);
-Local<Value> PlayerClass::simulateSetBodyRotation(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateSetBodyRotation(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
     CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
-    try
-    {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -539,8 +464,7 @@ inline Local<Value> NavigateResultToObject(ScriptModuleMinecraft::ScriptNavigati
     auto obj = Object::newObject();
     obj.set(String::newString("isFullPath"), Boolean::newBoolean(res.mIsFullPath));
     auto path = Array::newArray();
-    for (auto& pos : res.mPath)
-    {
+    for (auto& pos : res.mPath) {
         path.add(Array::newArray({Number::newNumber(pos.x), Number::newNumber(pos.y), Number::newNumber(pos.z)}));
     }
     obj.set(String::newString("path"), path);
@@ -549,75 +473,58 @@ inline Local<Value> NavigateResultToObject(ScriptModuleMinecraft::ScriptNavigati
 // struct ScriptNavigationResult simulateNavigateToEntity(class Actor&, float);
 // struct ScriptNavigationResult simulateNavigateToLocation(class Vec3 const&, float);
 // void simulateNavigateToLocations(std::vector<class Vec3>&&, float);
-Local<Value> PlayerClass::simulateNavigateTo(const Arguments& args)
-{
+Local<Value> PlayerClass::simulateNavigateTo(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 1);
-    
-    try
-    {
-        
+
+    try {
+
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
         float speed = 1.f;
-        if (args.size() > 1)
-        {
+        if (args.size() > 1) {
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             speed = args[1].asNumber().toFloat();
         }
-        if (args[0].isArray())
-        {
+        if (args[0].isArray()) {
             auto arr = args[0].asArray();
             std::vector<Vec3> path;
-            for (size_t index = 0; index < arr.size(); ++index)
-            {
+            for (size_t index = 0; index < arr.size(); ++index) {
                 if (IsInstanceOf<IntPos>(arr.get(index)))
                     path.emplace_back(IntPos::extractPos(arr.get(index))->getBlockPos().center());
                 else if (IsInstanceOf<FloatPos>(arr.get(index)))
                     path.emplace_back(FloatPos::extractPos(arr.get(index))->getVec3());
-                else if (arr.get(index).isArray())
-                {
+                else if (arr.get(index).isArray()) {
                     auto posArr = arr.get(index).asArray();
-                    if (posArr.size() != 3 || !posArr.get(0).isNumber())
-                    {
+                    if (posArr.size() != 3 || !posArr.get(0).isNumber()) {
                         LOG_WRONG_ARG_TYPE();
                         return Local<Value>();
                     }
                     path.emplace_back(posArr.get(0).asNumber().toFloat(), posArr.get(1).asNumber().toFloat(), posArr.get(2).asNumber().toFloat());
-                }
-                else
-                {
+                } else {
                     LOG_WRONG_ARG_TYPE();
                     return Local<Value>();
                 }
             }
             sp->simulateNavigateToLocations(std::move(path), speed);
             return Boolean::newBoolean(true);
-        }
-        else if (auto actor = EntityClass::tryExtractActor(args[0]))
-        {
+        } else if (auto actor = EntityClass::tryExtractActor(args[0])) {
             if (!*actor)
                 return Local<Value>();
             auto res = sp->simulateNavigateToEntity(**actor, speed);
             return NavigateResultToObject(res);
-        }
-        else if (IsInstanceOf<IntPos>(args[0]) || IsInstanceOf<FloatPos>(args[0]))
-        {
-            Vec3 pos = IsInstanceOf<IntPos>(args[0]) ? 
-                IntPos::extractPos(args[0])->getBlockPos().bottomCenter() :
-                FloatPos::extractPos(args[0])->getVec3();
+        } else if (IsInstanceOf<IntPos>(args[0]) || IsInstanceOf<FloatPos>(args[0])) {
+            Vec3 pos = IsInstanceOf<IntPos>(args[0]) ? IntPos::extractPos(args[0])->getBlockPos().bottomCenter() : FloatPos::extractPos(args[0])->getVec3();
             auto res = sp->simulateNavigateToLocation(pos, speed);
             return NavigateResultToObject(res);
         }
 #ifdef ENABLE_NUMBERS_AS_POS
-        else if (args[0].isNumber())
-        {
+        else if (args[0].isNumber()) {
             CHECK_ARGS_COUNT(args, 3);
             CHECK_ARG_TYPE(args[0], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[1], ValueKind::kNumber);
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
-            if (args.size() > 3)
-            {
+            if (args.size() > 3) {
                 CHECK_ARG_TYPE(args[3], ValueKind::kNumber);
                 speed = args[3].asNumber().toFloat();
             }
@@ -626,12 +533,10 @@ Local<Value> PlayerClass::simulateNavigateTo(const Arguments& args)
             return NavigateResultToObject(res);
         }
 #endif // ENABLE_NUMBERS_AS_POS
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
-
     }
     CATCH("Fail in " __FUNCTION__ "!")
 };
@@ -645,30 +550,26 @@ Local<Value> PlayerClass::simulateNavigateTo(const Arguments& args)
 // bool simulateUseItem(class ItemStack&);
 // bool simulateUseItemInSlotOnBlock(int, class BlockPos const&, enum ScriptFacing, class Vec3 const&);
 // bool simulateUseItemOnBlock(class ItemStack&, class BlockPos const&, enum ScriptFacing, class Vec3 const&);
-Local<Value> PlayerClass::simulateUseItem(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateUseItem(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
-        
+
         if (args.size() == 0)
             return Boolean::newBoolean(sp->simulateUseItem());
-        
+
         int slot = -1;
         ItemStack* item = nullptr;
         if (args[0].isNumber())
             slot = args[0].toInt();
         else if (IsInstanceOf<ItemClass>(args[0]))
             item = ItemClass::extract(args[0]);
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
-        if (args.size() == 1)
-        {
+        if (args.size() == 1) {
             if (item)
                 return Boolean::newBoolean(sp->simulateUseItem(*item));
             else
@@ -682,23 +583,17 @@ Local<Value> PlayerClass::simulateUseItem(const Arguments& args)
             bpos = IntPos::extractPos(args[1])->getBlockPos();
         else if (IsInstanceOf<FloatPos>(args[1]))
             bpos = FloatPos::extractPos(args[1])->getVec3();
-        else
-        {
+        else {
             LOG_WRONG_ARG_TYPE();
             return Local<Value>();
         }
-        if (args.size() > 2)
-        {
+        if (args.size() > 2) {
             CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
             face = (ScriptModuleMinecraft::ScriptFacing)args[2].toInt();
-            if (args.size()>3)
-            {
-                if (IsInstanceOf<FloatPos>(args[3]))
-                {
+            if (args.size() > 3) {
+                if (IsInstanceOf<FloatPos>(args[3])) {
                     relativePos = FloatPos::extractPos(args[3])->getVec3();
-                }
-                else
-                {
+                } else {
                     LOG_WRONG_ARG_TYPE();
                     return Local<Value>();
                 }
@@ -708,7 +603,6 @@ Local<Value> PlayerClass::simulateUseItem(const Arguments& args)
             return Boolean::newBoolean(sp->simulateUseItemOnBlock(*item, bpos, face, relativePos));
         else
             return Boolean::newBoolean(sp->simulateUseItemInSlotOnBlock(slot, bpos, face, relativePos));
-
     }
     CATCH("Fail in " __FUNCTION__ "!")
 };
@@ -717,10 +611,8 @@ Local<Value> PlayerClass::simulateUseItem(const Arguments& args)
 // void simulateStopInteracting();
 // void simulateStopMoving();
 // void simulateStopUsingItem();
-Local<Value> PlayerClass::simulateStopDestroyingBlock(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateStopDestroyingBlock(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -730,10 +622,8 @@ Local<Value> PlayerClass::simulateStopDestroyingBlock(const Arguments& args)
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
-Local<Value> PlayerClass::simulateStopInteracting(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateStopInteracting(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -743,10 +633,8 @@ Local<Value> PlayerClass::simulateStopInteracting(const Arguments& args)
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
-Local<Value> PlayerClass::simulateStopMoving(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateStopMoving(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -756,10 +644,8 @@ Local<Value> PlayerClass::simulateStopMoving(const Arguments& args)
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
-Local<Value> PlayerClass::simulateStopUsingItem(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateStopUsingItem(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
@@ -769,14 +655,12 @@ Local<Value> PlayerClass::simulateStopUsingItem(const Arguments& args)
     CATCH("Fail in " __FUNCTION__ "!")
 };
 
-Local<Value> PlayerClass::simulateStopSneaking(const Arguments& args)
-{
-    try
-    {
+Local<Value> PlayerClass::simulateStopSneaking(const Arguments& args) {
+    try {
         auto sp = asSimulatedPlayer();
         if (!sp)
             return Local<Value>();
-        
+
         return Boolean::newBoolean(sp->simulateStopSneaking());
     }
     CATCH("Fail in " __FUNCTION__ "!")
diff --git a/ScriptEngine/API/SystemAPI.cpp b/ScriptEngine/API/SystemAPI.cpp
--- a/ScriptEngine/API/SystemAPI.cpp
+++ b/ScriptEngine/API/SystemAPI.cpp
@@ -22,8 +22,7 @@ ClassDefine<void> SystemClassBuilder =
         .build();
 
 
-Local<Value> SystemClass::cmd(const Arguments& args)
-{
+Local<Value> SystemClass::cmd(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -34,10 +33,11 @@ Local<Value> SystemClass::cmd(const Arguments& args)
         string cmd = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "ExecuteSystemCommand", cmd);
 
-        script::Global<Function> callbackFunc{ args[1].asFunction() };
+        script::Global<Function> callbackFunc{args[1].asFunction()};
 
-        return Boolean::newBoolean(NewProcess("cmd /c" + cmd,
-            [callback{ std::move(callbackFunc) }, engine{ EngineScope::currentEngine() }](int exitCode, string output) {
+        return Boolean::newBoolean(NewProcess(
+            "cmd /c" + cmd,
+            [callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}](int exitCode, string output) {
                 Schedule::nextTick(
                     [engine, callback = std::move(callback), exitCode, output = std::move(output)]() {
                         if (LL::isServerStopping())
@@ -46,20 +46,18 @@ Local<Value> SystemClass::cmd(const Arguments& args)
                             return;
 
                         EngineScope scope(engine);
-                        try
-                        {
+                        try {
                             NewTimeout(callback.get(), {Number::newNumber(exitCode), String::newString(output)}, 1);
                         }
                         CATCH_IN_CALLBACK("SystemCmd")
                     });
-            }
-        , args.size() >= 3 ? args[2].toInt() : -1));
+            },
+            args.size() >= 3 ? args[2].toInt() : -1));
     }
     CATCH("Fail in SystemCmd");
 }
 
-Local<Value> SystemClass::newProcess(const Arguments& args)
-{
+Local<Value> SystemClass::newProcess(const Arguments& args) {
     CHECK_ARGS_COUNT(args, 2);
     CHECK_ARG_TYPE(args[0], ValueKind::kString);
     CHECK_ARG_TYPE(args[1], ValueKind::kFunction);
@@ -70,9 +68,10 @@ Local<Value> SystemClass::newProcess(const Arguments& args)
         string process = args[0].toStr();
         RecordOperation(ENGINE_OWN_DATA()->pluginName, "CreateNewProcess", process);
 
-        script::Global<Function> callbackFunc{ args[1].asFunction() };
+        script::Global<Function> callbackFunc{args[1].asFunction()};
 
-        return Boolean::newBoolean(NewProcess(process,
+        return Boolean::newBoolean(NewProcess(
+            process,
             [callback{std::move(callbackFunc)}, engine{EngineScope::currentEngine()}](int exitCode, string output) {
                 Schedule::nextTick(
                     [engine, callback = std::move(callback), exitCode, output = std::move(output)]() {
@@ -82,28 +81,25 @@ Local<Value> SystemClass::newProcess(const Arguments& args)
                             return;
 
                         EngineScope scope(engine);
-                        try
-                        {
+                        try {
                             NewTimeout(callback.get(), {Number::newNumber(exitCode), String::newString(output)}, 1);
                         }
                         CATCH_IN_CALLBACK("newProcess")
                     });
-            }
-        , args.size() >= 3 ? args[2].toInt() : -1));
+            },
+            args.size() >= 3 ? args[2].toInt() : -1));
     }
     CATCH("Fail in newProcess");
 }
 
-Local<Value> SystemClass::getTimeStr(const Arguments& args)
-{
+Local<Value> SystemClass::getTimeStr(const Arguments& args) {
     try {
         return String::newString(Raw_GetDateTimeStr());
     }
     CATCH("Fail in GetTimeStr!")
 }
 
-Local<Value> SystemClass::getTimeObj(const Arguments& args)
-{
+Local<Value> SystemClass::getTimeObj(const Arguments& args) {
     try {
         SYSTEMTIME st;
         GetLocalTime(&st);
@@ -120,7 +116,6 @@ Local<Value> SystemClass::getTimeObj(const Arguments& args)
     CATCH("Fail in GetTimeNow!")
 }
 
-Local<Value> SystemClass::randomGuid(const Arguments& args)
-{
+Local<Value> SystemClass::randomGuid(const Arguments& args) {
     return String::newString(Raw_RandomGuid());
 }
\ No newline at end of file
diff --git a/ScriptEngine/API/SystemAPI.h b/ScriptEngine/API/SystemAPI.h
--- a/ScriptEngine/API/SystemAPI.h
+++ b/ScriptEngine/API/SystemAPI.h
@@ -4,8 +4,7 @@
 
 //////////////////// System Static ////////////////////
 
-class SystemClass
-{
+class SystemClass {
 public:
     static Local<Value> getTimeStr(const Arguments& args);
     static Local<Value> getTimeObj(const Arguments& args);
diff --git a/ScriptEngine/BaseLib/BaseLib.js b/ScriptEngine/BaseLib/BaseLib.js
--- a/ScriptEngine/BaseLib/BaseLib.js
+++ b/ScriptEngine/BaseLib/BaseLib.js
@@ -21,8 +21,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 */
-(function(){
-    if(typeof require != "undefined") {
+(function () {
+    if (typeof require != "undefined") {
         log('require already exist');
     }
 
@@ -33,31 +33,31 @@ SOFTWARE.
     let utilPath = {
         normalize(path) {
             let dirs = path.split('/');
-            if(dirs[dirs.length - 1] === '') {
+            if (dirs[dirs.length - 1] === '') {
                 dirs.pop();
             }
             let newDirs = dirs.reduce((newDirs, dir) => {
-                switch(dir) {
-                case '.':
-                    /* no-op */
-                    break;
-                case '..':
-                    if(newDirs.length === 0 || newDirs[newDirs.length - 1] == '..') {
-                        newDirs.push('..');
-                    } else {
-                        newDirs.pop();
-                    }
-                    break;
-                default:
-                    newDirs.push(dir);
-                    break;
+                switch (dir) {
+                    case '.':
+                        /* no-op */
+                        break;
+                    case '..':
+                        if (newDirs.length === 0 || newDirs[newDirs.length - 1] == '..') {
+                            newDirs.push('..');
+                        } else {
+                            newDirs.pop();
+                        }
+                        break;
+                    default:
+                        newDirs.push(dir);
+                        break;
                 }
                 return newDirs;
             }, []);
             return newDirs.join('/');
         },
         join(...paths) {
-            let newPath = paths.map((path)=>{
+            let newPath = paths.map((path) => {
                 return utilPath.normalize(path);
             }).join('/');
             return utilPath.normalize(newPath);
@@ -82,66 +82,66 @@ SOFTWARE.
         let currentPath = (currentModule && currentModule.path) || basePath;
         let requestPaths = [];
         let result;
-        if(coreModules.has(id)) {
+        if (coreModules.has(id)) {
             return coreModules.get(id);
         }
-        if(id.startsWith('/')) {
+        if (id.startsWith('/')) {
             result = loadAsFile(id);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = loadAsDirectory(id);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             throw new Error(`${id} not found`);
         }
-        if(id.startsWith('./') || id.startsWith('../')) {
+        if (id.startsWith('./') || id.startsWith('../')) {
             result = loadAsFile(utilPath.join(currentPath, id));
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = loadAsDirectory(utilPath.join(currentPath, id));
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             throw new Error(`${utilPath.join(currentPath, id)} not found`);
         }
-        if(id.startsWith('#')) {
+        if (id.startsWith('#')) {
             result = loadPackageImports(id, currentPath);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
         }
         result = loadPackageSelf(id, currentPath);
-        if(result != undefined) {
+        if (result != undefined) {
             return result;
         }
         result = loadNodeModules(id, currentPath);
-        if(result != undefined) {
+        if (result != undefined) {
             return result;
         }
         throw new Error(`${id} not found, required by ${(currentModule && currentModule.id)}`);
 
 
         function tryFile(path) {
-            if(path.startsWith('../')) {
+            if (path.startsWith('../')) {
                 throw new Error('cannot require file out of root dir');
             }
             path = path.replace(/^\//, '');
             let cjsSelf = 'plugins/cjs.js';
-            if(path === cjsSelf) {
+            if (path === cjsSelf) {
                 throw new Error('cjs.js is trying to load itself');
             }
             requestPaths.push(path);
             let content = file.readFrom(path);
-            if(content == undefined) {
+            if (content == undefined) {
                 return undefined;
             }
-            if(path.endsWith('.mjs')) {
+            if (path.endsWith('.mjs')) {
                 throw new Error(`ERROR: cannot require a ESM file ${path}`);
             }
-            if(path.endsWith('.json')) {
+            if (path.endsWith('.json')) {
                 throw new Error(`ERROR: cannot require a JSON file ${path}`);
             }
             return {
@@ -154,23 +154,23 @@ SOFTWARE.
         function loadAsFile(id) {
             let result;
             result = tryFile(id);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = tryFile(`${id}.js`);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = tryFile(`${id}.cjs`);
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = tryFile(`${id}.json`);
-            if(result != undefined) {
+            if (result != undefined) {
                 throw new Error(`cannot require a JSON file ${id}.mjs`);
             }
             result = tryFile(`${id}.mjs`);
-            if(result != undefined) {
+            if (result != undefined) {
                 throw new Error(`cannot require a ESM file ${id}.mjs`);
             }
             return undefined;
@@ -179,19 +179,19 @@ SOFTWARE.
         function loadIndex(id) {
             let result;
             result = tryFile(utilPath.join(id, 'index.js'));
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = tryFile(utilPath.join(id, 'index.cjs'));
-            if(result != undefined) {
+            if (result != undefined) {
                 return result;
             }
             result = tryFile(utilPath.join(id, 'index.json'));
-            if(result != undefined) {
+            if (result != undefined) {
                 throw new Error(`cannot require a JSON file ${id}.mjs`);
             }
             result = tryFile(utilPath.join(id, 'index.mjs'));
-            if(result != undefined) {
+            if (result != undefined) {
                 throw new Error(`cannot require a ESM file ${id}.mjs`);
             }
             return undefined;
@@ -199,19 +199,19 @@ SOFTWARE.
 
         function loadAsDirectory(id) {
             let package = file.readFrom(utilPath.join(id, 'package.json'));
-            if(package != undefined) {
+            if (package != undefined) {
                 let result;
                 package = JSON.parse(package);
-                if(!package || !package.main) {
+                if (!package || !package.main) {
                     return loadIndex(id);
                 }
                 let m = utilPath.join(id, package.main);
                 result = loadAsFile(m);
-                if(result != undefined) {
+                if (result != undefined) {
                     return result;
                 }
                 result = loadIndex(m);
-                if(result != undefined) {
+                if (result != undefined) {
                     return result;
                 }
                 throw new Error(`${m} not found`);
@@ -219,21 +219,21 @@ SOFTWARE.
             return loadIndex(id);
         }
 
-        
+
         function loadNodeModules(id, start) {
             let dirs = node_modules_paths(start);
             let result;
-            for(let dir of dirs) {
+            for (let dir of dirs) {
                 result = loadPackagExports(utilPath.join(dir, id));
-                if(result != undefined) {
+                if (result != undefined) {
                     return result;
                 }
                 result = loadAsFile(utilPath.join(dir, id));
-                if(result != undefined) {
+                if (result != undefined) {
                     return result;
                 }
                 result = loadAsDirectory(utilPath.join(dir, id));
-                if(result != undefined) {
+                if (result != undefined) {
                     return result;
                 }
             }
@@ -243,8 +243,8 @@ SOFTWARE.
         function node_modules_paths(start) {
             let parts = utilPath.split(start);
             let dirs = [''];
-            for(let i = parts.length; i >= 0; --i) {
-                if(parts[i - 1] === "node_modules") {
+            for (let i = parts.length; i >= 0; --i) {
+                if (parts[i - 1] === "node_modules") {
                     continue;
                 }
                 let dir = utilPath.join(...parts.slice(0, i), "node_modules");
@@ -256,11 +256,11 @@ SOFTWARE.
         function loadPackageImports(id) {
             //TODO
             let package = file.readFrom(utilPath.join(id, 'package.json'));
-            if(package == undefined) {
+            if (package == undefined) {
                 return undefined;
             }
             package = JSON.parse(package);
-            if(package && package.imports) {
+            if (package && package.imports) {
                 throw new Error(`cannot resolve imports field of ${id}`);
             }
             return undefined;
@@ -269,11 +269,11 @@ SOFTWARE.
         function loadPackagExports(id) {
             //TODO
             let package = file.readFrom(utilPath.join(id, 'package.json'));
-            if(package == undefined) {
+            if (package == undefined) {
                 return undefined;
             }
             package = JSON.parse(package);
-            if(package && package.exports) {
+            if (package && package.exports) {
                 throw new Error(`cannot resolve exports field of ${id}`);
             }
             return undefined;
@@ -301,13 +301,13 @@ SOFTWARE.
 
     function cjsRequire(id) {
         let parrentModule = currentModule;
-        let {path, content} = resolveID(id);
-        if(cjsRequire.cache[path] !== undefined) {
+        let { path, content } = resolveID(id);
+        if (cjsRequire.cache[path] !== undefined) {
             let thisModule = cjsRequire.cache[path];
-            if(parrentModule && !parrentModule.children.includes(thisModule)) {
+            if (parrentModule && !parrentModule.children.includes(thisModule)) {
                 parrentModule.children.push(thisModule);
             }
-            if(thisModule.loaded === false) {
+            if (thisModule.loaded === false) {
                 //TODO
             }
             return thisModule.exports;
@@ -316,7 +316,7 @@ SOFTWARE.
         currentModule = moduleObject;
         cjsRequire.cache[path] = moduleObject;
         let code;
-        try{
+        try {
             code = new Function(
                 'exports',
                 'require',
@@ -325,15 +325,15 @@ SOFTWARE.
                 '__dirname',
                 content
             );
-        }catch(e){
+        } catch (e) {
             e.stack = e.stack.replace(
                 'at new Function (<anonymous>)',
                 `at Object.<anonymous> (${moduleObject.id})`
             );
             throw e;
         }
-        Object.defineProperty(code, 'name', {value: `@file"${moduleObject.id}"`});
-        try{
+        Object.defineProperty(code, 'name', { value: `@file"${moduleObject.id}"` });
+        try {
             code.apply(moduleObject, [
                 moduleObject.exports,
                 cjsRequire,
@@ -341,7 +341,7 @@ SOFTWARE.
                 path,
                 utilPath.dirname(path)
             ]);
-        }catch(e) {
+        } catch (e) {
             e.stack = e.stack.replace(
                 /at Object\.@file"([^"]*)" \(eval at cjsRequire \(:\d+:\d+\), <anonymous>:(\d+):(\d+)\)/g,
                 (match, fileName, line, col) => {
diff --git a/ScriptEngine/Configs.h b/ScriptEngine/Configs.h
--- a/ScriptEngine/Configs.h
+++ b/ScriptEngine/Configs.h
@@ -9,25 +9,25 @@
 #define LLSE_BACKEND_LUA "Lua"
 
 #if defined(SCRIPTX_LANG_JAVASCRIPT)
-	#define LLSE_BACKEND_TYPE LLSE_BACKEND_JS
-	#define LLSE_PLUGINS_EXTENSION ".js"
+    #define LLSE_BACKEND_TYPE LLSE_BACKEND_JS
+    #define LLSE_PLUGINS_EXTENSION ".js"
 #elif defined(SCRIPTX_LANG_LUA)
-	#define LLSE_BACKEND_TYPE LLSE_BACKEND_LUA
-	#define LLSE_PLUGINS_EXTENSION ".lua"
+    #define LLSE_BACKEND_TYPE LLSE_BACKEND_LUA
+    #define LLSE_PLUGINS_EXTENSION ".lua"
 #endif
 
-#define LLSE_VALID_BACKENDS				std::set<std::string>({"Js", "Lua"})
-#define LLSE_VALID_PLUGIN_EXTENSIONS	std::set<std::string>({".js",".lua"})
-#define LLSE_VALID_BACKENDS_COUNT		LLSE_VALID_BACKENDS.size()
+#define LLSE_VALID_BACKENDS             std::set<std::string>({"Js", "Lua"})
+#define LLSE_VALID_PLUGIN_EXTENSIONS    std::set<std::string>({".js",".lua"})
+#define LLSE_VALID_BACKENDS_COUNT       LLSE_VALID_BACKENDS.size()
 
 
 // 插件注册信息
 #if defined(SCRIPTX_LANG_JAVASCRIPT)
-	#define LLSE_LOADER_NAME "ScriptEngine-Js"
-	#define LLSE_LOADER_DESCRIPTION "Javascript ScriptEngine for LiteLoaderBDS"
+    #define LLSE_LOADER_NAME "ScriptEngine-Js"
+    #define LLSE_LOADER_DESCRIPTION "Javascript ScriptEngine for LiteLoaderBDS"
 #elif defined(SCRIPTX_LANG_LUA)
-	#define LLSE_LOADER_NAME "ScriptEngine-Lua"
-	#define LLSE_LOADER_DESCRIPTION "Lua ScriptEngine for LiteLoaderBDS"
+    #define LLSE_LOADER_NAME "ScriptEngine-Lua"
+    #define LLSE_LOADER_DESCRIPTION "Lua ScriptEngine for LiteLoaderBDS"
 #endif
 
 #define LLSE_MODULE_TYPE LLSE_BACKEND_TYPE
@@ -41,9 +41,9 @@
 
 // 调试引擎
 #if defined(SCRIPTX_LANG_JAVASCRIPT)
-	#define LLSE_DEBUG_CMD "jsdebug"
+    #define LLSE_DEBUG_CMD "jsdebug"
 #elif defined(SCRIPTX_LANG_LUA)
-	#define LLSE_DEBUG_CMD "luadebug"
+    #define LLSE_DEBUG_CMD "luadebug"
 #endif
 #define LLSE_DEBUG_ENGINE_NAME "__LLSE_DEBUG_ENGINE__"
 
diff --git a/ScriptEngine/Engine/EngineManager.cpp b/ScriptEngine/Engine/EngineManager.cpp
--- a/ScriptEngine/Engine/EngineManager.cpp
+++ b/ScriptEngine/Engine/EngineManager.cpp
@@ -8,27 +8,23 @@ using namespace script;
 
 ///////////////////////////////// API /////////////////////////////////
 
-bool EngineManager::unRegisterEngine(ScriptEngine* toDelete)
-{
+bool EngineManager::unRegisterEngine(ScriptEngine* toDelete) {
     SRWLockHolder lock(globalShareData->engineListLock);
-    for(auto engine = globalShareData->globalEngineList.begin(); engine != globalShareData->globalEngineList.end(); ++engine)
-        if (*engine == toDelete)
-        {
+    for (auto engine = globalShareData->globalEngineList.begin(); engine != globalShareData->globalEngineList.end(); ++engine)
+        if (*engine == toDelete) {
             globalShareData->globalEngineList.erase(engine);
             return true;
         }
     return false;
 }
 
-bool EngineManager::registerEngine(ScriptEngine* engine)
-{
+bool EngineManager::registerEngine(ScriptEngine* engine) {
     SRWLockHolder lock(globalShareData->engineListLock);
     globalShareData->globalEngineList.push_back(engine);
     return true;
 }
 
-ScriptEngine* EngineManager::newEngine(string pluginName)
-{
+ScriptEngine* EngineManager::newEngine(string pluginName) {
     ScriptEngine* engine;
 
 #if !defined(SCRIPTX_BACKEND_WEBASSEMBLY)
@@ -38,19 +34,17 @@ ScriptEngine* EngineManager::newEngine(string pluginName)
 #endif
 
     engine->setData(make_shared<EngineOwnData>());
-    
+
     registerEngine(engine);
     if (!pluginName.empty())
         ENGINE_GET_DATA(engine)->pluginName = pluginName;
     return engine;
 }
 
-bool EngineManager::isValid(ScriptEngine* engine, bool onlyCheckLocal)
-{
+bool EngineManager::isValid(ScriptEngine* engine, bool onlyCheckLocal) {
     SRWLockSharedHolder lock(globalShareData->engineListLock);
     for (auto i = globalShareData->globalEngineList.begin(); i != globalShareData->globalEngineList.end(); ++i)
-        if (*i == engine)
-        {
+        if (*i == engine) {
             if (engine->isDestroying())
                 return false;
             if (onlyCheckLocal && getEngineType(engine) != LLSE_BACKEND_TYPE)
@@ -61,34 +55,28 @@ bool EngineManager::isValid(ScriptEngine* engine, bool onlyCheckLocal)
     return false;
 }
 
-std::vector<ScriptEngine*> EngineManager::getLocalEngines()
-{
+std::vector<ScriptEngine*> EngineManager::getLocalEngines() {
     std::vector<ScriptEngine*> res;
     SRWLockSharedHolder lock(globalShareData->engineListLock);
-    for (auto& engine : globalShareData->globalEngineList)
-    {
+    for (auto& engine : globalShareData->globalEngineList) {
         if (getEngineType(engine) == LLSE_BACKEND_TYPE)
             res.push_back(engine);
     }
     return res;
 }
 
-std::vector<ScriptEngine*> EngineManager::getGlobalEngines()
-{
+std::vector<ScriptEngine*> EngineManager::getGlobalEngines() {
     std::vector<ScriptEngine*> res;
     SRWLockSharedHolder lock(globalShareData->engineListLock);
-    for (auto& engine : globalShareData->globalEngineList)
-    {
+    for (auto& engine : globalShareData->globalEngineList) {
         res.push_back(engine);
     }
     return res;
 }
 
-ScriptEngine* EngineManager::getEngine(std::string name, bool onlyLocalEngine)
-{
+ScriptEngine* EngineManager::getEngine(std::string name, bool onlyLocalEngine) {
     SRWLockSharedHolder lock(globalShareData->engineListLock);
-    for (auto& engine : globalShareData->globalEngineList)
-    {
+    for (auto& engine : globalShareData->globalEngineList) {
         if (onlyLocalEngine && getEngineType(engine) != LLSE_BACKEND_TYPE)
             continue;
         auto ownerData = ENGINE_GET_DATA(engine);
@@ -99,7 +87,6 @@ ScriptEngine* EngineManager::getEngine(std::string name, bool onlyLocalEngine)
     return nullptr;
 }
 
-std::string EngineManager::getEngineType(ScriptEngine* engine)
-{
+std::string EngineManager::getEngineType(ScriptEngine* engine) {
     return ENGINE_GET_DATA(engine)->engineType;
 }
\ No newline at end of file
diff --git a/ScriptEngine/Engine/EngineManager.h b/ScriptEngine/Engine/EngineManager.h
--- a/ScriptEngine/Engine/EngineManager.h
+++ b/ScriptEngine/Engine/EngineManager.h
@@ -5,20 +5,19 @@
 #include <map>
 #include <vector>
 
-class EngineManager
-{
+class EngineManager {
 protected:
-	friend class PluginManager;
-	static bool unRegisterEngine(script::ScriptEngine* engine);
+    friend class PluginManager;
+    static bool unRegisterEngine(script::ScriptEngine* engine);
 
 public:
-	static script::ScriptEngine* newEngine(std::string pluginName = "");
-	static bool registerEngine(script::ScriptEngine* engine);
-	static bool isValid(script::ScriptEngine* engine, bool onlyCheckLocal = false);
+    static script::ScriptEngine* newEngine(std::string pluginName = "");
+    static bool registerEngine(script::ScriptEngine* engine);
+    static bool isValid(script::ScriptEngine* engine, bool onlyCheckLocal = false);
 
-	static std::vector<script::ScriptEngine*> getLocalEngines();
-	static std::vector<script::ScriptEngine*> getGlobalEngines();
-	static script::ScriptEngine* getEngine(std::string name, bool onlyLocalEngine = false);
+    static std::vector<script::ScriptEngine*> getLocalEngines();
+    static std::vector<script::ScriptEngine*> getGlobalEngines();
+    static script::ScriptEngine* getEngine(std::string name, bool onlyLocalEngine = false);
 
-	static std::string getEngineType(script::ScriptEngine* engine);
+    static std::string getEngineType(script::ScriptEngine* engine);
 };
\ No newline at end of file
diff --git a/ScriptEngine/Engine/EngineOwnData.h b/ScriptEngine/Engine/EngineOwnData.h
--- a/ScriptEngine/Engine/EngineOwnData.h
+++ b/ScriptEngine/Engine/EngineOwnData.h
@@ -8,14 +8,12 @@
 #include <memory>
 #include <LoggerAPI.h>
 
-struct FormCallbackData
-{
+struct FormCallbackData {
     script::ScriptEngine* engine;
     script::Global<script::Function> func;
 };
 
-struct RemoteCallData
-{
+struct RemoteCallData {
     std::string nameSpace;
     std::string funcName;
     script::Global<Function> callback;
@@ -32,8 +30,7 @@ struct SimpleCallbackData
 
 class Player;
 
-struct EngineOwnData
-{
+struct EngineOwnData {
     //基础信息
     std::string pluginName = "";
     std::string pluginFilePath = "";
@@ -42,7 +39,7 @@ struct EngineOwnData
     //表单回调
     std::map<unsigned, FormCallbackData> formCallbacks;
 
-    //RemoteCall Exported Functions: unordered_map<nameSpace, funcName>
+    // RemoteCall Exported Functions: unordered_map<nameSpace, funcName>
     std::unordered_map<std::string, RemoteCallData> exportFuncs;
 
     /*
@@ -65,27 +62,24 @@ struct EngineOwnData
     }
     */
 
-    //LoggerAPI
+    // LoggerAPI
     bool toConsole = true;
     ::Logger logger = ::Logger("");
     int maxLogLevel = 4;
 
     //玩家绑定数据
-    std::unordered_map<std::string,script::Global<Value>> playerDataDB;
+    std::unordered_map<std::string, script::Global<Value>> playerDataDB;
 
-    //Unload Callbacks, use for close database...
+    // Unload Callbacks, use for close database...
     int index = 0;
     std::unordered_map<int, std::function<void(ScriptEngine*)>> unloadCallbacks;
-    inline int addUnloadCallback(std::function<void(ScriptEngine*)>&& cb)
-    {
+    inline int addUnloadCallback(std::function<void(ScriptEngine*)>&& cb) {
         unloadCallbacks[++index] = cb;
         return index;
     }
-    inline bool removeUnloadCallback(int index)
-    {
+    inline bool removeUnloadCallback(int index) {
         return unloadCallbacks.erase(index);
     }
-
 };
 
 // 引擎附加数据
diff --git a/ScriptEngine/Engine/GlobalShareData.cpp b/ScriptEngine/Engine/GlobalShareData.cpp
--- a/ScriptEngine/Engine/GlobalShareData.cpp
+++ b/ScriptEngine/Engine/GlobalShareData.cpp
@@ -14,34 +14,28 @@ using namespace std;
 GlobalDataType* globalShareData;
 
 
-void InitGlobalShareData()
-{
-	HANDLE hGlobalData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(GlobalDataType), (LLSE_GLOBAL_DATA_NAME + to_wstring(GetCurrentProcessId())).c_str());
-	if (hGlobalData == NULL)
-	{
-		logger.error(tr("init.fileMapping.fail"));
-		localShareData->isFirstInstance = true;
-		return;
-	}
+void InitGlobalShareData() {
+    HANDLE hGlobalData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(GlobalDataType), (LLSE_GLOBAL_DATA_NAME + to_wstring(GetCurrentProcessId())).c_str());
+    if (hGlobalData == NULL) {
+        logger.error(tr("init.fileMapping.fail"));
+        localShareData->isFirstInstance = true;
+        return;
+    }
 
-	LPVOID address = MapViewOfFile(hGlobalData, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
-	if (address == NULL)
-	{
-		logger.error(tr("init.mapFile.fail"));
-		localShareData->isFirstInstance = true;
-		return;
-	}
+    LPVOID address = MapViewOfFile(hGlobalData, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
+    if (address == NULL) {
+        logger.error(tr("init.mapFile.fail"));
+        localShareData->isFirstInstance = true;
+        return;
+    }
 
-	if (GetLastError() != ERROR_ALREADY_EXISTS)
-	{
-		//First Time
-		localShareData->isFirstInstance = true;
-		globalShareData = new (address) GlobalDataType;
-	}
-	else
-	{
-		//Existing
-		localShareData->isFirstInstance = false;
-		globalShareData = (GlobalDataType*)address;
-	}
+    if (GetLastError() != ERROR_ALREADY_EXISTS) {
+        // First Time
+        localShareData->isFirstInstance = true;
+        globalShareData = new (address) GlobalDataType;
+    } else {
+        // Existing
+        localShareData->isFirstInstance = false;
+        globalShareData = (GlobalDataType*)address;
+    }
 }
\ No newline at end of file
diff --git a/ScriptEngine/Engine/GlobalShareData.h b/ScriptEngine/Engine/GlobalShareData.h
--- a/ScriptEngine/Engine/GlobalShareData.h
+++ b/ScriptEngine/Engine/GlobalShareData.h
@@ -10,8 +10,7 @@
 //////////////////// Structs ////////////////////
 
 //导出函数表
-struct ExportedFuncData
-{
+struct ExportedFuncData {
     std::string fromEngineType;
     ScriptEngine* engine;
     script::Global<Function> func;
@@ -19,15 +18,13 @@ struct ExportedFuncData
 };
 
 //消息系统处理函数信息
-struct MessageHandlers
-{
+struct MessageHandlers {
     script::utils::Message::MessageProc* handler;
     script::utils::Message::MessageProc* cleaner;
 };
 
 //全局共享数据
-struct GlobalDataType
-{
+struct GlobalDataType {
     //引擎管理器表
     SRWLock engineListLock;
     std::list<ScriptEngine*> globalEngineList;
@@ -44,7 +41,7 @@ struct GlobalDataType
     std::map<std::string, MessageHandlers> messageSystemHandlers;
     std::map<std::string, HANDLE> messageThreads;
 
-    //OperationCount
+    // OperationCount
     std::map<std::string, int> operationCountData;
 };
 
diff --git a/ScriptEngine/Engine/LoaderHelper.cpp b/ScriptEngine/Engine/LoaderHelper.cpp
--- a/ScriptEngine/Engine/LoaderHelper.cpp
+++ b/ScriptEngine/Engine/LoaderHelper.cpp
@@ -25,8 +25,7 @@
 using namespace std;
 
 //远程装载回调
-void RemoteLoadRequest(ModuleMessage& msg)
-{
+void RemoteLoadRequest(ModuleMessage& msg) {
     istringstream sin(msg.getData());
 
     bool isHotLoad;
@@ -39,10 +38,8 @@ void RemoteLoadRequest(ModuleMessage& msg)
     msg.sendResult(ModuleMessage::MessageType::RemoteLoadReturn, string(res ? "1" : "0"));
 }
 
-void RemoteLoadReturn(ModuleMessage& msg)
-{
-    if (msg.getData() == "0")
-    {
+void RemoteLoadReturn(ModuleMessage& msg) {
+    if (msg.getData() == "0") {
         logger.error("Romote Load Failed!");
     }
 }
\ No newline at end of file
diff --git a/ScriptEngine/Engine/LocalShareData.cpp b/ScriptEngine/Engine/LocalShareData.cpp
--- a/ScriptEngine/Engine/LocalShareData.cpp
+++ b/ScriptEngine/Engine/LocalShareData.cpp
@@ -3,7 +3,7 @@
 #include <ThreadPool/ThreadPool.hpp>
 #include <mutex>
 
-//DLL本地共享数据
+// DLL本地共享数据
 LocalDataType* localShareData;
 
 //命令延迟注册队列
@@ -14,8 +14,7 @@ ThreadPool pool(LLSE_POOL_THREAD_COUNT);
 
 std::mutex messageLoopLock;
 
-void InitLocalShareData()
-{
-	srand(clock());
-	localShareData = new LocalDataType;
+void InitLocalShareData() {
+    srand(clock());
+    localShareData = new LocalDataType;
 }
\ No newline at end of file
diff --git a/ScriptEngine/Engine/LocalShareData.h b/ScriptEngine/Engine/LocalShareData.h
--- a/ScriptEngine/Engine/LocalShareData.h
+++ b/ScriptEngine/Engine/LocalShareData.h
@@ -9,53 +9,48 @@
 //////////////////// Structs ////////////////////
 
 //命令回调信息结构体
-struct CmdCallbackData
-{
-	ScriptEngine* fromEngine;
-	int perm;
-	script::Global<Function> func;
+struct CmdCallbackData {
+    ScriptEngine* fromEngine;
+    int perm;
+    script::Global<Function> func;
 };
 
 //命令延迟注册队列
-struct RegCmdQueue
-{
-	std::string cmd;
-	std::string describe;
-	int level;
+struct RegCmdQueue {
+    std::string cmd;
+    std::string describe;
+    int level;
 };
 
 //命令回调map排序
-static struct CmdCallbackMapCmp
-{
-	bool operator() (std::string const& a, std::string const& b) const
-	{
-		if (a.size() != b.size())
-			return a.size() > b.size();
-		else
-			return a > b;
-	}
+static struct CmdCallbackMapCmp {
+    bool operator()(std::string const& a, std::string const& b) const {
+        if (a.size() != b.size())
+            return a.size() > b.size();
+        else
+            return a > b;
+    }
 };
 
-//DLL本地共享数据
-struct LocalDataType
-{
-	//是否是第一个ScriptEngine实例
-	bool isFirstInstance = true;
+// DLL本地共享数据
+struct LocalDataType {
+    //是否是第一个ScriptEngine实例
+    bool isFirstInstance = true;
 
-	//玩家命令回调
-	std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> playerCmdCallbacks;
+    //玩家命令回调
+    std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> playerCmdCallbacks;
 
-	//控制台命令回调
-	std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> consoleCmdCallbacks;
+    //控制台命令回调
+    std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> consoleCmdCallbacks;
 
-	// 真指令回调
-	std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> commandCallbacks;
+    // 真指令回调
+    std::map<std::string, CmdCallbackData, CmdCallbackMapCmp> commandCallbacks;
 };
 
 
 //////////////////// Externs ////////////////////
 
-//DLL本地共享数据
+// DLL本地共享数据
 extern LocalDataType* localShareData;
 
 //命令延迟注册队列
diff --git a/ScriptEngine/Engine/MessageSystem.cpp b/ScriptEngine/Engine/MessageSystem.cpp
--- a/ScriptEngine/Engine/MessageSystem.cpp
+++ b/ScriptEngine/Engine/MessageSystem.cpp
@@ -11,7 +11,7 @@
 using namespace std;
 using namespace script;
 
-#define GET_MESSAGE_TYPE(ENGINE) (ModuleMessage::MessageType)ENGINE.data0
+#define GET_MESSAGE_TYPE(ENGINE) (ModuleMessage::MessageType) ENGINE.data0
 #define GET_MESSAGE_HEADER(ENGINE) (ModuleMessage::MessageHeader*)ENGINE.ptr0
 #define GET_MESSAGE_DATA_PTR(ENGINE) (std::string*)ENGINE.ptr1
 #define MESSAGE_TYPE data0
@@ -25,44 +25,40 @@ using namespace script;
 #include "RemoteCall.h"
 #include "TimeTaskSystem.h"
 
-void ModuleMessage::handle(utils::Message &engineMsg)       // Warning: Execute in another thread
+void ModuleMessage::handle(utils::Message& engineMsg) // Warning: Execute in another thread
 {
     ModuleMessage msg;
     msg.type = GET_MESSAGE_TYPE(engineMsg);
-    msg.header = GET_MESSAGE_HEADER(engineMsg); 
+    msg.header = GET_MESSAGE_HEADER(engineMsg);
     msg.data = GET_MESSAGE_DATA_PTR(engineMsg);
 
-    switch (msg.getType())
-    {
-    case ModuleMessage::MessageType::RemoteSyncCallRequest:
-        RemoteSyncCallRequest(msg);
-        break;
-    case ModuleMessage::MessageType::RemoteSyncCallReturn:
-        RemoteSyncCallReturn(msg);
-        break;
-    case ModuleMessage::MessageType::RemoteLoadRequest:
-        RemoteLoadRequest(msg);
-        break;
-    case ModuleMessage::MessageType::RemoteLoadReturn:
-        RemoteLoadReturn(msg);
-        break;
-    default:
-        break;
+    switch (msg.getType()) {
+        case ModuleMessage::MessageType::RemoteSyncCallRequest:
+            RemoteSyncCallRequest(msg);
+            break;
+        case ModuleMessage::MessageType::RemoteSyncCallReturn:
+            RemoteSyncCallReturn(msg);
+            break;
+        case ModuleMessage::MessageType::RemoteLoadRequest:
+            RemoteLoadRequest(msg);
+            break;
+        case ModuleMessage::MessageType::RemoteLoadReturn:
+            RemoteLoadReturn(msg);
+            break;
+        default:
+            break;
     }
 }
 
-void ModuleMessage::cleanup(utils::Message &engineMsg)
-{
+void ModuleMessage::cleanup(utils::Message& engineMsg) {
     delete GET_MESSAGE_HEADER(engineMsg);
     delete GET_MESSAGE_DATA_PTR(engineMsg);
 }
 
 
-
 /////////////////////////// Helper ///////////////////////////
 
-utils::Message PackEngineMessage(string toModuleType, ModuleMessage::MessageType type, string data, int *messageId = nullptr)
-{
+utils::Message PackEngineMessage(string toModuleType, ModuleMessage::MessageType type, string data, int* messageId = nullptr) {
     auto& callbacks = globalShareData->messageSystemHandlers[toModuleType];
 
     utils::Message engineMsg(callbacks.handler, callbacks.cleaner);
@@ -74,8 +70,7 @@ utils::Message PackEngineMessage(string toModuleType, ModuleMessage::MessageType
     return engineMsg;
 }
 
-utils::Message PackEngineMessage(string toModuleType, int messageId, ModuleMessage::MessageType type, string data)
-{
+utils::Message PackEngineMessage(string toModuleType, int messageId, ModuleMessage::MessageType type, string data) {
     auto& callbacks = globalShareData->messageSystemHandlers[toModuleType];
 
     utils::Message engineMsg(callbacks.handler, callbacks.cleaner);
@@ -89,33 +84,25 @@ utils::Message PackEngineMessage(string toModuleType, int messageId, ModuleMessa
 
 /////////////////////////// Module Message ///////////////////////////
 
-int ModuleMessage::getNextMessageId()
-{
+int ModuleMessage::getNextMessageId() {
     return InterlockedIncrement((LONG*)&(globalShareData->messageSystemNextId));
 }
 
-ModuleMessageResult ModuleMessage::broadcastLocal(MessageType type, string data, int64_t delay)
-{
+ModuleMessageResult ModuleMessage::broadcastLocal(MessageType type, string data, int64_t delay) {
     std::vector<ScriptEngine*> engineList;
     int msgId = -1;
 
     auto engines = EngineManager::getLocalEngines();
-    for (auto& engine : engines)
-    {
-        try
-        {
+    for (auto& engine : engines) {
+        try {
             engine->messageQueue()->postMessage(PackEngineMessage(LLSE_MODULE_TYPE, type, data, &msgId),
-                std::chrono::milliseconds(delay));
+                                                std::chrono::milliseconds(delay));
             engineList.push_back(engine);
-        }
-        catch (const Exception &e)
-        {
+        } catch (const Exception& e) {
             EngineScope scope(engine);
             logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
             PrintException(e);
-        }
-        catch(...)
-        {
+        } catch (...) {
             EngineScope scope(engine);
             logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
         }
@@ -123,28 +110,21 @@ ModuleMessageResult ModuleMessage::broadcastLocal(MessageType type, string data,
     return ModuleMessageResult(msgId, engineList);
 }
 
-ModuleMessageResult ModuleMessage::broadcastGlobal(MessageType type, string data, int64_t delay)
-{
+ModuleMessageResult ModuleMessage::broadcastGlobal(MessageType type, string data, int64_t delay) {
     std::vector<ScriptEngine*> engineList;
     int msgId = -1;
 
     auto engines = EngineManager::getGlobalEngines();
-    for (auto& engine : engines)
-    {
-        try
-        {
+    for (auto& engine : engines) {
+        try {
             engine->messageQueue()->postMessage(PackEngineMessage(EngineManager::getEngineType(engine), type, data, &msgId),
-                std::chrono::milliseconds(delay));
+                                                std::chrono::milliseconds(delay));
             engineList.push_back(engine);
-        }
-        catch (const Exception& e)
-        {
+        } catch (const Exception& e) {
             EngineScope scope(engine);
             logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
             PrintException(e);
-        }
-        catch (...)
-        {
+        } catch (...) {
             EngineScope scope(engine);
             logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
         }
@@ -152,30 +132,22 @@ ModuleMessageResult ModuleMessage::broadcastGlobal(MessageType type, string data
     return ModuleMessageResult(msgId, engineList);
 }
 
-ModuleMessageResult ModuleMessage::broadcastTo(std::string toModuleType, MessageType type, string data, int64_t delay)
-{
+ModuleMessageResult ModuleMessage::broadcastTo(std::string toModuleType, MessageType type, string data, int64_t delay) {
     std::vector<ScriptEngine*> engineList;
     int msgId = -1;
 
     auto engines = EngineManager::getGlobalEngines();
-    for (auto& engine : engines)
-    {
-        if (EngineManager::getEngineType(engine) == toModuleType)
-        {
-            try
-            {
+    for (auto& engine : engines) {
+        if (EngineManager::getEngineType(engine) == toModuleType) {
+            try {
                 engine->messageQueue()->postMessage(PackEngineMessage(toModuleType, type, data, &msgId),
-                    std::chrono::milliseconds(delay));
+                                                    std::chrono::milliseconds(delay));
                 engineList.push_back(engine);
-            }
-            catch (const Exception& e)
-            {
+            } catch (const Exception& e) {
                 EngineScope scope(engine);
                 logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
                 PrintException(e);
-            }
-            catch (...)
-            {
+            } catch (...) {
                 EngineScope scope(engine);
                 logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
             }
@@ -184,54 +156,40 @@ ModuleMessageResult ModuleMessage::broadcastTo(std::string toModuleType, Message
     return ModuleMessageResult(msgId, engineList);
 }
 
-ModuleMessageResult ModuleMessage::sendTo(ScriptEngine* engine, MessageType type, std::string data, int64_t delay)
-{
+ModuleMessageResult ModuleMessage::sendTo(ScriptEngine* engine, MessageType type, std::string data, int64_t delay) {
     int msgId = -1;
     string toModuleType = LLSE_MODULE_TYPE;
 
-    try
-    {
+    try {
         engine->messageQueue()->postMessage(PackEngineMessage(EngineManager::getEngineType(engine), type, data, &msgId),
-            std::chrono::milliseconds(delay));
-        return ModuleMessageResult(msgId, { engine });
-    }
-    catch (const Exception& e)
-    {
+                                            std::chrono::milliseconds(delay));
+        return ModuleMessageResult(msgId, {engine});
+    } catch (const Exception& e) {
         EngineScope scope(engine);
         logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
         PrintException(e);
-    }
-    catch (...)
-    {
+    } catch (...) {
         EngineScope scope(engine);
         logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
     }
     return ModuleMessageResult(msgId, {});
 }
 
-ModuleMessageResult ModuleMessage::sendToRandom(std::string toModuleType, MessageType type, std::string data, int64_t delay)
-{
+ModuleMessageResult ModuleMessage::sendToRandom(std::string toModuleType, MessageType type, std::string data, int64_t delay) {
     int msgId = -1;
 
     auto engines = EngineManager::getGlobalEngines();
-    for (auto& engine : engines)
-    {
-        if (EngineManager::getEngineType(engine) == toModuleType)
-        {
-            try
-            {
+    for (auto& engine : engines) {
+        if (EngineManager::getEngineType(engine) == toModuleType) {
+            try {
                 engine->messageQueue()->postMessage(PackEngineMessage(toModuleType, type, data, &msgId),
-                    std::chrono::milliseconds(delay));
+                                                    std::chrono::milliseconds(delay));
                 return ModuleMessageResult(msgId, {engine});
-            }
-            catch (const Exception& e)
-            {
+            } catch (const Exception& e) {
                 EngineScope scope(engine);
                 logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
                 PrintException(e);
-            }
-            catch (...)
-            {
+            } catch (...) {
                 EngineScope scope(engine);
                 logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
             }
@@ -240,25 +198,19 @@ ModuleMessageResult ModuleMessage::sendToRandom(std::string toModuleType, Messag
     return ModuleMessageResult(msgId, {});
 }
 
-bool ModuleMessage::sendResult(MessageType type, std::string data, int64_t delay)
-{
+bool ModuleMessage::sendResult(MessageType type, std::string data, int64_t delay) {
     int msgId = header->id;
     ScriptEngine* engine = header->fromEngine;
 
-    try
-    {
+    try {
         engine->messageQueue()->postMessage(PackEngineMessage(header->fromEngineModuleType, msgId, type, data),
-            std::chrono::milliseconds(delay));
+                                            std::chrono::milliseconds(delay));
         return true;
-    }
-    catch (const Exception& e)
-    {
+    } catch (const Exception& e) {
         EngineScope scope(engine);
         logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
         PrintException(e);
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Fail to post message to plugin {}", ENGINE_GET_DATA(engine)->pluginName);
     }
     return false;
@@ -268,39 +220,32 @@ bool ModuleMessage::sendResult(MessageType type, std::string data, int64_t delay
 /////////////////////////// Module Message Result ///////////////////////////
 
 ModuleMessageResult::ModuleMessageResult(int messageId, std::vector<ScriptEngine*> engineList)
-    :msgId(messageId), engineList(engineList), resultCount(OperationCount::create(to_string(messageId)))
-{}
+: msgId(messageId), engineList(engineList), resultCount(OperationCount::create(to_string(messageId))) {
+}
 
-ModuleMessageResult::operator bool()
-{
+ModuleMessageResult::operator bool() {
     return getSentCount() > 0;
 }
 
-ModuleMessageResult::~ModuleMessageResult()
-{
+ModuleMessageResult::~ModuleMessageResult() {
     resultCount.remove();
 }
 
-bool ModuleMessageResult::waitForAllResults(int maxWaitTime)
-{
+bool ModuleMessageResult::waitForAllResults(int maxWaitTime) {
     return waitForResultCount(getSentCount(), maxWaitTime);
 }
 
-bool ModuleMessageResult::waitForOneResult(int maxWaitTime)
-{
+bool ModuleMessageResult::waitForOneResult(int maxWaitTime) {
     return waitForResultCount(1, maxWaitTime);
 }
 
-bool ModuleMessageResult::waitForResultCount(int targetCount, int maxWaitTime)
-{
+bool ModuleMessageResult::waitForResultCount(int targetCount, int maxWaitTime) {
     bool res = false;
     auto fromTime = GetCurrentTimeStampMS();
 
-    while (maxWaitTime < 0 ? true : GetCurrentTimeStampMS() - fromTime <= maxWaitTime)
-    {
+    while (maxWaitTime < 0 ? true : GetCurrentTimeStampMS() - fromTime <= maxWaitTime) {
         Sleep(LLSE_MESSAGE_SYSTEM_WAIT_CHECK_INTERVAL);
-        if (resultCount.hasReachCount(targetCount))
-        {
+        if (resultCount.hasReachCount(targetCount)) {
             res = true;
             break;
         }
@@ -309,68 +254,55 @@ bool ModuleMessageResult::waitForResultCount(int targetCount, int maxWaitTime)
     return res;
 }
 
-bool ModuleMessageResult::cancel()
-{
+bool ModuleMessageResult::cancel() {
     int id = msgId;
-    for (auto& engine : engineList)
-    {
+    for (auto& engine : engineList) {
         EngineScope scope(engine);
         engine->messageQueue()->removeMessageIf([id](utils::Message& message) {
-            return (GET_MESSAGE_HEADER(message))->id == id ?
-                utils::MessageQueue::RemoveMessagePredReturnType::kRemoveAndContinue 
-                : utils::MessageQueue::RemoveMessagePredReturnType::kDontRemove;
+            return (GET_MESSAGE_HEADER(message))->id == id ? utils::MessageQueue::RemoveMessagePredReturnType::kRemoveAndContinue
+                                                           : utils::MessageQueue::RemoveMessagePredReturnType::kDontRemove;
         });
     }
     return true;
 }
 
 ///////////////////////////// Funcs /////////////////////////////
-void MessageSystemLoopOnce()
-{
-    //if (!messageLoopLock.try_lock())
-    //    return;
+void MessageSystemLoopOnce() {
+    // if (!messageLoopLock.try_lock())
+    //     return;
     std::list<ScriptEngine*> tmpList;
     {
         SRWLockSharedHolder lock(globalShareData->engineListLock);
         // low efficiency
         tmpList = globalShareData->globalEngineList;
     }
-    for (auto engine : tmpList)
-    {
-        if (EngineManager::isValid(engine) && EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE)
-        {
-            try
-            {
+    for (auto engine : tmpList) {
+        if (EngineManager::isValid(engine) && EngineManager::getEngineType(engine) == LLSE_BACKEND_TYPE) {
+            try {
                 if (EngineScope::currentEngine() == engine)
                     engine->messageQueue()->loopQueue(script::utils::MessageQueue::LoopType::kLoopOnce);
-                else
-                {
+                else {
                     EngineScope enter(engine);
                     engine->messageQueue()->loopQueue(script::utils::MessageQueue::LoopType::kLoopOnce);
                 }
-            }
-            catch (const Exception& e)
-            {
+            } catch (const Exception& e) {
                 EngineScope scope(engine);
                 logger.error("Error occurred in Engine Message Loop!");
                 logger.error("Uncaught Script Exception Detected!");
                 PrintException(e);
                 logger.error("In Plugin: " + ENGINE_OWN_DATA()->pluginName);
-            }
-            catch (...)
-            {
+            } catch (...) {
                 logger.error("Error occurred in Engine Message Loop!");
                 logger.error("Uncaught Exception Detected!");
             }
         }
     }
-    //messageLoopLock.unlock();
-    //logger.debug("Engine-{} Message Loop.", LLSE_MODULE_TYPE);
+    // messageLoopLock.unlock();
+    // logger.debug("Engine-{} Message Loop.", LLSE_MODULE_TYPE);
 }
 
-void InitMessageSystem()
-{
-    globalShareData->messageSystemHandlers[LLSE_MODULE_TYPE] = { ModuleMessage::handle, ModuleMessage::cleanup };
+void InitMessageSystem() {
+    globalShareData->messageSystemHandlers[LLSE_MODULE_TYPE] = {ModuleMessage::handle, ModuleMessage::cleanup};
 
     Event::ServerStoppedEvent::subscribe([](const auto& ev) {
         EndMessageSystemLoop();
@@ -382,12 +314,11 @@ void InitMessageSystem()
 #ifdef DEBUG
         SetThreadDescription(GetCurrentThread(), L"LLSE MessageSystem " _CRT_WIDE(LLSE_MODULE_TYPE));
 #endif // DEBUG
-        // Set global SEH-Exception handler
+       // Set global SEH-Exception handler
         _set_se_translator(seh_exception::TranslateSEHtoCE);
 
         globalShareData->messageThreads[LLSE_BACKEND_TYPE] = GetCurrentThread();
-        while (true)
-        {
+        while (true) {
             MessageSystemLoopOnce();
             if (LL::getServerStatus() >= LL::ServerStatus::Stopping)
                 return;
@@ -398,14 +329,12 @@ void InitMessageSystem()
     }).detach();
 }
 
-//Helper
-void APCEmptyHelper(ULONG_PTR)
-{
+// Helper
+void APCEmptyHelper(ULONG_PTR) {
     ;
 }
 
-bool EndMessageSystemLoop()
-{
+bool EndMessageSystemLoop() {
     auto res = globalShareData->messageThreads.find(LLSE_BACKEND_TYPE);
     if (res == globalShareData->messageThreads.end())
         return false;
diff --git a/ScriptEngine/Engine/MessageSystem.h b/ScriptEngine/Engine/MessageSystem.h
--- a/ScriptEngine/Engine/MessageSystem.h
+++ b/ScriptEngine/Engine/MessageSystem.h
@@ -10,74 +10,84 @@ using std::string;
 
 //////////////////// Class ////////////////////
 
-class ModuleMessageResult
-{
+class ModuleMessageResult {
 private:
-	int msgId;
-	OperationCount resultCount;
-	std::vector<ScriptEngine*> engineList;
+    int msgId;
+    OperationCount resultCount;
+    std::vector<ScriptEngine*> engineList;
+
+    friend class ModuleMessage;
+    ModuleMessageResult(int messageId, std::vector<ScriptEngine*> engineList);
 
-	friend class ModuleMessage;
-	ModuleMessageResult(int messageId, std::vector<ScriptEngine*> engineList);
-	
 public:
-	ModuleMessageResult() :resultCount("") {}
-	~ModuleMessageResult();
-	operator bool();
+    ModuleMessageResult()
+    : resultCount("") {
+    }
+    ~ModuleMessageResult();
+    operator bool();
 
-	int getSentCount() { return engineList.size(); }
-	int getMsgId() { return msgId; }
+    int getSentCount() {
+        return engineList.size();
+    }
+    int getMsgId() {
+        return msgId;
+    }
 
-	bool waitForAllResults(int maxWaitTime = -1);
-	bool waitForOneResult(int maxWaitTime = -1);
-	bool waitForResultCount(int targetCount, int maxWaitTime = -1);
-	bool cancel();
+    bool waitForAllResults(int maxWaitTime = -1);
+    bool waitForOneResult(int maxWaitTime = -1);
+    bool waitForResultCount(int targetCount, int maxWaitTime = -1);
+    bool cancel();
 };
 
-class ModuleMessage
-{
+class ModuleMessage {
 private:
-	static int getNextMessageId();
+    static int getNextMessageId();
 
 public:
-	enum class MessageType :UINT
-	{
-		MODULE_MESSAGE_REQUEST,
-		RequireBroadcast, RemoteSyncCallRequest, RemoteLoadRequest,
-		MODULE_MESSAGE_RETURN,
-		RemoteSyncCallReturn, RemoteLoadReturn,
-	};
-	struct MessageHeader
-	{
-		MessageHeader()
-		{
-			id = getNextMessageId();
-			fromEngine = EngineScope::currentEngine();
-			fromEngineModuleType = LLSE_MODULE_TYPE;
-		}
-		int id;
-		ScriptEngine* fromEngine;
-		string fromEngineModuleType;
-	};
+    enum class MessageType : UINT {
+        MODULE_MESSAGE_REQUEST,
+        RequireBroadcast,
+        RemoteSyncCallRequest,
+        RemoteLoadRequest,
+        MODULE_MESSAGE_RETURN,
+        RemoteSyncCallReturn,
+        RemoteLoadReturn,
+    };
+    struct MessageHeader {
+        MessageHeader() {
+            id = getNextMessageId();
+            fromEngine = EngineScope::currentEngine();
+            fromEngineModuleType = LLSE_MODULE_TYPE;
+        }
+        int id;
+        ScriptEngine* fromEngine;
+        string fromEngineModuleType;
+    };
 
-	MessageType type;
-	MessageHeader *header;
-	std::string *data;
+    MessageType type;
+    MessageHeader* header;
+    std::string* data;
 
-	unsigned getId() { return header->id; }
-	MessageType getType() { return type; }
-	std::string getData() { return *data; }
+    unsigned getId() {
+        return header->id;
+    }
+    MessageType getType() {
+        return type;
+    }
+    std::string getData() {
+        return *data;
+    }
 
-	static ModuleMessageResult broadcastLocal(MessageType type, std::string data, int64_t delay = 0);
-	static ModuleMessageResult broadcastGlobal(MessageType type, std::string data, int64_t delay = 0);
-	static ModuleMessageResult broadcastTo(std::string toModuleType, MessageType type, std::string data, int64_t delay = 0);
-	static ModuleMessageResult sendTo(ScriptEngine* engine, MessageType type, std::string data, int64_t delay = 0);
-	static ModuleMessageResult sendToRandom(std::string toModuleType, MessageType type, std::string data, int64_t delay = 0);
+    static ModuleMessageResult broadcastLocal(MessageType type, std::string data, int64_t delay = 0);
+    static ModuleMessageResult broadcastGlobal(MessageType type, std::string data, int64_t delay = 0);
+    static ModuleMessageResult broadcastTo(std::string toModuleType, MessageType type, std::string data, int64_t delay = 0);
+    static ModuleMessageResult sendTo(ScriptEngine* engine, MessageType type, std::string data, int64_t delay = 0);
+    static ModuleMessageResult sendToRandom(std::string toModuleType, MessageType type, std::string data, int64_t delay = 0);
 
-	bool sendResult(MessageType type, std::string data, int64_t delay = 0);
+    bool sendResult(MessageType type, std::string data, int64_t delay = 0);
 
-	static void handle(script::utils::Message &engineMsg);
-	static void cleanup(script::utils::Message &engineMsg);
+    static void handle(script::utils::Message& engineMsg);
+    static void cleanup(script::utils::Message& engineMsg);
 };
 
 ///////////////////////////// Funcs /////////////////////////////
diff --git a/ScriptEngine/Engine/OperationCount.cpp b/ScriptEngine/Engine/OperationCount.cpp
--- a/ScriptEngine/Engine/OperationCount.cpp
+++ b/ScriptEngine/Engine/OperationCount.cpp
@@ -5,66 +5,55 @@
 #include <vector>
 
 OperationCount::OperationCount(const string& name)
-	:name(name)
-{}
+: name(name) {
+}
 
-OperationCount OperationCount::create(const string& name)
-{
-	if (exists(name))
-		return OperationCount("");
-	else
-	{
-		globalShareData->operationCountData[name] = 0;
-		return OperationCount(name);
-	}
+OperationCount OperationCount::create(const string& name) {
+    if (exists(name))
+        return OperationCount("");
+    else {
+        globalShareData->operationCountData[name] = 0;
+        return OperationCount(name);
+    }
 }
 
-bool OperationCount::exists(const string& name)
-{
-	return globalShareData->operationCountData.find(name) != globalShareData->operationCountData.end();
+bool OperationCount::exists(const string& name) {
+    return globalShareData->operationCountData.find(name) != globalShareData->operationCountData.end();
 }
 
-bool OperationCount::remove()
-{
-	auto p = globalShareData->operationCountData.find(name);
-	if (p != globalShareData->operationCountData.end())
-	{
-		globalShareData->operationCountData.erase(p);
-		return true;
-	}
-	return false;
+bool OperationCount::remove() {
+    auto p = globalShareData->operationCountData.find(name);
+    if (p != globalShareData->operationCountData.end()) {
+        globalShareData->operationCountData.erase(p);
+        return true;
+    }
+    return false;
 }
 
-bool OperationCount::done()
-{
-	auto p = globalShareData->operationCountData.find(name);
-	if (p != globalShareData->operationCountData.end())
-	{
-		InterlockedIncrement((LONG*)&(p->second));
-		return true;
-	}
-	return false;
+bool OperationCount::done() {
+    auto p = globalShareData->operationCountData.find(name);
+    if (p != globalShareData->operationCountData.end()) {
+        InterlockedIncrement((LONG*)&(p->second));
+        return true;
+    }
+    return false;
 }
 
-int OperationCount::get()
-{
-	if (exists(name))
-		return globalShareData->operationCountData[name];
-	else
-		return -1;
+int OperationCount::get() {
+    if (exists(name))
+        return globalShareData->operationCountData[name];
+    else
+        return -1;
 }
 
-bool OperationCount::hasReachCount(int count)
-{
-	return get() >= count;
+bool OperationCount::hasReachCount(int count) {
+    return get() >= count;
 }
 
-bool OperationCount::hasReachMaxEngineCount()
-{
-	return hasReachCount(PluginManager::getAllScriptPlugins().size());
+bool OperationCount::hasReachMaxEngineCount() {
+    return hasReachCount(PluginManager::getAllScriptPlugins().size());
 }
 
-bool OperationCount::hasReachMaxBackendCount()
-{
-	return hasReachCount(LLSE_VALID_BACKENDS.size());
+bool OperationCount::hasReachMaxBackendCount() {
+    return hasReachCount(LLSE_VALID_BACKENDS.size());
 }
\ No newline at end of file
diff --git a/ScriptEngine/Engine/OperationCount.h b/ScriptEngine/Engine/OperationCount.h
--- a/ScriptEngine/Engine/OperationCount.h
+++ b/ScriptEngine/Engine/OperationCount.h
@@ -2,23 +2,26 @@
 #include <string>
 using std::string;
 
-class OperationCount
-{
+class OperationCount {
 private:
-	string name;
+    string name;
 
 public:
-	OperationCount(const string& name);
-	static OperationCount create(const string& name);
-	static bool exists(const string& name);
-	bool remove();
-	operator bool() { return exists(name); }
+    OperationCount(const string& name);
+    static OperationCount create(const string& name);
+    static bool exists(const string& name);
+    bool remove();
+    operator bool() {
+        return exists(name);
+    }
 
-	bool done();
-	inline bool finish() { return done(); }
+    bool done();
+    inline bool finish() {
+        return done();
+    }
 
-	int get();
-	bool hasReachCount(int count);
-	bool hasReachMaxEngineCount();
-	bool hasReachMaxBackendCount();
+    int get();
+    bool hasReachCount(int count);
+    bool hasReachMaxEngineCount();
+    bool hasReachMaxBackendCount();
 };
\ No newline at end of file
diff --git a/ScriptEngine/Engine/RemoteCall.cpp b/ScriptEngine/Engine/RemoteCall.cpp
--- a/ScriptEngine/Engine/RemoteCall.cpp
+++ b/ScriptEngine/Engine/RemoteCall.cpp
@@ -16,16 +16,14 @@ unordered_map<int, string> remoteResultMap;
 
 //////////////////// 消息循环 ////////////////////
 
-void inline StringTrim(string& str)
-{
+void inline StringTrim(string& str) {
     if (str.back() == '\n')
         str.pop_back();
 }
 
-void RemoteSyncCallRequest(ModuleMessage& msg)
-{
-    //logger.debug("*** Remote call request received.");
-    //logger.debug("*** Current Module:{}", LLSE_MODULE_TYPE);
+void RemoteSyncCallRequest(ModuleMessage& msg) {
+    // logger.debug("*** Remote call request received.");
+    // logger.debug("*** Current Module:{}", LLSE_MODULE_TYPE);
 
     istringstream sin(msg.getData());
 
@@ -34,75 +32,63 @@ void RemoteSyncCallRequest(ModuleMessage& msg)
     StringTrim(funcName);
 
     ScriptEngine* engine = nullptr;
-    try
-    {
-        //Real Call
+    try {
+        // Real Call
         ExportedFuncData* funcData = &(globalShareData->exportedFuncs).at(funcName);
         engine = funcData->engine;
         EngineScope enter(engine);
 
         string arg;
         vector<Local<Value>> argsVector;
-        while (getline(sin, arg))
-        {
+        while (getline(sin, arg)) {
             StringTrim(arg);
             argsVector.push_back(JsonToValue(arg));
         }
 
-        //logger.debug("*** Before remote call execute");
+        // logger.debug("*** Before remote call execute");
         Local<Value> result = funcData->func.get().call({}, argsVector);
-        //logger.debug("*** After remote call execute");
-        
-        //Feedback
-        //logger.debug("*** Before remote call result return");
-        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, ValueToJson(result)))
-        {
+        // logger.debug("*** After remote call execute");
+
+        // Feedback
+        // logger.debug("*** Before remote call result return");
+        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, ValueToJson(result))) {
             logger.error("Fail to post remote call result return!");
         }
-        //logger.debug("*** After remote call result return");
-    }
-    catch (const Exception& e)
-    {
+        // logger.debug("*** After remote call result return");
+    } catch (const Exception& e) {
         logger.error("Error occurred in remote engine!\n");
-        if (engine)
-        {
+        if (engine) {
             EngineScope enter(engine);
             PrintException(e);
             logger.error("[Error] In Plugin: " + ENGINE_OWN_DATA()->pluginName);
         }
-        
-        //Feedback
-        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]"))
-        {
+
+        // Feedback
+        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]")) {
             logger.error("Fail to post remote call result return!");
         }
-    }
-    catch (const std::out_of_range& e)
-    {
+    } catch (const std::out_of_range& e) {
         logger.error(string("Fail to import! Function [") + funcName + "] has not been exported!");
 
-        //Feedback
-        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]"))
-        {
-            logger.error("Fail to post remote call result return!");;
+        // Feedback
+        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]")) {
+            logger.error("Fail to post remote call result return!");
+            ;
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Error occurred in remote engine!");
 
-        //Feedback
-        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]"))
-        {
-            logger.error("Fail to post remote call result return!");;
+        // Feedback
+        if (!msg.sendResult(ModuleMessage::MessageType::RemoteSyncCallReturn, "[null]")) {
+            logger.error("Fail to post remote call result return!");
+            ;
         }
     }
 }
 
-void RemoteSyncCallReturn(ModuleMessage& msg)
-{
-    //logger.debug("*** Remote call result message received.");
-    //logger.debug("*** Result: {}", msg.getData());
+void RemoteSyncCallReturn(ModuleMessage& msg) {
+    // logger.debug("*** Remote call result message received.");
+    // logger.debug("*** Result: {}", msg.getData());
     remoteResultMap[msg.getId()] = msg.getData();
     OperationCount(to_string(msg.getId())).done();
 }
diff --git a/ScriptEngine/Engine/TimeTaskSystem.cpp b/ScriptEngine/Engine/TimeTaskSystem.cpp
--- a/ScriptEngine/Engine/TimeTaskSystem.cpp
+++ b/ScriptEngine/Engine/TimeTaskSystem.cpp
@@ -11,15 +11,13 @@ using namespace std;
 
 std::atomic_uint timeTaskId = 0;
 CsLock locker;
-struct TimeTaskData
-{
+struct TimeTaskData {
     ScheduleTask task;
     script::Global<Function> func;
     vector<script::Global<Value>> paras;
     script::Global<String> code;
-    ScriptEngine *engine;
-    inline void swap(TimeTaskData& rhs)
-    {
+    ScriptEngine* engine;
+    inline void swap(TimeTaskData& rhs) {
         std::swap(rhs.task, task);
         std::swap(rhs.engine, engine);
         rhs.code.swap(code);
@@ -29,73 +27,68 @@ struct TimeTaskData
 };
 std::unordered_map<int, TimeTaskData> timeTaskMap;
 
-#define TIMETASK_CATCH(TASK_TYPE) \
-    catch (const Exception& e) \
-    { \
-        EngineScope scope(engine); \
-        logger.error("Error occurred in {}", TASK_TYPE); \
-        PrintException(e); \
+#define TIMETASK_CATCH(TASK_TYPE)                                          \
+    catch (const Exception& e) {                                           \
+        EngineScope scope(engine);                                         \
+        logger.error("Error occurred in {}", TASK_TYPE);                   \
+        PrintException(e);                                                 \
         logger.error("In Plugin: " + ENGINE_GET_DATA(engine)->pluginName); \
-    } \
-    catch (const seh_exception& e) \
-    { \
-        logger.error("Error occurred in {}", TASK_TYPE); \
-        logger.error("SEH Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
+    }                                                                      \
+    catch (const seh_exception& e) {                                       \
+        logger.error("Error occurred in {}", TASK_TYPE);                   \
+        logger.error("SEH Uncaught Exception Detected!");                  \
+        logger.error(TextEncoding::toUTF8(e.what()));                      \
         logger.error("In Plugin: " + ENGINE_GET_DATA(engine)->pluginName); \
-    } \
-    catch (const std::exception& e) \
-    { \
-        logger.error("Error occurred in {}", TASK_TYPE); \
-        logger.error("C++ Uncaught Exception Detected!"); \
-        logger.error(TextEncoding::toUTF8(e.what())); \
+    }                                                                      \
+    catch (const std::exception& e) {                                      \
+        logger.error("Error occurred in {}", TASK_TYPE);                   \
+        logger.error("C++ Uncaught Exception Detected!");                  \
+        logger.error(TextEncoding::toUTF8(e.what()));                      \
         logger.error("In Plugin: " + ENGINE_GET_DATA(engine)->pluginName); \
-    } \
-    catch (...) \
-    { \
-        logger.error("Error occurred in {}", TASK_TYPE); \
-        logger.error("Uncaught Exception Detected!"); \
+    }                                                                      \
+    catch (...) {                                                          \
+        logger.error("Error occurred in {}", TASK_TYPE);                   \
+        logger.error("Uncaught Exception Detected!");                      \
         logger.error("In Plugin: " + ENGINE_GET_DATA(engine)->pluginName); \
     }
 
 
 //////////////////// API ////////////////////
 
-//void NewTimeout_s(script::Global<Function> func, vector<script::Local<Value>> paras, int timeout, ScriptEngine* engine)
+// void NewTimeout_s(script::Global<Function> func, vector<script::Local<Value>> paras, int timeout, ScriptEngine* engine)
 //{
-//    std::vector<script::Global<Value>> tmp;
-//    if (paras.size() > 0) {
-//        EngineScope enter(engine);
-//        for (auto& para : paras)
-//            tmp.emplace_back(std::move(para));
-//    }
-//    Schedule::delay(
-//        [engine, func = std::move(func), paras = std::move(tmp)]() {
-//            if (LL::isServerStopping())
-//                return;
-//            if (!EngineManager::isValid(engine))
-//                return;
-//            EngineScope enter(engine);
-//            if (paras.empty()) {
-//                func.get().call();
-//            }
-//            else
-//            {
-//                vector<Local<Value>> args;
-//                for (auto& para : paras)
-//                    if (para.isEmpty())
-//                        return;
-//                    else
-//                        args.emplace_back(para.get());
-//                func.get().call({}, args);
-//            }
-//        },
-//        timeout / 50);
-//}
-
-
-int NewTimeout(Local<Function> func, vector<Local<Value>> paras, int timeout)
-{
+//     std::vector<script::Global<Value>> tmp;
+//     if (paras.size() > 0) {
+//         EngineScope enter(engine);
+//         for (auto& para : paras)
+//             tmp.emplace_back(std::move(para));
+//     }
+//     Schedule::delay(
+//         [engine, func = std::move(func), paras = std::move(tmp)]() {
+//             if (LL::isServerStopping())
+//                 return;
+//             if (!EngineManager::isValid(engine))
+//                 return;
+//             EngineScope enter(engine);
+//             if (paras.empty()) {
+//                 func.get().call();
+//             }
+//             else
+//             {
+//                 vector<Local<Value>> args;
+//                 for (auto& para : paras)
+//                     if (para.isEmpty())
+//                         return;
+//                     else
+//                         args.emplace_back(para.get());
+//                 func.get().call({}, args);
+//             }
+//         },
+//         timeout / 50);
+// }
+
+
+int NewTimeout(Local<Function> func, vector<Local<Value>> paras, int timeout) {
     int tid = ++timeTaskId;
     TimeTaskData data;
 
@@ -105,53 +98,49 @@ int NewTimeout(Local<Function> func, vector<Local<Value>> paras, int timeout)
         data.paras.emplace_back(std::move(para));
 
     data.task = Schedule::delay(
-        [engine{EngineScope::currentEngine()}, id{tid}]()
-    {
-        try {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-            // lock after enter EngineScope to prevent deadlock
-            EngineScope scope(engine);
-            TimeTaskData taskData;
-            {
-                CsLockHolder lock(locker);
-
-                auto t = timeTaskMap.find(id);
-                if (t == timeTaskMap.end())
+        [engine{EngineScope::currentEngine()}, id{tid}]() {
+            try {
+                if (LL::isServerStopping())
                     return;
-                t->second.swap(taskData);
-                timeTaskMap.erase(id);
-            }
+                if (!EngineManager::isValid(engine))
+                    return;
+                // lock after enter EngineScope to prevent deadlock
+                EngineScope scope(engine);
+                TimeTaskData taskData;
+                {
+                    CsLockHolder lock(locker);
 
-            if (taskData.func.isEmpty())
-                return;
-            auto func = taskData.func.get();
-            if (taskData.paras.empty())
-            {
-                func.call();
-            }
-            else
-            {
-                vector<Local<Value>> args;
-                for (auto& para : taskData.paras)
-                    if (para.isEmpty())
+                    auto t = timeTaskMap.find(id);
+                    if (t == timeTaskMap.end())
                         return;
-                    else
-                        args.emplace_back(para.get());
-                func.call({}, args);
+                    t->second.swap(taskData);
+                    timeTaskMap.erase(id);
+                }
+
+                if (taskData.func.isEmpty())
+                    return;
+                auto func = taskData.func.get();
+                if (taskData.paras.empty()) {
+                    func.call();
+                } else {
+                    vector<Local<Value>> args;
+                    for (auto& para : taskData.paras)
+                        if (para.isEmpty())
+                            return;
+                        else
+                            args.emplace_back(para.get());
+                    func.call({}, args);
+                }
             }
-        }
-        TIMETASK_CATCH("setTimeout-Function");
-    }, timeout / 50);
+            TIMETASK_CATCH("setTimeout-Function");
+        },
+        timeout / 50);
     CsLockHolder lock(locker);
     data.swap(timeTaskMap[tid]);
     return tid;
 }
 
-int NewTimeout(Local<String> func, int timeout)
-{
+int NewTimeout(Local<String> func, int timeout) {
     int tid = ++timeTaskId;
     TimeTaskData data;
 
@@ -159,41 +148,40 @@ int NewTimeout(Local<String> func, int timeout)
     data.engine = EngineScope::currentEngine();
 
     data.task = Schedule::delay(
-        [engine{EngineScope::currentEngine()}, id{tid}]()
-    {
-        try {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-                return;
-            EngineScope scope(engine);
-            TimeTaskData taskData;
-            {
-                CsLockHolder lock(locker);
-
-                auto t = timeTaskMap.find(id);
-                if (t == timeTaskMap.end())
+        [engine{EngineScope::currentEngine()}, id{tid}]() {
+            try {
+                if (LL::isServerStopping())
                     return;
-                t->second.swap(taskData);
-                timeTaskMap.erase(id);
-            }
+                if (!EngineManager::isValid(engine))
+                    return;
+                EngineScope scope(engine);
+                TimeTaskData taskData;
+                {
+                    CsLockHolder lock(locker);
 
-            if (taskData.code.isEmpty())
-                return;
-            auto code = taskData.code.get().toString();
-            engine->eval(code);
-        }
-        TIMETASK_CATCH("setTimeout-String");
-    }, timeout / 50);
+                    auto t = timeTaskMap.find(id);
+                    if (t == timeTaskMap.end())
+                        return;
+                    t->second.swap(taskData);
+                    timeTaskMap.erase(id);
+                }
+
+                if (taskData.code.isEmpty())
+                    return;
+                auto code = taskData.code.get().toString();
+                engine->eval(code);
+            }
+            TIMETASK_CATCH("setTimeout-String");
+        },
+        timeout / 50);
 
     CsLockHolder lock(locker);
     data.swap(timeTaskMap[tid]);
     return tid;
 }
 
-int NewInterval(Local<Function> func, vector<Local<Value>> paras, int timeout)
-{
-    int tid = ++ timeTaskId;
+int NewInterval(Local<Function> func, vector<Local<Value>> paras, int timeout) {
+    int tid = ++timeTaskId;
     TimeTaskData data;
 
     data.func = func;
@@ -202,116 +190,107 @@ int NewInterval(Local<Function> func, vector<Local<Value>> paras, int timeout)
         data.paras.emplace_back(std::move(para));
 
     data.task = Schedule::repeat(
-        [engine{EngineScope::currentEngine()}, id{tid}]()
-    {
-        try {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-            {
-                ClearTimeTask(id);
-                return;
-            }
-            EngineScope scope(engine);
-            Local<Value> func = Local<Value>();
-            vector<Local<Value>> args;
-            {
-                CsLockHolder lock(locker);
-
-                auto t = timeTaskMap.find(id);
-                if (t == timeTaskMap.end())
+        [engine{EngineScope::currentEngine()}, id{tid}]() {
+            try {
+                if (LL::isServerStopping())
                     return;
-
-                TimeTaskData& taskData = t->second;
-
-                if (taskData.func.isEmpty())
+                if (!EngineManager::isValid(engine)) {
+                    ClearTimeTask(id);
                     return;
-                func = taskData.func.get();
-                if (!taskData.paras.empty())
+                }
+                EngineScope scope(engine);
+                Local<Value> func = Local<Value>();
+                vector<Local<Value>> args;
                 {
-                    vector<Local<Value>> args;
-                    for (auto& para : taskData.paras)
-                        if (para.isEmpty())
-                            return;
-                        else
-                            args.emplace_back(para.get());
+                    CsLockHolder lock(locker);
+
+                    auto t = timeTaskMap.find(id);
+                    if (t == timeTaskMap.end())
+                        return;
+
+                    TimeTaskData& taskData = t->second;
+
+                    if (taskData.func.isEmpty())
+                        return;
+                    func = taskData.func.get();
+                    if (!taskData.paras.empty()) {
+                        vector<Local<Value>> args;
+                        for (auto& para : taskData.paras)
+                            if (para.isEmpty())
+                                return;
+                            else
+                                args.emplace_back(para.get());
+                    }
                 }
+                if (!func.isFunction())
+                    return;
+                if (args.size() > 0)
+                    func.asFunction().call({}, args);
+                else
+                    func.asFunction().call();
             }
-            if (!func.isFunction())
-                return;
-            if (args.size() > 0)
-                func.asFunction().call({}, args);
-            else
-                func.asFunction().call();
-        }
-        TIMETASK_CATCH("setInterval-Function");
-    }, timeout / 50);
+            TIMETASK_CATCH("setInterval-Function");
+        },
+        timeout / 50);
 
     CsLockHolder lock(locker);
     data.swap(timeTaskMap[tid]);
     return tid;
 }
 
-int NewInterval(Local<String> func, int timeout)
-{
-    int tid = ++ timeTaskId;
+int NewInterval(Local<String> func, int timeout) {
+    int tid = ++timeTaskId;
     TimeTaskData data;
 
     data.code = func;
     data.engine = EngineScope::currentEngine();
 
     data.task = Schedule::repeat(
-        [engine{EngineScope::currentEngine()}, id{tid}]()
-    {
-        try {
-            if (LL::isServerStopping())
-                return;
-            if (!EngineManager::isValid(engine))
-            {
-                ClearTimeTask(id);
-                return;
-            }
-            EngineScope scope(engine);
-            std::string code;
-            {
-                CsLockHolder lock(locker);
-
-                auto t = timeTaskMap.find(id);
-                if (t == timeTaskMap.end())
+        [engine{EngineScope::currentEngine()}, id{tid}]() {
+            try {
+                if (LL::isServerStopping())
                     return;
-                TimeTaskData& taskData = t->second;
-
-                if (taskData.code.isEmpty())
+                if (!EngineManager::isValid(engine)) {
+                    ClearTimeTask(id);
                     return;
-                code = taskData.code.get().toString();
+                }
+                EngineScope scope(engine);
+                std::string code;
+                {
+                    CsLockHolder lock(locker);
+
+                    auto t = timeTaskMap.find(id);
+                    if (t == timeTaskMap.end())
+                        return;
+                    TimeTaskData& taskData = t->second;
+
+                    if (taskData.code.isEmpty())
+                        return;
+                    code = taskData.code.get().toString();
+                }
+                if (!code.empty())
+                    engine->eval(code);
             }
-            if (!code.empty())
-                engine->eval(code);
-        }
-        TIMETASK_CATCH("setInterval-String");
-    }, timeout / 50);
+            TIMETASK_CATCH("setInterval-String");
+        },
+        timeout / 50);
 
     CsLockHolder lock(locker);
     data.swap(timeTaskMap[tid]);
     return tid;
 }
 
-bool ClearTimeTask(int id)
-{
+bool ClearTimeTask(int id) {
     assert(EngineScope::currentEngine() != nullptr);
     TimeTaskData data;
-    try
-    {
+    try {
         CsLockHolder lock(locker);
         auto it = timeTaskMap.find(id);
-        if (it != timeTaskMap.end())
-        {
+        if (it != timeTaskMap.end()) {
             data.swap(timeTaskMap[id]);
             timeTaskMap.erase(id);
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.error("Fail in ClearTimeTask");
     }
     return true;
@@ -320,27 +299,20 @@ bool ClearTimeTask(int id)
 
 ///////////////////////// Func /////////////////////////
 
-void LLSERemoveTimeTaskData(ScriptEngine* engine)
-{
+void LLSERemoveTimeTaskData(ScriptEngine* engine) {
     // enter scope to prevent script::Global::~Global() from crashing
     EngineScope enter(engine);
     std::unordered_map<int, TimeTaskData> tmpMap;
-    try
-    {
+    try {
         CsLockHolder lock(locker);
-        for (auto it = timeTaskMap.begin(); it != timeTaskMap.end();)
-        {
-            if (it->second.engine == engine)
-            {
+        for (auto it = timeTaskMap.begin(); it != timeTaskMap.end();) {
+            if (it->second.engine == engine) {
                 it->second.swap(tmpMap[it->first]);
                 it = timeTaskMap.erase(it);
-            }
-            else
+            } else
                 ++it;
         }
-    }
-    catch (...)
-    {
+    } catch (...) {
         logger.info("Fail in LLSERemoveTimeTaskData");
     }
     tmpMap.clear();
diff --git a/ScriptEngine/Engine/TimeTaskSystem.h b/ScriptEngine/Engine/TimeTaskSystem.h
--- a/ScriptEngine/Engine/TimeTaskSystem.h
+++ b/ScriptEngine/Engine/TimeTaskSystem.h
@@ -5,7 +5,7 @@
 
 ///////////////////////// API /////////////////////////
 
-//void NewTimeout_s(script::Global<Function> func, vector<script::Local<Value>> paras, int timeout, ScriptEngine* engine = EngineScope::currentEngine());
+// void NewTimeout_s(script::Global<Function> func, vector<script::Local<Value>> paras, int timeout, ScriptEngine* engine = EngineScope::currentEngine());
 
 int NewTimeout(Local<Function> func, std::vector<Local<Value>> paras, int timeout);
 int NewTimeout(Local<String> func, int timeout);
diff --git a/ScriptEngine/Global.hpp b/ScriptEngine/Global.hpp
--- a/ScriptEngine/Global.hpp
+++ b/ScriptEngine/Global.hpp
@@ -24,7 +24,7 @@ typedef unsigned long long QWORD;
 class IntVec4
 {
 public:
-	int x,y,z;
+    int x,y,z;
     int dim;
 
     inline BlockPos getBlockPos()
@@ -41,7 +41,7 @@ class IntVec4
 class FloatVec4
 {
 public:
-	float x,y,z;
+    float x,y,z;
     int dim;
 
     inline Vec3 getVec3()
diff --git a/ScriptEngine/PluginManager.h b/ScriptEngine/PluginManager.h
--- a/ScriptEngine/PluginManager.h
+++ b/ScriptEngine/PluginManager.h
@@ -7,19 +7,19 @@
 class PluginManager
 {
 private:
-	static bool unRegisterPlugin(std::string name);
+    static bool unRegisterPlugin(std::string name);
 
 public:
-	static bool loadPlugin(const std::string& filePath, bool isHotLoad = false, bool mustBeCurrectModule = false);
-	static bool unloadPlugin(const std::string& name);
-	static bool reloadPlugin(const std::string& name);
-	static bool reloadAllPlugins();
+    static bool loadPlugin(const std::string& filePath, bool isHotLoad = false, bool mustBeCurrectModule = false);
+    static bool unloadPlugin(const std::string& name);
+    static bool reloadPlugin(const std::string& name);
+    static bool reloadAllPlugins();
 
-	static LL::Plugin* getPlugin(std::string name);
-	static std::unordered_map<std::string, LL::Plugin*> getLocalPlugins();
-	static std::unordered_map<std::string, LL::Plugin*> getAllScriptPlugins();
-	static std::unordered_map<std::string, LL::Plugin*> getAllPlugins();
+    static LL::Plugin* getPlugin(std::string name);
+    static std::unordered_map<std::string, LL::Plugin*> getLocalPlugins();
+    static std::unordered_map<std::string, LL::Plugin*> getAllScriptPlugins();
+    static std::unordered_map<std::string, LL::Plugin*> getAllPlugins();
 
-	static bool registerPlugin(std::string filePath, std::string name, std::string desc,
-		LL::Version version, std::map<std::string, std::string> others);
+    static bool registerPlugin(std::string filePath, std::string name, std::string desc,
+        LL::Version version, std::map<std::string, std::string> others);
 };
\ No newline at end of file
diff --git a/ScriptEngine/SafeGuardRecord.cpp b/ScriptEngine/SafeGuardRecord.cpp
--- a/ScriptEngine/SafeGuardRecord.cpp
+++ b/ScriptEngine/SafeGuardRecord.cpp
@@ -8,12 +8,12 @@ ofstream record;
 
 void InitSafeGuardRecord()
 {
-	filesystem::create_directories("logs/LiteLoader");
-	record.open(string("logs/LiteLoader/Sensitive_Operation_Records-") + LLSE_BACKEND_TYPE + ".log", ios::app);
+    filesystem::create_directories("logs/LiteLoader");
+    record.open(string("logs/LiteLoader/Sensitive_Operation_Records-") + LLSE_BACKEND_TYPE + ".log", ios::app);
 }
 
 void RecordOperation(const string& pluginName, const std::string &operation, const string& content)
 {
-	if (record.is_open())
-		record << "[" << operation << "]<" << pluginName << "> " << content << endl;
+    if (record.is_open())
+        record << "[" << operation << "]<" << pluginName << "> " << content << endl;
 }
\ No newline at end of file
diff --git a/ScriptEngine/ScriptEngine.cpp b/ScriptEngine/ScriptEngine.cpp
--- a/ScriptEngine/ScriptEngine.cpp
+++ b/ScriptEngine/ScriptEngine.cpp
@@ -30,49 +30,42 @@ ::Logger logger("LiteLoader");
 
 extern void LoadDepends();
 extern void LoadMain();
-extern void BindAPIs(ScriptEngine *engine);
+extern void BindAPIs(ScriptEngine* engine);
 extern void LoadDebugEngine();
 
-void LoaderInfo()
-{
+void LoaderInfo() {
     logger.info(std::string("ScriptEngine for ") + LLSE_MODULE_TYPE + " loaded");
     logger.info(std::string("Version ") + LITELOADER_VERSION.toString());
 }
 
-void LoadConfigFile()
-{
+void LoadConfigFile() {
     try {
         auto content = ReadAllFile(LITELOADER_CONFIG_FILE);
         if (content) {
             globalConfig = fifo_json::parse(*content, nullptr, true, true);
             return;
         }
-    }
-    catch (const nlohmann::json::exception& e) {
+    } catch (const nlohmann::json::exception& e) {
         logger.error("Fail to parse config file <{}> !", LITELOADER_CONFIG_FILE);
         logger.error("{}", TextEncoding::toUTF8(e.what()));
-    }
-    catch (...) {
+    } catch (...) {
         logger.error("Fail to load config file <{}> !", LITELOADER_CONFIG_FILE);
     }
     globalConfig = fifo_json::object();
 }
 
-void entry()
-{
+void entry() {
     //设置全局SEH处理
     _set_se_translator(seh_exception::TranslateSEHtoCE);
 
-    //Register Myself
+    // Register Myself
     LL::registerPlugin(LLSE_LOADER_NAME, LLSE_LOADER_DESCRIPTION, LITELOADER_VERSION,
-    {
-        {"GitHub","github.com/LiteLDev/LiteLoaderBDS"}
-    });
+                       {{"GitHub", "github.com/LiteLDev/LiteLoaderBDS"}});
 
-    //Load Global Config
+    // Load Global Config
     LoadConfigFile();
 
-    //I18n
+    // I18n
     Translation::loadFromImpl(GetCurrentModule(), LL::getLoaderHandle());
 
     //初始化全局数据
@@ -81,8 +74,7 @@ void entry()
     InitSafeGuardRecord();
 
     //欢迎
-    if (localShareData->isFirstInstance)
-    {
+    if (localShareData->isFirstInstance) {
         logger.info("ScriptEngine initializing...");
     }
     LoaderInfo();
@@ -92,7 +84,7 @@ void entry()
 
     //预加载库
     LoadDepends();
-    
+
     //加载插件
     LoadMain();
 
diff --git a/ScriptEngine/ScriptEngine.rc b/ScriptEngine/ScriptEngine.rc
--- a/ScriptEngine/ScriptEngine.rc
+++ b/ScriptEngine/ScriptEngine.rc
@@ -27,12 +27,12 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
 // TEXTINCLUDE
 //
 
-1 TEXTINCLUDE 
+1 TEXTINCLUDE
 BEGIN
     "resource.h\0"
 END
 
-2 TEXTINCLUDE 
+2 TEXTINCLUDE
 BEGIN
     "#include ""winres.h""\r\n"
     "#include ""../LiteLoader/Main/Version.h""\r\n"
@@ -40,7 +40,7 @@ BEGIN
     "\0"
 END
 
-3 TEXTINCLUDE 
+3 TEXTINCLUDE
 BEGIN
     "\r\n"
     "\0"
diff --git a/ScriptEngine/ScriptEngine.vcxproj b/ScriptEngine/ScriptEngine.vcxproj
--- a/ScriptEngine/ScriptEngine.vcxproj
+++ b/ScriptEngine/ScriptEngine.vcxproj
@@ -197,9 +197,10 @@
       <ExceptionHandling>Async</ExceptionHandling>
       <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
       <ExternalWarningLevel>Level1</ExternalWarningLevel>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>DebugFull</GenerateDebugInformation>
@@ -243,9 +244,10 @@ LibraryBuilder.exe
       <ExceptionHandling>Async</ExceptionHandling>
       <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
       <ExternalWarningLevel>Level1</ExternalWarningLevel>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>DebugFull</GenerateDebugInformation>
diff --git a/ScriptEngine/Tools/JsonHelper.h b/ScriptEngine/Tools/JsonHelper.h
--- a/ScriptEngine/Tools/JsonHelper.h
+++ b/ScriptEngine/Tools/JsonHelper.h
@@ -67,7 +67,7 @@ inline fifo_json CreateJson(const std::string& path, const std::string& defConte
                 jsonConf = fifo_json::object();
             }
         }
-        
+
     }
     return jsonConf;
 }
\ No newline at end of file
diff --git a/Scripts/UploadSDK.cmd b/Scripts/UploadSDK.cmd
--- a/Scripts/UploadSDK.cmd
+++ b/Scripts/UploadSDK.cmd
@@ -16,7 +16,7 @@ for /f "tokens=3* delims= " %%i in ('Reg query "HKCU\Software\Microsoft\Windows\
         echo [INFO] System Proxy enabled. Adapting Settings finished.
         echo.
     )
-) 
+)
 
 
 echo [INFO] Fetching LiteLoaderSDK to GitHub ...
diff --git a/Scripts/install.sh b/Scripts/install.sh
--- a/Scripts/install.sh
+++ b/Scripts/install.sh
@@ -1,8 +1,8 @@
 #!/bin/bash
 # Install wine
 codename=$(lsb_release -c --short)
-BDSVER="1.19.2.02"
-LLVER="2.3.2"
+BDSVER="1.19.10.03"
+LLVER="2.4.1"
 sudo apt install -y wget software-properties-common unzip
 sudo dpkg --add-architecture i386
 wget -nc https://dl.winehq.org/wine-builds/winehq.key
diff --git a/Tools/CrashLogger/CrashLogger/CrashLogger.vcxproj b/Tools/CrashLogger/CrashLogger/CrashLogger.vcxproj
--- a/Tools/CrashLogger/CrashLogger/CrashLogger.vcxproj
+++ b/Tools/CrashLogger/CrashLogger/CrashLogger.vcxproj
@@ -46,7 +46,7 @@
       <Optimization>Disabled</Optimization>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
diff --git a/Tools/LLUnifiedOutput/LLUnifiedOutput.vcxproj b/Tools/LLUnifiedOutput/LLUnifiedOutput.vcxproj
--- a/Tools/LLUnifiedOutput/LLUnifiedOutput.vcxproj
+++ b/Tools/LLUnifiedOutput/LLUnifiedOutput.vcxproj
@@ -48,7 +48,7 @@
       <LanguageStandard>stdcpp17</LanguageStandard>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
diff --git a/Tools/LLUnifiedOutput/dllmain.cpp b/Tools/LLUnifiedOutput/dllmain.cpp
--- a/Tools/LLUnifiedOutput/dllmain.cpp
+++ b/Tools/LLUnifiedOutput/dllmain.cpp
@@ -31,13 +31,13 @@ bool is(std::string str) {
 //////////// Hook Data ////////////
 HANDLE hConsole;
 
-BOOL (WINAPI *WriteFile_Ptr)(HANDLE hFile, LPCVOID lpBuffer,
-                             DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
-                             LPOVERLAPPED lpOverlapped) = WriteFile;
+BOOL(WINAPI* WriteFile_Ptr)
+(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
+ LPOVERLAPPED lpOverlapped) = WriteFile;
 
 
 //////////// Process ////////////
-//extern bool OutputProcess(std::string& line);
+// extern bool OutputProcess(std::string& line);
 std::ostringstream buffer;
 
 bool inline SendLine(HANDLE hOutput) {
@@ -67,15 +67,14 @@ bool inline SendLine(HANDLE hOutput) {
     return success;
 }
 
-void inline AddText(const char *text, std::streamsize len) {
+void inline AddText(const char* text, std::streamsize len) {
     buffer.write(text, len);
 }
 
-BOOL WINAPI WriteFile_Process(HANDLE hFile, LPCVOID lpBuffer,
-                              DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
-                              LPOVERLAPPED lpOverlapped) {
+BOOL WINAPI WriteFile_Process(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
+                              LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) {
     if (hFile == hConsole) {
-        char *fromPos = (char *) lpBuffer;
+        char* fromPos = (char*)lpBuffer;
         int nowLen = 0;
         for (size_t i = 0; i < nNumberOfBytesToWrite; ++i) {
             if (fromPos[nowLen++] == '\n') {
@@ -90,8 +89,7 @@ BOOL WINAPI WriteFile_Process(HANDLE hFile, LPCVOID lpBuffer,
         *lpNumberOfBytesWritten = nNumberOfBytesToWrite;
         return TRUE;
     } else
-        return WriteFile_Ptr(hFile, lpBuffer, nNumberOfBytesToWrite,
-                             lpNumberOfBytesWritten, lpOverlapped);
+        return WriteFile_Ptr(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
 }
 
 //////////// Init ////////////
@@ -109,7 +107,7 @@ bool Hook() {
         return true;
     });
     bool success = true;
-    if ((__int64) (hConsole = GetStdHandle(STD_OUTPUT_HANDLE)) <= 0)
+    if ((__int64)(hConsole = GetStdHandle(STD_OUTPUT_HANDLE)) <= 0)
         success = false;
     else {
         DetourRestoreAfterWith();
@@ -117,7 +115,7 @@ bool Hook() {
             success = false;
         else if (DetourUpdateThread(GetCurrentThread()) != NO_ERROR)
             success = false;
-        else if (DetourAttach((PVOID *) &WriteFile_Ptr, WriteFile_Process) != NO_ERROR)
+        else if (DetourAttach((PVOID*)&WriteFile_Ptr, WriteFile_Process) != NO_ERROR)
             success = false;
         else if (DetourTransactionCommit() != NO_ERROR)
             success = false;
@@ -131,7 +129,7 @@ bool UnHook() {
         success = false;
     else if (DetourUpdateThread(GetCurrentThread()) != NO_ERROR)
         success = false;
-    else if (DetourDetach((PVOID *) &WriteFile_Ptr, WriteFile_Process) != NO_ERROR)
+    else if (DetourDetach((PVOID*)&WriteFile_Ptr, WriteFile_Process) != NO_ERROR)
         success = false;
     else if (DetourTransactionCommit() != NO_ERROR)
         success = false;
@@ -155,8 +153,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
     return TRUE;
 }
 
-THook(int, "main", int a, void *b) {
-    char **str = static_cast<char **>(b);
+THook(int, "main", int a, void* b) {
+    char** str = static_cast<char**>(b);
     bool enablePrompt = true;
     for (int i = 0; i < a; ++i) {
         if (strcmp(str[i], "--noPrompt") == 0) {
diff --git a/Tools/SymDBHelper/SymDBHelper.vcxproj b/Tools/SymDBHelper/SymDBHelper.vcxproj
--- a/Tools/SymDBHelper/SymDBHelper.vcxproj
+++ b/Tools/SymDBHelper/SymDBHelper.vcxproj
@@ -62,4 +62,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js
--- a/docs/.vuepress/config.js
+++ b/docs/.vuepress/config.js
@@ -135,6 +135,10 @@ module.exports = {
         'SystemAPI/SystemCall',
         'SystemAPI/SystemInfo'
       ],
+      '/zh_CN/CPP/': [
+        'Format/format',
+        'Commit/Commit'
+      ],
       '/zh_CN/': 'auto'
     },
     'locales': {
diff --git a/docs/en_US/Development/EventAPI/PlayerEvents.md b/docs/en_US/Development/EventAPI/PlayerEvents.md
--- a/docs/en_US/Development/EventAPI/PlayerEvents.md
+++ b/docs/en_US/Development/EventAPI/PlayerEvents.md
@@ -336,7 +336,23 @@ Note: Win10 client right-clicking on the player will trigger this event on the s
 
 <br>
 
-#### `"onPlaceBlock"` - Player Places Block Event
+#### `"onPlaceBlock"` - Player Try Places Block Event
+
+- Listener function prototype 
+  `function(player,block)`
+- Parameters: 
+  - player : `Player`  
+    The player that placed the block.
+  - block : `Block`  
+    The block that was placed.
+
+- Intercept events: function returns `false`
+
+> **ATTENTION** This event will always fire when the player tries to place a block.
+
+<br>
+
+#### `"afterPlaceBlock"` - Player Placed Block Event
 
 - Listener function prototype 
   `function(player,block)`
@@ -461,3 +477,28 @@ Note: Player.setSprinting (false) can be executed in the next game tick to achie
 
 Note: This event is so powerful that it can even intercept and open backpacks.
 
+<br>
+
+#### `"onExperienceAdd"` - Player Get Experience
+
+- Listener function prototype 
+  `function(player,exp)`
+- Parameters：
+  - player : `Player`  
+    Players with experience.
+  - exp : `Integer`
+    Amount of experience gained by the player.
+- Intercept events: function returns `false`
+
+<br>
+
+#### `"onBedEnter"` - Player Enters Bed
+
+- Listener function prototype 
+  `function(player,pos)`
+- Parameters：
+  - player : `Player`  
+    The player using the bed.
+  - pos : `IntPos`  
+    The position of the bed used.
+- Intercept events: function returns `false`
diff --git a/docs/en_US/Development/GameAPI/Block.md b/docs/en_US/Development/GameAPI/Block.md
--- a/docs/en_US/Development/GameAPI/Block.md
+++ b/docs/en_US/Development/GameAPI/Block.md
@@ -44,6 +44,18 @@ These object properties are read-only and cannot be modified.
 
 <br>
 
+#### Destroy The Block
+
+`bl.destroy(drop)`
+
+- Parameters：
+  - drop : `Boolen`  
+    Whether to generate drops
+- Return value: Whether the destroy was successful or not.
+- Return value type: `Boolean`
+
+<br>
+
 ### Block Object - Function
 
 Each block object contains some member functions (member methods) that can be executed. for a specific block object `bl`, you can perform some operations on this block through the following functions.
diff --git a/docs/en_US/Development/GameAPI/Device.md b/docs/en_US/Development/GameAPI/Device.md
--- a/docs/en_US/Development/GameAPI/Device.md
+++ b/docs/en_US/Development/GameAPI/Device.md
@@ -24,7 +24,10 @@ Each device information object contains some fixed object properties. for a spec
 | dv.ip            | The IP address of the player's device | `String`  |
 | dv.avgPing       | Average network latency for players (ms) | `Integer` |
 | dv.avgPacketLoss | Player's average network packet loss rate (%) | `Float`   |
+| dv.lastPing      | Network latency for players (ms) | `Integer` |
+| dv.lastPacketLoss| Player's network packet loss rate (%) | `Float`   |
 | dv.os            | The OS type of the player's device | `String`  |
+| dv.serverAddress | The player's connection address | `String`  |
 | dv.clientId      | ID of the player client | `String`  |
 
 These object properties are read-only and cannot be modified 
@@ -33,18 +36,18 @@ Among them, the operating system type attribute returns a string that records th
 
 | dv.os           | Device Operating System|
 | --------------- | --------------------- |
-| `Android`       | Android (Mobile phone)       |
-| `iOS`           | Apple iOS (Mobile phone)          |
-| `OSX`           | Apple OSX (Computer)          |
-| `Amazon`        | Amazon                |
-| `GearVR`        | GearVR                |
-| `Hololens`      | Hololens              |
-| `Windows10`     | Windows 10 (Computer)         |
-| `Win32`         | Win32 (Education Edition?) (Computer)  |
-| `TVOS`          | TVOS                  |
-| `PlayStation`   | PlayStation Host       |
-| `Nintendo`      | Nintendo Host         |
-| `Xbox`          | Xbox Host             |
-| `WindowsPhone`  | Windows Phone     |
+| `Android`       | Google Android (Mobile phone)       |
+| `iOS`           | Apple iOS (Mobile phone) or iPadOS          |
+| `OSX`           | Apple macOS (Computer)          |
+| `Amazon`        | Amazon FireOS                |
+| `GearVR`        | Samsung GearVR                |
+| `Hololens`      | Microsoft Hololens              |
+| `Windows10`     | Microsoft Windows (Computer)         |
+| `Win32`         | Microsoft Win32 (Education Edition?) (Computer)  |
+| `TVOS`          | Apple tvOS                  |
+| `PlayStation`   | Sony PlayStation Host       |
+| `Nintendo`      | Nintendo Switch Host         |
+| `Xbox`          | Microsoft Xbox Host             |
+| `WindowsPhone`  | Windows Mobile     |
 | `Unknown`       | Unknown System              |
 
diff --git a/docs/en_US/Development/GameAPI/Player.md b/docs/en_US/Development/GameAPI/Player.md
--- a/docs/en_US/Development/GameAPI/Player.md
+++ b/docs/en_US/Development/GameAPI/Player.md
@@ -46,6 +46,7 @@ Each player object contains some fixed object properties. For a particular playe
 | pl.name      | Player's name               | `String`         |
 | pl.pos       | Player's coordinates        | `FloatPos`       |
 | pl.blockPos  | The coordinates of the block that the player is standing on.          | `IntPos`         |
+| pl.lastDeathPos  | The coordinates of the block that the player last died.          | `IntPos`         |
 | pl.realName  | Player's Real Name              | `String`         |
 | pl.xuid      | Player Xuid String              | `String`         |
 | pl.uuid      | Player Uuid string              | `String`         |
@@ -59,6 +60,7 @@ Each player object contains some fixed object properties. For a particular playe
 | pl.speed     | Player's current speed               | `Float`          |
 | pl.direction | Player's current orientation         | `DirectionAngle` |
 | pl.uniqueId  | Player's (entity's) unique identifier    | `String`         |
+| pl.isLoading | Player is loading | `Boolean`    |
 
 These object properties are read-only and cannot be modified. in:
 
@@ -232,6 +234,7 @@ var open = pl.runcmd("tp ~ ~+50 ~");
 - Return value: Whether the execution was successful.
 - Return value type:  `Boolean`   
 
+<br>
 
 #### Speak to a Player as a Player
 
@@ -398,6 +401,7 @@ For more usage of container objects, please refer to [Container Object API Docum
 - Return value type: `Container`
 
 For more usage of container objects, please refer to [Container Object API Documentation](/en_US/Development/GameAPI/Container.md)
+
 <br>
 
 #### Get the Player’s Respawn Coordinates  
@@ -534,12 +538,23 @@ pl.addLevel(6);
 [Lua]
 
 ```
+#### Decreases Player Experience Level
+
+`pl.reduceLevel(count)`
+
+- Parameters: 
+  - count : `Integer`  
+    The number of experience levels to reduce.
+- Return value: Whether the setting was successful.
+- Return value type: `Boolean`
+
+<br>
 
 #### Get Player Experience Level 
 
 `pl.getLevel()`
 
-- Return value: The player's experience level
+- Return value: The player's experience level.
 - Return value type: `Integer`
 
 ```JavaScript
@@ -552,6 +567,17 @@ pl.getLevel();
 --For a `Player` object pl
 pl.getLevel()
 ```
+#### Set Player Experience Level
+
+`pl.setLevel(count)`
+
+- Parameters
+  - count : `Integer`  
+    The number of experience levels to set.
+- Return value: Whether the setting was successful.
+- Return value type: `Boolean`
+
+<br>
 
 #### Reset Player Experience
 
@@ -571,45 +597,99 @@ pl.resetLevel();
 pl:resetLevel()
 ```
 
-#### Get the Experience Points Needed for Players to Level Up
+#### Get Player Current Experience Points 
 
-`pl.getXpNeededForNextLevel()`
+`pl.getCurrentExperience()`
 
-- Return value: The amount of experience points required for the player to level up.
+- Return value: The player's current experience points.
 - Return value type: `Integer`
 
-Note that this method ignores the experience value that exceeds the level when calculating.
+<br>
+
+#### Set Player Current Experience Points
+
+`pl.setCurrentExperience(count)`
+
+- Parameters
+  - count : `Integer`  
+    The number of experience points to set.
+- Return value: Whether the setting was successful.
+- Return value type: `Boolean`
+
+<br>
+
+#### Get Player Total Experience Points
+
+`pl.getTotalExperience()`
+
+- Return value: The player's total experience points.
+- Return value type: `Integer`
+
+<br>
+
+#### Set Player Total Experience Points
+
+`pl.getTotalExperience(count)`
+
+- Parameters
+  - count : `Integer`  
+    The number of experience points to set.
+- Return value: Whether the setting was successful.
+- Return value type: `Boolean`
+
+<br>
+
+#### Increase Player Experience Points
+
+`pl.addExperience(count)`
+
+- Parameters: 
+  - count : `Integer`
+    The amount of experience points to give to the player.
+- Return value: Whether the setting was successful.
+- Return value type: `Boolean`
 
 ```Javascript
 [JS]
 //For a `Player` object pl
-pl.getXpNeededForNextLevel();
+pl.addExperience(6);
 ```
 ```Lua
 [Lua]
 --For a `Player` object pl
-pl.getXpNeededForNextLevel()
+pl:addExperience(6)
 ```
 
-#### Increase Player Experience
+#### Decreases Player Experience Points
 
-`pl.addExperience(count)`
+`pl.reduceExperience(count)`
 
 - Parameters: 
-  - count : `Integer`
-    The amount of experience points to give to the player.
+  - count : `Integer`  
+    The number of experience points to reduce.
 - Return value: Whether the setting was successful.
 - Return value type: `Boolean`
 
+<br>
+
+#### Get the Experience Points Needed for Players to Level Up
+
+`pl.getXpNeededForNextLevel()`
+
+- Return value: The amount of experience points required for the player to level up.
+- Return value type: `Integer`
+
+Note that this method ignores the experience value that exceeds the level when calculating.
+
 ```Javascript
 [JS]
 //For a `Player` object pl
-pl.addExperience(6);
+pl.getXpNeededForNextLevel();
 ```
 ```Lua
 [Lua]
 --For a `Player` object pl
-pl:addExperience(6)
+pl.getXpNeededForNextLevel()
 ```
 
 #### Send the Player to the Specified Server  
@@ -650,7 +730,6 @@ pl.crash();
 pl:crash()
 
 ```
-
 #### Set Player Custom Sidebar
 
 `pl.setSidebar(title,data[,sortOrder])`
@@ -822,14 +901,14 @@ Each item in the list of key-value pairs looks like: `"mayfly": 1` etc.
 Each item in the array is a key-value pair list object `Object`, and the Attributes object contains several contents such as `Base` `Current` `DefaultMax` `DefaultMin` `Max` `Min` `Name` by default. Its content looks like:
 ```JSON
 {
-        "Base": 0, 
-        "Current": 0, 
-        "DefaultMax": 1024, 
-        "DefaultMin": -1024, 
-        "Max": 1024, 
-        "Min": -1024, 
-        "Name": "minecraft:luck"
-}, 
+    "Base": 0, 
+    "Current": 0, 
+    "DefaultMax": 1024, 
+    "DefaultMin": -1024, 
+    "Max": 1024, 
+    "Min": -1024, 
+    "Name": "minecraft:luck"
+}
 ```
 
 (Here it's displayed visually using JSON format)
diff --git a/docs/en_US/Development/GuiAPI/Form.md b/docs/en_US/Development/GuiAPI/Form.md
--- a/docs/en_US/Development/GuiAPI/Form.md
+++ b/docs/en_US/Development/GuiAPI/Form.md
@@ -12,16 +12,16 @@ for a specific player object `pl`, the following form interfaces are available:
 
 A modal form contains a title, a text display, and two buttons.
 
-`pl.sendModalForm(title,content,button1,button2,callback)`
+`pl.sendModalForm(title,content,confirmButton,cancelButton,callback)`
 
 - Parameters: 
   - title : `String`  
     Form title.  
   - content : `String`  
     Form content.
-  - button1 : `String`  
+  - confirmButton : `String`  
     Button 1 text.  
-  - button2 : `String`  
+  - cancelButton : `String`  
     Button 2 text.  
   - callback : `Function`  
     Function called after player clicks a button.  
@@ -35,7 +35,7 @@ A modal form contains a title, a text display, and two buttons.
     The player object that interacts with the form.
     
   - result : `Boolean`    
-    Player clicks **OK** button is `true`, **Cancel** button is `false`.   
+    Player clicks **Confirm** button is `true`, **Cancel** button is `false`.   
     
     If the id is `Null`, the player cancels the form.
 
diff --git a/docs/zh_CN/CPP/Commit/Commit.md b/docs/zh_CN/CPP/Commit/Commit.md
new file mode 100644
--- /dev/null
+++ b/docs/zh_CN/CPP/Commit/Commit.md
@@ -0,0 +1,19 @@
+# Commit格式
+
+## 三原则
+
+在提交commit时，您需要遵循以下原则:
+- 仅使用英语(Only English)
+- 首字母大写
+- 详细的说明，而不是使用`Update`之类的单词描述
+
+## 向beta分支提交commit
+
+如果这个修改只需要您自己一个人完成，请先将LL主仓库fork至您的个人账户，并在您的本地存储库中将您的fork仓库添加到远程存储库，做出修改并提交commit(不需要遵循三原则)后，向主仓库的beta分支提交pull request，经过code review后将您的pull request通过squash的方式merge到beta分支(如果您尚未拥有主仓库的write权限，请在开发群内提醒其他开发者review)
+
+如果这个修改需要多人协作，请在Git/Visual Studio/VSCode/Clion中从beta创建一个新的分支，命名方式为: `module/change`  
+例如: `docs/update-cpp-docs`
+
+## 将beta分支合并到main分支
+
+提交一个将beta合并到main的pull request，并使用直接merge的方式合并分支(不是rebase/squash)
\ No newline at end of file
diff --git a/docs/zh_CN/CPP/Format/format.md b/docs/zh_CN/CPP/Format/format.md
new file mode 100644
--- /dev/null
+++ b/docs/zh_CN/CPP/Format/format.md
@@ -0,0 +1,235 @@
+# LiteLoaderBDS 项目 C++ 编写标准
+
+## 介绍
+
+&emsp;&emsp;本文档描述了 `LiteLoaderBDS` 项目（以下简称 **LL**）中使用的编写标准。LL 项目内的代码都应遵循此标准。对于其他基于 LL 编写的插件，并不作任何要求，但编写标准对于编写大规模的插件项目尤为重要。
+
+&emsp;&emsp;请注意，某些外部库有会偏离编码标准。被引用的外部库应当尽量保持其原有形态，不做任何修改，尤其是格式修改。
+
+&emsp;&emsp;这些指南的最终目标是提高我们公共源代码库的可读性和可维护性。
+
+> 欢迎参与到 LL 的开发中来！
+
+## 语言、库和 C++ 标准
+
+&emsp;&emsp;LL 中绝大部分为 C++ 代码，在使用外部库时，请尽量选择现代的，具有 C++ 面向对象接口的库，非必要尽量不要暴露 C 形式的代码。如果引用 C 库，请进行适当的封装。LL 目前使用 C++20 标准，并会随着 BDS 的标准更新，引用其代码或者 SDK 的子项目请注意这一点。
+
+&emsp;&emsp;我们鼓励使用 C++ 标准库，而不是实现自定义数据结构。使用容器的第一步是明确你自己的目的：你想要一个顺序容器，一个类似集合的容器，还是一个类似键值对的容器？选择容器时最重要的是您计划如何访问容器的算法属性。基于此，您应该使用：
+
+- `map/unordered_map` - 如果您需要基于另一个值有效查找一个值，则可以使用类似 `map` 的容器。类似 `map` 的容器还支持有效的包含查询（键是否在 `map` 中）。类映射容器通常不支持有效的反向映射（值到键）。如果需要，请使用两张 `map` 。例如 `MC/Types.hpp` 内的 `BidirectionalUnorderedMap` 。一些类似 `map` 的容器还支持按排序顺序通过键进行有效迭代。 `map` 通常要慢于 `unordered_map` 。使用 `unordered_map` 时，你需要为键实现 std::hash 的模板特化，或者自定义哈希函数。用 `map` 时，你需要为键实现比较函数。需要注意的是，普通 `map` 的键具有唯一性，如果你需要许多相同的键，请使用类似 `multimap` 的容器。
+
+- `set/unordered_set` - 如果您需要将一堆东西放入自动消除重复项的容器中，则可以使用类似 `set` 的容器。一些类似 `set` 的容器支持按排序顺序通过元素进行有效迭代。类似 `set` 的容器比顺序容器更昂贵。当然，此结构也有对应的 multi 版本。
+
+- `vector` - 顺序容器提供了添加元素的最有效方法，并跟踪它们添加到其中的顺序。它们允许重复并支持有效的迭代，但不支持基于键的有效查找。类似的还有队列，在编写 BFS 等算法时，请尽量使用类似 `queue` 的容器。当需要储存多维数据时，使用一个 `vector` ，讲多维坐标变换到 1 维进行存储访问，通常比 `vector` 嵌套的速度快。
+
+- `string` - 字符串容器是用于字符或字节数组的专用顺序容器或引用结构。请不要暴露类 C 的 char* 接口。
+
+## 代码格式
+
+### 注释
+&emsp;&emsp;注释对于可读性和可维护性很重要。写注释时，用英文，使用适当的大小写、标点符号等。旨在描述代码试图做什么以及为什么，而不是在微观层面上它是如何做到的。但对于某些算法中的魔法数字，请注明。
+
+### 头文件
+
+&emsp;&emsp;介于目前编译器对 `module` 的支持并不完善，我们依旧使用头文件而非 `module` 的形式。请确保所有头文件的开头都写有：
+```cpp
+#pragma once
+```
+&emsp;&emsp;以保证头文件不被重复编译。头文件内的函数尽量全部使用 `inline` 使得编译器在头文件循环引用时可以忽略多重定义，选取其中一个。除模板外，函数的定义尽量与实现分开。
+
+### 命名
+
+&emsp;&emsp;文件与文件夹的名称应当遵循大驼峰命名，类同样如此，通常来说，一个类会搭配一个头文件与实现文件，类名与头文件名和实现文件名应当一致。
+
+&emsp;&emsp;函数与变量采用小驼峰命名，对于代码内子块的临时变量，可采用在大驼峰前加上小写字母 `m` 的写法。也就是匈牙利命名法。
+
+&emsp;&emsp;需要注意的是，对于不利于人类识别的定义方法请不要使用。例如，在同一行定义某个类的变量与变量指针。
+
+&emsp;&emsp;命名应当使用英文全称，注意动词的时态，除非大家公认的缩写，否则不要使用。
+
+&emsp;&emsp;类中的成员应当写在最前端，随后是构造函数，然后进行运算符重载，其余函数写在后面。对于静态成员，应当写在类的末尾。
+
+### 使用括号
+
+&emsp;&emsp;小括号的使用，可以有效的帮助开发者分辨逻辑，运算语句的顺序，在进行不同层级的符号运算时，如位移的同时进行加减法，逻辑语句中加入取非运算，比较大小与加减乘除混合使用等情况时，应当适当的添加小括号增加代码可读性。
+
+### 缩进
+
+&emsp;&emsp;LL 使用 4 个空格为一个单元的缩进方式，请勿使用 tab 缩进。
+
+### 警告
+
+&emsp;&emsp;将编译器警告视为错误，而不是 `disable` ，除非它由外部库引起。这样有利于寻找代码中的隐含错误。
+
+### 格式化
+
+&emsp;&emsp;LL 内附带了 `.clang-format` 文件，请使用此文件对代码进行格式化，而不是自己自创一套新的格式化方案，任何不符合代码格式的提交都有可能被拒绝。
+
+&emsp;&emsp;如果你有充足的理由对某部分代码块不进行格式化，那么请使用 `// clang-format off` 与 `// clang-format on` 局部关闭代码格式化。
+
+### 可移植性
+
+&emsp;&emsp;BDS 任何情况下，请考虑代码的可移植性，对于非必要的偏移，请不要使用。所有使用可能发生变化的偏移的部分都应当写有统一格式的注释：
+
+```cpp
+/*_CHANGEABLE_OFFSET_LV240_16*/
+```
+&emsp;&emsp;此处的 16 为偏移的数值，LV240代表最后一次更改偏移的版本为 2.4.0 。每当 LL 进行 BDS 版本兼容升级时，应当对所有使用可能发生变化的偏移的代码部分进行测试。
+
+### 可读性
+
+&emsp;&emsp;请 “ 几乎总是 ” 使用 `auto` ，包括一些简短的模板，也可以使用 C++17 以后的 `auto` 形式。
+
+#### 小心不必要的副本auto
+
+&emsp;&emsp;`auto`的便利性让人很容易忘记它的默认行为是复制。特别是在基于范围的 `for` 循环中，粗心的复制造成的代价十分高昂。除非您需要复制，否则请使用 `auto&` ，`auto*`
+
+### 减少不必要的 include
+
+&emsp;&emsp;include 稍有不慎就会导致很多错误，请不要进行多余的 include 操作。
+
+### 不要编写全局命名空间函数
+
+&emsp;&emsp;所有函数，都应当处于 LL 的命名空间内，命名空间采用全部小写的形式，除非太长，否则不采用蛇形命名。
+
+### 使用提前 return/continue 简化代码
+
+```cpp
+bool *Player::eat(ItemStack* item) {
+    if ((!item->isTerminator()) && item->isFood() && this->isHungry()) {
+        ... some long code ....
+    }
+
+  return false;
+}
+```
+&emsp;&emsp;相较于上述代码，我们更推荐下面的。
+
+```cpp
+bool *Player::eat(ItemStack* item) {
+
+    if (item->isTerminator() || (!item->isFood()) || (!this->isHungry())) {
+        return false;
+    }
+
+    ... some long code ....
+}
+```
+
+&emsp;&emsp;长代码放在 if 内，会使得可用缩进变小，并且过长的翻阅过程也会是你分不清大括号的嵌套。
+
+&emsp;&emsp;编写代码时，请尽量试着减少缩进。
+
+### 无论如何，都要使用大括号
+
+&emsp;&emsp;无论 if ，for ，while 等语句下面的代码有多么简短，都必须使用大括号包住。
+
+### 将操作拆分
+
+&emsp;&emsp;使用宏定义或新增函数的方式，将冗长的代码块变成小单元，例如：
+```cpp
+bool *Player::canEat() {
+
+  ... some code ....
+
+    bool FoundFood = false;
+    for (unsigned I = 0, E = BarList.size(); I != E; ++I){
+        if (BarList[I]->isFood()) {
+        FoundFood = true;
+        break;
+        }
+    }
+
+if (FoundFood) {
+  ...
+}
+
+  ... some code ....
+
+}
+```
+&emsp;&emsp;相较于上述代码，我们更推荐下面的。
+
+```cpp
+
+static bool containsFood(const std::vector<ItemStack*> &List) {
+    for (unsigned I = 0, E = List.size(); I != E; ++I){
+        if (List[I]->isFood()){
+            return true;
+        }
+    }
+  return false;
+}
+
+bool *Player::canEat() {
+
+  ... some code ....
+
+if (containsFood(BarList)) {
+  ...
+}
+
+  ... some code ....
+
+}
+
+```
+
+### 善用匿名命名空间
+
+&emsp;&emsp;如上面的 containsFood ，可能仅仅需要使用一次，那么请将其放入实现文件的匿名命名空间中，不应当将其暴露给外部。
+
+### 不要使用 using namespace std
+
+&emsp;&emsp;不要使用 using namespace std ，尤其是头文件内。
+
+### 不要end()每次都通过循环进行评估
+
+&emsp;&emsp;在for不能使用基于范围的循环并且需要编写显式的基于迭代器的循环的情况下，请密切注意是否 end() 在每次循环迭代时重新评估。一个常见的错误是以这种风格编写循环：
+
+```cpp
+auto blocks = ...
+for (auto I = blocks->begin(); I != blocks->end(); ++I){
+    Level::setBlock(getPos(I),blocks[I]);
+}
+```
+&emsp;&emsp;相较于上述代码，我们更推荐下面的。
+
+```cpp
+auto blocks = ...
+for (auto I = blocks->begin(), E = blocks->end(); I != E; ++I){
+    Level::setBlock(getPos(I),blocks[I]);
+}
+```
+
+&emsp;&emsp;观察者可能很快指出这两个循环可能有不同的语义：如果容器正在发生增删，那么 `BB->end()` 可能会在每次循环中改变它的值，而第二个循环实际上可能不会是正确的。如果您确实依赖此行为，请以第一种形式编写循环并添加注释，表明您是故意这样做的。
+
+&emsp;&emsp;为什么我们更喜欢第二种形式（正确时）？以第一种形式编写循环有两个问题。首先，它可能比在循环开始时评估它的效率低。在这种情况下，成本可能很小——每次循环都会增加一些额外的负载。但是，如果基础表达式更复杂，则成本会迅速上升。某些结束表达式实际上类似于：`SomeMap[X]->end()` 的循环。通过始终如一地以第二种形式编写它，您可以完全消除此问题，甚至不必考虑它。
+
+&emsp;&emsp;第二个（甚至更大）的问题是，以第一种形式编写循环会向读者暗示循环正在改变容器（注释很容易证实这一事实！）。如果您以第二种形式编写循环，则无需查看循环体就可以立即看出容器没有被修改，这使得阅读代码和理解它的作用更容易。
+
+### 避免使用 std::endl
+```cpp
+std::cout << std::endl;
+```
+&emsp;&emsp;上述代码等价于以下代码。
+```cpp
+std::cout << '\n' << std::flush;
+```
+&emsp;&emsp;多数情况下，你可能并不需要刷新输出流，因此最好使用 '\n' 。
+
+### 首选 ++I
+
+&emsp;&emsp;多数情况下，++I 要比 I++ 快很多。
+
+### 类型转换
+
+&emsp;&emsp;不要使用 C 形式的类型转换，而是选用 static_cast<>() 之类的 C++ 类型转换形式。
+
+## 代码审查
+
+&emsp;&emsp;开发者在对 LL 进行维护时，不可擅自提交至 beta ，尤其是 main 仓库，应当以 pull request 的形式，先对代码进行编译确认代码无编译错误，并由至少 2 名开发者审查后，才可合并到 beta 分支。详情见[Commit格式](../Commit/Commit.md)
+
+## 单元测试
+
+&emsp;&emsp;所有可能发生变化的偏移，在对应的 BDS 版本更新后，都应当对其进行单元测试，确保不会引发错误后才可上线。对于被内联掉的函数，应当尽量在头文件内进行复现并添加 inline 标识。切勿直接搬运 IDA 代码。在先前的版本进行单元测试确认原版实现与此实现结果完全一致后，才可上线。
diff --git a/docs/zh_CN/Development/EventAPI/PlayerEvents.md b/docs/zh_CN/Development/EventAPI/PlayerEvents.md
--- a/docs/zh_CN/Development/EventAPI/PlayerEvents.md
+++ b/docs/zh_CN/Development/EventAPI/PlayerEvents.md
@@ -348,7 +348,7 @@
 
 <br>
 
-#### `"onPlaceBlock"` - 玩家放置方块
+#### `"onPlaceBlock"` - 玩家尝试放置方块
 
 - 监听函数原型
   `function(player,block)`
@@ -357,10 +357,27 @@
     放置方块的玩家对象
 
   - block : `Block`  
-    被放置的方块对象
+    将要放置的方块对象
 
 - 拦截事件：函数返回`false`
 
+> **注意** 当玩家尝试放置方块时，该事件将持续被触发。
+
+<br>
+
+#### `"afterPlaceBlock"` - 玩家放置方块
+
+- 监听函数原型
+  `function(player,block)`
+- 参数：
+  - player : `Player`  
+    放置方块的玩家对象
+
+  - block : `Block`  
+    被放置的方块对象
+
+- 拦截事件：不可以拦截
+
 <br>
 
 #### `"onOpenContainer"` - 玩家打开容器方块
@@ -458,7 +475,7 @@
   `function(player,pos)`
 - 参数：
   - player : `Player`  
-    使用重生锚的玩家指针
+    使用重生锚的玩家对象
   - pos : `IntPos`  
     被使用的重生锚的位置
 - 拦截事件：函数返回`false`
@@ -476,3 +493,28 @@
 
 注：此事件非常强力，甚至可以拦截打开背包。
 
+<br>
+
+#### `"onExperienceAdd"` - 玩家获得经验
+
+- 监听函数原型
+  `function(player,exp)`
+- 参数：
+  - player : `Player`  
+    获得经验的玩家对象
+  - exp : `Integer`
+    获得的经验值
+- 拦截事件：函数返回`false`
+
+<br>
+
+#### `"onBedEnter"` - 玩家上床
+
+- 监听函数原型
+  `function(player,pos)`
+- 参数：
+  - player : `Player`  
+    上床的玩家对象
+  - pos : `IntPos`  
+    床的位置
+- 拦截事件：函数返回`false`
diff --git a/docs/zh_CN/Development/GameAPI/Block.md b/docs/zh_CN/Development/GameAPI/Block.md
--- a/docs/zh_CN/Development/GameAPI/Block.md
+++ b/docs/zh_CN/Development/GameAPI/Block.md
@@ -49,6 +49,18 @@
 
 每一个方块对象都包含一些可以执行的成员函数（成员方法）。对于某个特定的方块对象`bl`，可以通过以下这些函数对这个方块进行一些操作
 
+#### 破坏方块
+
+`bl.destroy(drop)`
+
+- 参数：
+  - drop : `Boolen`  
+    是否生成掉落物
+- 返回值：是否成功破坏
+- 返回值类型：`Boolen`
+
+<br>
+
 #### 获取方块对应的NBT对象
 
 `bl.getNbt()`
diff --git a/docs/zh_CN/Development/GameAPI/Device.md b/docs/zh_CN/Development/GameAPI/Device.md
--- a/docs/zh_CN/Development/GameAPI/Device.md
+++ b/docs/zh_CN/Development/GameAPI/Device.md
@@ -24,7 +24,10 @@
 | dv.ip            | 玩家设备的IP地址             | `String`  |
 | dv.avgPing       | 玩家的平均网络延迟时间（ms） | `Integer` |
 | dv.avgPacketLoss | 玩家的平均网络丢包率（%）    | `Float`   |
+| dv.lastPing      | 玩家的网络延迟时间（ms）     | `Integer` |
+| dv.lastPacketLoss| 玩家的网络丢包率（%）        | `Float`   |
 | dv.os            | 玩家设备的操作系统类型       | `String`  |
+| dv.serverAddress | 玩家连接的地址              | `String`  |
 | dv.clientId      | 玩家客户端的识别码ID         | `String`  |
 
 这些对象属性都是只读的，无法被修改 
@@ -33,18 +36,18 @@
 
 | dv.os返回字符串 | 玩家设备的操作系统    |
 | --------------- | --------------------- |
-| `Android`       | 手机安卓Android       |
-| `iOS`           | 手机苹果iOS           |
-| `OSX`           | 电脑苹果OSX           |
-| `Amazon`        | Amazon                |
-| `GearVR`        | GearVR                |
-| `Hololens`      | Hololens              |
-| `Windows10`     | 电脑Windows10         |
-| `Win32`         | 电脑Win32（教育版？） |
-| `TVOS`          | TVOS                  |
-| `PlayStation`   | 主机PlayStation       |
-| `Nintendo`      | 主机Nintendo          |
-| `Xbox`          | 主机Xbox              |
-| `WindowsPhone`  | 手机Windows Phone     |
+| `Android`       | 手机谷歌Android       |
+| `iOS`           | 手机苹果iOS/平板iPadOS           |
+| `OSX`           | 电脑苹果macOS           |
+| `Amazon`        | 平板/电视亚马逊FireOS                |
+| `GearVR`        | 头显三星GearVR                |
+| `Hololens`      | 头显微软HoloLens              |
+| `Windows10`     | 电脑微软Windows         |
+| `Win32`         | 电脑微软Win32（教育版？） |
+| `TVOS`          | 机顶盒苹果tvOS                  |
+| `PlayStation`   | 主机索尼PlayStation       |
+| `Nintendo`      | 掌机任天堂Switch          |
+| `Xbox`          | 主机微软Xbox              |
+| `WindowsPhone`  | 手机微软Windows Mobile     |
 | `Unknown`       | 未知系统              |
 
diff --git a/docs/zh_CN/Development/GameAPI/Player.md b/docs/zh_CN/Development/GameAPI/Player.md
--- a/docs/zh_CN/Development/GameAPI/Player.md
+++ b/docs/zh_CN/Development/GameAPI/Player.md
@@ -46,6 +46,7 @@
 | pl.name      | 玩家名                      | `String`         |
 | pl.pos       | 玩家所在坐标                | `FloatPos`       |
 | pl.blockPos  | 玩家所在的方块坐标          | `IntPos`         |
+| pl.lastDeathPos  | 玩家上次死亡的坐标 | `IntPos`    |
 | pl.realName  | 玩家的真实名字              | `String`         |
 | pl.xuid      | 玩家Xuid字符串              | `String`         |
 | pl.uuid      | 玩家Uuid字符串              | `String`         |
@@ -60,6 +61,7 @@
 | pl.direction | 玩家当前朝向                | `DirectionAngle` |
 | pl.uniqueId  | 玩家（实体的）唯一标识符    | `String`         |
 | pl.langCode  | 玩家设置的语言的标识符(形如zh_CN) | `String`    |
+| pl.isLoading  | 玩家是否正在加载 | `Boolean`    |
 
 这些对象属性都是只读的，无法被修改。其中：
 
@@ -88,13 +90,17 @@
 - 返回值：玩家是否为OP
 - 返回值类型：`Boolean`  
 
-```clike
-[Js]
-//对于一个玩家对象pl
-var open = pl.isOP();
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var open = pl.isOP();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    open = pl:isOP()
+    ```
 
 #### 断开玩家连接  
 
@@ -108,13 +114,17 @@ var open = pl.isOP();
 - 返回值：是否成功断开连接
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.kick();
-[Lua]
-pl:kick()
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.kick();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:kick()
+    ```
 
 #### 发送一个文本消息给玩家  
 
@@ -141,13 +151,17 @@ pl:kick()
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.tell("Welcome back ~ ",5);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    //对于一个玩家对象pl
+    pl.tell("Welcome back ~ ", 5);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:tell("Welcome back ~ ", 5)
+    ```
 
 #### 广播一个文本消息给所有玩家  
 
@@ -172,12 +186,17 @@ pl.tell("Welcome back ~ ",5);
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-mc.broadcast("Hello everyone ~ ");
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    mc.broadcast("Hello everyone ~ ");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    mc.broadcast("Hello everyone ~ ")
+    ```
 
 #### 在屏幕上方显示消息(类似于成就完成)
 
@@ -195,12 +214,17 @@ mc.broadcast("Hello everyone ~ ");
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-pl.sendToast("Hello","everyone ~");
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.sendToast("Hello", "everyone ~");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:sendToast("Hello", "everyone ~")
+    ```
 
 #### 以某个玩家身份执行一条命令 
 
@@ -212,13 +236,17 @@ pl.sendToast("Hello","everyone ~");
 - 返回值：是否执行成功
 - 返回值类型： `Boolean`   
 
-```clike
-[Js]
-//对于一个玩家对象pl
-var open = pl.runcmd("tp ~ ~+50 ~");
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.runcmd("tp ~ ~50 ~");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:runcmd("tp ~ ~50 ~")
+    ```
 
 #### 以某个玩家身份说话
 
@@ -230,6 +258,17 @@ var open = pl.runcmd("tp ~ ~+50 ~");
 - 返回值：是否执行成功
 - 返回值类型： `Boolean`   
 
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.talkAs("Hello everyone ~ ");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:talkAs("Hello everyone ~ ")
+    ```
 
 #### 以某个玩家身份向某玩家说话
 
@@ -243,7 +282,17 @@ var open = pl.runcmd("tp ~ ~+50 ~");
 - 返回值：是否执行成功
 - 返回值类型： `Boolean`   
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.talkAs(anotherpl, "Hello ~ ");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:talkAs(anotherpl, "Hello everyone ~ ")
+    ```
 
 #### 传送玩家至指定位置  
 
@@ -256,13 +305,16 @@ var open = pl.runcmd("tp ~ ~+50 ~");
 - 返回值：是否成功传送
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl，一个坐标对象pos
-pl.teleport(pos);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    //对于一个玩家对象pl
+    pl.teleport(pos);
+    ```
+  - Lua
+    ```lua
+    pl:teleport(pos)
+    ```
 
 #### 杀死玩家  
 
@@ -271,13 +323,17 @@ pl.teleport(pos);
 - 返回值：是否成功执行
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.kill();
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.kill();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:kill()
+    ```
 
 #### 对玩家造成伤害
 
@@ -291,7 +347,17 @@ pl.kill();
 
 注意，此处造成的伤害为真实伤害，无法被盔甲等保护装备减免
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.hurt(20);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:hurt(20)
+    ```
 
 #### 使指定玩家着火
 
@@ -303,7 +369,17 @@ pl.kill();
 - 返回值：是否成功着火
 - 返回值类型：`Boolean`
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setOnFire(20);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setOnFire(20)
+    ```
 
 #### 重命名玩家  
 
@@ -315,13 +391,17 @@ pl.kill();
 - 返回值：是否重命名成功
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.rename("newname");
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.rename("Steve");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:rename("Steve")
+    ```
 
 #### 获取玩家当前站立所在的方块
 
@@ -330,7 +410,17 @@ pl.rename("newname");
 - 返回值：当前站立在的方块对象
 - 返回值类型：`Block`
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var bl = pl.getBlockStandingOn();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    bl = pl:getBlockStandingOn()
+    ```
 
 #### 获取玩家对应的设备信息对象
 
@@ -342,7 +432,17 @@ pl.rename("newname");
 设备信息对象储存了与玩家设备有关的某些信息，如设备IP地址、设备类型、网络延迟等信息。  
 关于设备信息对象的其他信息请参考 [设备信息对象 API](zh_CN/Development/GameAPI/Device.md)
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var dv = pl.getDevice();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    dv = pl:getDevice()
+    ```
 
 #### 获取玩家主手中的物品对象
 
@@ -353,7 +453,17 @@ pl.rename("newname");
 
 此处获取的物品对象为引用。也就是说，修改此处返回的物品对象，或使用其API，就相当于直接操作玩家主手中对应的物品
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var it = pl.getHand();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    it = pl:getHand()
+    ```
 
 #### 获取玩家副手的物品对象
 
@@ -364,7 +474,17 @@ pl.rename("newname");
 
 此处获取的物品对象为引用。也就是说，修改此处返回的物品对象，或使用其API，就相当于直接操作玩家副手中对应的物品
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var it = pl.getOffHand();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    it = pl:getOffHand()
+    ```
 
 #### 获取玩家物品栏的容器对象  
 
@@ -375,7 +495,17 @@ pl.rename("newname");
 
 关于容器对象的更多使用，请参考 [容器对象 API文档](zh_CN/Development/GameAPI/Container.md)
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var ct = pl.getInventory();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    ct = pl:getInventory()
+    ```
 
 #### 获取玩家盔甲栏的容器对象  
 
@@ -386,7 +516,17 @@ pl.rename("newname");
 
 关于容器对象的更多使用，请参考 [容器对象 API文档](zh_CN/Development/GameAPI/Container.md)
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var ct = pl.getArmor();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    ct = pl:getArmor()
+    ```
 
 #### 获取玩家末影箱的容器对象  
 
@@ -397,7 +537,17 @@ pl.rename("newname");
 
 关于容器对象的更多使用，请参考 [容器对象 API文档](zh_CN/Development/GameAPI/Container.md)
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var ct = pl.getEnderChest();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    ct = pl:getEnderChest()
+    ```
 
 #### 获取玩家的重生坐标  
 
@@ -406,7 +556,17 @@ pl.rename("newname");
 - 返回值：重生点坐标
 - 返回值类型：`IntPos`
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var pos = pl.getRespawnPosition();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pos = pl:getRespawnPosition()
+    ```
 
 #### 修改玩家的重生坐标  
 
@@ -419,7 +579,15 @@ pl.rename("newname");
 - 返回值：是否成功修改
 - 返回值类型：`Boolean`
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    mc.setRespawnPosition(pos);
+    ```
+  - Lua
+    ```lua
+    mc.setRespawnPosition(pos)
+    ```
 
 #### 给予玩家一个物品
 
@@ -433,7 +601,17 @@ pl.rename("newname");
 
 如果玩家物品栏已满，将返回失败
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.giveItem(item);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:giveItem(item)
+    ```
 
 #### 清除玩家背包中所有指定类型的物品
 
@@ -448,7 +626,17 @@ pl.rename("newname");
 将玩家物品栏、主手、副手、盔甲栏中所有物品的type属性与此字符串进行比较  
 如果相等，则清除此物品
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.clearItem("minecraft:dirt");
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:clearItem("minecraft:dirt")
+    ```
 
 #### 刷新玩家物品栏、盔甲栏
 
@@ -459,7 +647,17 @@ pl.rename("newname");
 
 在修改玩家物品之后，为了促使客户端生效，需要刷新玩家所有的物品
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.refreshItems();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:refreshItems()
+    ```
 
 #### 刷新玩家加载的所有区块
 
@@ -468,7 +666,17 @@ pl.rename("newname");
 - 返回值：是否成功刷新
 - 返回值类型：`Boolean`
 
-<br>
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.refreshChunks();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:refreshChunks()
+    ```
 
 #### 修改玩家操作权限  
 
@@ -489,13 +697,17 @@ pl.rename("newname");
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.setPermLevel(1);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setPermLevel(0);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setPermLevel(0)
+    ```
 
 #### 修改玩家游戏模式
 
@@ -510,31 +722,61 @@ pl.setPermLevel(1);
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.setGameMode(1);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setGameMode(0);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setGameMode(0)
+    ```
 
-#### 提高玩家经验等级 
+#### 提高玩家经验等级
 
 `pl.addLevel(count)`
 
 - 参数：
   - count : `Integer`  
-    要提升的经验等级
+    要提高的经验等级
 - 返回值：是否设置成功
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.addLevel(6);
-[Lua]
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.addLevel(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:addLevel(1)
+    ```
 
-```
+#### 降低玩家经验等级
+
+`pl.reduceLevel(count)`
+
+- 参数：
+  - count : `Integer`  
+    要降低的经验等级
+- 返回值：是否设置成功
+- 返回值类型：`Boolean`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.reduceLevel(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:reduceLevel(1)
+    ```
 
 #### 获取玩家经验等级
 
@@ -543,14 +785,39 @@ pl.addLevel(6);
 - 返回值：玩家的经验等级
 - 返回值类型：`Integer`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.getLevel();
-[Lua]
---对于一个玩家对象pl
-pl.getLevel()
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var lv = pl.getLevel();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    lv = pl:getLevel()
+    ```
+
+#### 设置玩家经验等级
+
+`pl.setLevel(count)`
+
+- 参数：
+  - count : `Integer`  
+    要设置的经验等级
+- 返回值：是否设置成功
+- 返回值类型：`Boolean`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setLevel(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setLevel(1)
+    ```
 
 #### 重置玩家经验
 
@@ -559,32 +826,99 @@ pl.getLevel()
 - 返回值：是否设置成功
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.resetLevel();
-[Lua]
---对于一个玩家对象pl
-pl:resetLevel()
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.resetLevel();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:resetLevel()
+    ```
 
-#### 获取玩家升级所需的经验值
+#### 获取玩家当前经验值
 
-`pl.getXpNeededForNextLevel()`
+`pl.getCurrentExperience()`
 
-- 返回值：玩家升级所需的经验值
+- 返回值：玩家当前经验值
 - 返回值类型：`Integer`
 
-注意，此方法在计算时会忽略超出等级的经验值
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.getCurrentExperience();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:getCurrentExperience()
+    ```
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.getXpNeededForNextLevel();
-[Lua]
---对于一个玩家对象pl
-pl.getXpNeededForNextLevel()
-```
+#### 设置玩家当前经验值
+
+`pl.setCurrentExperience(count)`
+
+- 参数：
+  - count : `Integer`  
+    要设置的经验值
+- 返回值：是否设置成功
+- 返回值类型：`Boolean`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setCurrentExperience(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setCurrentExperience(1)
+    ```
+
+#### 获取玩家总经验值
+
+`pl.getTotalExperience()`
+
+- 返回值：玩家总经验值
+- 返回值类型：`Integer`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var xp = pl.getTotalExperience();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    xp = pl:getTotalExperience()
+    ```
+
+#### 设置玩家总经验值
+
+`pl.setTotalExperience(count)`
+
+- 参数：
+  - count : `Integer`  
+    要设置的经验值
+- 返回值：是否设置成功
+- 返回值类型：`Boolean`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setTotalExperience(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setTotalExperience(1)
+    ```
 
 #### 提高玩家经验值
 
@@ -592,18 +926,64 @@ pl.getXpNeededForNextLevel()
 
 - 参数：
   - count : `Integer`
-    要提升的经验值
+    要提高的经验值
 - 返回值：是否设置成功
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.addExperience(6);
-[Lua]
---对于一个玩家对象pl
-pl:addExperience(6)
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.addExperience(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:addExperience(1)
+    ```
+
+#### 降低玩家经验值
+
+`pl.reduceExperience(count)`
+
+- 参数：
+  - count : `Integer`
+    要降低的经验值
+- 返回值：是否设置成功
+- 返回值类型：`Boolean`
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.reduceExperience(1);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:reduceExperience(1)
+    ```
+
+#### 获取玩家升级所需的经验值
+
+`pl.getXpNeededForNextLevel()`
+
+- 返回值：玩家升级所需的经验值
+- 返回值类型：`Integer`
+
+注意，此方法在计算时会忽略当前经验值
+
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    var ndxp = pl.getXpNeededForNextLevel();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    ndxp = pl:getXpNeededForNextLevel()
+    ```
 
 #### 传送玩家至指定服务器  
 
@@ -618,13 +998,17 @@ pl:addExperience(6)
 - 返回值：是否成功传送
 - 返回值类型：`Boolean` 
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.transServer("123.45.67.89",23333);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+      // 对于一个玩家对象pl
+      pl.transServer("123.45.67.89", 23333);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:transServer("123.45.67.89", 23333)
+    ```
 
 #### 使玩家客户端崩溃
 
@@ -633,14 +1017,17 @@ pl.transServer("123.45.67.89",23333);
 - 返回值：是否成功执行
 - 返回值类型：`Boolean` 
 
-```clike
-//对于一个玩家对象pl
-[Js]
-pl.crash();
-[Lua]
-pl:crash()
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.crash();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:crash()
+    ```
 
 #### 设置玩家自定义侧边栏
 
@@ -660,13 +1047,25 @@ pl:crash()
 
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.setSidebar("title",{"aaaa":3,"bbb":12,"cc":7});
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setSidebar("title", {
+        aaaa: 3,
+        bbb: 12,
+        cc: 7,
+    });
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setSidebar("title", {
+        "aaaa" = 3,
+        "bbb" = 12,
+        "cc" = 7
+    })
+    ```
 
 #### 移除玩家自定义侧边栏
 
@@ -675,13 +1074,17 @@ pl.setSidebar("title",{"aaaa":3,"bbb":12,"cc":7});
 - 返回值：是否成功移除
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.removeSidebar();
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.removeSidebar();
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:removeSidebar()
+    ```
 
 #### 设置玩家看到的自定义Boss血条  
 
@@ -699,13 +1102,17 @@ pl.removeSidebar();
 - 返回值：是否成功设置
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.setBossBar(1145141919,"Hello ~ ",80,0);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.setBossBar(1145141919, "Hello ~ ", 80, 0);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:setBossBar(1145141919, "Hello ~ ", 80, 0)
+    ```
 
 #### 移除玩家的自定义的指定Boss血条  
 
@@ -717,13 +1124,17 @@ pl.setBossBar(1145141919,"Hello ~ ",80,0);
 - 返回值：是否成功移除
 - 返回值类型：`Boolean`
 
-```clike
-[Js]
-//对于一个玩家对象pl
-pl.removeBossBar(1145141919);
-[Lua]
-
-```
+- 示例：  
+  - JS
+    ```js
+    // 对于一个玩家对象pl
+    pl.removeBossBar(1145141919);
+    ```
+  - Lua
+    ```lua
+    -- 对于一个玩家对象pl
+    pl:removeBossBar(1145141919)
+    ```
 
 #### 获取玩家对应的NBT对象
 
@@ -813,20 +1224,18 @@ pl.removeBossBar(1145141919);
 
 数组中的每一项为一个键 - 值对列表对象`Object`，Attributes对象默认含有`Base` `Current` `DefaultMax` `DefaultMin` `Max` `Min` `Name` 等几种内容 。其内容形如：
 
-```
+```js
 {
-        "Base": 0, 
-        "Current": 0, 
-        "DefaultMax": 1024, 
-        "DefaultMin": -1024, 
-        "Max": 1024, 
-        "Min": -1024, 
-        "Name": "minecraft:luck"
-}, 
+    Base: 0, 
+    Current: 0, 
+    DefaultMax: 1024, 
+    DefaultMin: -1024, 
+    Max: 1024, 
+    Min: -1024, 
+    Name: "minecraft:luck"
+}
 ```
 
-（此处使用Json格式直观地展示）
-
 <br>
 
 #### 获取玩家疾跑状态
@@ -926,8 +1335,8 @@ pl.removeBossBar(1145141919);
 
 #### 模拟破坏
 
-`sp.simulateDestory([pos,face])`
-`sp.simulateDestory([block,face])`
+`sp.simulateDestroy([pos,face])`
+`sp.simulateDestroy([block,face])`
 - 参数：
 
   - pos :`IntPos`  
@@ -1079,8 +1488,55 @@ pl.removeBossBar(1145141919);
 - 返回值：是否能到达指定位置以及导航路径，结构：{isFullPath:`Boolean`,path:`Number[3][]`}
 - 返回值类型：`Object`
 
-参考：[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetoblock)
-返回值示例：{isFullPath:false,path:[[-8,0,-3],[-7,0,-2],[-6,0,-2],[-5,0,-2],[-4,0,-1],[-3,0,-1],[-2,0,-1],[-1,0,0]]}，
+参考：[mojang-gametest docs](https://docs.microsoft.com/zh-cn/minecraft/creator/scriptapi/mojang-gametest/simulatedplayer#navigatetoblock)  
+返回值示例：
+```js
+{
+    isFullPath: false,
+    path: [
+        [
+            -8,
+            0,
+            -3
+        ],
+        [
+            -7,
+            0,
+            -2
+        ],
+        [
+            -6,
+            0,
+            -2
+        ],
+        [
+            -5,
+            0,
+            -2
+        ],
+        [
+            -4,
+            0,
+            -1
+        ],
+        [
+            -3,
+            0,
+            -1
+        ],
+        [
+            -2,
+            0,
+            -1
+        ],
+        [
+            -1,
+            0,
+            0
+        ]
+      ]
+}
+```
 此数据的目标坐标为(0,2,0)，路径终点为(-1,0,0)，所以isFullPath为false，但由于路径不为空，所以模拟玩家将会移动至(-1,0,0)坐标
 
 
diff --git a/docs/zh_CN/Development/GuiAPI/Form.md b/docs/zh_CN/Development/GuiAPI/Form.md
--- a/docs/zh_CN/Development/GuiAPI/Form.md
+++ b/docs/zh_CN/Development/GuiAPI/Form.md
@@ -12,16 +12,16 @@
 
 模式表单包含一个标题、一个文本显示框以及两个按钮
 
-`pl.sendModalForm(title,content,button1,button2,callback)`
+`pl.sendModalForm(title,content,confirmButton,cancelButton,callback)`
 
 - 参数：
   - title : `String`  
     表单标题  
   - content : `String`  
     表单内容
-  - button1 : `String`  
+  - confirmButton : `String`  
     按钮1文本的字符串  
-  - button2 : `String`  
+  - cancelButton : `String`  
     按钮2文本的字符串  
   - callback : `Function`  
     玩家点击按钮之后被调用的回调函数。  
diff --git a/docs/zh_CN/README.md b/docs/zh_CN/README.md
--- a/docs/zh_CN/README.md
+++ b/docs/zh_CN/README.md
@@ -18,7 +18,7 @@ tagline:
     <div class="row buttons-content">
         <div class="col-sm-6 btn-link"><a href="/zh_CN/Usage" class="navigator-link">🔨 加载器安装 与 使用指南</a></div>
         <div class="col-sm-6 btn-link"><a href="/zh_CN/QA" class="navigator-link">❓ 常见问题</a></div>
-        <div class="col-sm-6 btn-link"><a class="navigator-link">⛳ C++ 文档（即将推出）</a></div>
+        <div class="col-sm-6 btn-link"><a href="/zh_CN/CPP" class="navigator-link">⛳ C++ 文档</a></div>
         <div class="col-sm-6 btn-link"><a href="/zh_CN/NET" class="navigator-link">🥏 .NET 文档</a></div>
         <div class="col-sm-6 btn-link"><a href="/zh_CN/Development" class="navigator-link">🎯 JavaScript/Lua 文档</a></div>
         <div class="col-sm-6 btn-link"><a href="/zh_CN/Maintenance" class="navigator-link">🎬 参与 LiteLoaderBDS 项目开发</a></div>


Test patch:
diff --git a/Test/DBTest/DBTest/main.cpp b/Test/DBTest/DBTest/main.cpp
--- a/Test/DBTest/DBTest/main.cpp
+++ b/Test/DBTest/DBTest/main.cpp
@@ -15,10 +15,8 @@ namespace fs = std::filesystem;
 
 Logger logger("DBTest");
 
-void log_row(const Row& row)
-{
-    if (row.empty())
-    {
+void log_row(const Row& row) {
+    if (row.empty()) {
         logger.warn("Empty row!");
         return;
     }
@@ -29,27 +27,22 @@ void log_row(const Row& row)
     });
 }
 
-void log_result_set(const ResultSet& set)
-{
-    if (set.empty())
-    {
+void log_result_set(const ResultSet& set) {
+    if (set.empty()) {
         logger.warn("Empty result set!");
         return;
     }
     logger.info("ResultSet:");
     std::string line;
     auto iss = std::istringstream(set.toTableString());
-    while (getline(iss, line))
-    {
+    while (getline(iss, line)) {
         logger.info(line);
     }
 }
 
-std::pair<std::shared_ptr<char[]>, std::size_t> alloc_buf(const MYSQL_FIELD& field)
-{
+std::pair<std::shared_ptr<char[]>, std::size_t> alloc_buf(const MYSQL_FIELD& field) {
     std::size_t len = 0;
-    switch (field.type)
-    {
+    switch (field.type) {
         case MYSQL_TYPE_NULL:
             return {nullptr, 0};
         case MYSQL_TYPE_TINY:
@@ -103,8 +96,7 @@ std::pair<std::shared_ptr<char[]>, std::size_t> alloc_buf(const MYSQL_FIELD& fie
             logger.error("alloc_buf: unknown type: {}", (int)field.type);
             break;
     }
-    if (len)
-    {
+    if (len) {
         auto buffer = std::shared_ptr<char[]>(new char[len]);
 #if defined(LLDB_DEBUG_MODE)
         logger.debug("alloc_buf: Allocated! Buffer size: {}", len);
@@ -115,14 +107,12 @@ std::pair<std::shared_ptr<char[]>, std::size_t> alloc_buf(const MYSQL_FIELD& fie
 }
 
 
-struct MyStruct
-{
+struct MyStruct {
     std::string a;
     int b;
 };
 template <>
-MyStruct row_to(const Row& row)
-{
+MyStruct row_to(const Row& row) {
     MyStruct result;
     result.a = row["a"].get<std::string>();
     result.b = row["b"].get<int>();
@@ -130,8 +120,7 @@ MyStruct row_to(const Row& row)
 }
 
 
-void run_tests(SharedPointer<Session> sess)
-{
+void run_tests(SharedPointer<Session> sess) {
 #if defined(CATCH_EXCEPTION)
     try
 #endif
@@ -144,7 +133,7 @@ void run_tests(SharedPointer<Session> sess)
         sess << "INSERT INTO test VALUES(?, ?)", use(Row{"liteloader", 233333});
         sess << "INSERT INTO test VALUES(?, ?)", use("liteloader"), use(100);
         sess << "INSERT INTO test VALUES('听我说谢谢你', 128)";
-        //sess << "INSERT INTO test VALUES('$a\"', $b)", use(2147483647, "b");
+        // sess << "INSERT INTO test VALUES('$a\"', $b)", use(2147483647, "b");
         sess->prepare("INSERT INTO test VALUES(?, ?)")
             ->bind("liteloader")
             ->bind(2147483647)
@@ -187,31 +176,27 @@ void run_tests(SharedPointer<Session> sess)
         sess->prepare("SELECT * FROM test")
             ->execute()
             ->fetchAll(res1);
-        for (auto& s : res1)
-        {
+        for (auto& s : res1) {
             logger.info("- a: {}, b: {}", s.a, s.b);
         }
         Row res2;
         sess << "SELECT * FROM test WHERE a = ?"
-             << "听我说谢谢你"
-             >> res2;
+             << "听我说谢谢你" >>
+            res2;
 
         logger.info("FINALLY:");
         sess->query("SELECT * FROM test");
         sess->close();
     }
 #if defined(CATCH_EXCEPTION)
-    catch (std::exception e)
-    {
+    catch (std::exception e) {
         logger.error(e.what());
     }
 #endif
 }
 
-void test_sqlite()
-{
-    if (fs::exists("plugins/DBTest/dbs"))
-    {
+void test_sqlite() {
+    if (fs::exists("plugins/DBTest/dbs")) {
         fs::remove_all("plugins/DBTest/dbs");
     }
     fs::create_directories("plugins/DBTest/dbs");
@@ -220,12 +205,12 @@ void test_sqlite()
     Session::create("file:///plugins/DBTest/dbs/test_create_by_url.db");
 
     Session::create(DBType::SQLite)->open("file:///plugins/DBTest/dbs/test_create_by_url2.db");
-    
+
     auto s1 = Session::create(DBType::SQLite);
     s1->open("file:///plugins/DBTest/dbs/test_create_by_url3.db");
     s1->execute("CREATE TABLE IF NOT EXISTS test (a INTEGER)");
     s1->close();
-    
+
     auto sess = Session::create(DBType::SQLite);
     sess->setDebugOutput(true);
     sess->open({{"path", "plugins/DBTest/dbs/a.db"}});
@@ -239,11 +224,10 @@ constexpr const uint16_t port = 3306;
 constexpr const char* user = "root";
 constexpr const char* passwd = "root";
 constexpr const char* dbname = "lldbtest";
-void test_mysql()
-{
-    const std::string url = fmt::format("mysql://{}:{}@{}:{}/", 
-                            user, passwd, host, port);
-    
+void test_mysql() {
+    const std::string url = fmt::format("mysql://{}:{}@{}:{}/",
+                                        user, passwd, host, port);
+
     auto s1 = Session::create(url); // Test url
     s1->execute("CREATE DATABASE IF NOT EXISTS " + std::string(dbname));
     s1->close();
@@ -253,16 +237,13 @@ void test_mysql()
     run_tests(sess);
 }
 
-#define CHKRES_STMT(x) \
-    if (res) \
-    { \
+#define CHKRES_STMT(x)                                                      \
+    if (res) {                                                              \
         logger.error("MySQL CAPI Test: {}: {}", x, mysql_stmt_error(stmt)); \
-        return; \
+        return;                                                             \
     }
-void test_mysql_capi()
-{
-    struct Receiver
-    {
+void test_mysql_capi() {
+    struct Receiver {
         std::shared_ptr<char[]> buffer;
         unsigned long length = 0;
         bool is_null = false;
@@ -272,8 +253,7 @@ void test_mysql_capi()
     MYSQL* conn = nullptr;
     MYSQL_STMT* stmt = nullptr;
     conn = mysql_init(NULL);
-    if (!mysql_real_connect(conn, host, user, passwd, dbname, port, NULL, NULL))
-    {
+    if (!mysql_real_connect(conn, host, user, passwd, dbname, port, NULL, NULL)) {
         logger.error("MySQL CAPI Test: Error when connecting: {}", mysql_error(conn));
         return;
     }
@@ -282,20 +262,17 @@ void test_mysql_capi()
     int res = mysql_stmt_prepare(stmt, q1, strlen(q1));
     CHKRES_STMT("Error when preparing Query 1");
     res = mysql_stmt_execute(stmt);
-    if (res)
-    {
+    if (res) {
         logger.error("MySQL CAPI Test: Error when executing Query 1: {}", mysql_stmt_error(stmt));
         mysql_rollback(conn);
         return;
     }
     MYSQL_RES* metadata = mysql_stmt_result_metadata(stmt);
-    if (mysql_stmt_errno(stmt) && !metadata)
-    {
+    if (mysql_stmt_errno(stmt) && !metadata) {
         logger.error("MySQL CAPI Test: Failed to get result metadata: {}", mysql_stmt_error(stmt));
         return;
     }
-    if (!metadata)
-    {
+    if (!metadata) {
         logger.error("MySQL CAPI Test: No result metadata");
         return;
     }
@@ -307,8 +284,7 @@ void test_mysql_capi()
     logger.info("MySQL CAPI Test: mysql_num_fields: {}", num);
     auto fields = mysql_fetch_fields(metadata);
     MYSQL_BIND bind[2];
-    for (auto i = 0U; i < num; i++)
-    {
+    for (auto i = 0U; i < num; ++i) {
         logger.info("MySQL CAPI Test: Field name at {} is {}", i, fields[i].name);
         bind[i].length = &recs[i].length;
         bind[i].is_null = &recs[i].is_null;
@@ -323,12 +299,12 @@ void test_mysql_capi()
     }
     res = mysql_stmt_bind_result(stmt, bind);
     CHKRES_STMT("Error when binding result");
-    while (true)
-    {
+    while (true) {
         res = mysql_stmt_fetch(stmt);
-        if (res == MYSQL_NO_DATA) break;
+        if (res == MYSQL_NO_DATA)
+            break;
         CHKRES_STMT("Error when fetching");
-        //std::string a(recs[0].buffer.get());
+        // std::string a(recs[0].buffer.get());
         logger.debug("Fetched length: {} {}", recs[0].length, recs[1].length);
     }
     auto sess = Session::create(DBType::MySQL, host, port, user, passwd, dbname);
@@ -336,18 +312,15 @@ void test_mysql_capi()
     sess << q1, into(set);
 }
 
-void test_main()
-{
+void test_main() {
     logger.info("DBTest loaded!");
     test_sqlite();
     test_mysql();
-    //test_mysql_capi();
+    // test_mysql_capi();
 }
 
-BOOL WINAPI DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID)
-{
-    switch (ul_reason_for_call)
-    {
+BOOL WINAPI DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID) {
+    switch (ul_reason_for_call) {
         case DLL_PROCESS_ATTACH:
 #if defined(CATCH_EXCEPTION)
             try
@@ -357,8 +330,7 @@ BOOL WINAPI DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID)
                 break;
             }
 #if defined(CATCH_EXCEPTION)
-            catch (std::exception e)
-            {
+            catch (std::exception e) {
                 logger.error(e.what());
             }
 #endif
diff --git a/Test/UnitTest.js b/Test/UnitTest.js
--- a/Test/UnitTest.js
+++ b/Test/UnitTest.js
@@ -2,160 +2,160 @@ const PLUGIN_DIR = "./plugins/UnitTest/";
 
 // Class Ll
 const ll_test = {
-    run: function() {
-		ll.registerPlugin("UnitTest", "LiteLoader Script Engine unit test", [0, 0, 1], {"Author": "LiteLDev"});
-		let pluginInfo = ll.getPluginInfo("UnitTest");
-		logger.info("ll_test: run: pluginInfo: ", pluginInfo);
-	}
+    run: function () {
+        ll.registerPlugin("UnitTest", "LiteLoader Script Engine unit test", [0, 0, 1], { "Author": "LiteLDev" });
+        let pluginInfo = ll.getPluginInfo("UnitTest");
+        logger.info("ll_test: run: pluginInfo: ", pluginInfo);
+    }
 };
 // Class File
 const file_test = {
-	text_file: PLUGIN_DIR + "file_test_write.txt",
-	binary_file: PLUGIN_DIR + "file_test_write.bin",
-	run: function() {
-		// mkdir
-		file.mkdir(PLUGIN_DIR);
-		this.write_sync();
-	},
-	write_sync: function() {
-		file.writeTo(this.text_file, "bbbbbbbb") // 8 * b
-		let file1 = new File(this.text_file, file.WriteMode);
-		file1.writeSync("aaaaa"); // 5 * a
-		file1.close();
-		logger.info("file_test: write_sync: Writing text done.");
-		let file2 = new File(this.binary_file, file.WriteMode, true);
-		let bytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
-		file2.writeSync(bytes);
-		file2.close();
-	}
+    text_file: PLUGIN_DIR + "file_test_write.txt",
+    binary_file: PLUGIN_DIR + "file_test_write.bin",
+    run: function () {
+        // mkdir
+        file.mkdir(PLUGIN_DIR);
+        this.write_sync();
+    },
+    write_sync: function () {
+        file.writeTo(this.text_file, "bbbbbbbb") // 8 * b
+        let file1 = new File(this.text_file, file.WriteMode);
+        file1.writeSync("aaaaa"); // 5 * a
+        file1.close();
+        logger.info("file_test: write_sync: Writing text done.");
+        let file2 = new File(this.binary_file, file.WriteMode, true);
+        let bytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+        file2.writeSync(bytes);
+        file2.close();
+    }
 }
 // Class HttpServer
 const http_server_test = {
-	listen_address: "127.0.0.1",
-	listen_port: 23333,
-	server: null,
-	run: function() {
-		this.server = new HttpServer();
-		this.server.onGet("/hello(.+)", (req, resp) => {
-			logger.info("http_server_test: run: onGet: Received a request from ", req.remoteAddr, 
-						':', req.remotePort, " for ", req.path);
-			resp.write("<html><body>")
-				.write("<h1>It works!</h1>")
-				.write("<br/>")
-				.write("<p>Request Headers: ", JSON.stringify(req.headers, null, 4), "</p>")
-				.write("<p>Request Body: ", req.body, "</p>")
-				.write("<p>Your Address: ", req.remoteAddr, ':', req.remotePort, "</p>")
-				.write("<p>HTTP Version: ", req.version, "</p>")
-				.write("<p>Method: ", req.method, "</p>")
-				.write("<p>Path: ", req.path, "</p>")
-				.write("<p>Parsed Query: ", JSON.stringify(req.query, null, 4), "</p>")
-				.write("<p>Path Regex Matches: ", JSON.stringify(req.matches), "</p>")
-				.write("</body></html>")
-			resp.status = 200;
-			resp.reason = "OK";
-			resp.setHeader("Content-Type", "text/html");
-		}).onGet("/404", (req, resp) => {
-			resp.status = 404;
-			resp.reason = "Not Found";
-			resp.write("Not Found");
-		}).onGet("/test-redirect", (req, resp) => {
-			// https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections
-			resp.status = 301;
-			resp.reason = "Moved Permanently";
-			resp.setHeader("Location", "https://github.com");
-		}).onGet("/(.+)", (req, resp) => {
-			resp.write("Hello World! ", req.matches);
-		}).onPreRouting((req, resp) => {
-			logger.info("http_server_test: run: onPreRouting: resp.body.length: ", resp.body.length);
-			if (req.path == "/test-prerouting") {
-				resp.body = "Hello World!";
-				resp.status = 200;
-				resp.reason = "OK";
-				return false;
-			}
-		}).onPostRouting((req, resp) => {
-			logger.info("http_server_test: run: onPostRouting: resp.body.length: ", resp.body.length);
-		}).onError((req, resp) => {
-			resp.write("\nonError called");
-		}).listen(this.listen_address, this.listen_port);
-		logger.info("http_server_test: run: Server listening on " + this.listen_address + ":" + this.listen_port);
-	},
-	stop: function() {
-		this.server.stop();
-		logger.info("http_server_test: stop: Server stopped");
-	},
-	command: {
-		subcmd_name: "http_server",
-		register: function(cmd) {
-			cmd.setEnum("http_server_action_stop", ["stop"]);
-			cmd.mandatory("http_server_action", ParamType.Enum, "http_server_action_stop");
-			cmd.overload(["cmd", "http_server_action_stop"]);
-		},
-		handler: function(_cmd, _ori, _outp, res) {
-			if (res["http_server_action"] == "stop") {
-				http_server_test.stop();
-			}
-		}
-	}
+    listen_address: "127.0.0.1",
+    listen_port: 23333,
+    server: null,
+    run: function () {
+        this.server = new HttpServer();
+        this.server.onGet("/hello(.+)", (req, resp) => {
+            logger.info("http_server_test: run: onGet: Received a request from ", req.remoteAddr,
+                ':', req.remotePort, " for ", req.path);
+            resp.write("<html><body>")
+                .write("<h1>It works!</h1>")
+                .write("<br/>")
+                .write("<p>Request Headers: ", JSON.stringify(req.headers, null, 4), "</p>")
+                .write("<p>Request Body: ", req.body, "</p>")
+                .write("<p>Your Address: ", req.remoteAddr, ':', req.remotePort, "</p>")
+                .write("<p>HTTP Version: ", req.version, "</p>")
+                .write("<p>Method: ", req.method, "</p>")
+                .write("<p>Path: ", req.path, "</p>")
+                .write("<p>Parsed Query: ", JSON.stringify(req.query, null, 4), "</p>")
+                .write("<p>Path Regex Matches: ", JSON.stringify(req.matches), "</p>")
+                .write("</body></html>")
+            resp.status = 200;
+            resp.reason = "OK";
+            resp.setHeader("Content-Type", "text/html");
+        }).onGet("/404", (req, resp) => {
+            resp.status = 404;
+            resp.reason = "Not Found";
+            resp.write("Not Found");
+        }).onGet("/test-redirect", (req, resp) => {
+            // https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections
+            resp.status = 301;
+            resp.reason = "Moved Permanently";
+            resp.setHeader("Location", "https://github.com");
+        }).onGet("/(.+)", (req, resp) => {
+            resp.write("Hello World! ", req.matches);
+        }).onPreRouting((req, resp) => {
+            logger.info("http_server_test: run: onPreRouting: resp.body.length: ", resp.body.length);
+            if (req.path == "/test-prerouting") {
+                resp.body = "Hello World!";
+                resp.status = 200;
+                resp.reason = "OK";
+                return false;
+            }
+        }).onPostRouting((req, resp) => {
+            logger.info("http_server_test: run: onPostRouting: resp.body.length: ", resp.body.length);
+        }).onError((req, resp) => {
+            resp.write("\nonError called");
+        }).listen(this.listen_address, this.listen_port);
+        logger.info("http_server_test: run: Server listening on " + this.listen_address + ":" + this.listen_port);
+    },
+    stop: function () {
+        this.server.stop();
+        logger.info("http_server_test: stop: Server stopped");
+    },
+    command: {
+        subcmd_name: "http_server",
+        register: function (cmd) {
+            cmd.setEnum("http_server_action_stop", ["stop"]);
+            cmd.mandatory("http_server_action", ParamType.Enum, "http_server_action_stop");
+            cmd.overload(["cmd", "http_server_action_stop"]);
+        },
+        handler: function (_cmd, _ori, _outp, res) {
+            if (res["http_server_action"] == "stop") {
+                http_server_test.stop();
+            }
+        }
+    }
 }
 // Class JsonConfigFile
 const json_config_file_test = {
-	file: PLUGIN_DIR + "json_config_file_test.json",
-	run: function() {
-		let config = new JsonConfigFile(this.file);
-		config.init("test1", "test");
-		config.init("test2", [1145141919810, "test2"]);
-		config.init("test3", 2333333333);
-		config.init("test4", {test: "test"});
-		logger.info("json_config_file_test: run: test1: ", config.get("test1"));
-		logger.info("json_config_file_test: run: test2: ", config.get("test2"));
-		logger.info("json_config_file_test: run: test3: ", config.get("test3"));
-		logger.info("json_config_file_test: run: test4: ", config.get("test4"));
-	}
+    file: PLUGIN_DIR + "json_config_file_test.json",
+    run: function () {
+        let config = new JsonConfigFile(this.file);
+        config.init("test1", "test");
+        config.init("test2", [1145141919810, "test2"]);
+        config.init("test3", 2333333333);
+        config.init("test4", { test: "test" });
+        logger.info("json_config_file_test: run: test1: ", config.get("test1"));
+        logger.info("json_config_file_test: run: test2: ", config.get("test2"));
+        logger.info("json_config_file_test: run: test3: ", config.get("test3"));
+        logger.info("json_config_file_test: run: test4: ", config.get("test4"));
+    }
 }
 
 ///////////////////////////////////// CLASSES //////////////////////////////////////
 const CLASSES = [
-	ll_test,
-	file_test,
-	http_server_test,
-	json_config_file_test
+    ll_test,
+    file_test,
+    http_server_test,
+    json_config_file_test
 ];
 
 ///////////////////////////////// UNIT TEST COMMAND /////////////////////////////////
 function RegisterUnitTestCommand() {
-	let cmd = mc.newCommand("unit_test", "UnitTest command", PermType.GameMasters, 0x80, "utest");
-	let subcmds = [];
-	let handlers = {};
-	CLASSES.forEach(clazz => {
-		if (clazz["command"] != null) {
-			subcmds.push(clazz.command.subcmd_name);
-			handlers[clazz.command.subcmd_name] = clazz.command.handler;
-		}
-	});
-	cmd.setEnum("subcmds", subcmds);
-	cmd.mandatory("cmd", ParamType.Enum, "subcmds");
-	cmd.overload(["cmd"]);
-	CLASSES.forEach(clazz => {
-		if (clazz["command"] != null) {
-			clazz.command.register(cmd);
-		}
-	});
-	cmd.setCallback(function(cmd, ori, outp, res) {
-		if (res.cmd != null) {
-			let handler = handlers[res.cmd];
-			if (handler != null) {
-				handler(cmd, ori, outp, res);
-			}
-		}
-	});
-	cmd.setup();
+    let cmd = mc.newCommand("unit_test", "UnitTest command", PermType.GameMasters, 0x80, "utest");
+    let subcmds = [];
+    let handlers = {};
+    CLASSES.forEach(clazz => {
+        if (clazz["command"] != null) {
+            subcmds.push(clazz.command.subcmd_name);
+            handlers[clazz.command.subcmd_name] = clazz.command.handler;
+        }
+    });
+    cmd.setEnum("subcmds", subcmds);
+    cmd.mandatory("cmd", ParamType.Enum, "subcmds");
+    cmd.overload(["cmd"]);
+    CLASSES.forEach(clazz => {
+        if (clazz["command"] != null) {
+            clazz.command.register(cmd);
+        }
+    });
+    cmd.setCallback(function (cmd, ori, outp, res) {
+        if (res.cmd != null) {
+            let handler = handlers[res.cmd];
+            if (handler != null) {
+                handler(cmd, ori, outp, res);
+            }
+        }
+    });
+    cmd.setup();
 }
 
 
 function init() {
-	logger.setTitle("UnitTest");
-	RegisterUnitTestCommand();
+    logger.setTitle("UnitTest");
+    RegisterUnitTestCommand();
 }
 init();
 ll_test.run();