←  Pytania dotyczące pluginów

AMXX.pl: Support AMX Mod X i SourceMod

»

Prośba o przerobienie pluginu

  • +
  • -
EbuBebu - zdjęcie EbuBebu 21.03.2020

Witam, posiadam taki o to plugin: 

#include < amxmodx >
#include < sqlx >

new sqlConfig[ ][ ] = {
	"127.0.0.1",
	"root",
	"password",
	"database"
}

enum playerData {
	SteamID[ 33 ],
	IP[ 16 ],
	Nick[ 64 ],
	Time
};

new Handle: gSqlTuple;

new gPlayer[ 33 ][ playerData ];

public SqlInit( ) {
	gSqlTuple = SQL_MakeDbTuple( sqlConfig[ 0 ], sqlConfig[ 1 ], sqlConfig[ 2 ], sqlConfig[ 3 ] );
	
	if( gSqlTuple == Empty_Handle )
		set_fail_state( "Nie mozna utworzyc uchwytu do polaczenia" );
	
	new iErr, szError[ 32 ];
	new Handle:link = SQL_Connect( gSqlTuple, iErr, szError, 31 );
	
	if( link == Empty_Handle ) {
		log_amx( "Error (%d): %s", iErr, szError );
		set_fail_state( "Brak polaczenia z baza danych" );
	}
	
	new Handle: query;
	query = SQL_PrepareQuery( link, "CREATE TABLE IF NOT EXISTS `players_time` (\
		`id` int(11) NOT NULL AUTO_INCREMENT,\
		`steamid` varchar(33) NOT NULL,\
		`nick` varchar(64) NOT NULL,\
		`ip` varchar(16) NOT NULL,\
		`first` int(16) NOT NULL,\
		`last` int(16) NOT NULL,\
		`time` int(16) NOT NULL,\
		`type` int(1) NOT NULL,\
		PRIMARY KEY (`id`),\
		UNIQUE KEY `authid` (`nick`)\
	)" );
	
	SQL_Execute( query );
	SQL_FreeHandle( query );
	SQL_FreeHandle( link );
}

public Query( failstate, Handle:query, error[ ] ) {
	if( failstate != TQUERY_SUCCESS ) {
		log_amx( "SQL query error: %s", error );
		return;
	}
}

public plugin_init() {
	register_plugin( "Czas Online", "2.1.0", "byCZEK" );
	
	set_task( 0.1, "SqlInit" );
}

public client_connect( id ) {
	gPlayer[ id ][ Time ] = 0;
	
	get_user_authid( id, gPlayer[ id ][ SteamID ], 32 );
	get_user_ip( id, gPlayer[ id ][ IP ], 15, 1 );
	get_user_name( id, gPlayer[ id ][ Nick ], 63 );
	
	SQL_PrepareString( gPlayer[ id ][ Nick ], gPlayer[ id ][ Nick ], 63 );
}

public client_disconnect( id ) {
	if(is_user_hltv(id) || is_user_bot(id))
		return PLUGIN_HANDLED;
		
	gPlayer[ id ][ Time ] = get_user_time( id, 1 );
	
	saveTime( id );
	
	gPlayer[ id ][ Time ] = 0;
	
	return PLUGIN_CONTINUE;
}

stock SQL_PrepareString( const szQuery[], szOutPut[], size ) {
	copy( szOutPut, size, szQuery );
	replace_all( szOutPut, size, "'", "\'" );
	replace_all( szOutPut, size, "`", "\`" );    
	replace_all( szOutPut, size, "\\", "\\\\" );
	replace_all( szOutPut, size, "^0", "\0");
	replace_all( szOutPut, size, "^n", "\n");
	replace_all( szOutPut, size, "^r", "\r");
	replace_all( szOutPut, size, "^x1a", "\Z");	
}

stock saveTime( id ) {
	new     query[ 1024 ],
	flags = get_user_flags( id );
	
	formatex( query, charsmax( query ), "INSERT IGNORE INTO `players_time` ( `steamid`, `nick`, `ip`, `first`, `last`, `time`, `type` ) VALUES ( '%s', '%s', '%s', UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(NOW()), %d, %d ) ON DUPLICATE KEY UPDATE `time` = `time` + %d, `last` = UNIX_TIMESTAMP(NOW())",
	gPlayer[ id ][ SteamID ], gPlayer[ id ][ Nick ], gPlayer[ id ][ IP ], gPlayer[ id ][ Time ], ( ( flags > 0 && !( flags & ADMIN_USER ) ) ? 1 : 0 ), gPlayer[ id ][ Time ]);
	
	if( gSqlTuple )
		SQL_ThreadQuery (gSqlTuple, "Query", query );
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/

Czy jest możliwość dodania do niego jeszcze jednej kolumny? Mianowicie " Tygodniowy czas online " ? Chciałbym aby ta nowa kolumna resetowała się co tydzień o np. północy. Czy takie coś jest w ogóle możliwe do zrobienia? 

 

Pozdrawiam serdecznie i z góry dziękuję wszystkim za pomoc! :D  

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 21.03.2020

Dałoby sie i nie jest to takie trudne.

Wymagałoby tylko dodania eventu do bazy danych lub zamieszczenia w pluginie resetowania tego.

Moge Ci to zrobić, ale aktualnie nie mam zbyt wiele czasu. Pingnij mnie jutro wieczorem

Odpowiedz

  • +
  • -
EbuBebu - zdjęcie EbuBebu 22.03.2020

Dałoby sie i nie jest to takie trudne.

Wymagałoby tylko dodania eventu do bazy danych lub zamieszczenia w pluginie resetowania tego.

Moge Ci to zrobić, ale aktualnie nie mam zbyt wiele czasu. Pingnij mnie jutro wieczorem

Nie do konca rozumiem co to znaczy "pingnij mnie" ale dziękuję bardzo za chęć pomocy. Jesteś mega :D 

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 23.03.2020

Łap i testuj. nie daje głowy ze to zadziala, ale powinno.

Wymagany jest reset bazy - trzeba usunac tabele players_time - plugin stworzy nową strukture.

Zobacz czy plugin będzie resetował dobrze. 

new const RESET_TIME = 60 * 60 * 24 * 7;

tu ustawiasz co ile resetowac (w sekundach)

jest ustawione na tydzien, ale mozesz sb zmienic na 20minut na przyklad zeby przetestowac.

Jak co to daj znac i sie poprawi

Załączone pliki


Użytkownik TibacK edytował ten post 23.03.2020 10:17
Odpowiedz

  • +
  • -
EbuBebu - zdjęcie EbuBebu 23.03.2020

Łap i testuj. nie daje głowy ze to zadziala, ale powinno.

Wymagany jest reset bazy - trzeba usunac tabele players_time - plugin stworzy nową strukture.

Zobacz czy plugin będzie resetował dobrze. 

new const RESET_TIME = 60 * 60 * 24 * 7;

tu ustawiasz co ile resetowac (w sekundach)

jest ustawione na tydzien, ale mozesz sb zmienic na 20minut na przyklad zeby przetestowac.

Jak co to daj znac i sie poprawi

 

Na wstępie dzięki za pomoc mordo!   :ok:

 

Niestety coś jest chyba nie tak, ustawiłem time na: new const RESET_TIME = 60 * 5 * 1 * 1;

Myślałem, że będzie resetować co 5 minut jednak resetuje tylko podczas zmiany mapy. Kiedy mapę zmienię np. po minucie od poprzedniej również resetuje czas. 

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 23.03.2020

Jasne, że nie działa...

Wszystko zrobiłem poza aktualizowaniem czasu ostatniego resetu, ale dobrze wiedzieć, że to co jest to działa.

Wrzucam poprawke. Przed odpaleniem serwa usuń sobie plik resetTime.txt z folderu data i wtedy odpal serwer i powinien sie stworzyc

Reszta bez zmian.


Rivit (23.03.2020 21:59):
Ale to jest tak zrobione, że jak juz będzie usuwać to przy zmianie mapy. tak prościej ;)

Załączone pliki

Odpowiedz

  • +
  • -
EbuBebu - zdjęcie EbuBebu 23.03.2020

Jasne, że nie działa...

Wszystko zrobiłem poza aktualizowaniem czasu ostatniego resetu, ale dobrze wiedzieć, że to co jest to działa.

Wrzucam poprawke. Przed odpaleniem serwa usuń sobie plik resetTime.txt z folderu data i wtedy odpal serwer i powinien sie stworzyc

Reszta bez zmian.

Działa :o

Ale sztos, dzięki wielkie! Możesz mi tylko wyjaśnić jeszcze w jaki sposób dokładniej to działa?

 

Jak ustawię na 5 minut to resetuje za każdym razem kiedy jest np. 22:06 , 22:11, 22:16 itd. więc żeby resetowało mi co tydzień muszę plugin uruchomić właśnie o północy dnia którego chce żeby były resety.  Dobrze rozumiem? :D

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 23.03.2020


więc żeby resetowało mi co tydzień muszę plugin uruchomić właśnie o północy dnia którego chce żeby były resety

 

Wiesz co wydaje mi sie po prostu ze wystarczy edytowac pliczek resetTime.txt i w nim ustawić czas startowy (w przód), a potem z automatu się co tydzien bedzie resetowac.

Plugin nie bedzie resetował, aż do momentu gdy czas z resetTime.txt + 'czas tygodnia' < obecny czas (jak sie zastanowisz nad tym to to ma sens ;) )

W jakim formacie jest zapisany czas w resetTime.txt poczytasz tu:

https://pl.wikipedia...i/Czas_uniksowy

https://www.unixtime...p.com/index.php

 

Ale uwaga - twój serwer może miec ustawioną inną strefę czasową lub może być godzine w przód lub tył. Dlatego pasowałoby napisać prosty plugin, któremu podasz date w formacie czytelnym dla człowieka, a on to zamieni na unix time i będzie cacy

Odpowiedz

  • +
  • -
EbuBebu - zdjęcie EbuBebu 26.03.2020

 

Ale uwaga - twój serwer może miec ustawioną inną strefę czasową lub może być godzine w przód lub tył. Dlatego pasowałoby napisać prosty plugin, któremu podasz date w formacie czytelnym dla człowieka, a on to zamieni na unix time i będzie cacy

 

 

A byłbyś w stanie mi coś takiego szybko na kolanie naskrobać? :D 

Odpowiedz