Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Odbijanie obrażeń w atakującego.


Najlepsza odpowiedź wonsz żeczny, 02.10.2019 14:30

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamInteger(1, atakujacy);
	SetHamParamInteger(3, ofiara);

	return HAM_HANDLED;	
}

A tak?:

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamEntity(1, atakujacy);
	SetHamParamEntity(3, ofiara);

	return HAM_HANDLED;	
}
Przejdź do postu


  • Zamknięty Temat jest zamknięty
14 odpowiedzi w tym temacie

#1 ZajOnDz

    Życzliwy

  • Użytkownik

Reputacja: 0
Nowy

  • Postów:22
  • Lokalizacja:Bielsk Podlaski
Offline

Napisano 29.09.2019 20:12

Cześć :) Przejdę od razu do rzeczy. Mam :

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamInteger(1, atakujacy);
	SetHamParamInteger(3, ofiara);

	return HAM_HANDLED;	
}

Chcę, żeby w pewnej sytuacji odbiło obrażenia z powrotem w atakującego. Sądziłem, że SetHamParamInteger i zamiana miejscami atakującego z ofiarą załatwi sprawę, ale to jednak nie działa... Choć może coś źle robie. Pomożecie?


  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 584
Godlike

  • Postów:12 053
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 29.09.2019 20:19

Jak wygląda rejestracja hooka ?


  • +
  • -
  • 0

#3 ZajOnDz

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:22
  • Lokalizacja:Bielsk Podlaski
Offline

Napisano 29.09.2019 20:25

Hm... chodzi Ci o to?

RegisterHam(Ham_TakeDamage, "player","odbicie_obrazen",0);

. Ogólnie redukcja obrażeń w tym miejscu działa bez problemu. Jedynie ta zamiana ofiary z atakującym nie przynosi takiego efektu jaki myślałem, że da. :/


  • +
  • -
  • 0

#4 wonsz żeczny

    Wszechwidzący

  • Użytkownik

Reputacja: 83
Zaawansowany

  • Postów:256
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 29.09.2019 23:26

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
        new iClip, iAmmo;
        new iWeapon = get_user_weapon(ofiara, iClip, iAmmo);
	
	if( random_num( 5, 100 ) <= 5 )
        {
                ExecuteHamB(Ham_TakeDamage, atakujacy, iWeapon, ofiara, obrazenia, (1<<1));
                return HAM_SUPERCEDE;
        }

	return HAM_HANDLED;	
}

Może tak? :)


  • +
  • -
  • 0

#5 AwIlL^^

    Magiczny Gość

  • Użytkownik

Reputacja: 135
Zaawansowany

  • Postów:263
  • Steam:steam
  • Imię:Eryk
  • Lokalizacja:Gdańsk
Offline

Napisano 30.09.2019 08:34

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
        new iClip, iAmmo;
        new iWeapon = get_user_weapon(ofiara, iClip, iAmmo);
	
	if( random_num( 5, 100 ) <= 5 )
        {
                ExecuteHamB(Ham_TakeDamage, atakujacy, iWeapon, ofiara, obrazenia, (1<<1));
                return HAM_SUPERCEDE;
        }

	return HAM_HANDLED;	
}

Może tak? :)

 

jeżeli chcesz aby bytem atakującym była broń, którą trzyma atakujący to należy podać id atakującego, bo w takim przypadku on sam jest bytem atakującym :)


  • +
  • -
  • 1

Potrzebujesz porad do amxx?? Pisz na [PW]


#6 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 30.09.2019 10:42

No nie dokońca, bytem atakującym w tym przypadku jest jakiś randomowy ent z przedziału [1-30], bo get_user_weapon zwraca nam id broni, a nie id entity:

Spoiler

 

+ generalnie nie polecałbym używać ExecuteHamB w funkcji od RegisterHam, bo możemy się zapętlić.

 

Wrzucam swój stary kod z codmoda:

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
	if(!is_user_connected(idattacker) || get_user_team(this) == get_user_team(idattacker))
		return HAM_IGNORED;
		
      if(!random(7))
            ExecuteHam(Ham_TakeDamage, idattacker, idinflictor, this, dmg, damagebits);

	return HAM_IGNORED;
}

  • +
  • -
  • 1

#7 AwIlL^^

    Magiczny Gość

  • Użytkownik

Reputacja: 135
Zaawansowany

  • Postów:263
  • Steam:steam
  • Imię:Eryk
  • Lokalizacja:Gdańsk
Offline

Napisano 30.09.2019 11:40

No nie dokońca, bytem atakującym w tym przypadku jest jakiś randomowy ent z przedziału [1-30], bo get_user_weapon zwraca nam id broni, a nie id entity:

oczywiście, że kod, który zacytowałem jest niepoprawny.
ale jak chcesz aby silnik csa znalazł poprawnie broń, którą trzyma gracz to należy podać id gracza w miejsce bytu atakującego (to napisałem wyżej, ale chyba nie zrozumiałeś)

kod z poprawnym wyświetlaniem broni:

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
	if (!is_user_connected(atakujacy)) {
		return HAM_IGNORED;
	}

	if (!random(5)) {
		ExecuteHamB(Ham_TakeDamage, atakujacy, ofiara, ofiara, obrazenia, (1<<1));

		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

kod z "czachą" (w przypadku zabicia poprzez odbicie) nie tworząc nowego enta (w kodzie od tibacka to różne rezultaty by były, nie zawsze czacha):

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
	if (!is_user_connected(atakujacy)) {
		return HAM_IGNORED;
	}

	if (!random(5)) {
		ExecuteHamB(Ham_TakeDamage, atakujacy, 0, ofiara, obrazenia, (1<<1));

		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

a w takim przypadku będzie "czacha" i w konsoli napis, że gracz został zabity przez odbicie:

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
	if (!is_user_connected(atakujacy)) {
		return HAM_IGNORED;
	}

	if (!random(5)) {
		new new_inflictor = create_entity("info_target");
		entity_set_string(new_inflictor ,EV_SZ_classname, "reflection");
		ExecuteHamB(Ham_TakeDamage, atakujacy, new_inflictor, ofiara, obrazenia, (1<<1));
		remove_entity(new_inflictor);

		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

  • +
  • -
  • 1

Potrzebujesz porad do amxx?? Pisz na [PW]


#8 ZajOnDz

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:22
  • Lokalizacja:Bielsk Podlaski
Offline

Napisano 01.10.2019 20:09

Przepraszam, nie miałem sił siadać przed kodem w ostatnich dniach, więc i na forum nie zaglądałem. 

Niestety, nie mam pocieszających informacji. Sprawdziłem każdy z podanych przez Was kodów i niestety nie działa żaden z nich :(

Podpiąłem to po prostu do wszystkich obrażeń, nie tylko do konkretnej sytuacji i niestety, nadal nie odbija obrażeń w atakującego. Dla pewności dałem nawet client_print na początku funkcji, żeby być pewnym, że funkcja się odpala i funkcja odpala się przy obrażeniach wyświetlając tekst kontrolny, ale obrażenia nadal nie są odbijane w atakującego :(

Chyba będę musiał zmienić koncepcję moda i dać tej klasie inny skill... Chyba, że macie jeszcze jakiś pomysł?

 

 

Dla jeszcze większej pewności, wyłączyłem swój plugin i stworzyłem nowy wyłącznie z odbiciem obrażeń i... żaden z kodów nie działa :/

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>


#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_TakeDamage, "player","odbicie_obrazen",0);
	
	
}
public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits)
{
	client_print(0,3, "test");
	if (!is_user_connected(atakujacy)) {
		return HAM_IGNORED;
	}

	if (!random(5)) {
		new new_inflictor = create_entity("info_target");
		entity_set_string(new_inflictor ,EV_SZ_classname, "reflection");
		ExecuteHamB(Ham_TakeDamage, atakujacy, new_inflictor, ofiara, obrazenia, (1<<1));
		remove_entity(new_inflictor);

		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

Użytkownik ZajOnDz edytował ten post 01.10.2019 20:23

  • +
  • -
  • 0

#9 Toldi

    Czempion

  • Power User

Reputacja: 259
Wszechwidzący

  • Postów:841
  • Imię:Mateusz
  • Lokalizacja:wies
Offline

Napisano 01.10.2019 20:57

Pododawaj sb tak samo do każdego ifa kontrolne wiadomości i sprawdzaj czy wszystko się wykonuje.

Tak wogóle. jakiś dziwny ten if. random losuje liczbę z podanego przedziału więc co zmieni tam ! ?? Czy chodzi o to że if wykona się w momencie gdy wylosowaną liczbą jest 0?


  • +
  • -
  • 0

#10 ZajOnDz

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:22
  • Lokalizacja:Bielsk Podlaski
Offline

Napisano 01.10.2019 21:02

Pododawaj sb tak samo do każdego ifa kontrolne wiadomości i sprawdzaj czy wszystko się wykonuje.

Tak w ogóle. jakiś dziwny ten if. random losuje liczbę z podanego przedziału więc co zmieni tam ! ??

Aż takim programistą nie jestem, więc nie wiem co ma znaczyć ten if !random. 

Zwykle tak robię z printem wiadomości, gdy coś mi nie działa, ale sprawdzę to jutro, bo dziś już pora do łóżka się kłaść, a nie myśleć nad CS-em :)


  • +
  • -
  • 0

#11 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 02.10.2019 12:26

Kod który wkleiłes daje 1/5 szans na odbicie obrażeń

Zmień 5 na 1 w tym randomie jak Ci idę nie chce usuwać ifa
  • +
  • -
  • 0

#12 AwIlL^^

    Magiczny Gość

  • Użytkownik

Reputacja: 135
Zaawansowany

  • Postów:263
  • Steam:steam
  • Imię:Eryk
  • Lokalizacja:Gdańsk
Offline

Napisano 02.10.2019 14:20

Zostawiłem tam ExecuteHamB, należy zmienić na ExecuteHam tak jak podał tiback bo inaczej serwer się zwiesi
  • +
  • -
  • 0

Potrzebujesz porad do amxx?? Pisz na [PW]


#13 wonsz żeczny

    Wszechwidzący

  • Użytkownik

Reputacja: 83
Zaawansowany

  • Postów:256
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 02.10.2019 14:30   Najlepsza odpowiedź

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamInteger(1, atakujacy);
	SetHamParamInteger(3, ofiara);

	return HAM_HANDLED;	
}

A tak?:

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamEntity(1, atakujacy);
	SetHamParamEntity(3, ofiara);

	return HAM_HANDLED;	
}

  • +
  • -
  • 2

#14 ZajOnDz

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
Nowy

  • Postów:22
  • Lokalizacja:Bielsk Podlaski
Offline

Napisano 02.10.2019 19:26

Kod który wkleiłes daje 1/5 szans na odbicie obrażeń

Zmień 5 na 1 w tym randomie jak Ci idę nie chce usuwać ifa

 

Po zmianie na 1 przez chwile ja i bot byliśmy nieśmiertelni, a po kilku sekundach zawiesił się serwer.

 

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamInteger(1, atakujacy);
	SetHamParamInteger(3, ofiara);

	return HAM_HANDLED;	
}

A tak?:

public odbicie_obrazen(ofiara, idinflictor, atakujacy, Float:obrazenia, damagebits){
	
	SetHamParamEntity(1, atakujacy);
	SetHamParamEntity(3, ofiara);

	return HAM_HANDLED;	
}

 

 To działa jak należy :)  Dzięki Wonsz :) o to mi chodziło.

Tak, więc temat do zamknięcia :)

Dzięki wszystkim za pomoc :)


  • +
  • -
  • 0

#15 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 584
Godlike

  • Postów:12 053
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 02.10.2019 21:13

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych