Advertisement
DraKiNs

[FS] Sistema de Dominio

Nov 26th, 2011
466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.27 KB | None | 0 0
  1. // =============== [ Adaptar ao seu GM edita abaixo ] =================
  2.  
  3. #define fixColour(%0)           ((%0 & ~0xFF) | 0x77)
  4. #define GetGangColor(%0)        random(%0) // COLOCA AQUI VARIAVEL DA COR
  5. #define playerGang[%0]          GetPlayerGangID(%0) // COLOCA AQUI VARIAVEL DA GANG
  6.  
  7. // ============== [ Configurar Algo ] ===============================
  8.  
  9. #define MAX_DOM 1                                 // jogadores preciso para dominar
  10. #define MAX_GZ 44                                 // maximo de gz
  11. #define MAX_GANGS 32
  12.  
  13. // ============= [ Código ] =======================================
  14.  
  15. enum gzInfo
  16. {
  17.     Float:floatPos[4],
  18.     gzId,
  19.     gzCor,
  20.     gzLocal,
  21.     gzGangID
  22. }
  23.  
  24.  
  25. new gangZonasCriadas;
  26. new gzData[MAX_GZ][gzInfo];
  27. new pPlayersGz[MAX_GZ][MAX_GANGS];
  28. new galeraDominando[MAX_GANGS][MAX_GZ];
  29. new pontosArrecadados[MAX_GZ][MAX_GANGS];
  30.  
  31. public OnPlayerUpdate(playerid)
  32. {
  33.     static
  34.         Float:posX,
  35.         Float:posY,
  36.         Float:posZ;
  37.  
  38.     GetPlayerPos(playerid, posX, posY, posZ);
  39.  
  40.     for(new i = gangZonasCriadas;  i > -1; i--) {
  41.         if(posX > gzData[i][floatPos][0] && posY > gzData[i][floatPos][1] && posX < gzData[i][floatPos][2] && posY < gzData[i][floatPos][3]) {
  42.             if(playerGang[playerid]) {
  43. #if !defined foreach
  44. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  45. #endif
  46.                 foreach(Player, x) {
  47.  
  48.                     if(playerGang[playerid] == playerGang[x]) {
  49.                         pPlayersGz[i][playerGang[x]]++;
  50.                     }
  51.                 }
  52.                 if(pPlayersGz[i][playerGang[playerid]] >= MAX_DOM && !galeraDominando[playerGang[playerid]][i] && gzData[i][gzGangID] != playerGang[playerid]) {
  53.  
  54.                     pPlayersGz[i][playerGang[playerid]]=  0;
  55.                     galeraDominando[playerGang[playerid]][i] = 1;
  56.  
  57.                     if (!gzData[i][gzGangID]) {
  58.                         SetTimerEx("dominandoUncoped", 1000, false, "iii", i, playerGang[playerid], 0);
  59.                         GangZoneFlashForAll(i, fixColour(GetGangColor(playerGang[playerid])));
  60.                     }
  61.                     else {
  62.  
  63.                         SetTimerEx("dominandoOcupado", 60000, false, "iiii", i, playerGang[playerid], gzData[i][gzGangID],0);
  64.                         SetTimerEx("atualizarContadores", 1000, false, "iii", i, playerGang[playerid], gzData[i][gzGangID]);
  65.                         galeraDominando[gzData[i][gzGangID]][i] = 1;
  66.                         GangZoneFlashForAll(i, fixColour(GetGangColor(playerGang[playerid])));
  67.  
  68.                     }
  69.                 }
  70.             }
  71. // aqui se quiser tu coloca textdraws com a gangzone info
  72.         }
  73.     }
  74.     return true;
  75. }
  76.  
  77.  
  78. dominandoUncoped(gz, gg, ps);
  79. dominandoOcupado(gz, gg1, gg2);
  80. atualizarContadores(gz, gg1, gg2, ps);
  81.  
  82. public atualizarContadores(gz, gg1, gg2, ps)
  83. {
  84.  
  85. #if !defined foreach
  86. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  87. #endif
  88.  
  89.     new membrosNaAreas = 0;
  90.  
  91.     foreach(Player, x) {
  92.         if(playerGang[x] == gg1) {                // muda variavel da gang aqui
  93.             static
  94.                 Float:posX,
  95.                 Float:posY,
  96.                 Float:posZ;
  97.  
  98.             GetPlayerPos(x, posX, posY, posZ);
  99.  
  100.             if(posX > gzData[gz][floatPos][0] && posY > gzData[gz][floatPos][1] && posX < gzData[gz][floatPos][2] && posY < gzData[gz][floatPos][3])
  101.                 membrosNaAreas++;
  102.         }
  103.     }
  104.  
  105.     pontosArrecadados[gz][gg1] += membrosNaAreas * 10;
  106.     if(membrosNaAreas < MAX_DOM) {
  107.         foreach(Player, x) {
  108.             if(playerGang[x] == gg1) {            // muda variavel da gang aqui
  109.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Território não dominado por falta de membros " #MAX_DOM);
  110.             }
  111.         }
  112.         galeraDominando[gg1][gz] = 0;
  113.         galeraDominando[gg2][gz] = 0;
  114.         return false;
  115.     }
  116.     membrosNaAreas  = 0;
  117.  
  118.     foreach(Player, x) {
  119.         if(playerGang[x] == gg2) {                // muda variavel da gang aqui
  120.             static
  121.                 Float:posX,
  122.                 Float:posY,
  123.                 Float:posZ;
  124.  
  125.             GetPlayerPos(x, posX, posY, posZ);
  126.  
  127.             if(posX > gzData[gz][floatPos][0] && posY > gzData[gz][floatPos][1] && posX < gzData[gz][floatPos][2] && posY < gzData[gz][floatPos][3])
  128.                 membrosNaAreas++;
  129.         }
  130.     }
  131.  
  132.     pontosArrecadados[gz][gg2] += membrosNaAreas * 10;
  133.     if(membrosNaAreas < MAX_DOM) {
  134.         foreach(Player, x) {
  135.             if(playerGang[x] == gg2) {            // muda variavel da gang aqui
  136.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Território não dominado por falta de membros " #MAX_DOM);
  137.             }
  138.         }
  139.         galeraDominando[gg1][gz] = 0;
  140.         galeraDominando[gg2][gz] = 0;
  141.         return false;
  142.     }
  143.     membrosNaAreas  = 0;
  144.  
  145.     foreach(Player, x) {
  146.         if(playerGang[x] == gg1 || playerGang[x] == gg2) {
  147.             static string[128];
  148.             format(string, 128, "[INFO] Sua gang está dominando o territorio (%d/1000)", ps + (60000 / 1000));
  149.             SendClientMessage(x, 0xFFFFFFFFF, string);
  150.         }
  151.     }
  152.  
  153.     if(ps < 60000) {
  154.         SetTimerEx("atualizarContadores", 1000, false, "iiii", gz, gg1, gg2, ps);
  155.     }
  156.     return false;
  157. }
  158.  
  159.  
  160. public dominandoOcupado(gz, gg1, gg2)
  161. {
  162.  
  163. #if !defined foreach
  164. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  165. #endif
  166.  
  167.     if(pontosArrecadados[gz][gg2] > pontosArrecadados[gz][gg1]) {
  168.         foreach(Player, x) {
  169.             if(playerGang[x] == gg1) {
  170.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Sua Gang falhou em dominar");
  171.             }
  172.             if(playerGang[x] == gg2) {
  173.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Sua gang conseguiu conquistar território!");
  174.             }
  175.         }
  176.  
  177.         GangZoneShowForAll(gzData[gz][gzId], fixColour(GetGangColor(gg2)));
  178.  
  179.     }
  180.     else {
  181.         gzData[gz][gzGangID] =gg1;
  182.         GangZoneShowForAll(gzData[gz][gzId], fixColour(GetGangColor(gg1)));
  183.  
  184.         foreach(Player, x) {
  185.             if(playerGang[x] == gg2) {            // muda variavel da gang aqui
  186.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Sua Gang falhou em defender o território");
  187.             }
  188.             if(playerGang[x] == gg1) {
  189.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Sua gang conseguiu conquistar território!");
  190.             }
  191.         }
  192.  
  193.     }
  194.  
  195.     galeraDominando[gg1][gz] = 0;
  196.     galeraDominando[gg2][gz] = 0;
  197.     pontosArrecadados[gz][gg2]= 0;
  198.     pontosArrecadados[gz][gg1] = 0;
  199.     GangZoneStopFlashForAll(gzData[gz][gzId]);
  200.  
  201.     return false;
  202. }
  203.  
  204.  
  205. public dominandoUncoped(gz, gg, ps)
  206. {
  207. #if !defined foreach
  208. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  209. #endif
  210.  
  211.     if(gzData[gz][gzGangID]) {
  212.         foreach(Player, x) {
  213.             if(playerGang[x] == gg) {             // muda variavel da gang aqui
  214.                 SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Sua Gang não dominou o territorio pois uma gang rival pegou ele antes");
  215.             }
  216.         }
  217.     }
  218.     if(ps < 1000) {
  219.         new membrosNaAreas = 0;
  220.  
  221.         foreach(Player, x) {
  222.             if(playerGang[x] == gg) {             // muda variavel da gang aqui
  223.                 static
  224.                     Float:posX,
  225.                     Float:posY,
  226.                     Float:posZ;
  227.  
  228.                 GetPlayerPos(x, posX, posY, posZ);
  229.  
  230.                 if(posX > gzData[gz][floatPos][0] && posY > gzData[gz][floatPos][1] && posX < gzData[gz][floatPos][2] && posY < gzData[gz][floatPos][3])
  231.                     membrosNaAreas++;
  232.             }
  233.         }
  234.  
  235.         ps += membrosNaAreas * 100;
  236.  
  237.         foreach(Player, x) {
  238.             if(playerGang[x] == gg) {             // muda variavel da gang aqui
  239.                 static string[128];
  240.                 format(string, 128, "[INFO] Sua gang está dominando o territorio (%d/1000)", ps);
  241.                 SendClientMessage(x, 0xFFFFFFFFF, string);
  242.             }
  243.         }
  244.  
  245.         if(membrosNaAreas >= MAX_DOM) {
  246.             SetTimerEx("dominandoUncoped", 1000, false, "iii", gz, gg, ps);
  247.         }
  248.         else {
  249.             foreach(Player, x) {
  250.                 if(playerGang[x] == gg) {         // muda variavel da gang aqui
  251.                     SendClientMessage(x, 0xFFFFFFFFF, "[ERRO] Território não dominado por falta de membros " #MAX_DOM);
  252.                 }
  253.             }
  254.             galeraDominando[gg][gz] = 0;
  255.         }
  256.     }
  257.     else {
  258.         foreach(Player, x) {
  259.             if(playerGang[x] == gg) {             // muda variavel da gang aqui
  260.                 SendClientMessage(x, 0xFFFFFFFFF, "[INFO] Sua Gang dominou um territorio desocupado!");
  261.             }
  262.         }
  263.         gzData[gz][gzGangID] =gg;
  264.  
  265.         GangZoneStopFlashForAll(gzData[gz][gzId]);
  266.         GangZoneShowForAll(gzData[gz][gzId], fixColour(GetGangColor(gg)));
  267.  
  268.         galeraDominando[gg][gz] = 0;
  269.     }
  270.     return false;
  271. }
  272.  
  273.  
  274. createGangZone(nome[], Float:xMin, Float:yMin, Float:xMax, Float:yMax)
  275. {
  276.     if(++gangZonasCriadas == MAX_GZ) {
  277.         print("Limite de GangZone excedido" #MAX_GZ);
  278.         --gangZonasCriadas;
  279.     }
  280.  
  281.     gzData[gangZonasCriadas][gzId] = GangZoneCreate(xMin, yMin, xMax, xMin);
  282.  
  283.     gzData[gangZonasCriadas][floatPos][0] = xMin;
  284.     gzData[gangZonasCriadas][floatPos][1] = yMin;
  285.     gzData[gangZonasCriadas][floatPos][2] = xMax;
  286.     gzData[gangZonasCriadas][floatPos][3] = yMax;
  287.  
  288.     GangZoneShowForAll(gzData[gangZonasCriadas][gzId], 0xFFFFFF00);
  289.  
  290.     return gzData[gangZonasCriadas][gzGangID] = 0, gzData[gangZonasCriadas][gzId];
  291. }
  292.  
  293.  
  294. public OnPlayerDeath(playerid, killerid, reason)
  295. {
  296.     for(new i; i != MAX_GZ; ++i) {
  297.         if(galeraDominando[playerGang[playerid]][i]) {
  298.             static
  299.                 Float:posXx,
  300.                 Float:posYy,
  301.                 Float:posZz;
  302.  
  303.             GetPlayerPos(playerid, posXx, posYy, posZz);
  304.  
  305.             if(posXx > gzData[i][floatPos][0]  && posYy > gzData[i][floatPos][1] && posXx < gzData[i][floatPos][2] && posYy < gzData[i][floatPos][3]) {
  306.                 pontosArrecadados[i][playerGang[playerid]] -= 100;
  307.             }
  308.  
  309.         }
  310.     }
  311.     return true;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement