diff --git a/src/trigger/scripttrigger.cpp b/src/trigger/scripttrigger.cpp index 98683307a4..7ed2dd0914 100644 --- a/src/trigger/scripttrigger.cpp +++ b/src/trigger/scripttrigger.cpp @@ -17,6 +17,7 @@ #include "trigger/scripttrigger.hpp" #include "editor/editor.hpp" +#include "object/player.hpp" #include "supertux/debug.hpp" #include "supertux/sector.hpp" #include "util/log.hpp" @@ -26,11 +27,16 @@ ScriptTrigger::ScriptTrigger(const ReaderMapping& reader) : Trigger(reader), triggerevent(), + m_trigger_direction(Direction::AUTO), script(), must_activate(false), oneshot(false), runcount(0) { + std::string trigger_direction; + reader.get("trigger-direction", trigger_direction, dir_to_string(Direction::AUTO).c_str()); + m_trigger_direction = string_to_dir(trigger_direction); + reader.get("script", script); reader.get("button", must_activate); reader.get("oneshot", oneshot); @@ -51,6 +57,8 @@ ScriptTrigger::get_settings() result.add_script(_("Script"), &script, "script"); result.add_bool(_("Button"), &must_activate, "button"); result.add_bool(_("Oneshot"), &oneshot, "oneshot", false); + result.add_direction(_("Trigger Direction"), &m_trigger_direction, + { Direction::AUTO, Direction::LEFT, Direction::RIGHT, Direction::UP, Direction::DOWN }, "trigger-direction"); result.reorder({"script", "button", "width", "height", "x", "y"}); @@ -58,11 +66,30 @@ ScriptTrigger::get_settings() } void -ScriptTrigger::event(Player& , EventType type) +ScriptTrigger::event(Player& player, EventType type) { if (type != triggerevent || (oneshot && runcount >= 1)) return; + if(m_trigger_direction != Direction::AUTO) + { + const auto& pos = get_pos(); + const auto& player_pos = player.get_pos(); + Direction player_direction = Direction::NONE; + + if (player_pos.x < pos.x) + player_direction = Direction::LEFT; + if (player_pos.x + player.get_width() > pos.x + get_width()) + player_direction = Direction::RIGHT; + if (player_pos.y < pos.y) + player_direction = Direction::UP; + if (player_pos.y + player.get_height() > pos.y + get_height()) + player_direction = Direction::DOWN; + + if (player_direction != m_trigger_direction) + return; + } + Sector::get().run_script(script, "ScriptTrigger"); runcount++; } diff --git a/src/trigger/scripttrigger.hpp b/src/trigger/scripttrigger.hpp index 6b3276346b..42ae5674dd 100644 --- a/src/trigger/scripttrigger.hpp +++ b/src/trigger/scripttrigger.hpp @@ -38,6 +38,7 @@ class ScriptTrigger final : public Trigger private: EventType triggerevent; + Direction m_trigger_direction; std::string script; bool must_activate; bool oneshot;