diff --git a/src/net/tmwserv/npchandler.cpp b/src/net/tmwserv/npchandler.cpp index 5670bd6..df4d8f2 100644 --- a/src/net/tmwserv/npchandler.cpp +++ b/src/net/tmwserv/npchandler.cpp @@ -48,6 +48,8 @@ NpcHandler::NpcHandler() GPMSG_NPC_POST, GPMSG_NPC_MESSAGE, GPMSG_NPC_ERROR, + GPMSG_NPC_CLOSE_MESSAGE, + GPMSG_NPC_NEXT_MESSAGE, 0 }; handledMessages = _messages; @@ -62,11 +64,10 @@ void NpcHandler::handleMessage(MessageIn &msg) return; } - current_npc = being->getId(); - switch (msg.getId()) { case GPMSG_NPC_CHOICE: + current_npc = being->getId(); npcListDialog->reset(); while (msg.getUnreadLength()) { @@ -76,6 +77,7 @@ void NpcHandler::handleMessage(MessageIn &msg) break; case GPMSG_NPC_POST: + current_npc = being->getId(); npcTextDialog->setVisible(false); npcPostDialog->clear(); npcPostDialog->setVisible(true); @@ -83,12 +85,32 @@ void NpcHandler::handleMessage(MessageIn &msg) case GPMSG_NPC_ERROR: current_npc = NULL; + case GPMSG_NPC_MESSAGE: + current_npc = being->getId(); npcTextDialog->addText(msg.readString(msg.getUnreadLength())); npcListDialog->setVisible(false); npcTextDialog->setVisible(true); npcPostDialog->setVisible(false); break; + + case GPMSG_NPC_CLOSE_MESSAGE: + // If we're talking to that NPC, show the close button + if (being->getId() == current_npc) + npcTextDialog->showCloseButton(); + // Othersize, move on as a empty dialog doesn't help + else + npcTextDialog->closeDialog(being->getId()); + break; + + case GPMSG_NPC_NEXT_MESSAGE: + // If we're talking to that NPC, show the next button + if (being->getId() == current_npc) + npcTextDialog->showNextButton(); + // Otherwise, move on as an empty dialog doesn't help + else + npcTextDialog->nextDialog(being->getId()); + break; } } diff --git a/src/net/tmwserv/protocol.h b/src/net/tmwserv/protocol.h index fc52bd5..30ba956 100644 --- a/src/net/tmwserv/protocol.h +++ b/src/net/tmwserv/protocol.h @@ -111,6 +111,8 @@ enum { GPMSG_BEING_ATTACK = 0x0291, // W being id PGMSG_SAY = 0x02A0, // S text GPMSG_SAY = 0x02A1, // W being id, S text + + // Handles NPC dialogs GPMSG_NPC_CHOICE = 0x02B0, // W being id, { S text }* GPMSG_NPC_MESSAGE = 0x02B1, // W being id, B* text PGMSG_NPC_TALK = 0x02B2, // W being id @@ -120,9 +122,14 @@ enum { GPMSG_NPC_SELL = 0x02B6, // W being id, { W item id, W amount, W cost }* PGMSG_NPC_BUYSELL = 0x02B7, // W item id, W amount GPMSG_NPC_ERROR = 0x02B8, // B error + GPMSG_NPC_NEXT_MESSAGE = 0x02B9, // W being id + GPMSG_NPC_CLOSE_MESSAGE = 0x02BA, // W being id + + // Handles NPC postal service GPMSG_NPC_POST = 0x02D0, // W being id PGMSG_NPC_POST_SEND = 0x02D1, // S name, S text, W item id GPMSG_NPC_POST_GET = 0x02D2, // W being id, { S name, S text, W item id } + PGMSG_TRADE_REQUEST = 0x02C0, // W being id GPMSG_TRADE_REQUEST = 0x02C1, // W being id GPMSG_TRADE_START = 0x02C2, // -