KinderClans

Dynamic Actors System By KinderClans [MySQL R41-4]

Oct 23rd, 2018
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.21 KB | None | 0 0
  1. /*
  2.  
  3.        /$$                                             /$$                                       /$$                                                               /$$
  4.       | $$                                            |__/                                      | $$                                                              | $$
  5.   /$$$$$$$ /$$   /$$ /$$$$$$$   /$$$$$$  /$$$$$$/$$$$  /$$  /$$$$$$$        /$$$$$$   /$$$$$$$ /$$$$$$    /$$$$$$   /$$$$$$         /$$$$$$$ /$$   /$$  /$$$$$$$ /$$$$$$    /$$$$$$  /$$$$$$/$$$$
  6.  /$$__  $$| $$  | $$| $$__  $$ |____  $$| $$_  $$_  $$| $$ /$$_____/       |____  $$ /$$_____/|_  $$_/   /$$__  $$ /$$__  $$       /$$_____/| $$  | $$ /$$_____/|_  $$_/   /$$__  $$| $$_  $$_  $$
  7. | $$  | $$| $$  | $$| $$  \ $$  /$$$$$$$| $$ \ $$ \ $$| $$| $$              /$$$$$$$| $$        | $$    | $$  \ $$| $$  \__/      |  $$$$$$ | $$  | $$|  $$$$$$   | $$    | $$$$$$$$| $$ \ $$ \ $$
  8. | $$  | $$| $$  | $$| $$  | $$ /$$__  $$| $$ | $$ | $$| $$| $$             /$$__  $$| $$        | $$ /$$| $$  | $$| $$             \____  $$| $$  | $$ \____  $$  | $$ /$$| $$_____/| $$ | $$ | $$
  9. |  $$$$$$$|  $$$$$$$| $$  | $$|  $$$$$$$| $$ | $$ | $$| $$|  $$$$$$$      |  $$$$$$$|  $$$$$$$  |  $$$$/|  $$$$$$/| $$             /$$$$$$$/|  $$$$$$$ /$$$$$$$/  |  $$$$/|  $$$$$$$| $$ | $$ | $$
  10.  \_______/ \____  $$|__/  |__/ \_______/|__/ |__/ |__/|__/ \_______/       \_______/ \_______/   \___/   \______/ |__/            |_______/  \____  $$|_______/    \___/   \_______/|__/ |__/ |__/
  11.            /$$  | $$                                                                                                                         /$$  | $$
  12.           |  $$$$$$/                                                                                                                        |  $$$$$$/
  13.            \______/                                                                                                                          \______/
  14.            
  15.                                                           _              _  ___           _            ____ _
  16.                                                          | |__  _   _   | |/ (_)_ __   __| | ___ _ __ / ___| | __ _ _ __  ___
  17.                                                          | '_ \| | | |  | ' /| | '_ \ / _` |/ _ \ '__| |   | |/ _` | '_ \/ __|
  18.                                                          | |_) | |_| |  | . \| | | | | (_| |  __/ |  | |___| | (_| | | | \__ \
  19.                                                          |_.__/ \__, |  |_|\_\_|_| |_|\__,_|\___|_|   \____|_|\__,_|_| |_|___/
  20.                                                                 |___/
  21.                                                                
  22.  
  23. You're free to edit and redistribute unless you keep credits.
  24.  
  25. Includes required:
  26.  
  27. MySQL R41-4: https://github.com/pBlueG/SA-MP-MySQL/releases
  28. Sscanf: https://github.com/maddinat0r/sscanf/releases
  29. Streamer: https://github.com/samp-incognito/samp-streamer-plugin/releases
  30. I-ZCMD: https://github.com/YashasSamaga/I-ZCMD/blob/master/izcmd.inc
  31.  
  32. */
  33.  
  34. #include <a_samp>
  35. #include <sscanf2>
  36. #include <a_mysql>
  37. #include <streamer>
  38. #include <izcmd>
  39.  
  40. #undef MAX_PLAYERS
  41. #define MAX_PLAYERS 50 //Change it according to your server slots.
  42.  
  43. /* ---- Colors ---- */
  44. #define COLOR_DARKGREEN (0x33AA33FF)
  45. #define COLOR_AQUA 0xBAFCFFFF
  46. /* ---------------- */
  47.  
  48. /* ---- Defines ---- */
  49. #define SCMEX SendClientMessageEx
  50. #define function%0(%1) forward %0(%1); public %0(%1) //Just a little macro.
  51.  
  52. #define MAX_DYNAMIC_ACTORS (10) //Max actors that can be created, feel free to increase it.
  53. #define MAX_ACTORS_RANGE 50.0 //Used for /locatenearactors, in meters.
  54. /* ----------------- */
  55.  
  56. /* ---- Enums ---- */
  57. enum DynamicActorData
  58. {
  59.     dynamicActorID,
  60.     dynamicActorExists,
  61.     Float:dynamicActorPos[4],
  62.     dynamicActorVW,
  63.     dynamicActorSkin,
  64.     Text3D:dynamicActorLabel
  65. };
  66. /* --------------- */
  67.  
  68. /* ---- News ---- */
  69. new MySQL: g_SQL;
  70. new Dynamic_Actor_Data[MAX_DYNAMIC_ACTORS][DynamicActorData];
  71. new Float:CheckpointPos[MAX_PLAYERS][3]; //For setting up the checkpoint.
  72. /* -------------- */
  73.  
  74. /* ---- MySQL Database Informations ---- */
  75. #define MYSQL_HOST      ""
  76. #define MYSQL_USER      ""
  77. #define MYSQL_PASS      ""
  78. #define MYSQL_DATABASE  ""
  79.  
  80. Database_Connection()
  81. {
  82.     mysql_log(ALL); //Let's log everything that happens when we load actors, to find bugs/errors.
  83.  
  84.     g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
  85.    
  86.     if (mysql_errno(g_SQL) != 0) return 0;
  87.  
  88.     mysql_tquery(g_SQL, "SELECT * FROM `actors`", "Load_Dynamic_Actors"); //Loading actors from database.
  89.     return 1;
  90. }
  91. /* ------------------------------------- */
  92.  
  93. /* ---- Stocks ---- */
  94. stock SendClientMessageEx(playerid, color, const str[], {Float,_}:...)
  95. {
  96.     static args, start, end,string[200];
  97.     #emit LOAD.S.pri 8
  98.     #emit STOR.pri args
  99.  
  100.     if (args > 12)
  101.     {
  102.         #emit ADDR.pri str
  103.         #emit STOR.pri start
  104.  
  105.         for (end = start + (args - 12); end > start; end -= 4)
  106.         {
  107.             #emit LREF.pri end
  108.             #emit PUSH.pri
  109.         }
  110.         #emit PUSH.S str
  111.         #emit PUSH.C 156
  112.         #emit PUSH.C string
  113.         #emit PUSH.C args
  114.         #emit SYSREQ.C format
  115.  
  116.         SendClientMessage(playerid, color, string);
  117.  
  118.         #emit LCTRL 5
  119.         #emit SCTRL 4
  120.         #emit RETN
  121.     }
  122.     return SendClientMessage(playerid, color, str);
  123. } // Credits to Emmet
  124. /* ---------------- */
  125.  
  126. public OnFilterScriptInit()
  127. {
  128.     if (Database_Connection() == 0)
  129.     {
  130.         printf("Couldn't connect to MySQL database.");
  131.         return 0;
  132.     }
  133.     return 1;
  134. }
  135.  
  136. public OnFilterScriptExit()
  137. {
  138.     mysql_close(g_SQL);
  139.     return 1;
  140. }
  141.  
  142. /* ---- Dynamic Actors Functions ---- */
  143. function SetPlayerCheckpointEx(playerid, Float:x, Float:y, Float:z, Float:size)
  144. {
  145.     SetPlayerCheckpoint(playerid, x, y, z, size);
  146.     CheckpointPos[playerid][0] = x;
  147.     CheckpointPos[playerid][1] = y;
  148.     CheckpointPos[playerid][2] = z;
  149.     return 1;
  150. }
  151.  
  152. function OnActorCreated(dynamicactorid)
  153. {
  154.     if (dynamicactorid == -1 || !Dynamic_Actor_Data[dynamicactorid][dynamicActorExists])
  155.         return 0;
  156.  
  157.     Dynamic_Actor_Data[dynamicactorid][dynamicActorID] = cache_insert_id();
  158.  
  159.     Save_Dynamic_Actor(dynamicactorid);
  160.     return 1;
  161. }
  162.  
  163. function Load_Dynamic_Actors()
  164. {
  165.     for(new i, j = cache_num_rows(); i != j; i++)
  166.     {
  167.         if(i < MAX_DYNAMIC_ACTORS)
  168.         {
  169.                 Dynamic_Actor_Data[i][dynamicActorExists] = true;
  170.                 cache_get_value_int(i,"dynamicActorID",Dynamic_Actor_Data[i][dynamicActorID]);
  171.                 cache_get_value_float(i, "dynamicActorX",Dynamic_Actor_Data[i][dynamicActorPos][0]);
  172.                 cache_get_value_float(i, "dynamicActorY",Dynamic_Actor_Data[i][dynamicActorPos][1]);
  173.                 cache_get_value_float(i, "dynamicActorZ",Dynamic_Actor_Data[i][dynamicActorPos][2]);
  174.                 cache_get_value_float(i, "dynamicActorA",Dynamic_Actor_Data[i][dynamicActorPos][3]);
  175.                 cache_get_value_int(i,"dynamicActorVW",Dynamic_Actor_Data[i][dynamicActorVW]);
  176.                 cache_get_value_int(i,"dynamicActorSkin",Dynamic_Actor_Data[i][dynamicActorSkin]);
  177.                 Refresh_Dynamic_Actor(i);
  178.         }
  179.     }
  180.     return 1;
  181. }
  182. /* ---------------------------------- */
  183.  
  184. /* ---- Dynamic Actor Stocks ---- */
  185. stock Create_Dynamic_Actor(playerid, skin)
  186. {
  187.     for (new i = 0; i != MAX_DYNAMIC_ACTORS; i ++) if (!Dynamic_Actor_Data[i][dynamicActorExists])
  188.     {
  189.         Dynamic_Actor_Data[i][dynamicActorExists] = true;
  190.        
  191.         Dynamic_Actor_Data[i][dynamicActorSkin] = skin;
  192.  
  193.         GetPlayerPos(playerid, Dynamic_Actor_Data[i][dynamicActorPos][0], Dynamic_Actor_Data[i][dynamicActorPos][1], Dynamic_Actor_Data[i][dynamicActorPos][2]);
  194.         GetPlayerFacingAngle(playerid, Dynamic_Actor_Data[i][dynamicActorPos][3]);
  195.  
  196.         Dynamic_Actor_Data[i][dynamicActorPos][0] = Dynamic_Actor_Data[i][dynamicActorPos][0] + (1.5 * floatsin(-Dynamic_Actor_Data[i][dynamicActorPos][3], degrees));
  197.         Dynamic_Actor_Data[i][dynamicActorPos][1] = Dynamic_Actor_Data[i][dynamicActorPos][1] + (1.5 * floatcos(-Dynamic_Actor_Data[i][dynamicActorPos][3], degrees));
  198.  
  199.         Dynamic_Actor_Data[i][dynamicActorVW] = GetPlayerVirtualWorld(playerid);
  200.        
  201.         Refresh_Dynamic_Actor(i);
  202.        
  203.         mysql_tquery(g_SQL, "INSERT INTO `actors` (`dynamicActorSkin`) VALUES(0)", "OnActorCreated", "d", i);
  204.         return i;
  205.     }
  206.     return -1;
  207. }
  208.  
  209. stock Remove_Dynamic_Actor(dynamicactorid)
  210. {
  211.     if (dynamicactorid != -1 && Dynamic_Actor_Data[dynamicactorid][dynamicActorExists])
  212.     {
  213.         DestroyActor(dynamicactorid);
  214.        
  215.         new string[80];
  216.  
  217.         format(string, sizeof(string), "DELETE FROM `actors` WHERE `dynamicActorID` = '%d'", Dynamic_Actor_Data[dynamicactorid][dynamicActorID]);
  218.         mysql_tquery(g_SQL, string);
  219.  
  220.         if (IsValidDynamic3DTextLabel(Dynamic_Actor_Data[dynamicactorid][dynamicActorLabel])) DestroyDynamic3DTextLabel(Dynamic_Actor_Data[dynamicactorid][dynamicActorLabel]);
  221.  
  222.         Dynamic_Actor_Data[dynamicactorid][dynamicActorExists] = false;
  223.         Dynamic_Actor_Data[dynamicactorid][dynamicActorID] = 0;
  224.     }
  225.     return 1;
  226. }
  227.  
  228. stock Refresh_Dynamic_Actor(dynamicactorid)
  229. {
  230.     if (dynamicactorid != -1 && Dynamic_Actor_Data[dynamicactorid][dynamicActorExists])
  231.     {
  232.         if (IsValidDynamic3DTextLabel(Dynamic_Actor_Data[dynamicactorid][dynamicActorLabel])) DestroyDynamic3DTextLabel(Dynamic_Actor_Data[dynamicactorid][dynamicActorLabel]);
  233.  
  234.         new string[80];
  235.  
  236.         format(string, sizeof(string), "[Actor ID: %d]\nPress ~k~~VEHICLE_ENTER_EXIT~ to interact.", dynamicactorid);
  237.        
  238.         Dynamic_Actor_Data[dynamicactorid][dynamicActorLabel] = CreateDynamic3DTextLabel(string, -1, Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][0], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][1], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][2], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, Dynamic_Actor_Data[dynamicactorid][dynamicActorVW]);
  239.  
  240.         Dynamic_Actor_Data[dynamicactorid][dynamicActorID] = CreateActor(Dynamic_Actor_Data[dynamicactorid][dynamicActorSkin], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][0], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][1], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][2], Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][3]);
  241.  
  242.         SetActorVirtualWorld(Dynamic_Actor_Data[dynamicactorid][dynamicActorID], Dynamic_Actor_Data[dynamicactorid][dynamicActorVW]);
  243.  
  244.     }
  245.     return 1;
  246. }
  247.  
  248. stock Save_Dynamic_Actor(dynamicactorid)
  249. {
  250.     new query[300];
  251.  
  252.     format(query, sizeof(query), "UPDATE `actors` SET `dynamicActorX` = '%.4f', `dynamicActorY` = '%.4f', `dynamicActorZ` = '%.4f', `dynamicActorA` = '%.4f', `dynamicActorVW` = '%d', `dynamicActorSkin` = '%d' WHERE `dynamicActorID` = '%d'",
  253.         Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][0],
  254.         Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][1],
  255.         Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][2],
  256.         Dynamic_Actor_Data[dynamicactorid][dynamicActorPos][3],
  257.         Dynamic_Actor_Data[dynamicactorid][dynamicActorVW],
  258.         Dynamic_Actor_Data[dynamicactorid][dynamicActorSkin],
  259.         Dynamic_Actor_Data[dynamicactorid][dynamicActorID]
  260.     );
  261.     return mysql_tquery(g_SQL, query);
  262. }
  263. /* ------------------------------ */
  264.  
  265. public OnPlayerEnterCheckpoint(playerid)
  266. {
  267.     DisablePlayerCheckpoint(playerid);
  268.     return 1;
  269. }
  270.  
  271. Get_Nearest_Dynamic_Actor(playerid)
  272. {
  273.     new Float:fDistance[2] = {MAX_ACTORS_RANGE, 0.0}, iIndex = -1;
  274.     for (new i = 0; i < MAX_DYNAMIC_ACTORS; i ++) if (Dynamic_Actor_Data[i][dynamicActorExists] && GetPlayerVirtualWorld(playerid) == Dynamic_Actor_Data[i][dynamicActorVW])
  275.     {
  276.         fDistance[1] = GetPlayerDistanceFromPoint(playerid, Dynamic_Actor_Data[i][dynamicActorPos][0], Dynamic_Actor_Data[i][dynamicActorPos][1], Dynamic_Actor_Data[i][dynamicActorPos][2]);
  277.  
  278.         if (fDistance[1] < fDistance[0])
  279.         {
  280.             fDistance[0] = fDistance[1];
  281.             iIndex = i;
  282.         }
  283.     }
  284.     return iIndex;
  285. }
  286.  
  287. /* ---- Admin Commands ---- */
  288. CMD:actorhelp(playerid, params[])
  289. {
  290.     if(!IsPlayerAdmin(playerid)) return 0;
  291.    
  292.     SendClientMessage(playerid, -1, "[ ---- Dynamic Actor Commands ---- ]");
  293.    
  294.     SendClientMessage(playerid, COLOR_AQUA, "/createactor [skin id] - Creates an actor at your position with the skin set.");
  295.     SendClientMessage(playerid, COLOR_AQUA, "/removeactor [actor id] - Removes an actor from the database.");
  296.     SendClientMessage(playerid, COLOR_AQUA, "/removeallactors - Removes all created actors from the database.");
  297.     SendClientMessage(playerid, COLOR_AQUA, "/locatenearactors - Locates all actors in a range defined with MAX_ACTORS_RANGE.");
  298.    
  299.     SendClientMessage(playerid, -1, "[ --------------------------------------------- ]");
  300.     return 1;
  301. }
  302.  
  303. CMD:createactor(playerid, params[])
  304. {
  305.     if(!IsPlayerAdmin(playerid)) return 0;
  306.    
  307.     static id = -1, skin;
  308.    
  309.     if(sscanf(params, "d", skin)) return SendClientMessage(playerid, COLOR_AQUA, "* [USAGE]: /createactor [skin id]");
  310.  
  311.     if(skin < 0 || skin > 311) return SendClientMessage(playerid, -1, "* Invalid skin ID (1-311)");
  312.    
  313.     id = Create_Dynamic_Actor(playerid, skin);
  314.  
  315.     if (id == -1) return SendClientMessage(playerid, COLOR_AQUA, "* The server has reached the limit for dynamic actors.");
  316.  
  317.     SCMEX(playerid, -1, "* You have successfully created an actor. ID: %d - Skin: %d", id, skin);
  318.     return 1;
  319. }
  320.  
  321. CMD:removeactor(playerid, params[])
  322. {
  323.     if(!IsPlayerAdmin(playerid)) return 0;
  324.    
  325.     static id = 0;
  326.  
  327.     if (sscanf(params, "d", id)) return SendClientMessage(playerid, COLOR_AQUA, "* [USAGE]: /removeactor [actor id]");
  328.  
  329.     if ((id < 0 || id >= MAX_DYNAMIC_ACTORS) || !Dynamic_Actor_Data[id][dynamicActorExists]) return SendClientMessage(playerid, COLOR_AQUA, "* You have specified an invalid actor ID.");
  330.  
  331.     Remove_Dynamic_Actor(id);
  332.  
  333.     SCMEX(playerid, -1, "* You have successfully destroyed actor ID: %d.", id);
  334.     return 1;
  335. }
  336.  
  337. CMD:removeallactors(playerid)
  338. {
  339.     for (new i = 0; i != MAX_DYNAMIC_ACTORS; i ++) if (Dynamic_Actor_Data[i][dynamicActorExists]) Remove_Dynamic_Actor(i);
  340.    
  341.     SendClientMessage(playerid, COLOR_AQUA, "* All actors have been removed from database.");
  342.     return 1;
  343. }
  344.  
  345. CMD:locatenearactors(playerid, params[])
  346. {
  347.     if(!IsPlayerAdmin(playerid)) return 0;
  348.    
  349.     new id = Get_Nearest_Dynamic_Actor(playerid);
  350.  
  351.     if (id == -1) return SendClientMessage(playerid, -1, "* There are no actors near you.");
  352.  
  353.     SetPlayerCheckpointEx(playerid, Dynamic_Actor_Data[id][dynamicActorPos][0], Dynamic_Actor_Data[id][dynamicActorPos][1], Dynamic_Actor_Data[id][dynamicActorPos][2], 2.5);
  354.  
  355.     new Float: fDistance = GetPlayerDistanceFromPoint(playerid, CheckpointPos[playerid][0], CheckpointPos[playerid][1], CheckpointPos[playerid][2]);
  356.    
  357.     SCMEX(playerid, -1, "* Marker set to nearest actor. Distance: %0.1fm", fDistance);
  358.     return 1;
  359. }
  360. /* ------------------------ */
Add Comment
Please, Sign In to add comment