summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-06-08 00:43:48 +0300
committerAndrei Karas <akaras@inbox.ru>2012-06-08 00:43:48 +0300
commitdbc3b324a0c5dcb1a0ee29b289e71423a06e85fd (patch)
treef7cda00f7415c35fb2a9e4466a751d18852070bf
parentcbb805a1922e3423fdaae88242835fb717a903bf (diff)
downloadmanaplus-dbc3b324a0c5dcb1a0ee29b289e71423a06e85fd.tar.gz
manaplus-dbc3b324a0c5dcb1a0ee29b289e71423a06e85fd.tar.bz2
manaplus-dbc3b324a0c5dcb1a0ee29b289e71423a06e85fd.tar.xz
manaplus-dbc3b324a0c5dcb1a0ee29b289e71423a06e85fd.zip
Add to npc option targetSelection to allow/disallow npc selection.
-rw-r--r--src/actorspritemanager.cpp19
-rw-r--r--src/resources/beinginfo.cpp21
-rw-r--r--src/resources/beinginfo.h7
-rw-r--r--src/resources/npcdb.cpp8
4 files changed, 46 insertions, 9 deletions
diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index dbd9c6692..4d4511476 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -44,6 +44,8 @@
#include "net/net.h"
#include "net/playerhandler.h"
+#include "resources/beinginfo.h"
+
#include <algorithm>
#include <list>
@@ -348,6 +350,9 @@ Being *ActorSpriteManager::findBeingByPixel(int x, int y,
Being *being = static_cast<Being*>(*it);
+ if (being->getInfo() && !being->getInfo()->isTargetSelection())
+ continue;
+
if ((being->isAlive()
|| (targetDead && being->getType() == Being::PLAYER))
&& (allPlayers || being != player_node))
@@ -392,6 +397,9 @@ Being *ActorSpriteManager::findBeingByPixel(int x, int y,
Being *being = static_cast<Being*>(*it);
+ if (being->getInfo() && !being->getInfo()->isTargetSelection())
+ continue;
+
if ((being->getPixelX() - 16 <= x) &&
(being->getPixelX() + 16 > x) &&
(being->getPixelY() - 32 <= y) &&
@@ -422,6 +430,10 @@ void ActorSpriteManager::findBeingsByPixel(std::vector<ActorSprite*> &beings,
continue;
Being *being = dynamic_cast<Being*>(*it);
+
+ if (being->getInfo() && !being->getInfo()->isTargetSelection())
+ continue;
+
ActorSprite *actor = *it;
if ((being && (being->isAlive()
@@ -905,6 +917,10 @@ Being *ActorSpriteManager::findNearestLivingBeing(Being *aroundBeing,
continue;
}
}
+
+ if (being->getInfo() && !being->getInfo()->isTargetSelection())
+ continue;
+
if (validateBeing(aroundBeing, being, type, nullptr, maxDist))
{
if (being != excluded)
@@ -997,6 +1013,9 @@ Being *ActorSpriteManager::findNearestLivingBeing(Being *aroundBeing,
}
}
+ if (being->getInfo() && !being->getInfo()->isTargetSelection())
+ continue;
+
// Being *being = (*i);
bool valid = validateBeing(aroundBeing, being, type, excluded, 50);
diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp
index 9c8799bc0..1f2bd3e9a 100644
--- a/src/resources/beinginfo.cpp
+++ b/src/resources/beinginfo.cpp
@@ -32,15 +32,18 @@
BeingInfo *BeingInfo::unknown = nullptr;
Attack *BeingInfo::empty = new Attack(SpriteAction::ATTACK, "", "");
-BeingInfo::BeingInfo():
- mName(_("unnamed")),
- mTargetCursorSize(ActorSprite::TC_MEDIUM),
- mWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_CHARACTER
- | Map::BLOCKMASK_MONSTER | Map::BLOCKMASK_AIR
- | Map::BLOCKMASK_WATER),
- mBlockType(Map::BLOCKTYPE_CHARACTER),
- mTargetOffsetX(0), mTargetOffsetY(0),
- mMaxHP(0), mStaticMaxHP(false)
+BeingInfo::BeingInfo() :
+ mName(_("unnamed")),
+ mTargetCursorSize(ActorSprite::TC_MEDIUM),
+ mWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_CHARACTER
+ | Map::BLOCKMASK_MONSTER | Map::BLOCKMASK_AIR
+ | Map::BLOCKMASK_WATER),
+ mBlockType(Map::BLOCKTYPE_CHARACTER),
+ mTargetOffsetX(0),
+ mTargetOffsetY(0),
+ mMaxHP(0),
+ mStaticMaxHP(false),
+ mTargetSelection(true)
{
SpriteDisplay display;
display.sprites.push_back(SpriteReference::Empty);
diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h
index 4aa8f96c8..227bc686e 100644
--- a/src/resources/beinginfo.h
+++ b/src/resources/beinginfo.h
@@ -146,6 +146,12 @@ class BeingInfo
void setStaticMaxHP(bool n)
{ mStaticMaxHP = n; }
+ void setTargetSelection(bool n)
+ { mTargetSelection = n; }
+
+ bool isTargetSelection() const
+ { return mTargetSelection; }
+
static void clear();
private:
@@ -160,6 +166,7 @@ class BeingInfo
int mTargetOffsetY;
int mMaxHP;
bool mStaticMaxHP;
+ bool mTargetSelection;
};
typedef std::map<int, BeingInfo*> BeingInfos;
diff --git a/src/resources/npcdb.cpp b/src/resources/npcdb.cpp
index 832fa26d6..26f5e53cb 100644
--- a/src/resources/npcdb.cpp
+++ b/src/resources/npcdb.cpp
@@ -38,6 +38,8 @@ namespace
bool mLoaded = false;
}
+extern int serverVersion;
+
void NPCDB::load()
{
if (mLoaded)
@@ -70,6 +72,12 @@ void NPCDB::load()
BeingInfo *currentInfo = new BeingInfo;
+ if (serverVersion > 0)
+ {
+ currentInfo->setTargetSelection(XML::getProperty(
+ npcNode, "targetSelection", true));
+ }
+
currentInfo->setTargetCursorSize(XML::getProperty(npcNode,
"targetCursor", "medium"));