Last active
August 29, 2015 14:25
-
-
Save ranisalt/514e73a1a06f83523b97 to your computer and use it in GitHub Desktop.
Move bug report to Lua
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From d71d1eaa007b6f6d552eb7566572ce52f6ad1bc8 Mon Sep 17 00:00:00 2001 | |
From: Ranieri Althoff <[email protected]> | |
Date: Wed, 15 Jul 2015 15:41:11 -0300 | |
Subject: [PATCH] Move bug report to Lua | |
--- | |
data/creaturescripts/creaturescripts.xml | 1 + | |
data/creaturescripts/scripts/report.lua | 26 +++++++++++++++++++++ | |
src/creatureevent.cpp | 40 ++++++++++++++++++++++++++++++++ | |
src/creatureevent.h | 3 +++ | |
src/game.cpp | 22 ++---------------- | |
src/luascript.cpp | 5 ++++ | |
6 files changed, 77 insertions(+), 20 deletions(-) | |
create mode 100644 data/creaturescripts/scripts/report.lua | |
diff --git a/data/creaturescripts/creaturescripts.xml b/data/creaturescripts/creaturescripts.xml | |
index a5e7fd0..bd53546 100644 | |
--- a/data/creaturescripts/creaturescripts.xml | |
+++ b/data/creaturescripts/creaturescripts.xml | |
@@ -6,5 +6,6 @@ | |
<event type="login" name="RegenerateStamina" script="regeneratestamina.lua" /> | |
<event type="death" name="PlayerDeath" script="playerdeath.lua" /> | |
<event type="death" name="DropLoot" script="droploot.lua" /> | |
+ <event type="report" name="PlayerReport" script="report.lua" /> | |
<event type="extendedopcode" name="ExtendedOpcode" script="extendedopcode.lua" /> | |
</creaturescripts> | |
diff --git a/data/creaturescripts/scripts/report.lua b/data/creaturescripts/scripts/report.lua | |
new file mode 100644 | |
index 0000000..27ced5c | |
--- /dev/null | |
+++ b/data/creaturescripts/scripts/report.lua | |
@@ -0,0 +1,26 @@ | |
+function onReport(player, message, position, category) | |
+ if player:getAccountType() == ACCOUNT_TYPE_NORMAL then | |
+ return false | |
+ end | |
+ | |
+ local name, playerPos = player:getName(), player:getPosition() | |
+ local file = io.open("data/reports/" .. name .. " report.txt", "a") | |
+ | |
+ if file == nil then | |
+ player:sendTextMessage(MESSAGE_EVENT_DEFAULT, "There was an error when processing your report, please contact a gamemaster.") | |
+ return true | |
+ end | |
+ | |
+ io.output(file) | |
+ io.write("------------------------------\n") | |
+ io.write("Name: " .. name) | |
+ if category == BUG_CATEGORY_MAP then | |
+ io.write(" [Map position: " .. position.x .. ", " .. position.y .. ", " .. position.z .. "]") | |
+ end | |
+ io.write(" [Player position: " .. playerPos.x .. ", " .. playerPos.y .. ", " .. playerPos.z .. "]\n") | |
+ io.write("Comment: " .. message .. "\n") | |
+ io.close(file) | |
+ | |
+ player:sendTextMessage(MESSAGE_EVENT_DEFAULT, "Your report has been sent to " .. configManager.getString(configKeys.SERVER_NAME) .. ".") | |
+ return true | |
+end | |
diff --git a/src/creatureevent.cpp b/src/creatureevent.cpp | |
index 4bb1492..e40a713 100644 | |
--- a/src/creatureevent.cpp | |
+++ b/src/creatureevent.cpp | |
@@ -139,6 +139,17 @@ bool CreatureEvents::playerAdvance(Player* player, skills_t skill, uint32_t oldL | |
return true; | |
} | |
+bool CreatureEvents::playerReport(Player* player, const std::string& message, | |
+ const Position& position, uint8_t category) const | |
+{ | |
+ for (const auto& it : m_creatureEvents) { | |
+ if (it.second->getEventType() == CREATURE_EVENT_REPORT) { | |
+ it.second->executeOnReport(player, message, position, category); | |
+ } | |
+ } | |
+ return true; | |
+} | |
+ | |
///////////////////////////////////// | |
CreatureEvent::CreatureEvent(LuaScriptInterface* _interface) : | |
@@ -189,6 +200,8 @@ bool CreatureEvent::configureEvent(const pugi::xml_node& node) | |
m_type = CREATURE_EVENT_HEALTHCHANGE; | |
} else if (tmpStr == "manachange") { | |
m_type = CREATURE_EVENT_MANACHANGE; | |
+ } else if (tmpStr == "report") { | |
+ m_type = CREATURE_EVENT_REPORT; | |
} else if (tmpStr == "extendedopcode") { | |
m_type = CREATURE_EVENT_EXTENDED_OPCODE; | |
} else { | |
@@ -237,6 +250,9 @@ std::string CreatureEvent::getScriptEventName() const | |
case CREATURE_EVENT_MANACHANGE: | |
return "onManaChange"; | |
+ case CREATURE_EVENT_REPORT: | |
+ return "onReport"; | |
+ | |
case CREATURE_EVENT_EXTENDED_OPCODE: | |
return "onExtendedOpcode"; | |
@@ -563,6 +579,30 @@ void CreatureEvent::executeManaChange(Creature* creature, Creature* attacker, in | |
m_scriptInterface->resetScriptEnv(); | |
} | |
+void CreatureEvent::executeOnReport(Player* player, const std::string& message, | |
+ const Position& position, uint8_t category) | |
+{ | |
+ //onReport(player, message, position, category) | |
+ if (!m_scriptInterface->reserveScriptEnv()) { | |
+ std::cout << "[Error - CreatureEvent::executeOnReport] Call stack overflow" << std::endl; | |
+ return; | |
+ } | |
+ | |
+ ScriptEnvironment* env = m_scriptInterface->getScriptEnv(); | |
+ env->setScriptId(m_scriptId, m_scriptInterface); | |
+ | |
+ lua_State* L = m_scriptInterface->getLuaState(); | |
+ m_scriptInterface->pushFunction(m_scriptId); | |
+ | |
+ LuaScriptInterface::pushUserdata<Player>(L, player); | |
+ LuaScriptInterface::setMetatable(L, -1, "Player"); | |
+ LuaScriptInterface::pushString(L, message); | |
+ LuaScriptInterface::pushPosition(L, position); | |
+ lua_pushnumber(L, category); | |
+ | |
+ m_scriptInterface->callVoidFunction(4); | |
+} | |
+ | |
void CreatureEvent::executeExtendedOpcode(Player* player, uint8_t opcode, const std::string& buffer) | |
{ | |
//onExtendedOpcode(player, opcode, buffer) | |
diff --git a/src/creatureevent.h b/src/creatureevent.h | |
index 0d2489b..c5abc39 100644 | |
--- a/src/creatureevent.h | |
+++ b/src/creatureevent.h | |
@@ -37,6 +37,7 @@ enum CreatureEventType_t { | |
CREATURE_EVENT_TEXTEDIT, | |
CREATURE_EVENT_HEALTHCHANGE, | |
CREATURE_EVENT_MANACHANGE, | |
+ CREATURE_EVENT_REPORT, | |
CREATURE_EVENT_EXTENDED_OPCODE, // otclient additional network opcodes | |
}; | |
@@ -56,6 +57,7 @@ class CreatureEvents final : public BaseEvents | |
bool playerLogin(Player* player) const; | |
bool playerLogout(Player* player) const; | |
bool playerAdvance(Player* player, skills_t, uint32_t, uint32_t); | |
+ bool playerReport(Player* player, const std::string&, const Position&, uint8_t) const; | |
CreatureEvent* getEventByName(const std::string& name, bool forceLoaded = true); | |
@@ -105,6 +107,7 @@ class CreatureEvent final : public Event | |
bool executeTextEdit(Player* player, Item* item, const std::string& text); | |
void executeHealthChange(Creature* creature, Creature* attacker, CombatDamage& damage); | |
void executeManaChange(Creature* creature, Creature* attacker, int32_t& manaChange, CombatOrigin origin); | |
+ void executeOnReport(Player* player, const std::string& message, const Position& position, uint8_t category); | |
void executeExtendedOpcode(Player* player, uint8_t opcode, const std::string& buffer); | |
// | |
diff --git a/src/game.cpp b/src/game.cpp | |
index 5f0a26f..c605194 100644 | |
--- a/src/game.cpp | |
+++ b/src/game.cpp | |
@@ -59,6 +59,7 @@ extern TalkActions* g_talkActions; | |
extern Spells* g_spells; | |
extern Vocations g_vocations; | |
extern GlobalEvents* g_globalEvents; | |
+extern CreatureEvents* g_creatureEvents; | |
extern Events* g_events; | |
Game::Game() : | |
@@ -4848,26 +4849,7 @@ void Game::playerReportBug(uint32_t playerId, const std::string& message, const | |
return; | |
} | |
- if (player->getAccountType() == ACCOUNT_TYPE_NORMAL) { | |
- return; | |
- } | |
- | |
- std::string fileName = "data/reports/" + player->getName() + " report.txt"; | |
- FILE* file = fopen(fileName.c_str(), "a"); | |
- if (!file) { | |
- player->sendTextMessage(MESSAGE_EVENT_DEFAULT, "There was an error when processing your report, please contact a gamemaster."); | |
- return; | |
- } | |
- | |
- const Position& playerPosition = player->getPosition(); | |
- if (category == BUG_CATEGORY_MAP) { | |
- fprintf(file, "------------------------------\nName: %s [Map Position: %u, %u, %u] [Player Position: %u, %u, %u]\nComment: %s\n", player->getName().c_str(), position.x, position.y, position.z, playerPosition.x, playerPosition.y, playerPosition.z, message.c_str()); | |
- } else { | |
- fprintf(file, "------------------------------\nName: %s [Player Position: %u, %u, %u]\nComment: %s\n", player->getName().c_str(), playerPosition.x, playerPosition.y, playerPosition.z, message.c_str()); | |
- } | |
- fclose(file); | |
- | |
- player->sendTextMessage(MESSAGE_EVENT_DEFAULT, "Your report has been sent to " + g_config.getString(ConfigManager::SERVER_NAME) + "."); | |
+ g_creatureEvents->playerReport(player, message, position, category); | |
} | |
void Game::playerDebugAssert(uint32_t playerId, const std::string& assertLine, const std::string& date, const std::string& description, const std::string& comment) | |
diff --git a/src/luascript.cpp b/src/luascript.cpp | |
index b856a3f..d9d7a8c 100644 | |
--- a/src/luascript.cpp | |
+++ b/src/luascript.cpp | |
@@ -1057,6 +1057,11 @@ void LuaScriptInterface::registerFunctions() | |
registerEnum(ACCOUNT_TYPE_GAMEMASTER) | |
registerEnum(ACCOUNT_TYPE_GOD) | |
+ registerEnum(BUG_CATEGORY_MAP) | |
+ registerEnum(BUG_CATEGORY_TYPO) | |
+ registerEnum(BUG_CATEGORY_TECHNICAL) | |
+ registerEnum(BUG_CATEGORY_OTHER) | |
+ | |
registerEnum(CALLBACK_PARAM_LEVELMAGICVALUE) | |
registerEnum(CALLBACK_PARAM_SKILLVALUE) | |
registerEnum(CALLBACK_PARAM_TARGETTILE) | |
-- | |
2.4.6 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment