diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2013-04-15 22:15:31 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2013-04-15 22:15:31 +0200 |
commit | c53bc90dbaa876a86f762a3d864b1f920e2b8071 (patch) | |
tree | 1a8174f4d1745a4799210db970aa2230df622d34 /src/game-server/triggerareacomponent.cpp | |
parent | b89e404f85358f2e3ff87d7731376dbeacdf9778 (diff) | |
parent | 81be8dc99ba7558c8915310eed095df43e3bdbf7 (diff) | |
download | manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.gz manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.bz2 manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.xz manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.zip |
Merge branch 'master' into lpc2012
Conflicts:
src/account-server/accounthandler.cpp
src/game-server/character.cpp
Diffstat (limited to 'src/game-server/triggerareacomponent.cpp')
-rw-r--r-- | src/game-server/triggerareacomponent.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/game-server/triggerareacomponent.cpp b/src/game-server/triggerareacomponent.cpp new file mode 100644 index 00000000..b599546b --- /dev/null +++ b/src/game-server/triggerareacomponent.cpp @@ -0,0 +1,88 @@ +/* + * The Mana Server + * Copyright (C) 2006-2010 The Mana World Development Team + * Copyright (C) 2012 The Mana Developers + * + * This file is part of The Mana Server. + * + * The Mana Server is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "game-server/triggerareacomponent.h" + +#include "game-server/character.h" +#include "game-server/mapcomposite.h" +#include "game-server/actor.h" +#include "game-server/state.h" + +#include "utils/logger.h" + +#include <cassert> + +void WarpAction::process(Entity *obj) +{ + if (obj->getType() == OBJECT_CHARACTER) + { + GameState::enqueueWarp(obj, mMap, mTargetPoint); + } +} + +ScriptAction::ScriptAction(Script *script, Script::Ref callback, int arg) : + mScript(script), + mCallback(callback), + mArg(arg) +{ + assert(mCallback.isValid()); +} + +void ScriptAction::process(Entity *obj) +{ + LOG_DEBUG("Script trigger area activated: " + << "(" << obj << ", " << mArg << ")"); + + mScript->prepare(mCallback); + mScript->push(obj); + mScript->push(mArg); + mScript->execute(obj->getMap()); +} + +void TriggerAreaComponent::update(Entity &entity) +{ + MapComposite *map = entity.getMap(); + std::set<Entity *> insideNow; + + for (BeingIterator i(map->getInsideRectangleIterator(mZone)); i; ++i) + { + // Don't deal with uninitialized actors + if (!(*i) || !(*i)->getComponent<ActorComponent>()->isPublicIdValid()) + continue; + + // The BeingIterator returns the mapZones in touch with the rectangle + // area. On the other hand, the beings contained in the map zones + // may not be within the rectangle area. Hence, this additional + // contains() condition. + const Point &point = + (*i)->getComponent<ActorComponent>()->getPosition(); + if (mZone.contains(point)) + { + insideNow.insert(*i); + + if (!mOnce || mInside.find(*i) == mInside.end()) + { + mAction->process(*i); + } + } + } + mInside.swap(insideNow); //swapping is faster than assigning +} |