Skocz do zawartości

kox1906

Użytkownik
  • Liczba zawartości

    46
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    2

Ostatnia wygrana kox1906 w dniu 19 Września

Użytkownicy przyznają kox1906 punkty reputacji!

Reputacja

15 Początkujący

O mnie

  • Imię
    Kuba
  • Lokalizacja
    Polska

Ostatnie wizyty

Blok z ostatnimi odwiedzającymi dany profil jest wyłączony i nie jest wyświetlany użytkownikom.

  1. Cześć, Tworzę ten poradnik, z tego powodu, że na internecie ciężko znaleźć cokolwiek o overlay'ach, nie mówiąc już o poradniku jak wszystko stworzyć i skonfigurować, a dla mnie było to piekielnie ciężkie i męczyłem się z tym naprawdę długo. Skoro już ogarnąłem jak to wszystko działa dziś pokażę Wam od zera jak zrobić i skonfigurować overlay'e na serwer. Napiszemy bardzo prosty plugin, który po zabójstwie headshot'em będzie wyświetlał overlay'a "Headshot" przez 2 sekundy, a także w tym momencie będzie efekt dźwiękowy "Headshot". 1. PRZYGOTOWANIE WŁASNEGO OVERLAY'A 1. Zaczniemy od przygotowania overlay'a takiego, jakiego chcemy. Do tego celu będziemy potrzebować jakiś program do obróbki zdjęć: najlepiej Gimp. Moim overlay'em będzie napis, więc zaopatrzam się w ładną czcionkę [https://fonts.google.com/] 2. Tworzę nowy plik w Gimpie, według mnie najlepsze wymiary są takie jak na zdjęciu, bo wszystko jest wyraźne (im większa rozdzielczość tym więcej plik końcowy będzie ważył) 3. Jeśli naszym overlay'em jest napis - piszemy coś na pustej stronie, jeśli obrazek - wklejamy go na nowo utworzony plik [Otwórz -> wybieramy obrazek] 4. Usuwamy warstwę "Tło" 1. PPM na "tło" 2. Usuń warstwę 5. Powinniśmy otrzymać taki efekt: 6. [BARDZO WAŻNE] Plik eksportujemy jako plik *.tga 7. Graficznie nasz overlay jest zrobiony, pozostało umożliwić serwerowi odczyt i wyświetlenie tego pliku. Do tego potrzebny jest nam edytor tekstur przeznaczony m.in. do CS:GO - jest to VTFEdit (Valve Texture File Editor). Gdy już pobierzemy oprogramowanie, otwieramy nasz plik *.tga za pomocą VTFEdit. Możemy to zrobić na 2 sposoby: • Otwórz VTFEdit -> CTRL + I -> Wybierz plik do zaimportowania • Kliknij PPM na plik *.tga, który przedtem utworzyłeś -> Otwórz za pomocą -> VTFEdit Wyświetli się kontrolka odnośnie ustawień. Można otworzyć na fabrycznych ustawieniach, natomiast ja używam tych Ważne jest też to, żeby nie panikować, gdy w pliku *.vtf będzie wszystko czarne (w miejscu zdjęcia). Tło jest czarne więc jeśli napis jest czarny to zlewają się ze sobą, bo edytor ten w czasie gdy nie ma tła wstawia czarne pole. Finalnie pojawi się czarny napis, a nie czarny kwadrat 8. Zapisujemy plik jako *.vtf 9. Tworzymy plik *.vmt i zapisujemy go najlepiej w tym samym miejscu co *.vtf [BARDZO WAŻNE] ustawienia pliku *.vmt MUSZĄ być takie same jak na screenie drugim 10. Tworzymy folder o nazwie "overlays" (można dać inną nazwę, ale ta jest najłatwiejsza i najłatwiej się odnaleźć) -> Oba pliki (*.vtf i *.vmt) wrzucamy do tego folderu -> Folder razem z plikami w środku przerzucamy do "materials" w plikach serwerowych -> PPM na plik *.vmt -> otwieramy za pomocą notatnika, lub innego edytora tekstowego -> wpisujemy odpowiednią ścieżkę: 11. Zapisujemy zmiany. Zrobiliśmy właśnie własnego overlay'a i poprawnie go skonfigurowaliśmy. Najtrudniejsze za nami 2. NAPISANIE PLUGINU Napiszemy teraz plugin, który opisałem na samym początku. Niezbędna do tego będzie odpowiednia biblioteka: overlays.inc, którą pobierzemy stąd: https://github.com/shanapu/overlays.inc Najpierw jednak przygotuję odpowiedni efekt dźwiękowy, który będzie towarzyszył mojemu overlay'owi. Wpisuję "Headshot Sound Effect" w Google i ściągam odpowiedni dźwięk (najlepiej w *.mp3); nazywam go "Headshot" i wrzucam do plików serwerowych: /csgo/sound/ [można utworzyć dodatkowy folder, żeby nie zrobił się bałagan w folderze sounds] A więc możemy przejść do napisania pluginu: #include <sourcemod> #include <overlays> #include <sdktools> #define HEADSHOTPATH "overlays/Headshot" //bez rozszerzeń #define HEADSHOTSOUNDPATH "*/ServerSounds/Headshot.mp3" //ścieżka do dźwięku z //poziomu folderu "sound" #define HEADSHOTSOUNDPATH2 "sound/ServerSounds/Headshot.mp3" //ścieżka do dźwięku z //poziomu folderu "materials" public void OnPluginStart() { HookEvent("player_death", OnHeadshot, EventHookMode_Post); } public void OnMapStart() { PrecacheSound(HEADSHOTSOUNDPATH, true); //te 3 linijki to pobieranie AddFileToDownloadsTable(HEADSHOTSOUNDPATH2); //materiałów z plików PrecacheDecalAnyDownload(HEADSHOTPATH); //serwera } public Action OnHeadshot(Event e, const char[] n, bool b) { int attacker = GetClientOfUserId(e.GetInt("attacker")); bool hs = GetEventBool(e, "headshot"); if(hs) { EmitSoundToClient(attacker, HEADSHOTSOUNDPATH); ShowOverlay(attacker, HEADSHOTPATH, 2.0); } } I OTO KONIEC!!! Tak to się prezentuje: Mam nadzieję, że pomogłem komuś z Was kto miał taki sam problem jak ja. Zajęło mi to naprawdę dużo czasu i włożyłem w to serce. Liczę na dobre opinie. W razie pytań zapraszam do komentarzy.
  2. Powiem Ci tylko, że jesteś potężny. Kluczowe było to, żeby z plików gry usunąć plik KillingSpree. Miałem z tym niesamowicie duży problem, dlatego myślę, że do tygodnia wywiążę się z umowy odnośnie poradnika. Dziękuję
  3. Cześć, Mam potężny problem który doprowadza mnie już do szału jak o tym pomyślę. Od razu mówię, żeby nie odsyłać mnie do żadnych linków z alliedmodders, bo wszystkie tematy już przejrzałem i nadal nic. Problemem jest to, że gdy utworzyłem overlay'a, przekonwertowałem na *.vtf i utworzyłem plik *.vmt. Wszystko wkleiłem do folderu (Filezilla): /csgo/materials/overlays. Gdy plugin (którego tu nie będę wstawiał, bo jest długi a to nie ma sensu) ma za zadanie wyświetlić overlay'a- wyświetla czarny ekran(obrazek 1), po czym wyrzuca mnie z serwera i jest taka informacja: obrazek 2. Najgorsze i kluczowe w mojej złości jest to, że miesiąc temu miałem inny serwer, na którym wydaje mi się, że zrobiłem wszystko identycznie i tam to działało. Oto plik *.vmt: "MonitorScreen" { "$basetexture" "overlays/KillingSpree" "$translucent" 1 } Zrobiłem wszystko tak samo zgodnie z wszystkimi poradnikami, zrobiłem osobno tak samo jak robiłem miesiąc temu, 3 razy reinstalowałem serwer i robiłem to na nowo, nic, kompletnie nic się zmieniło. Cały czas CZARNY EKRAN I TEN BŁĄD. Jeśli pomożecie to postaram się zrobić poradnik dotyczący tworzenia overlay'ów na server, bo na internecie jest ciężko cokolwiek o tym znaleźć, żeby innym pomóc, którzy być może też mają z tym problem, jak i dla mnie na przyszłość jak mi się takie coś stanie.
  4. Nie da sie pomslec o czyms o czego istnieniu sie nie wie :DD
  5. W sumie jest lepiej, ale nadal spora luka. Nadal, przy zmianie mapy flaga się usuwa, tak jakby timer nie działał. Oto fragment kodu z OnMapStart i OnClientPutInServer: #include <sourcemod> bool gPlayerIsVip[MAXPLAYERS+1]; public void OnMapStart() { CreateTimer(60.0, CheckingVip, _, TIMER_REPEAT); } public void OnClientPutInServer(int client) { gPlayerIsVip[client] = false; } public Action CheckingVip(Handle timer, int client) { for(int i=1; i<=MaxClients; i++) { if(IsValidClient(i)) { if(gPlayerIsVip) { AddUserFlags(i, Admin_Custom1); PrintToChat(i, "FLAGA DODANA DLA: %N", i); //dla testu, nie wyswietla sie } } } }
  6. o to chodziło i to jest dobry plugin, tylko jest ogromna luka. Przy refreshu adminów, czy rozłączeniu z serwerem dana flaga się usuwa. Dałoby się zrobić, żeby zostawała?
  7. Cześć, Od dwóch godzin męczę się z pluginem na modele broni na serwerze. Wgrywałem go kilka razy, sprawdzałem czy w plikach konfiguracyjnych jest wszystko ok, czy wszystkie lokalizacje są poprawne. W końcu znalazłem inny plugin, który umożliwia dodanie własnego modelu broni (nie ma plików konfiguracyjnych, tylko wszystko ręcznie, w kodzie się ustala). Nie działał on również. W końcu doszedłem do tego, że zarówno jeden jak i drugi plugin nie jest czytany przez serwer, po wpisaniu "sm plugins" w konsoli. Są one w folderze "plugins", ale nie wyświetlają się w konsoli, zupełnie tak jakby ich w ogóle nie było. Ma ktoś pomysł co może być na rzeczy? W razie czego podam jeszcze plugin (ten drugi), jak i mój kod, ewentualnie wszystkie pluginy, które posiadam. PS. Plugin "tidy chat" też nie zostaje czytany, z tą różnicą, że wszystkie ConVary działają, tzn nie pokazuje się błąd, gdy zmieniam je poprzez rcon, natomiast w pluginie na zmienianie broni convar, który jest zawarty konsola wyświetla jako błędny przy próbie zmiany. plugin: https://forums.alliedmods.net/showthread.php?t=276697 mój kod: #include <sourcemod> #include <sdktools> #include <sdkhooks> #include <fpvm_interface> #define WEAPON "weapon_ak47" #define MODEL "models/weapons/v_furha.mdl" int g_Model; public void OnClientPostAdminCheck(int client) { FPVMI_AddViewModelToClient(client, WEAPON, g_Model); } public void OnMapStart() { g_Model = PrecacheModel(MODEL); AddFileToDownloadsTable("materials/models/weapons/v_models/furha/ak47.vmt"); AddFileToDownloadsTable("materials/models/weapons/v_models/furha/ak47.vtf"); AddFileToDownloadsTable("materials/models/weapons/v_models/furha/ak47_exponent.vtf"); AddFileToDownloadsTable("models/weapons/v_furha.mdl"); AddFileToDownloadsTable("models/weapons/v_furha.dx90.vtx"); AddFileToDownloadsTable("models/weapons/v_furha.vvd"); } pluginy, które posiadam: "Disable Radar" (1.2) by Internet Bully "#Server_kill_block.smx" #Server_kill_block.smx "AddTime" (1.0.4) by bl4nk "Basic Votes" (1.10.0.6488) by AlliedModders LLC "#Server_weapon_choose.smx" #Server_weapon_choose.smx "Nextmap" (1.10.0.6488) by AlliedModders LLC "#Server_sounds_on_kills.smx" #Server_sounds_on_kills.smx "Anti-Flood" (1.10.0.6488) by AlliedModders LLC "Fun Votes" (1.10.0.6488) by AlliedModders LLC "Player Commands" (1.10.0.6488) by AlliedModders LLC "Basic Chat" (1.10.0.6488) by AlliedModders LLC "Admin File Reader" (1.10.0.6488) by AlliedModders LLC "Fix Hint Color Messages" (1.2.2 Franc1sco franug github version) by Phoenix (˙·٠●Феникс●٠·˙) "#Server_health_on_death.smx" #Server_health_on_death.smx "Basic Commands" (1.10.0.6488) by AlliedModders LLC "Admin Menu" (1.10.0.6488) by AlliedModders LLC "Basic Ban Commands" (1.10.0.6488) by AlliedModders LLC "#Server_add_vip.smx" #Server_add_vip.smx "#Server_deagle_drop.smx" #Server_deagle_drop.smx "#Server_chat_and_vip.smx" #Server_chat_and_vip.smx "#Server_RANKING.smx" #Server_RANKING.smx "Basic Comm Control" (1.10.0.6488) by AlliedModders LLC "#Server_knives.smx" #Server_knives.smx "#Server_infinite_ammo.smx" #Server_infinite_ammo.smx "SM Bot Spawner" (1.0) by Franc1sco franug "#Server_entry_history.smx" #Server_entry_history.smx "#Server_messages_reboot.smx" #Server_messages_reboot.smx "Reserved Slots" (1.10.0.6488) by AlliedModders LLC "Fix Hint Color Messages" (1.2.2 Franc1sco franug github version) by Phoenix (˙·٠●Феникс●٠·˙) "Admin Help" (1.10.0.6488) by AlliedModders LLC "#Server_list_of_all_command.smx" #Server_list_of_all_command.smx "Sound Commands" (1.10.0.6488) by AlliedModders LLC "Fun Commands" (1.10.0.6488) by AlliedModders LLC "#Server_changing_map.smx" #Server_changing_map.smx "Client Preferences" (1.10.0.6488) by AlliedModders LLC "Basic Info Triggers" (1.10.0.6488) by AlliedModders LLC
  8. Mógłbyś spojrzeć na to? public Action AddingNewVip(int client, int args) { if(!IsAdmin(client) && !IsOwner(client)) return; char nameBuffer[MAX_NAME_LENGTH]; char steamIdBuffer[64]; char buffer[512]; Menu av = new Menu(av_Handler); av.SetTitle("ALL PLAYERS CONNECTED NOW:"); for(int i=1; i<MAXPLAYERS; i++) { if(IsValidClient(i)) { GetClientName(i, nameBuffer, sizeof(nameBuffer)); GetClientAuthId(i, AuthId_Steam2, steamIdBuffer, sizeof(steamIdBuffer)); playerNick.PushString(nameBuffer); playerSID.PushString(steamIdBuffer); Format(buffer, sizeof(buffer), "%s >>> %s", nameBuffer, steamIdBuffer); av.AddItem("", buffer); } else continue; } av.Display(client, MENU_TIME_FOREVER); } public int av_Handler(Menu av, MenuAction action, int client, int position) { if(action == MenuAction_End) delete av; else if(action == MenuAction_Select) { char nickBuffer[MAX_NAME_LENGTH]; char sidBuffer[64]; playerNick.GetString(position, nickBuffer, sizeof(nickBuffer)); playerSID.GetString(position, sidBuffer, sizeof(sidBuffer)); for(int i=0; i<10; i++) { PrintToConsole(client, "[TEST CZY DZIALA] %s >>> %s", nickBuffer, sidBuffer); } AddUserFlags(/*CLIENT KTOREMU MA ZOSTAC DODANA FLAGA*/, Admin_Custom1); } } nie mam pojęcia komu dać flagi przy AddUserFlags, jeśli w ogóle dobrze myślę
  9. Cześć, Tworzę plugin, dzięki któremu admin, czy właściciel po wpisaniu /addvip, tudzież /av dostanie menu z wszystkimi graczami na serwerze, a po wybraniu gracza- temu graczowi zostanie dodany vip. Chciałem to zrobić na tablicach dynamicznych- jak to było w pluginie z historią, ale minus jest taki, że przy każdym połączeniu klienta tworzy się nowe pole w menu i jeśli dany gracz się połączy 5 razy z rzędu, to nie będzie to menu ukazujące wszystkich graczy, tylko ostatnie połączenia jakie były. Nie wiem jak zrobić "unikalne" pole do ArrayListy. Może ma ktoś jakiś pomysł? To plugin: #include <sourcemod> public void OnPluginStart() { RegConsoleCmd("sm_addvip", AddingNewVip); RegConsoleCmd("sm_av", AddingNewVip); } public Action AddingNewVip(int client, int args) { if(!IsAdmin(client) && !IsOwner(client)) return; char nameBuffer[MAX_NAME_LENGTH]; char steamIdBuffer[64]; char buffer[512]; Menu av = new Menu(av_Handler); av.SetTitle("ALL PLAYERS CONNECTED NOW:"); for(int i=1; i<MAXPLAYERS; i++) { if(IsValidClient(i)) { GetClientName(i, nameBuffer, sizeof(nameBuffer)); GetClientAuthId(i, AuthId_Steam2, steamIdBuffer, sizeof(steamIdBuffer)); Format(buffer, sizeof(buffer), "%s >>> %s", nameBuffer, steamIdBuffer); av.AddItem("", buffer); } else continue; } av.Display(client, MENU_TIME_FOREVER); } public int av_Handler(Menu av, MenuAction action, int client, int position) { if(action == MenuAction_End) delete av; else if(action == MenuAction_Select) { // tak jak było w odcinku z tworzenia historii, ale chodzi o to, żeby flagi admina dodawały się graczowi, który jest pod danym indeksem menu, np.: // AddUserFlags(position, Admin_Custom1); // PrintToChat(client, "Gracz: %N dostał VIPa!", position); } } //////////////////////////////////// BOOLS //////////////////////////////////// public bool IsValidClient(int client) { if(client >=1 && client <=MAXPLAYERS && IsClientInGame(client)) return true; return false; } bool IsVip(int client) { if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1) return true; return false; } bool IsAdmin(int client) { if(GetUserFlagBits(client) & ADMFLAG_CUSTOM2) return true; return false; } bool IsOwner(int client) { if(GetUserFlagBits(client) & ADMFLAG_CUSTOM3) return true; return false; }
  10. Cześć, Chciałbym, żeby napisy serwerowe na dołączanie gracza do drużyny, łączenie się i rozłączanie z serwera zniknęły. Pisałem taki post jakiś czas temu i dostałem w odpowiedzi link do pluginu tidychat. Wydaje mi się, że zrobiłem wszystko dobrze. Wgrałem plugin i na komendę "rcon sm_tidychat_team 0 " nie wyświetlało się w konsoli, że komenda niepoprawna, ale pomimo tego gdy dołączałem do drużyny to i tak napisy były. Drugą sprawą jest: jak można uzyskać efekt nieskończonej rundy? Nie chodzi mi maksymalny czas (60 minut), tylko coś na przykładzie jak ma brutalcs, że po 60 minutach runda trwa jeszcze 600 minut. Ostatnią sprawą jest jak można ustawić "timeleft" w taki sposób, żeby nie pokazywało się ile rund zostało, tylko ile czasu. Na serwerze chciałbym faktycznie jeśli chodzi o czas rudny chciał uzyskać niemalże identyczny efekt jaki jest na serwerach brutalcs. Są to trzy zapytania z którymi męczę się już dłuższy czas i nie potrafię znaleźć odpowiedzi na internecie. Dzięki za wszystkie odpowiedzi.
  11. Kurde, przesiedziałem sporo czasu, żeby ogarnąć ten Twój plugin i przepisałem nawet niektóre linijki, ale nie do końca działa tak jak powinno.. Cały czas wyświetla się error, bo wchodzi w ten warunek: if (!g_iDatabase) { CPrintToChat(client, "%s There is an error with plugin-database connection. Try it on the next map", RANK_TAG); return; } przepisałem go po prostu, ale nie mam pojęcia co znaczy xd. Oto fragment kodu teraz: public Action ClientRanking(int client, int args) { char buffer[256]; if (!g_iDatabase) { CPrintToChat(client, "%s There is an error with plugin-database connection. Try it on the next map", RANK_TAG); return; } Format(buffer, sizeof(buffer), "SELECT `steamid`,`points` FROM `Kills` WHERE `points`>='0' ORDER BY `points` DESC;"); DB.Query(SQL_Rank_Handler, buffer, client, DBPrio_High); } public void SQL_Rank_Handler(Database db, DBResultSet results, const char[] sError, any client) { if (db == null || results == null) { LogError("%s There is an error, error: %s", RANK_TAG, sError); return; } int i; char sAuthIdQuery[64], sAuthId[64]; GetClientAuthId(client, AuthId_Steam2, sAuthId, sizeof(sAuthId)); int TotalPlayers = results.RowCount; while (results.HasResults && results.FetchRow()) { i++; results.FetchString(0, sAuthIdQuery, sizeof(sAuthIdQuery)); if (StrEqual(sAuthIdQuery, sAuthId)) { CPrintToChat(client, "%s {lightblue}%N{purple} is {olive}%d{purple}/{darkred}%d{purple} | [{orchid}%d{purple} points]", RANK_TAG, client, i, TotalPlayers, points[client]); } } } A oto co wyświetla się w konsoli serwerowej: Client "Koxu csgoatse.com" connected (193.xxx.xxx.xxx:xxxxx). L 07/02/2020 - 21:14:32: [SM] Exception reported: Error fetching data from field 1 L 07/02/2020 - 21:14:32: [SM] Blaming: #Server_RANKING.smx L 07/02/2020 - 21:14:32: [SM] Call stack trace: L 07/02/2020 - 21:14:32: [SM] [0] SQL_FetchInt L 07/02/2020 - 21:14:32: [SM] [1] Line 103, C:\Users\Koxu\Desktop\Server\scripting\#Server_RANKING.sp::OnClientPutInServer PutClientInServer: no info_player_start on level Dropped Koxu csgoatse.com from server: Disconnect -> Reservation cookie 0: reason reserved(yes), clients(no), reservationexpires(0.00) Server is hibernating
  12. kox1906

    Problem z hextagsami

    Jak oganiesz to to chociaż napisz dokładnie czego nie ma i co zrobiłeś
  13. Cześć, To jak na razie ostatni plugin, jaki chciałbym napisać do mojego serwera deathmatch. Prawie cały plugin skopiowałem od Magneta z drugiej części poradnika MySQL, ale dodałem trochę swoich rzeczy i chciałem obsłużyć !rank. Pokaże to na czacie wiadomość typu "*nick* is X/Y | [*points*]", gdzie X to miejsce posiadane przez gracza, a Y to liczba wszystkich graczy, którzy się kiedykolwiek połączyli. To mnie przerosło, więc przychodzę z prośbą o pomoc tutaj. Dodam, że w całym pluginie, który wyślę tylko "public Action ClientRanking(int client, int args) mnie interesuje, reszta jest obsłużona poprawnie. *komentarze dla mnie, nie zwracajcie uwagi* Oto plugin: #include <sourcemod> #include <multicolors> #define RANK_TAG "{green}[RANKING]{purple}" int kills[MAXPLAYERS]; int points[MAXPLAYERS]; Database DB; public void OnPluginStart() { RegConsoleCmd("sm_rank", ClientRanking); RegConsoleCmd("sm_top", TopRanking); HookEvent("player_death", PlayerDeath); } public void OnMapStart() { char error[128]; DB = SQL_Connect("Killer", true, error, sizeof(error)); if(DB == INVALID_HANDLE) { LogError("Could not connect: %s", error); return; } char buffer[1024]; Format(buffer, sizeof(buffer), "CREATE TABLE IF NOT EXISTS `Kills`(`steamid` INT NOT NULL PRIMARY KEY,`nick` VARCHAR(64),`kills` INT NOT NULL,`points` INT NOT NULL)"); if(!SQL_FastQuery(DB, buffer)) { SQL_GetError(DB, error, sizeof(error)); PrintToServer("Could not create a table, error: %s", error); } } public Action ClientRanking(int client, int args) { char buffer[1024]; Format(buffer, sizeof(buffer), "SELECT `points` FROM `Kills` ORDER BY `points` DESC;"); //char nameBuffer[MAX_NAME_LENGTH]; //int pointsBuffer; CPrintToChat(client, "%s {lightblue}%N{purple} is {olive}X{purple}/{darkred}Y{purple} | [{orchid}%d{purple} points]", RANK_TAG, client, points[client]); //OBSLUZYC, ZROBIC MENU WYLACZAJACE DZWIEKI (OVERLAYE ITP) } public Action PlayerDeath(Event e, const char[] n, bool b) { int client = GetClientOfUserId(e.GetInt("userid")); int attacker = GetClientOfUserId(e.GetInt("attacker")); kills[attacker]++; points[client]-=2; if(points[client]<0) points[client]=0; if(IsVip(attacker)) { points[attacker]+=6; } else { points[attacker]+=4; } } public void OnClientPutInServer(int client) { kills[client] = 0; points[client] = 0; if(IsFakeClient(client) || IsClientSourceTV(client)) return; int sid = GetSteamAccountID(client); char buffer[1024]; Format(buffer, sizeof(buffer), "SELECT `kills`,`points` FROM `Kills` WHERE `steamid`=%d", sid); DBResultSet query = SQL_Query(DB, buffer); if(query == null) // null or INVALID_HANDLE { char error[255]; SQL_GetError(DB, error, sizeof(error)); PrintToServer("Could not player's (%N) data download, error: %s", client, error); return; } if(!SQL_GetRowCount(query)) { Format(buffer, sizeof(buffer), "INSERT INTO `Kills` VALUES(%d, '%N', 0, 1000)", sid, client); if(!SQL_FastQuery(DB, buffer)) { char error[255]; SQL_GetError(DB, error, sizeof(error)); PrintToServer("Could not add new player (%N), error: %s", client, error); } return; } while(SQL_FetchRow(query)) { kills[client] = SQL_FetchInt(query, 0); points[client] = SQL_FetchInt(query, 1); } } public void OnClientDisconnect(int client) { char buffer[1024]; Format(buffer, sizeof(buffer), "UPDATE `Kills` SET `kills`=%d,`points`=%d WHERE `steamid`=%d", kills[client], points[client], GetSteamAccountID(client)); if(!SQL_FastQuery(DB, buffer)) { char error[255]; SQL_GetError(DB, error, sizeof(error)); PrintToServer("Could not update player's (%N) data, error: %s", client, error); } } public Action TopRanking(int client, int args) { Menu top = new Menu(TopRanking_Handler); top.SetTitle("TOP 10:"); char buffer[1024]; Format(buffer, sizeof(buffer), "SELECT `nick`,`points` FROM `Kills` ORDER BY `points` DESC LIMIT 10;"); DBResultSet query = SQL_Query(DB, buffer); char nameBuffer[MAX_NAME_LENGTH]; int pointsBuffer; while(SQL_FetchRow(query)) { pointsBuffer = SQL_FetchInt(query, 1); SQL_FetchString(query, 0, nameBuffer, sizeof(nameBuffer)); if (IsVip(client)) Format(buffer, sizeof(buffer), "[VIP] %s [%d]", nameBuffer, pointsBuffer); else Format(buffer, sizeof(buffer), "%s [%d]", nameBuffer, pointsBuffer); top.AddItem("", buffer); } top.Display(client, 120); return Plugin_Continue; } public int TopRanking_Handler(Menu top, MenuAction action, int client, int position) { if(action == MenuAction_End || action == MenuAction_Select) delete top; } //////////////////////////////////// BOOLS //////////////////////////////////// bool IsVip(int client) //or owner or admin { if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1 || GetUserFlagBits(client) & ADMFLAG_CUSTOM2 || GetUserFlagBits(client) & ADMFLAG_CUSTOM3) return true; return false; }
×
×
  • Dodaj nową pozycję...