From 8b43403e3a5bb9f304f3608a0fc846900ce56e72 Mon Sep 17 00:00:00 2001 From: Barinade Date: Sun, 8 Jan 2023 19:52:19 -0600 Subject: [PATCH] add lua binding to allow adding noteskin actor children at runtime this was made for an optimization to the noteskin preview but you can use it however you want --- src/Etterna/Singletons/NoteSkinManager.cpp | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Etterna/Singletons/NoteSkinManager.cpp b/src/Etterna/Singletons/NoteSkinManager.cpp index e4ca340c0c..6b552b87c4 100644 --- a/src/Etterna/Singletons/NoteSkinManager.cpp +++ b/src/Etterna/Singletons/NoteSkinManager.cpp @@ -1,5 +1,6 @@ #include "Etterna/Globals/global.h" #include "Etterna/Actor/Base/ActorUtil.h" +#include "Etterna/Actor/Base/ActorFrame.h" #include "Etterna/Models/Misc/Foreach.h" #include "Etterna/Models/Misc/Game.h" #include "Etterna/Models/Misc/GameInput.h" @@ -703,6 +704,33 @@ class LunaNoteSkinManager : public Luna FOR_NOTESKIN(GetMetricA, 2); FOR_NOTESKIN(LoadActor, 2); #undef FOR_NOTESKIN + static int AddChildActorForNoteSkin(T* p, lua_State* L) { + const std::string sOldNoteSkin = p->GetCurrentNoteSkin(); + std::string nsname = SArg(3); + if (!p->DoesNoteSkinExist(nsname)) { + luaL_error(L, "Noteskin \"%s\" does not exist.", nsname.c_str()); + } + + auto actor = Luna::check(L, 4); + + p->SetCurrentNoteSkin(nsname); + LoadActor(p, L); + p->SetCurrentNoteSkin(sOldNoteSkin); + + auto xnode = XmlFileUtil::XNodeFromTable(L); + if (xnode == nullptr) { + // XNode will warn about the error + lua_pushnil(L); + return 1; + } + + auto* result = ActorUtil::LoadFromNode(xnode, actor); + if (result != nullptr) { + actor->AddChild(result); + } + return 1; + } + static int GetNoteSkinNames(T* p, lua_State* L) { std::vector vNoteskins; @@ -742,6 +770,7 @@ class LunaNoteSkinManager : public Luna ADD_METHOD(GetMetricBForNoteSkin); ADD_METHOD(GetMetricAForNoteSkin); ADD_METHOD(LoadActorForNoteSkin); + ADD_METHOD(AddChildActorForNoteSkin); ADD_METHOD(GetNoteSkinNames); ADD_METHOD(DoesNoteSkinExist); // for the current game }