diff options
Diffstat (limited to 'src/game-server')
-rw-r--r-- | src/game-server/mapreader.cpp | 3 | ||||
-rw-r--r-- | src/game-server/state.cpp | 24 | ||||
-rw-r--r-- | src/game-server/state.hpp | 9 | ||||
-rw-r--r-- | src/game-server/trigger.cpp | 11 | ||||
-rw-r--r-- | src/game-server/trigger.hpp | 6 |
5 files changed, 41 insertions, 12 deletions
diff --git a/src/game-server/mapreader.cpp b/src/game-server/mapreader.cpp index b5210f23..39d209d6 100644 --- a/src/game-server/mapreader.cpp +++ b/src/game-server/mapreader.cpp @@ -231,7 +231,8 @@ static Map *readMap(xmlNodePtr node, std::string const &path, MapComposite *comp { things.push_back(new TriggerArea( composite, rect, - new WarpAction(destMap, destX, destY))); + new WarpAction(destMap, destX, destY), + false)); } } else diff --git a/src/game-server/state.cpp b/src/game-server/state.cpp index 2d6e4a04..03c6e3c1 100644 --- a/src/game-server/state.cpp +++ b/src/game-server/state.cpp @@ -612,18 +612,30 @@ void GameState::enqueueWarp(Character *ptr, MapComposite *m, int x, int y) void GameState::sayAround(Object *obj, std::string const &text) { - MessageOut msg(GPMSG_SAY); - msg.writeShort(!obj->canMove() ? 65535 : - static_cast< MovingObject * >(obj)->getPublicID()); - msg.writeString(text); - Point speakerPosition = obj->getPosition(); for (CharacterIterator i(obj->getMap()->getAroundObjectIterator(obj, AROUND_AREA)); i; ++i) { if (speakerPosition.inRangeOf((*i)->getPosition(), AROUND_AREA)) { - gameHandler->sendTo(*i, msg); + sayTo(*i, obj, text); } } } + +void GameState::sayTo(Object *destination, Object *source, std::string const &text) +{ + if (destination->getType() != OBJECT_CHARACTER) return; //only characters will read it anyway + + MessageOut msg(GPMSG_SAY); + if (source == NULL) { + msg.writeShort(0); + } else if (!source->canMove()) { + msg.writeShort(65535); + } else { + msg.writeShort(static_cast< MovingObject * >(source)->getPublicID()); + } + msg.writeString(text); + + gameHandler->sendTo(static_cast< Character * >(destination), msg); +} diff --git a/src/game-server/state.hpp b/src/game-server/state.hpp index 67f91311..68bf6b32 100644 --- a/src/game-server/state.hpp +++ b/src/game-server/state.hpp @@ -91,9 +91,16 @@ namespace GameState void enqueueWarp(Character *, MapComposite *, int x, int y); /** - * Says something around an object. + * Says something to an object + * @note passing NULL as source generates a message from "Server:" + */ + void sayTo(Object *destination, Object *source, std::string const &text); + + /** + * Says something to everything around an object. */ void sayAround(Object *, std::string const &text); + } #endif diff --git a/src/game-server/trigger.cpp b/src/game-server/trigger.cpp index 3309c754..8252fafc 100644 --- a/src/game-server/trigger.cpp +++ b/src/game-server/trigger.cpp @@ -51,11 +51,18 @@ void ScriptAction::process(Object *obj) void TriggerArea::update() { + std::set<Object*> insideNow; for (MovingObjectIterator i(getMap()->getInsideRectangleIterator(mZone)); i; ++i) { - if (mZone.contains((*i)->getPosition())) + if (mZone.contains((*i)->getPosition())) //<-- Why is this additional condition necessary? Shouldn't getInsideRectangleIterator already exclude those outside of the zone? --Crush { - mAction->process(*i); + insideNow.insert(*i); + + if (!mOnce || mInside.find(*i) == mInside.end()) + { + mAction->process(*i); + } } } + mInside.swap(insideNow); //swapping is faster than assigning } diff --git a/src/game-server/trigger.hpp b/src/game-server/trigger.hpp index 3ca52fba..30944d86 100644 --- a/src/game-server/trigger.hpp +++ b/src/game-server/trigger.hpp @@ -70,14 +70,16 @@ class TriggerArea : public Thing /** * Creates a rectangular trigger for a given map. */ - TriggerArea(MapComposite *m, Rectangle const &r, TriggerAction *ptr) - : Thing(OBJECT_OTHER, m), mZone(r), mAction(ptr) {} + TriggerArea(MapComposite *m, Rectangle const &r, TriggerAction *ptr, bool once) + : Thing(OBJECT_OTHER, m), mZone(r), mAction(ptr), mOnce(once) {} virtual void update(); private: Rectangle mZone; TriggerAction *mAction; + bool mOnce; + std::set<Object *> mInside; }; #endif |