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

Wpływanie na obrażenia


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
26 odpowiedzi w tym temacie

#1 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 21.09.2009 18:31

*
Popularny

Wpływanie na obrażenia
używając modułu hamsandwich

Aby mieć możliwość edycji obrażeń należy złapać zdarzenie Ham_TakeDamage z post=0

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

#define PLUGIN "HamSandwich Damage"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0);
}

event łapiemy w funkcji (ja nazwałem ją "fwTakeDamage"), której parametry są następujące
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_IGNORED;
}

this - atakowany gracz
idinflictor - byt zadający obrażenia
idattacker - byt powodujący obrażenia
damage - wielkość obrażeń
damagebits - typ obrażeń

jeśli idattacker to gracz zazwyczaj idinflictor to również id atakującego, wyjątek stanowi granat: w tym przypadku idinflictor to indeks bytu granatu
w przeciwnym razie (!is_user_connected(idattacker)), idinflictor może być bytem typu trigger_hurt lub po prostu 0

damagebits przekazuje informacje o obrażeniach na podstawie składowych flag:
#define DMG_GENERIC                     0           // Generic damage was done
#define DMG_CRUSH                       (1<<0)      // Crushed by falling or moving object
#define DMG_BULLET                      (1<<1)      // Shot
#define DMG_SLASH                       (1<<2)      // Cut, clawed, stabbed
#define DMG_BURN                        (1<<3)      // Heat burned
#define DMG_FREEZE                      (1<<4)      // Frozen
#define DMG_FALL                        (1<<5)      // Fell too far
#define DMG_BLAST                       (1<<6)      // Explosive blast damage
#define DMG_CLUB                        (1<<7)      // Crowbar, punch, headbutt
#define DMG_SHOCK                       (1<<8)      // Electric shock
#define DMG_SONIC                       (1<<9)      // Sound pulse shockwave
#define DMG_ENERGYBEAM                  (1<<10)     // Laser or other high energy beam 
#define DMG_NEVERGIB                    (1<<12)     // With this bit OR'd in, no damage type will be able to gib victims upon death
#define DMG_ALWAYSGIB                   (1<<13)     // With this bit OR'd in, any damage type can be made to gib victims upon death.
#define DMG_DROWN                       (1<<14)     // Drowning
#define DMG_PARALYZE                    (1<<15)     // Slows affected creature down
#define DMG_NERVEGAS                    (1<<16)     // Nerve toxins, very bad
#define DMG_POISON                      (1<<17)     // Blood poisioning
#define DMG_RADIATION                   (1<<18)     // Radiation exposure
#define DMG_DROWNRECOVER                (1<<19)     // Drowning recovery
#define DMG_ACID                        (1<<20)     // Toxic chemicals or acid burns
#define DMG_SLOWBURN                    (1<<21)     // In an oven
#define DMG_SLOWFREEZE                  (1<<22)     // In a subzero freezer
#define DMG_MORTAR                      (1<<23)     // Hit by air raid (done to distinguish grenade from mortar)
#define DMG_TIMEBASED                   (~(0x3fff)) // Mask for time-based damage
np.
if(damagebits&DMG_BLAST){ //gracz prawdopodobnie zginął od wybuchu bomby
}

Zarejestrowanie Ham_TakeDamage z post = 0 daje możliwość ingerencji w przebieg tego wydarzenia.

Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_SUPERCEDE;
}

albo zmienić dowolny parametr funkcji przy użyciu funkcji SetHamParam*, gdzie * to typ argumentu.

SetHamParamInteger - dla liczby całkowitej
SetHamParamFloat - dla liczby rzeczywistej
SetHamParamVector - dla wektora (Float:v[3])
SetHamParamEntity - dla bytu (np. id gracza)
SetHamParamString - tekst

Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany.

Przykład:
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	SetHamParamFloat(4, 100.0);
	return HAM_HANDLED;
}
Zmieniamy czwarty argument (damage) typu Float: na 100.0, co spowoduje, że praktycznie każde uderzenie czy upadek skończy się śmiercią.

W połączeniu z warunkami daje to nam całkowitą kontrolę nad obrażeniami.


Uwaga:
Broń z jakiej zadane zostały obrażenia (przy podłączony idattacker) to:
- w przypadku idinflictor==idattacker
new bron = get_user_weapon(idattacker);
- w przypadku idinflictor!=idattacker
new bron = CSW_HEGRENADE;

  • +
  • -
  • 25

#2 Knopers

    Nie patrz tak na mnie !

  • Przyjaciel

Reputacja: 588
Wszechwiedzący

  • Postów:2 013
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Cz-wa
Offline

Napisano 21.09.2009 18:43

Ładny tutek R3X ^^ osobiście mało wiedziałem o hamsandwich teraz wiem mało + jeszcze trochę ;P
  • +
  • -
  • 0

#3 Vertricus

    Godlike

  • Przyjaciel

Reputacja: 426
Wszechobecny

  • Postów:1 549
  • Lokalizacja:.
Offline

Napisano 21.09.2009 21:11

A możesz mi powiedzieć jak w tej funkcji pobrać ID broni, część ciała w którą trafiliśmy?
  • +
  • -
  • 0

#4 Knopers

    Nie patrz tak na mnie !

  • Przyjaciel

Reputacja: 588
Wszechwiedzący

  • Postów:2 013
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Cz-wa
Offline

Napisano 21.09.2009 21:26

A możesz mi powiedzieć jak w tej funkcji pobrać ID broni, część ciała w którą trafiliśmy?


Co do drugiego to chyba możesz użyć get_user_hitzone z fun'a
  • +
  • -
  • 0

#5 Vertricus

    Godlike

  • Przyjaciel

Reputacja: 426
Wszechobecny

  • Postów:1 549
  • Lokalizacja:.
Offline

Napisano 21.09.2009 21:30

Przeanalizowałem dokumentacje i chyba najlepszym wyjściem będzie
new weapon, bodypart
get_user_attacker(id,weapon,bodypart)

[ Dodano: 25-09-2009, 20:19 ]
Gdy używam tej funkcji nie pokazuje mi hizones z noża :<
  • +
  • -
  • 0

#6 wlochen

    Zaawansowany

  • Użytkownik

Reputacja: 9
Nowy

  • Postów:79
  • GG:
  • Imię:Kamil
  • Lokalizacja:z Csowa
Offline

Napisano 12.03.2010 18:57

mam problem mógł by ktoś tak zrobić żeby glock zabierał 90 hp piorunem
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

#define PLUGIN "HamSandwich Damage"
#define VERSION "1.0"
#define AUTHOR "R3X"
#define DMG_SHOCK                       (1<<8)      // Electric shock





public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0);
}
public fwTakeDamage(this, idinflictor, idattacker, Float:90,if(damagebits&DMG_SHOCK){ //gracz prawdopodobnie zginął od wybuchu bomby
}

	SetHamParamFloat(4, 100.0);
	return HAM_HANDLED;
}
prosił bym o poprawienie kodu
  • +
  • -
  • 0

#7 Owner123

    Wszechpomocny

  • Użytkownik

Reputacja: 146
Zaawansowany

  • Postów:331
  • Lokalizacja:Barty ;]
Offline

Napisano 13.03.2010 12:36

public fwTakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
if(damagebits & DMG_SHOCK)
SetHamParamFloat(4, 90.0);
return HAM_IGNORED;
}

Użytkownik Owner123 edytował ten post 13.03.2010 12:41

  • +
  • -
  • 2

#8 Gość_deLLek_*

  • Gość

Reputacja: 0

Offline

Napisano 01.04.2010 14:51

Które to będzie.. "Jeżeli gracz spadł z wysokości i się zabił" ?

#9 Vertricus

    Godlike

  • Przyjaciel

Reputacja: 426
Wszechobecny

  • Postów:1 549
  • Lokalizacja:.
Offline

Napisano 01.04.2010 23:23

#define DMG_FALL (1<<5) // Fell too far
  • +
  • -
  • 1

#10 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 11.09.2010 19:03

Przeanalizowałem dokumentacje i chyba najlepszym wyjściem będzie
new weapon, bodypart
get_user_attacker(id,weapon,bodypart)

[ Dodano: 25-09-2009, 20:19 ]
Gdy używam tej funkcji nie pokazuje mi hizones z noża :<

RegisterHam(Ham_TraceAttack,"player","func_TraceAttack")
...
public func_TraceAttack(id,idattacker,Float:damage,Float:direction[3],traceresult,damagebits)
{
hitbox[id] = get_tr2(traceresult,TR_iHitgroup)


return HAM_IGNORED
}

Użytkownik grankee edytował ten post 11.09.2010 19:04

  • +
  • -
  • 0

#11 Screeaam...

    ; ooo

  • Zbanowany

Reputacja: 154
Profesjonalista

  • Postów:1 012
  • Lokalizacja:Sosnowiec
Offline

Napisano 08.10.2010 14:51

public fwTakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
if(damagebits & DMG_SHOCK)
SetHamParamFloat(4, 90.0);
return HAM_IGNORED;
}


Co to da? Obrażenia zwiększone do 90 i jakiś piorun? ock? I jak mogę to podpiąć po klasę? Jak zmienna z jakim parametrem powinna być?

A da się to zrobić, aby było pod przyciskiem E?

Użytkownik Screeaam... edytował ten post 08.10.2010 14:55


#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 08.10.2010 14:57

od dzielny temat kufa !
piorunem - błyskawicznie
  • +
  • -
  • 0

#13 KadrO

    Pomocny

  • Użytkownik

Reputacja: 5
Nowy

  • Postów:40
  • GG:
  • Lokalizacja:J-bie
Offline

Napisano 08.04.2012 13:33

Chciałem zrobić że gdy posiadamy item X to obrażenia które otrzymujemy w głowę są zmniejszone o połowę.
W jaki sposób pobrać część ciała w którą nie zaatakujemy, a w którą otrzymamy obrażenia.

Pobieram tak :

  new weapon, bodypart
get_user_attacker(attacker,weapon,bodypart)


A potem :

  else if(X && bodypart==1)
{
SetHamParamFloat(4, damage*0.50)
}


I nie działa. W czym problem?
  • +
  • -
  • 0

#14 WinnetoU

    Banned

  • Zbanowany

Reputacja: -1
Nowy

  • Postów:28
  • Lokalizacja:Gdańsk
Offline

Napisano 01.08.2012 20:31

Zawalisty trutek Łapaj +

#15 czekolada147

    Początkujący

  • Użytkownik

Reputacja: 8
Nowy

  • Postów:15
  • Imię:Krystian
  • Lokalizacja:Zwierzyniec
Offline

Napisano 02.08.2012 09:49

Ładnie napisanie strzałka leci
  • +
  • -
  • 1

#16 ogieR8

    Wszechmogący

  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 06.12.2014 18:29

Mam pytanko w sumie.. jeśli w pierwszym pluginie wpłyniemy na obrażenia, aby zadawało ich 2 razy więcej.. a w drugim pluginie wpłyniemy na obrażenia (jeśli spełnimy określone warunki), aby obrażenia zredukować o -10.0 ? Jak to wyjdzie w praniu ? Mam taką wizję, ale nie jestem pewny :D

 

Spoiler

 

Dobrze myślę ?


  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !


#17 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 06.12.2014 19:00

Nope...

 

100 * 2 * 0.9 to 180 :) Pamiętajmy, że procenty liczymy z nowej wartości.

 

Kolejność może mieć znaczenie w zależności od tego, w jaki sposób modyfikujesz obrażenia. Jeśli robisz to brzydko (inne pluginy nie mają możliwości złapać zmiany) lub jeszcze brzydziej (plugin przy zmianie ignoruje wartość zmienioną i bazuje na domyślnej) to tylko jeden z pluginów zmodyfikuje obrażenia. Raz będzie to ten wyżej w plugins.ini (przypadek brzydki), a raz ten niżej (przypadek brzydszy).


  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#18 ogieR8

    Wszechmogący

  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 06.12.2014 20:56

A podasz specyfik, aby inne pluginy mogły łapać zmiany ? Mam na swoim serwerze 'unikalnych' +20 broni, zrobiłem już forwardy, którymi w silniku diablo przydzieliłem bronie do odpowiednich klas (proszę o nie hejtowanie, to nie diablo, tylko na jego silniku pracuje, nie chce psuć atmosfery Diablo z powodu wymyślonych nowych, dziwnych broni). I teraz tak, w broniach są poustawiane obrażenia, mnożniki, sztywno ustawione w zależności od hitbox'a, bo nie jest to zwykła podmianka, tylko część z nich są tworzone od nowa.. a w diablo znów .. jest np. statystyka zręczność, która wraz z jej wzrostem zmniejsza zadawane nam obrażenia. I dla przykładu.. jedna z broni jest podmieniona jako ump45, nowe modele, sprites, weaponlist, soundy, traceline, nowe moce broni przy PPM i tam jest mnożnik obrażeń, czyli wczytuje oryginalne obrażenia z UMP45 i mnoży je przez wartość podaną w cvarze.. Nie wiem jak zrobić, by łapać zmiany, myślałem, że nie działają one jednocześnie, wręcz w pewnej poukładanej kolejności modyfikuje obrażenia i wartości są 'przesyłane' pomiędzy pluginami :D

 

// dodam, ze wczytywanie w kazdej broni czy gracz ma zrecznosc, jesli tak to ile i tam zmiana troszke bd obciazajaca i w sumie nie jest to dla mnie rozwiazaniem, bo w moim silniku diablo jest wiele zmian odnosnie obrazen, nie tylko ta jedna statystyka :/


  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !


#19 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 07.12.2014 14:47

Ja tu widzę pewne nieścisłości.

W przypadku gdy użyjemy 

SetHamParamFloat(4,1.0)
return HAM_IGNORED
return HAM_HANDLED
return HAM_OVERRIDE

da z grubsza ten sam efekt-obrażenia zostaną zmniejszone do podanej wartości, w tym przypadku 1.0 i kolejne* pluginy wyłapią już tą nadpisaną przez nas wartość.

return HAM_SUPERCEDE

zablokuje te obrażenia, ale nadal będą wyłapywane przez kolejne* pluginy  nadpisaną przez nas wartością.

Co ciekawe rejestracja zdazenia post/pre jest tu bez znaczenia, obrazenia zarejestrowane jako post i zmienione w pierwszym pluginie, beda wylapywane w kolejnym pluginie (gdzie zarejestrujemy pre) juz po naszych zmianach.

*kolejne-pluginy umieszczone w plugins.ini pod pluginem, w którym wprowadzamy zmiany.


Mogę się mylić, ale wydaje mi się, że kolejność w plugins.ini nie ma tutaj znaczenia.

Nic bardziej mylnego. Jeżeli zrobimy na odwrót tj, w drugim pluginie wprowadzimy zmiany, a w pierwszym wyłapujemy to obrażenia w drugim zostaną zmienione, ale ten pierwszy wyłapie wartość jeszcze przed zmianą.

 

 

Gdyby kolega chciał jedynie mnożyć obrażenia to faktycznie kolejność nie ma znaczenia jako że mnożenie jest przemienne. Jeśli jednak ma też odejmowanie to ma to znaczenie co zrobi najpierw.

 


  • +
  • -
  • 2

#20 ogieR8

    Wszechmogący

  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 07.12.2014 16:13

Czyli reasumując dobrze myślałem, że kolejność w plugins.ini odgrywa tutaj znaczenie (o ile nie mnożymy tylko, bo jest wiadomo przemienne). Zaraz zacznę testować to na 2/3 pluginach i zdam dokładną relację jak się pluginy zachowały.


  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !





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

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