diff options
Diffstat (limited to 'src/net/manaserv/effecthandler.cpp')
-rw-r--r-- | src/net/manaserv/effecthandler.cpp | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/src/net/manaserv/effecthandler.cpp b/src/net/manaserv/effecthandler.cpp index 27db9b59..cc732794 100644 --- a/src/net/manaserv/effecthandler.cpp +++ b/src/net/manaserv/effecthandler.cpp @@ -21,21 +21,24 @@ #include "net/manaserv/effecthandler.h" -#include "beingmanager.h" +#include "actorspritemanager.h" #include "effectmanager.h" #include "log.h" +#include "gui/viewport.h" + #include "net/messagein.h" -#include "net/manaserv/protocol.h" +#include "net/manaserv/manaserv_protocol.h" namespace ManaServ { EffectHandler::EffectHandler() { - static const Uint16 _messages[] = { + static const uint16_t _messages[] = { GPMSG_CREATE_EFFECT_POS, GPMSG_CREATE_EFFECT_BEING, + GPMSG_SHAKE, 0 }; handledMessages = _messages; @@ -51,6 +54,9 @@ void EffectHandler::handleMessage(Net::MessageIn &msg) case GPMSG_CREATE_EFFECT_BEING: handleCreateEffectBeing(msg); break; + case GPMSG_SHAKE: + handleShake(msg); + break; default: break; } @@ -59,8 +65,8 @@ void EffectHandler::handleMessage(Net::MessageIn &msg) void EffectHandler::handleCreateEffectPos(Net::MessageIn &msg) { int id = msg.readInt16(); - Uint16 x = msg.readInt16(); - Uint16 y = msg.readInt16(); + uint16_t x = msg.readInt16(); + uint16_t y = msg.readInt16(); effectManager->trigger(id, x, y); } @@ -68,11 +74,43 @@ void EffectHandler::handleCreateEffectBeing(Net::MessageIn &msg) { int eid = msg.readInt16(); int bid = msg.readInt16(); - Being* b = beingManager->findBeing(bid); + Being* b = actorSpriteManager->findBeing(bid); if (b) effectManager->trigger(eid, b); else logger->log("Warning: CreateEffect called for unknown being #%d", bid); } +void EffectHandler::handleShake(Net::MessageIn &msg) +{ + int16_t intensityX = 0; + int16_t intensityY = 0; + float decay; + int duration; + + switch (msg.getUnreadLength()) + { + case 4: + intensityX = msg.readInt16(); + intensityY = msg.readInt16(); + viewport->shakeScreen(intensityX, intensityY); + break; + case 6: + intensityX = msg.readInt16(); + intensityY = msg.readInt16(); + decay = msg.readInt16() / 10000.0f; + viewport->shakeScreen(intensityX, intensityY, decay); + break; + case 8: + intensityX = msg.readInt16(); + intensityY = msg.readInt16(); + decay = msg.readInt16() / 10000.0f; + duration = msg.readInt16(); + viewport->shakeScreen(intensityX, intensityY, decay, duration); + break; + default: + logger->log("Warning: Received GPMSG_SHAKE message with unexpected length of %d bytes", msg.getUnreadLength()); + } +} + } // namespace ManaServ |