diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-09-08 19:14:33 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-09-08 19:18:08 +0200 |
commit | 05fc955a3f8a03539088fa7569395434e29d90e8 (patch) | |
tree | 48a35f8f3bc68651bbe82cb15cc8488746334e64 /src/game-server | |
parent | f1b7570131c328fcf549835a435ea6bfb4721721 (diff) | |
download | manaserv-05fc955a3f8a03539088fa7569395434e29d90e8.tar.gz manaserv-05fc955a3f8a03539088fa7569395434e29d90e8.tar.bz2 manaserv-05fc955a3f8a03539088fa7569395434e29d90e8.tar.xz manaserv-05fc955a3f8a03539088fa7569395434e29d90e8.zip |
Added support for direction based ability targets
I had to rearrange the protocol a bit in order to allow to keep the
related things together.
Diffstat (limited to 'src/game-server')
-rw-r--r-- | src/game-server/abilitycomponent.cpp | 29 | ||||
-rw-r--r-- | src/game-server/abilitycomponent.h | 7 | ||||
-rw-r--r-- | src/game-server/abilitymanager.cpp | 2 | ||||
-rw-r--r-- | src/game-server/abilitymanager.h | 3 | ||||
-rw-r--r-- | src/game-server/actor.h | 3 | ||||
-rw-r--r-- | src/game-server/gamehandler.cpp | 22 | ||||
-rw-r--r-- | src/game-server/gamehandler.h | 2 |
7 files changed, 65 insertions, 3 deletions
diff --git a/src/game-server/abilitycomponent.cpp b/src/game-server/abilitycomponent.cpp index c005635a..1ac82cdf 100644 --- a/src/game-server/abilitycomponent.cpp +++ b/src/game-server/abilitycomponent.cpp @@ -109,6 +109,7 @@ bool AbilityComponent::useAbilityOnBeing(Entity &user, int id, Entity *b) AbilityMap::iterator it = mAbilities.find(id); if (!abilityUseCheck(it)) return false; + AbilityValue &ability = it->second; if (ability.abilityInfo->target != AbilityManager::TARGET_BEING) @@ -141,6 +142,7 @@ bool AbilityComponent::useAbilityOnPoint(Entity &user, int id, int x, int y) AbilityMap::iterator it = mAbilities.find(id); if (!abilityUseCheck(it)) return false; + AbilityValue &ability = it->second; if (ability.abilityInfo->target != AbilityManager::TARGET_POINT) @@ -162,6 +164,33 @@ bool AbilityComponent::useAbilityOnPoint(Entity &user, int id, int x, int y) return true; } +bool AbilityComponent::useAbilityOnDirection(Entity &user, int id, + ManaServ::BeingDirection direction) +{ + AbilityMap::iterator it = mAbilities.find(id); + if (!abilityUseCheck(it)) + return false; + + AbilityValue &ability = it->second; + + if (ability.abilityInfo->target != AbilityManager::TARGET_DIRECTION) + return false; + + //tell script engine to cast the spell + Script *script = ScriptManager::currentState(); + script->prepare(ability.abilityInfo->useCallback); + script->push(&user); + script->push(direction); + script->push(ability.abilityInfo->id); + script->execute(user.getMap()); + + mLastUsedAbilityId = id; + mLastTargetDirection = direction; + user.getComponent<ActorComponent>()->raiseUpdateFlags( + UPDATEFLAG_ABILITY_ON_DIRECTION); + return true; +} + /** * Allows a character to perform a ability */ diff --git a/src/game-server/abilitycomponent.h b/src/game-server/abilitycomponent.h index 948d5ed3..5814a4ae 100644 --- a/src/game-server/abilitycomponent.h +++ b/src/game-server/abilitycomponent.h @@ -58,6 +58,8 @@ public: bool useAbilityOnBeing(Entity &user, int id, Entity *b); bool useAbilityOnPoint(Entity &user, int id, int x, int y); + bool useAbilityOnDirection(Entity &user, int id, + ManaServ::BeingDirection direction); bool giveAbility(int id, int currentMana = 0); bool giveAbility(const AbilityManager::AbilityInfo *info, @@ -80,8 +82,10 @@ public: // For informing clients int getLastUsedAbilityId() const; - const Point &getLastTargetPoint() const; + int getLastTargetBeingId() const; + const Point &getLastTargetPoint() const; + ManaServ::BeingDirection getLastUsedTargetDirection() const; private: bool abilityUseCheck(AbilityMap::iterator it); @@ -93,6 +97,7 @@ private: // Variables required for informing clients int mLastUsedAbilityId; Point mLastTargetPoint; + ManaServ::BeingDirection mLastTargetDirection; int mLastTargetBeingId; }; diff --git a/src/game-server/abilitymanager.cpp b/src/game-server/abilitymanager.cpp index 3e923800..c1401284 100644 --- a/src/game-server/abilitymanager.cpp +++ b/src/game-server/abilitymanager.cpp @@ -31,6 +31,8 @@ static AbilityManager::TargetMode getTargetByString(const std::string &str) return AbilityManager::TARGET_BEING; else if (strLower == "point") return AbilityManager::TARGET_POINT; + else if (strLower == "direction") + return AbilityManager::TARGET_DIRECTION; LOG_WARN("Unknown targetmode " << str << " assuming being."); return AbilityManager::TARGET_BEING; diff --git a/src/game-server/abilitymanager.h b/src/game-server/abilitymanager.h index 573db415..66249a40 100644 --- a/src/game-server/abilitymanager.h +++ b/src/game-server/abilitymanager.h @@ -35,7 +35,8 @@ public: enum TargetMode { TARGET_BEING, - TARGET_POINT + TARGET_POINT, + TARGET_DIRECTION, }; struct AbilityInfo diff --git a/src/game-server/actor.h b/src/game-server/actor.h index 80f6bbb0..e1110a17 100644 --- a/src/game-server/actor.h +++ b/src/game-server/actor.h @@ -39,7 +39,8 @@ enum UPDATEFLAG_HEALTHCHANGE = 32, UPDATEFLAG_EMOTE = 64, UPDATEFLAG_ABILITY_ON_POINT = 128, - UPDATEFLAG_ABILITY_ON_BEING = 256 + UPDATEFLAG_ABILITY_ON_BEING = 256, + UPDATEFLAG_ABILITY_ON_DIRECTION = 512, }; /** diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp index fe274ace..913abf80 100644 --- a/src/game-server/gamehandler.cpp +++ b/src/game-server/gamehandler.cpp @@ -257,6 +257,10 @@ void GameHandler::processMessage(NetComputer *computer, MessageIn &message) handleUseAbilityOnPoint(client, message); break; + case PGMSG_USE_ABILITY_ON_DIRECTION: + handleUseAbilityOnDirection(client, message); + break; + case PGMSG_ACTION_CHANGE: handleActionChange(client, message); break; @@ -683,6 +687,24 @@ void GameHandler::handleUseAbilityOnPoint(GameClient &client, MessageIn &message abilityComponent->useAbilityOnPoint(*client.character, abilityID, x, y); } +void GameHandler::handleUseAbilityOnDirection(GameClient &client, MessageIn &message) +{ + if (client.character->getComponent<BeingComponent>()->getAction() == DEAD) + return; + + const int abilityID = message.readInt8(); + const BeingDirection direction = (BeingDirection)message.readInt8(); + + const int publicId = + client.character->getComponent<ActorComponent>()->getPublicID(); + LOG_DEBUG("Character " << publicId + << " tries to use his ability " << abilityID); + auto *abilityComponent = client.character + ->getComponent<AbilityComponent>(); + abilityComponent->useAbilityOnDirection(*client.character, abilityID, + direction); +} + void GameHandler::handleActionChange(GameClient &client, MessageIn &message) { auto *beingComponent = client.character->getComponent<BeingComponent>(); diff --git a/src/game-server/gamehandler.h b/src/game-server/gamehandler.h index f4995497..fea40398 100644 --- a/src/game-server/gamehandler.h +++ b/src/game-server/gamehandler.h @@ -135,6 +135,8 @@ class GameHandler: public ConnectionHandler void handleUseAbilityOnBeing(GameClient &client, MessageIn &message); void handleUseAbilityOnPoint(GameClient &client, MessageIn &message); + void handleUseAbilityOnDirection(GameClient &client, MessageIn &message); + void handleActionChange(GameClient &client, MessageIn &message); void handleDirectionChange(GameClient &client, MessageIn &message); |