Skocz do zawartości

Nowy szablon forum

mygo.pl

Stworzyliśmy dla Was nowy wygląd forum. Z pewnością znajdziesz rzeczy, które wg Ciebie mogą zostać zmienione - wspomnij o tym w specjalnym wątku.

Czytaj więcej

Jak założyć własną sieć

serwerów CS

Zastanawiasz się nad prowadzeniem własnej sieci serwerów? Przeczytaj podstawowe informacje, na które należy zwrócić uwagę, przy takim projekcie.

Czytaj więcej

Tworzymy spis sieci

dodaj swoją

Dodaj sieć do której należysz, pozwoli to na promocję i budowę ogólnopolskiej bazy sieci CS.

Czytaj więcej

live4net

Zasłużony
  • Postów

    676
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    108

Odpowiedzi opublikowane przez live4net

  1. Niby ok, jednak zmodyfikowałbym trochę ten plugin:

     

    #include <sourcemod>
    
    public void OnPluginStart()
    {
        RegConsoleCmd("sm_knife", Wywolanie_komendy);
    }
    
    public Action Wywolanie_komendy(int client, int args)
    {
        PrintToChat(client, " \x07Nie używamy tej komendy na tym serwerze!");
        return Plugin_Handled;
    }

     

    Nie ma sensu sprawdzać w tym momencie czy IsClientInGame, ponieważ jak ktoś jest poza grą, to nie wywoła tej komendy. W zasadzie nie ma to żadnego wpływu na wydajność, ale taka ciekawostka:)

    • Super! 1
  2. W wielu przypadkach najpierw jest wykonywane zapytanie z pustą zmienną, a dopiero wtedy w zmiennej jest zapisywana kwerenda. Przykład:

     else {
        new String:query[250];
        new Handle:queryH = SQL_Query(DB, query);
        Format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `Last_Alive` (steamid VARCHAR(32) primary key, wins INT(4))");

    Takich miejsc jest więcej, trzeba je wszystkie poprawić (najpierw Format, a dopiero potem SQL_Query.

     

    Dodatkowo int jest wczytywany z bazy jako string, a następnie próbuje się go wyświetlić jako int (%d) - nie ma szans to zadziałać. Trzeba użyć SQL_FetchInt.

     

     

    Po zmianie tych rzeczy, powinno działać, jednak aby plugin działał dobrze i był napisany optymalnie, należy:

     

    1. Zmienić wszystkie zapytania na TQuerry

    2. Zapisywać dane zamiast na steamid to na accountID

    3. Dodać znacznik czasu, który umożliwiałby kasowanie starych rekordów

    4. Użyć nową składnie

    5. Trzymać spójny kod - w niektórych kwerendach rozmiar stringa podczas formatowania jest na sztywno ustalony na 200 bajtów, a w niektórych jest użyta funkcja sizeof()

    6. Po co odczytywać dane przy każdym spawnie? Co rundę daje to ilość zapytań (w dodatko slow-querry) równy liczbie graczy.

    7. Dodanie funkcji, która w przypadku nieznalezienia odpowiedniego wpisu w pliku databases.cfg, wykorzystuje wpis default.

    8. ClanTag najlepiej ustawiań po dołączeniu do teamu (zmianie teamu też).

    9. Sprawdzanie przy zapytaniu czy połączenie z mysql nie zostało zerwane.

     

    @daffik Jeśli nie rozumiesz, którejś z moich propozycji zmianie w kodzie, to pytaj - wytłumaczę Ci, dlaczego tak będzie lepiej. Dałem Ci za free lekcję, więc mam nadzieję, że nie będziesz atakować jak ostatnio gdy komuś pomogłem. Jak poprawisz swój plugin, nie zapomnij wspomnieć o mnie w autorach :)

     

    Uprzedzając pytanie odpowiem, że swojego autorskiego pluginu nie udostępniam, ponieważ po to piszę autorskie pluginy na moje serwery, aby się wyróżniały. Nie publikuję ich, żeby nie ułatwiać innym kopiowanie moich pomysłów. Forum służy do pomagania, przy czym pomoc nie zawsze oznacza wrzucenie gotowego rozwiązania (chociaż wielu by tak oczekiwało). Dzielenie się wiedzą, również jest formą pomocy.

  3. Podaj mi w takim razie argumenty, w czym casy są lepsze? Z źródłem skąd to masz, bo informacja, że @daffik stwierdził, że tylko pseudo technicy nie używają ifów do mnie nie trafia. Nie są one szybsze, nie zajmują mniej pamięci, za to zabierają więcej miejsca w kodzie.

     

    A co do trashcodu, to polecam obejrzeć to:

     

     

     

    • Super! 1
  4.  

    1 godzinę temu, daffik napisał:

    @live4net weź Ty się nie bierz za pisanie plugów xD 

     

    Nie rozumiem o co Ci chodzi. Zaproponowałeś rozwiązanie inne, podobnie jak xBonio. Wszystkie rozwiązania są prawidłowe, wszystkie będą działać i wszystkie mają podobną wydajność. Nie ma jednej prawidłowej ścieżki - dróg do osiągnięcia celu zazwyczaj jest kilka i to od programisty zależy jak co sobie zapisze, żeby mu się wygodnie poruszało po swoim kodzie.

     

     

     

    1 godzinę temu, daffik napisał:

    O CHUJ, ŻE JAK?!

     

    Jak już chcesz w taki sposób to bynajmniej przynajmniej pseudo techniku zainteresuj się case

     

    Cieszę się przynajmniej, że pierwszą wersję posta zedytowałeś, bo była ona dość obraźliwa.

    • Super! 3
  5. int random = GetRandomInt(1, 4);
    if (random == 1)
    {
    	SetPlayerArms(client, "models/player/custom_player/zombie/crimsonhead/crimsonhead_arms.mdl");
    	SetEntityModel(client, "models/player/custom_player/zombie/crimsonhead/crimsonhead.mdl");
    	SetEntityGravity(client, 1.0);
    	SetEntityHealth(client, 2000);
    	SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
    	PrintToChat(client, "Twoja Klasa To \x05Zombie!");
    	CS_SetClientClanTag(client, "Zombie");
    }
    else if (random == 2)
    {
    	SetPlayerArms(client, "models/player/custom_player/zombie/mummy/mummy_arms.mdl");
    	SetEntityModel(client, "models/player/custom_player/zombie/mummy/mummy.mdl");
    	SetEntityGravity(client, 0.6);
    	SetEntityHealth(client, 1500);
    	SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
    	PrintToChat(client, "Twoja Klasa To \x05Ghoul!");
    	CS_SetClientClanTag(client, "Ghoul");
    }
    else if (random == 3)
    {
    	SetPlayerArms(client, "models/player/custom_player/zombie/revenant/revenant_arms.mdl");
    	SetEntityModel(client, "models/player/custom_player/zombie/revenant/revenant_v2.mdl");
    	SetEntityGravity(client, 1.1);
    	SetEntityHealth(client, 3500);
    	SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.7);			
    	PrintToChat(client, "Twoja Klasa To \x05Slasher!");
    	CS_SetClientClanTag(client, "Slasher");
    }
    else if (random == 4)
    {
    	SetPlayerArms(client, "models/player/custom_player/zombie/romeo_zombie/romeo_zombie_arms.mdl");
    	SetEntityModel(client, "models/player/custom_player/zombie/romeo_zombie/romeo_zombie.mdl");
    	SetEntityGravity(client, 0.8);
    	SetEntityHealth(client, 1000);
    	SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 2.0);
    	PrintToChat(client, "Twoja Klasa To \x05Undead!");
    	CS_SetClientClanTag(client, "Undead");
    }

     

  6. Nie testowałem, ale ponoć jeśli się Pre-Hookuje, to można zmieniać w locie.

     

    https://wiki.alliedmods.net/Events_(SourceMod_Scripting)

     

     

    Rewriting Events

    Rewriting events is just as easy -- events can be modified in pre hooks. For example, say we want to remove headshots from all events:

    public void OnPluginStart()
    {
    	HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre);
    }
     
    public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
    {
    	event.SetBool("headshot", false);
    	return Plugin_Continue;
    }

     

     

    Oczywiście, jeśli tak nie zadziała, to Twój sposób, na 100% będzie skuteczny:)

    • Super! 1
  7. 56 minut temu, zorix napisał:

    Tak wg te ograniczenia są tylko na VPS'ie czy cs go narzuca to na wszystkie typy maszyn ( w sensie czy na dedykach to obowiązuje) 

     

    To jest ograniczenie nałożone przez srcds - nie jest wielowątkowy, więc korzysta tylko z jednego wątku (rdzenia). Także, na dedyku jeden serwer też będzie maksymalnie korzystać z jednego rdzenia. Z tym, że na dedyku rdzenie są dużo mocniejsze, ponieważ są to rdzenie fizyczne. Na VPS tak naprawdę nie wiadomo co to jest vCPU, ponieważ na cztero rdzeniowym serwerze można sprzedać znacznie więcej vCPU.

     

    44 minuty temu, fabko napisał:

    Zdawałem sovie sprawe z tego, ze vps może mi tego nie ogarnąć, dlatego napisałem, ze dedyk również wchodzi w grę 

     

    Na jeden serwer nie warto kupować dedyka - koszt jest zbyt duży. Jeśli chcesz postawić więcej serwerów, to polecam MC-16 z oferty OVH (270 zł). Obecnie nie ma nic w lepszym stosunku ceny do jakości. Możliwe, że uciągnie Ci 4 serwery 32 sloty i 128 tr.

  8. VPS Ci żaden nie uciągnie 32 slotów i 128 tr. Możesz o tym zapomnieć. Zostaje Ci hosting, dedyk lub zmniejszenie slotów i TR.

     

    Gdybyś jednak zdecydował się na jakiegoś VPSa (co odradzam) to koniecznie musi być to wirtualizacja KVM i jak największe taktowanie vCPU (minimum 3.1 Ghz). Spokojnie wystarczy Ci 1-2 vCPU, ponieważ srcds na Linuksa nie jest wielowątkowe i wykorzystuje tylko jeden rdzeń. Ramu spokojnie wystarczą 2GB. VPS Cloud 1 lub VPS Cloud 2 z oferty OVH spełniają te wymagania, jednak nie występują one  w lokalizacji PL.

     

    27 minut temu, Umino napisał:

    A po za tym chyba VPS ci wyjdzie taniej niż hosting.

    Ale taki VPS jak 8GB RAM, czy 6 vCPU da radę, a koszt takiego to około 100 zł, czy tam troszkę więcej.

     

    VPS mógłby nawet mieć 32 vCPU i 128 GB RAM i tak nic by to nie dało, bo taki serwer CS:GO wykorzystałby max 1 vCPU i ok 1 GB RAM. Reszta zasobów byłaby niewykorzystana.

     

     

  9. Spróbuj jeszcze zmienić w funkcji ProcessQueueCallback:

     

    if (serverID == -1)
    {
    	FormatEx(query, sizeof(query),
    		"INSERT INTO %s_bans (ip, authid, name, created, ends, length, reason, aid, adminIp, sid) VALUES  \
    			('%s', '%s', '%s', %d, %d, %d, '%s', (SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'), '%s', \
    			(SELECT sid FROM %s_servers WHERE ip = '%s' AND port = '%s' LIMIT 0,1))",
    		DatabasePrefix, ip, auth, banName, startTime, startTime + time * 60, time * 60, banReason, DatabasePrefix, adminAuth, adminAuth[8], adminIp, DatabasePrefix, ServerIp, ServerPort);
    }
    else
    {
    	FormatEx(query, sizeof(query),
    		"INSERT INTO %s_bans (ip, authid, name, created, ends, length, reason, aid, adminIp, sid) VALUES  \
    			('%s', '%s', '%s', %d, %d, %d, '%s', (SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'), '%s', \
    			%d)",
    		DatabasePrefix, ip, auth, banName, startTime, startTime + time * 60, time * 60, banReason, DatabasePrefix, adminAuth, adminAuth[8], adminIp, serverID);
    }

     

    na

     

     

    if (serverID == -1)
    {
    	FormatEx(query, sizeof(query),
    		"INSERT INTO %s_bans (authid, name, created, ends, length, reason, aid, adminIp, sid) VALUES  \
    			('%s', '%s', '%s', %d, %d, %d, '%s', (SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'), '%s', \
    			(SELECT sid FROM %s_servers WHERE ip = '%s' AND port = '%s' LIMIT 0,1))",
    		DatabasePrefix, auth, banName, startTime, startTime + time * 60, time * 60, banReason, DatabasePrefix, adminAuth, adminAuth[8], adminIp, DatabasePrefix, ServerIp, ServerPort);
    }
    else
    {
    	FormatEx(query, sizeof(query),
    		"INSERT INTO %s_bans (authid, name, created, ends, length, reason, aid, adminIp, sid) VALUES  \
    			('%s', '%s', '%s', %d, %d, %d, '%s', (SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'), '%s', \
    			%d)",
    		DatabasePrefix, auth, banName, startTime, startTime + time * 60, time * 60, banReason, DatabasePrefix, adminAuth, adminAuth[8], adminIp, serverID);
    }

     

  10. Ja się domyśliłem o co chodzi, cod i klasa raczej nie jest tu potrzebna. Wystarczy kod lub opis metody jak coś takiego ogarnąć.

     

    W evencie śmierci attackerem jest zapewne world (0). Musisz zapisać sobie w jakiejś zmiennej kto dokonał podpalenia i jeśli podpalony gracz zginie od attackera==0 i będzie w  tym czasie podpalony, to zmieniasz attackera w evencie na zapisany ID gracza. Prościzna :)

     

    Jedyny problem, to jeśli gracz zginie w czasie podpalenia od upadku, pułapki, czy czegokolwiek innego, co nie jest strzałem gracza, to zostanie to zaliczone jako śmierć od gracza, który go podpalił. Można temu zaradzić, pozyskując typ obrażeń, które otrzymał gracz, ale myślę, że nie jest to gra warta świeczki.

  11. Nawet jeśli wytrzyma pół roku, tak jak przedmówca pisze, to w dalszym ciągu obejmuje ją gwarancja. 2,5 roku na pewno z niej będziesz mieć pożytek (tyle jest jeszcze gwarancji), a dłużej to i tak Ci się nie przyda, bo za 2,5 roku to będą nowsze i dużo lepsze karty :) To że była używana do kopania to niczego nie zmienia, producent nie jest w stanie wykryć do czego karta była używana. Gdyby coś się stało, spokojnie możesz ją oddać z opisem, że grałeś w CSa, zresetował Ci się PC i już się nie uruchomił, bo karta padła. Osobiście uważam, że mimo iż karta była mocno eksploatowana, to najprawdopodobniej jeszcze długo pociągnie. Masz 14 dni na zwrot, więc po otrzymaniu karty porządnie ją przetestuj różnymi benchmarkami, czy nie generuje jakiś artefaktów. Jeśli wszytko będzie ok, to najprawdopodobniej będziesz spokojnie mógł z niej korzystać przez najbliższe kilka lat.

    • Super! 1
  12. Musisz zedytować funkcję: UTIL_InsertBan w pliku: sbpp_main.sp

     

    Zmieniasz tam to:

     

    if (serverID == -1)
    	{
    		FormatEx(Query, sizeof(Query), "INSERT INTO %s_bans (ip, authid, name, created, ends, length, reason, aid, adminIp, sid, country) VALUES \
    						('%s', '%s', '%s', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + %d, %d, '%s', IFNULL((SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'),'0'), '%s', \
    						(SELECT sid FROM %s_servers WHERE ip = '%s' AND port = '%s' LIMIT 0,1), ' ')",
    			DatabasePrefix, Ip, Authid, banName, (time * 60), (time * 60), banReason, DatabasePrefix, AdminAuthid, AdminAuthid[8], AdminIp, DatabasePrefix, ServerIp, ServerPort);
    	} else {
    		FormatEx(Query, sizeof(Query), "INSERT INTO %s_bans (ip, authid, name, created, ends, length, reason, aid, adminIp, sid, country) VALUES \
    						('%s', '%s', '%s', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + %d, %d, '%s', IFNULL((SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'),'0'), '%s', \
    						%d, ' ')",
    			DatabasePrefix, Ip, Authid, banName, (time * 60), (time * 60), banReason, DatabasePrefix, AdminAuthid, AdminAuthid[8], AdminIp, serverID);
    	}

     

    na to:

     

    if (serverID == -1)
    	{
    		FormatEx(Query, sizeof(Query), "INSERT INTO %s_bans (authid, name, created, ends, length, reason, aid, adminIp, sid, country) VALUES \
    						('%s', '%s', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + %d, %d, '%s', IFNULL((SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'),'0'), '%s', \
    						(SELECT sid FROM %s_servers WHERE ip = '%s' AND port = '%s' LIMIT 0,1), ' ')",
    			DatabasePrefix, Authid, banName, (time * 60), (time * 60), banReason, DatabasePrefix, AdminAuthid, AdminAuthid[8], AdminIp, DatabasePrefix, ServerIp, ServerPort);
    	} else {
    		FormatEx(Query, sizeof(Query), "INSERT INTO %s_bans (authid, name, created, ends, length, reason, aid, adminIp, sid, country) VALUES \
    						('%s', '%s', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + %d, %d, '%s', IFNULL((SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'),'0'), '%s', \
    						%d, ' ')",
    			DatabasePrefix, Authid, banName, (time * 60), (time * 60), banReason, DatabasePrefix, AdminAuthid, AdminAuthid[8], AdminIp, serverID);
    	}

     

    Nie testowałem, ale myślę, że powinno działać.

×
×
  • Dodaj nową pozycję...