summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-12-19 15:15:44 +0300
committerAndrei Karas <akaras@inbox.ru>2013-12-19 15:15:44 +0300
commitf0315000bcf20685471966d2f25cd8e9f35e8230 (patch)
treeb5b51e2880191696d6217181d5aa4d5c5341265f
parent5615f8dde421e8d44c5e49a5a44ab7e69cb543a5 (diff)
downloadmanaplus-f0315000bcf20685471966d2f25cd8e9f35e8230.tar.gz
manaplus-f0315000bcf20685471966d2f25cd8e9f35e8230.tar.bz2
manaplus-f0315000bcf20685471966d2f25cd8e9f35e8230.tar.xz
manaplus-f0315000bcf20685471966d2f25cd8e9f35e8230.zip
add ability to give more than one item to npc. (evol only)
-rw-r--r--src/gui/windows/npcdialog.cpp36
-rw-r--r--src/gui/windows/npcdialog.h2
-rw-r--r--src/inventory.cpp15
-rw-r--r--src/inventory.h2
-rw-r--r--src/net/tmwa/npchandler.cpp8
5 files changed, 53 insertions, 10 deletions
diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp
index 1c2a6cc1d..36f7bedc8 100644
--- a/src/gui/windows/npcdialog.cpp
+++ b/src/gui/windows/npcdialog.cpp
@@ -360,16 +360,38 @@ void NpcDialog::action(const gcn::ActionEvent &event)
if (!client->limitPackets(PACKET_NPC_INPUT))
return;
- const Item *const item = mInventory->getItem(0);
std::string str;
- if (item)
+ const int sz = mInventory->getNumberOfSlotsUsed();
+ if (sz == 0)
{
- str = strprintf("%d,%d", item->getId(),
- item->getColor());
+ str = "0,0";
}
else
{
- str = "0,0";
+ const Item *item = mInventory->getItem(0);
+ if (item)
+ {
+ str = strprintf("%d,%d", item->getId(),
+ item->getColor());
+ }
+ else
+ {
+ str = "0,0";
+ }
+ for (int f = 1; f < sz; f ++)
+ {
+ str.append(";");
+ item = mInventory->getItem(f);
+ if (item)
+ {
+ str.append(strprintf("%d,%d", item->getId(),
+ item->getColor()));
+ }
+ else
+ {
+ str.append("0,0");
+ }
+ }
}
// need send selected item
@@ -597,11 +619,11 @@ void NpcDialog::integerRequest(const int defaultValue, const int min,
buildLayout();
}
-void NpcDialog::itemRequest()
+void NpcDialog::itemRequest(const int size)
{
mActionState = NPC_ACTION_INPUT;
mInputState = NPC_INPUT_ITEM;
-
+ mInventory->resize(size);
buildLayout();
}
diff --git a/src/gui/windows/npcdialog.h b/src/gui/windows/npcdialog.h
index 27efcee2f..1736f5567 100644
--- a/src/gui/windows/npcdialog.h
+++ b/src/gui/windows/npcdialog.h
@@ -164,7 +164,7 @@ class NpcDialog final : public Window,
void integerRequest(const int defaultValue = 0, const int min = 0,
const int max = 2147483647);
- void itemRequest();
+ void itemRequest(const int size);
void move(const int amount);
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 61500fb7a..9a82f192b 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -268,3 +268,18 @@ std::string Inventory::getName() const
}
}
}
+
+void Inventory::resize(const unsigned int newSize)
+{
+ clear();
+ if (mSize == newSize)
+ return;
+
+ for (unsigned i = 0; i < mSize; i++)
+ delete mItems[i];
+ delete [] mItems;
+
+ mSize = newSize;
+ mItems = new Item*[mSize];
+ std::fill_n(mItems, mSize, static_cast<Item*>(nullptr));
+}
diff --git a/src/inventory.h b/src/inventory.h
index e9949dc52..17855a064 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -160,6 +160,8 @@ class Inventory final
std::string getName() const A_WARN_UNUSED;
+ void resize(const unsigned int newSize);
+
protected:
typedef std::list<InventoryListener*> InventoryListenerList;
InventoryListenerList mInventoryListeners;
diff --git a/src/net/tmwa/npchandler.cpp b/src/net/tmwa/npchandler.cpp
index 1356dbf8c..bb53ef33f 100644
--- a/src/net/tmwa/npchandler.cpp
+++ b/src/net/tmwa/npchandler.cpp
@@ -329,10 +329,14 @@ void NpcHandler::processNpcCommand(Net::MessageIn &msg, const int npcId)
mDialog->clearRows();
break;
case 10: // send selected item id
+ {
+ int invSize = msg.readInt32();
+ if (!invSize)
+ invSize = 1;
if (mDialog)
- mDialog->itemRequest();
+ mDialog->itemRequest(invSize);
break;
-
+ }
default:
logger->log("unknown npc command: %d", cmd);
break;