Advertisement
Guest User

MySQL R39-3 Tutorial Spawn

a guest
Feb 12th, 2016
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.83 KB | None | 0 0
  1. // This is a comment
  2. // uncomment the line below if you want to write a filterscript
  3. //#define FILTERSCRIPT
  4.  
  5. #include <a_samp>
  6. #include <a_mysql>
  7.  
  8. forward OnUserCheck(playerid);
  9. forward OnUserRegister(playerid);
  10. forward OnUserLogin(playerid);
  11. forward Tutorial(playerid);
  12.  
  13. main()
  14. {
  15. print("\n----------------------------------");
  16. print(" - by SebMcpepp");
  17. print("----------------------------------\n");
  18. }
  19.  
  20. #define MYSQL_HOST "127.0.0.1" //IP Adresse des MySQL Servers
  21. #define MYSQL_USER "root" //Benutzername der angemeldet wird
  22. #define MYSQL_PASS "" //Passwort des Benutzers
  23. #define MYSQL_DBSE "samp_db" //Name der Datenbank
  24.  
  25. new handle; //Die Connection-Handle, über die wir später auf die Tabellen der Datenbank zugreifen
  26.  
  27. enum pDataEnum
  28. {
  29. p_id,
  30. bool:pLoggedIn,
  31. pName[MAX_PLAYER_NAME],
  32. pLevel,
  33. pAdmin,
  34. pMoney,
  35. pKills,
  36. pDeaths
  37. }
  38. new bool:pFirstLog[MAX_PLAYERS],PlayerInfo[MAX_PLAYERS][pDataEnum];
  39. new TutTimer[MAX_PLAYERS],TutTime[MAX_PLAYERS];
  40.  
  41.  
  42. #define ConnectionCheck(%1); if(!IsPlayerConnected(%1)) { return 1; }
  43. //Dialog IDs (gegebenenfalls ändern, falls bereits belegt)
  44. #define DIALOG_REGISTER 1
  45. #define DIALOG_LOGIN 2
  46.  
  47. #define COLOR_YELLOW 0xFFFF00FF
  48.  
  49. public OnGameModeInit()
  50. {
  51. MySQL_SetupConnection();
  52. SetGameModeText("- v.0.1");
  53. AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
  54. return 1;
  55. }
  56.  
  57. public OnGameModeExit()
  58. {
  59. mysql_close(handle);
  60. return 1;
  61. }
  62.  
  63. public OnPlayerRequestClass(playerid, classid)
  64. {
  65. //Wenn der Spieler die Class-Selection betritt, prüfe ob er bereits eingeloggt ist
  66. if(!PlayerInfo[playerid][pLoggedIn])
  67. {
  68. //Wenn nicht, dann prüfe ob der Spieler ein Konto hat
  69. //Dazu wird ein Query gesendet und ein neues Callback aufgerufen
  70. //%e steht für einen geprüften String (sollte anstatt %s in Queries verwendet werden)
  71. new query[128];
  72. mysql_format(handle, query, sizeof(query), "SELECT id FROM users WHERE name = '%e'", PlayerInfo[playerid][pName]);
  73.  
  74. //Das Query wird abgesendet und die playerid an OnUserCheck übergeben
  75. mysql_pquery(handle, query, "OnUserCheck", "d", playerid);
  76. }
  77. return 1;
  78. }
  79.  
  80. public OnPlayerConnect(playerid)
  81. {
  82. PlayerInfo[playerid][p_id] = 0;
  83. PlayerInfo[playerid][pLoggedIn] = false;
  84. PlayerInfo[playerid][pLevel] = 0;
  85. PlayerInfo[playerid][pAdmin] = 0;
  86. PlayerInfo[playerid][pMoney] = 0;
  87. PlayerInfo[playerid][pKills] = 0;
  88. PlayerInfo[playerid][pDeaths] = 0;
  89. GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
  90. return 1;
  91. }
  92.  
  93. public OnPlayerDisconnect(playerid, reason)
  94. {
  95. SaveUserStats(playerid);
  96. return 1;
  97. }
  98.  
  99. public OnPlayerSpawn(playerid)
  100. {
  101. SetPlayerPos(playerid, 329.0244,-1513.3033,36.0391);
  102. SetPlayerCameraPos(playerid, 329.0244,-1513.3033,36.0391);
  103. SetPlayerCameraLookAt(playerid, 329.0244,-1513.3033,36.0391);
  104. SetPlayerFacingAngle(playerid,49.4261);
  105. if(pFirstLog[playerid] == true)//Erster Login
  106. {
  107. SetPlayerPos(playerid,0.0,0.0,0.0); // Tutorial Position
  108. TogglePlayerControllable(playerid,false);
  109. TutTime[playerid] = 1;
  110. TutTimer[playerid] = SetTimerEx("Tutorial",1000,1,"i",playerid);
  111. return 1;
  112. }
  113. else if(pFirstLog[playerid] == false)//Nicht erster Login
  114. {
  115. GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
  116. SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
  117. return 1;
  118. }
  119. return 1;
  120. }
  121.  
  122. public OnPlayerDeath(playerid, killerid, reason)
  123. {
  124. if(killerid != INVALID_PLAYER_ID)
  125. {
  126. PlayerInfo[killerid][pKills]++;
  127. //if(PlayerInfo[killerid][pKills] > 3)
  128. //{
  129. // PlayerInfo[killerid][pLevel] = 1;
  130. //}
  131. }
  132. PlayerInfo[playerid][pDeaths]++;
  133. return 1;
  134. }
  135.  
  136. public OnVehicleSpawn(vehicleid)
  137. {
  138. return 1;
  139. }
  140.  
  141. public OnVehicleDeath(vehicleid, killerid)
  142. {
  143. return 1;
  144. }
  145.  
  146. public OnPlayerText(playerid, text[])
  147. {
  148. return 1;
  149. }
  150.  
  151. public OnPlayerCommandText(playerid, cmdtext[])
  152. {
  153. if (strcmp("/spawn", cmdtext, true, 10) == 0)
  154. {
  155. SpawnPlayer(playerid);
  156. return 1;
  157. }
  158. return 0;
  159. }
  160.  
  161. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  162. {
  163. return 1;
  164. }
  165.  
  166. public OnPlayerExitVehicle(playerid, vehicleid)
  167. {
  168. return 1;
  169. }
  170.  
  171. public OnPlayerStateChange(playerid, newstate, oldstate)
  172. {
  173. return 1;
  174. }
  175.  
  176. public OnPlayerEnterCheckpoint(playerid)
  177. {
  178. return 1;
  179. }
  180.  
  181. public OnPlayerLeaveCheckpoint(playerid)
  182. {
  183. return 1;
  184. }
  185.  
  186. public OnPlayerEnterRaceCheckpoint(playerid)
  187. {
  188. return 1;
  189. }
  190.  
  191. public OnPlayerLeaveRaceCheckpoint(playerid)
  192. {
  193. return 1;
  194. }
  195.  
  196. public OnRconCommand(cmd[])
  197. {
  198. return 1;
  199. }
  200.  
  201. public OnPlayerRequestSpawn(playerid)
  202. {
  203. return 1;
  204. }
  205.  
  206. public OnObjectMoved(objectid)
  207. {
  208. return 1;
  209. }
  210.  
  211. public OnPlayerObjectMoved(playerid, objectid)
  212. {
  213. return 1;
  214. }
  215.  
  216. public OnPlayerPickUpPickup(playerid, pickupid)
  217. {
  218. return 1;
  219. }
  220.  
  221. public OnVehicleMod(playerid, vehicleid, componentid)
  222. {
  223. return 1;
  224. }
  225.  
  226. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  227. {
  228. return 1;
  229. }
  230.  
  231. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  232. {
  233. return 1;
  234. }
  235.  
  236. public OnPlayerSelectedMenuRow(playerid, row)
  237. {
  238. return 1;
  239. }
  240.  
  241. public OnPlayerExitedMenu(playerid)
  242. {
  243. return 1;
  244. }
  245.  
  246. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  247. {
  248. return 1;
  249. }
  250.  
  251. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  252. {
  253. return 1;
  254. }
  255.  
  256. public OnRconLoginAttempt(ip[], password[], success)
  257. {
  258. return 1;
  259. }
  260.  
  261. public OnPlayerUpdate(playerid)
  262. {
  263. return 1;
  264. }
  265.  
  266. public OnPlayerStreamIn(playerid, forplayerid)
  267. {
  268. return 1;
  269. }
  270.  
  271. public OnPlayerStreamOut(playerid, forplayerid)
  272. {
  273. return 1;
  274. }
  275.  
  276. public OnVehicleStreamIn(vehicleid, forplayerid)
  277. {
  278. return 1;
  279. }
  280.  
  281. public OnVehicleStreamOut(vehicleid, forplayerid)
  282. {
  283. return 1;
  284. }
  285.  
  286. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  287. {
  288. if(dialogid == DIALOG_REGISTER)
  289. {
  290. //Spieler hat Abbrechen gewählt
  291. if(!response) return Kick(playerid);
  292.  
  293. //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
  294. if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
  295.  
  296. //Wenn alles passt wird der Spieler in der Datenbank angelegt
  297. //Als Verschlüsselung für das Passwort wird MD5 verwendet
  298. new query[256];
  299. mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);
  300.  
  301. //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
  302. mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
  303. pFirstLog[playerid] = true;
  304. return 1;
  305. }
  306. if(dialogid == DIALOG_LOGIN)
  307. {
  308. //Spieler hat Abbrechen gewählt
  309. if(!response) return Kick(playerid);
  310.  
  311. //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
  312. if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmelden", "Bitte melden Sie sich an:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
  313.  
  314. //Wenn alles passt wird die Datenbank ausgelesen
  315. new query[256];
  316. mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e' AND password = MD5('%e')", PlayerInfo[playerid][pName], inputtext);
  317.  
  318. //Das Query wird abgesendet und die playerid an OnUserLogin übergeben
  319. mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
  320. pFirstLog[playerid] = false;
  321. return 1;
  322. }
  323. return 0;
  324. }
  325.  
  326. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  327. {
  328. return 1;
  329. }
  330. //PUBLICS
  331. public Tutorial(playerid)
  332. {
  333. if(TutTime[playerid] >= 1) // wenn die Zeit auf 1 gesetzt worden war, gehts los. Wenn während des Tutorials die zeit wieder auf 0 gesetzt wird, passiert in dem Timer garnichts.
  334. {
  335. if(TutTime[playerid] == 2)// hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  336. {
  337. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Willkommen!)__'~*");
  338. SendClientMessage(playerid,COLOR_YELLOW,"Es folgt nun ein kleines Tutorial, passe bitte gut auf.");
  339. SendClientMessage(playerid,COLOR_YELLOW,"Falls dann doch noch Fragen offen bleiben, fragt im Forum oder die Admins/Spieler.");
  340. }
  341. else if(TutTime[playerid] == 10)// hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  342. {
  343. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Respekt und Umgangston!)__'~*");
  344. SendClientMessage(playerid,COLOR_YELLOW,"Bitte behandle jeden so wie du gern behandelt werden möchtest.");
  345. SendClientMessage(playerid,COLOR_YELLOW,"Falls du in einem falschen Umgangston redest wirst du verwarnt.");
  346. SendClientMessage(playerid,COLOR_YELLOW,"Bitte respektiere die Admins auch, denn auch sie werden dich..");
  347. SendClientMessage(playerid,COLOR_YELLOW,"..respektieren. Also: Achte auf deinen Umgangston!");
  348. }
  349. else if(TutTime[playerid] == 18)// hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  350. {
  351. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Bugusing oder Ähnliches!)__'~*");
  352. SendClientMessage(playerid,COLOR_YELLOW,"Falls du jemanden siehst, der einen Bug used.");
  353. SendClientMessage(playerid,COLOR_YELLOW,"Oder auch wenn er cheatet oder andere 'illegale' Sachen tut..");
  354. SendClientMessage(playerid,COLOR_YELLOW,"Bitte reporte ihn oder mach einen Screen und stell ihn ins Forum.");
  355. }
  356. else if(TutTime[playerid] == 26)// hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  357. {
  358. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Häuser und Autos!)__'~*");
  359. SendClientMessage(playerid,COLOR_YELLOW,"Wie auf jedem Reallife Server, so auch hier gibt es Autohäuser und Häuser zum Verkauf.");
  360. SendClientMessage(playerid,COLOR_YELLOW,"Wenn du ein Haus haben willst, brauchst du einen Makler. Du spawnst immer wieder vor deinem Haus.");
  361. SendClientMessage(playerid,COLOR_YELLOW,"Wenn du ein Auto haben willt, fahr zum nächsten Autohaus.");
  362. SendClientMessage(playerid,COLOR_YELLOW,"Es gibt mehrere von Ihnen und verschiedene Preisklassen.Dein Auto kannst du dann irgendwo parken..");
  363. SendClientMessage(playerid,COLOR_YELLOW,"..oder auch Verkaufen, falls es dir nicht gefällt.");
  364. }
  365. else if(TutTime[playerid] == 34)// hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  366. {
  367. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Berufe und Firmen!)__'~*");
  368. SendClientMessage(playerid,COLOR_YELLOW,"Jeder Bürger von San Fierro kann eine eigene Firma gründen.");
  369. SendClientMessage(playerid,COLOR_YELLOW,"Du brauchst jedoch genug Geld und ein Konzept.");
  370. SendClientMessage(playerid,COLOR_YELLOW,"Wenn du dies beides besitzt, schreib es ins Forum und wir werden es uns anschauen.");
  371. SendClientMessage(playerid,COLOR_YELLOW,"Doch auch andere Berufe kannst du ausüben, bewerben tut man sich im Forum..");
  372. SendClientMessage(playerid,COLOR_YELLOW,"..dort kannst du auch dich für ein Chef Posten bewerben, falls einer frei ist.");
  373. }
  374. else if(TutTime[playerid] == 42)
  375. {
  376. SendClientMessage(playerid,COLOR_YELLOW,"*~'__(Tutorial: Das Ende!)__'~*");
  377. SendClientMessage(playerid,COLOR_YELLOW,"Vielen Dank, dass du dir Zeit fürs Tutorial genommen hast.");
  378. SendClientMessage(playerid,COLOR_YELLOW,"Falls weitere Fragen bestehen, wende dich an Spieler oder Admins.");
  379. }
  380. else if(TutTime[playerid] == 50) // hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
  381. {
  382. KillTimer(TutTimer[playerid]); // der Tutorial Timer wird beendigt
  383. TutTime[playerid] = -1; // die Tutorial Zeit auf INVALID gsetzt - nach Goldkiller :)
  384. SpawnPlayer(playerid); // der Spawn, wo er nach dem Tutorial hinsoll
  385. TogglePlayerControllable(playerid,true); // hier wird die Fähigkeit sich zu bewegen wieder auf "wahr" gesetzt
  386. GameTextForPlayer(playerid,"~g~Willkommen, ~r~ auf -",6000,1); // GameText am Ende des Tutorials
  387. pFirstLog[playerid] = false;
  388. }
  389. TutTime[playerid]++; // hier wird die Zeit jede Sekunde erhöht
  390. }
  391. }
  392. //MYSQL & LoginRegister
  393. public OnUserCheck(playerid)
  394. {
  395. //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
  396. if(cache_get_row_count() == 0)
  397. {
  398. //Der Spieler konnte nicht gefunden werden, er muss sich registrieren
  399. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:", "Ok", "Abbrechen");
  400. }
  401. else
  402. {
  403. //Es existiert ein Ergebnis, das heißt der Spieler ist registriert und muss sich einloggen
  404. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmelden", "Bitte melden Sie sich an:", "Ok", "Abbrechen");
  405. }
  406. return 1;
  407. }
  408. public OnUserRegister(playerid)
  409. {
  410. //Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
  411. PlayerInfo[playerid][p_id] = cache_insert_id();
  412. SendClientMessage(playerid, 0x00FF00FF, "[System] Registrierung erfolgreich.");
  413. return 1;
  414. }
  415. public OnUserLogin(playerid)
  416. {
  417. //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
  418. if(cache_get_row_count() == 0)
  419. {
  420. //Der Spieler hat ein falsches Passwort eingegeben
  421. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmelden", "Bitte melden Sie sich an:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
  422. }
  423. else
  424. {
  425. //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
  426. //Wir lesen nun die erste Zeile des Caches aus (ID 0)
  427. PlayerInfo[playerid][p_id] = cache_get_field_content_int(0, "id", handle);
  428. PlayerInfo[playerid][pLevel] = cache_get_field_content_int(0, "level", handle);
  429. PlayerInfo[playerid][pAdmin] = cache_get_field_content_int(0, "admin", handle);
  430. PlayerInfo[playerid][pMoney] = cache_get_field_content_int(0, "money", handle);
  431. PlayerInfo[playerid][pKills] = cache_get_field_content_int(0, "kills", handle);
  432. PlayerInfo[playerid][pDeaths] = cache_get_field_content_int(0, "deaths", handle);
  433. PlayerInfo[playerid][pLoggedIn] = true;
  434. SendClientMessage(playerid, 0x00FF00FF, "[System] Eingeloggt.");
  435. }
  436. return 1;
  437. }
  438. //STOCKS
  439. stock SaveUserStats(playerid)
  440. {
  441. //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
  442. if(!PlayerInfo[playerid][pLoggedIn]) return 1;
  443.  
  444. //Ansonsten speichere sie
  445. new query[256];
  446. mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
  447. PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
  448.  
  449. //Das Query wird abgesendet
  450. mysql_pquery(handle, query);
  451. return 1;
  452. }
  453.  
  454. stock MySQL_SetupConnection(ttl = 3)
  455. {
  456. print("[MySQL] Verbindungsaufbau...");
  457. //mysql_log(LOG_ALL); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
  458.  
  459. handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DBSE, MYSQL_PASS);
  460.  
  461. //Prüfen und gegebenenfalls wiederholen
  462. if(mysql_errno(handle) != 0)
  463. {
  464. //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
  465. if(ttl > 1)
  466. {
  467. //Versuche erneut eine Verbindung aufzubauen
  468. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  469. printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
  470. return MySQL_SetupConnection(ttl-1);
  471. }
  472. else
  473. {
  474. //Abbrechen und Server schließen
  475. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  476. print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
  477. print("[MySQL] Der Server wird heruntergefahren.");
  478. return SendRconCommand("exit");
  479. }
  480. }
  481. printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", handle);
  482. return 1;
  483. }
  484. //FUNCTIONS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement