Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Pessoal criei uma spell com o efeito GHOST, funciona perfeitamente porém se o player estiver em PARTY, ele é removido automaticamente dela. Tentei solucionar indo em PARTY.CPP e adicionando o seguinte parâmetro na função "bool Party::leave(Player* player)":

 

Spoiler

    if(player->isGhost())
        return false;

 

Com isso consegui que não remova a PARTY quando o player usar a magia, porém ocasionou outro problema que mesmo se o player deslogar ou morrer estando no modo GHOST da magia ele não perde a PARTY, e ainda por cima se outro player da PARTY deslogar ou morrer nesse período em que o player que estava de GHOST estiver deslogado o servidor crasha...

 

Acho que se adicionar uma verificação para que o player esteja logado nessa parte "if(player->isGhost())" ficaria perfeito, porém eu procurei e não achei, alguém poderia me ajudar com essa parte ?

 

O tópico usado para criar essa spell foi esse do @LeoTKhttps://tibiaking.com/forums/topic/96803-system-ghost-complementação-sem-debug/

Link para o post
Compartilhar em outros sites

Este tópico foi movido para a seção de Suporte Otserv Alternativo

 

 

 

 

 

                                                                                                                                                     tumblr_nwmv2z4VEM1ujiquxo1_100.gif.2db64bb36f0f565e68ff2a90cb98f439.gif.59f4c4cf234d2f6906621cac0553a862.gif

https://github.com/italoxxx1

 

Link para o post
Compartilhar em outros sites

Manda a função completa.

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Link para o post
Compartilhar em outros sites

PARTY.CPP:

Spoiler

bool Party::leave(Player* player)
{
    if(!isPlayerMember(player) && player != leader)
        return false;
    
    if(player->isGhost())
        return false;

    bool missingLeader = false;
    if(leader == player)
    {
        if(!memberList.empty())
        {
            if(memberList.size() == 1 && inviteList.empty())
                missingLeader = true;
            else
                passLeadership(memberList.front());
        }
        else
            missingLeader = true;
    }

    //since we already passed the leadership, we remove the player from the list
    PlayerVector::iterator it = std::find(memberList.begin(), memberList.end(), player);
    if(it != memberList.end())
        memberList.erase(it);

    it = std::find(inviteList.begin(), inviteList.end(), player);
    if(it != inviteList.end())
        inviteList.erase(it);

    player->setParty(NULL);
    player->sendClosePrivate(CHANNEL_PARTY);

    player->sendTextMessage(MSG_INFO_DESCR, "Você saiu da party.");
    player->sendPlayerIcons(player);

    updateSharedExperience();
    updateIcons(player);
    clearPlayerPoints(player);

    char buffer[105];
    sprintf(buffer, "%s deixou a party.", player->getName().c_str());

    broadcastMessage(MSG_INFO_DESCR, buffer);
    if(missingLeader || canDisband())
        disband();

    return true;
}

 

SPELL:

Spoiler

function talk_ghost(cid)

if not isCreature(cid) then return true end

if getPlayerStorageValue(cid, 137884) == 3 then
setPlayerGroupId(cid, 3)
else
if getPlayerStorageValue(cid, 137884) < 1 then
setPlayerGroupId(cid, 1)
end
end

doCreatureExecuteTalkAction(cid, "!ghost", TRUE)
local cidposi = {x = getCreaturePos(cid).x, y = getCreaturePos(cid).y, z = getCreaturePos(cid).z}

end

function onCastSpell(cid, var)

setPlayerGroupId(cid, 2)

local efeito = {x = getCreaturePos(cid).x + 1, y = getCreaturePos(cid).y, z = getCreaturePos(cid).z}
doSendMagicEffect(efeito, 217)
doCreatureExecuteTalkAction(cid, "!ghost", TRUE)
addEvent(talk_ghost, 5000, cid)

return true
end

 

Editado por Standard (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

@Standard Manda como ficou a spell também.

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Link para o post
Compartilhar em outros sites

O player é removido pq o player para de existir a todos,

Oq fizeram ai é uma gambiarra das brabas q se fosse vc nao usaria e procuraria fazer corretamente. As funções que da o "ghost" e volta são 

sendCreatureDisappear(creature, creature->getTile()->getClientIndexOfThing(this, creature)); // desaparece
sendCreatureAppear(creature); // aparece

o exemplo de uso dela ta la em Player::sendCreatureChangeVisible que vc usou, o motivo do crash deve ser pq ao desloga ele vai retirar party e como a um player inexistente vai da esse crash. Vai da mais trabalho ajeita isso resolvendo os próximos problemas q aparecer doq fazer algo pratico exatamente pra oq quer.

 

@edit

 o desaparecimento é individual, em game.cpp tem um loop da sendCreatureChangeVisible, entao poderia fazer melhor nao ficando pros membros da party. Mas caso queira continuar usando dessa forma, da pra colocar umas verificação pra remover da party, fazer checa de player existente em tudo antes de executa... e por ai vai.

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites

@Naze@WooX Consegui resolver, obrigado por tentarem ajudar !

 

O problema não estava na função "leaveparty", e sim no própio comando do GHOST, pesquisei mais a fundo e vi que o própio comando GHOST estava programado para remover a PARTY, portanto para corrigir é só ir TALKACTIONS.CPP e remover essas 3 linhas:

 

Spoiler

        player->clearPartyInvitations();
        if(player->getParty())
            player->getParty()->leave(player);

 

Link para o post
Compartilhar em outros sites
Em 16/10/2020 em 16:29, Standard disse:

@Naze@WooX Consegui resolver, obrigado por tentarem ajudar !

 

O problema não estava na função "leaveparty", e sim no própio comando do GHOST, pesquisei mais a fundo e vi que o própio comando GHOST estava programado para remover a PARTY, portanto para corrigir é só ir TALKACTIONS.CPP e remover essas 3 linhas:

 

  Ocultar conteúdo

        player->clearPartyInvitations();
        if(player->getParty())
            player->getParty()->leave(player);

 

Vlw tava com msm erro

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo