EP

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

Por epaminombas, 07 de jun. de 2018 em Resolvidos

12
4.1k
epaminombasE
07 de junho de 2018 às 14:02

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.  
PoRaIP
11 de junho de 2018 às 18:19

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

epaminombasE
11 de junho de 2018 às 18:47
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?

PoRaIP
11 de junho de 2018 às 20:33
Melhor resposta

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 Junho 13 por PoRaI

epaminombasE
13 de junho de 2018 às 18:50

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 &'

PoRaIP
13 de junho de 2018 às 19:09
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. 

epaminombasE
13 de junho de 2018 às 19:16

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

PoRaIP
13 de junho de 2018 às 20:20
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í. 

epaminombasE
13 de junho de 2018 às 22:00

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!

PoRaIP
14 de junho de 2018 às 02:11
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

Editado Junho 14 por PoRaI

epaminombasE
14 de junho de 2018 às 09:02

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/

2 meses depois...
StigalS
14 de agosto de 2018 às 12:57
A questão neste tópico de suporte foi respondida e/ou o autor do tópico resolveu o problema. Este tópico está fechado e foi movido para Suporte - Resolvidos. Se você tiver outras dúvidas, crie um novo tópico.