diff --git a/src/enums.h b/src/enums.h index a86127f..53c96ac 100644 --- a/src/enums.h +++ b/src/enums.h @@ -150,6 +150,8 @@ enum SpellGroup_t : uint8_t { SPELLGROUP_HEALING = 2, SPELLGROUP_SUPPORT = 3, SPELLGROUP_SPECIAL = 4, + + 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 1f1e945..7148cf8 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -16671,7 +16671,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) pushBoolean(L, true); } else if (isString(L, 2)) { group = stringToSpellGroup(getString(L, 2)); - if (group != SPELLGROUP_NONE) { + if (group != SPELLGROUP_UNKNOWN) { spell->setGroup(group); } else { std::cout << "[Warning - Spell::group] Unknown group: " << getString(L, 2) << std::endl; @@ -16693,7 +16693,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) pushBoolean(L, true); } else if (isString(L, 2) && isString(L, 3)) { primaryGroup = stringToSpellGroup(getString(L, 2)); - if (primaryGroup != SPELLGROUP_NONE) { + if (primaryGroup != SPELLGROUP_UNKNOWN) { spell->setGroup(primaryGroup); } else { std::cout << "[Warning - Spell::group] Unknown primaryGroup: " << getString(L, 2) << std::endl; @@ -16701,7 +16701,7 @@ int LuaScriptInterface::luaSpellGroup(lua_State* L) return 1; } secondaryGroup = stringToSpellGroup(getString(L, 3)); - if (secondaryGroup != SPELLGROUP_NONE) { + if (secondaryGroup != SPELLGROUP_UNKNOWN) { spell->setSecondaryGroup(secondaryGroup); } else { std::cout << "[Warning - Spell::group] Unknown secondaryGroup: " << getString(L, 3) << std::endl; diff --git a/src/spells.cpp b/src/spells.cpp index 39fe57d..2d95148 100644 --- a/src/spells.cpp +++ b/src/spells.cpp @@ -416,6 +416,7 @@ bool Spell::configureSpell(const pugi::xml_node& node) std::string tmpStr = asLowerCaseString(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") { @@ -761,24 +762,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) { @@ -878,20 +884,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); @@ -938,20 +931,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 dc38d5f..d55b32e 100644 --- a/src/spells.h +++ b/src/spells.h @@ -188,6 +188,9 @@ class Spell : public BaseSpell } void setGroup(SpellGroup_t g) { group = g; + if(group == SPELLGROUP_NONE) { + groupCooldown = 0; + } } SpellGroup_t getSecondaryGroup() const { return secondaryGroup; @@ -277,6 +280,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; VocSpellMap vocSpellMap; diff --git a/src/tools.cpp b/src/tools.cpp index 90b1413..45d4ecf 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -1244,7 +1244,9 @@ int64_t OTSYS_TIME() SpellGroup_t stringToSpellGroup(const std::string& value) { std::string tmpStr = asLowerCaseString(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; @@ -1254,7 +1256,7 @@ SpellGroup_t stringToSpellGroup(const std::string& value) return SPELLGROUP_SPECIAL; } - return SPELLGROUP_NONE; + return SPELLGROUP_UNKNOWN; } std::vector depotBoxes = { @@ -1300,4 +1302,4 @@ std::string getStatName(uint8_t id) default: return "unknown"; } -} \ No newline at end of file +}