Skocz do zawartości
Paweł

[CS:GO] Kredyty

Rekomendowane odpowiedzi

1. O Pluginie

Spoiler
  • Plugin wprowadza na serwer customową walutę.
  • Plugin posiada podłączenie do bazy danych.

 

2. Komendy

Spoiler
  • sm_dodajc <nick> <ilosc>  - Dodaje graczowi podaną ilość kredytów.
  • sm_setc <nick> <ilosc> - Ustawia graczowi podaną ilość kredytów. 
  • sm_sprawdzc <nick> - Sprawdza ilość kredytów gracza.
  • sm_kredyty - Dostajemy info na chacie o ilości naszych kredytów.
  • sm_credits - Dostajemy info na chacie o ilości naszych kredytów.

 

3. Instalacja

Spoiler
  • Plik .smx wrzucamy do addons/sourcemod/plugins/
  • Plik .sp wrzucamy do addons/sourcemod/scripting/
  • Plik .inc wrzucamy do addons/sourcemod/scripting/include/yamakashiplugins/

"Yamakashi_Credits"
{
	"driver" 			"mysql"
	"host"				"IP bazy danych"
	"database" 			"Nazwa bazy danych"
	"user" 				"Nazwa użytkownika"
	"pass" 				"Hasło do bazy danych"
	//"timeout" 		"0"
	//"port" 			"0"
}

 

 

4. Dodatkowe informacje

Spoiler
  • Brak

 

5. Download

Spoiler

 

Edytowane przez Yamakashi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 godzinę temu, Roberrt napisał:

To bardziej dla „programistów” którzy DB nie umieją używać bo na serwery to jest useless

Dlaczego useless? Jeśli ktoś jeszcze nie do końca radzi sobie z MySQL, a stawia kolejne kroki, taki gotowiec może okazać się bardzo przydatny. Nie widzę przeciwwskazań żeby tego pluginu używać ?

 

Super robota, na pewno okaże się pomocne dla niektórych (y)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Gdybym miał uczyć się sql, natywów i forwardów, to wszystkie te rzeczy są tutaj. Czego chcieć więcej ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
9 minut temu, MAGNET napisał:

?

Mamy taki system kredytów na AS. Plugin z tematu to odwzorowanie naszego. XD

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Fakt, nie złapałem do końca ?

Niemniej uważam że plugin nie jest useless, bo często jest potrzeba używania innej waluty niż domyślna, a tutaj mamy gotowe rozwiązanie. Przykład: cod mod

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mogę spytać pod co można te kredyty podpiąć? w sensie pod jaki plugin?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
7 minut temu, Shadow napisał:

mogę spytać pod co można te kredyty podpiąć? w sensie pod jaki plugin?

Ten plugin dodaje kredyty na serwer, podpiąć to możesz pod każdy plugin który chcesz. np. flip, jackpot, ruletka, dice, kamień papier nożyce.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
9 godzin temu, Shadow napisał:

mogę spytać pod co można te kredyty podpiąć? w sensie pod jaki plugin?

Użyj tylko forwardów z pluginu i możesz go podpiąć pod co chcesz ;) 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Gdyby ktoś chciał plugin, który dodaje kredyty za zabójstwa do tego systemu:

 

#include <sourcemod>
#include <yamakashiplugins/kredyty>

public OnPluginStart()
{
	HookEvent("player_death",  EventPlayer_Death);
	LoadTranslations("common.phrases.txt");
}

public Action:EventPlayer_Death(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"))
	new bool:headshot = GetEventBool(event, "headshot")
		
	if(headshot)
	{
		shop_set_bonus_credits(attacker, 2)
	}
	else
	{
		shop_set_bonus_credits(attacker, 1)
	}

	return Plugin_Handled
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzisiaj wrzucę update pluginu. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Update:

  • Zmiana nazw nativów.
  • Dodanie logów.
  • Zabezpieczenie przed utraceniem kredytów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Cytat

Dodanie logów.

Mogę śmiało wywalić te logi? Bo nie są mi zbytnio potrzebne...

 

Cytat

Zabezpieczenie przed utraceniem kredytów. 

W jaki sposób dokładnie? Jeśli można wiedzieć 🙂

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wersja bez logów:

Spoiler

/************** CHANGELOG **************
/
/	1.0 - Pierwsze wydanie pluginu.
/	1.1 - Naprawienie bugów.
/	1.2 - Update całego kodu.
/
****************************************/

/* [ Includes ] */
#include <sourcemod>
#include <multicolors>
#include <yPlugins/credits>

/* [ Compiler Options ] */
#pragma semicolon 1
#pragma newdecls required

/* [ Defines ] */
#define Table_Credits 		"Yamakashi_Kredyty"
#define PluginTag 			"{darkred}[ {lightred}★{darkred} Kredyty {lightred}★ {darkred}]{default}"

/* [ Handles ] */
Handle Databases;

/* [ Integers ] */
int g_iDatabase = 0;
int g_iCredits[MAXPLAYERS + 1];

/* [ Booleans ] */
bool g_bIsDataLoaded[MAXPLAYERS + 1];

/* [ Plugin Author and Informations ] */
public Plugin myinfo =
{
	name = "[CS:GO] Credits",
	author = "Yamakashi",
	description = "System walutowy na serwery.",
	version = "1.2",
	url = "https://steamcommunity.com/id/yamakashisteam"
};

/* [ Natives ] */
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
	CreateNative("shop_add_credits", Native_AddCredits);
	CreateNative("shop_get_credits", Native_GetCredits);
	CreateNative("shop_set_credits", Native_SetCredits);
	
	RegPluginLibrary("credits");
	return APLRes_Success;
}

/* [ Plugin Startup ] */
public void OnPluginStart()
{
	/* [ Admin Commands ] */
	RegAdminCmd("sm_addc", AddCredits_CMD, ADMFLAG_ROOT, "[Credits] Komenda do dodawania kredytów.");
	RegAdminCmd("sm_chcekc", CheckCredits_CMD, ADMFLAG_ROOT, "[Credits] Komenda do sprawdzenia kredytów gracza.");
	RegAdminCmd("sm_setc", SetCredits_CMD, ADMFLAG_ROOT, "[Credits] Komenda do ustawienia kredytów gracza.");
	
	/* [ Client Commands ] */
	RegConsoleCmd("sm_credits", Credits_CMD, "[Credits] Pokazuje ilość naszych kredytów na chacie.");
	RegConsoleCmd("sm_przelew", GiveCredits_CMD, "[Credits] Oddaje wybranemu graczowi kredytów.");
	RegConsoleCmd("sm_give", GiveCredits_CMD, "[Credits] Oddaje wybranemu graczowi kredytów.");
	
	/* [ Database ] */
	DatabaseConnect();
	
	/* [ Translations ] */
	LoadTranslations("common.phrases");
	
	/* [ Check Player ] */
	for(int i = 1; i <= MaxClients; i++)
		if(IsValidClient(i))
			OnClientPutInServer(i);
	
}

/* [ Standart Actions ] */
public void OnClientPutInServer(int client)
{
	g_iCredits[client] = 0;
	g_bIsDataLoaded[client] = false;
	PrepareLoadData(client);
	CreateTimer(50.0, SaveData_Timer, client, TIMER_FLAG_NO_MAPCHANGE);
}

public void OnClientDisconnect(int client)
{
	UpdateCredits(client);
	g_iCredits[client] = 0;
}

public void OnMapEnd()
{
	for(int i = 1; i <= MaxClients; i++)
		if(IsValidClient(i))
			UpdateCredits(i);
}

public void OnPluginEnd()
{
	for(int i = 1; i <= MaxClients; i++)
		if(IsValidClient(i))
			UpdateCredits(i);
}

/* [ Timers ] */
public Action SaveData_Timer(Handle timer, any client)
{
	if(!IsValidClient(client)) return Plugin_Continue;
		
	UpdateCredits(client);
	CreateTimer(55.0, SaveData_Timer, client, TIMER_FLAG_NO_MAPCHANGE);
	return Plugin_Continue;
}

/* [ Commands ] */
public Action AddCredits_CMD(int client, int args)
{
	char arg1[64], arg2[10];
	GetCmdArg(1, arg1, sizeof(arg1));
	GetCmdArg(2, arg2, sizeof(arg2));
	
	int target = FindTarget(0, arg1);
	int Credits = StringToInt(arg2);
	
	if(IsValidClient(target))
	{
		if(!AddCredits(target, Credits))
		{
			PrintToConsole(client, "[X Credits X] Nie odnaleziono wybranego gracza!");
			return Plugin_Continue;
		}
		PrintToConsole(client, "[✔ Credits ✔] Dodano graczowi %N (%i) kredytów.", target, Credits);
		UpdateCredits(target);
	}
	else
		PrintToConsole(client, "[X Credits X] Nie odnaleziono wybranego gracza!");
	
	return Plugin_Continue;
}

public Action CheckCredits_CMD(int client, int args)
{
	char arg1[64];
	GetCmdArg(1, arg1, sizeof(arg1));
	
	int target = FindTarget(0, arg1);
	
	if(IsValidClient(target))
		PrintToConsole(client, "[✔ Credits ✔] Gracz %N posiada (%i) kredytów.", target, GetCredits(target));
	else
		PrintToConsole(client, "[X Credits X] Nie odnaleziono wybranego gracza!");
}

public Action SetCredits_CMD(int client, int args)
{
	char arg1[64], arg2[10];
	GetCmdArg(1, arg1, sizeof(arg1));
	GetCmdArg(2, arg2, sizeof(arg2));
	
	int target = FindTarget(0, arg1);
	int Credits = StringToInt(arg2);
	
	if(IsValidClient(target))
	{
		if(!SetCredits(target, Credits))
		{
			PrintToConsole(client, "[X Credits X] Nie odnaleziono wybranego gracza!");
			return Plugin_Continue;
		}
		PrintToConsole(client, "[✔ Credits ✔] Ustawiono graczowi %N (%i) kredytów.", target, Credits);
		UpdateCredits(target);
	}
	else
		PrintToConsole(client, "[X Credits X] Nie odnaleziono wybranego gracza!");
	
	return Plugin_Continue;
}

public Action Credits_CMD(int client, int args)
{
	if(!IsValidClient(client)) return Plugin_Continue;
	
	CPrintToChat(client, "{darkred}---------------------------------------");
	CPrintToChat(client, "%s {lime}Posiadasz {lightred}%d {lime}kredytów.", PluginTag, GetCredits(client));
	CPrintToChat(client, "{darkred}---------------------------------------");
	return Plugin_Continue;
}

public Action GiveCredits_CMD(int client, int args)
{
	if(!IsValidClient(client)) return Plugin_Continue;
	
	char arg1[32], arg2[10];
	GetCmdArg(1, arg1, sizeof(arg1));
	GetCmdArg(2, arg2, sizeof(arg2));
	
	int target = FindTarget(0, arg1);
	int Credits = StringToInt(arg2);
	int client_Credits = GetCredits(client);
	
	if(client_Credits < Credits)
	{
		CPrintToChat(client, "%s Nie posiadasz tylu kredytów.", PluginTag);
		return Plugin_Handled;
	}
	else if(Credits < 0)
	{
		CPrintToChat(client, "%s Nie możesz oddać minusowej ilości kredytów.", PluginTag);
		return Plugin_Handled;
	}
	else if(Credits == 0)
	{
		CPrintToChat(client, "%s Nie możesz oddać zerowej ilości kredytów.", PluginTag);
		return Plugin_Handled;
	}
	else if(args < 2)
	{
		CPrintToChat(client, "%s Niepoprawne użycie: {lightred}!przelew <nick> <ilość>{default}.", PluginTag);
		return Plugin_Handled;
	}
	else if(!IsValidClient(target))
	{
		CPrintToChat(client, "%s Ten gracz nie jest już online.", PluginTag);
		return Plugin_Handled;
	}
	else
	{
		CPrintToChat(client, "%s {lime}Przekazałeś graczowi {lightred}%N {orchid}%i{lime} kredytów.", PluginTag, target, Credits);
		CPrintToChat(target, "%s {lime}Otrzymałeś od gracza {lightred}%N {orchid}%i{lime} kredytów.", PluginTag, client, Credits);
		AddCredits(target, Credits);
		AddCredits(client, -Credits);
		UpdateCredits(target);
		UpdateCredits(client);
	}
	return Plugin_Handled;
}

/* [ Database Actions ] */
public Action DatabaseConnect()
{
	char error[512];
	Databases = SQL_Connect("Yamakashi_Credits", true, error, sizeof(error));
	if(Databases == INVALID_HANDLE)
	{
		LogError("[X Credits X] Error podczas polaczenia z baza: %s", error);
		g_iDatabase = 0;
	}
	else if(g_iDatabase < 1)
	{
		g_iDatabase++;
		char Query_Credits[1024];
		Format(Query_Credits, sizeof(Query_Credits), "CREATE TABLE IF NOT EXISTS `%s` (`SteamID` VARCHAR(64) NOT NULL, `Nick` VARCHAR(64) NOT NULL, `Credits` INT NOT NULL, UNIQUE KEY `SteamID` (`SteamID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;", Table_Credits);
		
		SQL_LockDatabase(Databases);
		SQL_FastQuery(Databases, Query_Credits);
		SQL_UnlockDatabase(Databases);
		DatabaseConnect();
	}
}

public Action PrepareLoadData(int client)
{
	if(!IsValidClient(client)) return Plugin_Continue;
		
	if (!g_iDatabase)
		CPrintToChat(client, "%s Wystapil blad!", PluginTag);
	else
	{
		char Query_Credits[1024], AuthID[64];
		GetClientAuthId(client, AuthId_Steam2, AuthID, sizeof(AuthID));
	
		Format(Query_Credits, sizeof(Query_Credits), "SELECT `Credits` FROM `%s` WHERE `SteamID` LIKE '%s';", Table_Credits, AuthID);
		SQL_TQuery(Databases, LoadCredits, Query_Credits, client);
	}
	return Plugin_Continue;
}

public void LoadCredits(Handle owner, Handle query, const char[] error, any client)
{
	if(query == INVALID_HANDLE)
	{
		LogError("[X Credits X] Error podczas wczytywania: %s", error);
		return;
	}
	if(SQL_GetRowCount(query))
	{
		while(SQL_MoreRows(query))
		{
			while(SQL_FetchRow(query))
			{
				g_iCredits[client] = SQL_FetchInt(query, 0);
			}
		}
		g_bIsDataLoaded[client] = true;
	}
	else
		SavePlayer(client);

}

public Action SavePlayer(int client)
{
	if(!g_iDatabase) return Plugin_Continue;
	if(!IsValidClient(client)) return Plugin_Continue;
	
	char Query_Credits[1024], AuthID[64], Nick[MAX_NAME_LENGTH], Safe_Nick[MAX_NAME_LENGTH * 2];
	GetClientName(client, Nick, MAX_NAME_LENGTH);
	SQL_EscapeString(Databases, Nick, Safe_Nick, sizeof(Safe_Nick));
	GetClientAuthId(client, AuthId_Steam2, AuthID, sizeof(AuthID));
	
	Format(Query_Credits, sizeof(Query_Credits), "INSERT INTO `%s` (`SteamID`, `Nick`, `Credits`) VALUES ('%s', N'%s', '%i') ON DUPLICATE KEY UPDATE `Credits`=VALUES(`Credits`);", Table_Credits, AuthID, Safe_Nick, g_iCredits[client]);
	SQL_TQuery(Databases, Credits_Handler, Query_Credits, client);
	return Plugin_Continue;
}

public void Credits_Handler(Handle owner, Handle query, const char[] error, any client)
{
	if(query == INVALID_HANDLE)
	{
		LogError("[ X Credits X ]  Error podczas zapisywania danych: %s", error);
		return;
	}
	else
		g_bIsDataLoaded[client] = true;
}

public Action UpdateCredits(int client)
{
	if(!g_iDatabase) return Plugin_Continue;
	if(!g_bIsDataLoaded[client]) return Plugin_Continue;
	if(!IsValidClient(client)) return Plugin_Continue;
	
	char Query_Credits[1024], authid[64];
	GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid));
	Format(Query_Credits, sizeof(Query_Credits), "UPDATE `%s` SET `Credits`='%i' WHERE `SteamID`='%s';", Table_Credits, g_iCredits[client], authid);
	SQL_TQuery(Databases, Credits_Handler, Query_Credits, client);
	return Plugin_Continue;
}

/* [ Natives ] */
public bool AddCredits(int client, int value)
{
	if(IsValidClient(client))
	{
		g_iCredits[client] += value;
		UpdateCredits(client);
		return true;
	}
	return false;
}

public int Native_AddCredits(Handle plugin, int numParams)
{
	int client = GetNativeCell(1);
	if(IsValidClient(client))
	{
		g_iCredits[client] += GetNativeCell(2);
		UpdateCredits(client);
		return 1;
	}
	return 0;
}

public int GetCredits(int client)
{
	if(IsValidClient(client))
		return g_iCredits[client];
	return 0;
}

public int Native_GetCredits(Handle plugin, int numParams)
{
	return GetCredits(GetNativeCell(1));
}

public bool SetCredits(int client, int value)
{
	if(IsValidClient(client))
	{
		g_iCredits[client] = value;
		UpdateCredits(client);
		return true;
	}
	return false;
}

public int Native_SetCredits(Handle plugin, int numParams)
{
	int client = GetNativeCell(1);
	if(IsValidClient(client))
	{
		g_iCredits[client] = GetNativeCell(2);
		UpdateCredits(client);
		return 1;
	}
	return 0;
}

/* [ Helpers ] */
stock bool IsValidClient(int client)
{
	if(client <= 0 ) return false;
	if(client > MaxClients) return false;
	if(!IsClientConnected(client)) return false;
	if(IsFakeClient(client)) return false;
	return IsClientInGame(client);
}

 

 

Edytowane przez Yamakashi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli gracz nie posiada aktywnego booleana g_bIsDataLoaded to nie zapisze jego kredytów w bazie danych. Boolean aktywuje się przy poprawnym wczytaniu danych lub po poprawnym wpisaniu gracza do bazy danych ^.^  .

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...