Skip to content

Instantly share code, notes, and snippets.

@vankk
Last active November 30, 2019 11:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save vankk/9141715566c883255ad6c2c02f21e8af to your computer and use it in GitHub Desktop.
Save vankk/9141715566c883255ad6c2c02f21e8af to your computer and use it in GitHub Desktop.
Add playerOnChangeZone TFS 1.3
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