Advertisement
Guest User

Eventsystem 3.0 by ErikSon

a guest
Mar 15th, 2014
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 20.01 KB | None | 0 0
  1. /*                                              Eventsystem by ErikSon                              */
  2.  
  3.  
  4. #include <a_samp>
  5. #include <ocmd>
  6.  
  7. //Farben
  8. #define Schwarz         0x000000FF
  9. #define Rot             0xE10000FF
  10. #define Gelb            0xFFE600FF
  11. #define HBlau           0x00FFFFFF
  12. #define DBlau           0x0000FFFF
  13. #define Blau            0x2E9AFEFF
  14. #define HGruen          0x00FF00FF
  15. #define Orange          0xFFAB00FF
  16. #define Weiss           0xFFFFFFFF
  17. #define Grau            0xDCDCDCFF
  18. #define Gold            0xD4A017AA
  19. #define Lila            0x7800FFFF
  20. #define Pink            0xFF00CDFF
  21. #define Gruen           0x009F32FF
  22.  
  23. //Sonstiges
  24. #define SCM         SendClientMessage
  25. #define SCMToAll    SendClientMessageToAll
  26. new fmex[128];
  27. #define SCMToAllF(%0,%1,%2)  format(fmex,128,%1,%2) && SendClientMessageToAll(%0, fmex)
  28. #define SCMF(%0,%1,%2)  format(fmex,128,%2) && SendClientMessage(%0,%1,fmex)
  29.  
  30.  
  31. //Enums
  32. enum EEvent
  33. {
  34.     Float:ex,
  35.     Float:ey,
  36.     Float:ez,
  37.     EventStart,
  38.     Waffe,
  39.     Schuss,
  40.     Float:Leben,
  41.     Float:Armour,
  42.     Fahrzeug,
  43.     sCP
  44. };
  45. new Event[EEvent];
  46.  
  47. new Waffen[MAX_PLAYERS][2],
  48.     CP[MAX_PLAYERS],
  49.     CPI[50],
  50.     Float:CPX[50],
  51.     Float:CPY[50],
  52.     Float:CPZ[50],
  53.     Float:ox[MAX_PLAYERS],
  54.     Float:oy[MAX_PLAYERS],
  55.     Float:oz[MAX_PLAYERS],
  56.     EventVeh[MAX_PLAYERS],
  57.     OnEvent[MAX_PLAYERS];
  58.    
  59.  
  60.  
  61. new VehName[][] =
  62. {
  63.     "Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel",
  64.     "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
  65.     "Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
  66.     "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection",
  67.     "Hunter", "Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus",
  68.     "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie",
  69.     "Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral",
  70.     "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder",
  71.     "Reefer", "Tropic", "Flatbed", "Yankee", "Caddy", "Solair", "Berkley's RC Van",
  72.     "Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale",
  73.     "Oceanic","Sanchez", "Sparrow", "Patriot", "Quad", "Coastguard", "Dinghy",
  74.     "Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX",
  75.     "Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick", "News Chopper",
  76.     "Rancher", "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking",
  77.     "Blista Compact", "Police Maverick", "Boxville", "Benson", "Mesa", "RC Goblin",
  78.     "Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher", "Super GT",
  79.     "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt",
  80.     "Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra",
  81.     "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck", "Fortune",
  82.     "Cadrona", "FBI Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer",
  83.     "Remington", "Slamvan", "Blade", "Freight", "Streak", "Vortex", "Vincent",
  84.     "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo",
  85.     "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite",
  86.     "Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratium",
  87.     "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
  88.     "Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper",
  89.     "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400",
  90.     "News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
  91.     "Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "Police Car",
  92.     "Police Car", "Police Car", "Police Ranger", "Picador", "S.W.A.T", "Alpha",
  93.     "Phoenix", "Glendale", "Sadler", "Luggage", "Luggage", "Stairs", "Boxville",
  94.     "Tiller", "Utility Trailer"
  95. };
  96.  
  97. enum
  98. {
  99.     dEventManager,
  100.     dEventManager2,
  101.     dEWaffe,
  102.     dESchuss,
  103.     dEFahrzeug,
  104.     dELeben,
  105.     dEArmour,
  106.     dECP,
  107.     dEDCP
  108. };
  109.  
  110. //////////////////////////////////////
  111. //////////////////////////////////////
  112. //////////////////////////////////////
  113. //////////////////////////////////////
  114.  
  115.  
  116.  
  117.  
  118.  
  119. public OnFilterScriptInit()
  120. {
  121.     print("\n--------------------------------------");
  122.     print("Eventsystem by ErikSon");
  123.     print("--------------------------------------\n");
  124.     Event[Schuss] = 1;
  125.     Event[Waffe] = 0;
  126.     Event[Fahrzeug] = 0;
  127.     Event[Leben] = 100.00;
  128.     Event[Armour] = 100.00;
  129.     for(new i = 0; i<50; i++)
  130.     {
  131.         CPX[i] = 0;
  132.         CPY[i] = 0;
  133.         CPZ[i] = 0;
  134.         CPI[i] = 0;
  135.     }
  136.     return 1;
  137. }
  138.  
  139. public OnPlayerConnect(playerid)
  140. {
  141.     if(Event[EventStart] == 1)SCM(playerid,Blau,"**Es läuft zur Zeit ein Event. Tippe '/gotoevent', um dich zum Event zu teleportieren.");
  142.     return OnEvent[playerid] = 0;
  143. }
  144.  
  145. public OnPlayerDisconnect(playerid, reason)return OnEvent[playerid] = 0;
  146.  
  147. public OnPlayerSpawn(playerid)
  148. {
  149.     if(OnEvent[playerid] == 1)
  150.     {
  151.         GetPlayerPos(playerid,ox[playerid],oy[playerid],oz[playerid]);
  152.         for (new i = 0; i < 13; i++)GetPlayerWeaponData(playerid, i, Waffen[playerid][0], Waffen[playerid][1]);
  153.         ResetPlayerWeapons(playerid);
  154.         SetPlayerPos(playerid,Event[ex],Event[ey],Event[ez]);
  155.         SetPlayerArmour(playerid,Event[Armour]);
  156.         SetPlayerHealth(playerid,Event[Leben]);
  157.         GivePlayerWeapon(playerid,Event[Waffe],Event[Schuss]);
  158.         EventVeh[playerid] = CreateVehicle(Event[Fahrzeug],Event[ex],Event[ey],Event[ez],-1,1,1,-1);
  159.         SetVehicleNumberPlate(EventVeh[playerid],"Event");
  160.         OnEvent[playerid] = 1;
  161.         PutPlayerInVehicle(playerid,EventVeh[playerid],0);
  162.     }
  163.     return 1;
  164. }
  165.  
  166. public OnPlayerEnterRaceCheckpoint(playerid)
  167. {
  168.     if(IsPlayerInRangeOfPoint(playerid,7,CPX[CP[playerid]],CPY[CP[playerid]],CPZ[CP[playerid]]))
  169.     {
  170.         if(Event[sCP] != 1)return 1;
  171.         CP[playerid] ++;
  172.         if(CPI[CP[playerid]] == 0)
  173.         {
  174.             DisablePlayerRaceCheckpoint(playerid);
  175.             return SCMToAllF(Blau,"Spieler '%s' ist am Ziel angekommen!",Name(playerid));
  176.         }
  177.         else
  178.         {
  179.             if(CPI[CP[playerid]+1] == 0)return SetPlayerRaceCheckpoint(playerid,1,CPX[CP[playerid]],CPY[CP[playerid]],CPZ[CP[playerid]],CPX[CP[playerid]],CPY[CP[playerid]],CPZ[CP[playerid]],7);
  180.             else return SetPlayerRaceCheckpoint(playerid,0,CPX[CP[playerid]],CPY[CP[playerid]],CPZ[CP[playerid]],CPX[CP[playerid] +1],CPY[CP[playerid] +1],CPZ[CP[playerid] +1],7);
  181.         }
  182.     }
  183.     return 1;
  184. }
  185.  
  186.  
  187. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  188. {
  189.     new i,s,w,id;
  190.     switch(dialogid)
  191.     {
  192.         case dEventManager:
  193.         {
  194.             if(response)
  195.             {
  196.                 switch(listitem)
  197.                 {
  198.                     case 0:
  199.                     {
  200.                         GetPlayerPos(playerid,Event[ex],Event[ey],Event[ez]);
  201.                         SCMToAll(Blau,"**Es wurde ein Event gestartet. Tippe '/gotoevent', um dich zum Event zu teleportieren.");
  202.                         if(CPI[0] == 0)return Event[EventStart] = 1;
  203.                         else return Event[EventStart] = 1,SCM(playerid,Blau,"Tippe '/startevent', um die Checkpoints zu aktivieren.");
  204.                     }
  205.                     case 1:return ShowPlayerDialog(playerid,dECP,DIALOG_STYLE_LIST,"Checkpoints - erstellen/löschen","Checkpoint erstellen\nCheckpoint löschen","Auswählen","Abbrechen");
  206.                     case 2:return ShowPlayerDialog(playerid,dEFahrzeug,DIALOG_STYLE_INPUT,"Fahrzeug","Tippe die Fahrzeug-ID\ndes Fahrzeuges ein,\ndas jeder Eventteilnehmer\nerhalten soll.\n\nUm kein Fahrzeug einzustellen,\ntippe -1 ein.","Auswählen","Abbrechen");
  207.                     case 3:return ShowPlayerDialog(playerid,dEWaffe,DIALOG_STYLE_INPUT,"Waffe","Tippe die Waffen-ID der Waffe ein,\ndie jeder Eventteilnehmer\nerhalten soll.\n\nUm keine Waffe einzustellen,\ntippe -1 ein.","Auswählen","Abbrechen");
  208.                     case 4:return ShowPlayerDialog(playerid,dESchuss,DIALOG_STYLE_INPUT,"Munition","Tippe ein, wie viel\nMunition jeder Eventteilnehmer\nfür seine Waffe erhalten soll.\n\nUm keine Munition einzustellen,\ntippe -1 ein.","Auswählen","Abbrechen");
  209.                     case 5:return ShowPlayerDialog(playerid,dELeben,DIALOG_STYLE_INPUT,"Leben","Tippe ein, wie viel Leben (HP)\njeder Eventteilnehmer erhalten soll.","Auswählen","Abbrechen");
  210.                     case 6:return ShowPlayerDialog(playerid,dEArmour,DIALOG_STYLE_INPUT,"Schutzweste","Tippe ein, wie viel Schutzweste\njeder Eventteilnehmer erhalten soll.","Auswählen","Abbrechen");
  211.                 }
  212.             }
  213.         }
  214.         case dECP:
  215.         {
  216.             if(response)
  217.             {
  218.                 new Float:x,Float:y,Float:z;
  219.                 x = 0; y = 0; z = 0;
  220.                 switch(listitem)
  221.                 {
  222.                     case 0:
  223.                     {
  224.                         for(i = 0; i<50; i++)
  225.                         {
  226.                             GetPlayerPos(playerid,x,y,z);
  227.                             id = i;
  228.                             if(CPI[id] == 1)continue;
  229.                             CPX[id] = x;
  230.                             CPY[id] = y;
  231.                             CPZ[id] = z;
  232.                             CPI[id] = 1;
  233.                             i += 50;
  234.  
  235.                             SCMF(playerid,Blau,"Checkpoint (%d) wurde auf der Position '%f , %f , %f' platziert.",id,CPX[id],CPY[id],CPZ[id]);
  236.                         }
  237.                     }
  238.                     case 1:ShowPlayerDialog(playerid,dEDCP,DIALOG_STYLE_INPUT,"Checkpoint löschen","Bitte gebe die Checkpoint-ID ein,\n die du löschen willst.\n\nUm alle Checkpoints zu löschen,\ntippe die Zahl 50 ein.","Löschen","Abbrechen");
  239.                 }
  240.             }
  241.         }
  242.         case dEDCP:
  243.         {
  244.             if(response)
  245.             {
  246.                 if(strval(inputtext) < 0 && strval(inputtext) > 50)return ocmd_event(playerid);
  247.                 if(strval(inputtext) == 50)
  248.                 {
  249.                     for(i=0; i<50; i++)CPX[i] = 0,CPY[i] = 0,CPZ[i] = 0,CPI[i] = 0;
  250.                     return SCM(playerid,Rot,"Du hast alle Checkpoints gelöscht.");
  251.                 }
  252.                 CPX[strval(inputtext)] = 0,CPY[strval(inputtext)] = 0,CPZ[strval(inputtext)] = 0, CPI[strval(inputtext)] = 0;
  253.                 return SCMF(playerid,Rot,"Du hast den Checkpoint %i gelöscht.",strval(inputtext));
  254.             }
  255.         }
  256.        
  257.         case dEFahrzeug:
  258.         {
  259.             if(response)
  260.             {
  261.                 if(strval(inputtext) == -1)return Event[Fahrzeug] = 0, ocmd_event(playerid);
  262.                 else if(!strval(inputtext))SCM(playerid,Rot,"**Bitte gebe eine Fahrzeug-ID ein!");
  263.                 else if(strval(inputtext) < 400 || strval(inputtext) > 611)SCM(playerid,Rot,"**Die Fahrzeug-ID darf nicht kleiner als 400 & nicht größer als 611 sein!");
  264.                 Event[Fahrzeug] = strval(inputtext);
  265.                 return ocmd_event(playerid);
  266.             }
  267.         }
  268.         case dEWaffe:
  269.         {
  270.             if(response)
  271.             {
  272.                 if(strval(inputtext) == -1)return Event[Waffe] = 0, ocmd_event(playerid);
  273.                 else if(!strval(inputtext))SCM(playerid,Rot,"**Bitte gebe eine Waffen-ID ein!");
  274.                 else if(strval(inputtext) < 0 || strval(inputtext) > 46)SCM(playerid,Rot,"**Die Waffen-ID darf nicht kleiner als 0 & nicht größer als 46 sein!");
  275.                 Event[Waffe] = strval(inputtext);
  276.                 return ocmd_event(playerid);
  277.             }
  278.         }
  279.         case dESchuss:
  280.         {
  281.             if(response)
  282.             {
  283.                 if(!strval(inputtext))return SCM(playerid,Rot,"**Bitte gebe eine Schussmenge ein!"); ocmd_event(playerid);
  284.                 Event[Schuss] = strval(inputtext);
  285.                 return ocmd_event(playerid);
  286.             }
  287.         }
  288.         case dELeben:
  289.         {
  290.             if(response)
  291.             {
  292.                 if(!strval(inputtext))return SCM(playerid,Rot,"**Bitte gebe eine Lebensangabe ein!"),ocmd_event(playerid);
  293.                 else if(strval(inputtext) < 0)return SCM(playerid,Rot,"**Die Lebensangabe darf nicht kleiner als 0 sein!"),ocmd_event(playerid);
  294.                 Event[Leben] = strval(inputtext);
  295.                 return ocmd_event(playerid);
  296.             }
  297.         }
  298.         case dEArmour:
  299.         {
  300.             if(response)
  301.             {
  302.                 if(!strval(inputtext))return SCM(playerid,Rot,"**Bitte gebe eine Schutzwestenangabe ein!"),ocmd_event(playerid);
  303.                 else if(strval(inputtext) < 0)return SCM(playerid,Rot,"**Die Schutzwestenangabe darf nicht kleiner als 0 sein!"),ocmd_event(playerid);
  304.                 Event[Armour] = strval(inputtext);
  305.                 return ocmd_event(playerid);
  306.             }
  307.         }
  308.         case dEventManager2:
  309.         {
  310.             if(response)
  311.             {
  312.                 switch(listitem)
  313.                 {
  314.                     case 0:
  315.                     {
  316.                         SCMToAll(Rot,"**Das Event wurde beendet.");
  317.                         Event[EventStart] = 0;
  318.                         Event[sCP] = 0;
  319.                         for(i=0; i<MAX_PLAYERS; i++)
  320.                         {
  321.                             if(OnEvent[i] == 0)continue;
  322.                             ResetPlayerWeapons(i);
  323.                             DestroyVehicle(EventVeh[i]);
  324.                             SetPlayerPos(i,ox[i],oy[i],oz[i]);
  325.                             SetPlayerHealth(i,100);
  326.                             SetPlayerArmour(i,0);
  327.                             OnEvent[i] = 0;
  328.                             for(w = 0; w<13; w++)for(s = 0; s<9999; s++)return GivePlayerWeapon(i,Waffen[i][w],Waffen[i][s]);
  329.                         }
  330.                     }
  331.                 }
  332.             }
  333.         }
  334.     }
  335.     return 0;
  336. }
  337.  
  338. //Befehle
  339. ocmd:gotoevent(playerid)
  340. {
  341.     if(Event[EventStart] == 0)return SCM(playerid,Rot,"**Es läuft zur Zeit kein Event!");
  342.     GetPlayerPos(playerid,ox[playerid],oy[playerid],oz[playerid]);
  343.     for (new i = 0; i < 13; i++)GetPlayerWeaponData(playerid, i, Waffen[playerid][0], Waffen[playerid][1]);
  344.     SetPlayerPos(playerid,Event[ex],Event[ey],Event[ez]);
  345.     SetPlayerArmour(playerid,Event[Armour]);
  346.     SetPlayerHealth(playerid,Event[Leben]);
  347.     ResetPlayerWeapons(playerid);
  348.     GivePlayerWeapon(playerid,Event[Waffe],Event[Schuss]);
  349.     EventVeh[playerid] = CreateVehicle(Event[Fahrzeug],Event[ex],Event[ey],Event[ez],-1,1,1,-1);
  350.     SetVehicleNumberPlate(EventVeh[playerid],"Event");
  351.     OnEvent[playerid] = 1;
  352.     PutPlayerInVehicle(playerid,EventVeh[playerid],0);
  353.    
  354.     if(CPI[0] == 0)return 1;
  355.     CP[playerid] = 0;
  356.     if(CPI[1] == 0)return SetPlayerRaceCheckpoint(playerid,1,CPX[0],CPY[0],CPZ[0],CPX[1],CPY[1],CPZ[1],7);
  357.     else return SetPlayerRaceCheckpoint(playerid,0,CPX[0],CPY[0],CPZ[0],CPX[1],CPY[1],CPZ[1],7);
  358. }
  359.  
  360. ocmd:event(playerid)
  361. {
  362.     if(!IsPlayerAdmin(playerid))return SCM(playerid,Rot,"**Du bist kein RCON-Admin!");
  363.     new string[144];
  364.     if(Event[Fahrzeug] == 0) {format(string,144,"Event starten\nCheckpoints\nFahrzeug: Keins\nWaffe: %s\nSchuss: %i\nLeben: %.2f\nSchutzweste: %.2f",Waffenname(Event[Waffe]),Event[Schuss],Event[Leben],Event[Armour]);}
  365.     else if(Event[Fahrzeug] != 0) {format(string,144,"Event starten\nCheckpoints\nFahrzeug: %s\nWaffe: %s\nSchuss: %i\nLeben: %.2f\nSchutzweste: %.2f",VehName[Event[Fahrzeug] -400],Waffenname(Event[Waffe]),Event[Schuss],Event[Leben],Event[Armour]);}
  366.     if(Event[EventStart] == 0)return ShowPlayerDialog(playerid,dEventManager,DIALOG_STYLE_LIST,"Eventmanager",string,"Auswählen","Abbrechen");
  367.     else if(Event[EventStart] == 1)return ShowPlayerDialog(playerid,dEventManager2,DIALOG_STYLE_LIST,"Eventmanager","Event beenden","Auswählen","Abbrechen");
  368.     return 1;
  369. }
  370.  
  371. ocmd:startevent(playerid)
  372. {
  373.     if(!IsPlayerAdmin(playerid))return SCM(playerid,Rot,"**Du bist kein RCON-Admin!");
  374.     if(Event[sCP] != 0)return SCM(playerid,Rot,"Die Checkpoints sind schon aktiviert!");
  375.     SCMToAllF(Blau,"Admin '%s' hat die Checkpoints aktiviert!",Name(playerid));
  376.     return Event[sCP] = 1;
  377. }
  378.  
  379.  
  380.  
  381.  
  382. //Stocks
  383. stock Waffenname(id)
  384. {
  385.     new wn[32];
  386.     switch(id)
  387.     {
  388.         case 0:(wn = "Faust");
  389.         case 1:(wn = "Schlagring");
  390.         case 2:(wn = "Golfschläger");
  391.         case 3:(wn = "Schlagstock");
  392.         case 4:(wn = "Messer");
  393.         case 5:(wn = "Baseballschläger");
  394.         case 6:(wn = "Schaufel");
  395.         case 7:(wn = "Billiardschläger");
  396.         case 8:(wn = "Katana");
  397.         case 9:(wn = "Kettensäge");
  398.         case 10:(wn = "Dildo");
  399.         case 11:(wn = "Dildo");
  400.         case 12:(wn = "Dildo");
  401.         case 13:(wn = "Dildo");
  402.         case 14:(wn = "Blumen");
  403.         case 15:(wn = "Stock");
  404.         case 16:(wn = "Granate");
  405.         case 17:(wn = "Rauchgranate");
  406.         case 18:(wn = "Molotov");
  407.         case 22:(wn = "9mm");
  408.         case 23:(wn = "Silencer");
  409.         case 24:(wn = "Desert Eagle");
  410.         case 25:(wn = "Shotgun");
  411.         case 26:(wn = "Sawn-off");
  412.         case 27:(wn = "Combat");
  413.         case 28:(wn = "Uzi");
  414.         case 29:(wn = "MP5");
  415.         case 30:(wn = "Ak47");
  416.         case 31:(wn = "M4");
  417.         case 32:(wn = "Tec 9");
  418.         case 33:(wn = "Gewehr");
  419.         case 34:(wn = "Sniper");
  420.         case 35:(wn = "Raketenwerfer");
  421.         case 36:(wn = "Stinger");
  422.         case 37:(wn = "Flammenwerfer");
  423.         case 38:(wn = "Minigun");
  424.         case 39:(wn = "Rucksackbomben");
  425.         case 40:(wn = "Fernzünder");
  426.         case 41:(wn = "Spray");
  427.         case 42:(wn = "Feuerlöscher");
  428.         case 43:(wn = "Kamera");
  429.         case 44:(wn = "Nachtvisier");
  430.         case 45:(wn = "Nachtvisier");
  431.         case 46:(wn = "Fallschirm");
  432.     }
  433.     return wn;
  434. }
  435.  
  436.  
  437. stock Name(playerid)
  438. {
  439.    new name[MAX_PLAYERS];
  440.    GetPlayerName(playerid,name,sizeof(name));
  441.    return name;
  442. }
  443.  
  444. //sscanf Code
  445.  
  446. stock sscanf(string[], format[], {Float,_}:...)
  447. {
  448.     #if defined isnull
  449.         if (isnull(string))
  450.     #else
  451.         if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  452.     #endif
  453.         {
  454.             return format[0];
  455.         }
  456.     #pragma tabsize 4
  457.     new
  458.         formatPos = 0,
  459.         stringPos = 0,
  460.         paramPos = 2,
  461.         paramCount = numargs(),
  462.         delim = ' ';
  463.     while (string[stringPos] && string[stringPos] <= ' ')
  464.     {
  465.         stringPos++;
  466.     }
  467.     while (paramPos < paramCount && string[stringPos])
  468.     {
  469.         switch (format[formatPos++])
  470.         {
  471.             case '\0':
  472.             {
  473.                 return 0;
  474.             }
  475.             case 'i', 'd':
  476.             {
  477.                 new
  478.                     neg = 1,
  479.                     num = 0,
  480.                     ch = string[stringPos];
  481.                 if (ch == '-')
  482.                 {
  483.                     neg = -1;
  484.                     ch = string[++stringPos];
  485.                 }
  486.                 do
  487.                 {
  488.                     stringPos++;
  489.                     if ('0' <= ch <= '9')
  490.                     {
  491.                         num = (num * 10) + (ch - '0');
  492.                     }
  493.                     else
  494.                     {
  495.                         return -1;
  496.                     }
  497.                 }
  498.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  499.                 setarg(paramPos, 0, num * neg);
  500.             }
  501.             case 'h', 'x':
  502.             {
  503.                 new
  504.                     num = 0,
  505.                     ch = string[stringPos];
  506.                 do
  507.                 {
  508.                     stringPos++;
  509.                     switch (ch)
  510.                     {
  511.                         case 'x', 'X':
  512.                         {
  513.                             num = 0;
  514.                             continue;
  515.                         }
  516.                         case '0' .. '9':
  517.                         {
  518.                             num = (num << 4) | (ch - '0');
  519.                         }
  520.                         case 'a' .. 'f':
  521.                         {
  522.                             num = (num << 4) | (ch - ('a' - 10));
  523.                         }
  524.                         case 'A' .. 'F':
  525.                         {
  526.                             num = (num << 4) | (ch - ('A' - 10));
  527.                         }
  528.                         default:
  529.                         {
  530.                             return -1;
  531.                         }
  532.                     }
  533.                 }
  534.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  535.                 setarg(paramPos, 0, num);
  536.             }
  537.             case 'c':
  538.             {
  539.                 setarg(paramPos, 0, string[stringPos++]);
  540.             }
  541.             case 'f':
  542.             {
  543.  
  544.                 new changestr[16], changepos = 0, strpos = stringPos;
  545.                 while(changepos < 16 && string[strpos] && string[strpos] != delim)
  546.                 {
  547.                     changestr[changepos++] = string[strpos++];
  548.                     }
  549.                 changestr[changepos] = '\0';
  550.                 setarg(paramPos,0,_:floatstr(changestr));
  551.             }
  552.             case 'p':
  553.             {
  554.                 delim = format[formatPos++];
  555.                 continue;
  556.             }
  557.             case '\'':
  558.             {
  559.                 new
  560.                     end = formatPos - 1,
  561.                     ch;
  562.                 while ((ch = format[++end]) && ch != '\'') {}
  563.                 if (!ch)
  564.                 {
  565.                     return -1;
  566.                 }
  567.                 format[end] = '\0';
  568.                 if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  569.                 {
  570.                     if (format[end + 1])
  571.                     {
  572.                         return -1;
  573.                     }
  574.                     return 0;
  575.                 }
  576.                 format[end] = '\'';
  577.                 stringPos = ch + (end - formatPos);
  578.                 formatPos = end + 1;
  579.             }
  580.             case 'u':
  581.             {
  582.                 new
  583.                     end = stringPos - 1,
  584.                     id = 0,
  585.                     bool:num = true,
  586.                     ch;
  587.                 while ((ch = string[++end]) && ch != delim)
  588.                 {
  589.                     if (num)
  590.                     {
  591.                         if ('0' <= ch <= '9')
  592.                         {
  593.                             id = (id * 10) + (ch - '0');
  594.                         }
  595.                         else
  596.                         {
  597.                             num = false;
  598.                         }
  599.                     }
  600.                 }
  601.                 if (num && IsPlayerConnected(id))
  602.                 {
  603.                     setarg(paramPos, 0, id);
  604.                 }
  605.                 else
  606.                 {
  607.                     #if !defined foreach
  608.                         #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  609.                         #define __SSCANF_FOREACH__
  610.                     #endif
  611.                     string[end] = '\0';
  612.                     num = false;
  613.                     new
  614.                         name[MAX_PLAYER_NAME];
  615.                     id = end - stringPos;
  616.                     foreach (Player, playerid)
  617.                     {
  618.                         GetPlayerName(playerid, name, sizeof (name));
  619.                         if (!strcmp(name, string[stringPos], true, id))
  620.                         {
  621.                             setarg(paramPos, 0, playerid);
  622.                             num = true;
  623.                             break;
  624.                         }
  625.                     }
  626.                     if (!num)
  627.                     {
  628.                         setarg(paramPos, 0, INVALID_PLAYER_ID);
  629.                     }
  630.                     string[end] = ch;
  631.                     #if defined __SSCANF_FOREACH__
  632.                         #undef foreach
  633.                         #undef __SSCANF_FOREACH__
  634.                     #endif
  635.                 }
  636.                 stringPos = end;
  637.             }
  638.             case 's', 'z':
  639.             {
  640.                 new
  641.                     i = 0,
  642.                     ch;
  643.                 if (format[formatPos])
  644.                 {
  645.                     while ((ch = string[stringPos++]) && ch != delim)
  646.                     {
  647.                         setarg(paramPos, i++, ch);
  648.                     }
  649.                     if (!i)
  650.                     {
  651.                         return -1;
  652.                     }
  653.                 }
  654.                 else
  655.                 {
  656.                     while ((ch = string[stringPos++]))
  657.                     {
  658.                         setarg(paramPos, i++, ch);
  659.                     }
  660.                 }
  661.                 stringPos--;
  662.                 setarg(paramPos, i, '\0');
  663.             }
  664.             default:
  665.             {
  666.                 continue;
  667.             }
  668.         }
  669.         while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  670.         {
  671.             stringPos++;
  672.         }
  673.         while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  674.         {
  675.             stringPos++;
  676.         }
  677.         paramPos++;
  678.     }
  679.     do
  680.     {
  681.         if ((delim = format[formatPos++]) > ' ')
  682.         {
  683.             if (delim == '\'')
  684.             {
  685.                 while ((delim = format[formatPos++]) && delim != '\'') {}
  686.             }
  687.             else if (delim != 'z')
  688.             {
  689.                 return delim;
  690.             }
  691.         }
  692.     }
  693.     while (delim > ' ');
  694.     return 0;
  695. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement