• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

TFS 1.2 Parase new walk crashing server

Lopaskurwa

Well-Known Member
Joined
Oct 6, 2017
Messages
936
Solutions
2
Reaction score
57
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);
}
 

Similar threads

Back
Top