#include "APIHelp.h" #include #include #include #include "ScoreboardAPI.h" #include "McAPI.h" #include "PlayerAPI.h" #include using namespace std; //////////////////// Class Definition //////////////////// ClassDefine ObjectiveClassBuilder = defineClass("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(); //////////////////// Classes //////////////////// Local ObjectiveClass::newObjective(Objective* obj) { auto newp = new ObjectiveClass(obj); return newp->getScriptObject(); } void ObjectiveClass::set(Objective* obj) { if (obj) { objname = obj->getName(); isValid = true; } } Objective* ObjectiveClass::get() { if (isValid) return ::Global->getObjective(objname); return nullptr; } Local ObjectiveClass::getName() { try { return String::newString(objname); } CATCH("Fail in getName!") } Local ObjectiveClass::getDisplayName() { try { Objective* obj = get(); if (!obj) return Local(); return String::newString(obj->getDisplayName()); } CATCH("Fail in getDisplayName!") } Local 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(); 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 ObjectiveClass::setScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 2) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) try { int score = args[1].toInt(); Local rtn; string id; if (args[0].isString()) { string id = args[0].toStr(); std::optional res = Scoreboard::setScore(objname, id, score); if (res) rtn = Number::newNumber(*res); } else if (IsInstanceOf(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(); } return rtn; } CATCH("Fail in setScore"); } Local ObjectiveClass::addScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 2) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) try { int score = args[1].toInt(); Local rtn; string id; if (args[0].isString()) { string id = args[0].toStr(); std::optional res = Scoreboard::addScore(objname, id, score); if (res) rtn = Number::newNumber(*res); } else if (IsInstanceOf(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(); } return rtn; } CATCH("Fail in addScore"); } Local ObjectiveClass::reduceScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 2) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) try { int score = args[1].toInt(); Local rtn; string id; if (args[0].isString()) { string id = args[0].toStr(); std::optional res = Scoreboard::reduceScore(objname, id, score); if (res) rtn = Number::newNumber(*res); } else if (IsInstanceOf(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(); } return rtn; } CATCH("Fail in removeScore"); } Local ObjectiveClass::deleteScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 1) try { string id; if (args[0].isString()) id = args[0].toStr(); else if (IsInstanceOf(args[0])) id = PlayerClass::extract(args[0])->getRealName(); else { LOG_WRONG_ARG_TYPE(); return Local(); } bool res = Scoreboard::removeFromObjective(objname, id); return Boolean::newBoolean(res); } CATCH("Fail in deleteScore"); } Local ObjectiveClass::getScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 1) try { int res = 0; if (args[0].isString()) res = Scoreboard::getScore(objname, args[0].toStr()); else if (IsInstanceOf(args[0])) res = Scoreboard::getScore(PlayerClass::extract(args[0]), objname); else { LOG_WRONG_ARG_TYPE(); return Local(); } return Number::newNumber(res); } CATCH("Fail in getScore"); } //////////////////// APIs //////////////////// Local 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->getDisplayObjective(slot); if (!res) return Local(); return ObjectiveClass::newObjective((Objective*)res); } CATCH("Fail in GetDisplayObjective"); } Local 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->clearDisplayObjective(slot); if (!res) return Local(); return ObjectiveClass::newObjective(res); } CATCH("Fail in ClearDisplayObjective"); } Local 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->getObjective(name); if (!res) return Local(); return ObjectiveClass::newObjective(res); } CATCH("Fail in GetScoreObjective"); } Local 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(); } CATCH("Fail in NewScoreObjective!") } Local 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->getObjective(name); if (obj) { ::Global->removeObjective(obj); return Boolean::newBoolean(true); } return Boolean::newBoolean(false); } CATCH("Fail in RemoveScoreObjective!") } Local McClass::getAllScoreObjectives(const Arguments& args) { try { Local res = Array::newArray(); auto objs = ::Global->getObjectives(); for (auto& obj : objs) { if (obj) res.add(ObjectiveClass::newObjective((Objective*)obj)); } return res; } CATCH("Fail in GetAllScoreObjectives!") }