Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Czas gry sql


  • Zamknięty Temat jest zamknięty
9 odpowiedzi w tym temacie

#1 Windowspl

    Profesjonalista

  • Użytkownik

Reputacja: 7
Nowy

  • Postów:190
  • GG:
  • Imię:Patryk
  • Lokalizacja:Warszawa
Offline

Napisano 02.07.2011 10:19

Witam.

Czy dało by radę przerobić 2 poniższe pluginy (zapis i odczyt) z nvault na sql ?

Z góry wielkie dzięki :D

Plugin zapisu:

#include <amxmodx>
#include <nvault>

#define PLUGIN "Save Player's playing time"
#define VERSION "1.0"
#define AUTHOR "#Vaverix."

new czas_gry[33];
new g_vault;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /gametime","pokaz_czas_gry");
register_clcmd("say /playingtime","pokaz_czas_gry");
register_clcmd("say /czasgry","pokaz_czas_gry");
g_vault = nvault_open("SPPT");

if (g_vault == INVALID_HANDLE)
set_fail_state( "Nie udalo sie otworzyc pliku nvault!");
}

public client_connect(id)
{
wczytaj_czas_gry(id);
set_task(60.0, "pokaz_czas_gry", id,_,_,"b");
}
public client_disconnect(id)
{
zapisz_czas_gry(id);
czas_gry[id] = 0;

if(task_exists(id))
remove_task(id);
}

public wczytaj_czas_gry(id)
{
new name[35],vaultkey[64],vaultdata[256];

get_user_name(id,name,34);
format(vaultkey,63,"%s-gametime",name);

nvault_get(g_vault,vaultkey,vaultdata,255);

czas_gry[id] = str_to_num(vaultdata);

return PLUGIN_CONTINUE;
}


public zapisz_czas_gry(id)
{
new name[35],vaultkey[64],vaultdata[256];

get_user_name(id,name,34);
czas_gry[id] += get_user_time(id, 1);

format(vaultkey,63,"%s-gametime",name);
format(vaultdata, 255, "%d", czas_gry[id]);

nvault_set(g_vault,vaultkey,vaultdata)

czas_gry[id] = str_to_num(vaultdata);

return PLUGIN_CONTINUE;
}

public pokaz_czas_gry(id)
{
new sekundy = (czas_gry[id] + get_user_time(id, 1)), minuty, godziny;

while(sekundy >= 60)
{
sekundy -= 60;
minuty++;

}
while(minuty >= 60)
{
minuty -= 60;
godziny++;

}
client_print(id,print_chat,"Grasz juz %ih %imin %is na tym serwerze!", godziny, minuty, sekundy);

return PLUGIN_HANDLED;
}

public plugin_end()
nvault_close(g_vault);



I odczyt do tabeli top15:

#include <amxmodx>
#include <amxmisc>
#include <nvault_util>

#define PLUGIN "Top 15 Czasow"
#define VERSION "1.0"
#define AUTHOR "R3X"

new gszVault[] = "SPPT";

new Array:gTop15Time;
new Array:gTop15Nick;

new giLastBuild = 0;

new gcvarLifeTime;

new gszMotd[1024];
const giMax = sizeof gszMotd;

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);

register_clcmd("say /czasy", "cmdTop15");
gTop15Time = ArrayCreate();
gTop15Nick = ArrayCreate(32);

gcvarLifeTime = register_cvar("amx_top15time_life", "3");
}
public cmdTop15(id){
if((get_gametime() - giLastBuild) > get_pcvar_num(gcvarLifeTime)){
buildTop15() || client_print(id, print_chat, "* Brak pliku z czasami");
}
show_motd(id, gszMotd, "Top15 Czasow Online");
return PLUGIN_HANDLED;
}
getFormatedTime(iTime, szTime[], size){
new hours = iTime/3600;
new days = hours/24;

if(days == 0)
formatex(szTime, size, "%02d:%02d:%02d", hours, iTime%3600/60, iTime%60);
else
formatex(szTime, size, "%ddni %02d:%02d:%02d", days, hours%24, iTime%3600/60, iTime%60);
}
buildTop15(){
ArrayClear(gTop15Time);
ArrayClear(gTop15Nick);

new iVault= nvault_util_open( gszVault );
if(!iVault)
return 0;

nvault_util_readall( iVault , "nvault_util_readall_fwd" );
nvault_util_close( iVault );

new iSize = ArraySize(gTop15Time);

new iLen = 0;
iLen += formatex(gszMotd[iLen], giMax-iLen, "<style>pre{margin: 1px;border-bottom:1px dashed grey}</style>");
iLen += formatex(gszMotd[iLen], giMax-iLen, "Gracze najdluzej przebywajacy na serwerze (gg:mm:ss)");
if(iSize == 0){
iLen += formatex(gszMotd[iLen], giMax-iLen, "<br><font color=red>brak</font>");
}else{
iLen += formatex(gszMotd[iLen], giMax-iLen, "<ol>");
new szName[32], iPlayTime, szPlayTime[32];
for(new i=0;i<iSize;i++){
ArrayGetString(gTop15Nick, i, szName, 31);
iPlayTime = ArrayGetCell(gTop15Time, i);
getFormatedTime(iPlayTime, szPlayTime, 31)

iLen += formatex(gszMotd[iLen], giMax-iLen, "<li><pre>%32s - %s</pre></li>", szName, szPlayTime);
}
iLen += formatex(gszMotd[iLen], giMax-iLen, "</ol>");
}
return 1;
}

get_user_nvaultname(const szKey[], szName[], size){
copy(szName, size, szKey);

new iLen = strlen(szKey);
if(iLen > 9){
szName[iLen-9] = '^0';
}
}
public nvault_util_readall_fwd( iCurrent , iTotal , const szKey[] , const szVal[]){
new szName[32];
new iPlayTime = str_to_num(szVal);

new iSize = ArraySize(gTop15Time);
if(iSize == 0){
ArrayPushCell(gTop15Time, iPlayTime);

get_user_nvaultname(szKey, szName, 31);
ArrayPushString(gTop15Nick, szName);
}else{
for(new i=0;i<iSize;i++){
if(iPlayTime > _:ArrayGetCell(gTop15Time, i)){
ArrayInsertCellBefore(gTop15Time, i, iPlayTime);

get_user_nvaultname(szKey, szName, 31);
ArrayInsertStringBefore(gTop15Nick, i, szName);

if(iSize >= 15){
ArrayDeleteItem(gTop15Time, 15);
ArrayDeleteItem(gTop15Nick, 15);
}
return;
}
}
if(iSize < 15){
ArrayPushCell(gTop15Time, iPlayTime);

get_user_nvaultname(szKey, szName, 31);
ArrayPushString(gTop15Nick, szName);
}
}
}

  • +
  • -
  • 0

#2 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 02.07.2011 13:12

Możesz użyć pluginu Challenge, który bez dodatków nie robi nic poza zliczaniem czasu gry. Mógłbym wtedy machnąć tylko Topkę i nie byłoby źle ;)
  • +
  • -
  • 0

#3 Windowspl

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 7
Nowy

  • Postów:190
  • GG:
  • Imię:Patryk
  • Lokalizacja:Warszawa
Offline

Napisano 02.07.2011 13:15

Jeśli to będzie zliczać łączny czas i pokazywać w say co ileś sec. to spoko.
  • +
  • -
  • 0

#4 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 02.07.2011 13:43

w takim razie nic prostszego :)
Challenge - wyzwania i nagrody - AMXX.pl: Support AMX Mod X

+
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <challenge>

#define PLUGIN "Top15Czasow i czas w sayu"
#define VERSION "1.0"
#define AUTHOR "R3X"

new giMaxPlayers;

new gszUsersTable[64];
new gszMotd[1024+512];
new const giMax = sizeof(gszMotd)


new Handle:gTuple;

getFormatedTime(iTime, szTime[], size){
        new hours = iTime/3600;
        new days = hours/24;
        
        if(days == 0)
                formatex(szTime, size, "%dgodzin i %d minut", hours, iTime%3600/60);
        else
                formatex(szTime, size, "%ddni, %d godzin i %d minut", days, hours%24, iTime%3600/60);
}



public plugin_init() {
	state mysql;
	
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	set_task(300.0, "pokaz_czas_gry", 34567, _, _,"b");
	
	giMaxPlayers = get_maxplayers();
	
	register_clcmd("say /czasy", "showTop15");
}

public plugin_cfg(){
	new szType[10];
	get_cvar_string("amx_challenge_sqltype", szType, 9);
	
	new szOld[10];
	SQL_GetAffinity(szOld, 9);
	
	if(equali(szType, "mysql"))
		state mysql;
	else if(equali(szType, "sqlite"))
		state sqlite;
	else
		set_fail_state("Invalid affinity. Must be sqlite or mysql)");
		
	strtolower(szType);
	
	if(!equali(szOld, szType)){
		if(!SQL_SetAffinity(szType))
			log_amx("Failed to set affinity");
	}
			
	new szHost[64], szUser[64], szPass[64], szDB[64], szPrefix[32];
	get_cvar_string("amx_challenge_host", szHost, 63);
	get_cvar_string("amx_challenge_user", szUser, 63);
	get_cvar_string("amx_challenge_pass", szPass, 63);
	get_cvar_string("amx_challenge_db", szDB, 63);
	
	get_cvar_string("amx_challenge_prefix", szPrefix, 31);
	formatex(gszUsersTable, 63, "%susers", szPrefix);
	
	
	gTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB, 0);
	if(gTuple == Empty_Handle){
		set_fail_state("Nie mozna utworzyc uchwytu danych!");
		return;
	}	
}

public pokaz_czas_gry(){
	new szTime[32];
	for(new id=1;id<=giMaxPlayers;id++)
		if(is_user_connected(id)){
			getFormatedTime(ch_get_user_played_time(id), szTime, 31);
			client_print(id,print_chat,"Grasz juz %s!", szTime);

		}
}

public showTop15(id)<sqlite>{
	client_print(id, print_chat, "Nie zaimplementowane!");
	return PLUGIN_HANDLED;
}

public showTop15(id)<mysql>{
	new data[1];
	data[0] = id;
	
	SQL_ThreadQuery(gTuple, "handleLoadTop15", 
		"SELECT nickname, playedtime FROM `users` ORDER BY playedtime DESC LIMIT 15",
		data, sizeof(data));
	return PLUGIN_HANDLED;
}

public handleLoadTop15(failstate, Handle:query, error[], errnum, data[], size){
	if(failstate != TQUERY_SUCCESS){
		log_amx("<Query> Error: %s", error);
		return;
	}
	
	new id = data[0];
	if(!is_user_connected(id)) return;
	
	buildTop15HTML(query);
	show_motd(id, gszMotd, "Top czasow Online");
}

public buildTop15HTML(Handle:query){
	new iLen = 0;
	iLen += formatex(gszMotd[iLen], giMax-iLen, "<style>pre{margin: 1px;border-bottom:1px dashed grey}</style>");
	iLen += formatex(gszMotd[iLen], giMax-iLen, "Gracze najdluzej przebywajacy na serwerze (gg:mm:ss)");
	if(SQL_NumRows(query)== 0){
		iLen += formatex(gszMotd[iLen], giMax-iLen, "<br><font color=red>brak</font>");
	}else{
		iLen += formatex(gszMotd[iLen], giMax-iLen, "<ol>");
		new szName[32], iPlayTime, szPlayTime[32];
		while(SQL_MoreResults(query)){
			SQL_ReadResult(query, 0, szName, 31);
			iPlayTime = SQL_ReadResult(query, 1);
			getFormatedTime(iPlayTime, szPlayTime, 31)
				
			iLen += formatex(gszMotd[iLen], giMax-iLen, "<li><pre>%32s - %s</pre></li>", szName, szPlayTime);
			SQL_NextRow(query);
		}
		iLen += formatex(gszMotd[iLen], giMax-iLen, "</ol>");
        }
}

Jak chcesz to mogę popracować nad poprawnością odmiany słów dni, godzin i minut, żeby np 60sekund gry nie pokazywało napisu

1 minut

Załączone pliki


  • +
  • -
  • 0

#5 Windowspl

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 7
Nowy

  • Postów:190
  • GG:
  • Imię:Patryk
  • Lokalizacja:Warszawa
Offline

Napisano 02.07.2011 15:39

Można w tamtym pluginie wyłączyć wyzwania ? Bo ja chcę żeby zapisywało sam czas. Zero zadań.

Dodano 02 lipiec 2011 - 15:45:
Gdy wpisze /czasy to mi crashuje serwa. Z poprzednim pluginem miałem też tak. Nie wiem o co chodzi.

Użytkownik Windowspl edytował ten post 02.07.2011 15:46

  • +
  • -
  • 0

#6 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 02.07.2011 16:25

Tam zadania dodaje się przez dodatkowe pluginy, dopóki ich nie dołożysz nie będzie zadań. możesz nawet wyłączyć komendę say /challenge dzięki cvarowi
amx_challenge_list_available 0

Po crashu są jakieś logi? Sprawdź dane od połączenia z MySQLem
amx_challenge_sqltype 	"mysql"
amx_challenge_host 	"localhost"
amx_challenge_user 	"root"
amx_challenge_pass 	"root"
amx_challenge_db 	"challenge"
amx_challenge_prefix 	""

  • +
  • -
  • 0

#7 olek0017

    Pomocny

  • Zbanowany

Reputacja: 11
Początkujący

  • Postów:71
  • Lokalizacja:Pyskowice
Offline

Napisano 02.07.2011 16:30

jak wrócę do domu to napisze prosty plugin y czasem na sql

#8 Windowspl

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 7
Nowy

  • Postów:190
  • GG:
  • Imię:Patryk
  • Lokalizacja:Warszawa
Offline

Napisano 02.07.2011 16:43

Nie ma logów.
Dane do sql są dobre.
Na tym poprzednim pluginie też tak miałem wpisywało się /czasy i się crashował ;/
Wina Call of Duty moda może być ?
  • +
  • -
  • 0

#9 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 02.07.2011 16:48

Tam serwer mógł nie wytrzymać odczytu dużego pliku, ale zapytanie asynchroniczne nie blokuje serwera. Korzystałeś na tym serwerze z bazy danych kiedyś? Może firewall blokuje 3306`ty?
  • +
  • -
  • 0

#10 Windowspl

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 7
Nowy

  • Postów:190
  • GG:
  • Imię:Patryk
  • Lokalizacja:Warszawa
Offline

Napisano 02.07.2011 16:50

Normalnie działa mi jeden plugin na sql.
Mój hosting serwera to pukawka.pl

Dodano 03 lipiec 2011 - 13:05:
Już się nie crashuje ale jak wpisze /czasy to cały czas pisze brak

Użytkownik Windowspl edytował ten post 02.07.2011 16:50

  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych