Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add: Player.onRotateItem event #4541

Merged
merged 1 commit into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading