Prymex Napisano 5 Stycznia 2020 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
Inext 3 Napisano 5 Stycznia 2020 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
Prymex Napisano 6 Stycznia 2020 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
Brum Brum 1 Napisano 6 Stycznia 2020 (edytowane) 17 minut temu, Prymex napisał: a nie można tego zrobić klasycznie ? Co znaczy klasycznie? Edytowane 6 Stycznia 2020 przez Brum Brum Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Prymex Napisano 6 Stycznia 2020 (edytowane) Bez używanania osobnych bibliotek. Coś typu SetEntityHealth nie da się tak zrobić ? Edytowane 6 Stycznia 2020 przez Prymex Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum 1 Napisano 6 Stycznia 2020 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_EventsHej! 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
Prymex Napisano 6 Stycznia 2020 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
Brum Brum 1 Napisano 6 Stycznia 2020 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
MAGNET 1 Napisano 6 Stycznia 2020 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
Vasto_Lorde 1 Napisano 6 Stycznia 2020 Trzecie rozwiązanie (nieperfekcyjne) - ustaw wszystkim przy spawnie 99999 życia Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Prymex Napisano 6 Stycznia 2020 #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) && (i != 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, 6 Stycznia 2020 Wstawiaj proszę kod w tagi [code]. Poprawiam Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Prymex Napisano 6 Stycznia 2020 #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
Vasto_Lorde Napisano 6 Stycznia 2020 @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
Prymex Napisano 6 Stycznia 2020 @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
Brum Brum 1 Napisano 6 Stycznia 2020 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
Inext 1 Napisano 9 Stycznia 2020 (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 9 Stycznia 2020 przez Inext Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Prymex Napisano 10 Stycznia 2020 @Inext Bardzo ci dziękuję! 😄 Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 12 Stycznia 2020 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