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

Compiling canWalkThrough for OThire

login12

void newbie scripter()
Joined
Feb 26, 2011
Messages
164
Reaction score
24
Location
Brazil
Someone can help me how i can convert it for OThire ?
I want this for put when one character is on PROTECTION TILE, he can walk on players.

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

This part, on my player.cpp:
Code:
bool Player::canWalkthrough(const Creature* creature) const
{
    if(!creature->getPlayer()){
    return false;
  }

    if(creature->getPlayer()->hasSomeInvisibilityFlag()){
        return true;
    }

  return false;
}
 
Thanks for reply. I will try, but this dont make somebody enter inside of other guy in depot for exemple?
probably lol
could make a movement script for depot tiles though and just return false if there's a player on toposition
 
I try this:
Code:
bool Player::canWalkthrough(const Creature* creature) const
{
    if(!creature->getPlayer()){
    return false;
  }

    if(creature->getPlayer()->hasSomeInvisibilityFlag()){
        return true;
    }
    
    if(getPlayer()->getTile()->hasFlag(TILESTATE_PROTECTIONZONE)){
        return true;
    }

  return false;
}

and nothing, i registered it wrong?
 
yes you did it wrong
if(getPlayer()->getTile()->hasFlag(TILESTATE_PROTECTIONZONE))
you put getPlayer() instead of creature->getPlayer()
you can create a constant for player at the top that uses creature->getPlayer() so its shorter
Code:
bool Player::canWalkthrough(const Creature* creature) const
{
   const Player* player = creature->getPlayer()
   if(!player)
    return false;
 
    if(player->hasSomeInvisibilityFlag() || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE))
        return true;
}
 
yes you did it wrong

you put getPlayer() instead of creature->getPlayer()
you can create a constant for player at the top that uses creature->getPlayer() so its shorter
Code:
bool Player::canWalkthrough(const Creature* creature) const
{
   const Player* player = creature->getPlayer()
   if(!player)
    return false;
 
    if(player->hasSomeInvisibilityFlag() || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE))
        return true;
}

I tryid exactly how u did, but in game no works.
Maybe can be on tile.cpp too? i found this;
Code:
        else if(const Player* player = creature->getPlayer()){
            if(creatures && !creatures->empty() && !hasBitSet(FLAG_IGNOREBLOCKCREATURE, flags)){
                for(CreatureVector::const_iterator cit = creatures->begin(); cit != creatures->end(); ++cit){
                    if(!player->canWalkthrough(*cit)){
                        return RET_NOTPOSSIBLE;
                    }
                }
            }
 
Back
Top