CaptainB

Dynamic MySQL Object System

Sep 8th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.13 KB | None | 0 0
  1. /*
  2.  *    'Scripter: CaptainBoi'
  3.   *   'Version: 1.0'
  4.  *    'Released: 08-09-2018'
  5.   *
  6.  */
  7.  
  8. /* Includes */
  9. #include <a_samp>
  10. #include <a_mysql>
  11. #include <streamer>
  12. #include <sscanf2>
  13. #include <zcmd>
  14.  
  15. /* MySQL Entities */
  16. #define MYSQL_HOST  ""
  17. #define MYSQL_USER  ""
  18. #define MYSQL_PASS  ""
  19. #define MYSQL_DB    ""
  20.  
  21. /* DB Name */
  22. new MySQL: ObjectsDB;
  23.  
  24. /* Enumerator */
  25. enum objectinfo
  26. {
  27.  O_TAKEN,
  28.  O_MODEL,
  29.  Text3D:O_TEXTID,
  30.  O_ID,
  31.  Float:O_X,
  32.  Float:O_Y,
  33.  Float:O_Z,
  34.  Float:O_A,
  35.  O_INT,
  36.  O_VW
  37. }
  38.  
  39. new oInfo[MAX_OBJECTS][objectinfo];
  40. new EditingObject[MAX_PLAYERS];
  41. new gObjCount= 0;
  42.  
  43. /* Format Message With String */
  44. new string2[100], bool:False = false;
  45. #define format2(%0,%1,%2,%3) do{ format(string2, sizeof (string2), (%2), %3); SendClientMessage((%0),(%1), string2); } while (False)
  46.  
  47. public OnFilterScriptInit()
  48. {
  49.     print("\n--------------------------------------");
  50.     print(" Dynamic Object System By CaptainBoi");
  51.     print("--------------------------------------\n");
  52.     new MySQLOpt: option_id = mysql_init_options();
  53.     mysql_set_option(option_id, AUTO_RECONNECT, true);  
  54.     ObjectsDB = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB, option_id);
  55.     if(ObjectsDB == MYSQL_INVALID_HANDLE || mysql_errno(ObjectsDB) != 0)
  56.     {
  57.         print("Cannot connect to mysql database");
  58.  
  59.         SendRconCommand("exit");
  60.         return 1;
  61.     }
  62.     else print("Connected to mysql database.");
  63.     /* Objects Database */
  64.     mysql_query(ObjectsDB, "CREATE TABLE IF NOT EXISTS `objects` (\
  65.     `ID` INT, \
  66.     `Model` INT(10), \
  67.     `Taken` INT, \
  68.     `X` FLOAT DEFAULT 0, \
  69.     `Y` FLOAT DEFAULT 0, \
  70.     `Z` FLOAT DEFAULT 0, \
  71.     `Angle` FLOAT DEFAULT 0, \
  72.     `Interior` INT, \
  73.     `VirtualWorld` INT)");
  74.     mysql_tquery(ObjectsDB, "SELECT * FROM `objects`", "LoadDynamicObjects", "");
  75.     LoadDynamicObjects();
  76.     return 1;
  77. }
  78.  
  79. public OnFilterScriptExit()
  80. {  
  81.     SaveDynamicObjects();
  82.     mysql_close(ObjectsDB);  
  83.     return 1;
  84. }
  85.  
  86. public OnPlayerConnect(playerid)
  87. {
  88.     EditingObject[playerid] = -1;
  89.     return 1;
  90. }
  91.  
  92. public OnPlayerDisconnect(playerid, reason)
  93. {
  94.     EditingObject[playerid] = -1;
  95.     return 1;
  96. }
  97.  
  98. /* Commands */
  99. CMD:createobject(playerid, params[])
  100. {
  101.     new id = GetNextObjectID(), modelid;
  102.     if(sscanf(params, "d", modelid)) return SendClientMessage(playerid, -1, "USAGE: /createobject [modelid]");
  103.     GetPlayerPos(playerid, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z]);
  104.     GetPlayerFacingAngle(playerid, oInfo[id][O_A]);
  105.     GetXYInFrontOfPlayer(playerid, oInfo[id][O_X], oInfo[id][O_Y], 2.0);
  106.    
  107.     oInfo[id][O_TAKEN] = 1;
  108.     oInfo[id][O_MODEL] = modelid;
  109.     oInfo[id][O_INT] = GetPlayerInterior(playerid);
  110.     oInfo[id][O_VW] = GetPlayerVirtualWorld(playerid);
  111.     oInfo[id][O_A] += 90;
  112.    
  113.     SendClientMessage(playerid, 0xFFFF00FF, "You have created an Object.");
  114.    
  115.     new TEXTLABEL[16];
  116.     format(TEXTLABEL, sizeof(TEXTLABEL), "Object\nID: %d", id);
  117.     gObjCount++;
  118.     oInfo[id][O_TEXTID] = CreateDynamic3DTextLabel(TEXTLABEL, 0x1D9F00AA, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z]+1.5, 5.0, _, _, _, oInfo[id][O_VW], oInfo[id][O_INT], _, _);
  119.     oInfo[id][O_ID] = CreateDynamicObject(modelid, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z], 0.0, 0.0, oInfo[id][O_A], oInfo[id][O_VW], oInfo[id][O_INT], _, _);
  120.     SaveDynamicObjects();
  121.     return 1;
  122. }
  123.  
  124. CMD:deleteobject(playerid, params[])
  125. {
  126.     new id, query[200];
  127.     if(sscanf(params, "d", id)) return SendClientMessage(playerid, -1, "USAGE: /deleteobject [id]");
  128.     DestroyDynamic3DTextLabel(oInfo[id][O_TEXTID]);
  129.     DestroyDynamicObject(oInfo[id][O_ID]);
  130.     oInfo[id][O_TAKEN] = 0;
  131.     oInfo[id][O_X] = 0.0;
  132.     oInfo[id][O_Y] = 0.0;
  133.     oInfo[id][O_Z] = 0.0;
  134.     oInfo[id][O_A] = 0;
  135.     mysql_format(ObjectsDB,query,sizeof(query),"SELECT `ID` FROM `objects` WHERE `ID` = '%d'",id);
  136.     mysql_query(ObjectsDB, query);
  137.     new rows;
  138.     cache_get_row_count(rows);
  139.     if(rows != 0)
  140.     {  
  141.         mysql_format(ObjectsDB, query, sizeof(query), "DELETE FROM `objects` WHERE (`ID` = '%d')", id);
  142.         mysql_query(ObjectsDB, query);
  143.         format2(playerid, -1, "Object: %d has been removed", id);
  144.         return 1;  
  145.     }
  146.     else
  147.     {
  148.         format2(playerid, -1, "Object: %d does not exist.", id);
  149.     }
  150.     return 1;
  151. }
  152.  
  153. CMD:editobject(playerid, params[])
  154. {  
  155.     if(!gObjCount) {
  156.         return SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: No Objects have been created.");
  157.     }
  158.     new object;
  159.     if(sscanf(params, "d", object)) return SendClientMessage(playerid, -1, "USAGE: /editobject [id]");
  160.     DestroyDynamic3DTextLabel(oInfo[object][O_TEXTID]);
  161.     EditDynamicObject(playerid, oInfo[object][O_ID]);
  162.     EditingObject[playerid] = object;
  163.     return 1;
  164. }
  165.  
  166. /* Stocks */
  167. GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
  168. {
  169.     new Float:a;
  170.     GetPlayerPos(playerid, x, y, a);
  171.     if (IsPlayerInAnyVehicle(playerid))
  172.         GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  173.     else
  174.         GetPlayerFacingAngle(playerid, a);
  175.     x += (distance * floatsin(-a, degrees));
  176.     y += (distance * floatcos(-a, degrees));
  177. }
  178.  
  179. GetNextObjectID()
  180. {
  181.     new i=0;
  182.     while(i != MAX_OBJECTS) {
  183.         if(oInfo[i][O_TAKEN] == 0) {
  184.             return i;
  185.         }
  186.         i++;
  187.     }
  188.     return -1;
  189. }
  190.  
  191. /* Forwards & Publics */
  192. forward SaveDynamicObjects();
  193. public SaveDynamicObjects()
  194. {
  195.     new szQuery[270], ID, time = GetTickCount(), objcount;
  196.     for(new i=0; i<MAX_OBJECTS; i++)
  197.     {
  198.         if(oInfo[i][O_TAKEN] == 1)
  199.         {
  200.             objcount++;
  201.             mysql_format(ObjectsDB, szQuery, sizeof(szQuery), "INSERT INTO `objects` (`ID`, `Taken`) VALUES ('%d', '1')", ID);
  202.             mysql_tquery(ObjectsDB, szQuery, "", "");
  203.             mysql_format(ObjectsDB, szQuery, sizeof(szQuery), "UPDATE `objects` SET `Model` = '%d', `X` = '%f', `Y` = '%f', `Z` = '%f', `Angle` = '%f', `Interior` = '%d', `VirtualWorld` = '%d'  WHERE `ID` = %d", oInfo[i][O_MODEL], oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z], oInfo[i][O_A], oInfo[i][O_INT], oInfo[i][O_VW], ID);
  204.             mysql_tquery(ObjectsDB, szQuery,"","");  
  205.             ID++;
  206.         }
  207.     }
  208.     printf("%d Dynamic Objects saved in %dms.", objcount, GetTickCount()-time);
  209.     return 1;
  210. }
  211.  
  212. forward LoadDynamicObjects();
  213. public LoadDynamicObjects()
  214. {
  215.     new time = GetTickCount();
  216.     new rows;
  217.     cache_get_row_count(rows);
  218.     if(rows)
  219.     {
  220.         new i = 0;
  221.         while(i < rows)
  222.         {
  223.             cache_get_value_name_int(i, "Model", oInfo[i][O_MODEL]);
  224.             cache_get_value_name_float(i, "X", oInfo[i][O_X]);
  225.             cache_get_value_name_float(i, "Y", oInfo[i][O_Y]);
  226.             cache_get_value_name_float(i, "Z", oInfo[i][O_Z]);
  227.             cache_get_value_name_float(i, "Angle", oInfo[i][O_A]);
  228.             cache_get_value_name_int(i, "Interior", oInfo[i][O_INT]);
  229.             cache_get_value_name_int(i, "VirtualWorld", oInfo[i][O_VW]);
  230.             new TEXTLABEL[16];
  231.             format(TEXTLABEL, sizeof(TEXTLABEL), "Object\nID: %d", i);
  232.             oInfo[i][O_TEXTID] = CreateDynamic3DTextLabel(TEXTLABEL, 0x1D9F00AA, oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z]+1.5, 5.0, _, _, _, oInfo[i][O_VW], oInfo[i][O_INT], _, _);
  233.             oInfo[i][O_ID] = CreateDynamicObject(oInfo[i][O_MODEL], oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z], 0.0, 0.0, oInfo[i][O_A], oInfo[i][O_VW], oInfo[i][O_INT], _, _);
  234.             gObjCount++;
  235.             i++;
  236.         }
  237.         printf("%d Dynamic Objects loaded in %dms.", rows, GetTickCount()-time);
  238.     }
  239.     return 1;
  240. }
Add Comment
Please, Sign In to add comment