summaryrefslogtreecommitdiff
path: root/src/game-server/triggerareacomponent.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2013-05-10 15:51:14 +0200
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2013-05-10 15:51:14 +0200
commit598f79c6dd78be5c0ca684c19172f3b9d3420a44 (patch)
treed5727018585de90709da7d4e22bc6d6199a48ce1 /src/game-server/triggerareacomponent.cpp
parented8fba0a47d2e498267cbfbf1271bacb76c400e9 (diff)
parent000dcd8064d60f9f34077ca0a1731af4b8773b52 (diff)
downloadmanaserv-598f79c6dd78be5c0ca684c19172f3b9d3420a44.tar.gz
manaserv-598f79c6dd78be5c0ca684c19172f3b9d3420a44.tar.bz2
manaserv-598f79c6dd78be5c0ca684c19172f3b9d3420a44.tar.xz
manaserv-598f79c6dd78be5c0ca684c19172f3b9d3420a44.zip
Merge branch 'master' into lpc2012lpc2012
Diffstat (limited to 'src/game-server/triggerareacomponent.cpp')
-rw-r--r--src/game-server/triggerareacomponent.cpp41
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),