LO
programação

[TFS 0.3.6] Player::canWalkthrough

Por Lordbaxx, 01 de ago. de 2015 em Linguagens de Programação

fix
código
creature atravessa creature
beijo na bunda
23
6.7k
LordbaxxL
01 de agosto de 2015 às 21:10

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.

Editado Agosto 3 por Lordbaxx

TaigerT
02 de agosto de 2015 às 20:52

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

Editado Agosto 2 por Taiger

LordbaxxL
02 de agosto de 2015 às 22:34

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());
}
TaigerT
03 de agosto de 2015 às 21:38

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.

LordbaxxL
04 de agosto de 2015 às 00:07

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.

lessaL
04 de agosto de 2015 às 15:54

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.

TaigerT
04 de agosto de 2015 às 17:29

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.

 

Editado Agosto 4 por Taiger

3 semanas depois...
Storm NightS
19 de agosto de 2015 às 00:38

Poe pra poder usar em pvp

3 meses depois...
4sharedddd4
28 de novembro de 2015 às 04:24

tambem queria pra poder usar em pvp :(

LordbaxxL
28 de novembro de 2015 às 17:23

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());
}

Editado Novembro 28 por Lordbaxx

2 meses depois...
zNegativeXZ
06 de janeiro de 2016 às 22:50

Fiquei meses procurando vlw ai man REP++

Luga03L
06 de janeiro de 2016 às 22:58

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

2 semanas depois...
JosegvbJ
16 de janeiro de 2016 às 19:02

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

zNegativeXZ
16 de janeiro de 2016 às 22:22

 

 

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

 

Não cara não tem ;(

2 meses depois...
Storm NightS
19 de março de 2016 às 01:26

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!!

 

Editado Março 19 por GBs