summaryrefslogtreecommitdiff
path: root/src/actorspritemanager.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-05-04 01:36:53 +0300
committerAndrei Karas <akaras@inbox.ru>2012-05-05 19:36:52 +0300
commit7ed077a94dd553e5aa7675144ce98fd6e4ce723e (patch)
tree1cdb4cad6692d0dc34b4220f62038f67af77da2e /src/actorspritemanager.cpp
parent7ba882b543b45794301f2490fceb84b0dd9c60e1 (diff)
downloadmv-7ed077a94dd553e5aa7675144ce98fd6e4ce723e.tar.gz
mv-7ed077a94dd553e5aa7675144ce98fd6e4ce723e.tar.bz2
mv-7ed077a94dd553e5aa7675144ce98fd6e4ce723e.tar.xz
mv-7ed077a94dd553e5aa7675144ce98fd6e4ce723e.zip
Add pickup ignore list.
Diffstat (limited to 'src/actorspritemanager.cpp')
-rw-r--r--src/actorspritemanager.cpp166
1 files changed, 155 insertions, 11 deletions
diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index 9dcae629c..97d559ffc 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -40,6 +40,8 @@
#include "utils/gettext.h"
#include "utils/stringutils.h"
+#include "resources/iteminfo.h"
+
#include "net/net.h"
#include "net/playerhandler.h"
@@ -221,6 +223,8 @@ void ActorSpriteManager::setPlayer(LocalPlayer *player)
mActors.insert(player);
if (socialWindow)
socialWindow->updateAttackFilter();
+ if (socialWindow)
+ socialWindow->updatePickupFilter();
}
Being *ActorSpriteManager::createBeing(int id, ActorSprite::Type type,
@@ -239,6 +243,8 @@ FloorItem *ActorSpriteManager::createItem(int id, int itemId, int x, int y,
FloorItem *floorItem = new FloorItem(id, itemId, x, y,
mMap, amount, color, subX, subY);
+ if (!checkForPickup(floorItem))
+ floorItem->disableHightlight();
mActors.insert(floorItem);
return floorItem;
}
@@ -500,6 +506,7 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2,
return false;
bool finded(false);
+ bool allowAll = mPickupItemsSet.find("") != mPickupItemsSet.end();
if (!serverBuggy)
{
for_actors
@@ -511,8 +518,30 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2,
&& ((*it)->getTileX() >= x1 && (*it)->getTileX() <= x2)
&& ((*it)->getTileY() >= y1 && (*it)->getTileY() <= y2))
{
- if (player_node->pickUp(static_cast<FloorItem*>(*it)))
- finded = true;
+ FloorItem *item = static_cast<FloorItem*>(*it);
+ const ItemInfo &info = item->getInfo();
+ std::string name;
+ if (serverVersion > 0)
+ name = info.getName(item->getColor());
+ else
+ name = info.getName();
+ if (allowAll)
+ {
+ if (mIgnorePickupItemsSet.find(name)
+ == mIgnorePickupItemsSet.end())
+ {
+ if (player_node->pickUp(item))
+ finded = true;
+ }
+ }
+ else
+ {
+ if (mPickupItemsSet.find(name) != mPickupItemsSet.end())
+ {
+ if (player_node->pickUp(item))
+ finded = true;
+ }
+ }
}
}
}
@@ -532,13 +561,41 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2,
FloorItem *tempItem = static_cast<FloorItem*>(*it);
if (tempItem->getPickupCount() < cnt)
{
- item = tempItem;
- cnt = item->getPickupCount();
- if (cnt == 0)
+ const ItemInfo &info = tempItem->getInfo();
+ std::string name;
+ if (serverVersion > 0)
+ name = info.getName(tempItem->getColor());
+ else
+ name = info.getName();
+ if (allowAll)
{
- item->incrementPickup();
- player_node->pickUp(item);
- return true;
+ if (mIgnorePickupItemsSet.find(name)
+ == mIgnorePickupItemsSet.end())
+ {
+ item = tempItem;
+ cnt = item->getPickupCount();
+ if (cnt == 0)
+ {
+ item->incrementPickup();
+ player_node->pickUp(item);
+ return true;
+ }
+ }
+ }
+ else
+ {
+ if (mPickupItemsSet.find(name)
+ != mPickupItemsSet.end())
+ {
+ item = tempItem;
+ cnt = item->getPickupCount();
+ if (cnt == 0)
+ {
+ item->incrementPickup();
+ player_node->pickUp(item);
+ return true;
+ }
+ }
}
}
}
@@ -557,6 +614,7 @@ bool ActorSpriteManager::pickUpNearest(int x, int y, int maxdist)
maxdist = maxdist * maxdist;
FloorItem *closestItem = nullptr;
int dist = 0;
+ bool allowAll = mPickupItemsSet.find("") != mPickupItemsSet.end();
for_actors
{
@@ -574,8 +632,29 @@ bool ActorSpriteManager::pickUpNearest(int x, int y, int maxdist)
|| player_node->isReachable(item->getTileX(),
item->getTileY())))
{
- dist = d;
- closestItem = item;
+ const ItemInfo &info = item->getInfo();
+ std::string name;
+ if (serverVersion > 0)
+ name = info.getName(item->getColor());
+ else
+ name = info.getName();
+ if (allowAll)
+ {
+ if (mIgnorePickupItemsSet.find(name)
+ == mIgnorePickupItemsSet.end())
+ {
+ dist = d;
+ closestItem = item;
+ }
+ }
+ else
+ {
+ if (mPickupItemsSet.find(name) != mPickupItemsSet.end())
+ {
+ dist = d;
+ closestItem = item;
+ }
+ }
}
}
}
@@ -1378,6 +1457,15 @@ void ActorSpriteManager::removeAttackMob(const std::string &name)
rebuildPriorityAttackMobs();
}
+void ActorSpriteManager::removePickupItem(const std::string &name)
+{
+ mPickupItems.remove(name);
+ mPickupItemsSet.erase(name);
+ mIgnorePickupItems.remove(name);
+ mIgnorePickupItemsSet.erase(name);
+ rebuildPickupItems();
+}
+
#define addMobToList(name, mob) \
{\
int size = get##mob##sSize();\
@@ -1435,6 +1523,19 @@ void ActorSpriteManager::addIgnoreAttackMob(std::string name)
rebuildPriorityAttackMobs();
}
+void ActorSpriteManager::addPickupItem(std::string name)
+{
+ addMobToList(name, PickupItem);
+ rebuildPickupItems();
+}
+
+void ActorSpriteManager::addIgnorePickupItem(std::string name)
+{
+ mIgnorePickupItems.push_back(name);
+ mIgnorePickupItemsSet.insert(name);
+ rebuildPickupItems();
+}
+
void ActorSpriteManager::rebuildPriorityAttackMobs()
{
rebuildMobsList(PriorityAttackMob);
@@ -1445,6 +1546,11 @@ void ActorSpriteManager::rebuildAttackMobs()
rebuildMobsList(AttackMob);
}
+void ActorSpriteManager::rebuildPickupItems()
+{
+ rebuildMobsList(PickupItem);
+}
+
int ActorSpriteManager::getIndexByName(std::string name,
std::map<std::string, int> &map)
{
@@ -1466,6 +1572,11 @@ int ActorSpriteManager::getAttackMobIndex(std::string name)
return getIndexByName(name, mAttackMobsMap);
}
+int ActorSpriteManager::getPickupItemIndex(std::string name)
+{
+ return getIndexByName(name, mPickupItemsMap);
+}
+
#define loadList(key, mob) \
{\
list = unpackList(serverConfig.getValue(key, ""));\
@@ -1491,15 +1602,24 @@ void ActorSpriteManager::loadAttackList()
loadList("attackPriorityMobs", PriorityAttackMob);
loadList("attackMobs", AttackMob);
loadList("ignoreAttackMobs", IgnoreAttackMob);
-
if (!empty)
{
mAttackMobs.push_back("");
mAttackMobsSet.insert("");
+ empty = false;
+ }
+
+ loadList("pickupItems", PickupItem);
+ loadList("ignorePickupItems", IgnorePickupItem);
+ if (!empty)
+ {
+ mPickupItems.push_back("");
+ mPickupItemsSet.insert("");
}
rebuildAttackMobs();
rebuildPriorityAttackMobs();
+ rebuildPickupItems();
}
void ActorSpriteManager::storeAttackList()
@@ -1507,4 +1627,28 @@ void ActorSpriteManager::storeAttackList()
serverConfig.setValue("attackPriorityMobs", packList(mPriorityAttackMobs));
serverConfig.setValue("attackMobs", packList(mAttackMobs));
serverConfig.setValue("ignoreAttackMobs", packList(mIgnoreAttackMobs));
+
+ serverConfig.setValue("pickupItems", packList(mPickupItems));
+ serverConfig.setValue("ignorePickupItems", packList(mIgnorePickupItems));
+}
+
+bool ActorSpriteManager::checkForPickup(FloorItem *item)
+{
+ const ItemInfo &info = item->getInfo();
+ std::string name;
+ if (serverVersion > 0)
+ name = info.getName(item->getColor());
+ else
+ name = info.getName();
+
+ if (mPickupItemsSet.find("") != mPickupItemsSet.end())
+ {
+ if (mIgnorePickupItemsSet.find(name) == mIgnorePickupItemsSet.end())
+ return true;
+ }
+ else if (mPickupItemsSet.find(name) != mPickupItemsSet.end())
+ {
+ return true;
+ }
+ return false;
}