Ghecco

Gheecco's Boombox

May 30th, 2020
87
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.                     | gheecco's Boombox FS |
  3.                                                         */
  4. #define FILTERSCRIPT
  5.  
  6. //*[Includes]
  7. #include <a_samp>
  8.  
  9. #include <YSI_Data\y_iterate>
  10. #include <YSI_Coding\y_inline>
  11. #include <a_mysql_yinline>
  12.  
  13. #include <a_mysql>
  14. #include <sscanf2>
  15. #include <Pawn.CMD>
  16. #include <strlib>
  17. #include <foreach>
  18. #include <audio>
  19.  
  20.  
  21. //*[Defines]
  22.  
  23. //-Macro
  24. #if! defined isnull
  25. #define isnull (% 1) ((! (% 1 [0])) || (((% 1 [0]) == '\ 1') && (! (% 1 [1] ))))
  26. #endif
  27.  
  28. // MySQL
  29. #define MYSQL_HOSTNAME  "127.0.0.1"
  30. #define MYSQL_USERNAME  "root"
  31. #define MYSQL_PASSWORD  ""
  32. #define MYSQL_DATABASE  "gheecco"
  33.  
  34. //-colori
  35. #define COLORE_ERRORE 0x8B0000FF
  36. #define COLORE_INFO   0xFFFFE0FF
  37.  
  38. //-Utili
  39. #define NULL                        (-1)
  40.  
  41. #define BOOMBOX_MODELLO_1           (2226)
  42. #define BOOMBOX_MODELLO_2           (2102)
  43.  
  44. #define BOOMBOX_STATO_SPENTO        (0)
  45. #define BOOMBOX_STATO_ATTIVO        (1)
  46. #define BOOMBOX_STATO_PAUSA         (2)
  47.  
  48. #define BOOMBOX_DISTANZA_MASSIMA    (15.0) // valore massima distanza riproduzione della musica
  49.  
  50. #define BOOMBOX_LABEL_ALTEZZA       (0.5)
  51. #define BOOMBOX_LABEL_DISTANZA      (10.0) // massima visibilità della label
  52. #define MAX_BOOMBOX                 (11) // Il valore va sempre aumentato di 1 al numero desiderato, per un corretto funzionamento dei cicli e degli Iterators
  53.  
  54. //*[Variabili]
  55.  
  56. //-Iteratori
  57. new Iterator:Boombox_Esistenti<MAX_BOOMBOX>;
  58. // Enums
  59. enum boomboxinfo
  60. {
  61.     Creatore[MAX_PLAYER_NAME],
  62.     Modello,
  63.     Float:x,
  64.     Float:y,
  65.     Float:z,
  66.     Float:rx,
  67.     Float:ry,
  68.     Float:rz,
  69.     VirtualWorld,
  70.  
  71.  
  72.     // Variabili che non  verranno salvate
  73.     OggettoID,
  74.     Text3D:LabelID,
  75.     URL[200],
  76.     Stato
  77. };
  78.  
  79. new g_Boombox[MAX_BOOMBOX][boomboxinfo], MySQL:mysqlhandle, PlayerText:TD_BOOMBOX[MAX_PLAYERS][3]; // CELLA 0: Testo | CELLA 1: Modello Preview 1 | CELLA 2: Modello Preview 2  |                le altre formano i bordi
  80.  
  81.  
  82. //* [Forward]
  83. forward Riproduzione_Boombox(playerid);
  84.  
  85.  
  86. // --
  87.  
  88. public OnFilterScriptInit()
  89. {
  90.     Iter_Add(Boombox_Esistenti, 0); // Serve per far iniziare il count da 1
  91.  
  92.     new MySQLOpt: option_id = mysql_init_options();
  93.  
  94.     mysql_set_option(option_id, AUTO_RECONNECT, true);
  95.  
  96.     mysqlhandle = mysql_connect(MYSQL_HOSTNAME, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE, option_id);
  97.  
  98.     if (mysqlhandle == MYSQL_INVALID_HANDLE || mysql_errno(mysqlhandle) != 0)
  99.  
  100.     {
  101.  
  102.         print("[MySQL] Connessione col Database non riuscita, il server verrà  spento."); // Read below
  103.  
  104.         SendRconCommand("exit");
  105.         return 1;
  106.  
  107.     }
  108.  
  109.     print("[MySQL] Connessione col Database riuscita.");
  110.  
  111.     return 1;
  112. }
  113.  
  114. public OnFilterScriptExit()
  115. {
  116.     return 1;
  117. }
  118.  
  119. public OnPlayerConnect(playerid)
  120. {
  121.     CaricaTD(playerid); // Precarica le TD
  122.     SetTimerEx("Riproduzione_Boombox", 500, true, "i", playerid); // Timer per player di riproduzione
  123.  
  124.  
  125.     new querycaricamento[200];
  126.  
  127.     mysql_format(mysqlhandle, querycaricamento, sizeof(querycaricamento), "SELECT * FROM `boombox` WHERE `Creatore` = '%e' LIMIT 0, 1", GetNome(playerid)); // Controlla se esistono boombox salvate a questo player
  128.  
  129.     inline Carica_Boombox()
  130.     {
  131.  
  132.         new rows;
  133.  
  134.         cache_get_row_count(rows);
  135.  
  136.         if(rows) // se esistono, le carica e le crea
  137.         {
  138.             new boomboxid = Iter_Free(Boombox_Esistenti);
  139.             Iter_Add(Boombox_Esistenti, boomboxid);
  140.  
  141.             cache_get_value_name(0, "Creatore", g_Boombox[boomboxid][Creatore], MAX_PLAYER_NAME);
  142.             cache_get_value_name_int(0, "Modello", g_Boombox[boomboxid][Modello]);
  143.             cache_get_value_name_float(0, "x", g_Boombox[boomboxid][x]);
  144.             cache_get_value_name_float(0, "y", g_Boombox[boomboxid][y]);
  145.             cache_get_value_name_float(0, "z", g_Boombox[boomboxid][z]);
  146.             cache_get_value_name_float(0, "rx", g_Boombox[boomboxid][rx]);
  147.             cache_get_value_name_float(0, "ry", g_Boombox[boomboxid][ry]);
  148.             cache_get_value_name_float(0, "rz", g_Boombox[boomboxid][rz]);
  149.             cache_get_value_name_int(0, "VirtualWorld", g_Boombox[boomboxid][VirtualWorld]);
  150.  
  151.             SetPVarInt(playerid, "Player_Boombox_ID", boomboxid);
  152.  
  153.             new oggettoid = CreateObject(g_Boombox[boomboxid][Modello], g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z], g_Boombox[boomboxid][rx], g_Boombox[boomboxid][ry], g_Boombox[boomboxid][rz]);
  154.             new Text3D:labelid = Create3DTextLabel(sprintf("\n{20B2AA}Boombox #%d   {FFFFFF}%s", boomboxid, GetNome(playerid)), -1,g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z]+BOOMBOX_LABEL_ALTEZZA, BOOMBOX_LABEL_DISTANZA, g_Boombox[boomboxid][VirtualWorld], 1);
  155.  
  156.             Aggiorna_Boombox(boomboxid, oggettoid, labelid, g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z], g_Boombox[boomboxid][rx], g_Boombox[boomboxid][ry], g_Boombox[boomboxid][rz], g_Boombox[boomboxid][VirtualWorld], BOOMBOX_STATO_SPENTO, "");
  157.    
  158.  
  159.         }
  160.     }
  161.  
  162.     mysql_tquery_inline(mysqlhandle, querycaricamento, using inline Carica_Boombox);
  163.  
  164.     return 1;
  165. }
  166.  
  167. public OnPlayerDisconnect(playerid, reason)
  168. {
  169.     new boomboxid = GetPVarInt(playerid, "Player_Boombox_ID");
  170.  
  171.     if(boomboxid != 0)  // se il player aveva una boombox
  172.     {
  173.         new querysalvataggio[500];
  174.         mysql_format(mysqlhandle, querysalvataggio, sizeof(querysalvataggio), "SELECT * FROM `boombox` WHERE `Creatore` = '%e' LIMIT 0, 1", GetNome(playerid));
  175.  
  176.         inline Salva_Boombox()
  177.         {
  178.             new result;
  179.  
  180.             cache_get_row_count(result);
  181.  
  182.             if(result) // se già era presente, l'aggiorna
  183.             {
  184.                 DestroyObject(g_Boombox[boomboxid][OggettoID]);
  185.                 Delete3DTextLabel(g_Boombox[boomboxid][LabelID]);
  186.  
  187.                 strdel(querysalvataggio, 0, strlen(querysalvataggio));
  188.                 strcat(querysalvataggio, "UPDATE `boombox` SET `Creatore` = '%e', `Modello` ='%d', `x` = '%f', `y` = '%f', `z` = '%f', `rx` = '%f', `ry` = '%f', `rz` = '%f', `VirtualWorld` = '%d' WHERE `Creatore` = '%e'", sizeof(querysalvataggio));
  189.                 mysql_format(mysqlhandle, querysalvataggio, sizeof(querysalvataggio), querysalvataggio, g_Boombox[boomboxid][Creatore], g_Boombox[boomboxid][Modello], g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z], g_Boombox[boomboxid][rx], g_Boombox[boomboxid][ry], g_Boombox[boomboxid][rz], g_Boombox[boomboxid][VirtualWorld], g_Boombox[boomboxid][Creatore]);
  190.                 mysql_tquery(mysqlhandle, querysalvataggio);
  191.  
  192.                 Iter_Remove(Boombox_Esistenti, boomboxid);
  193.                 Aggiorna_Boombox(boomboxid, 0, Text3D:0, 0.0, 0.0, 0.0,  0.0, 0.0, 0.0, 0, false, "");
  194.                
  195.             }
  196.             else // se non era presente la crea
  197.             {
  198.                 strdel(querysalvataggio, 0, strlen(querysalvataggio));
  199.                 strcat(querysalvataggio, "INSERT INTO `boombox` (`Creatore`, `Modello`, `x`, `y`, `z`, `rx`, `ry`, `rz`, `VirtualWorld`) VALUES ('%e', '%d', '%f', '%f', '%f', '%f', '%f', '%f', '%d')", sizeof(querysalvataggio));
  200.                 mysql_format(mysqlhandle, querysalvataggio, sizeof(querysalvataggio), querysalvataggio,  g_Boombox[boomboxid][Creatore], g_Boombox[boomboxid][Modello], g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z], g_Boombox[boomboxid][rx], g_Boombox[boomboxid][ry], g_Boombox[boomboxid][rz], g_Boombox[boomboxid][VirtualWorld]);
  201.                 mysql_tquery(mysqlhandle, querysalvataggio);
  202.  
  203.                 DestroyObject(g_Boombox[boomboxid][OggettoID]);
  204.                 Delete3DTextLabel(g_Boombox[boomboxid][LabelID]);
  205.                 Iter_Remove(Boombox_Esistenti, boomboxid);
  206.                 Aggiorna_Boombox(boomboxid, 0, Text3D:0, 0.0, 0.0, 0.0,  0.0, 0.0, 0.0, 0, false, "");
  207.             }
  208.         }
  209.  
  210.         mysql_tquery_inline(mysqlhandle, querysalvataggio, using inline Salva_Boombox);
  211.     }
  212.    
  213.     else // se non ha (più) una boombox
  214.     {
  215.         new querysalvataggio[500];
  216.         mysql_format(mysqlhandle, querysalvataggio, sizeof(querysalvataggio), "SELECT * FROM `boombox` WHERE `Creatore` = '%e' LIMIT 0, 1", GetNome(playerid));
  217.  
  218.         inline Cancella_Boombox()
  219.         {
  220.             new result;
  221.             cache_get_row_count(result);
  222.  
  223.             if(result) // se non ha più una boombox salvata in precedenza sul db laa cancella
  224.             {
  225.                 strdel(querysalvataggio, 0, strlen(querysalvataggio));
  226.                 mysql_format(mysqlhandle, querysalvataggio, sizeof(querysalvataggio), "DELETE FROM boombox WHERE Creatore='%e'", GetNome(playerid));
  227.                 mysql_tquery(mysqlhandle, querysalvataggio);
  228.            
  229.             }
  230.         }
  231.         mysql_tquery_inline(mysqlhandle, querysalvataggio, using inline Cancella_Boombox);
  232.     }
  233.     return 1;
  234. }
  235.  
  236. public OnPlayerSpawn(playerid)
  237. {
  238.     return 1;
  239. }
  240.  
  241. public OnPlayerDeath(playerid, killerid, reason)
  242. {
  243.     return 1;
  244. }
  245.  
  246. public OnVehicleSpawn(vehicleid)
  247. {
  248.     return 1;
  249. }
  250.  
  251. public OnVehicleDeath(vehicleid, killerid)
  252. {
  253.     return 1;
  254. }
  255.  
  256.  public OnPlayerText(playerid, text[])
  257. {
  258.     return 1;
  259. }
  260.  
  261.  
  262. //*[Comandi]
  263.  
  264. public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
  265. {
  266.     new Float:oldX, Float:oldY, Float:oldZ, Float:oldRotX, Float:oldRotY, Float:oldRotZ;
  267.  
  268.     GetObjectPos(objectid, oldX, oldY, oldZ);
  269.     GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
  270.  
  271.     if(playerobject == 0)
  272.     {
  273.         if(response == EDIT_RESPONSE_CANCEL) // se annulla la modifica della boombox la riporta alla posizione precedente
  274.         {
  275.             SetObjectPos(objectid, oldX, oldY, oldZ);
  276.             SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
  277.            
  278.             SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai annullato la modifica alla posizione della boombox.");   
  279.         }
  280.         else if(response == EDIT_RESPONSE_FINAL)
  281.         {
  282.             if(!IsPointInRangeOfPoint(oldX, oldY, oldZ, fX, fY, fZ, 5.0))
  283.             {
  284.                 SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Sei troppo distante dalla distanza precedente, diminuiscila oppure usa /boombox riponi e piazzala nuovamente nel punto desiderato.");
  285.                
  286.                 SetObjectPos(objectid, oldX, oldY, oldZ);
  287.                 SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
  288.             }
  289.             else
  290.             {
  291.                 new boomboxid = GetPVarInt(playerid, "Player_Boombox_ID");
  292.                 new vw = GetPlayerVirtualWorld(playerid);
  293.                
  294.                 SetObjectPos(objectid, fX, fY, fZ); // Setto nuovamente le posizioni perchè in passato in assenza si sono causati bug, solitamente con OnPlayerDynamicObject dello streamer.
  295.                 SetObjectRot(objectid, fRotX, fRotY, fRotZ);
  296.  
  297.                 Delete3DTextLabel(g_Boombox[boomboxid][LabelID]);
  298.                 new Text3D:labelid = Create3DTextLabel(sprintf("\n{20B2AA}Boombox #%d   {FFFFFF}%s", boomboxid, GetNome(playerid)), -1,fX, fY, fZ+BOOMBOX_LABEL_ALTEZZA, BOOMBOX_LABEL_DISTANZA, vw, 1);
  299.  
  300.                 Aggiorna_Boombox(boomboxid, objectid, labelid, fX, fY, fZ, fRotX, fRotY, fRotZ, vw);
  301.             }
  302.         }
  303.     }
  304.     return 0;
  305. }
  306.  
  307.  
  308. public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
  309. {
  310.     CloseTD(playerid);
  311.  
  312.     new editid = GetPVarInt(playerid, "Player_Boombox_ID");
  313.    
  314.     if(playertextid == TD_BOOMBOX[playerid][1]) // Se preme la 1 TD, con la boombox rossa
  315.     {
  316.         if(editid == 0) // Se non ha una boombox, e deve crearla
  317.         {
  318.             if(Iter_Free(Boombox_Esistenti) == NULL) return SendClientMessage(playerid, COLORE_ERRORE, sprintf("[gBoombox]: E' stato raggiunto il limite di Boombox posizionabili. (%d) ", MAX_BOOMBOX));
  319.  
  320.             new Float:xp, Float:yp, Float:zp, Float:angle, vw, objectid, Text3D:idlabel, idboombox = Iter_Free(Boombox_Esistenti);
  321.  
  322.             vw = GetPlayerVirtualWorld(playerid);
  323.             GetPlayerPos(playerid, xp, yp, zp);
  324.             GetInFrontOfPlayer(playerid, 0.5, xp, yp, zp, angle);
  325.  
  326.             zp = zp-1;
  327.             objectid = CreateObject(BOOMBOX_MODELLO_1, xp, yp, zp, 0, 0, angle);
  328.             idlabel = Create3DTextLabel(sprintf("\n{20B2AA}Boombox #%d   {FFFFFF}%s", idboombox, GetNome(playerid)), -1, xp, yp, zp+BOOMBOX_LABEL_ALTEZZA, BOOMBOX_LABEL_DISTANZA, vw, 1);
  329.  
  330.             SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai posizionato la tua boombox per terra con successo, usa /boombox fix per modificarne la posizione.");
  331.             SetPVarInt(playerid, "Player_Boombox_ID", idboombox);
  332.  
  333.             Iter_Add(Boombox_Esistenti, idboombox);
  334.  
  335.             format(g_Boombox[idboombox][Creatore], MAX_PLAYER_NAME, "%s", GetNome(playerid));
  336.             Aggiorna_Boombox(idboombox, objectid, idlabel, xp, yp, zp, 0, 0, angle, vw, BOOMBOX_STATO_SPENTO, "");
  337.         }
  338.  
  339.         else // se deve AGGIORNARE la Boombox e ha scelto il modello 1
  340.         {
  341.             if(GetObjectModel(g_Boombox[editid][Modello]) == BOOMBOX_MODELLO_1) return EditObject(playerid, g_Boombox[editid][OggettoID]);
  342.  
  343.             DestroyObject(g_Boombox[editid][OggettoID]);
  344.             new oggetto = CreateObject(BOOMBOX_MODELLO_1, g_Boombox[editid][x], g_Boombox[editid][y], g_Boombox[editid][z], g_Boombox[editid][rx], g_Boombox[editid][ry], g_Boombox[editid][rz]);
  345.            
  346.             EditObject(playerid, g_Boombox[editid][OggettoID]);
  347.  
  348.             Aggiorna_Boombox(editid, oggetto, g_Boombox[editid][LabelID], g_Boombox[editid][x], g_Boombox[editid][y], g_Boombox[editid][z], g_Boombox[editid][rx], g_Boombox[editid][ry], g_Boombox[editid][rz], g_Boombox[editid][VirtualWorld], g_Boombox[editid][Stato], g_Boombox[editid][URL]);
  349.         }
  350.     }
  351.  
  352.     if(playertextid == TD_BOOMBOX[playerid][2]) // se deve creare la Boombox e ha scelto il modello 2
  353.     {
  354.         if(editid == 0)
  355.         {
  356.             new Float:xp, Float:yp, Float:zp, Float:angle, vw, objectid, Text3D:idlabel, idboombox = Iter_Free(Boombox_Esistenti);
  357.  
  358.             vw = GetPlayerVirtualWorld(playerid);
  359.             GetPlayerPos(playerid, xp, yp, zp);
  360.             GetInFrontOfPlayer(playerid, 0.5, xp, yp, zp, angle);
  361.             zp = zp-1;
  362.  
  363.             objectid = CreateObject(BOOMBOX_MODELLO_2, xp, yp, zp, 0, 0, angle);
  364.             idlabel = Create3DTextLabel(sprintf("\n{20B2AA}Boombox #%d   {FFFFFF}%s", idboombox, GetNome(playerid)), -1, xp, yp, zp+BOOMBOX_LABEL_ALTEZZA, BOOMBOX_LABEL_DISTANZA, vw, 1);
  365.  
  366.             SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai posizionato la tua boombox per terra con successo, usa /boombox fix per modificarne la posizione.");
  367.             SetPVarInt(playerid, "Player_Boombox_ID", idboombox);
  368.            
  369.             Iter_Add(Boombox_Esistenti, idboombox);
  370.  
  371.             format(g_Boombox[idboombox][Creatore], MAX_PLAYER_NAME, "%s", GetNome(playerid));
  372.             Aggiorna_Boombox(idboombox, objectid, idlabel, xp, yp, zp, 0, 0, angle, vw, BOOMBOX_STATO_SPENTO, "");
  373.  
  374.         }
  375.  
  376.         else // Se deve aggiornare la Boombox col modello 2
  377.         {
  378.             if(GetObjectModel(g_Boombox[editid][Modello]) == BOOMBOX_MODELLO_2) return EditObject(playerid, g_Boombox[editid][OggettoID]);
  379.  
  380.             DestroyObject(g_Boombox[editid][OggettoID]);
  381.             new oggetto = CreateObject(BOOMBOX_MODELLO_2, g_Boombox[editid][x], g_Boombox[editid][y], g_Boombox[editid][z], g_Boombox[editid][rx], g_Boombox[editid][ry], g_Boombox[editid][rz]);
  382.            
  383.             EditObject(playerid, g_Boombox[editid][OggettoID]);
  384.  
  385.             Aggiorna_Boombox(editid, oggetto, g_Boombox[editid][LabelID], g_Boombox[editid][x], g_Boombox[editid][y], g_Boombox[editid][z], g_Boombox[editid][rx], g_Boombox[editid][ry], g_Boombox[editid][rz], g_Boombox[editid][VirtualWorld], g_Boombox[editid][Stato], g_Boombox[editid][URL]);
  386.         }
  387.     }
  388.  
  389.     return 0;
  390. }
  391.  
  392.     public OnPlayerClickTextDraw(playerid, Text:clickedid)
  393.     {
  394.         if(clickedid == Text:INVALID_TEXT_DRAW) // se preme ESC durante la visualizzazione della td
  395.         {
  396.             PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][0]);
  397.             PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][1]);
  398.             PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][2]);
  399.         }
  400.         return 1;
  401.     }
  402.  
  403. public OnPlayerEnterCheckpoint(playerid)
  404. {
  405.     DisablePlayerCheckpoint(playerid); // se entra nel checkpoint di /boombox gps
  406.     return 1;
  407. }
  408. CMD:boombox(playerid, params[])
  409. {
  410.     new azione[10], linkURL[200], idboombox = GetPVarInt(playerid, "Player_Boombox_ID");
  411.  
  412.     if(sscanf(params, "s[10]S()[200]", azione, linkURL)) return SendClientMessage(playerid, NULL, "[gBoombox]: /boombox < posiziona | riponi | fix | play | pausa | gps >");
  413.  
  414.  
  415.     if(!strcmp(params, "posiziona")) // avvia la td (onplayerclickplayertextdraw) e fa creare la boombox
  416.     {
  417.         if(idboombox != 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Hai già una boombox posizionata.");
  418.  
  419.         if(Iter_Free(Boombox_Esistenti) == NULL) return SendClientMessage(playerid, COLORE_ERRORE, sprintf("[gBoombox]: E' stato raggiunto il limite di Boombox posizionabili. (%d) ", MAX_BOOMBOX));
  420.        
  421.         if(GetBoomboxPosition(playerid) == 1) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Nella tua posizione è già presente una boombox.");
  422.  
  423.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][0]);
  424.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][1]);
  425.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][2]);
  426.         SelectTextDraw(playerid, 0x0083c9FF);
  427.     }
  428.  
  429.     else if(!strcmp(params, "riponi")) // ripone la boombox, la cancella e resetta l'enum al suo id assegnato
  430.     {
  431.    
  432.         if(idboombox == 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non hai nessuna boombox posizionata da riporre.");
  433.  
  434.         if(GetBoomboxPosition(playerid, idboombox) != 1) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non ti trovi di fronte alla la tua boombox.");
  435.  
  436.         Delete3DTextLabel(g_Boombox[idboombox][LabelID]);
  437.         DestroyObject(g_Boombox[idboombox][OggettoID]);
  438.  
  439.         SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai riposto la tua boombox.");
  440.         DeletePVar(playerid, "Player_Boombox_ID");
  441.  
  442.         Iter_Remove(Boombox_Esistenti, idboombox);
  443.  
  444.         Aggiorna_Boombox(idboombox, 0, Text3D:0, 0.0, 0.0, 0.0,  0.0, 0.0, 0.0, 0, BOOMBOX_STATO_SPENTO, "");
  445.         printf("%f %f %f", g_Boombox[idboombox][x], g_Boombox[idboombox][y], g_Boombox[idboombox][z]);
  446.     }
  447.  
  448.     else if(!strcmp(params, "fix")) // edita una boombox già esistente
  449.     {
  450.         if(idboombox == 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non hai nessuna boombox posizionata da modificare.");
  451.  
  452.         if(GetBoomboxPosition(playerid, idboombox) != 1) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non ti trovi di fronte alla la tua boombox.");
  453.  
  454.         // Per fargli editare direttamente l'oggetto, senza la possibilita di editare anche il modello: EditObject(playerid, g_Boombo[idboombox][OggettoID]);
  455.  
  456.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][0]);
  457.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][1]);
  458.         PlayerTextDrawShow(playerid, TD_BOOMBOX[playerid][2]);
  459.  
  460.         SelectTextDraw(playerid, 0x0083c9FF);
  461.     }
  462.  
  463.     else if(!strcmp(azione, "play")) // esegue il file mp3
  464.     {
  465.         if(isnull(linkURL)) return SendClientMessage(playerid, NULL, "[gBoombox]: /boombox play <url.mp3>");
  466.  
  467.         if(idboombox == 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non hai nessuna boombox posizionata.");
  468.  
  469.         if(GetBoomboxPosition(playerid, idboombox) != 1) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non ti trovi di fronte alla la tua boombox.");
  470.  
  471.         if(strfind(linkURL, ".mp3") == NULL) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Hai inserito un link privo di formato .mp3, inseriscine uno valido.");
  472.  
  473.         SendClientMessage(playerid, COLORE_INFO, sprintf("[gBoombox]: Hai eseguito l'URL:'%s' alla tua boomboxid %d.", linkURL, idboombox));
  474.        
  475.         Aggiorna_Boombox(idboombox, g_Boombox[idboombox][OggettoID], g_Boombox[idboombox][LabelID], g_Boombox[idboombox][x], g_Boombox[idboombox][y], g_Boombox[idboombox][z], g_Boombox[idboombox][rx], g_Boombox[idboombox][ry], g_Boombox[idboombox][rz], g_Boombox[idboombox][VirtualWorld], BOOMBOX_STATO_ATTIVO, linkURL);
  476.     }
  477.     else if(!strcmp(azione, "pausa")) // mette in pausa, per chi non ha l'audio plugin stopperà lo stream
  478.     {
  479.         if(idboombox == 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non hai nessuna boombox posizionata.");
  480.  
  481.         if(GetBoomboxPosition(playerid, idboombox) != 1) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non ti trovi di fronte alla la tua boombox.");
  482.  
  483.         if(g_Boombox[idboombox][Stato] == BOOMBOX_STATO_SPENTO) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: La tua Boombox è spenta (inutilizzata) al momento.");
  484.        
  485.         else if(g_Boombox[idboombox][Stato] == BOOMBOX_STATO_PAUSA)
  486.         {
  487.             g_Boombox[idboombox][Stato] = BOOMBOX_STATO_ATTIVO;
  488.  
  489.             SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai ripreso l'ascolto togliendo la pausa alla tua Boombox.");
  490.         }
  491.         else if(g_Boombox[idboombox][Stato] == BOOMBOX_STATO_ATTIVO)
  492.         {
  493.             g_Boombox[idboombox][Stato] = BOOMBOX_STATO_PAUSA;
  494.  
  495.             SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Hai interrotto l'ascolto mettendo la pausa alla tua Boombox, usa /boombox pausa per riprendere l'ascolto.");
  496.         }
  497.     }
  498.     else if(!strcmp(azione, "gps")) // segna la posizione della boombox ( mi è stato utile durante i test)
  499.     {
  500.         if(idboombox == 0) return SendClientMessage(playerid, COLORE_ERRORE, "[gBoombox]: Non hai nessuna boombox posizionata.");
  501.  
  502.         SetPlayerCheckpoint(playerid, g_Boombox[idboombox][x], g_Boombox[idboombox][y], g_Boombox[idboombox][z], 1.5);
  503.         SendClientMessage(playerid, COLORE_INFO, "[gBoombox]: Ti è stato segnato sulla mappa il punto in cui si trova la tua boombox.");
  504.     }
  505.     return 1;
  506. }
  507.  
  508.     stock Aggiorna_Boombox(ID, idobject, Text3D:labelid, Float:Posx, Float:Posy, Float:Posz, Float:Rotx, Float:Roty, Float:Rotz, bVirtualWorld, stato = false, bURL[] = "")
  509.     {
  510.  
  511.         g_Boombox[ID][OggettoID] = idobject;
  512.         g_Boombox[ID][LabelID] = labelid;
  513.         g_Boombox[ID][Modello] = GetObjectModel(idobject);
  514.         g_Boombox[ID][Stato] = stato;
  515.         format(g_Boombox[ID][URL], 200, "%s", bURL);
  516.  
  517.         g_Boombox[ID][x] = Posx;
  518.         g_Boombox[ID][y] = Posy;
  519.         g_Boombox[ID][z] = Posz;
  520.  
  521.         g_Boombox[ID][rx] = Rotx;
  522.         g_Boombox[ID][ry] = Roty;
  523.         g_Boombox[ID][rz] = Rotz;
  524.  
  525.         g_Boombox[ID][VirtualWorld] = bVirtualWorld;
  526.  
  527.         return 1;
  528.     }
  529.  
  530.     stock CloseTD(playerid)
  531.     {
  532.         PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][0]);
  533.         PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][1]);
  534.         PlayerTextDrawHide(playerid, TD_BOOMBOX[playerid][2]);
  535.         CancelSelectTextDraw(playerid);
  536.         return 1;
  537.     }
  538.    
  539.     stock GetBoomboxPosition(playerid, boomboxid=NULL)
  540.     {
  541.         new risposta = -1;
  542.  
  543.         if(boomboxid == NULL) // Se nei parametri boombox viene lasciato vuoto è utile per funzione di cercare boombox nei paraggi, in modo da non farne creare una nello stesso punto
  544.         {
  545.             foreach(new i : Boombox_Esistenti)
  546.             {
  547.                 if(IsPlayerInRangeOfPoint(playerid, 1.5, g_Boombox[i][x], g_Boombox[i][y], g_Boombox[i][z]))
  548.                 {
  549.                     if(GetPlayerVirtualWorld(playerid) == g_Boombox[i][VirtualWorld])
  550.                     {
  551.                         risposta = 1;
  552.                         break;
  553.                     }
  554.                 }
  555.                 else continue;
  556.             }
  557.         }
  558.         else // controlla se ti trovi vicino alla boombox con l'id inserito (nello script usato con il proprio id boombox)
  559.         {
  560.    
  561.             if(IsPlayerInRangeOfPoint(playerid, 3, g_Boombox[boomboxid][x], g_Boombox[boomboxid][y], g_Boombox[boomboxid][z]))
  562.             {
  563.                 if(GetPlayerVirtualWorld(playerid) == g_Boombox[boomboxid][VirtualWorld]) return risposta = 1;
  564.             }
  565.         }
  566.         return risposta;
  567.     }
  568.  
  569.     public Riproduzione_Boombox(playerid) // funzione di ascolto musica per tutti i player
  570.     {
  571.        
  572.         new idboombox = GetPVarInt(playerid, "Player_Boombox_InAscolto");
  573.  
  574.         if(Audio_IsClientConnected(playerid)) // Se il player ha l'audio plugin
  575.         {
  576.  
  577.             if(idboombox != 0) // Se sta già ascoltando una boombox
  578.             {
  579.  
  580.                 if(!IsPlayerInRangeOfPoint(playerid, BOOMBOX_DISTANZA_MASSIMA, g_Boombox[idboombox][x], g_Boombox[idboombox][y], g_Boombox[idboombox][z]) || g_Boombox[idboombox][Stato] == BOOMBOX_STATO_SPENTO) // Se non si trova nel raggio della boombox, o la boombox è spenta stoppa la musica
  581.                 {
  582.                     Audio_Stop(playerid, GetPVarInt(playerid, "Player_Boombox_AudioID"));
  583.                     DeletePVar(playerid, "Player_Boombox_InAscolto");
  584.                     DeletePVar(playerid, "Player_Boombox_Pausa");
  585.                     return 1;
  586.                 }
  587.                
  588.                 if(GetPVarInt(playerid, "Player_Boombox_Pausa") == idboombox && g_Boombox[idboombox][Stato] == BOOMBOX_STATO_ATTIVO) // se il player ha un id di una boombox in pausa ( e' in pausa lui stesso) e, la boombox a cui è assegnato Player_Boombox_InAscolto è attiva, la riattiva
  589.                 {
  590.                     Audio_Resume(playerid, GetPVarInt(playerid, "Player_Boombox_AudioID"));
  591.                     DeletePVar(playerid, "Player_Boombox_Pausa");
  592.                     return 1;
  593.                 }
  594.                 else if(g_Boombox[idboombox][Stato] == BOOMBOX_STATO_PAUSA) // se la musica è in pausa, la mette in pausa
  595.                 {
  596.                     Audio_Pause(playerid, GetPVarInt(playerid, "Player_Boombox_AudioID"));
  597.                     SetPVarInt(playerid, "Player_Boombox_Pausa", idboombox);
  598.                     return 1;
  599.                 }
  600.                 return 1;
  601.             }
  602.             else // Se non sta ascolta nessuna boombox
  603.             {
  604.                 foreach(new b : Boombox_Esistenti) // controlla se c'è una boombox da attivargli
  605.                 {
  606.                     if(g_Boombox[b][Stato] == BOOMBOX_STATO_ATTIVO)
  607.                     {
  608.                         if(!IsPlayerInRangeOfPoint(playerid, BOOMBOX_DISTANZA_MASSIMA, g_Boombox[b][x], g_Boombox[b][y], g_Boombox[b][z])) continue;
  609.  
  610.                         new audiohandle = Audio_PlayStreamed(playerid, g_Boombox[b][URL], false, false, true);
  611.                        
  612.  
  613.                         Audio_Set3DPosition(playerid, audiohandle, g_Boombox[b][x], g_Boombox[b][y], g_Boombox[b][z], BOOMBOX_DISTANZA_MASSIMA);
  614.                        
  615.                         SetPVarInt(playerid, "Player_Boombox_InAscolto", b);
  616.                         SetPVarInt(playerid, "Player_Boombox_AudioID", audiohandle);
  617.  
  618.                         if(g_Boombox[b][Stato] == BOOMBOX_STATO_PAUSA)
  619.                         {
  620.                             Audio_Pause(playerid, audiohandle);
  621.                             SetPVarInt(playerid, "Player_Boombox_Pausa", idboombox);
  622.                         }
  623.                     }
  624.                 }
  625.                 return 1;
  626.             }
  627.         }
  628.         else // Se il player non ha l'audio plugin, usa la funzione standard di SA-MP
  629.         {
  630.    
  631.             if(idboombox != 0) // se sta già ascoltando una boombox
  632.             {
  633.                
  634.                 if(!IsPlayerInRangeOfPoint(playerid, BOOMBOX_DISTANZA_MASSIMA, g_Boombox[idboombox][x], g_Boombox[idboombox][y], g_Boombox[idboombox][z]) || g_Boombox[idboombox][Stato] != BOOMBOX_STATO_ATTIVO) // controlla la posizione e lo stato e in caso disattiva la riproduzione
  635.                 {
  636.                     StopAudioStreamForPlayer(playerid);
  637.  
  638.                     DeletePVar(playerid, "Player_Boombox_InAscolto");
  639.            
  640.                 }
  641.                 return 1;
  642.             }
  643.             else // se non sta ascoltando nessuna boombox, controlla
  644.             {
  645.                 foreach(new a : Boombox_Esistenti)
  646.                 {
  647.                     if(g_Boombox[a][Stato] != BOOMBOX_STATO_ATTIVO) continue;
  648.  
  649.                     if(!IsPlayerInRangeOfPoint(playerid, BOOMBOX_DISTANZA_MASSIMA, g_Boombox[a][x], g_Boombox[a][y], g_Boombox[a][z])) continue;
  650.            
  651.                     PlayAudioStreamForPlayer(playerid, g_Boombox[a][URL], g_Boombox[a][x], g_Boombox[a][y], g_Boombox[a][z], BOOMBOX_DISTANZA_MASSIMA, 1);
  652.  
  653.                     SetPVarInt(playerid, "Player_Boombox_InAscolto", a);
  654.                 }
  655.             }
  656.         }
  657.         return 1;
  658.     }
  659.  
  660.     stock GetInFrontOfPlayer(playerid,  Float:distance, &Float:xposizione, &Float:yposizione, &Float:zposizione, &Float:angle)
  661.     {
  662.         GetPlayerPos(playerid, xposizione, yposizione, zposizione);
  663.         GetPlayerFacingAngle(playerid, angle);
  664.  
  665.         xposizione += (distance * floatsin(-angle, degrees));
  666.         yposizione += (distance * floatcos(-angle, degrees));
  667.     }
  668.  
  669.     stock IsPointInRangeOfPoint(Float:xa, Float:ya, Float:za, Float:xa2, Float:ya2, Float:za2, Float:range)
  670.     {
  671.         xa2 -= xa;
  672.         ya2 -= ya;
  673.         za2 -= za;
  674.  
  675.         return ((xa2 * xa2) + (ya2 * ya2) + (za2 * za2)) < (range * range);
  676.     }
  677.     stock GetNome(playerid)
  678.     {
  679.         new nome[MAX_PLAYER_NAME];
  680.  
  681.         GetPlayerName(playerid, nome, sizeof(nome));
  682.         return nome;
  683.     }
  684.  
  685.     stock CaricaTD(playerid)
  686.     {
  687.  
  688.         TD_BOOMBOX[playerid][0] = CreatePlayerTextDraw(playerid, 409.000000, 191.000000, "scegli_un_modello_boombox");
  689.         PlayerTextDrawFont(playerid, TD_BOOMBOX[playerid][0], 3);
  690.         PlayerTextDrawLetterSize(playerid, TD_BOOMBOX[playerid][0], 0.191666, 1.000000);
  691.         PlayerTextDrawTextSize(playerid, TD_BOOMBOX[playerid][0], 399.000000, 16.500000);
  692.         PlayerTextDrawSetOutline(playerid, TD_BOOMBOX[playerid][0], 1);
  693.         PlayerTextDrawSetShadow(playerid, TD_BOOMBOX[playerid][0], 0);
  694.         PlayerTextDrawAlignment(playerid, TD_BOOMBOX[playerid][0], 1);
  695.         PlayerTextDrawColor(playerid, TD_BOOMBOX[playerid][0], -1);
  696.         PlayerTextDrawBackgroundColor(playerid, TD_BOOMBOX[playerid][0], 255);
  697.         PlayerTextDrawBoxColor(playerid, TD_BOOMBOX[playerid][0], 50);
  698.         PlayerTextDrawUseBox(playerid, TD_BOOMBOX[playerid][0], 0);
  699.         PlayerTextDrawSetProportional(playerid, TD_BOOMBOX[playerid][0], 1);
  700.         PlayerTextDrawSetSelectable(playerid, TD_BOOMBOX[playerid][0], 0);
  701.         PlayerTextDrawSetSelectable(playerid, TD_BOOMBOX[playerid][0], 0);
  702.  
  703.         TD_BOOMBOX[playerid][1] = CreatePlayerTextDraw(playerid, 406.000000, 200.000000, "Preview_Model");
  704.         PlayerTextDrawFont(playerid, TD_BOOMBOX[playerid][1], 5);
  705.         PlayerTextDrawLetterSize(playerid, TD_BOOMBOX[playerid][1], 0.600000, 2.000000);
  706.         PlayerTextDrawTextSize(playerid, TD_BOOMBOX[playerid][1], 49.500000, 46.500000);
  707.         PlayerTextDrawSetOutline(playerid, TD_BOOMBOX[playerid][1], 0);
  708.         PlayerTextDrawSetShadow(playerid, TD_BOOMBOX[playerid][1], 0);
  709.         PlayerTextDrawAlignment(playerid, TD_BOOMBOX[playerid][1], 1);
  710.         PlayerTextDrawColor(playerid, TD_BOOMBOX[playerid][1], -1);
  711.         PlayerTextDrawBackgroundColor(playerid, TD_BOOMBOX[playerid][1], 169);
  712.         PlayerTextDrawBoxColor(playerid, TD_BOOMBOX[playerid][1], 255);
  713.         PlayerTextDrawUseBox(playerid, TD_BOOMBOX[playerid][1], 0);
  714.         PlayerTextDrawSetProportional(playerid, TD_BOOMBOX[playerid][1], 1);
  715.         PlayerTextDrawSetSelectable(playerid, TD_BOOMBOX[playerid][1], 1);
  716.         PlayerTextDrawSetPreviewModel(playerid, TD_BOOMBOX[playerid][1], 2226);
  717.         PlayerTextDrawSetPreviewRot(playerid, TD_BOOMBOX[playerid][1], -18.000000, 1.000000, -180.000000, 1.000000);
  718.  
  719.  
  720.         TD_BOOMBOX[playerid][2] = CreatePlayerTextDraw(playerid, 455.500000, 200.000000, "Preview_Model");
  721.         PlayerTextDrawFont(playerid, TD_BOOMBOX[playerid][2], 5);
  722.         PlayerTextDrawLetterSize(playerid, TD_BOOMBOX[playerid][2], 0.179166, 2.000000);
  723.         PlayerTextDrawTextSize(playerid, TD_BOOMBOX[playerid][2], 49.500000, 46.500000);
  724.         PlayerTextDrawSetOutline(playerid, TD_BOOMBOX[playerid][2], 0);
  725.         PlayerTextDrawSetShadow(playerid, TD_BOOMBOX[playerid][2], 0);
  726.         PlayerTextDrawAlignment(playerid, TD_BOOMBOX[playerid][2], 0);
  727.         PlayerTextDrawColor(playerid, TD_BOOMBOX[playerid][2], -1);
  728.         PlayerTextDrawBackgroundColor(playerid, TD_BOOMBOX[playerid][2], 169);
  729.         PlayerTextDrawBoxColor(playerid, TD_BOOMBOX[playerid][2], 255);
  730.         PlayerTextDrawUseBox(playerid, TD_BOOMBOX[playerid][2], 0);
  731.         PlayerTextDrawSetProportional(playerid, TD_BOOMBOX[playerid][2], 1);
  732.         PlayerTextDrawSetSelectable(playerid, TD_BOOMBOX[playerid][2], 1);
  733.         PlayerTextDrawSetPreviewModel(playerid, TD_BOOMBOX[playerid][2], 2102);
  734.         PlayerTextDrawSetPreviewRot(playerid, TD_BOOMBOX[playerid][2], -18.000000, 1.000000, -180.000000, 1.000000);
  735.  
  736.  
  737.         return 1;
  738.     }
  739.      //
RAW Paste Data