• 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+ push player from opposite side of stackpos

theduck

Member
Joined
Dec 6, 2018
Messages
246
Reaction score
20
C++:
void Game::playerMoveThing(uint32_t playerId, const Position& fromPos,
                           uint16_t spriteId, uint8_t fromStackPos, const Position& toPos, uint8_t count)
{
    Player* player = getPlayerByID(playerId);
    if (!player) {
        return;
    }

    uint8_t fromIndex = 0;
    if (fromPos.x == 0xFFFF) {
        if (fromPos.y & 0x40) {
            fromIndex = fromPos.z;
        } else {
            fromIndex = static_cast<uint8_t>(fromPos.y);
        }
    } else {
        fromIndex = fromStackPos;
    }

    Thing* thing = internalGetThing(player, fromPos, fromIndex, 0, STACKPOS_MOVE);
    if (!thing) {
        player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE);
        return;
    }

    if (Creature* movingCreature = thing->getCreature()) {
        Tile* tile = map.getTile(toPos);
        if (!tile) {
            player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE);
            return;
        }

        if (Position::areInRange<1, 1, 0>(movingCreature->getPosition(), player->getPosition())) {
            SchedulerTask* task = createSchedulerTask(1000,
                                  std::bind(&Game::playerMoveCreatureByID, this, player->getID(),
                                              movingCreature->getID(), movingCreature->getPosition(), tile->getPosition()));
            player->setNextActionTask(task);
        } else {
            playerMoveCreature(player, movingCreature, movingCreature->getPosition(), tile);
        }
    } else if (thing->getItem()) {
        Cylinder* toCylinder = internalGetCylinder(player, toPos);
        if (!toCylinder) {
            player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE);
            return;
        }

        playerMoveItem(player, fromPos, spriteId, fromStackPos, toPos, count, thing->getItem(), toCylinder);
    }
}

currently when pulling the player on a stack is pulling the first player on the floor would like to switch to the last player on the stack would be possible
 
Last edited by a moderator:
Back
Top