Paweł 6 Napisano 21 Stycznia 2019 (edytowane) 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 Kredyty.rarHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Edytowane 25 Sierpnia 2019 przez Yamakashi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 22 Stycznia 2019 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) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 22 Stycznia 2019 Gdybym miał uczyć się sql, natywów i forwardów, to wszystkie te rzeczy są tutaj. Czego chcieć więcej ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
xBonio 1 Napisano 22 Stycznia 2019 XD Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 22 Stycznia 2019 ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Avgariat 1 Napisano 22 Stycznia 2019 9 minut temu, MAGNET napisał: ? Mamy taki system kredytów na AS. Plugin z tematu to odwzorowanie naszego. XD Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 22 Stycznia 2019 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Jokersik Napisano 23 Marca 2019 @Yamakashi mozna link do pobrania ? ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
ErwinH2K 1 Napisano 23 Marca 2019 41 minut temu, Jokersik napisał: @Yamakashi mozna link do pobrania ? ? Nie wiem czy to obecna wersja, lecz łap: https://www81.zippyshare.com/v/MO4hNYnF/file.htmlHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Shadow Napisano 24 Marca 2019 mogę spytać pod co można te kredyty podpiąć? w sensie pod jaki plugin? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 24 Marca 2019 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł Napisano 24 Marca 2019 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 ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
BulgaR Napisano 14 Sierpnia 2019 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 } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 14 Sierpnia 2019 Dzisiaj wrzucę update pluginu. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 14 Sierpnia 2019 Update: Zmiana nazw nativów. Dodanie logów. Zabezpieczenie przed utraceniem kredytów. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
BulgaR Napisano 14 Sierpnia 2019 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ć 🙂 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 14 Sierpnia 2019 (edytowane) 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 14 Sierpnia 2019 przez Yamakashi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
BulgaR Napisano 14 Sierpnia 2019 A co do 2 pytania 🙂 ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 15 Sierpnia 2019 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 ^.^ . Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach