Initial support for item use scripts in angelscript.
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2021-03-07 17:09:30 +01:00
parent 18cebe842a
commit 27dd8a8202
17 changed files with 405 additions and 97 deletions

View File

@@ -0,0 +1,52 @@
#ifndef PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
#define PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
#include "ContextPool.hpp"
class AngelScriptUtils {
public:
static void AngelscriptFunctionCall(asIScriptFunction* func, ContextPool* ctxPool, asIScriptObject* obj,
const ArbUt::StringView& scriptName,
const std::function<void(asIScriptContext*)>& setup,
const std::function<void(asIScriptContext*)>& onEnd) {
auto ctx = asGetActiveContext();
bool newContext = false;
if (ctx == nullptr) {
ctx = ctxPool->RequestContext();
newContext = true;
} else {
ctx->PushState();
}
ctx->Prepare(func);
ctx->SetObject(obj);
setup(ctx);
auto scriptResult = ctx->Execute();
if (scriptResult != asEXECUTION_FINISHED) {
if (scriptResult == asEXECUTION_EXCEPTION) {
std::stringstream err;
err << "Script exception in script '" << scriptName.c_str() << "', line "
<< ctx->GetExceptionLineNumber() << ". Message: '" << ctx->GetExceptionString() << "'.";
if (newContext) {
ctxPool->ReturnContextToPool(ctx);
} else {
ctx->PopState();
}
throw ArbUt::Exception(err.str());
}
if (newContext) {
ctxPool->ReturnContextToPool(ctx);
} else {
ctx->PopState();
}
THROW("Script didn't finish properly; message " << scriptResult);
}
onEnd(ctx);
if (newContext) {
ctxPool->ReturnContextToPool(ctx);
} else {
ctx->PopState();
}
}
};
#endif