• Уважаемый Гость.
    - Прежде чем создать свою тему, пожалуйста, попробуй воспользоваться этим -> ПОИСКОМ !!!
    - После решения Вашего вопроса (проблемы) - нажмите "Лучший ответ", на сообщении, которое его решило. За игнорирование этого действия - Вы получите соответствующее предупреждение. Мы - стараемся Вам помочь. Уделите 10 секунд - чтобы нажать кнопку. (Если у Вас нет такой возможности - укажите в последнем своем сообщении какой ответ Вы считаете лучшим. Наши модераторы сделают это за Вас)
    ЗАПРЕЩЕНО:
    - Cоздавать темы с названиями "Помогите", "Плиз", "Ошибка", "Не могу найти", "Хелп" и тому подобное;
    - Cоздавать темы без детального описания того, что нужно исправить.
    - Cоздавать темы из одного скриншота.
    За игнор правил форума - Ваша тема будет удалена, а Вы получите системное предупреждение.

Как сделать чтобы при смене скина персонажа прикрепленный объект не пропадал

samperonline

Умник
Как сделать в fs чтобы прикрепленный объект к игроку не пропадал помогите


C++:
#include "a_samp"
#include <Pawn.CMD>

#define OUTPUT_FILE "Attachments.txt"


enum
{
    DIALOG_MAIN = 7000,
    DIALOG_INDEX_SELECT,
    DIALOG_MODEL_SELECT,
    DIALOG_BONE_SELECT,
    DIALOG_COORD_INPUT
}
enum
{
    Float:COORD_X,
    Float:COORD_Y,
    Float:COORD_Z
}
enum
{
    POS_OFFSET_X,
    POS_OFFSET_Y,
    POS_OFFSET_Z,
    ROT_OFFSET_X,
    ROT_OFFSET_Y,
    ROT_OFFSET_Z,
    SCALE_X,
    SCALE_Y,
    SCALE_Z
}
new AttachmentBones[18][15] =
{
    {"Спина"},
    {"Голова"},
    {"Л. плечо"},
    {"Пр. плечо"},
    {"Л. кисть"},
    {"Пр. кисть"},
    {"Л. бедро"},
    {"Пр. бедро"},
    {"Л. стопа"},
    {"Пр. стопа"},
    {"Пр. голень"},
    {"Л. голень"},
    {"Л. предплечье"},
    {"Пр. предплечье"},
    {"Л. ключица"},
    {"Пр. ключица"},
    {"Шея"},
    {"Челюсть"}
};

new
bool:    gEditingAttachments        [MAX_PLAYERS],
        gCurrentAttachIndex        [MAX_PLAYERS],
bool:    gIndexUsed                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS],
        gIndexModel                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS],
        gIndexBone                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS],
Float:    gIndexPos                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS][3],
Float:    gIndexRot                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS][3],
Float:    gIndexSca                [MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS][3],
        gCurrentAxisEdit        [MAX_PLAYERS];


public OnFilterScriptInit()
{
    print("\n\tAttachEditor loaded.\n\tRepack by Edwin (RU) 2016\n");
    for(new i; i < MAX_PLAYERS; i++)
    {
        gCurrentAttachIndex[i] = 0;
        gIndexModel[i][0] = 0;

        for(new j; j < MAX_PLAYER_ATTACHED_OBJECTS; j++)
        {
            gIndexUsed[i][j] = false;
            gIndexBone[i][j] = 1;
            gIndexSca[i][j][COORD_X] = 1.0;
            gIndexSca[i][j][COORD_Y] = 1.0;
            gIndexSca[i][j][COORD_Z] = 1.0;
        }
    }
}

public OnFilterScriptExit()
{
    for(new i; i < MAX_PLAYERS; i++)
    {
        if(gEditingAttachments[i])
        {
            for(new j; j < MAX_PLAYER_ATTACHED_OBJECTS; j++)
            {
                if(gIndexUsed[i][j])
                    RemovePlayerAttachedObject(i, j);
            }
        }
    }
}

CMD:edit(playerid)
{
    ShowMainEditMenu(playerid);
    return 1;
}
CMD:k(playerid)
{
    SendClientMessage(playerid,-1,"Сохранил");
    SaveAttachedObjects(playerid);
    return 1;
}
CMD:kk(playerid)
{
    EditAttachment(playerid);
    return 1;
}
ShowMainEditMenu(playerid)
{
    new string[500];

    format(string, sizeof(string),
        "Индекс (%d)\n\
        Объект (%d)\n\
        Кость (%d)\n\
        X-позиция (%.4f)\n\
        Y-позиция (%.4f)\n\
        Z-позиция (%.4f)\n\
        X-вращение (%.4f)\n\
        Y-вращение (%.4f)\n\
        Z-вращение (%.4f)\n\
        X-масштаб (%.4f)\n\
        Y-масштаб (%.4f)\n\
        Z-масштаб (%.4f)\n\
        Редактировать\n\
        Очистить этот индекс\n\
        Сохранить",
        gCurrentAttachIndex[playerid],
        gIndexModel[playerid][gCurrentAttachIndex[playerid]],
        gIndexBone[playerid][gCurrentAttachIndex[playerid]],
        gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X],
        gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
        gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
        gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X],
        gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
        gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
        gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X],
        gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
        gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z]);

    ShowPlayerDialog(playerid, DIALOG_MAIN, DIALOG_STYLE_LIST, "Редактор прикрепления / Главное меню", string, "Принять", "Отмена");

    gEditingAttachments[playerid] = true;
}

ShowIndexList(playerid)
{
    new string[512];

    for(new i; i < MAX_PLAYER_ATTACHED_OBJECTS; i++)
    {
        if(IsPlayerAttachedObjectSlotUsed(playerid, i))
        {
            if(gIndexUsed[playerid][i]) format(string, sizeof(string), "%sСлот %d (%s - %d)\n", string, i, AttachmentBones[gIndexBone[playerid][i]], gIndexModel[playerid][i]);
            else format(string, sizeof(string), "%sСлот %d (Внешний)\n", string, i);
        }
        else format(string, sizeof(string), "%sСлот %d\n", string, i);
    }

    ShowPlayerDialog(playerid, DIALOG_INDEX_SELECT, DIALOG_STYLE_LIST, "Редактор прикрепления / Индех", string, "Приянть", "Отмена");
}

ShowModelInput(playerid)
{
    ShowPlayerDialog(playerid, DIALOG_MODEL_SELECT, DIALOG_STYLE_INPUT, "Редактор прикрепления / Объект", "Введите объект для прикрепления", "Приянть", "Отмена");
}

ShowBoneList(playerid)
{
    new string[512];

    for(new i; i < sizeof(AttachmentBones); i++) format(string, sizeof(string), "%s%s\n", string, AttachmentBones[i]);
    ShowPlayerDialog(playerid, DIALOG_BONE_SELECT, DIALOG_STYLE_LIST, "Редактор прикрепления / Кость", string, "Приянть", "Отмена");
}

EditCoord(playerid, coord)
{
    gCurrentAxisEdit[playerid] = coord;
    ShowPlayerDialog(playerid, DIALOG_COORD_INPUT, DIALOG_STYLE_INPUT, "Редактор прикрепления / Смещение", "Введите float-точку для смещения:", "Приянть", "Отмена");
}

EditAttachment(playerid)
{
    SetPlayerAttachedObject(playerid,
    gCurrentAttachIndex[playerid],
    gIndexModel[playerid][gCurrentAttachIndex[playerid]],
    gIndexBone[playerid][gCurrentAttachIndex[playerid]],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z]);

    EditAttachedObject(playerid, gCurrentAttachIndex[playerid]);

    gIndexUsed[playerid][gCurrentAttachIndex[playerid]] = true;
}

ClearCurrentIndex(playerid)
{
    gIndexModel[playerid][gCurrentAttachIndex[playerid]] = 0;
    gIndexBone[playerid][gCurrentAttachIndex[playerid]] = 1;
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X] = 0.0;
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = 0.0;
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = 0.0;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X] = 0.0;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = 0.0;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = 0.0;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X] = 0.0;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = 0.0;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = 0.0;
    gIndexUsed[playerid][gCurrentAttachIndex[playerid]] = false;

    RemovePlayerAttachedObject(playerid, gCurrentAttachIndex[playerid]);
    ShowMainEditMenu(playerid);
}

SaveAttachedObjects(playerid)
{
    new str[256], File:file;
    if(!fexist(OUTPUT_FILE)) file = fopen(OUTPUT_FILE, io_write);
    else file = fopen(OUTPUT_FILE, io_append);

    if(!file)
    {
        print("Ошибка открытия файла "OUTPUT_FILE"");
        return 0;
    }

    format(str, 256, "SetPlayerAttachedObject(playerid, %d, %d, %d,  %f, %f, %f,  %f, %f, %f,  %f, %f, %f); // %d\r\n",
    gCurrentAttachIndex[playerid],
    gIndexModel[playerid][gCurrentAttachIndex[playerid]],
    gIndexBone[playerid][gCurrentAttachIndex[playerid]],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
    GetPlayerSkin(playerid));
    
    fwrite(file, str);
    fclose(file);

    ShowMainEditMenu(playerid);

    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_MAIN)
    {
        if(response)
        {
            switch(listitem)
            {
                case 00:ShowIndexList(playerid);
                case 01:ShowModelInput(playerid);
                case 02:ShowBoneList(playerid);
                case 03:EditCoord(playerid, POS_OFFSET_X);
                case 04:EditCoord(playerid, POS_OFFSET_Y);
                case 05:EditCoord(playerid, POS_OFFSET_Z);
                case 06:EditCoord(playerid, ROT_OFFSET_X);
                case 07:EditCoord(playerid, ROT_OFFSET_Y);
                case 08:EditCoord(playerid, ROT_OFFSET_Z);
                case 09:EditCoord(playerid, SCALE_X);
                case 10:EditCoord(playerid, SCALE_Y);
                case 11:EditCoord(playerid, SCALE_Z);
                case 12:EditAttachment(playerid);
                case 13:ClearCurrentIndex(playerid);
                case 14:SaveAttachedObjects(playerid);
            }
        }
    }
    if(dialogid == DIALOG_INDEX_SELECT)
    {
        if(response)
        {
            gCurrentAttachIndex[playerid] = listitem;
            ShowMainEditMenu(playerid);
        }
        else ShowMainEditMenu(playerid);

        return 1;
    }
    if(dialogid == DIALOG_MODEL_SELECT)
    {
        if(response)
        {
            gIndexModel[playerid][gCurrentAttachIndex[playerid]] = strval(inputtext);
            ShowMainEditMenu(playerid);
        }
        else ShowMainEditMenu(playerid);
    }

    if(dialogid == DIALOG_BONE_SELECT)
    {
        if(response)
        {
            gIndexBone[playerid][gCurrentAttachIndex[playerid]] = listitem + 1;
            ShowMainEditMenu(playerid);
        }
        else ShowMainEditMenu(playerid);
    }
    if(dialogid == DIALOG_COORD_INPUT)
    {
        if(response)
        {
            new Float:value = floatstr(inputtext);

            switch(gCurrentAxisEdit[playerid])
            {
                case POS_OFFSET_X:  gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X] = value;
                case POS_OFFSET_Y:  gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = value;
                case POS_OFFSET_Z:  gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = value;
                case ROT_OFFSET_X:  gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X] = value;
                case ROT_OFFSET_Y:  gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = value;
                case ROT_OFFSET_Z:  gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = value;
                case SCALE_X:       gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X] = value;
                case SCALE_Y:       gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = value;
                case SCALE_Z:       gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = value;
            }

            SetPlayerAttachedObject(playerid,
            gCurrentAttachIndex[playerid],
            gIndexModel[playerid][gCurrentAttachIndex[playerid]],
            gIndexBone[playerid][gCurrentAttachIndex[playerid]],
            gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X],
            gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
            gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
            gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X],
            gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
            gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z],
            gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X],
            gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y],
            gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z]);
        }
        ShowMainEditMenu(playerid);
    }
    return 1;
}

public OnPlayerEditAttachedObject(playerid, response, index, modelid, boneid, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:fRotX, Float:fRotY, Float:fRotZ, Float:fScaleX, Float:fScaleY, Float:fScaleZ)
{
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_X] = fOffsetX;
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = fOffsetY;
    gIndexPos[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = fOffsetZ;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_X] = fRotX;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = fRotY;
    gIndexRot[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = fRotZ;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_X] = fScaleX;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Y] = fScaleY;
    gIndexSca[playerid][gCurrentAttachIndex[playerid]][COORD_Z] = fScaleZ;

    ShowMainEditMenu(playerid);

    SetPlayerAttachedObject(playerid, index, modelid, boneid, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ);

    return 1;
}
 
Сверху Снизу