• 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.2 Parase new walk crashing server

Lopaskurwa

Active Member
Joined
Oct 6, 2017
Messages
873
Solutions
2
Reaction score
49
Getting crash because of Parse newWalk not sure exactly how it happening
C++:
void ProtocolGame::parseNewWalking(NetworkMessage& msg)
{
    uint32_t playerWalkId = msg.get<uint32_t>();
    int32_t predictiveWalkId = msg.get<int32_t>(); // extension for proxy system, currently not used
    Position playerPosition = msg.getPosition(); // local player position before moving, including prewalk
    uint8_t flags = msg.getByte(); // 0x01 - prewalk, 0x02 - autowalk

    uint16_t numdirs = msg.get<uint16_t>();
    if (numdirs == 0 || numdirs > 4096) {
        return;
    }

    std::forward_list<Direction> path;
    for (uint16_t i = 0; i < numdirs; ++i) {
        uint8_t rawdir = msg.getByte();
        auto before_end = path.before_begin();
        for (auto& _ : path) {
            if (_) {
                //remove warning
            }
            ++before_end;
        }
        switch (rawdir) {
        case 1: path.insert_after(before_end, DIRECTION_EAST); break;
        case 2: path.insert_after(before_end, DIRECTION_NORTHEAST); break;
        case 3: path.insert_after(before_end, DIRECTION_NORTH); break;
        case 4: path.insert_after(before_end, DIRECTION_NORTHWEST); break;
        case 5: path.insert_after(before_end, DIRECTION_WEST); break;
        case 6: path.insert_after(before_end, DIRECTION_SOUTHWEST); break;
        case 7: path.insert_after(before_end, DIRECTION_SOUTH); break;
        case 8: path.insert_after(before_end, DIRECTION_SOUTHEAST); break;
        default: break;
        }
    }


    uint32_t playerId = player->getID();
    g_dispatcher.addTask(createTask(std::bind(&ProtocolGame::parseNewWalk, getThis(), playerWalkId, predictiveWalkId, playerId, playerPosition, flags, path)));
    
}
 
Still facing this crash
C++:
void ProtocolGame::parseNewWalk(uint32_t playerWalkId, int32_t predictiveWalkId, uint32_t playerId, Position playerPosition, uint8_t flags, std::forward_list<Direction> path)
{
    if (!otclientV8)
        return;

    bool preWalk = flags & 0x01;
    Position destination = getNextPosition(*(path.begin()), playerPosition); //points to this code line
    Tile* tile = g_game.map.getTile(destination);
    if(!tile || tile == nullptr) {
        return;
    }
    if (preWalk && predictiveWalkId < walkMatrix.get(destination)) {
        walkId += 1;
        sendWalkId();
        return;
    }

    if (playerWalkId < walkId) {
        // this walk has been sent before player received previous newCancelWalk, so it's invalid, ignore it
        return;
    }

    g_game.playerNewWalk(playerId, playerPosition, flags, path);
}
 
Back
Top