PDA

Просмотр полной версии : [Вопрос] сделать 5 ферм



Dima_Tushin
17.06.2019, 22:52
Здравствуйте, кто сможет мне помочь может быть объяснить как сделать 5 ферм на сервер 1 ферму уже есть взята с мода Taurus Rp я ее до делал работает хорошо вроде бы без ошибок теперь не могу понять как сделать хотя бы 2ую ферму может кто помочь а дальше я сам.


Если есть люди кто сможет помочь у кого времени не жалко помочь мне разобраться то отзовитесь пожалуйста!

по необходимости скину код.Спасибо!

DeimoS
17.06.2019, 22:55
Ну так дублируешь все переменные/проверки и прописываешь для них новую информацию (координаты и т.п.).

Dima_Tushin
18.06.2019, 00:06
Все спасибо помогло можете удалить тему!

Dima_Tushin
18.06.2019, 02:42
проблема вылезла( когда берешь пикап, чекпоинт взятия куста улетает аж за территорию Фермы


if(pickupid == FermPickup[2] || pickupid == FermPickup[3])
{
for(new f = 0; f < sizeof(FermInfo); f++)
{
if(PlayerKist[playerid] == true)
{
new pID = GetFarmPickup(pickupid);
if(FermInfo[f][fNytriCar][pID] > 1000)//Если в машине меньше 1000 зерен то...
{
new string[30+MAX_PLAYER_NAME-2];
FermInfo[f][fNytriCar][pID] = 1000;
SendClientMessage(playerid, COLOR_WHITE, "Грузовик полон!");
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, FermInfo[f][fNytriCar][pID]);
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 засеености!
FermInfo[f][fNytriCar][pID] += 5;//Загрузили +5 зерен!
FermZarabotok[1] += FermInfo[f][fPayday];//Прибовляем заработок
static const ferm[] = "~b~count:~w~+%d$";
format(string, sizeof(string), ferm, FermZarabotok[1]);
GameTextForPlayer(playerid, string, 3000, 1);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(2), Y12+random(2), Z12, 2.0);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, FermInfo[f][fNytriCar][pID]);
Update3DTextLabelText(FermText3D[pID], COLOR_YELLOW, string);
PlayerKist[playerid] = false;
if(gettime() - GetPVarInt(playerid, "BotFarm") < 20)
{
if(GetPVarInt(playerid, "BotCount") == 1)
{
if(GetPVarInt(playerid, "FludTime") < gettime())
{
static const ferm_2[] = "<<Warning>> Игрок %s[%d]: Возможно бот фермер";
format(string, sizeof(string), ferm_2, PlayerInfo[playerid][pName], playerid);
SendAdminMessage(COLOR_RED, string);
SetPVarInt(playerid, "BotCount", 0);
SetPVarInt(playerid,"FludTime",gettime()+10);
}
}
}
SetPVarInt(playerid, "BotFarm", gettime());
SetPVarInt(playerid, "BotCount", GetPVarInt(playerid, "BotCount") +1);
PlayerCheck[1] = true;
}
}
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(2), Y12+random(2), Z12, 2.0);
PlayerKist[playerid] = false;
PlayerCheck[1] = true;
return 1;
}
}


stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
{
new Float:a;
GetPlayerPos(playerid, x, y, a);
if (IsPlayerInAnyVehicle(playerid))
{
GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
}
else
{
GetPlayerFacingAngle(playerid, a);
}
x += (distance * floatsin(-a, degrees));
y += (distance * floatcos(-a, degrees));
return true;
}

Dima_Tushin
18.06.2019, 03:26
что самое интересное на первой ферме все хорошо возле машины чекпоинт взятия куста а на другой за пределы фермы улетают не могу разобраться почему так(



https://ibb.co/41xFPtC


ссылка на фото

DeimoS
18.06.2019, 10:07
Покажи код функции GetXYInFrontOfPlayer

Dima_Tushin
18.06.2019, 13:16
stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
{
new Float:a;
GetPlayerPos(playerid, x, y, a);
if (IsPlayerInAnyVehicle(playerid))
{
GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
}
else
{
GetPlayerFacingAngle(playerid, a);
}
x += (distance * floatsin(-a, degrees));
y += (distance * floatcos(-a, degrees));
return true;
}

DeimoS
18.06.2019, 14:24
Сделай вместо этого:
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
SetPlayerCheckpoint(playerid, X12+random(2), Y12+random(2), Z12, 2.0);
Вот так
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
X12+=random(2);
Y12+=random(2);
SetPlayerCheckpoint(playerid, X12,Y12, Z12, 2.0);
printf("\n%f, %f, %f\n", X12,Y12, Z12);
И посмотри по каким координатам реально создаётся маркер. Возможно, он просто проваливается под текстуры и появляется рядом. Ну или что-то в этом духе.

Dima_Tushin
18.06.2019, 14:34
что то мне подсказывает не утешительные цифры) сейчас вообще в углу карты чекпоинт( появляется

-996860160.000000, -999378240.000000, 129.206344

на одной машине так же появляется. Берешь 2ю в углу карты чекпоинты фиг знает что за дич главное на 1 ферме все шик а сделал 2 ферму все капец какие то баги пошли

DeimoS
18.06.2019, 15:05
Ну так продолжай логировать дальше: начиная от того, какие значения появляются в GetXYInFrontOfPlayer и заканчивая тем, какие значения выдаёт rand(2), переменная+rand(2) и т.п. Для того, чтоб прописывать printf, смотреть логи и делать выводы, не нужно 5 лет изучать Pawn. Достаточно просто не лениться и пытаться включать голову.

Dima_Tushin
18.06.2019, 15:30
я не знаю как исправить:( кр4 не помогайте мне

DeimoS
18.06.2019, 16:02
Ну так пробуй и учись. Думаешь, знания сами по себе появятся?
Почитай о том, как работать с функцией printf. Посмотри на то, как я сделал логирование. А дальше просто найди создание переменных "X12,Y12, Z12" и начинай логировать все случаи, когда в них так или иначе изменяется значение. Таким образом ты найдёшь место, где данные "портятся". А дальше уже будем искать причину, по которой они портятся.

Тут никто не желает бесплатно выполнять за тебя работу. Помочь с изучением языка или решением проблемы - пожалуйста. Но только если ты продемонстрируешь, что сам заинтересован в этом и прикладываешь к этому усилия, а не просто приходишь на форум и говоришь: "я вот не умею, поэтому сделайте за меня".

Dima_Tushin
18.06.2019, 19:29
Понял спасибо сейчас все действия буду логировать

Dima_Tushin
18.06.2019, 21:37
нашел 2 ошибки:
начнем пожалуй с таймера


if(SbotTime_2[i] > 0)
{
SbotTime_2[i] --;
printf("SbotTime_2: %d", SbotTime_2[i]);
if(SbotTime_2[i] == 0)
{
new randoms = random(sizeof(SborFerm_1));
printf("SborFerm_1[0]: %f, SborFerm_1[1]: %f, SborFerm_1[2]: %f",SborFerm_1[randoms][0], SborFerm_1[randoms][1], SborFerm_1[randoms][2]);
if(IsPlayerInRangeOfPoint(i, 10.0, SborFerm_1[randoms][0], SborFerm_1[randoms][1], SborFerm_1[randoms][2]))
{
new carid = GetPlayerVehicleID(i);
new pID = GetFarmCar(i);
new string[30+MAX_PLAYER_NAME-2];
GetVehiclePos(carid, X12, Y12, Z12);
static const ferm[] = "Загруженно\n%d / 1000";
format(string, sizeof(string), ferm, FermInfo[f][fNytriCar][pID]);
//GetXYInFrontOfPlayer(i, X12, Y12, -3.0);
GetXYInFrontOfPlayer(i, X12, Y12, -3.0);
FermPickup[pID] = CreateDynamicPickup(19197, 23, X12, Y12, Z12+3);
FermText3D[pID] = Create3DTextLabel(string, COLOR_YELLOW, X12, Y12, Z12+3, 15.0, 0, 1);
SendClientMessage(i, COLOR_WHITE, "{0289CC}Машина на месте. Теперь вы и ваши рабочие, могут загружать её");
SendClientMessage(i, COLOR_WHITE, "{0289CC}Если решите завершить сбор урожая, /fpanel [9] завершить сбор урожая");
// 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;
DisablePlayerCheckpoint(i);//Удаляем чекпоинт!
printf("FERMA: 1 / %f, %f, %f\n", X12,Y12, -3.0);
return 1;
}
}
}
после чего как поставил я автомобиль вылетело в логах

[21:26:58] FERMA: 1 / -1065.659179, -959.688354, -3.000000все нормально это пикап сзади машины координаты
теперь как только я взял пикап у машины у меня вылетело вот куда координаты для взятие куста

[21:27:37] FERMA: 1 / -996858624.000000, -999124160.000000, 129.208770

if(pickupid == FermPickup[2] || pickupid == FermPickup[3])
{
for(new f = 0; f < sizeof(FermInfo); f++)
{
if(PlayerKist[playerid] == true)
{
new pID = GetFarmPickup(pickupid);
if(FermInfo[f][fNytriCar][pID] > 1000)//Если в машине меньше 1000 зерен то...
{
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
new string[30+MAX_PLAYER_NAME-2];
FermInfo[f][fNytriCar][pID] = 1000;
SendClientMessage(playerid, COLOR_WHITE, "Грузовик полон!");
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, FermInfo[f][fNytriCar][pID]);
DisablePlayerCheckpoint(playerid);
PlayerKist[playerid] = false;
}
else
{
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
new string[50+MAX_PLAYER_NAME-2];
FermInfo[f][fZaseeno] -= 5;//Отнимаем -5 засеености!
FermInfo[f][fNytriCar][pID] += 5;//Загрузили +5 зерен!
FermZarabotok[1] += FermInfo[f][fPayday];//Прибовляем заработок
static const ferm[] = "~b~count:~w~+%d$";
format(string, sizeof(string), ferm, FermZarabotok[1]);
GameTextForPlayer(playerid, string, 3000, 1);
DisablePlayerCheckpoint(playerid);//Удалили чекпоинт
//GetXYInFrontOfPlayer(playerid, FarmX, FarmY, FarmZ);
//SetPlayerCheckpoint(playerid, FarmX+random(2)+3, FarmY+random(2)+3, FarmZ, 2.0);
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
X12+=random(2);
Y12+=random(2);
SetPlayerCheckpoint(playerid, X12,Y12, Z12, 2.0);
printf("FERMA: 1 / %f, %f, %f\n", X12,Y12, Z12);
static const ferm_1[] = "Загруженно\n{ffffff}%d / 1000";
format(string, sizeof(string), ferm_1, FermInfo[f][fNytriCar][pID]);
Update3DTextLabelText(FermText3D[pID], COLOR_YELLOW, string);
PlayerKist[playerid] = false;
if(gettime() - GetPVarInt(playerid, "BotFarm") < 20)
{
if(GetPVarInt(playerid, "BotCount") == 1)
{
if(GetPVarInt(playerid, "FludTime") < gettime())
{
static const ferm_2[] = "<<Warning>> Игрок %s[%d]: Возможно бот фермер";
format(string, sizeof(string), ferm_2, PlayerInfo[playerid][pName], playerid);
SendAdminMessage(COLOR_RED, string);
SetPVarInt(playerid, "BotCount", 0);
SetPVarInt(playerid,"FludTime",gettime()+10);
}
}
}
SetPVarInt(playerid, "BotFarm", gettime());
SetPVarInt(playerid, "BotCount", GetPVarInt(playerid, "BotCount") +1);
PlayerCheck[1] = true;
}
}
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, FarmX, FarmY, FarmZ);
//SetPlayerCheckpoint(playerid, FarmX+random(2), FarmY+random(2), FarmZ, 2.0);
GetXYInFrontOfPlayer(playerid, X12, Y12, Z12);
X12+=random(2);
Y12+=random(2);
SetPlayerCheckpoint(playerid, X12,Y12, Z12, 2.0);
printf("FERMA: 1 / %f, %f, %f\n", X12,Y12, Z12);
PlayerKist[playerid] = false;
PlayerCheck[1] = true;
return 1;
}
}

и теперь 2 ошибка это сами автомобили кары фермы
например:
Farm0: есть 2 кары у них когда садишься вылезает диалог

ShowPlayerDialog(playerid, 39, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите начать сбор урожая?", "Да", "Нет");
потом как выхожу и опять сажусь у меня вылезает вот такой диалог

ShowPlayerDialog(playerid, 40, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите завершить сбор урожая?", "Да", "Нет");
теперь переходим на Farm1:
как только я сажусь в машину любую фермы 1 то у меня вылезает диалог

ShowPlayerDialog(playerid, 39, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите начать сбор урожая?", "Да", "Нет");
Все правильно но как только я вылезаю и сажусь обратно у меня должен вылетать вот этот диалог

ShowPlayerDialog(playerid, 40, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите завершить сбор урожая?", "Да", "Нет");
А на самом деле опять появляется вот этот

ShowPlayerDialog(playerid, 39, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите начать сбор урожая?", "Да", "Нет");
Может суть ошибки вообще в автомобилях? незнаю вот что я заметил при выдачи логов

DeimoS
19.06.2019, 01:13
Так а какой проверкой ты проверяешь, запущен ли сбор урожая для машины? Ну по какому условию показываешь диалоги, которые сейчас не работают. Вот в этом условии переменная, с которой всё сравнивается, реализована как-то не так (либо не продублировал её под новые фермы, либо продублировал неправильно)

Dima_Tushin
19.06.2019, 19:36
я эту проблему сейчас буду переделывать заново.
Найду ошибку еще напишу обязательно в теме.

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

Решил вопрос вот таким действием

в пикапе убрал проверку

GetXYInFrontOfPlayer(playerid, X, Y, Z);
и заменил проверку позиции на игрока и поставил рандом чекпоинт ГОТОВО все заработало мне кажется дело было в функции

GetXYInFrontOfPlayer
но странно почему на ферме 0 все работало а на другой нет вот это будет для меня загадка)
Ладно спасибо DeimoS что помогал мне если что обращусь еще)

Dima_Tushin
19.06.2019, 23:08
помогите хочу сделать проверку на ID фермы.
когда купил ферму 0 например еду на ферму 1 и сажусь спокойно в машины фермы 1.
как сделать проверку?

DeimoS
20.06.2019, 04:03
Эмм, ну а как ты указываешь, что игрок купил именно ферму 0? Так и проверяй

Dima_Tushin
22.06.2019, 00:17
Подскажите как лучше оптимизировать код?

тут я сделал проверки на владельца ферм,зама,фермера и если из других фермеров захочет угнать не получиться))

if(carid >= FermCarID[3] && carid <= FermCarID[4])
{
if(JobGO[playerid] == false)
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не Фермер/Владелец/Заместитель!");
RemovePlayerFromVehicle(playerid);
return 1;
}
for(new f = 0; f < sizeof(FermInfo); f++)
{
switch(PlayerInfo[playerid][pFarm])
{
case 1://проверка на владельца
{
if(FarmJob[playerid] == false)
{
ShowPlayerDialog(playerid, 52, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите начать сбор урожая?", "Да", "Нет");
return 1;
}
else if(FarmJob[playerid] == true)
{
ShowPlayerDialog(playerid, 53, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите завершить сбор урожая?", "Да", "Нет");
return 1;
}
switch(PlayerInfo[playerid][pFarmJob])//проверка на фермера/зама
{
case 1, 2:
{
if(FarmJob[playerid] == false)
{
ShowPlayerDialog(playerid, 52, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите начать сбор урожая?", "Да", "Нет");
return 1;
}
else if(FarmJob[playerid] == true)
{
ShowPlayerDialog(playerid, 53, DIALOG_STYLE_MSGBOX, "\n", "Вы хотите завершить сбор урожая?", "Да", "Нет");
return 1;
}
}
default:
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не Фермер/Владелец/Заместитель!");
RemovePlayerFromVehicle(playerid);
return 1;
}
}
}
default:
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не Фермер/Владелец/Заместитель!");
RemovePlayerFromVehicle(playerid);
return 1;
}
}
}
return 1;
}
мне кажется тут по максимуму все оптимизировано главное что работает и я добился чего хотел)

DeimoS
22.06.2019, 11:41
if(FarmJob[playerid] == false)
else if(FarmJob[playerid] == true)
Лучше делать вот так:

if(FarmJob[playerid] == false)
else
Смысл получится тот же, но в твоём варианте сервер будет два раза получать значение FarmJob, а в моём - один.

И не совсем понятно зачем у тебя там цикл, если ты, в итоге, никак с ним не работаешь, а определяешь всё через switch.

Код не идеален в плане оптимизации, но раз работает, то и не парься пока. Как опыта наберёшься, сможешь оптимизировать.

Dima_Tushin
22.06.2019, 15:56
исправил спасибо я что то даже не подумав написал)

Dima_Tushin
27.06.2019, 11:08
Удалил текст. так как решил проблему!