Skocz do zawartości

Rekomendowane odpowiedzi

Witam w SourceMod jestem początkujący, w sumie na poważnie zacząłem dzisiaj. I nie wiem jak wpłynąć na event tak aby zrobić funkcję blokująca dmg. To znaczy uderzam kogoś i mu nie bierze hp. Pomoże ktoś z góry dzięki.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
public void OnClientPutInServer(int client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)
{
		damage = 0.0;
		return Plugin_Handled;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale to jest z biblioteka SDK a nie można tego zrobić klasycznie ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • WOW! 1
Napisano (edytowane)
17 minut temu, Prymex napisał:

a nie można tego zrobić klasycznie ?

Co znaczy klasycznie?

Edytowane przez Brum Brum

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Bez używanania osobnych bibliotek.

 

Coś typu SetEntityHealth nie da się tak zrobić ?

Edytowane przez Prymex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Teraz, Prymex napisał:

Bez używanania osobnych bibliotek.

Nie widziałem jeszcze ani razu aby ktoś zmieniał dmg inaczej niż tak, ale możesz spróbować zmienić dmg przy evencie używając poradnika @MAGNET dt. eventów 

Listę eventów znajdziesz tutaj -> https://wiki.alliedmods.net/Counter-Strike:_Global_Offensive_Events
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ten, który Ciebie interesuje to player_hurt

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko że jak podejdę do kogoś dźgnę do kosą zabiorę mu 40 hp i po przez SetEntityHealth mogę mu oddać te 40hp i wtedy dalej ma 100hp. Ale jeżeli trafię komuś heada za ponad 100hp on ginie i tutaj SetEntityHealth na nic się zda, a ja właśnie szukam takiego rozwiązania żeby komuś hp nie uciekało. Wiem że jest to możliwe, ponieważ na yt widziałem np. że health schodzi 2x szybciej bądź inne takie 4Fun gierki a rozwiązania z osobnymi Bibliotekami po 2 dni pisania sourcemod'a nie chce. Ponieważ po co rzucać się na głęboką wodę.... Wolę sobie spokojnie zachąć, mówię to z doświadczenia z programowania w innych językach :D.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak jak Ci napisał @Inext możesz tak zrobić jak każdy? Tą bibliotekę i tak Ci pobiera z każdym pobraniem paczki SM. 

Wysłałem Ci link do poradnika Magneta, ale chyba nawet nie raczyłeś obejrzeć, bo gdybyś oglądał to byś wiedział, że nie chodzi o samo SetEntityHealth, a zmienienie obrażeń przed wywołaniem tego eventu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie ma niczego złego w uzywaniu SDK - to w końcu narzędzia dostarczane przez deweloperów. Użyj rozwiązania z pierwszej odpowiedzi, opatrując zmianę obrażeń if'em

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Trzecie rozwiązanie (nieperfekcyjne) - ustaw wszystkim przy spawnie 99999 życia

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
#include <sourcemod>



#pragma semicolon 1;



public void OnPluginStart(){

    HookEvent("player_hurt", OnPlayerHurt, EventHookMode_Pre);

}



public Action OnPlayerHurt(Event event, const char[] name, bool dontBroadcast){ 

    char weapons[32];

    event.GetString("weapon", weapons, sizeof(weapons));

    int client2 = GetClientOfUserId(event.GetInt("userid"));

    int client = GetClientOfUserId(event.GetInt("attacker"));

    int heaths = event.GetInt("dmg_health");

    int i = GetClientTeam(client);

    int he = GetClientTeam(client2);

    if((StrContains(weapons, "knife", false) != -1) && (!= he)){

    int hp = GetClientHealth(client);

    if(!(hp + heaths >=100)){

        SetEntityHealth(client, hp + heaths);

    }

    else{ SetEntityHealth(client, 100); }

    PrintToChat(client, "Zadałeś kosą : %i /n bronią : %s", heaths, weapons);

    }



}

 

Mam coś takiego i chciałbym aby client2 nie dostawał damage. Mógłby mi ktoś pomóc.Połączyć mój plugin z tym :
 

public void OnClientPutInServer(int client) {

SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);

}



public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype) {

damage = 0.0;

return Plugin_Handled;

}

 

Przez Vasto_Lorde,

Wstawiaj proszę kod w tagi [code]. Poprawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#pragma semicolon 1;

public void OnClientPutInServer(int client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)
{
    int client2 = GetClientOfUserId(victim);
    int client = GetClientOfUserId(attacker);
    float heaths = damage;
    int i = GetClientTeam(client);
    int he = GetClientTeam(client2);
		if ((damagetype == 4010) && (i != he)) {
            damage = 0.0;
            int hp = GetClientHealth(client);
            if(!(hp + heaths >=100)){
                SetEntityHealth(client, hp + heaths);
            }
            else{ SetEntityHealth(client, 100); }
            PrintToChat(client, "Zostałeś uleczony o : %s hp", heaths);
    }
        return Plugin_Continue;
        }

Zrobiłem tak lecz wywala błędy w linijkach z if'ami oraz w linijce z return. Wie ktoś dlaczego ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Prymex Linijki z błędami mówią jakie błędy się znajdują w jakich linijkach. Dzięki temu wiemy jak je naprawić. Podaj screen/kopię tego co pojawia się po kompilacji 😉

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Vasto_Lorde 

// C:\Users\Prymex\Desktop\scripting\damage.sp(19) : warning 217: loose indentation
// C:\Users\Prymex\Desktop\scripting\damage.sp(23) : warning 213: tag mismatch

 

To jest 19: if ((damagetype == 4010) && (i != he)) {

A tutaj 23: SetEntityHealth(client, hp + heaths);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

warning 217: loose indentation oznacza, że po prostu masz wcięcia zrobione w innych miejscach, jak używasz SPEdita to ctrl+r i będzie wszystko git.

co do linijki 23, chcesz wysłać wartość float jako string.

aby wysłać int'a możesz użyć %i  / %d
float %f, aby ograniczyć miejsca po przecinku. np. %.2f ograniczy miejsce do 2 miejsc.

string %s
 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Lubię to! 1
Napisano (edytowane)
public void OnClientPutInServer(int client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)
{
	int vTeam = GetClientTeam(victim);
	int aTeam = GetClientTeam(attacker);
	
	if (damagetype & DMG_SLASH && vTeam != aTeam)
	{
		int hp = GetClientHealth(attacker);
		int add = RoundToNearest(damage);
		int newhp = hp + add;
		if (newhp <= 100)
			SetEntityHealth(attacker, newhp);
		else
			SetEntityHealth(attacker, 100);
		
		PrintToChat(attacker, "Zostałeś uleczony o : %i hp", add);
		damage = 0.0;
		return Plugin_Handled;
	}
	return Plugin_Continue;
} 

Poprawiłem twój kod @Prymex i teraz nie wywala żadnych błędów. 

Edytowane przez Inext

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Inext Bardzo ci dziękuję! 😄

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Temat został zamknięty. Powodem jest całkowite rozwiązanie problemu zawartego w temacie.

 

Jeśli się z tym nie zgadzasz, zaraportuj ten post z prośbą o ponowne otwarcie i kontynuację dyskusji.

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ę...