summaryrefslogtreecommitdiff
path: root/src/game-server
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2013-09-08 19:14:33 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2013-09-08 19:18:08 +0200
commit05fc955a3f8a03539088fa7569395434e29d90e8 (patch)
tree48a35f8f3bc68651bbe82cb15cc8488746334e64 /src/game-server
parentf1b7570131c328fcf549835a435ea6bfb4721721 (diff)
downloadmanaserv-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.cpp29
-rw-r--r--src/game-server/abilitycomponent.h7
-rw-r--r--src/game-server/abilitymanager.cpp2
-rw-r--r--src/game-server/abilitymanager.h3
-rw-r--r--src/game-server/actor.h3
-rw-r--r--src/game-server/gamehandler.cpp22
-rw-r--r--src/game-server/gamehandler.h2
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);