PDA

Просмотр полной версии : [Вопрос] Ферма (пикапы сбора)



Dima_Tushin
11.09.2016, 23:00
Всем привет делал на сервер ферму и столкнулся с проблемой не могу исправить уже давно все мучаюсь и мучаюсь не могу исправить и теперь решил выложить сюда может вы мне поможете суть ошибки когда садишься в машину фермера Walton едишь на поле да все приехал на чекпоинт 5 сек прошло пикап появился (пикап работает ) потом иду за 2 машиной Walton тоже еду на поле все приехал пикап появился (получается уже 2 пикапа на поле загрузки ) вот суть ошибки: 1 пикап который мы поставили 1 машины Walton не работает а последнюю машину которую поставили на поле пикап работает как сделать чтобы все 2 пикапа функционировали

Код:


new FermPickup;//Пикап для сбора урожая


if(carid >= FermCar[0] && carid <= FermCar[1])
{
if(PlayerInfo[playerid][pFerma] != 255 || PlayerInfo[playerid][pFermaJob] == 3 || PlayerInfo[playerid][pFermaJob] == 2)
{
if(LoadZern[carid-FermCar[0]] < 1000)//Если в машине меньше 0 зёрен то...
{
new string[50+MAX_PLAYER_NAME-2];
static const ferm[] = "В грузовике %d / 1000 зёрен";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
SendClientMessage(playerid, COLOR_GREEN, string);
new rand = random(sizeof(SborFerm_0));//Рандомное значение на собирание кустиков!
SetPlayerCheckpoint(playerid, SborFerm_0[rand][0], SborFerm_0[rand][1], SborFerm_0[rand][2],5.0);
}
else//Если больше 1000 то...
{
LoadZern[carid-FermCar[0]] = 1000;//Приравниваем значение зёрен к 1000 чтобы не было бага с количеством!
new string[50+MAX_PLAYER_NAME-2];
static const ferm[] = "В грузовике %d / 1000 зёрен";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
SendClientMessage(playerid, COLOR_GREEN, string);
SendClientMessage(playerid, COLOR_GREEN, "Сбор урожая завершен. Теперь направляйтесь к ферме и разгрузитесь{FFFFFF} (( Командой: /funload ))");
DestroyDynamicPickup(FermPickup);//Удалили пикап
Delete3DTextLabel(FermText3D[playerid]);//Удалили текст
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не Фермер/Владелец/Заместитель!");
RemovePlayerFromVehicleAC(playerid);
SetTimerEx("RemovePlayerFromVehicleEx", 3000, false, "i", playerid);
return 1;
}
}


public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
printf("Ferm pickupid %d", pickupid);
if(pickupid == FermPickup)
{
if(PlayerKist[playerid] == true)
{
for(new f = 0; f < sizeof(FermInfo); f++)
{
new carid = !GetPlayerVehicleID(playerid);
if(LoadZern[carid-FermCar[0]] > 1000)//Если в машине меньше 1000 зерен то...
{
new string[30+MAX_PLAYER_NAME-2];
LoadZern[carid-FermCar[0]] = 1000;
SendClientMessage(playerid, COLOR_WHITE, "Грузовик полон!");
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, LoadZern[carid-FermCar[0]]);
DisablePlayerCheckpoint(playerid);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
PlayerKist[playerid] = false;
}
else
{
new string[50+MAX_PLAYER_NAME-2];
FermInfo[f][fZaseeno] -= 5;//Отнимаем -5 засеености!
LoadZern[carid-FermCar[0]] += 5;//Загрузили +5 зерен!
FermZarabotok[playerid] += FermInfo[f][fPayday];//Прибовляем заработок
static const ferm[] = "~b~count:~w~+%d$";
format(string, sizeof(string), ferm, FermZarabotok[playerid]);
GameTextForPlayer(playerid, string, 3000, 1);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(10), Y12+random(10), Z12, 1.0);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, LoadZern[carid-FermCar[0]]);
Update3DTextLabelText(FermText3D[playerid], COLOR_YELLOW, string);
PlayerKist[playerid] = false;
if(gettime() - GetPVarInt(playerid, "BotFarm") < 20)
{
if(GetPVarInt(playerid, "BotCount") == 1)
{
static const ferm_2[] = "<<Warning>> Игрок %s[%d]: Возможно бот фермер";
format(string, sizeof(string), ferm_2, PlayerInfo[playerid][pName], playerid);
SendAdminMessage(COLOR_ADMIN, string);
SetPVarInt(playerid, "BotCount", 0);
}
}
SetPVarInt(playerid, "BotFarm", gettime());
SetPVarInt(playerid, "BotCount", GetPVarInt(playerid, "BotCount") +1);
}
}
}
else
{
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Для начала соберите урожай {FFFFFF}(( Встаньте на красный чекпоинт, и ждите 15 секунд ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Когда соберёте положите в кузов автомобиля {FFFFFF}(( Встаньте на желтую стрелку ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Если захотите завершить работу, пройдите к раздевалке {FFFFFF}(( Встаньте на синий пикап у фермы ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Если вы фермер, то просто сядьте в машину для завершения сбора урожая, /funload - разгрузить урожай");
DisablePlayerCheckpoint(playerid);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(10), Y12+random(10), Z12, 1.0);
PlayerKist[playerid] = false;
}
}
return 1;
}

таймер после которого ставиться пикап

if(SbotTime_1[i] > 0)
{
SbotTime_1[i]--;
if(SbotTime_1[i] == 0)
{
SbotTime_1[i] = 0;
for(new q = 0; q < 4; q++)//Цикл место сбора урожая
{
if(IsPlayerInRangeOfPoint(i, 5.0, SborFerm_0[q][0], SborFerm_0[q][1], SborFerm_0[q][2]))//Проверяем есть ли игрок в радиусе 5 метров от чекпоинта!
{
new carid = GetPlayerVehicleID(i);
GetVehiclePos(carid, X12, Y12, Z12);
GetXYInFrontOfPlayer(i, X12, Y12,-3.0);
FermPickup = CreateDynamicPickup(19197, 23, X12, Y12, Z12+0.3);
GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(carid, VEHICLE_PARAMS_OFF, VEHICLE_PARAMS_OFF, alarm, doors, bonnet, boot, objective);
zavodis[i] = false;
new string[30+MAX_PLAYER_NAME-2];
static const ferm[] = "Загруженно\n%d / 1000";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
FermText3D[i] = Create3DTextLabel(string, COLOR_YELLOW, X12, Y12, Z12+0.5, 15.0, 0, 1);
SendClientMessage(i, COLOR_WHITE, "{0289CC}Машина на месте. Теперь вы и ваши рабочие, могут загружать её");
SendClientMessage(i, COLOR_WHITE, "{0289CC}Если решите завершить сбор урожая, /fpanel [9] завершить сбор урожая");
DisablePlayerCheckpoint(i);//Удаляем чекпоинт!
}
}
}
}

Sp1ke
11.09.2016, 23:23
Всем привет делал на сервер ферму и столкнулся с проблемой не могу исправить уже давно все мучаюсь и мучаюсь не могу исправить и теперь решил выложить сюда может вы мне поможете суть ошибки когда садишься в машину фермера Walton едишь на поле да все приехал на чекпоинт 5 сек прошло пикап появился (пикап работает ) потом иду за 2 машиной Walton тоже еду на поле все приехал пикап появился (получается уже 2 пикапа на поле загрузки ) вот суть ошибки: 1 пикап который мы поставили 1 машины Walton не работает а последнюю машину которую поставили на поле пикап работает как сделать чтобы все 2 пикапа функционировали

Код:


new FermPickup;//Пикап для сбора урожая


if(carid >= FermCar[0] && carid <= FermCar[1])
{
if(PlayerInfo[playerid][pFerma] != 255 || PlayerInfo[playerid][pFermaJob] == 3 || PlayerInfo[playerid][pFermaJob] == 2)
{
if(LoadZern[carid-FermCar[0]] < 1000)//Если в машине меньше 0 зёрен то...
{
new string[50+MAX_PLAYER_NAME-2];
static const ferm[] = "В грузовике %d / 1000 зёрен";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
SendClientMessage(playerid, COLOR_GREEN, string);
new rand = random(sizeof(SborFerm_0));//Рандомное значение на собирание кустиков!
SetPlayerCheckpoint(playerid, SborFerm_0[rand][0], SborFerm_0[rand][1], SborFerm_0[rand][2],5.0);
}
else//Если больше 1000 то...
{
LoadZern[carid-FermCar[0]] = 1000;//Приравниваем значение зёрен к 1000 чтобы не было бага с количеством!
new string[50+MAX_PLAYER_NAME-2];
static const ferm[] = "В грузовике %d / 1000 зёрен";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
SendClientMessage(playerid, COLOR_GREEN, string);
SendClientMessage(playerid, COLOR_GREEN, "Сбор урожая завершен. Теперь направляйтесь к ферме и разгрузитесь{FFFFFF} (( Командой: /funload ))");
DestroyDynamicPickup(FermPickup);//Удалили пикап
Delete3DTextLabel(FermText3D[playerid]);//Удалили текст
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не Фермер/Владелец/Заместитель!");
RemovePlayerFromVehicleAC(playerid);
SetTimerEx("RemovePlayerFromVehicleEx", 3000, false, "i", playerid);
return 1;
}
}


public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
printf("Ferm pickupid %d", pickupid);
if(pickupid == FermPickup)
{
if(PlayerKist[playerid] == true)
{
for(new f = 0; f < sizeof(FermInfo); f++)
{
new carid = !GetPlayerVehicleID(playerid);
if(LoadZern[carid-FermCar[0]] > 1000)//Если в машине меньше 1000 зерен то...
{
new string[30+MAX_PLAYER_NAME-2];
LoadZern[carid-FermCar[0]] = 1000;
SendClientMessage(playerid, COLOR_WHITE, "Грузовик полон!");
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, LoadZern[carid-FermCar[0]]);
DisablePlayerCheckpoint(playerid);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
PlayerKist[playerid] = false;
}
else
{
new string[50+MAX_PLAYER_NAME-2];
FermInfo[f][fZaseeno] -= 5;//Отнимаем -5 засеености!
LoadZern[carid-FermCar[0]] += 5;//Загрузили +5 зерен!
FermZarabotok[playerid] += FermInfo[f][fPayday];//Прибовляем заработок
static const ferm[] = "~b~count:~w~+%d$";
format(string, sizeof(string), ferm, FermZarabotok[playerid]);
GameTextForPlayer(playerid, string, 3000, 1);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(10), Y12+random(10), Z12, 1.0);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, LoadZern[carid-FermCar[0]]);
Update3DTextLabelText(FermText3D[playerid], COLOR_YELLOW, string);
PlayerKist[playerid] = false;
if(gettime() - GetPVarInt(playerid, "BotFarm") < 20)
{
if(GetPVarInt(playerid, "BotCount") == 1)
{
static const ferm_2[] = "<<Warning>> Игрок %s[%d]: Возможно бот фермер";
format(string, sizeof(string), ferm_2, PlayerInfo[playerid][pName], playerid);
SendAdminMessage(COLOR_ADMIN, string);
SetPVarInt(playerid, "BotCount", 0);
}
}
SetPVarInt(playerid, "BotFarm", gettime());
SetPVarInt(playerid, "BotCount", GetPVarInt(playerid, "BotCount") +1);
}
}
}
else
{
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Для начала соберите урожай {FFFFFF}(( Встаньте на красный чекпоинт, и ждите 15 секунд ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Когда соберёте положите в кузов автомобиля {FFFFFF}(( Встаньте на желтую стрелку ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Если захотите завершить работу, пройдите к раздевалке {FFFFFF}(( Встаньте на синий пикап у фермы ))");
SendClientMessage(playerid, COLOR_GREEN, "{00D607} Если вы фермер, то просто сядьте в машину для завершения сбора урожая, /funload - разгрузить урожай");
DisablePlayerCheckpoint(playerid);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(10), Y12+random(10), Z12, 1.0);
PlayerKist[playerid] = false;
}
}
return 1;
}

таймер после которого ставиться пикап

if(SbotTime_1[i] > 0)
{
SbotTime_1[i]--;
if(SbotTime_1[i] == 0)
{
SbotTime_1[i] = 0;
for(new q = 0; q < 4; q++)//Цикл место сбора урожая
{
if(IsPlayerInRangeOfPoint(i, 5.0, SborFerm_0[q][0], SborFerm_0[q][1], SborFerm_0[q][2]))//Проверяем есть ли игрок в радиусе 5 метров от чекпоинта!
{
new carid = GetPlayerVehicleID(i);
GetVehiclePos(carid, X12, Y12, Z12);
GetXYInFrontOfPlayer(i, X12, Y12,-3.0);
FermPickup = CreateDynamicPickup(19197, 23, X12, Y12, Z12+0.3);
GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(carid, VEHICLE_PARAMS_OFF, VEHICLE_PARAMS_OFF, alarm, doors, bonnet, boot, objective);
zavodis[i] = false;
new string[30+MAX_PLAYER_NAME-2];
static const ferm[] = "Загруженно\n%d / 1000";
format(string, sizeof(string), ferm, LoadZern[carid-FermCar[0]]);
FermText3D[i] = Create3DTextLabel(string, COLOR_YELLOW, X12, Y12, Z12+0.5, 15.0, 0, 1);
SendClientMessage(i, COLOR_WHITE, "{0289CC}Машина на месте. Теперь вы и ваши рабочие, могут загружать её");
SendClientMessage(i, COLOR_WHITE, "{0289CC}Если решите завершить сбор урожая, /fpanel [9] завершить сбор урожая");
DisablePlayerCheckpoint(i);//Удаляем чекпоинт!
}
}
}
}

Ты создаешь 2 пикапа, но приравниваешь их ID к одной переменной, а значит при создании второго пикапа - его ID перезапишется в переменной. Следовательно привяжи пикап к нужной ячейки в зависимости от выбранной машины.

new FermPickup[2];//Пикап для сбора урожая

Dima_Tushin
12.09.2016, 09:41
Ну сейчас попробую еще раз делать я так делал я много способов сделал но повторение мать учение)))

Dima_Tushin
12.09.2016, 13:00
Блин не получается или я не понимаю как сделать сделай на примере.

vasyok28
12.09.2016, 17:32
Держи как временное решение: http://pastebin.com/iDh1VPTA но будет баг с обновление 3д текста у пикапов, исправить легко если сделаешь по примеру который исправил пикапы. + еще лучше переписать это все, код очень плохой можно в несколько раз попроще сделать, или как вариант найти скриптера который реализует правильно за деньги

vovandolg
13.09.2016, 14:09
new carid = !GetPlayerVehicleID(playerid);
что это даёт кстате?

_lizard
13.09.2016, 15:12
new carid = !GetPlayerVehicleID(playerid);
что это даёт кстате?

Если функция вернёт 0, то переменной присвоется 1, если вернет положительное число, то присвоется 0

Dima_Tushin
13.09.2016, 21:37
я сам сделаю! не нужен скриптер я кто :)

- - - Добавлено - - -

Спасибо работает решено огромное спасибо)))

Тему можно закрывать ну или удалить!

vovandolg
14.09.2016, 00:00
Если функция вернёт 0, то переменной присвоется 1, если вернет положительное число, то присвоется 0

И зачем делать такую инверсию?)) Таким вроде чит мэйстеры занимаются чтобы их код не смогли читать:dirol:

_lizard
14.09.2016, 10:44
И зачем делать такую инверсию?)) Таким вроде чит мэйстеры занимаются чтобы их код не смогли читать:dirol:

Я тоже особо не понял смысла этого кода

Dima_Tushin
14.09.2016, 18:23
Краш Детект выбело!

[20:21:13] [debug] Run time error 4: "Array index out of bounds"
[20:21:13] [debug] Accessing element at negative index -2
[20:21:13] [debug] AMX backtrace:
[20:21:13] [debug] #0 0002d3a4 in public OnPlayerPickUpDynamicPickup (0, 2) from State-Go.amx
[20:21:13] [debug] #1 native Streamer_CallbackHook () from streamer.dll
[20:21:13] [debug] #2 0000603c in public OnPlayerPickUpPickup (0, 34) from State-Go.amx

vasyok28
14.09.2016, 18:32
Краш Детект выбело!

[20:21:13] [debug] Run time error 4: "Array index out of bounds"
[20:21:13] [debug] Accessing element at negative index -2
[20:21:13] [debug] AMX backtrace:
[20:21:13] [debug] #0 0002d3a4 in public OnPlayerPickUpDynamicPickup (0, 2) from State-Go.amx
[20:21:13] [debug] #1 native Streamer_CallbackHook () from streamer.dll
[20:21:13] [debug] #2 0000603c in public OnPlayerPickUpPickup (0, 34) from State-Go.amx

-d3 в pawn.cfg запиши, компилируй и узнаешь на какую строчку ругается

Dima_Tushin
16.09.2016, 00:58
Блин нужен 2 вариант блин уже как 3 дня не могу сделать

Заметил баг еще один когда на поле 2 машины и ты например положил во 2 машину +5 зерна а в 1 машине было 0 то к 1 и 2 прибавиться значение +5

- - - Добавлено - - -

Объясните как эти функции работают чет не понял совсем принцип их работы!


GetFermPickID(pickupid)
{
if(FermPickup[0] == pickupid) return 0;
return 1;
}

GetFermCarID(veh)
{
if(FermCar[0] == veh) return 0;
return 1;
}

vasyok28
16.09.2016, 15:50
Блин нужен 2 вариант блин уже как 3 дня не могу сделать

Заметил баг еще один когда на поле 2 машины и ты например положил во 2 машину +5 зерна а в 1 машине было 0 то к 1 и 2 прибавиться значение +5

- - - Добавлено - - -

Объясните как эти функции работают чет не понял совсем принцип их работы!


GetFermPickID(pickupid)
{
if(FermPickup[0] == pickupid) return 0;
return 1;
}

GetFermCarID(veh)
{
if(FermCar[0] == veh) return 0;
return 1;
}

1 - функция возвращает какой пикап машины взял игрок
2 - функция возвращает какую машину использовал (1 или 2 машина)
Насчет бага, я написал что он будет, исправить очень просто, по принципу который сделал пикапы

Dima_Tushin
19.09.2016, 21:09
Исправил переделал код все работает как мне надо. Модераторам Закройте пожалуйста тему или же удалите