diff options
Diffstat (limited to 'src/game-server/triggerareacomponent.cpp')
-rw-r--r-- | src/game-server/triggerareacomponent.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/game-server/triggerareacomponent.cpp b/src/game-server/triggerareacomponent.cpp index b599546b..04e77b6a 100644 --- a/src/game-server/triggerareacomponent.cpp +++ b/src/game-server/triggerareacomponent.cpp @@ -38,6 +38,47 @@ void WarpAction::process(Entity *obj) } } +void AutowarpAction::process(Entity *obj) +{ + Point targetPoint; + + // only characters can warp + if (obj->getType() != OBJECT_CHARACTER) + return; + + // get the direction + ActorComponent *actor = obj->getComponent<ActorComponent>(); + + // calculate proportions + float horizontal = float(mTargetArea.w) / float(mSourceArea.w); + float vertical = float(mTargetArea.h) / float(mSourceArea.h); + + // calculate final target position + const Point &actorPosition = actor->getPosition(); + int actorSize = actor->getSize(); + switch (mDirection) + { + case ExitNorth: + targetPoint.x = (actorPosition.x - mSourceArea.x) * horizontal + mTargetArea.x; + targetPoint.y = mTargetArea.y - actorSize; + break; + case ExitSouth: + targetPoint.x = (actorPosition.x - mSourceArea.x) * horizontal + mTargetArea.x; + targetPoint.y = mTargetArea.y + mTargetArea.h + actorSize; + break; + case ExitEast: + targetPoint.x = mTargetArea.x + mTargetArea.w + actorSize; + targetPoint.y = (actorPosition.y - mSourceArea.y) * vertical + mTargetArea.y; + break; + case ExitWest: + targetPoint.x = mTargetArea.x - actorSize; + targetPoint.y = (actorPosition.y - mSourceArea.y) * vertical + mTargetArea.y; + break; + } + + GameState::enqueueWarp(obj, mMap, targetPoint); +} + ScriptAction::ScriptAction(Script *script, Script::Ref callback, int arg) : mScript(script), mCallback(callback), |