Advertisement
Guest User

by Templer | NoDM-Zone v4

a guest
Oct 19th, 2010
963
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.47 KB | None | 0 0
  1. /*                                            NoDM-Zone v4 Include by Templer
  2.                                                (for SAMP 0.3 / or higher)
  3.                                     (Inspiriert durch Marco2406 vom Breadfish Forum)
  4.                                 Dieses Script darf von jedermann verändert und benutzt werden!
  5.                             Mir ist es sogar egal, wenn Ihr was von hier für euren Vorteil rauskopiert!
  6.  
  7.                                             Credits:
  8.                                                 -Marco2406 : Für die geistreiche Idee der NoDM Zone für Neulinge & das Textdraw
  9.                                                 -Double-O-Seven : Für das Zeigen wie Include und GM am besten kommunizieren!
  10.                                                 -Samp-Team : Die es überhaupt ermöglicht haben sowas Programmierbar für GTA zu machen!
  11.                                                 -creck : Für die wichtigen BugReport in v1 und v2
  12.                                                 -niCe: Für sein 'IsPlayerAimingAtPlayer'*/
  13. /*Include Einstellungen*/
  14. #define NODM_FILTERSCRIPT (0) //Auf '1' setzen wenn du dieses Include in einem Filterscript einbaust! (Default: 0)
  15. #define NoDM_MAX_ZONES (10) //Wieviele DM Zonen max. verwendet werden. (Default: 10)
  16. #define NoDM_ACTIVATE_MAPZONES //Auskommentieren um die NoDM Zonen auf der Karte anzuzeigen!
  17. #define NoDM_UPDATE (2) //Angabe in Sekunden in welchen Intervalen geprüft werden soll, ob Spieler in einer NoDM Zone ist! (Default: 2)
  18. #define NoDM_NOWEAPONS (1) //Sollen die Waffen vom Spieler in der NoDM Zone abgenommen und wieder zurückgegeben werden? (Ja = 1; Nein = 0) (Default: 1)
  19. #define NoDM_AIMING_AT_PEOPLE (true) //Spieler Schaden hinzufügen, wenn sie einen Spieler, der in der NoDM Zone ist, von außerhalb anschießen. (Ja = true; Nein = false) (Default: true)
  20.  
  21. new Text:NoDMTextdraw; //Bitte dies unverändert lassen
  22. //Hier kannst du dein eigenes Textdraw einfügen wenn dir das vorhandene nicht gefällt!
  23. //Beachte das wenn du ein eigenes TextDraw einfügst die Definition 'NoDMTextdraw' gleich bleibt!
  24. stock SB_CreateTextdraw()
  25. {
  26.     NoDMTextdraw = TextDrawCreate(44.000000, 313.000000, "NO DM-ZONE");
  27.     TextDrawBackgroundColor(NoDMTextdraw, -16776961);
  28.     TextDrawFont(NoDMTextdraw, 3);
  29.     TextDrawLetterSize(NoDMTextdraw, 0.419999, 2.599998);
  30.     TextDrawColor(NoDMTextdraw, -1);
  31.     TextDrawSetOutline(NoDMTextdraw, 1);
  32.     TextDrawSetProportional(NoDMTextdraw, 1);
  33. }
  34.  
  35.  
  36. #if defined NoDM_ACTIVATE_MAPZONES
  37. #define NoDM_MAPZONE_COLOR (0xFF6347AA) //Welche Farbe ist bei NoDM Zonen die auf Karten angezeigt werden! (Nur wenn NoDM_ACTIVATE_MAPZONES auskommentiert wurde!) Default: Hellrot
  38.  
  39. /*Ab hier nichts mehr ändern, außer du mit dem Programmieren in PAWN vertraut bist!*/
  40.  
  41. new gDMMapZone[NoDM_MAX_ZONES];
  42. #endif
  43.  
  44. #if (NoDM_UPDATE < 0)
  45.     #error "Definition von Wert NoDM_UPDATE kleiner als 0!"
  46. #endif
  47. #if (NODM_FILTERSCRIPT < 0 && NODM_FILTERSCRIPT > 1)
  48.     #error "Definition von Wert NODM_FILTERSCRIPT ungueltig!"
  49. #endif
  50. #if (NoDM_NOWEAPONS < 0 && NoDM_NOWEAPONS > 1)
  51.     #error "Definition von Wert NoDM_NOWEAPONS ungueltig!"
  52. #endif
  53. #if (NoDM_MAX_ZONES < 0)
  54.     #error "Anzahl an NODM-Zonen nicht weniger als 0!"
  55. #endif
  56. #if (defined NoDM_ACTIVATE_MAPZONES && NoDM_MAX_ZONES > 1024)
  57.     #error "SanAndreas-Multiplayer MiniMap-Zonen Limit ueberschritten!"
  58. #endif
  59. #if (NoDM_AIMING_AT_PEOPLE != false && NoDM_AIMING_AT_PEOPLE != true)
  60.     #error "Definition NoDM_AIMING_AT_PEOPLE kann nur 'true' oder 'false' beinhalten!"
  61. #endif
  62.  
  63. new gCountNoDMZone = 0;
  64. new bool:gLoaded = false;
  65. new Float:NoDMInfo[NoDM_MAX_ZONES][4];
  66. new bool:gFunction[MAX_PLAYERS];
  67.  
  68. #if (NODM_FILTERSCRIPT == 0)
  69.     forward NoDM_OnGameModeInit();
  70.     forward NoDM_OnGameModeExit();
  71. #else
  72.     forward NoDM_OnFilterScriptInit();
  73.     forward NoDM_OnFilterScriptExit();
  74. #endif
  75. forward NoDM_Timer();
  76. forward NoDM_OnPlayerConnect(playerid);
  77. forward NoDM_OnPlayerDisconnect(playerid, reason);
  78. #if (NoDM_AIMING_AT_PEOPLE == true)
  79.     forward NoDM_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  80.     #define NoDM_HOLDING(%0) \
  81.         ((newkeys & (%0)) == (%0))
  82.     stock Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) {
  83.  
  84.         new Float:TGTDistance;
  85.  
  86.         TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));
  87.  
  88.         new Float:tmpX, Float:tmpY, Float:tmpZ;
  89.  
  90.         tmpX = FrX * TGTDistance + CamX;
  91.         tmpY = FrY * TGTDistance + CamY;
  92.         tmpZ = FrZ * TGTDistance + CamZ;
  93.  
  94.         return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ));
  95.     }
  96.     stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) {
  97.  
  98.       new Float:DX, Float:DY;
  99.       new Float:angle;
  100.  
  101.       DX = floatabs(floatsub(x2,X));
  102.       DY = floatabs(floatsub(y2,Y));
  103.  
  104.       if (DY == 0.0 || DX == 0.0) {
  105.         if(DY == 0 && DX > 0) angle = 0.0;
  106.         else if(DY == 0 && DX < 0) angle = 180.0;
  107.         else if(DY > 0 && DX == 0) angle = 90.0;
  108.         else if(DY < 0 && DX == 0) angle = 270.0;
  109.         else if(DY == 0 && DX == 0) angle = 0.0;
  110.       }
  111.       else {
  112.         angle = atan(DX/DY);
  113.  
  114.         if(X > x2 && Y <= y2) angle += 90.0;
  115.         else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
  116.         else if(X < x2 && Y >= y2) angle -= 90.0;
  117.         else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
  118.       }
  119.  
  120.       return floatadd(angle, 90.0);
  121.     }
  122.     stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance)
  123.     {
  124.         x += (distance * floatsin(-angle, degrees));
  125.         y += (distance * floatcos(-angle, degrees));
  126.     }
  127.     stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius)
  128.     {
  129.         new Float:camera_x,Float:camera_y,Float:camera_z,Float:vector_x,Float:vector_y,Float:vector_z;
  130.         GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z);
  131.         GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);
  132.         new Float:vertical, Float:horizontal;
  133.  
  134.         switch (GetPlayerWeapon(playerid))
  135.         {
  136.           case 34,35,36: {
  137.           if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true;
  138.           return false;
  139.           }
  140.           case 30,31: {vertical = 4.0; horizontal = -1.6;}
  141.           case 33: {vertical = 2.7; horizontal = -1.0;}
  142.           default: {vertical = 6.0; horizontal = -2.2;}
  143.         }
  144.         new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
  145.         new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees);
  146.         GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees));
  147.  
  148.         if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true;
  149.         return false;
  150.     }
  151.     stock IsPlayerAimingAtPlayer(playerid, targetplayerid)
  152.     {
  153.       new Float:x, Float:y, Float:z;
  154.       GetPlayerPos(targetplayerid, x, y, z);
  155.       return IsPlayerAimingAt(playerid, x, y, z, 1.1);
  156.     }
  157. #endif
  158.  
  159. stock NoDM_IsAPlane(carid)
  160. {
  161.     switch(GetVehicleModel(carid))
  162.     {
  163.         case 460,476,511..513,519,520,533,577,592,593: return true;
  164.     }
  165.     return false;
  166. }
  167.  
  168. stock NoDM_IsPlayerInArea(playerid,Float:minX,Float:minY,Float:maxX,Float:maxY)
  169. {
  170.     new Float:pX,Float:pY,Float:pZ;
  171.     if(!IsPlayerInAnyVehicle(playerid)) GetPlayerPos(playerid,pX,pY,pZ);
  172.     else GetVehiclePos(GetPlayerVehicleID(playerid),pX,pY,pZ);
  173.     if(pX >= minX && pX <= maxX && pY >= minY && pY <= maxY) return true;
  174.     else return false;
  175. }
  176.  
  177. stock AddNoDMZone(Float:minX, Float:maxX, Float:minY, Float:maxY)
  178. {
  179.     if(gLoaded == true)
  180.     {
  181.         print("[noDM] Erstellen von NoDM Zonen mit der Funktion AddNoDMZone nur beim ScriptStart möglich! (Unter OnGameModeInit/OnFilterScriptInit!)");
  182.         return false;
  183.     }
  184.     NoDMInfo[gCountNoDMZone][0] = minX;
  185.     NoDMInfo[gCountNoDMZone][1] = maxX;
  186.     NoDMInfo[gCountNoDMZone][2] = minY;
  187.     NoDMInfo[gCountNoDMZone][3] = maxY;
  188.     #if defined NoDM_ACTIVATE_MAPZONES
  189.         gDMMapZone[gCountNoDMZone] = GangZoneCreate(minX, minY, maxX, maxY);
  190.     #endif
  191.     gCountNoDMZone++;
  192.     return true;
  193. }
  194. #if (NODM_FILTERSCRIPT == 0)
  195. public OnGameModeInit()
  196. {
  197.     SB_CreateTextdraw();
  198.     SetTimer("NoDM_Timer",NoDM_UPDATE*1000,true);
  199.     print("NoDM-Zone v3 by Templer loaded...");
  200.     return CallLocalFunction("NoDM_OnGameModeInit","");
  201. }
  202.  
  203. public OnGameModeExit()
  204. {
  205.     #if defined NoDM_ACTIVATE_MAPZONES
  206.     new zone = 0;
  207.     for(; zone < gCountNoDMZone; zone++)
  208.     {
  209.         GangZoneDestroy(gDMMapZone[zone]);
  210.     }
  211.     #endif
  212.     TextDrawDestroy(NoDMTextdraw);
  213.     return CallLocalFunction("NoDM_OnGameModeExit","");
  214. }
  215. #else
  216. public OnFilterScriptInit()
  217. {
  218.     SB_CreateTextdraw();
  219.     SetTimer("NoDM_Timer",NoDM_UPDATE*1000,true);
  220.     print("NoDM-Zone v3 by Templer loaded...");
  221.     return CallLocalFunction("NoDM_OnFilterScriptInit","");
  222. }
  223.  
  224. public OnFilterScriptExit()
  225. {
  226.     #if defined NoDM_ACTIVATE_MAPZONES
  227.     new zone = 0;
  228.     for(; zone < gCountNoDMZone; zone++)
  229.     {
  230.         GangZoneDestroy(gDMMapZone[zone]);
  231.     }
  232.     #endif
  233.     TextDrawDestroy(NoDMTextdraw);
  234.     return CallLocalFunction("NoDM_OnFilterScriptExit","");
  235. }
  236. #endif
  237.  
  238. public OnPlayerConnect(playerid)
  239. {
  240.     new zeit[3]; gettime(zeit[0], zeit[1], zeit[2]);
  241.     SetPVarInt(playerid, "PastSecond", zeit[2]);
  242.     SetPVarInt(playerid, "BSNTextDrawShowed", -1);
  243.     return CallLocalFunction("NoDM_OnPlayerConnect","d",playerid);
  244. }
  245.  
  246. public OnPlayerDisconnect(playerid, reason)
  247. {
  248.     #if defined NoDM_ACTIVATE_MAPZONES
  249.     new zone = 0, cache[32];
  250.     for(; zone < gCountNoDMZone; zone++)
  251.     {
  252.         format(cache, 32, "ShowedDMZone_%d", zone);
  253.         if(GetPVarInt(playerid,cache)==0) continue;
  254.         GangZoneHideForPlayer(playerid, gDMMapZone[zone]);
  255.         DeletePVar(playerid,cache);
  256.     }
  257.     #endif
  258.     DeletePVar(playerid,"PastSecond");
  259.     DeletePVar(playerid,"BSNTextDrawShowed");
  260.     return CallLocalFunction("NoDM_OnPlayerDisconnect","dd", playerid, reason);
  261. }
  262.  
  263. #if (NoDM_AIMING_AT_PEOPLE == true)
  264.     public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  265.     {
  266.         if(NoDM_HOLDING(KEY_FIRE))
  267.         {
  268.             for(new giveplayerid=0;giveplayerid!=MAX_PLAYERS;giveplayerid++)
  269.             {
  270.                 if(!IsPlayerConnected(giveplayerid)||!IsPlayerAimingAtPlayer(playerid,giveplayerid)||GetPVarInt(giveplayerid,"BSNTextDrawShowed")==-1) continue;
  271.                 new Float:PlayerHealth; GetPlayerHealth(playerid,PlayerHealth);
  272.                 SetPlayerHealth(playerid,floatsub(PlayerHealth,15.0)); SetPlayerFacingAngle(playerid,float(random(360)));
  273.                 SendClientMessage(playerid,0xFF9900AA,"   KillVersuche auf Spieler in der NoDM-Zone ist lame...");
  274.                 break;
  275.             }
  276.         }
  277.         return CallLocalFunction("NoDM_OnPlayerKeyStateChange", "ddd", playerid, newkeys, oldkeys);
  278.     }
  279. #endif
  280.  
  281. public NoDM_Timer()
  282. {
  283.     new zeit[3], zone = 0, playerid=0;
  284.     #if (defined NoDM_ACTIVATE_MAPZONES || NoDM_NOWEAPONS == 1)
  285.         new cachestring[2][32];
  286.     #endif
  287.     #if (NoDM_NOWEAPONS == 1)
  288.         new cache[13][2], slot = 1;
  289.     #endif
  290.     gettime(zeit[0], zeit[1], zeit[2]);
  291.     for(;playerid!=MAX_PLAYERS;playerid++)
  292.     {
  293.         if(!IsPlayerConnected(playerid)) continue;
  294.         if(zeit[2] < GetPVarInt(playerid, "PastSecond")) SetPVarInt(playerid, "PastSecond", zeit[2]);
  295.         if((zeit[2] - GetPVarInt(playerid, "PastSecond")) >= NoDM_UPDATE && gFunction[playerid] == false)
  296.         {
  297.             gFunction[playerid] = true;
  298.             SetPVarInt(playerid, "PastSecond", zeit[2]);
  299.             if(gLoaded == false) gLoaded = true;
  300.             zone=0;
  301.             while(zone < gCountNoDMZone)
  302.             {
  303.                 #if defined NoDM_ACTIVATE_MAPZONES
  304.                     format(cachestring[0], 32, "ShowedDMZone_%d", zone);
  305.                     if(GetPVarInt(playerid, cachestring[0]) != 1)
  306.                     {
  307.                         SetPVarInt(playerid, cachestring[0], 1);
  308.                         GangZoneShowForPlayer(playerid, gDMMapZone[zone], NoDM_MAPZONE_COLOR);
  309.                     }
  310.                 #endif
  311.                 if(NoDM_IsPlayerInArea(playerid, NoDMInfo[zone][0], NoDMInfo[zone][2], NoDMInfo[zone][1], NoDMInfo[zone][3]) && GetPVarInt(playerid, "BSNTextDrawShowed") == -1)
  312.                 {
  313.                     #if (NoDM_NOWEAPONS == 1)
  314.                         for(; slot < 12; slot++)
  315.                         {
  316.                             GetPlayerWeaponData(playerid, slot, cache[slot][0], cache[slot][1]);
  317.                             format(cachestring[0], 32, "WaffenID_%d", slot);
  318.                             format(cachestring[1], 32, "AmmoID_%d", slot);
  319.                             SetPVarInt(playerid, cachestring[0], cache[slot][0]);
  320.                             SetPVarInt(playerid, cachestring[1], cache[slot][1]);
  321.                         }
  322.                         ResetPlayerWeapons(playerid);
  323.                     #endif
  324.                     SetPVarInt(playerid, "BSNTextDrawShowed", zone);
  325.                     TextDrawShowForPlayer(playerid,NoDMTextdraw);
  326.                 }
  327.                 else if(!NoDM_IsPlayerInArea(playerid, NoDMInfo[zone][0], NoDMInfo[zone][2], NoDMInfo[zone][1], NoDMInfo[zone][3]) && GetPVarInt(playerid, "BSNTextDrawShowed") == zone)
  328.                 {
  329.                     #if (NoDM_NOWEAPONS == 1)
  330.                         for(; slot < 12; slot++)
  331.                         {
  332.                             format(cachestring[0], 32, "WaffenID_%d", slot);
  333.                             format(cachestring[1], 32, "AmmoID_%d", slot);
  334.                             if(GetPVarInt(playerid, cachestring[0]) > 0) GivePlayerWeapon(playerid, GetPVarInt(playerid, cachestring[0]), GetPVarInt(playerid, cachestring[1]));
  335.                             SetPVarInt(playerid, cachestring[0], -1);
  336.                             SetPVarInt(playerid, cachestring[1], -1);
  337.                         }
  338.                         if(IsPlayerInAnyVehicle(playerid) && !NoDM_IsAPlane(GetPlayerVehicleID(playerid)))
  339.                         {
  340.                             new veh = GetPlayerVehicleID(playerid), seat = GetPlayerVehicleSeat(playerid), Float:nvX, Float:nvY, Float:nvZ, Float:pX, Float:pY, Float:pZ;
  341.                             GetVehicleVelocity(veh, nvX, nvY, nvZ);
  342.                             GetPlayerPos(playerid, pX, pY, pZ); SetPlayerPos(playerid, pX, pY, pZ);
  343.                             PutPlayerInVehicle(playerid, veh, seat);
  344.                             if(GetPlayerState(playerid) == 2) SetVehicleVelocity(veh, nvX, nvY, nvZ);
  345.                         }
  346.                     #endif
  347.                     SetPVarInt(playerid, "BSNTextDrawShowed", -1);
  348.                     TextDrawHideForPlayer(playerid,NoDMTextdraw);
  349.                 }
  350.                 zone++;
  351.             }
  352.             gFunction[playerid] = false;
  353.         }
  354.     }
  355.     return true;
  356. }
  357.  
  358. #if (NODM_FILTERSCRIPT == 0)
  359.     #if defined _ALS_OnGameModeInit
  360.         #undef OnGameModeInit
  361.     #else
  362.         #define _ALS_OnGameModeInit
  363.     #endif
  364.     #define OnGameModeInit NoDM_OnGameModeInit
  365.  
  366.     #if defined _ALS_OnGameModeExit
  367.         #undef OnGameModeExit
  368.     #else
  369.         #define _ALS_OnGameModeExit
  370.     #endif
  371.     #define OnGameModeExit NoDM_OnGameModeExit
  372. #elseif (NODM_FILTERSCRIPT == 1)
  373.     #if defined _ALS_OnFilterScriptInit
  374.         #undef OnFilterScriptInit
  375.     #else
  376.         #define _ALS_OnFilterScriptInit
  377.     #endif
  378.     #define OnFilterScriptInit NoDM_OnFilterScriptInit
  379.  
  380.     #if defined _ALS_OnFilterScriptExit
  381.         #undef OnFilterScriptExit
  382.     #else
  383.         #define _ALS_OnFilterScriptExit
  384.     #endif
  385.     #define OnFilterScriptExit NoDM_OnFilterScriptExit
  386. #endif
  387.  
  388. #if defined _ALS_OnPlayerDisconnect
  389.     #undef OnPlayerDisconnect
  390. #else
  391.     #define _ALS_OnPlayerDisconnect
  392. #endif
  393. #define OnPlayerDisconnect NoDM_OnPlayerDisconnect
  394.  
  395. #if defined _ALS_OnPlayerConnect
  396.     #undef OnPlayerConnect
  397. #else
  398.     #define _ALS_OnPlayerConnect
  399. #endif
  400. #define OnPlayerConnect NoDM_OnPlayerConnect
  401.  
  402. #if (NoDM_AIMING_AT_PEOPLE == true)
  403.     #if defined _ALS_OnPlayerKeyStateChange
  404.         #undef OnPlayerKeyStateChange
  405.     #else
  406.         #define _ALS_OnPlayerKeyStateChange
  407.     #endif
  408.     #define OnPlayerKeyStateChange NoDM_OnPlayerKeyStateChange
  409. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement