Guest User

Theory's Bus System [Update 4]

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