summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game-server/being.cpp5
-rw-r--r--src/game-server/map.cpp8
-rw-r--r--src/game-server/map.hpp16
-rw-r--r--src/game-server/mapcomposite.cpp6
-rw-r--r--src/game-server/mapcomposite.hpp13
-rw-r--r--src/game-server/mapreader.cpp19
6 files changed, 63 insertions, 4 deletions
diff --git a/src/game-server/being.cpp b/src/game-server/being.cpp
index cec2c4e6..ace30861 100644
--- a/src/game-server/being.cpp
+++ b/src/game-server/being.cpp
@@ -190,6 +190,11 @@ void Being::performAttack(Damage const &damage, AttackZone const *attackZone)
int type = o->getType();
if (type != OBJECT_CHARACTER && type != OBJECT_MONSTER) continue;
+ if (getMap()->getPvP() == PVP_NONE &&
+ type == OBJECT_CHARACTER &&
+ getType() == OBJECT_CHARACTER)
+ continue;
+
LOG_DEBUG("Attack Zone:"<<
attPos.x<<":"<<attPos.y<<
" "<<
diff --git a/src/game-server/map.cpp b/src/game-server/map.cpp
index 0956571e..f66f8876 100644
--- a/src/game-server/map.cpp
+++ b/src/game-server/map.cpp
@@ -81,6 +81,14 @@ Map::setSize(int width, int height)
}
}
+const std::string &Map::getProperty(const std::string &key) const
+{
+ std::map<std::string, std::string>::const_iterator i;
+ i = mProperties.find(key);
+ if (i == mProperties.end()) return "";
+ return i->second;
+}
+
void Map::blockTile(int x, int y, BlockType type)
{
if (type == BLOCKTYPE_NONE || x < 0 || y < 0 || x >= mWidth || y >= mHeight)
diff --git a/src/game-server/map.hpp b/src/game-server/map.hpp
index 3a9badf9..bbc33fea 100644
--- a/src/game-server/map.hpp
+++ b/src/game-server/map.hpp
@@ -155,6 +155,17 @@ class Map
{ return tileHeight; }
/**
+ * Returns a general map property defined in the map file
+ */
+ const std::string &getProperty(const std::string &key) const;
+
+ /**
+ * Sets a map property
+ */
+ void setProperty(const std::string& key, const std::string& val)
+ { mProperties[key] = val; }
+
+ /**
* Find a path from one location to the next.
*/
std::list<PATH_NODE> findPath(int startX, int startY,
@@ -170,11 +181,14 @@ class Map
static const unsigned char BLOCKMASK_CHARACTER = 0x01;// = bin 0000 0001
static const unsigned char BLOCKMASK_MONSTER = 0x02; // = bin 0000 0010
int *mOccupation[NB_BLOCKTYPES];
+
+ // map properties
int mWidth, mHeight;
int tileWidth, tileHeight;
- MetaTile *mMetaTiles;
+ std::map<std::string, std::string> mProperties;
// Pathfinding members
+ MetaTile *mMetaTiles;
int onClosedList, onOpenList;
};
diff --git a/src/game-server/mapcomposite.cpp b/src/game-server/mapcomposite.cpp
index b9e4b863..e7267d08 100644
--- a/src/game-server/mapcomposite.cpp
+++ b/src/game-server/mapcomposite.cpp
@@ -532,6 +532,12 @@ void MapComposite::setMap(Map *m)
assert(!mMap && m);
mMap = m;
mContent = new MapContent(m);
+
+ std::string sPvP = m->getProperty ("pvp");
+ if (sPvP == "free") mPvPRules = PVP_FREE;
+ else if (sPvP == "none") mPvPRules = PVP_NONE;
+ else mPvPRules = PVP_NONE;
+
}
void MapComposite::update()
diff --git a/src/game-server/mapcomposite.hpp b/src/game-server/mapcomposite.hpp
index 078842d6..7242fad6 100644
--- a/src/game-server/mapcomposite.hpp
+++ b/src/game-server/mapcomposite.hpp
@@ -38,6 +38,12 @@ class Thing;
struct MapContent;
struct MapZone;
+enum PvPRules
+{
+ PVP_NONE, // no PvP on this map
+ PVP_FREE // unrestricted PvP on this map
+ // [space for additional PvP modes]
+};
/**
* Ordered sets of zones of a map.
*/
@@ -290,6 +296,11 @@ class MapComposite
void update();
/**
+ * Gets the PvP rules on the map
+ */
+ PvPRules getPvP() const { return mPvPRules; }
+
+ /**
* Gets an iterator on the objects of the whole map.
*/
ZoneIterator getWholeMapIterator() const
@@ -329,6 +340,8 @@ class MapComposite
Script *mScript; /**< Script associated to this map. */
std::string mName; /**< Name of the map. */
unsigned short mID; /**< ID of the map. */
+
+ PvPRules mPvPRules;
};
#endif
diff --git a/src/game-server/mapreader.cpp b/src/game-server/mapreader.cpp
index 9caddc24..758b37ee 100644
--- a/src/game-server/mapreader.cpp
+++ b/src/game-server/mapreader.cpp
@@ -114,7 +114,7 @@ void MapReader::readMap(const std::string &filename, MapComposite *composite)
}
}
-Map* MapReader::readMap(xmlNodePtr node, std::string const &path,
+Map* MapReader::readMap(xmlNodePtr node, std::string const &path,
MapComposite *composite, std::vector<Thing *> &things)
{
// Take the filename off the path
@@ -140,6 +140,19 @@ Map* MapReader::readMap(xmlNodePtr node, std::string const &path,
::tilesetFirstGids.push_back(XML::getProperty(node, "firstgid", 0));
}
}
+ else if (xmlStrEqual(node->name, BAD_CAST "properties"))
+ {
+ for_each_xml_child_node(propNode, node)
+ {
+ if (xmlStrEqual(propNode->name, BAD_CAST "property"))
+ {
+ std::string key = XML::getProperty(propNode, "name", "");
+ std::string val = XML::getProperty(propNode, "value", "");
+ LOG_DEBUG(" "<<key<<": "<<val);
+ map->setProperty(key, val);
+ }
+ }
+ }
else if (xmlStrEqual(node->name, BAD_CAST "layer"))
{
// Layer 3 is collision layer.
@@ -166,7 +179,7 @@ Map* MapReader::readMap(xmlNodePtr node, std::string const &path,
int objW = XML::getProperty(objectNode, "width", 0);
int objH = XML::getProperty(objectNode, "height", 0);
Rectangle rect = { objX, objY, objW, objH };
-
+
if (objType == "WARP")
{
@@ -236,7 +249,7 @@ Map* MapReader::readMap(xmlNodePtr node, std::string const &path,
{
if (xmlStrEqual(propertyNode->name, BAD_CAST "property"))
{
- std::string value = XML::getProperty(propertyNode, "name", std::string());
+ std::string value = XML::getProperty(propertyNode, "name", std::string());
value = utils::toupper(value);
if (value == "MONSTER_ID")
{