[TFS 0.3.6] Player::canWalkthrough

  • 1
  • 2

Lordbaxx

Imperium Project
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 01/07/13Posts: 521

Bom muita gente procura esse código, e ao olhar na internet só vi disponível em um fórum porém incompleto então decidi pegar o código e postá-lo com oque faltava.



Esse código é utilizado para que um player passe por outro player evitando tantas reclamações por "trapar" caminho ou algo parecido, vamos lá!



Ah mais uma coisa, para funcionar é preciso que o servidor esteja em NON-PVP.



OBS: Testado em tfs 0.3.6 somente!



Player.cpp procure por:



bool Player::canWalkthrough(const Creature* creature) const




Substitua todo o código por:

bool Player::canWalkthrough(const Creature* creature) const
{
if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() ||
(creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster())))
return true;

const Player* player = creature->getPlayer();
if(!player)
return false;

if((((g_game.getWorldType() == WORLD_TYPE_NO_PVP &&
player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() &&
player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground) &&
(!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)
|| player->getAccess() <= getAccess()))
return true;

return (player->isGhost() && getGhostAccess() < player->getGhostAccess())
|| (isGhost() && getGhostAccess() > player->getGhostAccess());
}





Depois vá em const.h e procure por:




PlayerCustomFlag_CanWearAllAddons, //2^23 = 8388608



E em baixo coloque:




PlayerCustomFlag_IsWalkable, //2^24 = 16777216
PlayerCustomFlag_CanWalkthrough, //2^25 = 33554433




Provavelmente em muitas sources do tfs 0.3.6, dê não exatamente um erro mais um aviso no player.cpp na função:




void Player::updateInventoryWeight()



Se o aviso ocorrer substitua a função citada acima por essa:




void Player::updateInventoryWeight()
{
inventoryWeight = 0.00;

if(!hasFlag(PlayerFlag_HasInfiniteCapacity)){
for(int i = SLOT_FIRST; i < SLOT_LAST; ++i){
Item* item = getInventoryItem((slots_t)i);
if(item){
inventoryWeight += item->getWeight();
}
}
}
}




Só utilize o código acima se ocorrer o "warning/aviso" sobre a função.


Abraço.



Os créditos ficam até o momento só ao Bruno Minervino e a fireelement.

Qualquer outro envolvido será creditado.

LOGO OFICIAL.png

Taiger

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 02/07/07Posts: 1140Gênero: Masculino

Perfeito manow, funcionou certinho, mas tive que fazer o ultimo passo pq estava dando aviso e não compilava.

Eu estava precisando muito desse código, uma duvida, no caso estou usando um poketibia, e se eu criar a area de dar boost nos pokemons os players não poderam passar pelos outros para nao serem roubados na maquina de boost, como eu faço para nessa area de boost desativar esse sistema? Sera que se eu colocar tile pvp os players nao irao pasar uns pelos outros?

 

Parabens rep+

 

dSa3X5.gif

Lordbaxx

Imperium Project
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 01/07/13Posts: 521

Dá pra você utilizar a tag walkStack no id do tile no items.xml.. Exemplo:

 

 

 <attribute key="walkStack" value="0" />

 

 

Mas antes você precisa modificar mais algumas coisas nas sources:

 

items.cpp procure:

 

 

 moveable = true;

 

Troque por:

 

 

moveable = walkStack = true;

 

ainda em items.cpp procure:

 

 

    else if(tmpStrValue == "transformto")
            {
                if(readXMLInteger(itemAttributesNode, "value", intValue))
                    it.transformToFree = intValue;
            }

 

 

Logo embaixo coloque:

 

 

            else if(tmpStrValue == "walkstack")
            {
                if(readXMLInteger(itemAttributesNode, "value", intValue))
                    it.walkStack = (intValue != 0);
            }

 

items.h procure:

 

 lookThrough,

 

troque por:

 

 lookThrough, walkStack,

 

 

Na função canWalkThrough no player.cpp troque por:

 

 bool Player::canWalkthrough(const Creature* creature) const
{
    if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() ||
        (creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster())))
        return true;

    const Player* player = creature->getPlayer();
    if(!player)
        return false;

    if((((g_game.getWorldType() == WORLD_TYPE_NO_PVP &&
        player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() &&
        player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground &&
        Item::items[player->getTile()->ground->getID()].walkStack) && (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)
        || player->getAccess() <= getAccess()))
        return true;

    return (player->isGhost() && getGhostAccess() < player->getGhostAccess())
        || (isGhost() && getGhostAccess() > player->getGhostAccess());
}

LOGO OFICIAL.png

Taiger

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 02/07/07Posts: 1140Gênero: Masculino

funcionou, com um erro bobo, no piso onde nao pode passar um pelo outro funcionou de boa, mais ao sair deste piso um dos chars nao pode mais passar por cima do outro, relogando volta ao normal.

 

mais mesmo assim para mim ja ta mais que bom, tu é zica vlw mesmo manow.

 

rep+

 

Quando puder posta um tuto de adicionar duel, nick e clan system que vou ser teu fã kk :)

To parando com pda e mexendo no pokegod base pfield.

Lordbaxx

Imperium Project
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 01/07/13Posts: 521

funcionou, com um erro bobo, no piso onde nao pode passar um pelo outro funcionou de boa, mais ao sair deste piso um dos chars nao pode mais passar por cima do outro, relogando volta ao normal.

 

mais mesmo assim para mim ja ta mais que bom, tu é zica vlw mesmo manow.

 

rep+

 

Quando puder posta um tuto de adicionar duel, nick e clan system que vou ser teu fã kk :)

To parando com pda e mexendo no pokegod base pfield.

Disponha.. Quanto aos sistemas citados, clãn system já tem no fórum, os demais eu posto outra hora, utilizando a função que o caotic postou para o Nick.

LOGO OFICIAL.png

lessa

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 09/07/10Posts: 59Char no Tibia: Usp Lippe

Os servidores com a versão 8.54 se vc colocar no pvp eles já tem essa função o legal seria se o player também pode se passar pelo pokemon sumonado do player. Como no pxg.

wfeehlz.png

 

Nunca foi tão fácil jogar Pokémon!

Taiger

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 02/07/07Posts: 1140Gênero: Masculino

Os servidores com a versão 8.54 se vc colocar no pvp eles já tem essa função o legal seria se o player também pode se passar pelo pokemon sumonado do player. Como no pxg.

Cara eu testei aqui e o meu funcionou tb com sumons de player, ainda tenho de fazer mais testes para ver se tem alguma falha, mais a principio funcionou de boa.

 

Storm Night

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 06/05/15Posts: 11Gênero: Masculino

Poe pra poder usar em pvp

4sharedddd

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 05/10/13Posts: 51

tambem queria pra poder usar em pvp :(

Lordbaxx

Imperium Project
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 01/07/13Posts: 521

Para usar em modo pvp é bem simples ao invés de usar o primeiro código que citei acima, utilize este:

bool Player::canWalkthrough(const Creature* creature) const
{
    if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() ||
        (creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster())))
        return true;
 
    const Player* player = creature->getPlayer();
    if(!player)
        return false;
 
    if((((g_game.getWorldType() == WORLD_TYPE_PVP &&
        player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() &&
        player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground) &&
        (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)
        || player->getAccess() <= getAccess()))
        return true;
 
    return (player->isGhost() && getGhostAccess() < player->getGhostAccess())
        || (isGhost() && getGhostAccess() > player->getGhostAccess());
}

LOGO OFICIAL.png

zNegativeX

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 30/10/15Posts: 34

Fiquei meses procurando vlw ai man REP++

Luga03

Gabriel Lucena :D
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 14/04/15Posts: 956Gênero: Masculino

Teria como fazer para apenas certas vocações, poderem fazer isto? se puder poderia colocar pra adicionar as vocações no config.lua?

Hello! How are you? It's fine? 

 

Okay, so you like my helps? if yes, then do you can like my post, give-me a reputation, you can't?

 

Good morning for everyone! And have a good day!

Josegvb

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 23/09/12Posts: 1041Gênero: Masculino

afff é td nas sourcers ;/ tem como usar em servidor sem sources n? :(

zNegativeX

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 30/10/15Posts: 34

 

 

afff é td nas sourcers ;/ tem como usar em servidor sem sources n? :(

 

Não cara não tem ;(

Storm Night

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 06/05/15Posts: 11Gênero: Masculino

Desculpe - me reviver o tópico, mas eu preciso muito de ajuda.

 

Não estou conseguindo usar nenhum item nos slots.

 

-- edit --

Arrumei o erro, mas ta dando [Warning - Weapons::registerEvent] Duplicate registered item with id: 0

 

&

 

Tem como fz aql tag de walkstack em lua n? pq é a modificação disso na source que esta dando este duplicate...

Poderia ser uma action ou um movement.

 

Por favor me ajude o mais rapido possivel. Agradeço!!

 

  • 1
  • 2