Kireykin
Новичок
Делал данную систему для своего проекта, но решил не добавлять её. Валяется просто так, может кому-то пригодится. Не претендую на идеальный код, возможно где-то можно сделать функциональнее и более оптимизировано. Если у кого-то есть советы как сделать лучше и где что-то сделано коряво - буду рад ознакомиться с критикой. Система не доделана до того вида, в которой я её видел(визуальное перемещение металлолома по конвейеру, сдавливания прессом и другие визуальные штучки), но использовать её уже можно. Делал больше под жанр Survival, но вполне можно использовать и в RP. В качестве металлолома используются разрушенные ржавые автомобили, поэтому по коду везде металлолом называю автомобилями.
Данную систему можно переделать под определённую работу на сервере, под какой-то квест. А лутание вполне подойдёт для отыгрыша бомжей
Возможности.
В enum с автомобилями требуется внести две строчки - loadcar и loadcartype, INT 11.
Данную систему можно переделать под определённую работу на сервере, под какой-то квест. А лутание вполне подойдёт для отыгрыша бомжей
Возможности.
- Обыск металлолома;
- Погрузка металлолома на DFT-30 и выгрузка в соответствующем месте;
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
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;
}
Последнее редактирование модератором:
