Skip to content

Instantly share code, notes, and snippets.

@ranisalt
Last active August 29, 2015 14:25
Show Gist options
  • Save ranisalt/514e73a1a06f83523b97 to your computer and use it in GitHub Desktop.
Save ranisalt/514e73a1a06f83523b97 to your computer and use it in GitHub Desktop.
Move bug report to Lua
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