Postado Dezembro 6, 2014 10 anos Primeira Spell: É uma spell de buff, que consiste em aumentar o HP (em 30%) e o MP (em 20%) no caster. Problema: Se a spell é utilizada novamente, o player perde o HP e MP se estiver full HP/MP. Por exemplo: Um char com 100 de HPmax e 100 de MPmax usa essa spell, fica com 130 de HPmax e 120 de MPmax (Enquanto a vida e mana atuais, logo após usar a spell permanecem ambas em 100) Porém se esse jogador encher o HP e MP para 130 e 120 e reutilizar a spell, seu HP e MP atuais, voltam a 100, enquanto seus valores máximos continuam em 130 e 120. Script: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREWORK_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 1800000)setConditionParam(condition, CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 130) setConditionParam(condition, CONDITION_PARAM_STAT_MAXMANAPERCENT, 120) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Segunda Spell: É uma spell de regen e dispel, que recupera HP e MP por segundo além de tirar alguns efeitos negativos. Problema: São valores fixos que determinam a quantidade de HP e MP recuperados por segundo, e queria que esses valores fossem variáveis, baseados no magiclevel do caster. Script: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_FIRE) local combat_2 = createCombatObject() setCombatParam(combat_2, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat_2, COMBAT_PARAM_DISPEL, CONDITION_POISON) local combat_3 = createCombatObject() setCombatParam(combat_3, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat_3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) local combat_4 = createCombatObject() setCombatParam(combat_4, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat_4, COMBAT_PARAM_DISPEL, CONDITION_ENERGY) local combat_5 = createCombatObject() setCombatParam(combat_5, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat_5, COMBAT_PARAM_DISPEL, CONDITION_CURSE) local condition = createConditionObject(CONDITION_REGENERATION) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setConditionParam(condition, CONDITION_PARAM_TICKS, 6000)setConditionParam(condition, CONDITION_PARAM_MANAGAIN, 15) setConditionParam(condition, CONDITION_PARAM_MANA, 1000) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setConditionParam(condition, CONDITION_PARAM_TICKS, 6000)setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, 10) setConditionParam(condition, CONDITION_PARAM_HEALTH, 1000) setCombatCondition(combat, condition) function onCastSpell(cid, var) doCombat(cid,combat_2,var) doCombat(cid,combat_3,var) doCombat(cid,combat_4,var) doCombat(cid,combat_5,var) return doCombat(cid,combat,var) end Editado Dezembro 6, 2014 10 anos por Hoad (veja o histórico de edições)
Postado Dezembro 7, 2014 10 anos Autor UP (passaram-se 24h desde a criação e está sem respostas ;-; ) Editado Dezembro 7, 2014 10 anos por Hoad (veja o histórico de edições)
Postado Dezembro 7, 2014 10 anos case STAT_MAXHITPOINTS: stats[i] = static_cast<int32_t>(player->getMaxHealth() * ((statsPercent[i] - 100) / 100.f)); break; case STAT_MAXMANAPOINTS: stats[i] = static_cast<int32_t>(player->getMaxMana() * ((statsPercent[i] - 100) / 100.f)); break; for (int32_t i = STAT_FIRST; i <= STAT_LAST; ++i) { if (stats[i]) { needUpdateStats = true; player->setVarStats((stats_t)i, stats[i]); } } if (needUpdateStats) { player->sendStats(); } case STAT_MAXHITPOINTS: { if (getHealth() > getMaxHealth()) { Creature::changeHealth(getMaxHealth() - getHealth()); } else { g_game.addCreatureHealth(this); } break; } case STAT_MAXMANAPOINTS: { if (getMana() > getMaxMana()) { Creature::changeMana(getMaxMana() - getMana()); } break; } O que acontece no seu script, em ordem cronológica, são esses códigos. Como pode ver em: if (getHealth() > getMaxHealth()) { Creature::changeHealth(getMaxHealth() - getHealth()); } Toda vez que você muda o max health, ele checa se seu health atualmente é maior que seu max health. Por exemplo, você tem 100/100 de hp, usa a spell fica com 100/130. Se você usar a spell de novo, agora 130/130, ele vai ver: 130 > 100? Sim, muda health em (100 - 130); //-30 Então você volta a ter 100 de hp com 130 de max hp. "Por que não sobrepõe um em cima do outro? Por exemplo, uso uma vez 100/130, e outra vez e fico 100/169." Porquê esse buff é aplicado a seu max health real (100) e não seu max health aparente (130). ------------ Sobre sua segunda dúvida. Sim, dá para fazer isso. Pelo menos no TFS 1.0~1.1, basta você setar a condição dentro de onCastSpell. Exemplo: [..] function onCastSpell(cid, var) [...] setConditionParam(condition, CONDITION_PARAM_MANAGAIN, getPlayerLevel(cid)) setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, getPlayerLevel(cid)) [...] end [...] representa todo seu código, excluindo as duas linhas que foram movidas para onCastSpell. Editado Dezembro 7, 2014 10 anos por elwyn (veja o histórico de edições)
Postado Dezembro 7, 2014 10 anos Autor Elwyn, primeiramente muito obrigado por me responder e explicar. Sobre a primeira resposta, tive dificuldade para entender os 3 primeiros códigos, porem entendi o quarto e pelo que foi dito, entendi que para que o buff nao funcione exponencialmente, tem que acontecer isso. E sobre a segunda, eu fiz isso, e a skill resolveu não regenarar nada ASOSOAOSAK mas é pq meu tfs é mais antigo :x
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.