Guest User

Tr1viUm

a guest
Jun 2nd, 2009
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.55 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. #define SprunkFile "sprunkin machines.txt"
  4. #define MAX_VENDING_MACHINES 50
  5. #define COLOR_RED 0xE81C1CFF
  6. #define COLOR_GREEN 0x6CEB12FF
  7.  
  8. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
  9.  
  10. enum sprunkEnum
  11. {
  12.     SprunkObjectID,
  13.     SprunkPickupID,
  14.     SprunkModelID,
  15.     Float:SprunkObjectX1,
  16.     Float:SprunkObjectY1,
  17.     Float:SprunkObjectX2,
  18.     Float:SprunkObjectY2,
  19.     Float:SprunkObjectZ,
  20.     Float:SprunkObjectA,
  21.     Float:SprunkHeal,
  22.     SprunkPrice,
  23.     bool:SprunkCreated,
  24. };
  25.  
  26. new SprunkMachines[MAX_VENDING_MACHINES][sprunkEnum];
  27.  
  28. enum vendingEnum
  29. {
  30.     vmName[64],
  31.     vmModel,
  32. };
  33.  
  34. new VendingMachines[3][vendingEnum] = {
  35.     {"Sprunk", 1775},
  36.     {"Cola", 1302},
  37.     {"Food", 1776}
  38. };
  39.  
  40. forward Float:zOffsetCheck(modelid);
  41.  
  42. Float:zOffsetCheck(modelid)
  43. {
  44.     if(modelid == 1302)
  45.         return 1.132;
  46.     return 0.0;
  47. }
  48.  
  49. stock GetXYInFrontOfSprunk(&Float:X, &Float:Y, Float:A)
  50. {
  51.     X += (0.75*floatsin(-A,degrees));
  52.     Y += (0.75*floatcos(-A,degrees));
  53.     return 1;
  54. }
  55.  
  56. public OnFilterScriptInit()
  57. {
  58.     print("\n ____________________ ");
  59.     print("|                    |");
  60.     print("|   -- SPRUNKIN --   |");
  61.     print("|    ____________    |");
  62.     print("|   |############| O |");
  63.     print("|   |##$######$##| O |");
  64.     print("|   |############| O |");
  65.     print("|   |____________| O |");
  66.     print("|                  O |");
  67.     print("|     o o o o o    O |");
  68.     print("|        o o         |");
  69.     print("|____________________|");
  70.     print("STARTED - BY: TR1VIUM\n");
  71.  
  72.  
  73.     new File:file = fopen(SprunkFile, io_readwrite), Float:X, Float:Y;
  74.     if(file)
  75.     {
  76.         new string[128], i = 0;
  77.         while(fread(file, string, 128))
  78.         {
  79.             sscanf(string, "ifffffi", SprunkMachines[i][SprunkModelID], SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ], SprunkMachines[i][SprunkObjectA], SprunkMachines[i][SprunkHeal], SprunkMachines[i][SprunkPrice]);
  80.             SprunkMachines[i][SprunkObjectID] = CreateObject(SprunkMachines[i][SprunkModelID], SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ]-zOffsetCheck(SprunkMachines[i][SprunkModelID]), 0.0, 0.0, SprunkMachines[i][SprunkObjectA]-180);
  81.             X = SprunkMachines[i][SprunkObjectX1], Y = SprunkMachines[i][SprunkObjectY1];
  82.             GetXYInFrontOfSprunk(X, Y, SprunkMachines[i][SprunkObjectA]);
  83.             SprunkMachines[i][SprunkPickupID] = CreatePickup(1274, 1, X, Y, SprunkMachines[i][SprunkObjectZ]);
  84.             SprunkMachines[i][SprunkObjectX2] = X, SprunkMachines[i][SprunkObjectY2] = Y;
  85.             SprunkMachines[i][SprunkCreated] = true;
  86.             i++;
  87.         }
  88.         fclose(file);
  89.     }
  90.     SendClientMessageToAll(COLOR_RED, "SPRUNKING COMMANDS!!");
  91.     SendClientMessageToAll(COLOR_RED, "/createsprunk, /removesprunk, /vendingmachines");
  92.     return 1;
  93. }
  94.  
  95. public OnFilterScriptExit()
  96. {
  97.     for(new i = 0; i < MAX_VENDING_MACHINES; i++)
  98.         if(SprunkMachines[i][SprunkCreated])
  99.         {
  100.             DestroyObject(SprunkMachines[i][SprunkObjectID]);
  101.             DestroyPickup(SprunkMachines[i][SprunkPickupID]);
  102.        }
  103.     return 1;
  104. }
  105.  
  106. public OnPlayerCommandText(playerid, cmdtext[])
  107. {
  108.     dcmd(sprunkhelp, 10, cmdtext);
  109.     dcmd(createsprunk, 12, cmdtext);
  110.     dcmd(removesprunk, 12, cmdtext);
  111.     dcmd(vendingmachines, 15, cmdtext);
  112.     return 0;
  113. }
  114.  
  115.  
  116. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  117. {
  118.     if (newkeys & KEY_SECONDARY_ATTACK)
  119.     {
  120.         for(new i = 0; i < MAX_VENDING_MACHINES; i++)
  121.         {
  122.             if(!SprunkMachines[i][SprunkCreated])
  123.                 continue;
  124.                
  125.             if(PlayerToPoint(0.5, playerid, SprunkMachines[i][SprunkObjectX2], SprunkMachines[i][SprunkObjectY2], SprunkMachines[i][SprunkObjectZ]))
  126.             {
  127.                 if(GetPlayerMoney(playerid) < SprunkMachines[i][SprunkPrice])
  128.                 {
  129.                     PlayerPlaySound(playerid, 1055, SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ]);
  130.                     // SendClientMessage(playerid, COLOR_RED, "SERVER: YOU DONT HAVE ENOUGH MONEY");
  131.                     break;
  132.                 }
  133.                 new Float:health;
  134.                 GetPlayerHealth(playerid, health);
  135.                 if(health + SprunkMachines[i][SprunkHeal] >= 100)
  136.                     SetPlayerHealth(playerid, 100.0);
  137.                 else
  138.                     SetPlayerHealth(playerid, health + SprunkMachines[i][SprunkHeal]);
  139.                 GivePlayerMoney(playerid, -SprunkMachines[i][SprunkPrice]);
  140.                 SetPlayerFacingAngle(playerid, SprunkMachines[i][SprunkObjectA]-180.0);
  141.                 ApplyAnimation(playerid, "VENDING", "VEND_Use",1.5,1,0,0,0,2500);
  142.                 PlayerPlaySound(playerid, 1084, SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ]);
  143.                 return 1;
  144.             }
  145.         }
  146.     }
  147.     return 1;
  148. }
  149.  
  150. dcmd_sprunkhelp(playerid, params[])
  151. {
  152.     SendClientMessage(playerid, COLOR_RED, "SPRUNKING COMMANDS!!");
  153.     SendClientMessage(playerid, COLOR_RED, "/createsprunk, /removesprunk, /vendingmachines");
  154.     #pragma unused params
  155.     return 1;
  156. }
  157.  
  158. dcmd_createsprunk(playerid, params[])
  159. {
  160.     if(!IsPlayerAdmin(playerid))
  161.         return SendClientMessage(playerid, COLOR_RED, "� Admin only.");
  162.  
  163.     if(GetPlayerState(playerid) == 1)
  164.     {
  165.         new string[128], Float:heal, price;
  166.         if(sscanf(params, "sfi", string, heal, price))
  167.         {
  168.             SendClientMessage(playerid, COLOR_RED, "� /createsprunk [vendingmachine] [heal bonus] [price]");
  169.             return SendClientMessage(playerid, COLOR_RED, "  Type /vendingmachines");
  170.         }
  171.         else
  172.         {
  173.             for(new int = 0; int < sizeof(VendingMachines); int++)
  174.             {
  175.                 if(strcmp(string, VendingMachines[int][vmName], true))
  176.                     continue;
  177.  
  178.                 for(new i = 0; i < MAX_VENDING_MACHINES; i++)
  179.                 {
  180.                     if(SprunkMachines[i][SprunkCreated])
  181.                         continue;
  182.                        
  183.                     GetPlayerPos(playerid, SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ]);
  184.                     GetPlayerFacingAngle(playerid, SprunkMachines[i][SprunkObjectA]);
  185.                     SprunkMachines[i][SprunkHeal] = heal;
  186.                     SprunkMachines[i][SprunkPrice] = price;
  187.                     SprunkMachines[i][SprunkModelID] = VendingMachines[int][vmModel];
  188.                     SprunkMachines[i][SprunkCreated] = true;
  189.                     new File:file = fopen(SprunkFile, io_append);
  190.                     if (file)
  191.                     {
  192.                         format(string, 128, "%i %f %f %f %f %f %i \r\n", SprunkMachines[i][SprunkModelID], SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ], SprunkMachines[i][SprunkObjectA], SprunkMachines[i][SprunkHeal], SprunkMachines[i][SprunkPrice]);
  193.                         fwrite(file, string);
  194.                         fclose(file);
  195.                     }
  196.                
  197.                     new Float:X, Float:Y;
  198.                     SprunkMachines[i][SprunkObjectID] = CreateObject(SprunkMachines[i][SprunkModelID], SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ]-zOffsetCheck(SprunkMachines[i][SprunkModelID]), 0.0, 0.0, SprunkMachines[i][SprunkObjectA]-180);
  199.                     X = SprunkMachines[i][SprunkObjectX1], Y = SprunkMachines[i][SprunkObjectY1];
  200.                     GetXYInFrontOfSprunk(X, Y, SprunkMachines[i][SprunkObjectA]);
  201.                     SprunkMachines[i][SprunkPickupID] = CreatePickup(1274, 1, X, Y, SprunkMachines[i][SprunkObjectZ]);
  202.                     SprunkMachines[i][SprunkObjectX2] = X, SprunkMachines[i][SprunkObjectY2] = Y;
  203.                     SprunkMachines[i][SprunkCreated] = true;
  204.                     SetPlayerPos(playerid, SprunkMachines[i][SprunkObjectX2], SprunkMachines[i][SprunkObjectY2], SprunkMachines[i][SprunkObjectZ]);
  205.                     SaveVendingMachines();
  206.                     return 1;
  207.                 }
  208.                 return SendClientMessage(playerid, COLOR_RED, "� No vending machine spots left..Type /removesprunk.");
  209.             }
  210.             return SendClientMessage(playerid, COLOR_RED, "� Invalid vending machine name. Type /vendingmachines.");
  211.         }
  212.     }
  213.     else
  214.         return SendClientMessage(playerid, COLOR_RED, "� You must be on foot.");
  215.     #pragma unused params
  216. }
  217.  
  218. dcmd_removesprunk(playerid, params[])
  219. {
  220.     if(!IsPlayerAdmin(playerid))
  221.         return SendClientMessage(playerid, COLOR_RED, "� Admin only.");
  222.  
  223.     if(GetPlayerState(playerid) == 1)
  224.     {
  225.         for(new i = 0; i < MAX_VENDING_MACHINES; i++)
  226.         {
  227.             if(!SprunkMachines[i][SprunkCreated])
  228.                 continue;
  229.  
  230.             if(PlayerToPoint(0.5, playerid, SprunkMachines[i][SprunkObjectX2], SprunkMachines[i][SprunkObjectY2], SprunkMachines[i][SprunkObjectZ]))
  231.             {
  232.                 SprunkMachines[i][SprunkCreated] = false;
  233.                 SendClientMessage(playerid, COLOR_GREEN, "� You succesfully removed the vending machine.");
  234.                 DestroyObject(SprunkMachines[i][SprunkObjectID]);
  235.                 DestroyPickup(SprunkMachines[i][SprunkPickupID]);
  236.                 SaveVendingMachines();
  237.                 return 1;
  238.             }
  239.         }
  240.         return SendClientMessage(playerid, COLOR_RED, "� You're not at a vending machine.");
  241.     }
  242.     else
  243.         return SendClientMessage(playerid, COLOR_RED, "� You must be on foot.");
  244.     #pragma unused params
  245. }
  246.  
  247. dcmd_vendingmachines(playerid, params[])
  248. {
  249.     SendClientMessage(playerid, COLOR_GREEN, "Vending Machines:");
  250.     for(new i = 0; i < sizeof(VendingMachines); i++)
  251.         SendClientMessage(playerid, COLOR_GREEN, VendingMachines[i][vmName]);
  252.     #pragma unused params
  253.     return 1;
  254. }
  255.  
  256. SaveVendingMachines()
  257. {
  258.     new File:file = fopen(SprunkFile, io_write), string[128];
  259.     if (file)
  260.     {
  261.         for(new i = 0; i < MAX_VENDING_MACHINES; i++)
  262.         {
  263.             if(!SprunkMachines[i][SprunkCreated])
  264.                 continue;
  265.  
  266.             format(string, 128, "%i %f %f %f %f %f %i \r\n", SprunkMachines[i][SprunkModelID], SprunkMachines[i][SprunkObjectX1], SprunkMachines[i][SprunkObjectY1], SprunkMachines[i][SprunkObjectZ], SprunkMachines[i][SprunkObjectA], SprunkMachines[i][SprunkHeal], SprunkMachines[i][SprunkPrice]);
  267.             fwrite(file, string);
  268.         }
  269.         fclose(file);
  270.     }
  271.     return 1;
  272. }
  273.  
  274. PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z) // Not by me.
  275. {
  276.     if(IsPlayerConnected(playerid))
  277.     {
  278.         new Float:oldposx, Float:oldposy, Float:oldposz;
  279.         new Float:tempposx, Float:tempposy, Float:tempposz;
  280.         GetPlayerPos(playerid, oldposx, oldposy, oldposz);
  281.         tempposx = (oldposx -x);
  282.         tempposy = (oldposy -y);
  283.         tempposz = (oldposz -z);
  284.         //printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
  285.         if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
  286.         {
  287.             return 1;
  288.         }
  289.     }
  290.     return 0;
  291. }
  292.  
  293. stock sscanf(text[], format[], {Float,_}:...) // Not by me.
  294. {
  295.     #if defined isnull
  296.         if (isnull(text))
  297.     #else
  298.         if (text[0] == 0 || (text[0] == 1 && text[1] == 0))
  299.     #endif
  300.         {
  301.             return format[0];
  302.         }
  303.     #pragma tabsize 4
  304.     new
  305.         formatPos = 0,
  306.         textPos = 0,
  307.         paramPos = 2,
  308.         paramCount = numargs(),
  309.         delim = ' ';
  310.     while (text[textPos] && text[textPos] <= ' ')
  311.     {
  312.         textPos++;
  313.     }
  314.     while (paramPos < paramCount && text[textPos])
  315.     {
  316.         switch (format[formatPos++])
  317.         {
  318.             case '\0':
  319.             {
  320.                 return 0;
  321.             }
  322.             case 'i', 'd':
  323.             {
  324.                 new
  325.                     neg = 1,
  326.                     num = 0,
  327.                     ch = text[textPos];
  328.                 if (ch == '-')
  329.                 {
  330.                     neg = -1;
  331.                     ch = text[++textPos];
  332.                 }
  333.                 do
  334.                 {
  335.                     textPos++;
  336.                     if ('0' <= ch <= '9')
  337.                     {
  338.                         num = (num * 10) + (ch - '0');
  339.                     }
  340.                     else
  341.                     {
  342.                         return -1;
  343.                     }
  344.                 }
  345.                 while ((ch = text[textPos]) > ' ' && ch != delim);
  346.                 setarg(paramPos, 0, num * neg);
  347.             }
  348.             case 'h', 'x':
  349.             {
  350.                 new
  351.                     ch,
  352.                     num = 0;
  353.                 while ((ch = text[textPos]) > ' ' && ch != delim)
  354.                 {
  355.                     switch (ch)
  356.                     {
  357.                         case 'x', 'X':
  358.                         {
  359.                             num = 0;
  360.                             continue;
  361.                         }
  362.                         case '0' .. '9':
  363.                         {
  364.                             num = (num << 4) | (ch - '0');
  365.                         }
  366.                         case 'a' .. 'f':
  367.                         {
  368.                             num = (num << 4) | (ch - ('a' - 10));
  369.                         }
  370.                         case 'A' .. 'F':
  371.                         {
  372.                             num = (num << 4) | (ch - ('A' - 10));
  373.                         }
  374.                         default:
  375.                         {
  376.                             return -1;
  377.                         }
  378.                     }
  379.                 }
  380.                 setarg(paramPos, 0, num);
  381.             }
  382.             case 'c':
  383.             {
  384.                 setarg(paramPos, 0, text[textPos++]);
  385.             }
  386.             case 'f':
  387.             {
  388.                 setarg(paramPos, 0, _:floatstr(text[textPos]));
  389.             }
  390.             case 'p':
  391.             {
  392.                 delim = format[formatPos++];
  393.                 continue;
  394.             }
  395.             case '\'':
  396.             {
  397.                 new
  398.                     end = formatPos - 1,
  399.                     ch;
  400.                 while ((ch = format[++end]) && ch != '\'') {}
  401.                 if (!ch)
  402.                 {
  403.                     return -1;
  404.                 }
  405.                 format[end] = '\0';
  406.                 if ((ch = strfind(text, format[formatPos], false, textPos)) == -1)
  407.                 {
  408.                     if (format[end + 1])
  409.                     {
  410.                         return -1;
  411.                     }
  412.                     return 0;
  413.                 }
  414.                 format[end] = '\'';
  415.                 textPos = ch + (end - formatPos);
  416.                 formatPos = end + 1;
  417.             }
  418.             case 'u':
  419.             {
  420.                 new
  421.                     end = textPos - 1,
  422.                     id = 0,
  423.                     bool:num = true,
  424.                     ch;
  425.                 while ((ch = text[++end]) && ch != delim)
  426.                 {
  427.                     if (num)
  428.                     {
  429.                         if ('0' <= ch <= '9')
  430.                         {
  431.                             id = (id * 10) + (ch - '0');
  432.                         }
  433.                         else
  434.                         {
  435.                             num = false;
  436.                         }
  437.                     }
  438.                 }
  439.                 if (num && IsPlayerConnected(id))
  440.                 {
  441.                     setarg(paramPos, 0, id);
  442.                 }
  443.                 else
  444.                 {
  445.                     #if !defined foreach
  446.                         #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  447.                         #define __SSCANF_FOREACH__
  448.                     #endif
  449.                     text[end] = '\0';
  450.                     num = false;
  451.                     new
  452.                         name[MAX_PLAYER_NAME];
  453.                     id = end - textPos;
  454.                     foreach (Player, playerid)
  455.                     {
  456.                         GetPlayerName(playerid, name, sizeof (name));
  457.                         if (!strcmp(name, text[textPos], true, id))
  458.                         {
  459.                             setarg(paramPos, 0, playerid);
  460.                             num = true;
  461.                             break;
  462.                         }
  463.                     }
  464.                     if (!num)
  465.                     {
  466.                         setarg(paramPos, 0, INVALID_PLAYER_ID);
  467.                     }
  468.                     text[end] = ch;
  469.                     #if defined __SSCANF_FOREACH__
  470.                         #undef foreach
  471.                         #undef __SSCANF_FOREACH__
  472.                     #endif
  473.                 }
  474.                 textPos = end;
  475.             }
  476.             case 's', 'z':
  477.             {
  478.                 new
  479.                     i = 0,
  480.                     ch;
  481.                 if (format[formatPos])
  482.                 {
  483.                     while ((ch = text[textPos++]) && ch != delim)
  484.                     {
  485.                         setarg(paramPos, i++, ch);
  486.                     }
  487.                     if (!i)
  488.                     {
  489.                         return -1;
  490.                     }
  491.                 }
  492.                 else
  493.                 {
  494.                     while ((ch = text[textPos++]))
  495.                     {
  496.                         setarg(paramPos, i++, ch);
  497.                     }
  498.                 }
  499.                 textPos--;
  500.                 setarg(paramPos, i, '\0');
  501.             }
  502.             default:
  503.             {
  504.                 continue;
  505.             }
  506.         }
  507.         while (text[textPos] && text[textPos] != delim && text[textPos] > ' ')
  508.         {
  509.             textPos++;
  510.         }
  511.         while (text[textPos] && (text[textPos] == delim || text[textPos] <= ' '))
  512.         {
  513.             textPos++;
  514.         }
  515.         paramPos++;
  516.     }
  517.     do
  518.     {
  519.         if ((delim = format[formatPos++]) > ' ')
  520.         {
  521.             if (delim == '\'')
  522.             {
  523.                 while ((delim = format[formatPos++]) && delim != '\'') {}
  524.             }
  525.             else if (delim != 'z')
  526.             {
  527.                 return delim;
  528.             }
  529.         }
  530.     }
  531.     while (delim > ' ');
  532.     return 0;
  533. }
Advertisement
Add Comment
Please, Sign In to add comment