Ir para conteúdo

Projeto Tutores de Scripting


Killua

Posts Recomendados

a função setCombatCallback e doCombat, tu tem que duplicar também, nao pode colocar como parametro

 

 

setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

doCombat( cid, combat1, numberToVariant(cid) )

doCombat( cid, combat2, numberToVariant(cid) )

Link para o comentário
Compartilhar em outros sites

addEvent(func, time, ...)

'func' >> função a ser executada

'time' >> tempo em miliseconds ate a execução

'...' >> parametros da função 'func'

 

Exemplo

addEvent(doCombat, 1000, cid, combat1, numberToVariant(cid))

 

Porém, quando usa funções que dependem de cid, nãoo é bom executá-las direto, pois caso a criatura morra ou deslogue, esse cid perde referencia e da erro na função

faça sempre uso de uma função auxiliar

 

function aux(...)
    if isCreature( ({...})[1] ) then
        doCombat(...)
    end
end
 
addEvent(aux, time, cid, combat1, numberToVariant(cid))

 

Obs.: Acho que acabei te complicando na aux, enfim ela de um modo mais simples:

function aux(cid, combat, variant)
    if isCreature( cid ) then
        doCombat(cid, combat, variant)
    end
end

O primeiro modo consome menos memoria, mas é menos claro, mas use o que preferir

Link para o comentário
Compartilhar em outros sites

Peso é um atributo, para atributos se usam as funções:

doItemSetAttribute(uid, key, value)
getItemAttribute(uid, key)

A key é "weight"

 

Quanto a sua sugestão, eu discordo completamente, um tutorial generalizado ficaria enorme, alem de trabalhoso para se fazer ainda teria pouca aceitação, é melhor duvidas pois você sabe que o que está explicando é do interesse do usuario

De mais a mais, tem diversos topicos espalhados com tutorial, scripts pronto(da pra aprender vendo como sao feitos) e etc

 

Dalvorsn testei o que você min disse funcionou em parte, coloco para alterar dou look no item e ele continua como estava antes, porém coloco para verificar com a função que disse, ponho para exibir e aparece o valor alterado, mas o peso mesmo não está alterando fiz o teste com char.

function onUse(cid, item, frompos, item2, topos)
	doItemSetAttribute(item.uid, "weight", 200)
	doPlayerSendTextMessage(cid, 22, getItemAttribute(item.uid, "weight"))
end

Estou usando dessa maneira, também tentei sem aspas, mas continua do mesmo jeito.

Link para o comentário
Compartilhar em outros sites

 

Dalvorsn testei o que você min disse funcionou em parte, coloco para alterar dou look no item e ele continua como estava antes, porém coloco para verificar com a função que disse, ponho para exibir e aparece o valor alterado, mas o peso mesmo não está alterando fiz o teste com char.

function onUse(cid, item, frompos, item2, topos)
	doItemSetAttribute(item.uid, "weight", 200)
	doPlayerSendTextMessage(cid, 22, getItemAttribute(item.uid, "weight"))
end

Estou usando dessa maneira, também tentei sem aspas, mas continua do mesmo jeito.

Entao provavelmente o sistema pega o peso pelo id, ai so nas sources mesmo, ver como e feito e alterar, mas tem que balancear se vale a pena ser feito

Link para o comentário
Compartilhar em outros sites

Entao provavelmente o sistema pega o peso pelo id, ai so nas sources mesmo, ver como e feito e alterar, mas tem que balancear se vale a pena ser feito

Boa noite,

getItemRWInfo(uid) não conseguiria obter o weight não?

Abraços.

 

~Duvida

Olá,

Então, estou com um servidor 9.6 usando TFS 0.3.7 a questão é: O market não cria offer, nem de buy nem de sell.

O market consegue ver os itens que eu tenho dentro do DEPOT, mas não consegue criar ofertas, alguma ideia?

Abraços.

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

Dalvorsn eu fiz e consegui tem como ponhar agora para quando pegar o attack ficar saindo igual o veneno do poison mas como ice ? tentei mudar ali CONDITION_POISON PARA CONTIDION_ICE mas não funciona.. REP + já por ter ensinado.

Link para o comentário
Compartilhar em outros sites

Bom, tudo bem??

Então senhores tutores, tenho uma dúvida pra vocês ;DD

 

No vocations.xml existe o wandDamage, que fala o quanto vai multiplicar o atk da wand (que fica em weapons.xml).. Eu gostaria de conseguir mudar esse multiplicador de acordo com a quantidade de vezes que uso um item em uma wand.. Vai ser tipo um upgrade, mas quero fazer outros usos disso, quero fazer primeiro esse script para servir de base para outros.. A coisa principal que preciso, é algum jeito de alterar o wandDamage quando certo item é equipado...

 

Eu estava pensando em criar um movement de equip e deequip pra cada wand/rod e checar um action id na wand, que irá definir quanto o wandDamage será modificado.. Mas como eu altero o wandDamage em si?

Por exemplo:

Sou um sorcerer e tenho como definição o wandDamage 1.0
Quando eu usar o item que eu definir em uma wand, ela irá alterar esse wandDamage quando eu estiver usando essa wand, ou seja, quando eu usar o item, vai ser como se eu tivesse wandDamage = 1.2, se usar o item que defini na wand novamente, mudará pra 1.4 e assim por diante.. E ao desequipar essa wand, o multiplicador volta para 1.0

 

Eu ja vi alguns scripts que aumenta o atk da wand dando um dano extra pra cada ataque, mas isso é muito lento, afinal o script todo é executado a cada ataque da wand/rod.. Imagina um servidor com 200 players atacando simultaneamente.. iria lagar muito..

 

Alguem consegue pensar em um jeito de fazer isso? Se existir uma função que altera o wandDamage atual do player, meus problemas estariam resolvidos hehe

Link para o comentário
Compartilhar em outros sites

heeee, galera no meu projeto to com uma ideia mais nem sei oq que fazer da onde começar etc, se puderem ajudar agradeço

Preciso de um sistema de assim

quando o jogador vai local e fala com um NPC (Obs: não tenho o NPC Também vo precisa da ajuda de vocês para afze ele)

o NPC fala (bem vindo (Jogador nome do jogador) Fale egg para gerar seu OVO ou Receber De Pokémon certo ae o jogador fala ai o NPC fala que é pro tal jogador vim daqui um tanto de horas mais o menos umas 2 horas para pega seu ovo, certo depois das 2 horas ele chega lá e fala "hi" e o NPC fala "egg" Para gera seu ovo ou "receber" para pega seu ovo ai se tiver passado as 2 horas o NPC entrega o OVO para ele de um poke aleatorio e se ele fala egg o NPC fala que ele não pode gerar mais um ovo e fala o tempo restante para o ele recerbe o ovo que ele gero, certo e depois que ele receber o ovo so depois de 1 semana que pode gerar outro ovo )

Galera se puderem me ajudar agradeço Ok

Vlw mesmo estão afzendo um otimo Trabalho aqui!

Link para o comentário
Compartilhar em outros sites

Bom, tudo bem??

 

Então senhores tutores, tenho uma dúvida pra vocês ;DD

 

No vocations.xml existe o wandDamage, que fala o quanto vai multiplicar o atk da wand (que fica em weapons.xml).. Eu gostaria de conseguir mudar esse multiplicador de acordo com a quantidade de vezes que uso um item em uma wand.. Vai ser tipo um upgrade, mas quero fazer outros usos disso, quero fazer primeiro esse script para servir de base para outros.. A coisa principal que preciso, é algum jeito de alterar o wandDamage quando certo item é equipado...

 

Eu estava pensando em criar um movement de equip e deequip pra cada wand/rod e checar um action id na wand, que irá definir quanto o wandDamage será modificado.. Mas como eu altero o wandDamage em si?

 

Por exemplo:

 

Sou um sorcerer e tenho como definição o wandDamage 1.0

Quando eu usar o item que eu definir em uma wand, ela irá alterar esse wandDamage quando eu estiver usando essa wand, ou seja, quando eu usar o item, vai ser como se eu tivesse wandDamage = 1.2, se usar o item que defini na wand novamente, mudará pra 1.4 e assim por diante.. E ao desequipar essa wand, o multiplicador volta para 1.0

 

Eu ja vi alguns scripts que aumenta o atk da wand dando um dano extra pra cada ataque, mas isso é muito lento, afinal o script todo é executado a cada ataque da wand/rod.. Imagina um servidor com 200 players atacando simultaneamente.. iria lagar muito..

 

Alguem consegue pensar em um jeito de fazer isso? Se existir uma função que altera o wandDamage atual do player, meus problemas estariam resolvidos hehe

Nao tem funçao lua que alteram as variaveis que guardam esses dados, sendo assim para fazer o que quer ou deve fazer diretamente nas sources, mais precisamente na classe Vocation.

 

# vocation.h

 

        float getMultiplier(multiplier_t type) const {return formulaMultipliers[type];}
        void setMultiplier(multiplier_t type, float v) {formulaMultipliers[type] = v;}

 

Porém cuidado, se alterar a variavel, ela será alterada para todos os players cuja vocation seja a mesma de quem tu alterou. Pois esse multiplicador não é do player, como tu disse e sim da vocação.

O damage da wand por exemplo é definido aqui:

 

# weapons.cpp

 

int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const
{
    float multiplier = 1.0f;
    if(Vocation* vocation = player->getVocation())
        multiplier = vocation->getMultiplier(MULTIPLIER_WAND);

    int32_t maxValue = (int32_t)(maxChange * multiplier);
    if(maxDamage)
    {
        player->sendCritical();
        return -maxValue;
    }

    int32_t minValue = (int32_t)(minChange * multiplier);
    return random_range(-minValue, -maxValue, DISTRO_NORMAL);
}

 

Ele calcula baseado na vocação, se alterar isso vai alterar pra todas as vocações, então o que te sugiro é o seguinte, crie um multipliers na classe player, onde lá sim você pode alterá-lo a vontade, pois será individual de cada player.

O que precisa fazer é praticamente só copiar o que está no vocations referente ao multipliers para o player, dai essa função acima ficaria assim:

 

int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const
{
    float baseMultiplier = 1.0f;
    if(Vocation* vocation = player->getVocation())
        baseMultiplier = vocation->getMultiplier(MULTIPLIER_WAND);
    float multiplier = baseMultiplier * player->getMultiplier(MULTIPLIER_WAND);

    int32_t maxValue = (int32_t)(maxChange * multiplier);
    if(maxDamage)
    {
        player->sendCritical();
        return -maxValue;
    }

    int32_t minValue = (int32_t)(minChange * multiplier);
    return random_range(-minValue, -maxValue, DISTRO_NORMAL);
}

 

Isso se quiser continuar usando também o multipliers base da vocação, que me pareceu sua intenção

Link para o comentário
Compartilhar em outros sites

Sim mano, é mais ou menos isso que eu queria..

 

Outra coisa que pensei foi guardar o wandDamage no banco de dados, e carregar por lá.. mas a cada ataque teria um get no banco de dados + modificação na source né?

Cara, só de ter que recompilar o meu distro eu já fico com o pé atrás de fazer isso.. Você não pensa em nenhuma outra gambiarra que poderia aumentar o ataque da wand sem fazer uma chamada ao script por cada ataque não? E sem utilizar o wandDamage...

 

E calma.. O que você fez no script foi simplesmente criar uma nova variável para definir o novo multiplicador, deixando a base como o valor do vocations.xml, certo? Ai você carrega o novo multiplicador do objeto player, que terei criado um novo multiplicador, ai sim cria o multiplicador final para assim definir o dano.. E os getter e setters, eu vou ter que criar manualmente na classe player?

 

E mas uma pergunta.. Como eu irei alterar esse multiplicador do player via lua? Vou ter que criar um novo método de setPlayerMultiplier? Não sou muito experiente com modificações em sources..

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

Sim mano, é mais ou menos isso que eu queria..

 

Outra coisa que pensei foi guardar o wandDamage no banco de dados, e carregar por lá.. mas a cada ataque teria um get no banco de dados + modificação na source né?

 

Cara, só de ter que recompilar o meu distro eu já fico com o pé atrás de fazer isso.. Você não pensa em nenhuma outra gambiarra que poderia aumentar o ataque da wand sem fazer uma chamada ao script por cada ataque não? E sem utilizar o wandDamage...

 

E calma.. O que você fez no script foi simplesmente criar uma nova variável para definir o novo multiplicador, deixando a base como o valor do vocations.xml, certo? Ai você carrega o novo multiplicador do objeto player, que terei criado um novo multiplicador, ai sim cria o multiplicador final para assim definir o dano.. E os getter e setters, eu vou ter que criar manualmente na classe player?

 

E mas uma pergunta.. Como eu irei alterar esse multiplicador do player via lua? Vou ter que criar um novo método de setPlayerMultiplier? Não sou muito experiente com modificações em sources..

Sim e exatamente isso, nao precisa ter medo de mecher nas sources, faça so um backup por segurança e pronto. Ou trabalhe com subversions tipo github e etc, o qt creator tem suporte a isso no proprio pc, e bom tambem.

 

Bem, sem alterar as sources o unico modo que vejo e no onStatsChange da creaturescritps, mas nao e bem o que tu queria tu pegaria o damage final ja, alteraria ele, faria o dano manual no script e retornaria false para callback.

Link para o comentário
Compartilhar em outros sites

Entendo.. Mano, nesse feriado agora vou sentar e olhar isso direitinho.. Mas teria como vc me explicar mais ou menos como funciona as classes e métodos do player? Por exemplo, eu necessito criar getter e setter pra essa nova variável que eu criar, certo? Mas onde eu vou utilizar ela pra criar uma função que, pelo lua, me deixe pegar esse valor ou "setar" esse valor? Eu sempre quis entender essas sources do TFS, mas como é muito código, eu nunca tive a coragem de começar a tentar.. Deve ser tantas classes, tantos métodos.. Fora as classes utilizadas em outras classes... Me dá até medo kkkkkkkk

Link para o comentário
Compartilhar em outros sites

Entendo.. Mano, nesse feriado agora vou sentar e olhar isso direitinho.. Mas teria como vc me explicar mais ou menos como funciona as classes e métodos do player? Por exemplo, eu necessito criar getter e setter pra essa nova variável que eu criar, certo? Mas onde eu vou utilizar ela pra criar uma função que, pelo lua, me deixe pegar esse valor ou "setar" esse valor? Eu sempre quis entender essas sources do TFS, mas como é muito código, eu nunca tive a coragem de começar a tentar.. Deve ser tantas classes, tantos métodos.. Fora as classes utilizadas em outras classes... Me dá até medo kkkkkkk

 

Ue, tu declara o metodo na classe, através de uma instancia dela chama.

Exemplo, declaro em player.h a seguinte função( em public ):

 

     void faznada() { std::cout << "executando faz nada"<< std::endl; }

 

Dai a partir do momento que declarou ela em na classe, tu ja pode chamar pelas instancias.

 

int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const
{
     player->faznada();
     ///  resto do code
Link para o comentário
Compartilhar em outros sites

Não, você não entendeu minha dúvida.. Tipo, eu sei que o getter e setter eu declaro o metodo lá na classe player.. Mas como eu vou fazer pra, através de uma action em lua, modificar esse multiplicador que tá no objeto player? Vai estar como atributo da meta tabela "cid" que as funções em lua recebem?

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

×
×
  • Criar Novo...