summaryrefslogtreecommitdiff
path: root/src/game-server
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server')
-rw-r--r--src/game-server/mapreader.cpp3
-rw-r--r--src/game-server/state.cpp24
-rw-r--r--src/game-server/state.hpp9
-rw-r--r--src/game-server/trigger.cpp11
-rw-r--r--src/game-server/trigger.hpp6
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