Advertisement
_Michael_

Dynamic NoKill zone creator by _Michael_

Apr 6th, 2020
1,284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 9.74 KB | None | 0 0
  1. #include <a_samp>
  2. #define MAX_PLAYERS_EX 250
  3. #include <sscanf>
  4. #include <dini>
  5. #include <zcmd>
  6.  
  7. #define SCM SendClientMessage
  8. #define SCMToAll SendClientMessageToAll
  9. #define RED 0xFF0000FF
  10. #define MAX_PEACE_ZONES 50
  11.  
  12. enum Peace_Zone
  13. {
  14.         Float:PposX,
  15.         Float:PposY,
  16.         Float:PposZ,
  17.         Float:Prange,
  18.         Ppickup,
  19.         CreatedBy[24],
  20.         Text3D:Plabel,
  21.         bool:Pcreated,
  22.         name[101],
  23. }
  24. new PeaceInfo[MAX_PEACE_ZONES][Peace_Zone];
  25. new PeaceCount=-1;
  26.  
  27. forward CreatePeaceZone(playerid,Float:PPX,Float:PPY,Float:PPZ,Float:PPRange,zonename[],reason[]);
  28. public CreatePeaceZone(playerid,Float:PPX,Float:PPY,Float:PPZ,Float:PPRange,zonename[],reason[])
  29. {
  30.         if(PeaceCount+1<MAX_PEACE_ZONES)
  31.         {
  32.             PeaceCount++;
  33.             new FreePeaceCount;
  34.             for(new i;i<MAX_PEACE_ZONES;i++)
  35.             {
  36.                 if(!PeaceInfo[i][Pcreated])
  37.                 {
  38.                     FreePeaceCount=i;
  39.                     break;
  40.                 }
  41.             }
  42.             new vw = GetPlayerVirtualWorld(playerid);
  43.             PeaceInfo[FreePeaceCount][PposX]=PPX;
  44.             PeaceInfo[FreePeaceCount][PposY]=PPY;
  45.             PeaceInfo[FreePeaceCount][PposZ]=PPZ;
  46.             PeaceInfo[FreePeaceCount][Prange]=PPRange;
  47.             PeaceInfo[FreePeaceCount][Pcreated]=true;
  48.             PeaceInfo[FreePeaceCount][CreatedBy]=PlayerName(playerid);
  49.             PeaceInfo[FreePeaceCount][Ppickup]=CreatePickup(1254,1,PPX,PPY,PPZ,vw);
  50.             format(PeaceInfo[FreePeaceCount][name],101,"%s",zonename);
  51.             new s[128];
  52.             format(s,sizeof(s),"[NoKill]{FFFFFF}\nName: %s\nRange: %d meters\nCreated by: %s\nReason: %s",zonename,floatround(PPRange),PlayerName(playerid),reason);
  53.             PeaceInfo[FreePeaceCount][Plabel]=Create3DTextLabel(s,RED,PPX,PPY,PPZ+1,PPRange,vw,1);
  54.             format(s,sizeof(s),"[NoKill] {FFFFFF}Admin %s (ID:%d) created NoKill zone %s in range of %d meters [Reason: %s]!",PlayerName(playerid),playerid,zonename,floatround(PPRange),reason);
  55.             SCMToAll(RED,s);
  56.             format(s,sizeof(s),"NoKill/Zone%d.ini",FreePeaceCount);
  57.             dini_Create(s);
  58.             dini_FloatSet(s,"PosX",PPX);
  59.             dini_FloatSet(s,"PosY",PPY);
  60.             dini_FloatSet(s,"PosZ",PPZ);
  61.             dini_FloatSet(s,"PosR",PPRange);
  62.             dini_IntSet(s,"VW",vw);
  63.             dini_Set(s,"Name",zonename);
  64.             dini_Set(s,"Reason",reason);
  65.             dini_Set(s,"Created",PlayerName(playerid));
  66.         }
  67.         else
  68.                 SCM(playerid,RED,"[Server] {FFFFFF}Maximum number of zones reached, zone cannot be created!");
  69.         return 1;
  70. }
  71.  
  72. stock DeletePeaceZone(playerid,zoneid)
  73. {
  74.         PeaceCount--;
  75.         new s[128];
  76.         format(s,sizeof(s),"[Server] {FFFFFF}Admin %s (ID:%d) has removed NoKill zone %s in range of %d meters!",PlayerName(playerid),playerid,PeaceInfo[zoneid][name],floatround(PeaceInfo[zoneid][Prange]));
  77.         SCMToAll(RED,s);
  78.         format(s,sizeof(s),"NoKill/Zone%d.ini",zoneid);
  79.         dini_Remove(s);
  80.         format(PeaceInfo[zoneid][name],101," ");
  81.         PeaceInfo[zoneid][PposX]=0;
  82.         PeaceInfo[zoneid][PposY]=0;
  83.         PeaceInfo[zoneid][PposZ]=0;
  84.         PeaceInfo[zoneid][Prange]=0;
  85.         PeaceInfo[zoneid][Pcreated]=false;
  86.         DestroyPickup(PeaceInfo[zoneid][Ppickup]);
  87.         Delete3DTextLabel(PeaceInfo[zoneid][Plabel]);
  88. }
  89.  
  90. stock PlayerName(i)
  91. {
  92.         new p[MAX_PLAYER_NAME];
  93.         GetPlayerName(i,p,MAX_PLAYER_NAME);
  94.         return p;
  95. }
  96.  
  97. forward PlayerInPeace();
  98. public PlayerInPeace()
  99. {
  100.     for(new i;i<MAX_PLAYERS_EX;i++)
  101.     {
  102.         if(IsPlayerConnected(i)&&!IsPlayerNPC(i))
  103.         {
  104.             for(new z;z<MAX_PEACE_ZONES;z++)
  105.             {
  106.                 if(IsPlayerInRangeOfPoint(i,PeaceInfo[z][Prange],PeaceInfo[z][PposX],PeaceInfo[z][PposY],PeaceInfo[z][PposZ]))
  107.                 {
  108.                     if(GetPlayerWeapon(i)!=0)
  109.                     {
  110.                         SetPlayerArmedWeapon(i,0);
  111.                     }
  112.                 }
  113.             }
  114.         }
  115.     }
  116. }
  117.  
  118. public OnFilterScriptInit()
  119. {
  120.         print("+------------------------------------------------+");
  121.         print("|                                                |");
  122.         print("|    Dynamic NoKill Zone creator by _Michael_    |");
  123.         print("|                  LOADED!                       |");
  124.         print("|                                                |");
  125.         print("+------------------------------------------------+");
  126.         new s[100],Float:p[4],vw,str[101],reason[101],created[24];
  127.         for(new i;i<MAX_PEACE_ZONES;i++)
  128.         {
  129.             format(s,20,"NoKill/Zone%d.ini",i);
  130.             if(fexist(s))
  131.             {
  132.                 PeaceCount++;
  133.                 p[0]=dini_Float(s,"PosX");
  134.                 p[1]=dini_Float(s,"PosY");
  135.                 p[2]=dini_Float(s,"PosZ");
  136.                 p[3]=dini_Float(s,"PosR");
  137.                 vw=dini_Int(s,"VW");
  138.                 format(str,101,"%s",dini_Get(s,"Name"));
  139.                 format(reason,101,"%s",dini_Get(s,"Reason"));
  140.                 format(created,24,"%s",dini_Get(s,"Created"));
  141.                 PeaceInfo[i][PposX]=p[0];
  142.                 PeaceInfo[i][PposY]=p[1];
  143.                 PeaceInfo[i][PposZ]=p[2];
  144.                 PeaceInfo[i][Prange]=p[3];
  145.                 PeaceInfo[i][Pcreated]=true;
  146.                 PeaceInfo[i][Ppickup]=CreatePickup(1254,1,p[0],p[1],p[2],vw);
  147.                 format(s,sizeof(s),"[NoKill]{FFFFFF}\nName: %s\nRange: %d meters\nCreated by: %s\nReason: %s",str,floatround(p[3]),created,reason);
  148.                 PeaceInfo[i][Plabel]=Create3DTextLabel(s,RED,p[0],p[1],p[2]+1,p[3],vw,1);
  149.                 format(PeaceInfo[i][name],101,"%s",str);
  150.                 printf("...Zone [%d] %s loaded... X:%f Y:%f Z:%f Range:%d VirtualWorld:%d",i,str,p[0],p[1],p[2],floatround(p[3]),vw);
  151.             }
  152.         }
  153.         SetTimer("PlayerInPeace",525,true);
  154.         return 1;
  155. }
  156.  
  157. CMD:nkzones(playerid,params[])
  158. {
  159.         #pragma unused params
  160.         if(!IsPlayerAdmin(playerid))return SCM(playerid,RED,"[Server] {FFFFFF}You must be logged as RCON admin!");
  161.         if(PeaceCount>-1)
  162.         {
  163.                 new s[1000];
  164.                 for(new i;i<MAX_PEACE_ZONES;i++)
  165.                 {
  166.                     if(PeaceInfo[i][Pcreated])
  167.                     {
  168.                         format(s,sizeof(s),"%s[%d] %s\n",s,i,PeaceInfo[i][name]);
  169.                     }
  170.                 }
  171.                 ShowPlayerDialog(playerid,1235,DIALOG_STYLE_LIST,"Zones",s,"Ok","Cancel");
  172.         }
  173.         else
  174.         {
  175.             ShowPlayerDialog(playerid,1235,DIALOG_STYLE_LIST,"Zones","<NONE>","OK","Cancel");
  176.         }
  177.         return 1;
  178. }
  179.  
  180. CMD:createnk(playerid,params[])
  181. {
  182.         if(!IsPlayerAdmin(playerid))return SCM(playerid,RED,"[Server] {FFFFFF}You must be logged as RCON admin!");
  183.         if(strlen(params)>100)return SCM(playerid,RED,"[Server] {FFFFFF}Name is too long!");
  184.         new Float:range,zonename[101], reason[101];
  185.         if(sscanf(params,"fzz",range,zonename,reason))return SCM(playerid,RED,"[Server] {FFFFFF}Usage: /createnk [RANGE 10-500] [NAME 1-100 chars] [REASON 1-100 chars]");
  186.         if(range < 10 || range > 500)return SCM(playerid,RED,"[Server] {FFFFFF}Usage: /createnk [RANGE 10-500] [NAME 1-100 chars] [REASON 1-100 chars]");
  187.         if(strlen(reason) < 1 || strlen(reason) > 100)return SCM(playerid,RED,"[Server] {FFFFFF}Usage: /createnk [RANGE 10-500] [NAME 1-100 chars] [REASON 1-100 chars]");
  188.         new Float:pos[3];
  189.         GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
  190.         CreatePeaceZone(playerid,pos[0],pos[1],pos[2],range,zonename,reason);
  191.         return 1;
  192. }
  193.  
  194. CMD:deletenk(playerid,params[])
  195. {
  196.         #pragma unused params
  197.         if(!IsPlayerAdmin(playerid))return SCM(playerid,RED,"[ Server ] {FFFFFF}You must be logged as RCON admin!");
  198.         for(new i;i<MAX_PEACE_ZONES;i++)
  199.         {
  200.             if(PeaceInfo[i][Pcreated])
  201.             {
  202.                     if(IsPlayerInRangeOfPoint(playerid,2,PeaceInfo[i][PposX],PeaceInfo[i][PposY],PeaceInfo[i][PposZ]))
  203.                     {
  204.                         DeletePeaceZone(playerid,i);
  205.                         break;
  206.                     }
  207.             }
  208.         }
  209.         return 1;
  210. }
  211.  
  212. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  213. {
  214.         if(newkeys == KEY_FIRE)
  215.         {
  216.                 for(new z;z<MAX_PEACE_ZONES;z++)
  217.                 {
  218.                 if(PeaceInfo[z][Pcreated])
  219.                 {
  220.                                 if(IsPlayerInRangeOfPoint(playerid,PeaceInfo[z][Prange],PeaceInfo[z][PposX],PeaceInfo[z][PposY],PeaceInfo[z][PposZ]))
  221.                                 {
  222.                                     TogglePlayerControllable(playerid,false);
  223.                                     TogglePlayerControllable(playerid,true);
  224.                                     break;
  225.                                 }
  226.                         }
  227.                 }
  228.         }
  229.         return 1;
  230. }
  231.  
  232. public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
  233. {
  234.         for(new z;z<MAX_PEACE_ZONES;z++)
  235.         {
  236.             if(PeaceInfo[z][Pcreated])
  237.             {
  238.                         if(IsPlayerInRangeOfPoint(playerid,PeaceInfo[z][Prange],PeaceInfo[z][PposX],PeaceInfo[z][PposY],PeaceInfo[z][PposZ]))
  239.                         {
  240.                                 TogglePlayerControllable(playerid,false);
  241.                                 SetTimerEx("UnFreeze",5000,false,"i",playerid);
  242.                                 GameTextForPlayer(playerid,"~r~YOU CANNOT ATTACK IN NOKILL ZONE!",5000,5);
  243.                                 break;
  244.                         }
  245.                 }
  246.         }
  247.         return 1;
  248. }
  249.  
  250. forward UnFreeze(i);
  251. public UnFreeze(i)
  252. {
  253.         TogglePlayerControllable(i,true);
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement