diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-28 20:56:41 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-28 20:57:58 +0100 |
commit | 264be2108c51837fa92085f6c839e66aebbcfc9e (patch) | |
tree | e1f535d4cda5f399e5e622f6154690a0a4e08c4b /src/net/tmwa | |
parent | d86a1df562e00a6e930683534b9d001f45a951ff (diff) | |
download | mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.gz mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.bz2 mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.xz mana-264be2108c51837fa92085f6c839e66aebbcfc9e.zip |
Added support for map/layer mask
A custom "Mask" property on a layer or a "foregroundXmask" property on a
map can now be used in combination with the SMSG_MAP_MASK to dynamically
disable certain map layers from the server.
Feature previously seen on ManaPlus and implemented for Mana client for
compatibility.
Also added a ResourceRef class for automating the Resource reference
counting.
Closes #44
Diffstat (limited to 'src/net/tmwa')
-rw-r--r-- | src/net/tmwa/network.cpp | 9 | ||||
-rw-r--r-- | src/net/tmwa/network.h | 1 | ||||
-rw-r--r-- | src/net/tmwa/playerhandler.cpp | 10 | ||||
-rw-r--r-- | src/net/tmwa/protocol.h | 2 |
4 files changed, 19 insertions, 3 deletions
diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index c1ba615f..d0a5dc62 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -40,7 +40,7 @@ // indicator for a variable-length packet const uint16_t VAR = 1; -uint16_t packet_lengths[0x220] = { +uint16_t packet_lengths[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -82,9 +82,12 @@ uint16_t packet_lengths[0x220] = { VAR,VAR, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56,VAR, 4, 5, 10, // #0x0200 26, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 19, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2,VAR, 16, 0, 8,VAR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + VAR,122,VAR,VAR,VAR,VAR, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +static const int packet_lengths_size + = static_cast<int>(sizeof(packet_lengths) / sizeof(uint16_t)); const unsigned int BUFFER_SIZE = 65536; namespace TmwAthena { @@ -287,7 +290,7 @@ bool Network::messageReady() // TODO don't hard-code this single case if (msgId == SMSG_SERVER_VERSION_RESPONSE) len = 10; - else if (msgId < 0x220) + else if (msgId < packet_lengths_size) len = packet_lengths[msgId]; if (len == VAR) diff --git a/src/net/tmwa/network.h b/src/net/tmwa/network.h index 97c7970f..4df44b75 100644 --- a/src/net/tmwa/network.h +++ b/src/net/tmwa/network.h @@ -41,6 +41,7 @@ * the protocol accordingly. */ #define CLIENT_PROTOCOL_VERSION 1 +// 10 -> 11: SMSG_MAP_MASK DONE namespace TmwAthena { diff --git a/src/net/tmwa/playerhandler.cpp b/src/net/tmwa/playerhandler.cpp index 6ef669e4..5c57b8aa 100644 --- a/src/net/tmwa/playerhandler.cpp +++ b/src/net/tmwa/playerhandler.cpp @@ -152,6 +152,7 @@ PlayerHandler::PlayerHandler() SMSG_PLAYER_STAT_UPDATE_5, SMSG_PLAYER_STAT_UPDATE_6, SMSG_PLAYER_ARROW_MESSAGE, + SMSG_MAP_MASK, 0 }; handledMessages = _messages; @@ -512,6 +513,15 @@ void PlayerHandler::handleMessage(MessageIn &msg) } } break; + + case SMSG_MAP_MASK: + { + const int mask = msg.readInt32(); + msg.readInt32(); // unused + if (Map *map = Game::instance()->getCurrentMap()) + map->setMask(mask); + } + break; } } diff --git a/src/net/tmwa/protocol.h b/src/net/tmwa/protocol.h index 768d6061..e9ea84e8 100644 --- a/src/net/tmwa/protocol.h +++ b/src/net/tmwa/protocol.h @@ -213,6 +213,8 @@ static const int STORAGE_OFFSET = 1; #define SMSG_MVP 0x010c +#define SMSG_MAP_MASK 0x0226 + /********************************** * Packets from client to server * **********************************/ |