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

Wiekszy damage // Problem z hudem


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

#1 Filip1512

    Wszechmogący

  • Power User

Reputacja: 137
Zaawansowany

  • Postów:641
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:Poland
Offline

Napisano 18.01.2013 02:46

Cześć,
próbuję napisać funkcję, która będzie dawała danemu graczowi większy damage o 10%, lecz to nie działa, a wygląda to tak:

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


public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits, id){
if(wiekszy_dmg[id]){
new Float:newdamage = damage*1.1
SetHamParamFloat(4, newdamage);
return HAM_HANDLED;
}

return HAM_IGNORED;
}


Co jest tutaj źle?
Co więcej, w tej funkcji, która jest powiązana dzieją się dziwne rzeczy z tekstem na hudzie - parametry osi x i y tak jak by nie reagują na zmiany, chce, aby były po lewej stronie pod radarem, czyli ustawiam x=0.5 i y=-1.0

new nick[33];
get_user_name(id, nick, 32)
set_hudmessage(255, 0, 0, 0.1, -1.0, 1, 1.0, 7.0, 2.0, 1.0, 2)
ShowSyncHudMsg(0, CreateHudSyncObj(), "Gracz %s zadaje 10%% wiecej obrazen!", nick)


A hud pokazuje się gdzieś z prawej strony tak trochę wyżej niż w połowie...

Użytkownik `NN edytował ten post 18.01.2013 02:49

  • +
  • -
  • 0
Filip / `NN
Wymuszanie rate'ów co spawna - update v2.1!

#2 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 18.01.2013 08:15

1. Nie wiem skąd to id, w tym id atakującego to idattacker. Sprawdzaj także, czy zmienna wiekszy_dmg jest ustawiona na true ;)

2. X - 0.02 | Y - 0.2
  • +
  • -
  • 1

If you can dream it, you can do it.


#3 Filip1512

    Wszechmogący

  • Autor tematu
  • Power User

Reputacja: 137
Zaawansowany

  • Postów:641
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:Poland
Offline

Napisano 18.01.2013 12:20

1.
				   	 case 15: {
new nick[33];
get_user_name(id, nick, 32)
set_hudmessage(255, 0, 0, 0.1, -1.0, 1, 1.0, 7.0, 2.0, 1.0, 2)
ShowSyncHudMsg(0, CreateHudSyncObj(), "Gracz %s zadaje 10%% wiecej obrazen!", nick)
ColorChat(id, GREEN, "Zadajesz 10%% wiecej obrazen ze wszystkich broni!")
cs_set_user_money(id, (cs_get_user_money(id)-get_cvar_num("bonusF_kasa")), 1)
wiekszy_dmg[id] = true;
}



if(wiekszy_dmg[id]){

Sprawdza ;P
Czyli jak to ma wyglądać? Tak?


public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits, id){
if(wiekszy_dmg[this]){
new Float:newdamage = damage*1.1
SetHamParamFloat(4, newdamage);
return HAM_HANDLED;
}

return HAM_IGNORED;
}



2. Już sobie jakoś poradziłem, chciałem na środku przy lewej krawędzi jak coś, ale dzięki :P

Użytkownik `NN edytował ten post 18.01.2013 12:21

  • +
  • -
  • 0
Filip / `NN
Wymuszanie rate'ów co spawna - update v2.1!

#4 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 18.01.2013 12:49

Chodziło mi, o to, czy ustawiasz gdzieś zmienną wieksze_dmg na true.

Poprawiłem post wyżej, bo pomyliłem this z idattacker. Z funkcji TakeDamage usuń parametr id. Śpieszyłem się rano i nie popatrzyłem dokładnie ;)
speedkill (18.01.2013 12:50):
Zobacz jak jest to zrobione w Vip-Generatorze -> http://amxx.pl/vipgenerator

  • +
  • -
  • 0

If you can dream it, you can do it.


#5 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 18.01.2013 13:23

	/**
* Description: Usually called whenever an entity takes any kind of damage.
* Inflictor is the entity that caused the damage (such as a gun).
* Attacker is the entity that tirggered the damage (such as the gun's owner).
* Forward params: function(this, idinflictor, idattacker, Float:damage, damagebits);
* Return type: Integer.
* Execute params: ExecuteHam(Ham_TakeDamage, this, idinflictor, idattacker, Float:damage, damagebits);
*/
Ham_TakeDamage,


this to id ofiary obrażeń
idinflictor to id bytu zadającego obrażenia
idattacker to id bytu, będącego atakującym.
damage to zadawane obrażenia (nie zabierane życie)
damagebits to flagi obrażeń (np. od ognia, gazu trującego, czy kuli pistoletu)

Zauważ, że atakujący (idattacker) nie musi być graczem, może być to równie dobrze lawa, prąd lub byt bólu.
Należy zatem sprawdzić, czy atakujący jest graczem i najlepiej dodać warunek na to, czy jest on z innej drużyny.
Nie zawsze jednak atakujący jest określony lub jest określony poprawnie. Wówczas istnieje szansa, że odczytamy atakującego,
pobierając id właściciela bytu zadającego obrażenia (np. właściciela granatu HE, czyli osobę, która granat w nas rzuciła).

Nie uwzględnienie tego sprawi, że będziesz próbował chociażby pobrać element tablicy o indeksie bytu > 33, co zakończy się każdorazowo błędem.

Przykład implementacji:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define IsPlayer(%1) (1<=%1<=maxPlayers)

new wiekszy_dmg[33], maxPlayers;

public plugin_init(){
register_plugin("", "", "");
RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 0);
}

public plugin_cfg(){
maxPlayers=get_maxplayers();
}

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
new ioid, // inflictor owner id, czyli id bytu zadającego obrażenia
raid; // real attacker id, czyli gracz odpowiedzialny za zadanie obrażeń

if(IsPlayer(idattacker)){
raid=idattacker; // atakujący jest graczem
} else {
ioid=pev(idinflictor, pev_owner); // pobranie właściciela bytu zadającego obrażenia
if(IsPlayer(ioid)){
raid=ioid; // właściciel bytu zadającego obrażenia jest graczem
}
}

if(raid && wiekszy_dmg[raid]){
new Float:newdamage = damage*1.1
SetHamParamFloat(4, newdamage);
return HAM_HANDLED;
}

return HAM_IGNORED;
}

sebul (18.01.2013 17:05):
W przypadku granatu, idattacker i tak chyba przyjmuje wartość id rzucającego.
(18.01.2013 17:37):
Masz rację, granat nie był najlepszym przykładem, ale są byty (zwłaszcza tworzone na potrzeby danych modów), które wymagają pobrania właściciela.


#6 Filip1512

    Wszechmogący

  • Autor tematu
  • Power User

Reputacja: 137
Zaawansowany

  • Postów:641
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:Poland
Offline

Napisano 18.01.2013 17:27

A co z granatami? Bo nóż będzie zadawał obrażenia, a granaty?
Benio, ogólnie to Twojego kodu moge już normalnie użyć i będzie działał, tak?
  • +
  • -
  • 0
Filip / `NN
Wymuszanie rate'ów co spawna - update v2.1!

#7 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 18.01.2013 17:39

Powinien działać, ew, ogranicz się do sprawdzenia, czy atakujący jest graczem.




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

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