diff --git a/src/enums.h b/src/enums.h index 9c8cf1ffe8..4c43613195 100644 --- a/src/enums.h +++ b/src/enums.h @@ -158,6 +158,8 @@ enum SpellGroup_t : uint8_t SPELLGROUP_CRIPPLING = 6, SPELLGROUP_FOCUS = 7, SPELLGROUP_ULTIMATESTRIKES = 8, + + SPELLGROUP_UNKNOWN = 255 // when no group set in revscript }; enum SpellType_t : uint8_t diff --git a/src/luascript.cpp b/src/luascript.cpp index e50774e163..8b98738191 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -16375,7 +16375,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) tfs::lua::pushBoolean(L, true); } else if (lua_isstring(L, 2)) { group = stringToSpellGroup(tfs::lua::getString(L, 2)); - if (group != SPELLGROUP_NONE) { + if (group != SPELLGROUP_UNKNOWN) { spell->setGroup(group); } else { std::cout << "[Warning - Spell::group] Unknown group: " << tfs::lua::getString(L, 2) << '\n'; @@ -16397,7 +16397,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) tfs::lua::pushBoolean(L, true); } else if (lua_isstring(L, 2) && lua_isstring(L, 3)) { primaryGroup = stringToSpellGroup(tfs::lua::getString(L, 2)); - if (primaryGroup != SPELLGROUP_NONE) { + if (primaryGroup != SPELLGROUP_UNKNOWN) { spell->setGroup(primaryGroup); } else { std::cout << "[Warning - Spell::group] Unknown primaryGroup: " << tfs::lua::getString(L, 2) << '\n'; @@ -16405,7 +16405,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) return 1; } secondaryGroup = stringToSpellGroup(tfs::lua::getString(L, 3)); - if (secondaryGroup != SPELLGROUP_NONE) { + if (secondaryGroup != SPELLGROUP_UNKNOWN) { spell->setSecondaryGroup(secondaryGroup); } else { std::cout << "[Warning - Spell::group] Unknown secondaryGroup: " << tfs::lua::getString(L, 3) diff --git a/src/spells.cpp b/src/spells.cpp index d10db155b2..73c96074d9 100644 --- a/src/spells.cpp +++ b/src/spells.cpp @@ -373,10 +373,19 @@ bool Spell::configureSpell(const pugi::xml_node& node) spellId = pugi::cast(attr.value()); } + if ((attr = node.attribute("aggressive"))) { + aggressive = booleanString(attr.as_string()); + } + + if (group == SPELLGROUP_NONE) { + group = (aggressive ? SPELLGROUP_ATTACK : SPELLGROUP_HEALING); + } + if ((attr = node.attribute("group"))) { std::string tmpStr = boost::algorithm::to_lower_copy(attr.as_string()); if (tmpStr == "none" || tmpStr == "0") { group = SPELLGROUP_NONE; + groupCooldown = 0; } else if (tmpStr == "attack" || tmpStr == "1") { group = SPELLGROUP_ATTACK; } else if (tmpStr == "healing" || tmpStr == "2") { @@ -390,7 +399,7 @@ bool Spell::configureSpell(const pugi::xml_node& node) } } - if ((attr = node.attribute("groupcooldown"))) { + if (group != SPELLGROUP_NONE && (attr = node.attribute("groupcooldown"))) { groupCooldown = pugi::cast(attr.value()); } @@ -398,6 +407,7 @@ bool Spell::configureSpell(const pugi::xml_node& node) std::string tmpStr = boost::algorithm::to_lower_copy(attr.as_string()); if (tmpStr == "none" || tmpStr == "0") { secondaryGroup = SPELLGROUP_NONE; + secondaryGroupCooldown = 0; } else if (tmpStr == "attack" || tmpStr == "1") { secondaryGroup = SPELLGROUP_ATTACK; } else if (tmpStr == "healing" || tmpStr == "2") { @@ -411,7 +421,7 @@ bool Spell::configureSpell(const pugi::xml_node& node) } } - if ((attr = node.attribute("secondarygroupcooldown"))) { + if (secondaryGroup != SPELLGROUP_NONE && (attr = node.attribute("secondarygroupcooldown"))) { secondaryGroupCooldown = pugi::cast(attr.value()); } @@ -491,14 +501,6 @@ bool Spell::configureSpell(const pugi::xml_node& node) pzLock = booleanString(attr.as_string()); } - if ((attr = node.attribute("aggressive"))) { - aggressive = booleanString(attr.as_string()); - } - - if (group == SPELLGROUP_NONE) { - group = (aggressive ? SPELLGROUP_ATTACK : SPELLGROUP_HEALING); - } - for (auto vocationNode : node.children()) { if (!(attr = vocationNode.attribute("name"))) { continue; @@ -551,7 +553,7 @@ bool Spell::playerSpellCheck(Player* player) const return false; } - if (player->hasCondition(CONDITION_SPELLGROUPCOOLDOWN, group) || + if ((group != SPELLGROUP_NONE && player->hasCondition(CONDITION_SPELLGROUPCOOLDOWN, group)) || player->hasCondition(CONDITION_SPELLCOOLDOWN, spellId) || (secondaryGroup != SPELLGROUP_NONE && player->hasCondition(CONDITION_SPELLGROUPCOOLDOWN, secondaryGroup))) { player->sendCancelMessage(RETURNVALUE_YOUAREEXHAUSTED); @@ -731,27 +733,29 @@ bool Spell::playerRuneSpellCheck(Player* player, const Position& toPos) return true; } +void Spell::addCooldowns(Player* player) const +{ + if (cooldown > 0) { + Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLCOOLDOWN, cooldown, 0, false, spellId); + player->addCondition(condition); + } + + if (group != SPELLGROUP_NONE && groupCooldown > 0) { + Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, groupCooldown, 0, false, group); + player->addCondition(condition); + } + + if (secondaryGroup != SPELLGROUP_NONE && secondaryGroupCooldown > 0) { + Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, secondaryGroupCooldown, 0, false, secondaryGroup); + player->addCondition(condition); + } +} + void Spell::postCastSpell(Player* player, bool finishedCast /*= true*/, bool payCost /*= true*/) const { if (finishedCast) { if (!player->hasFlag(PlayerFlag_HasNoExhaustion)) { - if (cooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLCOOLDOWN, - cooldown, 0, false, spellId); - player->addCondition(condition); - } - - if (groupCooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, - groupCooldown, 0, false, group); - player->addCondition(condition); - } - - if (secondaryGroupCooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, - secondaryGroupCooldown, 0, false, secondaryGroup); - player->addCondition(condition); - } + addCooldowns(player); } if (aggressive) { @@ -851,24 +855,7 @@ bool InstantSpell::playerCastInstant(Player* player, std::string& param) target = playerTarget; if (!target || target->isRemoved() || target->isDead()) { if (!casterTargetOrDirection) { - if (cooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLCOOLDOWN, - cooldown, 0, false, spellId); - player->addCondition(condition); - } - - if (groupCooldown > 0) { - Condition* condition = Condition::createCondition( - CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, groupCooldown, 0, false, group); - player->addCondition(condition); - } - - if (secondaryGroupCooldown > 0) { - Condition* condition = - Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, - secondaryGroupCooldown, 0, false, secondaryGroup); - player->addCondition(condition); - } + addCooldowns(player); player->sendCancelMessage(ret); g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF); @@ -915,23 +902,7 @@ bool InstantSpell::playerCastInstant(Player* player, std::string& param) ReturnValue ret = g_game.getPlayerByNameWildcard(param, playerTarget); if (ret != RETURNVALUE_NOERROR) { - if (cooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLCOOLDOWN, - cooldown, 0, false, spellId); - player->addCondition(condition); - } - - if (groupCooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, - groupCooldown, 0, false, group); - player->addCondition(condition); - } - - if (secondaryGroupCooldown > 0) { - Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLGROUPCOOLDOWN, - secondaryGroupCooldown, 0, false, secondaryGroup); - player->addCondition(condition); - } + addCooldowns(player); player->sendCancelMessage(ret); g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF); diff --git a/src/spells.h b/src/spells.h index 85374342ea..943e5d339f 100644 --- a/src/spells.h +++ b/src/spells.h @@ -148,7 +148,13 @@ class Spell : public BaseSpell } SpellGroup_t getGroup() const { return group; } - void setGroup(SpellGroup_t g) { group = g; } + void setGroup(SpellGroup_t g) + { + group = g; + if (group == SPELLGROUP_NONE) { + groupCooldown = 0; + } + } SpellGroup_t getSecondaryGroup() const { return secondaryGroup; } void setSecondaryGroup(SpellGroup_t g) { secondaryGroup = g; } @@ -185,6 +191,7 @@ class Spell : public BaseSpell bool playerSpellCheck(Player* player) const; bool playerInstantSpellCheck(Player* player, const Position& toPos); bool playerRuneSpellCheck(Player* player, const Position& toPos); + void addCooldowns(Player* player) const; std::map vocationSpellMap; diff --git a/src/tools.cpp b/src/tools.cpp index d950718c4f..4fe685e14d 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -1115,7 +1115,9 @@ int64_t OTSYS_TIME() SpellGroup_t stringToSpellGroup(const std::string& value) { std::string tmpStr = boost::algorithm::to_lower_copy(value); - if (tmpStr == "attack" || tmpStr == "1") { + if (tmpStr == "none" || tmpStr == "0") { + return SPELLGROUP_NONE; + } else if (tmpStr == "attack" || tmpStr == "1") { return SPELLGROUP_ATTACK; } else if (tmpStr == "healing" || tmpStr == "2") { return SPELLGROUP_HEALING; @@ -1125,7 +1127,7 @@ SpellGroup_t stringToSpellGroup(const std::string& value) return SPELLGROUP_SPECIAL; } - return SPELLGROUP_NONE; + return SPELLGROUP_UNKNOWN; } const std::vector& getShuffleDirections()