Skocz do zawartości
kox1906

Kod podczas wpisania "kill" w konsoli zachowuje sie nie tak jak powinien

Rekomendowane odpowiedzi

Cześć,

Zacznijmy od tego, że to jest kod:

#include <sourcemod>
#include <multicolors>
 
//char C_Tag[][] = {"{default}", "{darkred}", "{green}", "{lightgreen}", "{red}", "{blue}", "{olive}", "{lime}", "{lightred}", "{purple}", "{grey}", "{yellow}", "{orange}", "{bluegrey}", "{lightblue}", "{darkblue}", "{grey2}", "{orchid}", "{lightred2}"
 
public void OnPluginStart()
{
    HookEvent("player_death", OnPlayerDeath, EventHookMode_Post);
}
 
public Action OnPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));
 
    char attackerWeapon[64], attackerName[32
     ];
 
    GetClientName(attacker, attackerName, sizeof(attackerName));
    GetClientWeapon(attacker, attackerWeapon, sizeof(attackerWeapon));
 
    
    if(StrContains(attackerWeapon,"bayonet"false) || StrContains(attackerWeapon, "knife"false))
        CPrintToChat(client, "Zostałeś zabity z {bluegrey}kosy{default} przez {darkred}%s", attackerName);
 
    return Plugin_Stop;   
}

Chodzi w nim o to, że gdy ktoś Cię zabija z noża to plugin wysyła informację, że zostałeś zabity z kosy. Natomiast gdy admin zabije gracza, lub gracz wpisze "kill" w konsoli ta informacja wyświetla się również. Czy jest jakiś warunek sprawdzający, czy zostałeś zabity przez admina lub z konsoli?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czemu nie zrobiłeś walidacji klienta. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Mesharsky a co to jest i do czego służy? Dopiero zaczynam pisać pluginy

Udostępnij tę odpowiedź


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

@Mesharsky a co to jest i do czego służy? Dopiero zaczynam pisać pluginy

Witaj,

 

Walidacja klienta jest wymagana gdy chcemy sprawdzić czy gracz jest prawdziwy / czy gracz jest połączony z serwerem / czy gracz jest żywy / czy gracz właśnie jest graczem.
Dzięki temu możemy uniknąć błędów jakie ty miałeś że konsola zabiła danego gracza.

Spróbuj takiego rozwiązania:

 

#include <sourcemod>
#include <multicolors>
 
public void OnPluginStart()
{
    HookEvent("player_death", OnPlayerDeath);
}
 
public Action OnPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));
 
    char attackerName[32];
    GetClientName(attacker, attackerName, sizeof(attackerName));
    
    if (!IsValidClient(attacker) || !IsValidClient(client) || attacker == client)
		return;
		
	char weapon[64];
	event.GetString("weapon", weapon, sizeof(weapon));
	
	bool knife = (StrContains(weapon, "knife", false) != -1 || StrContains(weapon, "bayonet", false) != -1);	
 
    if(knife)
        CPrintToChat(client, "Zostałeś zabity z {bluegrey}kosy{default} przez {darkred}%s", attackerName);
}

stock bool IsValidClient(int client)
{
	if (client <= 0)return false;
	if (client > MaxClients)return false;
	if (!IsClientConnected(client))return false;
	if (IsClientReplay(client))return false;
	if (IsFakeClient(client))return false;
	if (IsClientSourceTV(client))return false;
	return IsClientInGame(client);
}


Usunąłem weapon name gdyż i tak go nie używałeś w kodzie, i zastosowałem walidację klienta która sprawdza:
Czy klient jest połączony z serwerem.
Czy klient nie jest "Fake klientem" 
Czy klient nie jest SourceTV
Itd Itp

Spróbuj powyższy kod i daj znać czy spełnia twoje oczekiwania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cześć, 

Są 2 błędy: 

Serwer_zabojstwo_z_kosy.sp(20) : warning 217: loose indentation

Serwer_zabojstwo_z_kosy.sp(25) : warning 217: loose indentation

A tak poza tym to czy mógłbyś mi wytłumaczyć 2 rzeczy?

bool knife = (StrContains(weapon, "knife"false) != -1 || StrContains(weapon, "bayonet"false) != -1);

Dlaczego tutaj jest "!=-1" ? Czym jest to -1? 

if (!IsValidClient(attacker) || !IsValidClient(client) || attacker == client)
        return;

 Co oznacza tutaj samo "return"? Co się dzieje jeśli to, co jest w "if" się spełni? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
3 godziny temu, kox1906 napisał:

Serwer_zabojstwo_z_kosy.sp(20) : warning 217: loose indentation

Serwer_zabojstwo_z_kosy.sp(25) : warning 217: loose indentation


To nie błędy, jedynie informacja że kod jest jakoś źle ułożony (Plugin normalnie będzie śmigać bo to warning nie error)

Co do:

3 godziny temu, kox1906 napisał:

Dlaczego tutaj jest "!=-1" ? Czym jest to -1? 

https://sm.alliedmods.net/new-api/string/StrContains
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Cytat

-1 on failure (no match found). Any other value indicates a position in the string where the match starts.

 

3 godziny temu, kox1906 napisał:

Co oznacza tutaj samo "return"? Co się dzieje jeśli to, co jest w "if" się spełni? 

Jeżeli klient nie przejdzie walidacji zwrócimy mu return; czyli na chłopski rozum osoba która nie jest prawidłowym klientem nie będzie w stanie wywołać danego Eventu..
(zauważ że jest ! przed IsValidClient, czyli (! = Jeżeli nie jest): !JeżeliNieJestPrawidłowymKlientem { return; }

Widzę że dopiero zaczynasz więc nie będę tobie prawił definicji, staram się wytłumaczyć tak żebyś zrozumiał.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Mesharsky Dzięki wielkie, mega szanuje że pomogłeś i wytłumaczyłeś parę rzeczy. Trzymaj się

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...