PDA

Просмотр полной версии : [Вопрос] /capture



TestBot
26.03.2020, 06:54
Здравствуйте уважаемые пользователи, у меня такая проблема с командой /capture, не захватывает территорию на радаре территория мигает, и капт не останавливается, и TextDraw не пропадает, неделя как, не могу исправить эту проблему..


Вот код:


CMD:capture(playerid)
{
if(!IsAGang(playerid)) return SendClientMessage(playerid, COLOR_GREY, YouCanNot);
else if(pInfo[playerid][pRank] < 9) return SendClientMessage(playerid, COLOR_GREY, "Захват территории доступен с 9 ранга!");
new h; gettime(h);
//if(!(11 <= h <= 22)) return SendClientMessage(playerid, COLOR_GREY, "Проводить захват можно только с 11:00 до 22:00");
if(pInfo[playerid][pMember] == 7 && b_Capture[0]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
else if(pInfo[playerid][pMember] == 8 && b_Capture[1]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
else if(pInfo[playerid][pMember] == 9 && b_Capture[2]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
else if(pInfo[playerid][pMember] == 10 && b_Capture[3]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
else if(pInfo[playerid][pMember] == 11 && b_Capture[4]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
else if(FrakCD != 0)
{
new fd[128];
format(fd,sizeof(fd),"Следующий захват территории возможен через %d мин", FrakCD/60);
return SendClientMessage(playerid,COLOR_GREY,fd);
}
new zone = GetPlayerGangZone(playerid);
if(zone == -1) return SendClientMessage(playerid, COLOR_GREY, "Вы должны находится в опасном районе");
else if(CaptureStatus) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Уже происходит захват одной из зон. Дождитесь окончания!");
else if(GZInfo[zone][gFrak] == pInfo[playerid][pMember]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Вы не можете захватывать зону вашей банды!");
else if(GZInfo[zone][gFrak] == 0)
{
new string[128];
format(string,sizeof(string),"Банда %s захватила новую территорию",Fraction_Name[pInfo[playerid][pMember]]);
SendGhettoMes(COLOR_BLUE, string);
GangZoneHideForAll(GangZone[zone]);
GangZoneShowForAll(GangZone[zone],TeamColors[pInfo[playerid][pMember]]);
GZInfo[zone][gFrak] = pInfo[playerid][pMember];
SaveGZ(zone);
return 1;
}
else if(GZInfo[zone][gFrak] == 22 && b_Capture[0]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
else if(GZInfo[zone][gFrak] == 23 && b_Capture[1]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
else if(GZInfo[zone][gFrak] == 24 && b_Capture[2]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
else if(GZInfo[zone][gFrak] == 25 && b_Capture[3]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
else if(GZInfo[zone][gFrak] == 26 && b_Capture[4]) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
//else if(IsPlayerInBandOnline(pInfo[playerid][pMember]) < 3) return SendClientMessage(playerid, COLOR_GREY, "Для захвата территории должен быть онлайн хотябы 3 членов банды");
//else if(IsPlayerInBandOnline(GZInfo[zone][gFrak]) < 3) return SendClientMessage(playerid, COLOR_GREY, "У банды владеющей этой территорией менее 3 членов банды онлайн");
new str[128];
format(str, sizeof(str), "%s начали захват территории банды %s", Fraction_Name[pInfo[playerid][pMember]], Fraction_Name[GZInfo[zone][gFrak]]);
SendGhettoMes(COLOR_ORANGE, str);
format(str, sizeof(str), "%s %s[%d] инициировал захват", Fraction_Rang[pInfo[playerid][pMember]][pInfo[playerid][pRank]], GetName(playerid), playerid);
SendGhettoMes(COLOR_ORANGE, str);
GangZoneFlashForAll(GangZone[zone], TeamColors[GetTeamID(playerid)]);
CaptureTime = 180;
FrakCD = 1800;
CaptureStatus = 1;
CaptureZone = zone;
GZInfo[zone][gNapad] = pInfo[playerid][pMember];
GangInfo[pInfo[playerid][pMember]][g_Capture] = 1;
GangInfo[GZInfo[zone][gFrak]][g_Capture] = 1;
GangInfo[pInfo[playerid][pMember]][g_Number] = 1;
GangInfo[GZInfo[zone][gFrak]][g_Number] = 0;
CaptureStart(pInfo[playerid][pMember], GZInfo[zone][gFrak]);
format(str, sizeof(str), "[A] Банда %s напала на территорию банды %s",Fraction_Name[pInfo[playerid][pMember]],Fraction_Name[GZInfo[zone][gFrak]]);
SendAdminMessage(COLOR_GRAD1, str);
return 1;
}



stock GangZoneCheck()
{
if(CaptureTime > 0 || CaptureStatus == 0) return 1;
new i = CaptureZone, players_in_square_frak, players_in_square_napad;
foreach(new playerid: Player)
{
if(GZInfo[i][gFrak] != pInfo[playerid][pMember] && GZInfo[i][gNapad] != pInfo[playerid][pMember]) continue;
if(IsPlayerToSquare(playerid, GZInfo[i][gCoords][0], GZInfo[i][gCoords][1], GZInfo[i][gCoords][2], GZInfo[i][gCoords][3]))
{
if(GZInfo[i][gFrak] == pInfo[playerid][pMember]) players_in_square_frak++;
else players_in_square_napad++;
}
}
new string[128];
if(GangInfo[GZInfo[i][gFrak]][g_Score] > GangInfo[GZInfo[i][gNapad]][g_Score])
{
format(string,sizeof(string),"Попытка захватить территорию %s провалилась",Fraction_Name[GZInfo[i][gFrak]]);
SendGhettoMes(COLOR_BLUE, string);
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangZoneStopFlashForAll(GangZone[i]);
GangZoneHideForAll(GangZone[i]);
GangZoneShowForAll(GangZone[i],TeamColors[GZInfo[i][gFrak]]);
foreach(new x : Player)
{
if(!gPlayerLogged[x] || (pInfo[x][pMember] != GZInfo[i][gNapad] && pInfo[x][pMember] != GZInfo[i][gFrak])) continue;
ClearDeathMessage(x);
}
GangInfo[GZInfo[i][gNapad]][g_Capture] =
GangInfo[GZInfo[i][gNapad]][g_Score] =
GangInfo[GZInfo[i][gFrak]][g_Capture] =
GangInfo[GZInfo[i][gFrak]][g_Score] =
GangInfo[GZInfo[i][gNapad]][g_Number] =
GangInfo[GZInfo[i][gFrak]][g_Number] = 0;
GZInfo[i][gFrak] = GZInfo[i][gFrak];
GZInfo[i][gNapad] = 0;
SaveGZ(i);
}
else if(GangInfo[GZInfo[i][gFrak]][g_Score] == GangInfo[GZInfo[i][gNapad]][g_Score])
{
if(players_in_square_frak > players_in_square_napad)
{
format(string,sizeof(string),"Попытка захватить территорию %s провалилась",Fraction_Name[GZInfo[i][gFrak]]);
SendGhettoMes(COLOR_BLUE, string);
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangZoneStopFlashForAll(GangZone[i]);
GangZoneHideForAll(GangZone[i]);
GangZoneShowForAll(GangZone[i],TeamColors[GZInfo[i][gFrak]]);
foreach(new x : Player)
{
if(!gPlayerLogged[x] || (pInfo[x][pMember] != GZInfo[i][gNapad] && pInfo[x][pMember] != GZInfo[i][gFrak])) continue;
ClearDeathMessage(x);
}
GangInfo[GZInfo[i][gNapad]][g_Capture] =
GangInfo[GZInfo[i][gNapad]][g_Score] =
GangInfo[GZInfo[i][gFrak]][g_Capture] =
GangInfo[GZInfo[i][gFrak]][g_Score] =
GangInfo[GZInfo[i][gNapad]][g_Number] =
GangInfo[GZInfo[i][gFrak]][g_Number] = 0;
GZInfo[i][gFrak] = GZInfo[i][gFrak];
GZInfo[i][gNapad] = 0;
SaveGZ(i);
}
else if(players_in_square_frak == players_in_square_napad)
{
format(string,sizeof(string),"Банда %s захватила новую территорию",Fraction_Name[GZInfo[i][gNapad]]);
SendGhettoMes(COLOR_BLUE, string);
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangZoneStopFlashForAll(GangZone[i]);
GangZoneHideForAll(GangZone[i]);
GangZoneShowForAll(GangZone[i],TeamColors[GZInfo[i][gNapad]]);
foreach(new x : Player)
{
if(!gPlayerLogged[x] || (pInfo[x][pMember] != GZInfo[i][gNapad] && pInfo[x][pMember] != GZInfo[i][gFrak])) continue;
ClearDeathMessage(x);
}
GangInfo[GZInfo[i][gNapad]][g_Capture] =
GangInfo[GZInfo[i][gNapad]][g_Score] =
GangInfo[GZInfo[i][gFrak]][g_Capture] =
GangInfo[GZInfo[i][gFrak]][g_Score] =
GangInfo[GZInfo[i][gNapad]][g_Number] =
GangInfo[GZInfo[i][gFrak]][g_Number] = 0;
GZInfo[i][gFrak] = GZInfo[i][gNapad];
GZInfo[i][gNapad] = 0;
SaveGZ(i);
}
else
{
format(string,sizeof(string),"Банда %s захватила новую территорию",Fraction_Name[GZInfo[i][gNapad]]);
SendGhettoMes(COLOR_BLUE, string);
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangZoneStopFlashForAll(GangZone[i]);
GangZoneHideForAll(GangZone[i]);
GangZoneShowForAll(GangZone[i],TeamColors[GZInfo[i][gNapad]]);
foreach(new x : Player)
{
if(!gPlayerLogged[x] || (pInfo[x][pMember] != GZInfo[i][gNapad] && pInfo[x][pMember] != GZInfo[i][gFrak])) continue;
ClearDeathMessage(x);
}
GangInfo[GZInfo[i][gNapad]][g_Capture] =
GangInfo[GZInfo[i][gNapad]][g_Score] =
GangInfo[GZInfo[i][gFrak]][g_Capture] =
GangInfo[GZInfo[i][gFrak]][g_Score] =
GangInfo[GZInfo[i][gNapad]][g_Number] =
GangInfo[GZInfo[i][gFrak]][g_Number] = 0;
GZInfo[i][gFrak] = GZInfo[i][gNapad];
GZInfo[i][gNapad] = 0;
SaveGZ(i);
}
}
else
{
format(string,sizeof(string),"Банда %s захватила новую территорию",Fraction_Name[GZInfo[i][gNapad]]);
SendGhettoMes(COLOR_BLUE, string);
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangZoneStopFlashForAll(GangZone[i]);
GangZoneHideForAll(GangZone[i]);
GangZoneShowForAll(GangZone[i],TeamColors[GZInfo[i][gNapad]]);
foreach(new x : Player)
{
if(!gPlayerLogged[x] || (pInfo[x][pMember] != GZInfo[i][gNapad] && pInfo[x][pMember] != GZInfo[i][gFrak])) continue;
ClearDeathMessage(x);
}
GangInfo[GZInfo[i][gNapad]][g_Capture] =
GangInfo[GZInfo[i][gNapad]][g_Score] =
GangInfo[GZInfo[i][gFrak]][g_Capture] =
GangInfo[GZInfo[i][gFrak]][g_Score] =
GangInfo[GZInfo[i][gNapad]][g_Number] =
GangInfo[GZInfo[i][gFrak]][g_Number] = 0;
GZInfo[i][gFrak] = GZInfo[i][gNapad];
GZInfo[i][gNapad] = 0;
SaveGZ(i);
}
CaptureStatus = 0;
CaptureZone = 0;
return 1;
}

stock GetPlayerGangZone(playerid)
{
for(new i = 0; i < sizeof(GZInfo); i++)
{
if(IsPlayerToSquare(playerid, GZInfo[i][gCoords][0], GZInfo[i][gCoords][1], GZInfo[i][gCoords][2], GZInfo[i][gCoords][3]))
{
return i;
}
}
return -1;
}

stock CaptureUpdate(gangid)
{
new string[64];
if(GangInfo[gangid][g_Number] == 1)
{
format(string, sizeof(string), "%d", GangInfo[gangid][g_Score]);
TextDrawSetString(panel_capture_TD[5], string);
}
else
{
format(string, sizeof(string), "%d", GangInfo[gangid][g_Score]);
TextDrawSetString(panel_capture_TD[6], string);
}
}

stock GetGangName(fracid)
{
new fracname[20];
switch(fracid)
{
case TEAM_GROVE: fracname = "Grove Street";
case TEAM_BALLAS: fracname = "The Ballas";
case TEAM_RIFA: fracname = "The Rifa";
case TEAM_CORONA: fracname = "Varios Los Aztecas";
case TEAM_VAGOS: fracname = "Los Santos Vagos";
}
return fracname;
}

stock CaptureShow(playerid, gangid, targetgangid, status)
{
new string[64];
if(status == 1)
{
GangZoneFlashForPlayer(playerid, GangZone[CaptureZone], TeamColors[gangid]);
for(new s; s < 7; s++) TextDrawShowForPlayer(playerid, panel_capture_TD[s]);
format(string, sizeof(string), "%s", GetGangName(gangid));
TextDrawSetString(panel_capture_TD[3], string);
format(string, sizeof(string), "%s", GetGangName(targetgangid));
TextDrawSetString(panel_capture_TD[4], string);
format(string, sizeof(string), "%d", GangInfo[gangid][g_Score]);
TextDrawSetString(panel_capture_TD[5], string);
format(string, sizeof(string), "%d", GangInfo[targetgangid][g_Score]);
TextDrawSetString(panel_capture_TD[6], string);
}
else if(status == 0)
{
if(GetPVarInt(playerid, "settext") == 1) DeletePVar(playerid, "settext");
GangZoneStopFlashForPlayer(playerid, GangZone[CaptureZone]);
ClearDeathMessage(playerid);
for(new s; s < 7; s++) TextDrawHideForPlayer(playerid, panel_capture_TD[s]);
}
}

stock CaptureStart(gangid, targetgangid)
{
new string[64];
foreach(new i : Player)
{
if(!gPlayerLogged[i]) continue;
if(pInfo[i][pMember] == gangid || pInfo[i][pMember] == targetgangid)
{
if(pInfo[i][pAdmin]) SetPVarInt(i, "settext", 1);
for(new s; s < 7; s++) TextDrawShowForPlayer(i, panel_capture_TD[s]);
format(string, sizeof(string), "%s", GetGangName(gangid));
TextDrawSetString(panel_capture_TD[3], string);
format(string, sizeof(string), "%s", GetGangName(targetgangid));
TextDrawSetString(panel_capture_TD[4], string);
TextDrawSetString(panel_capture_TD[5], "0");
TextDrawSetString(panel_capture_TD[6], "0");
}
}
}

stock CaptureEnd(gangid, targetgangid)
{
foreach(new i : Player)
{
if(pInfo[i][pMember] == gangid || pInfo[i][pMember] == targetgangid || GetPVarInt(i, "settext") == 1)
{
if(GetPVarInt(i, "settext") == 1) DeletePVar(i, "settext");
for(new s; s < 7; s++) TextDrawHideForPlayer(i, panel_capture_TD[s]);
}
}
}


Буду рад Вам за помощь.

punkochel
27.03.2020, 00:12
Извини, все не стал разбирать, самое первое что в глаза бросилось. У тебя в GangZoneCheck в начале стоит проверка if(CaptureTime > 0 || CaptureStatus == 0) return 1;
На сколько мне понятно, это значение времени для таймера в секундах, но я не нашел декремента, из чего следует что у тебя будет терра длится постоянно.
Поменяй ее на if(CaptureTime < 0 || CaptureStatus == 0) return 1;

Отпишись если не будет работать, обязательно поможем.

UPD: И еще, если ты используешь функцию GangZoneCheck в таймере, то создай ее лучше через public предварительно объявив для нее forward разумеется.

TestBot
27.03.2020, 00:57
Привет друг, у меня GangZoneCheck стоит на


forward SecTimer();
public SecTimer()
{

GangZoneCheck();

if(FrakCD > 0 && !CaptureStatus) FrakCD--;
if(CaptureTime > 0)
{
CaptureTime--;
TextDrawSetString(panel_capture_TD[2], Converts(CaptureTime));
GangZoneFlashForAll(GangZone[CaptureZone],TeamColors[GZInfo[CaptureZone][gNapad]]);
}
}
return 1;
}


ещё в OnGameInt есть SetTimer("SecTimer", 1000, true);

punkochel
27.03.2020, 07:08
В таком случае нужно сделать то, что я написал выше и ещё вот это:
public SecTimer()
{

if(FrakCD > 0 && !CaptureStatus) FrakCD--;
if(CaptureTime > 0)
{
CaptureTime--;
GangZoneCheck();
TextDrawSetString(panel_capture_TD[2], Converts(CaptureTime));
GangZoneFlashForAll(GangZone[CaptureZone],TeamColors[GZInfo[CaptureZone][gNapad]]);
}
}
return 1;
}

P.S. пишу с телефона.

UPD: на самом деле тут можно все гораздо проще сделать.

TestBot
27.03.2020, 09:24
Да, не братан, чёт не помогло...

Paradox
29.03.2020, 17:20
Код кривой, советую переписать полностью систему...

P.S а вообще пробуй так:

В stock GangZoneCheck() заменить:


if(CaptureTime > 0 || CaptureStatus == 0) return 1;// это вот заменить на

if(CaptureTime < 1 && CaptureStatus == 0) return 1; // вот это

// а вот этот код удалить..
CaptureStatus = 0;
CaptureZone = 0;
// И добавить после if(CaptureTime > 0 && CaptureStatus != 0) return 1;" вот это
if(CaptureTime == 0)
{
CaptureStatus = CaptureZone = 0;
}


Заменить public SecTimer() на это:


forward SecTimer();
public SecTimer()
{
if(FrakCD > 0 && !CaptureStatus)
{
FrakCD--;
}
if(CaptureTime > 0)
{
CaptureTime--;
TextDrawSetString(panel_capture_TD[2], Converts(CaptureTime));
GangZoneFlashForAll(GangZone[CaptureZone],TeamColors[GZInfo[CaptureZone][gNapad]]);
}
GangZoneCheck();
return 1;
}

TestBot
15.04.2020, 17:25
UPDATE