Last active
November 30, 2019 11:30
-
-
Save vankk/9141715566c883255ad6c2c02f21e8af to your computer and use it in GitHub Desktop.
Add playerOnChangeZone TFS 1.3
This file contains 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
diff --git a/data/events/events.xml b/data/events/events.xml | |
index febdc6e5..b930a368 100644 | |
--- a/data/events/events.xml | |
+++ b/data/events/events.xml | |
@@ -19,6 +19,7 @@ | |
<event class="Player" method="onLookInShop" enabled="0" /> | |
<event class="Player" method="onMoveItem" enabled="1" /> | |
<event class="Player" method="onItemMoved" enabled="0" /> | |
+ <event class="Player" method="onChangeZone" enabled="0" /> | |
<event class="Player" method="onMoveCreature" enabled="0" /> | |
<event class="Player" method="onReportBug" enabled="1" /> | |
<event class="Player" method="onReportRuleViolation" enabled="1" /> | |
diff --git a/data/events/scripts/player.lua b/data/events/scripts/player.lua | |
index e62fd42a..a4f97952 100644 | |
--- a/data/events/scripts/player.lua | |
+++ b/data/events/scripts/player.lua | |
@@ -118,6 +118,9 @@ end | |
function Player:onItemMoved(item, count, fromPosition, toPosition, fromCylinder, toCylinder) | |
end | |
+function Player:onChangeZone(zone) | |
+end | |
+ | |
function Player:onMoveCreature(creature, fromPosition, toPosition) | |
return true | |
end | |
diff --git a/src/events.cpp b/src/events.cpp | |
index bc7fbcd7..d3c3c19b 100644 | |
--- a/src/events.cpp | |
+++ b/src/events.cpp | |
@@ -102,6 +102,8 @@ bool Events::load() | |
info.playerOnMoveItem = event; | |
} else if (methodName == "onItemMoved") { | |
info.playerOnItemMoved = event; | |
+ } else if (methodName == "onChangeZone") { | |
+ info.playerOnChangeZone = event; | |
} else if (methodName == "onMoveCreature") { | |
info.playerOnMoveCreature = event; | |
} else if (methodName == "onReportRuleViolation") { | |
@@ -571,6 +573,32 @@ void Events::eventPlayerOnItemMoved(Player* player, Item* item, uint16_t count, | |
scriptInterface.callVoidFunction(7); | |
} | |
+void Events::eventPlayerOnChangeZone(Player* player, ZoneType_t zone) | |
+{ | |
+ // Player:onChangeZone(zone) | |
+ if (info.playerOnChangeZone == -1) { | |
+ return; | |
+ } | |
+ | |
+ if (!scriptInterface.reserveScriptEnv()) { | |
+ std::cout << "[Error - Events::eventPlayerOnChangeZone] Call stack overflow" << std::endl; | |
+ return; | |
+ } | |
+ | |
+ ScriptEnvironment* env = scriptInterface.getScriptEnv(); | |
+ env->setScriptId(info.playerOnChangeZone, &scriptInterface); | |
+ | |
+ lua_State* L = scriptInterface.getLuaState(); | |
+ scriptInterface.pushFunction(info.playerOnChangeZone); | |
+ | |
+ LuaScriptInterface::pushUserdata<Player>(L, player); | |
+ LuaScriptInterface::setMetatable(L, -1, "Player"); | |
+ | |
+ lua_pushnumber(L, zone); | |
+ | |
+ scriptInterface.callVoidFunction(2); | |
+} | |
+ | |
bool Events::eventPlayerOnMoveCreature(Player* player, Creature* creature, const Position& fromPosition, const Position& toPosition) | |
{ | |
// Player:onMoveCreature(creature, fromPosition, toPosition) or Player.onMoveCreature(self, creature, fromPosition, toPosition) | |
diff --git a/src/events.h b/src/events.h | |
index 89fbd194..7cc77bfe 100644 | |
--- a/src/events.h | |
+++ b/src/events.h | |
@@ -48,6 +48,7 @@ class Events | |
int32_t playerOnLookInShop = -1; | |
int32_t playerOnMoveItem = -1; | |
int32_t playerOnItemMoved = -1; | |
+ int32_t playerOnChangeZone = -1; | |
int32_t playerOnMoveCreature = -1; | |
int32_t playerOnReportRuleViolation = -1; | |
int32_t playerOnReportBug = -1; | |
@@ -83,6 +84,7 @@ class Events | |
bool eventPlayerOnLookInShop(Player* player, const ItemType* itemType, uint8_t count); | |
bool eventPlayerOnMoveItem(Player* player, Item* item, uint16_t count, const Position& fromPosition, const Position& toPosition, Cylinder* fromCylinder, Cylinder* toCylinder); | |
void eventPlayerOnItemMoved(Player* player, Item* item, uint16_t count, const Position& fromPosition, const Position& toPosition, Cylinder* fromCylinder, Cylinder* toCylinder); | |
+ void eventPlayerOnChangeZone(Player* player, ZoneType_t zone); | |
bool eventPlayerOnMoveCreature(Player* player, Creature* creature, const Position& fromPosition, const Position& toPosition); | |
void eventPlayerOnReportRuleViolation(Player* player, const std::string& targetName, uint8_t reportType, uint8_t reportReason, const std::string& comment, const std::string& translation); | |
bool eventPlayerOnReportBug(Player* player, const std::string& message, const Position& position, uint8_t category); | |
diff --git a/src/player.cpp b/src/player.cpp | |
index 6146bdde..e8e6bff2 100644 | |
--- a/src/player.cpp | |
+++ b/src/player.cpp | |
@@ -1101,6 +1101,7 @@ void Player::onChangeZone(ZoneType_t zone) | |
g_game.updateCreatureWalkthrough(this); | |
sendIcons(); | |
+ g_events->eventPlayerOnChangeZone(this, zone); | |
} | |
void Player::onAttackedCreatureChangeZone(ZoneType_t zone) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment