// Onur AKAN(trablon)`in RolePlay Modu - ALPHA // //======== Silver ========// // OnGameModeInit callback içinde, gettime çağırılarak World time'a uyarlandı. // SQL update sorunları düzeltildi, sorunsuz bir şekilde kayıt sağlanıyor. (Server.exe normal kapatıldığında, OnGameModeExit'ı devreye sokmuyor. 'Exit' komutu çağrısı ile devreye giriyor.) // ZCMD eklendi. // /saveall komutu oluşturuldu. [Kontrol edersin reis :)] // Renkler sütunu açtım. // OnPlayerSpawn + Connect'e oyuncu renkleri ekledim. // Level değişkeni getirdim, SQL tablosuna ekledim. * Kayıt olduktan sonra skor otomatik 1. // Skin değişkeni geldi. // OnPlayerSpawn callback'te değişiklikler yapıldı. * 0 isimli skin tespitinde 299 skini atayacak. // OnPlayerUpdate fonksiyonuna kişinin level ve skini ne ise sürekli kontrol edecek. / Bunu yaparken bayağı kararsız kaldım bi kontrol edersin sen ginede.... // Giriş yapmadan komut ve yazı gönderilmeyecek. //================================================================[kutuphaneler] #include #include #include //=================================================================[mod tanımlama] #define MYSQL_HOST "127.0.0.1" #define MYSQL_USER "root" #define MYSQL_PASSWORD "" #define MYSQL_DATABASE "onurakan" #define ServerIsmi "[TR] Ikinci Yaşam Online - RolePlay" #define ServerSifresi "" #define ServerVersiyonu "v0.1[ALPHA]" #define ServerDili "Türkçe/Turkish" #define CoderIsmi "Onur AKAN (trablon)" #define HaritaIsmi "Yasam Kasabasi" #define RconSifresi "31cilerinsavasi" #define GIRIS_ZAMANI 30 // Giris Zamani // spawn noktasi #define DEFAULT_POS_X -203.0484 #define DEFAULT_POS_Y 985.0094 #define DEFAULT_POS_Z 19.3617 #define DEFAULT_POS_A 354.1208 // oyuncu rengi #define CONNECT_COLOR 0x80808000 // KOYU GRİ #define SPAWN_COLOR 0xFFFFFF00 // BEYAZ //=================================================================[renkler] #define BEYAZ 0xFFFFFFFF #define KIRMIZI 0xFF0000FF #define MAVI 0x0080FFFF #define YESIL 0x80FF00FF #define SIYAH 0x000000FF //=================================================================[değişkenler] new MySQL: g_SQL; enum E_PLAYERS { ID, Name[MAX_PLAYER_NAME], Password[65], Salt[17], Float: X_Pos, Float: Y_Pos, Float: Z_Pos, Float: A_Pos, Interior, VirtualWorld, Level, Skin, Cache: Cache_ID, bool: IsLoggedIn, LoginAttempts, LoginTimer }; new Player[MAX_PLAYERS][E_PLAYERS]; new g_MysqlRaceCheck[MAX_PLAYERS]; // dialog bilgileri enum { DIALOG_UNUSED, DIALOG_LOGIN, DIALOG_REGISTER }; //=================================================================[degiskenler] main() { print("[===============================================================]"); printf("Sunucu Ismi: %s",ServerIsmi); printf("Server Versiyonu: %s",ServerVersiyonu); printf("Server Dili: %s",ServerDili); printf("Server Haritasi: %s",HaritaIsmi); printf("Gelistirici: %s",CoderIsmi); print("[===============================================================]"); } CMD:saveall(playerid,params[]) { //new x=?; if(Player[playerid][Admin] < x) return 1; // yarın admin/helper hallederim if(!IsPlayerAdmin(playerid)) return 1; // şimdilik rcon şartı koyuyorum. for (new i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if (IsPlayerConnected(i)) { OyuncuVerileriniGuncelle(i,1); // şart koymadan önce pool'a göre kaydediyorum. if(i==0) i+=1; // Pool idye göre çekiyor sanırım, bu şartı koyuyorum ve printf alıyorum. printf("Şu kadar karakter kayıt edildi: %d",i); // aldım. + şart sadece yazı amacında i-=1;// şartı tekrar eski haline çekiyorum. } } SendClientMessage(playerid,-1,"{80FF00}[@] {FFFFFF}Aktif oyuncuların veri tabanları kaydedildi!"); return 1; } public OnGameModeInit() { //Server Genel Ayarlamalari new saat, dakika, saniye; gettime(saat, dakika, saniye); SetWorldTime(saat); UsePlayerPedAnims(); new str[64]; format(str,sizeof(str),"hostname %s",ServerIsmi); SendRconCommand(str); if(strcmp(ServerSifresi,"", false, 4)) { } else { format(str,sizeof(str),"password %s",ServerSifresi); SendRconCommand(str); } SetGameModeText(ServerVersiyonu); format(str,sizeof(str),"language %s",ServerDili); SendRconCommand(str); format(str,sizeof(str),"mapname %s",HaritaIsmi); SendRconCommand(str); format(str,sizeof(str),"rcon_password %s",RconSifresi); SendRconCommand(str); // MySQL new MySQLOpt: option_id = mysql_init_options(); mysql_set_option(option_id, AUTO_RECONNECT, true); g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0) { print("[SISTEM]: MySQL veritabanina baglanilamadi, sunucu kapatildi."); SendRconCommand("exit"); } else print("[SISTEM]: MySQL veritabanina basarili bir sekilde baglanildi."); // MySQL VeritabaniTableEkle(); return 1; } public OnGameModeExit() { // Butun oyuncularin verilerini kayit et for (new i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if (IsPlayerConnected(i)) { // Normal cikis OnPlayerDisconnect(i, 1); } } printf("Sunucu sorunsuz bir şekilde kapatıldı!"); mysql_close(g_SQL); return 1; } public OnPlayerRequestClass(playerid, classid) { SetPlayerCameraPos(playerid, -545.7316, 1128.8561, 95.5650); SetPlayerCameraLookAt(playerid, -544.7459, 1129.0485, 95.1698); return 1; } public OnPlayerConnect(playerid) { g_MysqlRaceCheck[playerid]++; // Oyuncunun giristeki verilerini sifirlar. static const empty_player[E_PLAYERS]; Player[playerid] = empty_player; GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME); // Islem onceligi gonder oyuncu icin new query[103]; mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `hesaplar` WHERE `isim` = '%e' LIMIT 1", Player[playerid][Name]); mysql_tquery(g_SQL, query, "OyuncuOyunaGiris", "dd", playerid, g_MysqlRaceCheck[playerid]); return 1; } public OnPlayerDisconnect(playerid, reason) { g_MysqlRaceCheck[playerid]++; OyuncuVerileriniGuncelle(playerid, reason); // Kicklenen oyuncunun verilerini sifirla. if (cache_is_valid(Player[playerid][Cache_ID])) { cache_delete(Player[playerid][Cache_ID]); Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE; } if (Player[playerid][LoginTimer]) { KillTimer(Player[playerid][LoginTimer]); Player[playerid][LoginTimer] = 0; } // Oyuncunun durumunu offline yap. ++ Player[playerid][IsLoggedIn] = false; return 1; } public OnPlayerSpawn(playerid) { SetPlayerVirtualWorld(playerid, Player[playerid][VirtualWorld]); SetPlayerInterior(playerid, Player[playerid][Interior]); SetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]); SetPlayerFacingAngle(playerid, Player[playerid][A_Pos]); SetPlayerScore(playerid, Player[playerid][Level]); SetPlayerSkin(playerid, Player[playerid][Skin]); if(Player[playerid][Skin] == 0){ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Yasaklı Kıyafet!", "Kıyafetiniz '0' olarak tespit edildiği için otomatik olarak değiştirildi.", "Onayla", ""); SetPlayerSkin(playerid,299);} SetPlayerColor(playerid,SPAWN_COLOR); SetCameraBehindPlayer(playerid); return 1; } public OnPlayerDeath(playerid, killerid, reason) { return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { if(Player[playerid][IsLoggedIn] == false) return 0; return 1; } public OnPlayerCommandReceived(playerid, cmdtext[]) { if(Player[playerid][IsLoggedIn] == false) return 0; return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { if(Player[playerid][IsLoggedIn] == false) return 0; return 0; } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { if(Player[playerid][IsLoggedIn] == true){Player[playerid][Skin] = GetPlayerSkin(playerid); Player[playerid][Level] = GetPlayerScore(playerid);} return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch (dialogid) { case DIALOG_UNUSED: return 1; case DIALOG_LOGIN: { if (!response) return Kick(playerid); new hashed_pass[65]; SHA256_PassHash(inputtext, Player[playerid][Salt], hashed_pass, 65); if (strcmp(hashed_pass, Player[playerid][Password]) == 0) { // Spawn Dialogu ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Yasam Online - Kayit/Giris Sekmesi", "Basariyla giris sagladiniz.", "Onayla", ""); // Oyuncunun tablodaki ID degerini cek. cache_set_active(Player[playerid][Cache_ID]); OyuncununVerileriniAktar(playerid); // Aktif baglantiyi kaldir ve cache ID degiskenine gecmis aktif baglantiyi store yap. cache_delete(Player[playerid][Cache_ID]); Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE; KillTimer(Player[playerid][LoginTimer]); Player[playerid][LoginTimer] = 0; Player[playerid][IsLoggedIn] = true; // Giristen sonra oyuncuyu en son kaldigi yerden baslat. SetSpawnInfo(playerid, NO_TEAM, Player[playerid][Skin], Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], 0, 0, 0, 0, 0, 0); SpawnPlayer(playerid); } else { Player[playerid][LoginAttempts]++; if (Player[playerid][LoginAttempts] >= 3) { ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Yasam Online - Kayit/Giris Sekmesi", "Fazlasiyla hatali giris yaptiniz.(3/3)", "Onayla", ""); DelayedKick(playerid); } else ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Yasam Online - Kayit/Giris Sekmesi", "Yanlis sifre.\nLutfen sifrenizi tekrardan giriniz:", "Giris", "Cikis"); } } case DIALOG_REGISTER: { if (!response) return Kick(playerid); if (strlen(inputtext) <= 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Yasam Online - Kayit/Giris Sekmesi", "Sifreniz 5 karakterden fazla olmalidir, lutfen tekrardan sifrenizi giriniz:", "Kayit", "Cikis"); // 16 ASCII rastgele karkater ata.(33`ten 126`ya kadar.) TrabSALT-16 for (new i = 0; i < 16; i++) Player[playerid][Salt][i] = random(94) + 33; SHA256_PassHash(inputtext, Player[playerid][Salt], Player[playerid][Password], 65); new query[221]; mysql_format(g_SQL, query, sizeof query, "INSERT INTO `hesaplar` (`isim`, `sifre`, `salt`) VALUES ('%e', '%s', '%e')", Player[playerid][Name], Player[playerid][Password], Player[playerid][Salt]); mysql_tquery(g_SQL, query, "OyuncuKayit", "d", playerid); } default: return 0; // Gecersiz Dialog } return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } //================================================================[fonksiyonlar] forward OyuncuOyunaGiris(playerid, race_check); public OyuncuOyunaGiris(playerid, race_check) { if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid); new string[115]; if(cache_num_rows() > 0) { cache_get_value(0, "sifre", Player[playerid][Password], 65); cache_get_value(0, "salt", Player[playerid][Salt], 17); Player[playerid][Cache_ID] = cache_save(); format(string, sizeof string, "Hesabiniz `%s` olarak sisteme tanimlanmistir. Sifrenizi girerek lutfen oyuna baslayiniz:", Player[playerid][Name]); ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Yasam Online - Kayit/Giris Sekmesi", string, "Giris", "Cikis"); Player[playerid][LoginTimer] = SetTimerEx("OnLoginTimeout", GIRIS_ZAMANI * 1000, false, "d", playerid); } else { format(string, sizeof string, "Hosgeldiniz %s, sifrenizi girerek lutfen sisteme hesabinizi kayit ediniz:", Player[playerid][Name]); ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Yasam Online - Kayit/Giris Sekmesi", string, "Kayit", "Cikis"); } return 1; } forward OnLoginTimeout(playerid); public OnLoginTimeout(playerid) { Player[playerid][LoginTimer] = 0; ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Yasam Online - Kayit/Giris Sekmesi", "[SISTEM]: Belirttiginiz hesaba uzun sure giris yapmadiginizdan sunucudan atildiniz.", "Onayla", ""); DelayedKick(playerid); return 1; } forward OyuncuKayit(playerid); public OyuncuKayit(playerid) { Player[playerid][ID] = cache_insert_id(); ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Yasam Online - Kayit/Giris Sekmesi", "Basariyla hesabiniz sisteme kayit oldu, otomatik olarak giris yaptiniz.", "Onayla", ""); Player[playerid][IsLoggedIn] = true; Player[playerid][X_Pos] = DEFAULT_POS_X; Player[playerid][Y_Pos] = DEFAULT_POS_Y; Player[playerid][Z_Pos] = DEFAULT_POS_Z; Player[playerid][A_Pos] = DEFAULT_POS_A; Player[playerid][Level] = 1; SetPlayerScore(playerid, 1); SetSpawnInfo(playerid, NO_TEAM, 0, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], 0, 0, 0, 0, 0, 0); SpawnPlayer(playerid); OyuncuVerileriniGuncelle(playerid, 1); return 1; } forward _KickPlayerDelayed(playerid); public _KickPlayerDelayed(playerid) { Kick(playerid); return 1; } //----------------------------------------------------- OyuncununVerileriniAktar(playerid) { cache_get_value_int(0, "id", Player[playerid][ID]); cache_get_value_float(0, "x", Player[playerid][X_Pos]); cache_get_value_float(0, "y", Player[playerid][Y_Pos]); cache_get_value_float(0, "z", Player[playerid][Z_Pos]); cache_get_value_float(0, "angle", Player[playerid][A_Pos]); cache_get_value_int(0, "virtualworld",Player[playerid][VirtualWorld]); cache_get_value_int(0, "interior", Player[playerid][Interior]); cache_get_value_int(0, "level", Player[playerid][Level]); cache_get_value_int(0, "skin", Player[playerid][Skin]); return 1; } DelayedKick(playerid, time = 500) { SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid); return 1; } VeritabaniTableEkle() { mysql_tquery(g_SQL, "CREATE TABLE IF NOT EXISTS `hesaplar` (`id` int(11) NOT NULL AUTO_INCREMENT,`isim` varchar(24) NOT NULL,`sifre` char(64) NOT NULL,`salt` char(16) NOT NULL,`x` float NOT NULL DEFAULT '0',`y` float NOT NULL DEFAULT '0',`z` float NOT NULL DEFAULT '0',`angle` float NOT NULL DEFAULT '0',`virtualworld` mediumint(8) NOT NULL DEFAULT '0',`interior` tinyint(3) NOT NULL DEFAULT '0',`level` int(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`isim`))"); return 1; } OyuncuVerileriniGuncelle(playerid, reason) { if (Player[playerid][IsLoggedIn] == false) return 0; // oyuncu eger hatali sync. yasayip timed out yerse sunucunun bug`a girmemesi icin oyuncunun posizyonunu default degerine ata. if (reason == 1) { GetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]); GetPlayerFacingAngle(playerid, Player[playerid][A_Pos]); } new query[512]; format(query, sizeof query, "UPDATE `hesaplar` SET `x` = %f, `y` = %f, `z` = %f, `angle` = %f,`virtualworld` = %d, `interior` = %d, `level` = %d, `skin` = %d WHERE `id` = %d LIMIT 1", Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], GetPlayerVirtualWorld(playerid),GetPlayerInterior(playerid), Player[playerid][Level], Player[playerid][Skin], Player[playerid][ID]); mysql_tquery(g_SQL, query); return 1; } //========================================================================[zcmd] //=========================================================================[SON]