Portal SAMP
[Ajuda] Objeto não grudando no veiculo - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Objeto não grudando no veiculo (/showthread.php?tid=5055)



Objeto não grudando no veiculo - ANDREX - 16/07/2025

Ola galera criei esse script para ao usar o comando /aov aparecer a lista de objetos e eu clicar e escolher o objeto a ser criado e ser attached no veiculo o problema e que não sei porq os objetos não estão attachando no veiculo pois ao editar o objeto e finalizar usando a função response final o objeto não gruda no veiculo da forma que eu quero ele fica solto e eu posso sair com o veículo e ele fica ali solto já tentei de tudo pra ver oq de errado cometi por isso peço ajuda a vcs mais experientes 

Código:
//criado por ANDREX
#include <a_samp>
#include <zcmd>
#include <sscanf>
#include <mSelection>

new attachList = mS_INVALID_LISTID;
new playerVehicleObject[MAX_PLAYERS];

public OnGameModeInit()
{
    attachList = LoadModelSelectionMenu("Veh.txt");
    return 1;
}

CMD:aov(playerid, params[])
{
    if (!IsPlayerInAnyVehicle(playerid))
    {
        SendClientMessage(playerid, 0xFF0000FF, "[ERRO] Você precisa estar em um veículo.");
        return 1;
    }

    ShowModelSelectionMenu(playerid, attachList, "Escolha um objeto para anexar");
    return 1;
}

CMD:rov(playerid, params[])
{
    if (IsValidPlayerObject(playerid, playerVehicleObject[playerid]))
    {
        DestroyPlayerObject(playerid, playerVehicleObject[playerid]);
        playerVehicleObject[playerid] = INVALID_OBJECT_ID;
        SendClientMessage(playerid, 0x00FF00FF, "[INFO] Objeto removido.");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF, "[ERRO] Nenhum objeto para remover.");
    }
    return 1;
}

public OnPlayerModelSelection(playerid, response, listid, modelid)
{
    if (listid == attachList)
    {
        if (!response)
        {
            SendClientMessage(playerid, 0xAAAAAAFF, "[INFO] Menu cancelado.");
            return 1;
        }

        if (!IsPlayerInAnyVehicle(playerid))
        {
            SendClientMessage(playerid, 0xFF0000FF, "[ERRO] Você saiu do veículo!");
            return 1;
        }

        // Criar o objeto exatamente na posição do jogador
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);

        new objid = CreatePlayerObject(playerid, modelid, x, y, z, 0.0, 0.0, 0.0);
        playerVehicleObject[playerid] = objid;

        EditPlayerObject(playerid, objid);
        SendClientMessage(playerid, 0x00FF00FF, "[INFO] Modo de edição ativado.");
    }
    return 1;
}
forward public OnPlayerEditPlayerObject(playerid, playerobject, objectid, response,
    Float:fX, Float:fY, Float:fZ,
    Float:fRotX, Float:fRotY, Float:fRotZ);
public OnPlayerEditPlayerObject(playerid, playerobject, objectid, response,
    Float:fX, Float:fY, Float:fZ,
    Float:fRotX, Float:fRotY, Float:fRotZ)
{
    if (!IsValidPlayerObject(playerid, objectid)) return 1;

    switch (response)
    {
        case EDIT_RESPONSE_FINAL:
        {
            if (!IsPlayerInAnyVehicle(playerid))
            {
                DestroyPlayerObject(playerid, objectid);
                playerVehicleObject[playerid] = INVALID_OBJECT_ID;
                SendClientMessage(playerid, 0xFF0000FF, "[ERRO] Você saiu do veículo.");
                return 1;
            }

            new vehicleid = GetPlayerVehicleID(playerid);

            new Float:vehX, Float:vehY, Float:vehZ;
            GetVehiclePos(vehicleid, vehX, vehY, vehZ);

            new Float:offsetX = fX - vehX;
            new Float:offsetY = fY - vehY;
            new Float:offsetZ = fZ - vehZ;

            AttachPlayerObjectToVehicle(playerid, objectid, vehicleid, offsetX, offsetY, offsetZ, fRotX, fRotY, fRotZ);

            SendClientMessage(playerid, 0x00FF00FF, "[INFO] Objeto fixado ao veículo com sucesso.");
            return 1;
        }

        case EDIT_RESPONSE_CANCEL:
        {
            DestroyPlayerObject(playerid, objectid);
            playerVehicleObject[playerid] = INVALID_OBJECT_ID;
            SendClientMessage(playerid, 0xFF0000FF, "[INFO] Edição cancelada.");
            return 1;
        }
    }
    return 1;
}



RE: Objeto não grudando no veiculo - White_Blue - 21/07/2025

Isso ocorre porque o callback `OnPlayerEditPlayerObject` simplesmente não existe nativamente e portanto nesse contexto é inútil, já que não é acionada em nenhum momento no seu script.

A edição de objetos (incluindo player objects) é controlada pela callback `OnPlayerEditObject`, a única diferença é que, no caso de player objects, utiliza-se o parâmetro playerobject.

Além disso, é importante lembrar que objetos player possuem colisão até serem attachados ao veículo. Infelizmente, até onde eu sei, não há como desabilitar essa colisão ou contornar essa limitação de forma nativa. Por isso, recomendo que você reverta o dano do veículo enquanto o jogador estiver editando o objeto para evitar que o veículo seja danificado ou destruído durante a edição do objeto.

Eis um exemplo de correção (meio apressado, mas deve funcionar): https://pastebin.com/yvBbUvd8