Portal SAMP
[Ajuda] anexa um objeto ao jogador - 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] anexa um objeto ao jogador (/showthread.php?tid=4931)



anexa um objeto ao jogador - André Santos - 01/12/2024

fiz esse comando que ao usar ele procura a lista de objetos que fiz na scriptfiles objects.txt entao o problema e que nao esta attachando o objeto ao jogador acho q fiz algo errado e nao sei resolver a outra coisa e que ao editar o objeto coloco na coordenada em que quero mas nao salva o objeto fica como se tivesse um ponto fixo  acho que deve ser o problema aqui nisso if (response == EDIT_RESPONSE_FINAL)
    {
        // Atualiza a posição e rotação do objeto após edição
        AttachObjectToPlayer(playerid, objetos[playerid], fX, fY, fZ, fRotX, fRotY, fRotZ); nao sei como fazer para o objeto ser salvo no corpo do jogador na maneira em que eu editei e usei o  if (response == EDIT_RESPONSE_FINAL) talvez fiz algo errado e nao sei onde resolver




Código:
#include <a_samp>
#include <mSelection>
#include <zcmd>

new objectList = mS_INVALID_LISTID;  // ID da lista de seleção de objetos
new objetos[MAX_PLAYERS];      // Objeto temporário exibido para cada jogador

public OnFilterScriptInit()
{
    // Carrega a lista de objetos a partir de um arquivo "objects.txt"
    objectList = LoadModelSelectionMenu("objects.txt");
    return 1;
}

CMD:objetos(playerid, params[])
{
    // Mostra o menu para selecionar um objeto
    ShowModelSelectionMenu(playerid, objectList, "Selecionar Objeto");
    return 1;
}

public OnPlayerModelSelection(playerid, response, listid, modelid)
{
    if (response)
    {
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);

        // Cria o objeto e salva a referência no array
        objetos[playerid] = CreateObject(modelid, x, y, z, 0.0, 0.0, 0.0);

        // Edita o objeto (isso pode ser opcional dependendo do que você deseja fazer)
        EditObject(playerid, objetos[playerid]);

        // Anexa o objeto ao jogador com a rotação inicial
        AttachObjectToPlayer(playerid, objetos[playerid], x, y, z, 0.0, 0.0, 0.0);
    }
    return 1;
}

public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
    if (response == EDIT_RESPONSE_FINAL)
    {
        // Atualiza a posição e rotação do objeto após edição
        AttachObjectToPlayer(playerid, objetos[playerid], fX, fY, fZ, fRotX, fRotY, fRotZ);
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    // Remove o objeto temporário do jogador ao sair
    if (IsValidObject(objetos[playerid]))
    {
        DestroyObject(objetos[playerid]);
    }
    return 1;
}



RE: anexa um objeto ao jogador - strelo - 02/12/2024

Código PHP:
#include <a_samp>
#include <mSelection>
#include <zcmd>

new objectList mS_INVALID_LISTID;  // ID da lista de seleção de objetos
new objetos[MAX_PLAYERS];            // Objeto temporário exibido para cada jogador

// Offsets para objetos de jogadores
new Float:objectOffsets[MAX_PLAYERS][6]; // Armazena offsets (X, Y, Z, RotX, RotY, RotZ)

public OnFilterScriptInit()
{
    // Carrega a lista de objetos a partir de um arquivo "objects.txt"
    objectList LoadModelSelectionMenu("objects.txt");
    return 1;
}

CMD:objetos(playeridparams[])
{
    // Mostra o menu para selecionar um objeto
    ShowModelSelectionMenu(playeridobjectList"Selecionar Objeto");
    return 1;
}

public 
OnPlayerModelSelection(playeridresponselistidmodelid)
{
    if (response)
    {
        // Obtém a posição do jogador
        new Float:xFloat:yFloat:z;
        GetPlayerPos(playeridxyz);

        // Cria o objeto na posição do jogador
        objetos[playerid] = CreateObject(modelidxyz0.00.00.0);

        // Inicializa os offsets para o objeto
        objectOffsets[playerid][0] = 0.0// Offset X
        objectOffsets[playerid][1] = 0.0// Offset Y
        objectOffsets[playerid][2] = 0.5// Offset Z (altura inicial padrão)
        objectOffsets[playerid][3] = 0.0// Rotação X
        objectOffsets[playerid][4] = 0.0// Rotação Y
        objectOffsets[playerid][5] = 0.0// Rotação Z

        // Edita o objeto para o jogador ajustá-lo
        EditObject(playeridobjetos[playerid]);

        // Anexa o objeto ao jogador usando os offsets iniciais
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);
    }
    return 1;
}

public 
OnPlayerEditObject(playeridplayerobjectobjectidresponseFloat:fXFloat:fYFloat:fZFloat:fRotXFloat:fRotYFloat:fRotZ)
{
    if (response == EDIT_RESPONSE_FINAL)
    {
        // Obtém a posição do jogador
        new Float:playerXFloat:playerYFloat:playerZ;
        GetPlayerPos(playeridplayerXplayerYplayerZ);

        // Calcula os novos offsets baseados na posição do jogador
        objectOffsets[playerid][0] = fX playerX// Offset X
        objectOffsets[playerid][1] = fY playerY// Offset Y
        objectOffsets[playerid][2] = fZ playerZ// Offset Z
        objectOffsets[playerid][3] = fRotX;        // Rotação X
        objectOffsets[playerid][4] = fRotY;        // Rotação Y
        objectOffsets[playerid][5] = fRotZ;        // Rotação Z

        // Reanexa o objeto ao jogador com os novos offsets
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);
    }
    return 1;
}

public 
OnPlayerDisconnect(playeridreason)
{
    // Remove o objeto associado ao jogador ao desconectar
    if (IsValidObject(objetos[playerid]))
    {
        DestroyObject(objetos[playerid]);
        objetos[playerid] = INVALID_OBJECT_ID// Reseta o ID para evitar problemas futuros
    }
    return 1;




RE: anexa um objeto ao jogador - André Santos - 02/12/2024

(02/12/2024 18:47)strelo Escreveu:
Código PHP:
#include <a_samp>
#include <mSelection>
#include <zcmd>

new objectList mS_INVALID_LISTID;  // ID da lista de seleção de objetos
new objetos[MAX_PLAYERS];            // Objeto temporário exibido para cada jogador

// Offsets para objetos de jogadores
new Float:objectOffsets[MAX_PLAYERS][6]; // Armazena offsets (X, Y, Z, RotX, RotY, RotZ)

public OnFilterScriptInit()
{
    // Carrega a lista de objetos a partir de um arquivo "objects.txt"
    objectList LoadModelSelectionMenu("objects.txt");
    return 1;
}

CMD:objetos(playeridparams[])
{
    // Mostra o menu para selecionar um objeto
    ShowModelSelectionMenu(playeridobjectList"Selecionar Objeto");
    return 1;
}

public 
OnPlayerModelSelection(playeridresponselistidmodelid)
{
    if (response)
    {
        // Obtém a posição do jogador
        new Float:xFloat:yFloat:z;
        GetPlayerPos(playeridxyz);

        // Cria o objeto na posição do jogador
        objetos[playerid] = CreateObject(modelidxyz0.00.00.0);

        // Inicializa os offsets para o objeto
        objectOffsets[playerid][0] = 0.0// Offset X
        objectOffsets[playerid][1] = 0.0// Offset Y
        objectOffsets[playerid][2] = 0.5// Offset Z (altura inicial padrão)
        objectOffsets[playerid][3] = 0.0// Rotação X
        objectOffsets[playerid][4] = 0.0// Rotação Y
        objectOffsets[playerid][5] = 0.0// Rotação Z

        // Edita o objeto para o jogador ajustá-lo
        EditObject(playeridobjetos[playerid]);

        // Anexa o objeto ao jogador usando os offsets iniciais
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);
    }
    return 1;
}

public 
OnPlayerEditObject(playeridplayerobjectobjectidresponseFloat:fXFloat:fYFloat:fZFloat:fRotXFloat:fRotYFloat:fRotZ)
{
    if (response == EDIT_RESPONSE_FINAL)
    {
        // Obtém a posição do jogador
        new Float:playerXFloat:playerYFloat:playerZ;
        GetPlayerPos(playeridplayerXplayerYplayerZ);

        // Calcula os novos offsets baseados na posição do jogador
        objectOffsets[playerid][0] = fX playerX// Offset X
        objectOffsets[playerid][1] = fY playerY// Offset Y
        objectOffsets[playerid][2] = fZ playerZ// Offset Z
        objectOffsets[playerid][3] = fRotX;        // Rotação X
        objectOffsets[playerid][4] = fRotY;        // Rotação Y
        objectOffsets[playerid][5] = fRotZ;        // Rotação Z

        // Reanexa o objeto ao jogador com os novos offsets
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);
    }
    return 1;
}

public 
OnPlayerDisconnect(playeridreason)
{
    // Remove o objeto associado ao jogador ao desconectar
    if (IsValidObject(objetos[playerid]))
    {
        DestroyObject(objetos[playerid]);
        objetos[playerid] = INVALID_OBJECT_ID// Reseta o ID para evitar problemas futuros
    }
    return 1;

obg pela logica ta tudo correto compilando sem erros nenhum o unico problma ainda e que nao esta attachando o objeto no plaayer depois que coloco o objeto e tals posiciono no player tudo certinho mas na hora que finalizo o objeto fica no lugar correto mas ao andar o objeto continua la na cordenada correta que coloquei e o player pode andar ou mover sem o objeto ficar attached nele resumindo so falta o objeto grudar no player so isso mais nada tem algo incorreto no codigo que eu cometir?


RE: anexa um objeto ao jogador - strelo - 02/12/2024

Código PHP:
#include <a_samp>
#include <mSelection>
#include <zcmd>

new objectList mS_INVALID_LISTID;  // ID da lista de seleção de objetos
new objetos[MAX_PLAYERS];            // Objeto temporário exibido para cada jogador

// Offsets para objetos de jogadores
new Float:objectOffsets[MAX_PLAYERS][6]; // Armazena offsets (X, Y, Z, RotX, RotY, RotZ)

public OnFilterScriptInit()
{
    // Carrega a lista de objetos a partir de um arquivo "objects.txt"
    objectList LoadModelSelectionMenu("objects.txt");
    return 1;
}

CMD:objetos(playeridparams[])
{
    // Mostra o menu para selecionar um objeto
    ShowModelSelectionMenu(playeridobjectList"Selecionar Objeto");
    return 1;
}

public 
OnPlayerModelSelection(playeridresponselistidmodelid)
{
    if (response)
    {
        // Obtém a posição do jogador
        new Float:xFloat:yFloat:z;
        GetPlayerPos(playeridxyz);

        // Cria o objeto na posição do jogador
        objetos[playerid] = CreateObject(modelidxyz0.00.00.0);

        if (!IsValidObject(objetos[playerid]))
        {
            SendClientMessage(playerid, -1"Erro: Objeto não foi criado!");
            return 0;
        }

        // Inicializa os offsets para o objeto
        objectOffsets[playerid][0] = 0.0// Offset X
        objectOffsets[playerid][1] = 0.0// Offset Y
        objectOffsets[playerid][2] = 0.5// Offset Z (altura inicial padrão)
        objectOffsets[playerid][3] = 0.0// Rotação X
        objectOffsets[playerid][4] = 0.0// Rotação Y
        objectOffsets[playerid][5] = 0.0// Rotação Z

        // Anexa o objeto ao jogador usando os offsets iniciais
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);

        // Edita o objeto para o jogador ajustá-lo
        EditObject(playeridobjetos[playerid]);
    }
    return 1;
}

public 
OnPlayerEditObject(playeridplayerobjectobjectidresponseFloat:fXFloat:fYFloat:fZFloat:fRotXFloat:fRotYFloat:fRotZ)
{
    if (response == EDIT_RESPONSE_FINAL)
    {
        if (!IsValidObject(objectid))
        {
            SendClientMessage(playerid, -1"Erro: Objeto inválido!");
            return 0;
        }

        // Obtém a posição do jogador
        new Float:playerXFloat:playerYFloat:playerZ;
        GetPlayerPos(playeridplayerXplayerYplayerZ);

        // Calcula os novos offsets baseados na posição do jogador
        objectOffsets[playerid][0] = fX playerX// Offset X
        objectOffsets[playerid][1] = fY playerY// Offset Y
        objectOffsets[playerid][2] = fZ playerZ// Offset Z
        objectOffsets[playerid][3] = fRotX;        // Rotação X
        objectOffsets[playerid][4] = fRotY;        // Rotação Y
        objectOffsets[playerid][5] = fRotZ;        // Rotação Z

        // Reanexa o objeto ao jogador com os novos offsets
        AttachObjectToPlayer(playeridobjetos[playerid],
            objectOffsets[playerid][0], objectOffsets[playerid][1], objectOffsets[playerid][2],
            objectOffsets[playerid][3], objectOffsets[playerid][4], objectOffsets[playerid][5]);
    }
    else if (response == EDIT_RESPONSE_CANCEL)
    {
        SendClientMessage(playerid, -1"Edição do objeto foi cancelada.");
    }
    return 1;
}

public 
OnPlayerDisconnect(playeridreason)
{
    // Remove o objeto associado ao jogador ao desconectar
    if (IsValidObject(objetos[playerid]))
    {
        DestroyObject(objetos[playerid]);
        objetos[playerid] = INVALID_OBJECT_ID// Reseta o ID para evitar problemas futuros
    }
    return 1;