Advertisement
Guest User

Tr1viUm

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