• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ playerxplayer walkthrough on player.cpp

Laloomega

Mega-War ❤
Joined
Feb 28, 2011
Messages
101
Solutions
3
Reaction score
54
Solution
Do you want players to never walk thru each other?

Replace:
C++:
bool Player::canWalkthrough(const Creature* creature) const
{
    if (group->access || creature->isInGhostMode()) {
        return true;
    }
 
    const Player* player = creature->getPlayer();
    const Monster* monster = creature->getMonster();
    const Npc* npc = creature->getNpc();
    if (monster) {
        if (!monster->isPet()) {
            return false;
        }
        return true;
    }
 
    if (player) {
        const Tile* playerTile = player->getTile();
        if (!playerTile || (!playerTile->hasFlag(TILESTATE_NOPVPZONE) && !playerTile->hasFlag(TILESTATE_PROTECTIONZONE) && player->getLevel() >...
Do you want players to never walk thru each other?

Replace:
C++:
bool Player::canWalkthrough(const Creature* creature) const
{
    if (group->access || creature->isInGhostMode()) {
        return true;
    }
 
    const Player* player = creature->getPlayer();
    const Monster* monster = creature->getMonster();
    const Npc* npc = creature->getNpc();
    if (monster) {
        if (!monster->isPet()) {
            return false;
        }
        return true;
    }
 
    if (player) {
        const Tile* playerTile = player->getTile();
        if (!playerTile || (!playerTile->hasFlag(TILESTATE_NOPVPZONE) && !playerTile->hasFlag(TILESTATE_PROTECTIONZONE) && player->getLevel() > static_cast<uint32_t>(g_config.getNumber(ConfigManager::PROTECTION_LEVEL)) && g_game.getWorldType() != WORLD_TYPE_NO_PVP)) {
            return true;
        }
 
        const Item* playerTileGround = playerTile->getGround();
        if (!playerTileGround || !playerTileGround->hasWalkStack()) {
            return false;
        }
 
        Player* thisPlayer = const_cast<Player*>(this);
        if ((OTSYS_TIME() - lastWalkthroughAttempt) > 2000) {
            thisPlayer->setLastWalkthroughAttempt(OTSYS_TIME());
            return false;
        }
 
        if (creature->getPosition() != lastWalkthroughPosition) {
            thisPlayer->setLastWalkthroughPosition(creature->getPosition());
            return false;
        }
 
        thisPlayer->setLastWalkthroughPosition(creature->getPosition());
        return false;
    } else if (npc) {
        const Tile* tile = npc->getTile();
        const HouseTile* houseTile = dynamic_cast<const HouseTile*>(tile);
        return (houseTile != nullptr);
    }
 
    return false;
}
 
bool Player::canWalkthroughEx(const Creature* creature) const
{
    if (group->access) {
        return false;
    }
 
    const Monster* monster = creature->getMonster();
    if (monster) {
        if (!monster->isPet()) {
            return false;
        }
        return true;
    }
 
    const Player* player = creature->getPlayer();
    const Npc* npc = creature->getNpc();
    if (player) {
        const Tile* playerTile = player->getTile();
        return playerTile && (playerTile->hasFlag(TILESTATE_NOPVPZONE) || playerTile->hasFlag(TILESTATE_PROTECTIONZONE) || player->getLevel() <= static_cast<uint32_t>(g_config.getNumber(ConfigManager::PROTECTION_LEVEL)) || g_game.getWorldType() == WORLD_TYPE_NO_PVP);
    } else if (npc) {
        const Tile* tile = npc->getTile();
        const HouseTile* houseTile = dynamic_cast<const HouseTile*>(tile);
        return (houseTile != nullptr);
    } else {
        return false;
    }
 
}
with:
C++:
bool Player::canWalkthrough(const Creature* creature) const
{
    if (group->access || creature->isInGhostMode()) {
        return true;
    }
 
    const Monster* monster = creature->getMonster();
    const Npc* npc = creature->getNpc();
    if (monster) {
        if (!monster->isPet()) {
            return false;
        }
        return true;
    }
 
    if (npc) {
        const Tile* tile = npc->getTile();
        const HouseTile* houseTile = dynamic_cast<const HouseTile*>(tile);
        return (houseTile != nullptr);
    }
 
    return false;
}
 
bool Player::canWalkthroughEx(const Creature* creature) const
{
    if (group->access) {
        return false;
    }
 
    const Monster* monster = creature->getMonster();
    if (monster) {
        if (!monster->isPet()) {
            return false;
        }
        return true;
    }
 
    const Npc* npc = creature->getNpc();
    if (npc) {
        const Tile* tile = npc->getTile();
        const HouseTile* houseTile = dynamic_cast<const HouseTile*>(tile);
        return (houseTile != nullptr);
    } else {
        return false;
    }
}
Make sure it works fine with stacking on stairs/ladders.
 
Solution
Back
Top