Guest User

Theory's Bus System 2

a guest
May 1st, 2013
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.40 KB | None | 0 0
  1. /* Code by Theory (aka Skyrise) */
  2.  
  3. #include <a_samp>
  4.     #include <zcmd>
  5.     #include <a_mysql>
  6.     #include <streamer>
  7.     #include <sscanf2>
  8.     #include <foreach>
  9.  
  10. /* Defines - Theory */
  11.  
  12. #define fScript "Theory's Bus System"
  13. #define fVersion "v0.3"
  14.  
  15. /***** REQUIRED *******/
  16. #define SQL_SERVER ""
  17. #define SQL_USER ""
  18. #define SQL_DATABASE ""
  19. #define SQL_PASSWORD ""
  20. /**********************/
  21.  
  22. #define MAX_STRING (1024)
  23. #define MAX_POINTS (20) /* Can be adjusted */
  24.  
  25. /* Enumerators/Other - Theory */
  26.  
  27. enum sInfo {
  28.     sDriver,
  29.     bAdmin
  30. }
  31. new sPlayerInfo[MAX_PLAYERS][sInfo];
  32.  
  33. enum bInfo {
  34.     bid,
  35.     Float:bX,
  36.     Float:bY,
  37.     Float:bZ,
  38.     bTaken,
  39.     bDisabled
  40. }
  41. new BusInfo[MAX_POINTS][bInfo];
  42.  
  43. new SQLHandle;
  44. new onCall[MAX_PLAYERS];
  45. new hasCall[MAX_PLAYERS];
  46. new bDuty[MAX_PLAYERS];
  47.  
  48. /* Public Methods */
  49. public OnFilterScriptInit()
  50. {
  51.     SQLHandle = mysql_connect(SQL_SERVER, SQL_USER, SQL_DATABASE, SQL_PASSWORD);
  52.     new ping = mysql_ping(SQLHandle);
  53.     if(ping != -1) {
  54.         printf("* Connection to "#SQL_SERVER" successful with %d ping", ping);
  55.     }
  56.     else {
  57.         printf("* Connection to "#SQL_SERVER" has failed.");
  58.     }
  59.     Bus_LoadStops();
  60.     print("* Loading Stops...");
  61.     return 1;
  62. }
  63.  
  64. public OnFilterScriptExit()
  65. {
  66.     return 1;
  67. }
  68.  
  69. public OnPlayerConnect(playerid)
  70. {
  71.     SendClientMessage(playerid, -1, "This server is using "#fScript", "#fVersion".");
  72.     hasCall[playerid] = 0;
  73.     onCall[playerid] = 0;
  74.     bDuty[playerid] = 0;
  75.     return 1;
  76. }
  77.  
  78. public OnPlayerDisconnect(playerid, reason)
  79. {
  80.     SaveDriver(playerid);
  81.     return 1;
  82. }
  83.  
  84. public OnPlayerSpawn(playerid)
  85. {
  86.     Load_Driver(playerid);
  87.     return 1;
  88. }
  89.  
  90. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  91. {
  92.     return 1;
  93. }
  94.  
  95. public OnPlayerExitVehicle(playerid, vehicleid)
  96. {
  97.     return 1;
  98. }
  99.  
  100. public OnPlayerEnterCheckpoint(playerid)
  101. {
  102.     if(isDriver(playerid)) {
  103.         DisablePlayerCheckpoint(playerid);
  104.         SCME(playerid, -1, "You have arrived.");
  105.     }
  106.     return 1;
  107. }
  108.  
  109. public OnPlayerLeaveCheckpoint(playerid)
  110. {
  111.     return 1;
  112. }
  113.  
  114. public OnPlayerUpdate(playerid)
  115. {
  116.     return 1;
  117. }
  118.  
  119. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  120. {
  121.     return 1;
  122. }
  123.  
  124. /* Commands - Theory */
  125.  
  126. CMD:ami(playerid, params[])
  127. {
  128.     if(isDriver(playerid)) {
  129.         SCME(playerid, -1, "You are an authorized bus driver.");
  130.     }
  131.     else {
  132.         return SendClientMessage(playerid, -1, "You are not a bus driver.");
  133.     }
  134.     return 1;
  135. }
  136.  
  137. CMD:bduty(playerid, params[])
  138. {
  139.     return 1;
  140. }
  141.  
  142. CMD:bcall(playerid, params[])
  143. {
  144.     for(new i; i < MAX_POINTS; i++) {
  145.         if(IsPlayerInRangeOfPoint(playerid, 10.0, BusInfo[i][bX], BusInfo[i][bY], BusInfo[i][bZ]) && BusInfo[i][bDisabled] == 0) {
  146.             bCall(playerid);
  147.             hasCall[playerid] = 1;
  148.             SCME(playerid, -1, "You have called the bus. Please wait.");
  149.             return 1;
  150.         }
  151.         else {
  152.             return SCME(playerid, -1, "You are not near a bus point!");
  153.         }
  154.     }
  155.     return 1;
  156. }
  157.  
  158. CMD:bcancel(playerid, params[])
  159. {
  160.     if(isDriver(playerid)) {
  161.         onCall[playerid] = 0;
  162.         foreach(Player, i) {
  163.             SCME(i, -1, "** %s is no longer on duty as a bus driver.",gName(playerid));
  164.         }
  165.         DisablePlayerCheckpoint(playerid);
  166.     }
  167.     else {
  168.         hasCall[playerid] = 0;
  169.         SCME(playerid, -1, "You are no longer requesting a bus.");
  170.         foreach(Player, i) {
  171.             if(isDriver(i)) {
  172.                 SCME(playerid, -1, "** %s is no longer requesting a bus. (/resetmarker if you responded to their call.)",gName(playerid));
  173.             }
  174.         }
  175.     }
  176.     return 1;
  177. }
  178.  
  179. CMD:bnear(playerid, params[])
  180. {
  181.     new r;
  182.     new id[MAX_POINTS];
  183.     for(new i; i < MAX_POINTS; i++) {
  184.         if(IsPlayerInRangeOfPoint(playerid, 20.0, BusInfo[i][bX], BusInfo[i][bY], BusInfo[i][bZ])) {
  185.             r++;
  186.             SCME(playerid, -1, "Point ID: %d",id[i]);
  187.         }
  188.     }
  189.     SCME(playerid, -1, "You are near %d points with a range of 20.0.", r);
  190. }
  191.  
  192. CMD:givebmod(playerid, params[])
  193. {
  194.     new giveplayerid, number;
  195.     if(IsPlayerAdmin(playerid)) {
  196.         if(sscanf(params,"ud",giveplayerid,number)) return SCME(playerid, -1, "Usage: /givebmod [player] [0 or 1]");
  197.         if(number > 1 || number < 0) return SCME(playerid, -1, "Usage: /givebmod [player] [0 or 1]");
  198.         sPlayerInfo[giveplayerid][bAdmin] = number;
  199.     }
  200.     else {
  201.         SCME(playerid, -1, "You are not authorized to use this command.");
  202.     }
  203.     return 1;
  204. }
  205.  
  206. CMD:makedriver(playerid, params[])
  207. {
  208.     new giveplayerid, number;
  209.     if(IsPlayerAdmin(playerid)) {
  210.         if(sscanf(params,"ud",giveplayerid,number)) return SCME(playerid, -1, "Usage: /makedriver [player] [0 or 1]");
  211.         if(number > 1 || number < 0) return SCME(playerid, -1, "Usage: /makedriver [player] [0 or 1]");
  212.         sPlayerInfo[giveplayerid][sDriver] = number;
  213.     }
  214.     else {
  215.         SCME(playerid, -1, "You are not authorized to use this command.");
  216.     }
  217.     return 1;
  218. }
  219.  
  220. CMD:bmods(playerid, params[])
  221. {
  222.     foreach(Player, bmod) {
  223.         if(sPlayerInfo[bmod][bAdmin] == 1) {
  224.             SCME(playerid, -1, "%s is assigned as a bMod.",gName(bmod));
  225.         }
  226.     }
  227.     return 1;
  228. }
  229.  
  230. CMD:acceptcall(playerid, params[])
  231. {
  232.     new giveplayerid;
  233.     new Float:X, Float:Y, Float:Z;
  234.     if(isDriver(playerid)) {
  235.         if(onCall[playerid] == 1) {
  236.             return SCME(playerid, -1, "Perhaps you should pick up the other player first?");
  237.         }
  238.         if(sscanf(params, "u",giveplayerid)) return SCME(playerid,-1, "Usage: /acceptcall [player]");
  239.         if(hasCall[giveplayerid] == 1) {
  240.             GetPlayerPos(giveplayerid, X, Y, Z);
  241.             SetPlayerCheckpoint(playerid, X, Y, Z, 5);
  242.             SCME(playerid, -1, "You have accepted %s's call.",gName(giveplayerid));
  243.             SCME(playerid, -1, "%s has accepted your call for a bus.",gName(playerid));
  244.             foreach(Player, i) {
  245.                 if(isDriver(i)) {
  246.                     SCME(i, -1, "** %s has accepted the bus call from %s.",gName(playerid),gName(giveplayerid));
  247.                 }
  248.             }
  249.         }
  250.         else {
  251.             SCME(playerid, -1, "That person has not called for a bus!");
  252.         }
  253.     }
  254.     else {
  255.         return SCME(playerid, -1, "You are not a bus driver.");
  256.     }
  257.     return 1;
  258. }
  259.  
  260. CMD:resetmarker(playerid, params[])
  261. {
  262.     DisablePlayerCheckpoint(playerid);
  263.     SCME(playerid, -1, "Checkpoint reset.");
  264.     return 1;
  265. }
  266.  
  267. CMD:bchanges(playerid, params[])
  268. {// got lazy, didn't finish. (GL;DF)
  269.     Feature(playerid, 1, "/makedriver command.");
  270.     Feature(playerid, 1, "/bcancel command.");
  271.     Feature(playerid, 1, "/bcall command.");
  272.     Feature(playerid, 1, "/acceptcall command.");
  273.     Feature(playerid, 1, "/br(adio) command.");
  274.     Feature(playerid, 1, "/givebmod command.");
  275.     Feature(playerid, 1, "/bmods command.");
  276.     Feature(playerid, 1, "/bnear command.");
  277.     Feature(playerid, 1, "Added MySQL Structure.");
  278.     Feature(playerid, 1, "Concept to Code.");
  279.     Feature(playerid, 1, "Commands Structure.");
  280.     Feature(playerid, 1, "Player enumerators.");
  281.     Feature(playerid, 3, "Stock methods moved to bFunc.");
  282.     return 1;
  283. }
  284.  
  285. CMD:br(playerid, params[]) { return cmd_bradio(playerid, params); }
  286. CMD:bradio(playerid, params[])
  287. {
  288.     if(isDriver(playerid)) {
  289.         if(isnull(params)) return SCME(playerid, -1, "Usage: /br(adio) [message]");
  290.         foreach(Player, i) {
  291.             if(isDriver(i)) {
  292.                 SCME(i, 0x4682B4FF, params);
  293.             }
  294.         }
  295.     }
  296.     else {
  297.         return SCME(playerid, -1, "You need to be a bus driver to use this.");
  298.     }
  299.     return 1;
  300. }
  301.  
  302. CMD:addbuspoint(playerid, params[])
  303. {
  304.     if(sPlayerInfo[playerid][bAdmin] != 1) {
  305.         return 1;
  306.     }
  307.     new Float:x, Float:y, Float:z;
  308.     GetPlayerPos(playerid, x,y,z);
  309.     AddBusPoint(x, y, z);
  310.     return 1;
  311. }
  312.  
  313. /* Stock Functions */
  314. new megastr[512];
  315. stock Feature(playerid,nid,text[])
  316. {
  317.     new nidform[128];
  318.     if(nid == 1) {
  319.         format(nidform,sizeof(nidform), "* {00FF00}Added{FFFFFF} %s",text);
  320.         SCME(playerid, -1, nidform);
  321.     }
  322.     if(nid == 2) {
  323.         format(nidform,sizeof(nidform), "* {FF0000}Removed{FFFFFF} %s",text);
  324.         SCME(playerid, -1, nidform);
  325.     }
  326.     if(nid == 3) {
  327.         format(nidform,sizeof(nidform), "* {FFFF00}Adjusted{FFFFFF} %s",text);
  328.         SCME(playerid, -1, nidform);
  329.     }
  330.     if(nid == 4) {
  331.         format(nidform,sizeof(nidform), "* {00FF00}FIXED{FFFFFF} %s",text);
  332.         SCME(playerid, -1, nidform);
  333.     }
  334.     if(nid == 5) {
  335.         format(nidform,sizeof(nidform), "* {00FF00}Re-Added{FFFFFF} %s",text);
  336.         SCME(playerid, -1, nidform);
  337.     }
  338.     return 1;
  339. }
  340.  
  341. stock SCME(playerid, color, const string[], { Float, _ }: ...) // SCME(playerid, CL, "%d", number);
  342. {
  343.     new
  344.         tempString[MAX_STRING],
  345.         parts[64],
  346.         tempLen,
  347.         totalFound,
  348.         i,
  349.         j,
  350.         t;
  351.     memcpy(tempString, string, _, (strlen(string) + 1) * 4);
  352.     for(i = 0; tempString[i] != 0; ++i)
  353.     {
  354.         for(j = 0; parts[j] != 0; ++j)
  355.         {
  356.             parts[j] = '\0';
  357.         }
  358.         switch(tempString[i])
  359.         {
  360.             case 's', 'S', 'i', 'I', 'd', 'D', 'f', 'F', 'c', 'C', 'x', 'X', 'b', 'B':
  361.             {
  362.                 if(tempString[(i > 0) ? (i - 1) : (i)] != '%')
  363.                 {
  364.                     continue;
  365.                 }
  366.                 else if(tempString[(i > 0) ? (i - 1) : (i)] == '%')
  367.                 {
  368.                     ++totalFound;
  369.  
  370.                     if(tempString[i] == 's' || tempString[i] == 'S')
  371.                     {
  372.                         for(j = 0; getarg(totalFound + 2, j) != 0; ++j)
  373.                         {
  374.                             parts[j] = getarg(totalFound + 2, j);
  375.                         }
  376.                     }
  377.                     switch(tempString[i])
  378.                     {
  379.                         case 'd', 'D', 'i', 'I': format(parts, sizeof(parts), "%d", getarg(totalFound + 2));
  380.                         case 'f', 'F': format(parts, sizeof(parts), "%.02f", getarg(totalFound + 2));
  381.                         case 'c', 'C': format(parts, sizeof(parts), "%c", getarg(totalFound + 2));
  382.                         case 'x', 'X': format(parts, sizeof(parts), "%x", getarg(totalFound + 2));
  383.                         case 'b', 'B': format(parts, sizeof(parts), "%b", getarg(totalFound + 2));
  384.                     }
  385.                     tempLen = strlen(parts);
  386.  
  387.                     if(tempLen > 2)
  388.                     {
  389.                         for(j = 0; j != (tempLen - 2); ++j)
  390.                         {
  391.                             strins(tempString, "_", (i + 1));
  392.                         }
  393.                         for(j = 0, t = 0; tempString[j] != 0; ++j)
  394.                         {
  395.                             if(j >= (i - 1) && t < tempLen)
  396.                             {
  397.                                 tempString[j] = parts[t];
  398.                                 ++t;
  399.                             }
  400.                         }
  401.                         continue;
  402.                     }
  403.                     else if(tempLen == 2)
  404.                     {
  405.                         for(j = 0, t = 0; tempString[j] != 0; ++j)
  406.                         {
  407.                             if(j == i || j == (i - 1))
  408.                             {
  409.                                 tempString[j] = parts[t];
  410.                                 ++t;
  411.                             }
  412.                         }
  413.                         continue;
  414.                     }
  415.                     else if(tempLen < 2)
  416.                     {
  417.                         strdel(tempString, i, i+1);
  418.                         for(j = 0, t = 0; tempString[j] != 0; ++j)
  419.                         {
  420.                             if(j == (i - 1))
  421.                             {
  422.                                 tempString[j] = parts[t];
  423.                                 ++t;
  424.                             }
  425.                         }
  426.                         continue;
  427.                     }
  428.                 }
  429.             }
  430.         }
  431.     }
  432.     if(playerid != INVALID_PLAYER_ID)
  433.         SendClientMessage(playerid, color, tempString);
  434.     else
  435.         SendClientMessageToAll(color, tempString);
  436.     return 1;
  437. }
  438.  
  439. stock bCall(playerid)
  440. {
  441.     foreach(Player, driver) {
  442.         if(sPlayerInfo[driver][sDriver] == 1)
  443.         {
  444.             SCME(driver, -1, "%s [id: %d) is waiting at a bus stop. (/acceptcall)",gName(playerid),playerid);
  445.         }
  446.     }
  447.     return 1;
  448. }
  449.  
  450. stock isDriver(playerid)
  451. {
  452.     if(sPlayerInfo[playerid][sDriver] == 1) return 1;
  453.     return 0;
  454. }
  455.  
  456. stock gName(playerid)
  457. {
  458.     new Name[MAX_PLAYER_NAME];
  459.     GetPlayerName(playerid, Name, sizeof(Name));
  460.     return Name;
  461. }
  462.  
  463. stock updateBusPoint(bus)
  464. {
  465.     format(megastr,sizeof(megastr),"UPDATE `buspoints` SET `bX` = '%f', `bY` = '%f', `bZ` = '%f', `Taken` = %d, `Disabled` = %d WHERE `bid` = '%d'", BusInfo[bus[bX],BusInfo[bus][bY],BusInfo[bus][bZ],BusInfo[bus][bTaken],BusInfo[bus][bDisabled],BusInfo[bus][bid]);
  466.     mysql_function_query(SQLHandle, megastr, false, "bForward", "i", bus);
  467.     return 1;
  468. }
  469.  
  470. stock AddBusPoint(Float:x, Float:y, Float:z, taken=1, disabled=0)
  471. {
  472.     format(megastr,sizeof(megastr),"INSERT INTO `buspoints` (`bX`, `bY`, `bZ`, `Taken`, `Disabled`) VALUES ('%f', '%f', '%f', '%d', '%d')", x, y, z, taken,disabled);
  473.     mysql_function_query(SQLHandle, megastr, false, "bEForward", "");
  474. }
  475.  
  476. forward bForward(bus);
  477. public bForward(bus)
  478. {
  479.     Bus_LoadStops();
  480.     return 1;
  481. }
  482.  
  483. forward bEForward();
  484. public bEForward()
  485. {
  486.     Bus_LoadStops();
  487.     return 1;
  488. }
  489.  
  490. forward Bus_LoadStops();
  491. public Bus_LoadStops()
  492. {
  493.     format(megastr,sizeof(megastr),"SELECT * FROM `buspoints`");
  494.     mysql_function_query(SQLHandle, megastr, true, "getPoints", "");
  495. }
  496.  
  497. forward getPoints();
  498. public getPoints()
  499. {
  500.     new fields, rows, fetch[MAX_STRING];
  501.     cache_get_data(rows, fields, SQLHandle);
  502.  
  503.     for(new i; i < rows; i++)
  504.     {
  505.         cache_get_field_content(i, "bid", fetch, SQLHandle, MAX_STRING);
  506.         BusInfo[i][bid] = strval(fetch);
  507.        
  508.         cache_get_field_content(i, "bX", fetch, SQLHandle, MAX_STRING);
  509.         BusInfo[i][bX] = floatstr(fetch);
  510.  
  511.         cache_get_field_content(i, "bY", fetch, SQLHandle, MAX_STRING);
  512.         BusInfo[i][bY] = floatstr(fetch);
  513.  
  514.         cache_get_field_content(i, "bZ", fetch, SQLHandle, MAX_STRING);
  515.         BusInfo[i][bZ] = floatstr(fetch);
  516.  
  517.         cache_get_field_content(i, "Taken", fetch, SQLHandle, MAX_STRING);
  518.         BusInfo[i][bTaken] = strval(fetch);
  519.  
  520.         cache_get_field_content(i, "Disabled", fetch, SQLHandle, MAX_STRING);
  521.         BusInfo[i][bDisabled] = strval(fetch);
  522.     }
  523.  
  524.     for(new i; i < MAX_POINTS; i++)
  525.     {
  526.         CreateDynamic3DTextLabel("Bus Point - /bcall", -1, BusInfo[i][bX], BusInfo[i][bY], BusInfo[i][bZ] + 3.0, 40.0);
  527.     }
  528.     printf("* %d bus points were loaded.", rows);
  529.     return 1;
  530. }
  531.  
  532. forward Load_Driver(playerid);
  533. public Load_Driver(playerid)
  534. {
  535.     format(megastr,sizeof(megastr),"SELECT * FROM `drivers` WHERE Username = '%s'",gName(playerid));
  536.     mysql_function_query(SQLHandle, megastr, true, "getDriver", "i", playerid);
  537. }
  538.  
  539. forward getDriver(playerid);
  540. public getDriver(playerid)
  541. {
  542.     new rows, fields, fetch[MAX_STRING];
  543.     cache_get_data(rows, fields, SQLHandle);
  544.     if(rows) {
  545.  
  546.         cache_get_field_content(0, "sDriver", fetch, SQLHandle, MAX_STRING);
  547.         sPlayerInfo[playerid][sDriver] = strval(fetch);
  548.  
  549.         cache_get_field_content(0, "bAdmin", fetch, SQLHandle, MAX_STRING);
  550.         sPlayerInfo[playerid][bAdmin] = strval(fetch);
  551.     }
  552.     else {
  553.         new num = 0, num2 = 0;
  554.         format(megastr,sizeof(megastr),"INSERT INTO `drivers` (Username, sDriver, bAdmin) VALUES ('%s','%d',%d)",gName(playerid),num, num2);
  555.         mysql_function_query(SQLHandle, megastr, false, "Load_Driver", "i", playerid);
  556.     }
  557.     return 1;
  558. }
  559.  
  560. forward SaveDriver(playerid);
  561. public SaveDriver(playerid)
  562. {
  563.     format(megastr,sizeof(megastr),"UPDATE `drivers` SET sDriver = %d, bAdmin = %d WHERE Username = '%s'", sPlayerInfo[playerid][sDriver], sPlayerInfo[bAdmin], gName(playerid));
  564.     mysql_function_query(SQLHandle, megastr, false, "finalSave", "i", playerid);
  565. }
  566.  
  567. forward finalSave(playerid);
  568. public finalSave(playerid)
  569. {
  570.     return 1;
  571. }
Advertisement
Add Comment
Please, Sign In to add comment