diff --git a/ScriptEngine/src/api/EntityAPI.cpp b/ScriptEngine/src/api/EntityAPI.cpp index 5ce6fa2a07..1551389bd8 100644 --- a/ScriptEngine/src/api/EntityAPI.cpp +++ b/ScriptEngine/src/api/EntityAPI.cpp @@ -118,6 +118,10 @@ ClassDefine EntityClassBuilder = .instanceFunction("getBiomeId", &EntityClass::getBiomeId) .instanceFunction("quickEvalMolangScript", &EntityClass::quickEvalMolangScript) + .instanceFunction("getAllEffects", &EntityClass::getAllEffects) + .instanceFunction("addEffect", &EntityClass::addEffect) + .instanceFunction("removeEffect", &EntityClass::removeEffect) + // For Compatibility .instanceFunction("setTag", &EntityClass::setNbt) .instanceFunction("setOnFire", &EntityClass::setOnFire) @@ -1503,6 +1507,61 @@ Local EntityClass::getBiomeName() { CATCH("Fail in getBiomeName!"); } +Local EntityClass::getAllEffects() { + try { + Actor* actor = get(); + if (!actor) { + return Local(); + } + auto effects = actor->getAllEffects(); + if (effects.size() == 0) { + return Local(); + } + Local effectList = Array::newArray(); + for (auto effect : effects) + effectList.add(Number::newNumber((int)effect.getId())); + return effectList; + } + CATCH("Fail in getAllEffects!") +} + +Local EntityClass::addEffect(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::kBoolean); + try { + Actor* actor = get(); + if (!actor) { + return Boolean::newBoolean(false); + } + unsigned int id = args[0].asNumber().toInt32(); + int tick = args[1].asNumber().toInt32(); + int level = args[2].asNumber().toInt32(); + bool showParticles = args[3].asBoolean().value(); + MobEffectInstance effect = MobEffectInstance(id, tick, level, false, showParticles, false); + actor->addEffect(effect); + return Boolean::newBoolean(true); + } + CATCH("Fail in addEffect!"); +} + +Local EntityClass::removeEffect(const Arguments& args) { + CHECK_ARGS_COUNT(args, 1); + CHECK_ARG_TYPE(args[0], ValueKind::kNumber); + try { + Actor* actor = get(); + if (!actor) { + return Boolean::newBoolean(false); + } + int id = args[0].asNumber().toInt32(); + actor->removeEffect(id); + return Boolean::newBoolean(true); + } + CATCH("Fail in removeEffect!"); +} + Local McClass::getAllEntities(const Arguments& args) { try { auto entityList = Level::getAllEntities(); diff --git a/ScriptEngine/src/api/EntityAPI.h b/ScriptEngine/src/api/EntityAPI.h index eb71846bc4..9293d30f75 100644 --- a/ScriptEngine/src/api/EntityAPI.h +++ b/ScriptEngine/src/api/EntityAPI.h @@ -111,6 +111,11 @@ class EntityClass : public ScriptClass { Local getBlockFromViewVector(const Arguments& args); Local quickEvalMolangScript(const Arguments& args); + + Local getAllEffects(); + Local addEffect(const Arguments& args); + Local removeEffect(const Arguments& args); + }; extern ClassDefine EntityClassBuilder; extern ClassDefine ActorDamageCauseBuilder; \ No newline at end of file