PDA

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



Logan Jacskon
16.09.2017, 15:07
Здравствуйте, у меня не работает команда /capture, не захватывает территорию, таймер стоит на 00:00 и ничего не происходит, и территория продолжает мигать, + можно захватить другую терру... какой то, странный баг. Нигде такую проблему не нашел, помогите пожалуйста поставлю жирный плюс.


//=-=-=--==-=-=-=-=-
new FrakCD;
new PlayerText:CaptureTD[MAX_PLAYERS][8];

new bool:IsCapture;

enum Ganginfa
{
capture,
score,
captureid,
gangnumber
}
new GangInfo[MAX_GANGS][Ganginfa];

new bool:drawcapt[MAX_PLAYERS];

new OnZONE[MAX_GANGZONES][20];
new ZoneOnBattle[MAX_GANGZONES];
new allowedfactions[] = {22, 23, 24, 25, 26};
new GZSafeTime[MAX_GANGZONES];
new GangTotalGz[5];//rifa,aztec,ballas,grove,vagos
enum GzoneInfo
{
gID,
Float:gCoords[4],
gFrak,
gNapad
}
new GZInfo[MAX_GANGZONES][GzoneInfo];
new GangZone[MAX_GANGZONES];


CMD:capture(playerid, params[])
{
if(!IsAGang(playerid)) return SendClientMessage(playerid, COLOR_GREY, YouCanNot);
if(pInfo[playerid][pRank] < 9) return SendClientMessage(playerid,COLOR_GREY,"Для захвата зоны необходимо иметь ранг не менее 9-го");
new h; gettime(h);
if(h < 1 || h > 23) return SendClientMessage(playerid, COLOR_GREY, "Проводить захват можно только с 12:00 до 22:00");
new faction = pInfo[playerid][pMember];
if(pInfo[playerid][pMember] == 22 && b_Capture{0}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
if(pInfo[playerid][pMember] == 23 && b_Capture{1}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
if(pInfo[playerid][pMember] == 24 && b_Capture{2}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
if(pInfo[playerid][pMember] == 25 && b_Capture{3}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
if(pInfo[playerid][pMember] == 26 && b_Capture{4}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ вашей банде к войне за территории закрыт");
if(FrakCD != 0)
{
new fd[128];
format(fd,sizeof(fd),"Следующий захват территории возможен через %d минут(ы)", FrakCD/60);
SendClientMessage(playerid,COLOR_GREY,fd);
return 1;
}
if(!IsInAllowed(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Ваша банда уже участвует в захвате зон!");
new str[128];
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]) && ZoneOnBattle[i] == 0)
{
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Нельзя использовать в машине!");
{
if(GZInfo[i][gFrak] == faction) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Вы не можете захватывать зону вашей банды!");
if(GZInfo[i][gFrak] == 0) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Нельзя захватить эту территорию");
if(GZInfo[i][gFrak] == 22 && b_Capture{0}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
if(GZInfo[i][gFrak] == 23 && b_Capture{1}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
if(GZInfo[i][gFrak] == 24 && b_Capture{2}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
if(GZInfo[i][gFrak] == 25 && b_Capture{3}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
if(GZInfo[i][gFrak] == 26 && b_Capture{4}) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Доступ данной банды к войне за территории закрыт");
if(IsCapture == true) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Уже происходит захват одной из зон. Дождитесь окончания!");
if(IsPlayerInBandOnline(faction) < 0) return SendClientMessage(playerid, COLOR_GREY, "В вашей банде мало игроков онлайн, нужно минимум 5!");
/*if(IsPlayerInBandOnline(GZInfo[i][gFrak]) < 0)
{
format(str, sizeof(str), "У банды \"%s\" мало игроков,нужно минимум 5!", GetGangName(GZInfo[i][gFrak]));
SendClientMessage(playerid, COLOR_GREY, str);
return 1;
}*/
format(str, sizeof(str), "На вашу территорию напала банда %s, у вас есть 5 минут чтобы отстоять её!", Fraction_Name[pInfo[playerid][pMember]]);
SendFracMes(GZInfo[i][gFrak], COLOR_LIGHTRED, str);
format(str, sizeof(str), "Если по истечению времени вас не будет на территории, она перейдет к %s",Fraction_Name[pInfo[playerid][pMember]]);
SendFracMes(GZInfo[i][gFrak], COLOR_VITYA2, str);
format(str, sizeof(str), "%s[%d] напал на территорию банды %s",pInfo[playerid][pName],playerid,GetGangName(GZInfo[i][gFrak]));
SendFracMes(faction, COLOR_LIME, str);
GangZoneFlashForAll(GangZone[i],GetGangZoneColor(faction));
GZSafeTime[i] = 100;
FrakCD = 120;
GZInfo[i][gNapad] = faction;
ZoneOnBattle[i] = 1;
GangInfo[faction][capture] = 1;
GangInfo[GZInfo[i][gFrak]][capture] = 1;
GangInfo[GZInfo[i][gFrak]][captureid] = faction;
GangInfo[faction][captureid] = faction;
GangInfo[faction][gangnumber] = 1;
GangInfo[GZInfo[i][gFrak]][gangnumber] = 0;
CaptureStart(faction, GZInfo[i][gFrak]);
format(str, sizeof(str), "[A] Банда %s напала на территорию банды %s",GetGangName(faction),GetGangName(GZInfo[i][gFrak]));
SendAdminMessage(COLOR_GRAD1, str);
}
}
}
return 1;
}


forward SecTimer();
public SecTimer()
{
for(new i; i < 6; i++) if(gGunWorkTime[i]) gGunWorkTime[i]--;

WHDataUpdate();

BizWarCheck();

GzCheck();
new stringText[30];
for(new i = 0; i < sizeof(GZInfo); i++)
{
if(GZSafeTime[i] > 0)
{
GZSafeTime[i]--;
foreach(new x: Player)
{
if(pInfo[x][pMember] == GZInfo[i][gNapad] || pInfo[x][pMember] == GZInfo[i][gFrak])
{
Convert(GZSafeTime[i], stringText);
PlayerTextDrawSetString(x, CaptureTD[x][3], stringText);
}
}
}
}
return 1;
}



stock SaveGZ(idx)
{
mysql_query_string[0] = EOS;

format(mysql_query_string, 100, "UPDATE "T_GANGZONE" SET fraction = %i WHERE id = %i", GZInfo[idx][gFrak], idx);
mysql_tquery(huseyn, mysql_query_string, "", "");
return 1;
}

@LoadGZ();
@LoadGZ()
{
new time = GetTickCount();
new rows;

cache_get_row_count(rows);
if(rows)
{
for(new idx = 0; idx < rows; idx++)
{
cache_get_value_index_int(idx, 0, GZInfo[idx][gID]); // id
cache_get_value_index_float(idx, 1, GZInfo[idx][gCoords][0]); // ginfo1
cache_get_value_index_float(idx, 2, GZInfo[idx][gCoords][1]); // ginfo2
cache_get_value_index_float(idx, 3, GZInfo[idx][gCoords][2]); // ginfo3
cache_get_value_index_float(idx, 4, GZInfo[idx][gCoords][3]); // ginfo4
cache_get_value_index_int(idx, 5, GZInfo[idx][gFrak]); // fraction
TOTALGZ++;
GangZone[idx] = GangZoneCreate(GZInfo[idx][gCoords][0],GZInfo[idx][gCoords][1],GZInfo[idx][gCoords][2],GZInfo[idx][gCoords][3]);
ZoneOnBattle[idx] = 0;
GZSafeTime[idx] = 0;
}
}
printf("[Загружено гангзон]: <%i>. Потрачено: <%i ms>.", TOTALGZ, GetTickCount() - time);
return 1;
}



stock GzCheck()
{
new string[256],
SCORE[128];
for(new i = 0; i < sizeof(GZInfo); i++)
{
if(ZoneOnBattle[i] == 1 && IsCapture == true)
{
foreach(new x: Player)
{
if(!gPlayerLogged[x] == false && drawcapt[x] == true) continue;
if(pInfo[x][pMember] == GZInfo[i][gNapad] || pInfo[x][pMember] == GZInfo[i][gFrak])
{
for(new s; s < 8; s++) PlayerTextDrawShow(x, CaptureTD[x][s]);
format(SCORE, sizeof(SCORE), "%s", GetGangName(GZInfo[i][gNapad]));
PlayerTextDrawSetString(x, CaptureTD[x][4], SCORE);
format(SCORE, sizeof(SCORE), "%s", GetGangName(GZInfo[i][gFrak]));
PlayerTextDrawSetString(x, CaptureTD[x][7], SCORE);
format(SCORE, sizeof(SCORE), "%d", GangInfo[GZInfo[i][gNapad]][score]);
PlayerTextDrawSetString(x, CaptureTD[x][5], SCORE);
format(SCORE, sizeof(SCORE), "%d", GangInfo[GZInfo[i][gFrak]][score]);
PlayerTextDrawSetString(x, CaptureTD[x][6], SCORE);
GangZoneFlashForPlayer(x,GangZone[i],GetGangZoneColor(GZInfo[i][gNapad]));
drawcapt[x] = true;
}
}
}
if(ZoneOnBattle[i] == 1 && GZSafeTime[i] == 0)
{
if(GangInfo[GZInfo[i][gNapad]][score] == GangInfo[GZInfo[i][gFrak]][score])
{
new zh = GZInfo[i][gNapad];
new zj = i;
new zg = GZInfo[i][gFrak];
format(string, 128, "Вы захватили новую территорию, которая находилась под контролем банды %s",GetGangName(zg));
SendFracMes(GZInfo[i][gNapad],COLOR_GREEN, string);
format(string, 128, "Вам не удалось отстоять свою территорию, теперь эта территория под контролем банды %s",GetGangName(zh));
SendFracMes(GZInfo[i][gFrak],COLOR_RED, string);
ZoneOnBattle[i] = 0;
IsCapture = false;
CaptureEnd(GZInfo[i][gNapad], GZInfo[i][gFrak]);
GangInfo[GZInfo[i][gNapad]][captureid] =
GangInfo[GZInfo[i][gNapad]][capture] =
GangInfo[GZInfo[i][gNapad]][score] =
GangInfo[GZInfo[i][gFrak]][captureid] =
GangInfo[GZInfo[i][gFrak]][capture] =
GangInfo[GZInfo[i][gFrak]][score] =
GangInfo[GZInfo[i][gNapad]][gangnumber] =
GangInfo[GZInfo[i][gFrak]][gangnumber] = 0;
GZInfo[zj][gFrak] = zh;
GZInfo[zj][gNapad] = 0;
GangZoneStopFlashForAll(GangZone[zj]);
GangZoneHideForAll(GangZone[zj]);
GangZoneShowForAll(GangZone[zj],GetGangZoneColor(zj));
SaveGZ(zj);
UpdTerrsBand();
}
else if(GangInfo[GZInfo[i][gNapad]][score] > GangInfo[GZInfo[i][gFrak]][score])
{
new zx = GZInfo[i][gNapad];
new zl = i;
format(string, 128, "Вы захватили новую территорию, которая находилась под контролем банды %s", GetGangName(GZInfo[i][gFrak]));
SendFracMes(GZInfo[i][gNapad],COLOR_GREEN, string);
format(string, 128, "Вам не удалось отстоять свою территорию, теперь эта территория под контролем банды %s",GetGangName(zx));
SendFracMes(GZInfo[i][gFrak],COLOR_RED, string);
ZoneOnBattle[zl] = 0;
CaptureEnd(GZInfo[zl][gNapad], GZInfo[zl][gFrak]);
GangInfo[GZInfo[zl][gNapad]][captureid] =
GangInfo[GZInfo[zl][gNapad]][capture] =
GangInfo[GZInfo[zl][gNapad]][score] =
GangInfo[GZInfo[zl][gFrak]][captureid] =
GangInfo[GZInfo[zl][gFrak]][capture] =
GangInfo[GZInfo[zl][gFrak]][score] =
GangInfo[GZInfo[i][gNapad]][gangnumber] =
GangInfo[GZInfo[i][gFrak]][gangnumber] = 0;
GZInfo[zl][gFrak] = zx;
GZInfo[zl][gNapad] = 0;
IsCapture = false;
GangZoneStopFlashForAll(GangZone[zl]);
GangZoneHideForAll(GangZone[zl]);
GangZoneShowForAll(GangZone[zl],GetGangZoneColor(zl));
SaveGZ(zl);
UpdTerrsBand();
}
else if(GangInfo[GZInfo[i][gNapad]][score] < GangInfo[GZInfo[i][gFrak]][score])
{
new zx = GZInfo[i][gFrak];
new zl = i;
SendFracMes(GZInfo[i][gNapad],COLOR_RED, "Вам не удалось захватить новую территорию");
SendFracMes(GZInfo[i][gFrak],COLOR_GREEN,"Вы отстояли свою территорию");
ZoneOnBattle[zl] = 0;
CaptureEnd(GZInfo[zl][gNapad], GZInfo[zl][gFrak]);
GangInfo[GZInfo[zl][gNapad]][captureid] =
GangInfo[GZInfo[zl][gNapad]][capture] =
GangInfo[GZInfo[zl][gNapad]][score] =
GangInfo[GZInfo[zl][gFrak]][captureid] =
GangInfo[GZInfo[zl][gFrak]][capture] =
GangInfo[GZInfo[zl][gFrak]][score] =
GangInfo[GZInfo[i][gNapad]][gangnumber] =
GangInfo[GZInfo[i][gFrak]][gangnumber] = 0;
IsCapture = false;
GZInfo[zl][gFrak] = zx;
GZInfo[zl][gNapad] = 0;
GangZoneStopFlashForAll(GangZone[zl]);
GangZoneHideForAll(GangZone[zl]);
GangZoneShowForAll(GangZone[zl],GetGangZoneColor(zl));
SaveGZ(zl);
UpdTerrsBand();
}
}
}
for(new i = 0; i < sizeof(GZInfo); i++)
{
for(new z = 0; z < 20; z++)
{
OnZONE[i][z] = 0;
}
}
return 1;
}

stock CaptureUpd(bandkiller)
{
new SCORE[64];
foreach(new i: Player)
{
if(!gPlayerLogged[i] == false) continue;
if(pInfo[i][pMember] > sizeof(GangInfo)) continue;
if(GangInfo[pInfo[i][pMember]][capture] > 0)
{
if(GangInfo[bandkiller][gangnumber] == 1)
{
format(SCORE, sizeof(SCORE), "%d", GangInfo[bandkiller][score]);
PlayerTextDrawSetString(i, CaptureTD[i][5], SCORE);
}
else
{
format(SCORE, sizeof(SCORE), "%d", GangInfo[bandkiller][score]);
PlayerTextDrawSetString(i, CaptureTD[i][6], SCORE);
}
}
}
}

stock CaptureStart(familyone, familytwo)
{
new SCORE[64];
foreach(new i: Player)
{
if(!gPlayerLogged[i] == false) continue;
if(pInfo[i][pMember] == familyone || pInfo[i][pMember] == familytwo)
{
for(new s; s < 8; s++) PlayerTextDrawShow(i, CaptureTD[i][s]);
format(SCORE, sizeof(SCORE), "%s", GetGangName(familyone));
PlayerTextDrawSetString(i, CaptureTD[i][5], SCORE);
format(SCORE, sizeof(SCORE), "%s", GetGangName(familytwo));
PlayerTextDrawSetString(i, CaptureTD[i][6], SCORE);
PlayerTextDrawSetString(i, CaptureTD[i][1], "0");
PlayerTextDrawSetString(i, CaptureTD[i][2], "0");
drawcapt[i] = true;
IsCapture = true;
}
}
}

stock CaptureEnd(familyone, familytwo)
{
foreach(new i: Player)
{
if(pInfo[i][pMember] == familyone || pInfo[i][pMember] == familytwo)
{
for(new s; s < 8; s++) PlayerTextDrawHide(i, CaptureTD[i][s]);
drawcapt[i] = false;
}
}
}

stock GetGangZoneColor(fractionid)
return
(GZInfo[fractionid][gFrak] == TEAM_GROVE) ? (0x009900AA) :
(GZInfo[fractionid][gFrak] == TEAM_BALLAS) ? (0xCC00FFAA) :
(GZInfo[fractionid][gFrak] == TEAM_VAGOS) ? (0xeee515AA) :
(GZInfo[fractionid][gFrak] == TEAM_RIFA) ? (0x6666FFAA) :
(GZInfo[fractionid][gFrak] == TEAM_CORONA) ? (0x00CCFFAA) : (0xFFFFFF65);

stock GetGangName(fractionid)
{
new string[20];
switch(fractionid)
{
case 22: format(string, sizeof(string), "Grove Street");
case 23: format(string, sizeof(string), "The Ballas");
case 24: format(string, sizeof(string), "Los Santos Vagos");
case 25: format(string, sizeof(string), "The Rifa");
case 26: format(string, sizeof(string), "Varios Los Aztecas");
}
return string;
}

stock IsInAllowed(playerid)
{
for(new i = 0; i < sizeof(allowedfactions); i++)
{
if(pInfo[playerid][pMember] == allowedfactions[i]||pInfo[playerid][pLeader] == allowedfactions[i]) return 1;
}
return 0;
}

stock IsPlayerInBandOnline(fractionid)
{
new np;
foreach(new i : Player)
{
if(!gPlayerLogged[i]) continue;
if(pInfo[i][pMember] == fractionid || pInfo[i][pLeader] == fractionid) np++;
}
return np;
}

Logan Jacskon
18.09.2017, 18:45
UP-UP

DeimoS
18.09.2017, 20:16
Логируй, срабатывает ли код скрытия текстдравов и дальше уже смотри на каком моменте перестаёт всё работать

Logan Jacskon
19.09.2017, 07:33
Логируй, срабатывает ли код скрытия текстдравов и дальше уже смотри на каком моменте перестаёт всё работать

Как это сделать ?

DeimoS
19.09.2017, 11:30
print/printf/SendClientMessage
Всё, что позволит тебе определить на какой строке перестал обрабатываться код

vovandolg
27.09.2017, 11:56
for(new i = 0; i < sizeof(GZInfo); i++)

foreach(new x: Player)

Можно было бы и не все зоны и не всех игроков перебирать, а только нужные или нужных,
зон нибусь штук 100-150:crazy: а нужно две или одну)) так и игроков меньше половины наверное или половина из всего онлайна что будет)

Inferno
01.01.2018, 23:06
forward SecTimer();
public SecTimer()
{
for(new i; i < 6; i++) if(gGunWorkTime[i]) gGunWorkTime[i]--;

WHDataUpdate();

BizWarCheck();

GzCheck();
new stringText[30];
for(new i = 0; i < sizeof(GZInfo); i++)
{
if(GZSafeTime[i] > 0)
{
GZSafeTime[i]--;
foreach(new x: Player)
{
if(pInfo[x][pMember] == GZInfo[i][gNapad] || pInfo[x][pMember] == GZInfo[i][gFrak])
{
Convert(GZSafeTime[i], stringText);
PlayerTextDrawSetString(x, CaptureTD[x][3], stringText);
}
}
}
}
return 1;
}

У тебя идет таймер, но после того, как значение становится 0, ничего не происходит. Т.к у тебя нет проверки на окончание таймера и далее на перекраску территории.
Ты должен после этой строки
{
Convert(GZSafeTime[i], stringText);
PlayerTextDrawSetString(x, CaptureTD[x][3], stringText);
}
поставить проверку на время = 0, далее используешь функцию перекраски территории и все.
На счет того, что могут каптить, у тебя проблема со временем, 120 секунд/60 = 2секунды, а не часы, но в этом не уверен(50/50)
На счет еще одного капта, у тебя capture = 1, после ввода команды. Тебе нужно создать таймер, который будет убавляться и когда значение таймера = 0, capture = 0 и они снова смогут каптиться. Значит, ты должен при вводе команды /capture поставить проверку на капт, if(...[capture] == 1) return SCM(playerid,color,"нельзя");