Ir para conteúdo
  • 0

[Resolvido] C++ TFS 1.3 docastspell suporte para a correção do codigo


epaminombas

Pergunta

O codigo funciona só que não respeita os parametros do spells.xml como uso de mana, range, cooldown e etc.

 

Preciso que determinados itens sejam atalhos para o uso das magias e que sejam como se fosse o proprio player falar a magia.

 

Lua Script

Code (Lua):
  1.  
  2. function onUse(player, words, param)
  3.         player:doCastSpell("Light Healing")
  4. end
  5.  

C++ Code

Code (C++):
  1.  
  2. int LuaScriptInterface::luaDoCastSpell(lua_State* L)
  3. {
  4.     //creature: doCastSpell("spellName")
  5.     Creature* creature = getUserdata<Creature>(L, 1);
  6.     if(!creature) {
  7.         lua_pushboolean(L, false);
  8.         return 1;
  9.     }
  10.  
  11.     const std::string& spellName = getString(L, 2);
  12.     InstantSpell* spell = g_spells->getInstantSpellByName(spellName);
  13.     if(!spell) {
  14.         lua_pushboolean(L, false);
  15.         return 1;
  16.     }
  17.  
  18.     Creature* target = creature->getAttackedCreature();
  19.     if(target)
  20.         spell->castSpell(creature, target);
  21.     else
  22.         spell->castSpell(creature, creature);
  23.  
  24.     lua_pushboolean(L, true);    
  25.  
  26.     return 1;
  27. }
  28.  
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0
  • Administrador

Minto, eu pensei que fosse outra coisa, mania de não ler direito, aweiuhaew. Enfim, muda teu código pra isso:

int LuaScriptInterface::luaDoCastSpell(lua_State* L)
{
    //creature: doCastSpell("spellName")
    Creature* creature = getUserdata<Creature>(L, 1);
    if(!creature) {
        lua_pushboolean(L, false);
        return 1;
    }
 
    std::string& spellName = getString(L, 2);
    InstantSpell* spell = g_spells->getInstantSpellByName(spellName);
    if(!spell) {
        lua_pushboolean(L, false);
        return 1;
    }
 
    if(Monster* monster = creature->getMonster()) {
        Creature* target = monster->getAttackedCreature();
        if(target)
            spell->castSpell(monster, target);
        else
            spell->castSpell(monster);
 
    	lua_pushboolean(L, true);   
        return 1;
    } else if(Player* player = creature->getPlayer()) {
        if(spell->playerCastInstant(player, spellName)) {
    	    lua_pushboolean(L, true);    
            return 1;
        }
    }
    lua_pushboolean(L, false);   
    return 1;
}

 

Editado por PoRaI
Link para o comentário
Compartilhar em outros sites

  • 0
24 minutos atrás, PoRaI disse:

O problema não é nessa parte do código, rs.

Mas é essa a função que eu adicionei o erro deveria estar nela e não em outro lugar sei la haha

 

Qual parte do código precisa ser alterada para essa função funcionar corretamente?

Link para o comentário
Compartilhar em outros sites

  • 0

Deu esse erro:

luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const char [1]' em 'std::string &'

Link para o comentário
Compartilhar em outros sites

  • 0
  • Administrador
18 minutos atrás, epaminombas disse:

Deu esse erro:

luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const char [1]' em 'std::string &'

Editei o código lá em cima, não tinha visto que tinha postado aqui, kk. 

Link para o comentário
Compartilhar em outros sites

  • 0

eu coloquei o codigo acima e deu o mesmo erro:

 

\luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const char [1]' em 'std::string &'

luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const std::string' em 'std::string &'
\luascript.cpp(9967): note: Conversão perde qualificadores

Link para o comentário
Compartilhar em outros sites

  • 0
  • Administrador
1 hora atrás, epaminombas disse:

eu coloquei o codigo acima e deu o mesmo erro:

 

\luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const char [1]' em 'std::string &'

luascript.cpp(9967): error C2664: 'bool InstantSpell::playerCastInstant(Player *,std::string &)': não é possível converter um argumento 2 de 'const std::string' em 'std::string &'
\luascript.cpp(9967): note: Conversão perde qualificadores

editei dnv, testa aí. 

Link para o comentário
Compartilhar em outros sites

  • 0

Caraca Funcionou!!! Ele solta respeitando todos os detalhes do spells.xml, só tem um pequeno detalhe, ele não fala o nome da magia ao soltar ;( e nem diz you are exausted quando está com exausted só fica saindo a fumacinha

 

 

Muito obrigado mesmo! Se for possível ajustar o pequeno detalhe ajudaria muito!

Link para o comentário
Compartilhar em outros sites

  • 0
  • Administrador
int LuaScriptInterface::luaDoCastSpell(lua_State* L)
{
    //creature: doCastSpell("spellName")
    Creature* creature = getUserdata<Creature>(L, 1);
    if(!creature) {
        lua_pushboolean(L, false);
        return 1;
    }
 
    std::string& spellName = getString(L, 2);
    InstantSpell* spell = g_spells->getInstantSpellByName(spellName);
    if(!spell) {
        lua_pushboolean(L, false);
        return 1;
    }

    if(Monster* monster = creature->getMonster()) {
        Creature* target = monster->getAttackedCreature();
        if(target)
            spell->castSpell(monster, target);
        else
            spell->castSpell(monster);
 
    	lua_pushboolean(L, true);   
        return 1;
    } else if(Player* player = creature->getPlayer()) {
        if(spell->playerSpellCheck(player) && spell->playerCastInstant(player, spellName)) {
    	    lua_pushboolean(L, true);    
            return 1;
        }
    }
    lua_pushboolean(L, false);   
    return 1;
}

testa ae

Link para o comentário
Compartilhar em outros sites

  • 0

Deu um erro, luascript.cpp(9967): error C2248: 'Spell::playerSpellCheck': não é possível acessar protected membro declarado na classe 'Spell'

 

Mas eu analisei melhor e com o codigo anterior que você passou, os ajustes podem ser feitos via script da spell.

 

eu só adicionei antes do combat:execute isso: creature:say(Nomedamagia, TALKTYPE_MONSTER_SAY)

 

Agradeço muito sua ajuda!! Valeu mesmo o/

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...