Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Перевозка и обыск металлолома

Kireykin

Новичок
Делал данную систему для своего проекта, но решил не добавлять её. Валяется просто так, может кому-то пригодится. Не претендую на идеальный код, возможно где-то можно сделать функциональнее и более оптимизировано. Если у кого-то есть советы как сделать лучше и где что-то сделано коряво - буду рад ознакомиться с критикой. Система не доделана до того вида, в которой я её видел(визуальное перемещение металлолома по конвейеру, сдавливания прессом и другие визуальные штучки), но использовать её уже можно. Делал больше под жанр Survival, но вполне можно использовать и в RP. В качестве металлолома используются разрушенные ржавые автомобили, поэтому по коду везде металлолом называю автомобилями.
Данную систему можно переделать под определённую работу на сервере, под какой-то квест. А лутание вполне подойдёт для отыгрыша бомжей :)

Возможности.
  • Обыск металлолома;
  • Погрузка металлолома на DFT-30 и выгрузка в соответствующем месте;
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
В enum с автомобилями требуется внести две строчки - loadcar и loadcartype, INT 11.
PHP:
new playerLootedNow[MAX_PLAYERS];
enum lootCarInfo
{
    carID, // ID автомобиля
    carLooted,// Статус обыска автомобиля | 1 - если автомобиль можно обыскать и 0 - если он уже обыскан или обыскивается в данный момент.
    carLootedPlayer, // ID игрока, который обыскивает автомобиль
    carIsActive, // Статус активности металлолома
    Float:lootcarX,
    Float:lootcarY,
    Float:lootcarZ,
    Float:lootcarA
}
new lootCar[46][lootCarInfo];   // 46 - количество автомобилей, должно совпадать с количеством координат. В случае изменения количества - не забудьте поменять и здесь.

new Float: lootCarPos[46][4] = // координаты расположения металлолома. Не помню точно как я их расставлял, но в основном они стоят в лесу и возле фермы.
{
{-264.57224, -156.92575, 1.80487,73.67999},
{-218.61580, -168.86543, 1.61107,73.67999},
{-107.09460, -191.52505, 1.16302,80.39998},
{148.73926, -144.84526, 0.75212,85.07999},
{217.11473, -68.65047, 0.77210,88.55999},
{329.66080, -156.12581, 0.77057,0.00001},
{247.64758, -215.37314, 0.81225,91.55999},
{204.96245, -295.07578, 0.77338,0.00001},
{236.51443, -49.44404, 0.72888,0.00001},
{594.25568, 372.06516, 18.26241,34.68001},
{565.96332, 411.87247, 18.38102,34.68001},
{545.79761, 441.41058, 18.38102,34.68001},
{506.15204, 497.87592, 18.38102,34.68001},
{508.23468, 484.87692, 18.38102,216.83980},
{550.49927, 424.10648, 18.38102,216.83980},
{573.07813, 392.87598, 18.38102,216.83980},
{454.52509, 562.14380, 18.52176,12.90000},
{324.45975, 753.84052, 5.47867,107.81998},
{311.48514, 757.18750, 5.53749,328.73990},
{306.69528, 771.24237, 5.50450,430.31992},
{222.93820, 969.99481, 27.57083,0.00001},
{-68.75044, 1186.64343, 18.99913,0.00001},
{-118.14143, 1158.65942, 19.05843,23.64000},
{-187.93492, 1067.38989, 19.01674,0.00001},
{-304.38934, 1024.21887, 18.99445,89.63999},
{-287.36169, 806.90765, 14.16075,-15.36000},
{-480.76001, 1059.33337, 10.50171,71.46001},
{-498.22211, 1062.70654, 10.50171,257.58008},
{-467.77969, 1045.84985, 10.50171,397.31995},
{-536.72363, 1087.26599, 10.44252,374.94000},
{-617.89203, 654.13464, 16.08690,0.00001},
{-661.22467, 657.68878, 16.08690,-89.75999},
{-552.17944, 607.88452, 16.08690,90.18001},
{-210.44952, 578.31848, 15.02846,57.96000},
{-155.48689, 406.23831, 11.43412,0.00001},
{-172.65671, 341.87930, 11.43412,-51.60000},
{-164.97652, 368.80838, 11.43412,29.40001},
{-248.84653, -271.10611, 0.56197,49.44001},
{-137.07582, -381.59930, 0.44741,74.33998},
{42.73801, -540.75897, 9.49754,19.50000},
{36.85460, -517.48779, 9.35275,208.37996},
{30.74926, -642.02802, 2.50982,-37.56000},
{-99.08192, -1190.44690, 1.50106,-23.10000},
{-83.00210, -1154.14636, 1.18862,23.52000},
{-24.32311, -1519.22180, 1.11148,0.00001},
{-1219.21838, -2334.45850, 16.71689,0.00001}
};
PHP:
for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
{
    lootCar[carLootID][lootcarX] = lootCarPos[carLootID][0];
    lootCar[carLootID][lootcarY] = lootCarPos[carLootID][1];
    lootCar[carLootID][lootcarZ] = lootCarPos[carLootID][2];
    lootCar[carLootID][lootcarA] = lootCarPos[carLootID][3];
    if (random(4) == 0)
    {
        lootCar[carLootID][carLooted] = 1;
        lootCar[carLootID][carIsActive] = 1;
        lootCar[carLootID][carLootedPlayer] = -1;
        lootCar[carLootID][carID] = CreateDynamicObject(3594, lootCar[carLootID][lootcarX], lootCar[carLootID][lootcarY], lootCar[carLootID][lootcarZ],0.0, 0.0, lootCar[carLootID][lootcarA]);
        printf("[LootCar] LootCar #%d - loaded",carLootID);
    }
    else printf("[LootCar] No load lootcar");
}
PHP:
if (newkeys & 1024)
{
    if (GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
        {
            if (IsPlayerInRangeOfPoint(playerid,3.0,lootCar[carLootID][lootcarX], lootCar[carLootID][lootcarY], lootCar[carLootID][lootcarZ]))
            {
                   if(lootCar[carLootID][carLooted] == 1 && lootCar[carLootID][carIsActive] == 1 && playerLootedNow[playerid] == 0)
                   {
                       SetCameraBehindPlayer(playerid);  //Устанавливаем камеру позади игрока. Можно убрать, просто для визуала. Мне так нравится.
                       plootanim[playerid] = SetTimerEx("lootAnim", 10000, 0, "d", playerid); //Запускаем таймер, после которого обыск завершается. 10000 = 10 секунд.
                       playerLootedNow[playerid] = 1;
                       lootCar[carLootID][carLooted] = 0;
                       lootCar[carLootID][carLootedPlayer] = pInfo[playerid][pID]; // Здесь нужно подставить свою переменную ID игрока.
                       ApplyAnimation(playerid, "BOMBER","BOM_Plant_Loop",4.0,1,0,0,1,0);
                       SendClientMessage(playerid, 0xFFFFFF00, "{228B22}| {FFFFFF}Вы начали обыск металлолома.");
                       return 1;
                }
                else if (lootCar[carLootID][carIsActive] == 0 || playerLootedNow[playerid] == 1) return 1;
                else if (lootCar[carLootID][carLooted] == 0 && lootCar[carLootID][carIsActive] == 1)
                {
                    SendClientMessage(playerid, 0xFFFFFF00, "{228B22}| {FFFFFF}Машина пуста.");
                    playerLootedNow[playerid] = 0;
                    return 1;
                }
            }
        }
    }
}
else if ((newkeys & 65536 || newkeys & KEY_CROUCH || newkeys & KEY_FIRE  || newkeys & KEY_JUMP || newkeys & KEY_WALK || newkeys & KEY_DOWN || newkeys & KEY_NO || newkeys & 1024) && (playerLootedNow[playerid] == 1))
{
    for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
    {
        if (playerLootedNow[playerid] == 1 && lootCar[carLootID][carLootedPlayer] == pInfo[playerid][pID])
        {
            KillTimer(plootanim[playerid]);
            playerLootedNow[playerid] = 0;
            ClearAnimations(playerid);
            lootCar[carLootID][carLooted] = 1;
            lootCar[carLootID][carLootedPlayer] = -1;
            SendClientMessage(playerid, 0xFFFFFF00, "{228B22}| {FFFFFF}Вы прервали обыск.");
            return 1;
        }
    }
}
PHP:
for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
    {
        if (playerLootedNow[playerid] == 1 && lootCar[carLootID][carLootedPlayer] == pInfo[playerid][pID])
        {
            KillTimer(plootanim[playerid]);
            lootCar[carLootID][carLooted] = 1;
            lootCar[carLootID][carLootedPlayer] = -1;
            return 1;
        }
    }
PHP:
forward lootAnim(playerid);
public lootAnim(playerid)
{
    new Float: PosX, Float: PosY, Float: PosZ;
    GetPlayerPos(playerid, PosX, PosY, PosZ);
    if(playerLootedNow[playerid] == 1)
    {
        ClearAnimations(playerid);
        for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
        {
            if (lootCar[carLootID][carLootedPlayer] == pInfo[playerid][pID])
            {
                if (IsPlayerInRangeOfPoint(playerid,6.0,lootCar[carLootID][lootcarX], lootCar[carLootID][lootcarY], lootCar[carLootID][lootcarZ]))
                {
                    lootCar[carLootID][carLooted] = 0;
                    switch (random(1)) // различные варианты обыска автомобиля, можете добавлять сколько угодно
                    {
                        case 0:
                        {
                            //ваше действие при завершение обыска.
                        }
                    }
                    playerLootedNow[playerid] = 0;
                    lootCar[carLootID][carLootedPlayer] = -1;
                    SendClientMessage(playerid, 0xFFFFFF00, "{228B22}| {FFFFFF}Вы обыскали металлолом.");
                    return 1;
                }
                else // если игрок дальше чем на 6 метров при завершении обыска автомобиля. Например, сбил анимацию и пошёл по своим делам.
                {
                    playerLootedNow[playerid] = 0;
                    lootCar[carLootID][carLooted] = 1;
                    lootCar[carLootID][carLootedPlayer] = -1;
                    SendClientMessage(playerid, 0xFFFFFF00, "{228B22}| {FFFFFF}Вы слишком далеко от машины.");
                    return 1;
                }
            }
        }
    }
    return 1;
}
PHP:
CMD:unloadmetall(playerid)
{
    if(GetPlayerState(playerid)!=PLAYER_STATE_ONFOOT)
    {
        SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Требуется выйти из транспорта.");
        return 1;
    }
    new nearveh = GetNearestVehicle(playerid);
    if(IsPlayerInRangeOfPoint(playerid,7.0,-2068.4070, -2433.7998, 29.7177)) //это координаты условной точки переработки металла. Подставьте свои, если требуются.
    {
        if ((GetVehicleModel(nearveh) == 578))
        {
            new Float:cx,Float:cy,Float:cz;
            GetVehiclePos(nearveh, cx, cy, cz);
            if(PlayerToPoint(10.0, playerid, cx, cy, cz))
            {
                if (vInfo[nearveh][loadcartype] == 1)
                {
                    if (IsValidDynamicObject(vInfo[nearveh][loadcar]))
                    {
                        DestroyDynamicObject(vInfo[nearveh][loadcar]);
                    }
                    vInfo[nearveh][loadcar] = 0;
                    vInfo[nearveh][loadcartype] = 0;
                    //здесь Ваше действие после выгрузки металлолома. Например, выдача зарплаты или пополнение склада.
                    return 1;
                }
                else
                {
                    SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}В DFT-30 нет загруженного металлолома.");
                    return 1;
                }
            }
            else
            {
                SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Поблизости нет DFT-30.");
                return 1;
            }
        }
    }
    else
    {
        SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Поблизости нет точки переработки металла.");
    }
    return 1;
}
CMD:loadmetall(playerid)
{
        if(GetPlayerState(playerid)!=PLAYER_STATE_ONFOOT)
        {
            SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Требуется выйти из транспорта.");
            return 1;
        }
        new nearveh = GetNearestVehicle(playerid);
        if ((GetVehicleModel(nearveh) == 578))
        {
            new Float:cx,Float:cy,Float:cz;
            GetVehiclePos(nearveh, cx, cy, cz);
            if(PlayerToPoint(10.0, playerid, cx, cy, cz))
            {
                 for (new carLootID=0; carLootID<sizeof(lootCarPos);carLootID++)
                {
                      if(IsPlayerInRangeOfPoint(playerid,7.0,lootCar[carLootID][lootcarX],lootCar[carLootID][lootcarY],lootCar[carLootID][lootcarZ]))
                    {
                        if (vInfo[nearveh][loadcar] == 0)
                        {
                            vInfo[nearveh][loadcar] = CreateDynamicObject(3594,0,0,0,0,0,0);
                            SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Вы погрузили металлолом на платформу.");
                            AttachDynamicObjectToVehicle(vInfo[nearveh][loadcar], nearveh, 0.0000, -2.0000, 0.3800,   0.00, 0.00, 0.00);
                            DestroyDynamicObject(lootCar[carLootID][carID]);
                            lootCar[carLootID][carLooted] = 0;
                            lootCar[carLootID][carLootedPlayer] = -1;
                            lootCar[carLootID][carIsActive] = 0;
                            vInfo[nearveh][loadcartype] = 1;
                            return 1;
                        }
                    else
                    {
                        SendClientMessageEx(playerid, COLOR_GREY, "{228B22}| {FFFFFF}Ой-ой, а на DFT-30 уже есть погруженный металлолом");
                        return 1;
                    }
                    }
                }
            }
        }
        return 1;
}
 
Последнее редактирование модератором:
Сверху Снизу