summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Sehmisch <crush@themanaworld.org>2009-03-19 20:10:27 +0100
committerPhilipp Sehmisch <crush@themanaworld.org>2009-03-19 20:10:27 +0100
commit3dec609dc5f343547fad87dbbd3d7c7e2c59dde5 (patch)
treee272c0d3ae0c56b9b455d81718b9a51e7439b101
parent53cde41db10d69120cdc46f278178fc5667744a1 (diff)
downloadmanaserv-3dec609dc5f343547fad87dbbd3d7c7e2c59dde5.tar.gz
manaserv-3dec609dc5f343547fad87dbbd3d7c7e2c59dde5.tar.bz2
manaserv-3dec609dc5f343547fad87dbbd3d7c7e2c59dde5.tar.xz
manaserv-3dec609dc5f343547fad87dbbd3d7c7e2c59dde5.zip
Implemented the possibility to have maps with or without PvP combat.
PvP is governed by the map property "pvp". Currently it can be either "none" for no PvP combat or "free" for unrestricted PvP combat. "none" is the default value which is used when pvp is undefined. Later addition of more sophisticated PvP modes is possible.
-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")
{