Skip to content

Commit

Permalink
add Player.onRotateItem event
Browse files Browse the repository at this point in the history
Co-Authored-By: Marcin Michalski <[email protected]>
  • Loading branch information
omarcopires and marmichalski committed Sep 27, 2023
1 parent feda3fe commit f9f0754
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 4 deletions.
1 change: 1 addition & 0 deletions data/events/events.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<event class="Player" method="onMoveCreature" enabled="0" />
<event class="Player" method="onReportBug" enabled="1" />
<event class="Player" method="onReportRuleViolation" enabled="1" />
<event class="Player" method="onRotateItem" enabled="1" />
<event class="Player" method="onTurn" enabled="0" />
<event class="Player" method="onTradeRequest" enabled="0" />
<event class="Player" method="onTradeAccept" enabled="0" />
Expand Down
8 changes: 8 additions & 0 deletions data/events/scripts/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,14 @@ function Player:onReportBug(message, position, category)
return true
end

function Player:onRotateItem(item)
local onRotateItem = EventCallback.onRotateItem
if onRotateItem then
return onRotateItem(self, item)
end
return true
end

function Player:onTurn(direction)
local onTurn = EventCallback.onTurn
if onTurn then
Expand Down
10 changes: 10 additions & 0 deletions data/scripts/eventcallbacks/player/default_onRotateItem.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
local ec = EventCallback

ec.onRotateItem = function(self, item)
local newId = item:getType():getRotateTo()
if newId ~= 0 then
item:transform(newId)
end
end

ec:register()
1 change: 1 addition & 0 deletions data/scripts/lib/event_callbacks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ ec.onMoveCreature = {}
ec.onReportRuleViolation = {}
ec.onReportBug = {}
ec.onTurn = {}
ec.onRotateItem = {}
ec.onGainExperience = {[3] = 1}
ec.onLoseExperience = {[2] = 1}
ec.onGainSkillTries = {[3] = 1}
Expand Down
29 changes: 29 additions & 0 deletions src/events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ bool Events::load()
info.playerOnReportRuleViolation = event;
} else if (methodName == "onReportBug") {
info.playerOnReportBug = event;
} else if (methodName == "onRotateItem") {
info.playerOnRotateItem = event;
} else if (methodName == "onTurn") {
info.playerOnTurn = event;
} else if (methodName == "onGainExperience") {
Expand Down Expand Up @@ -899,6 +901,33 @@ bool Events::eventPlayerOnReportBug(Player* player, const std::string& message,
return scriptInterface.callFunction(4);
}

void Events::eventPlayerOnRotateItem(Player* player, Item* item)
{
// Player:onRotateItem(item)
if (info.playerOnRotateItem == -1) {
return;
}

if (!scriptInterface.reserveScriptEnv()) {
std::cout << "[Error - Events::eventPlayerOnRotateItem] Call stack overflow" << std::endl;
return;
}

ScriptEnvironment* env = scriptInterface.getScriptEnv();
env->setScriptId(info.playerOnRotateItem, &scriptInterface);

lua_State* L = scriptInterface.getLuaState();
scriptInterface.pushFunction(info.playerOnRotateItem);

LuaScriptInterface::pushUserdata<Player>(L, player);
LuaScriptInterface::setMetatable(L, -1, "Player");

LuaScriptInterface::pushUserdata<Item>(L, item);
LuaScriptInterface::setItemMetatable(L, -1, item);

scriptInterface.callFunction(2);
}

bool Events::eventPlayerOnTurn(Player* player, Direction direction)
{
// Player:onTurn(direction) or Player.onTurn(self, direction)
Expand Down
2 changes: 2 additions & 0 deletions src/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Events
int32_t playerOnMoveCreature = -1;
int32_t playerOnReportRuleViolation = -1;
int32_t playerOnReportBug = -1;
int32_t playerOnRotateItem = -1;
int32_t playerOnTurn = -1;
int32_t playerOnTradeRequest = -1;
int32_t playerOnTradeAccept = -1;
Expand Down Expand Up @@ -108,6 +109,7 @@ class Events
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);
void eventPlayerOnRotateItem(Player* player, Item* item);
bool eventPlayerOnTurn(Player* player, Direction direction);
bool eventPlayerOnTradeRequest(Player* player, Player* target, Item* item);
bool eventPlayerOnTradeAccept(Player* player, Player* target, Item* item, Item* targetItem);
Expand Down
5 changes: 1 addition & 4 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2443,10 +2443,7 @@ void Game::playerRotateItem(uint32_t playerId, const Position& pos, uint8_t stac
podium->setDirection(static_cast<Direction>((podium->getDirection() + 1) % 4));
updatePodium(podium);
} else {
uint16_t newId = Item::items[item->getID()].rotateTo;
if (newId != 0) {
transformItem(item, newId);
}
g_events->eventPlayerOnRotateItem(player, item);
}
}

Expand Down
26 changes: 26 additions & 0 deletions src/luascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2935,13 +2935,15 @@ void LuaScriptInterface::registerFunctions()
registerMethod("ItemType", "isMagicField", LuaScriptInterface::luaItemTypeIsMagicField);
registerMethod("ItemType", "isUseable", LuaScriptInterface::luaItemTypeIsUseable);
registerMethod("ItemType", "isPickupable", LuaScriptInterface::luaItemTypeIsPickupable);
registerMethod("ItemType", "isRotatable", LuaScriptInterface::luaItemTypeIsRotatable);

registerMethod("ItemType", "getType", LuaScriptInterface::luaItemTypeGetType);
registerMethod("ItemType", "getGroup", LuaScriptInterface::luaItemTypeGetGroup);
registerMethod("ItemType", "getId", LuaScriptInterface::luaItemTypeGetId);
registerMethod("ItemType", "getClientId", LuaScriptInterface::luaItemTypeGetClientId);
registerMethod("ItemType", "getName", LuaScriptInterface::luaItemTypeGetName);
registerMethod("ItemType", "getPluralName", LuaScriptInterface::luaItemTypeGetPluralName);
registerMethod("ItemType", "getRotateTo", LuaScriptInterface::luaItemTypeGetRotateTo);
registerMethod("ItemType", "getArticle", LuaScriptInterface::luaItemTypeGetArticle);
registerMethod("ItemType", "getDescription", LuaScriptInterface::luaItemTypeGetDescription);
registerMethod("ItemType", "getSlotPosition", LuaScriptInterface::luaItemTypeGetSlotPosition);
Expand Down Expand Up @@ -12729,6 +12731,18 @@ int LuaScriptInterface::luaItemTypeIsPickupable(lua_State* L)
return 1;
}

int LuaScriptInterface::luaItemTypeIsRotatable(lua_State* L)
{
// itemType:isRotatable()
const ItemType* itemType = getUserdata<const ItemType>(L, 1);
if (itemType) {
pushBoolean(L, itemType->rotatable);
} else {
lua_pushnil(L);
}
return 1;
}

int LuaScriptInterface::luaItemTypeGetType(lua_State* L)
{
// itemType:getType()
Expand Down Expand Up @@ -12801,6 +12815,18 @@ int LuaScriptInterface::luaItemTypeGetPluralName(lua_State* L)
return 1;
}

int LuaScriptInterface::luaItemTypeGetRotateTo(lua_State* L)
{
// itemType:getRotateTo()
const ItemType* itemType = getUserdata<const ItemType>(L, 1);
if (itemType) {
lua_pushnumber(L, itemType->rotateTo);
} else {
lua_pushnil(L);
}
return 1;
}

int LuaScriptInterface::luaItemTypeGetArticle(lua_State* L)
{
// itemType:getArticle()
Expand Down
2 changes: 2 additions & 0 deletions src/luascript.h
Original file line number Diff line number Diff line change
Expand Up @@ -1203,13 +1203,15 @@ class LuaScriptInterface
static int luaItemTypeIsMagicField(lua_State* L);
static int luaItemTypeIsUseable(lua_State* L);
static int luaItemTypeIsPickupable(lua_State* L);
static int luaItemTypeIsRotatable(lua_State* L);

static int luaItemTypeGetType(lua_State* L);
static int luaItemTypeGetGroup(lua_State* L);
static int luaItemTypeGetId(lua_State* L);
static int luaItemTypeGetClientId(lua_State* L);
static int luaItemTypeGetName(lua_State* L);
static int luaItemTypeGetPluralName(lua_State* L);
static int luaItemTypeGetRotateTo(lua_State* L);
static int luaItemTypeGetArticle(lua_State* L);
static int luaItemTypeGetDescription(lua_State* L);
static int luaItemTypeGetSlotPosition(lua_State* L);
Expand Down

0 comments on commit f9f0754

Please sign in to comment.