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

Jak dobrze zabic za pomoca amxx'a


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

#1 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 21.07.2008 23:14

*
Popularny

Ci co robili plugi, lub mieli pod reka troche gorzej napisane, to mogli zauwazyc ze czasem jak zabije sie kogos za pomoca pluga, albo sie nie pojawia komunikat o smierci, lub pojawiaja sie 2 rownoczesnie...

Macie tu funkcje co ulatwia pisanie pluga :DD

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>

new gmsgDeathMsg
new gmsgScoreInfo

public plugin_init() {
	gmsgDeathMsg = get_user_msgid("DeathMsg")
	gmsgScoreInfo = get_user_msgid("ScoreInfo") 
	
	set_msg_block ( gmsgDeathMsg, BLOCK_SET ) 
}

public UTIL_Kill(attacker,id,weapon[])
{
	
	if(get_user_team(attacker)!=get_user_team(id))
		set_user_frags(attacker,get_user_frags(attacker) +1);
	if(get_user_team(attacker)==get_user_team(id))
		set_user_frags(attacker,get_user_frags(attacker) -1);
		
	if (cs_get_user_money(attacker) + 150 <= 16000)
		cs_set_user_money(attacker,cs_get_user_money(attacker)+150)
	else
		cs_set_user_money(attacker,16000)
	
	user_kill(id,1) 
	message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0) 
	write_byte(attacker) 
	write_byte(id) 
	write_byte(0) 
	write_string(weapon) 
	message_end() 
	
	message_begin(MSG_ALL,gmsgScoreInfo) 
	write_byte(attacker) 
	write_short(get_user_frags(attacker)) 
	write_short(get_user_deaths(attacker)) 
	write_short(0) 
	write_short(get_user_team(attacker)) 
	message_end() 
	
	message_begin(MSG_ALL,gmsgScoreInfo) 
	write_byte(id) 
	write_short(get_user_frags(id)) 
	write_short(get_user_deaths(id)) 
	write_short(0) 
	write_short(get_user_team(id)) 
	message_end() 
}

public DeathMsg()
{
	new weaponname[20]
	new kid = read_data(1)
	new vid = read_data(2) 
	new headshot = read_data(3)
	read_data(4,weaponname,31)
	
	show_deadmessage(kid,vid,headshot,weaponname)
}

public show_deadmessage(killer_id,victim_id,headshot,weaponname[])
{
	if (!(killer_id==victim_id && !headshot && equal(weaponname,"world")))
	{
		message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0)
		write_byte(killer_id)
		write_byte(victim_id)
		write_byte(headshot)
		write_string(weaponname)
		message_end()
	}
}

By zabic goscia uzywamy funkcji
UTIL_Kill(attacker,id,weapon[]) - attacker to id gracza ktory zabija, a id to gracz ktory ma zostac zabity, weapon[] - to nazwa broni (potrzebne do prawidlowego wyswietlenia komunikatu o zabiciu).

Reszta kodu odpowiada tylko by nie pojawial sie komunikat 2x i by tablica wynikow byla aktualna :)
  • +
  • -
  • 6

#2 silversurfer

    Profesjonalista

  • Użytkownik

Reputacja: 37
Życzliwy

  • Postów:209
  • Lokalizacja:Poznań
Offline

Napisano 22.07.2008 01:33

Miczu, Dziękuję tego szukałem.
  • +
  • -
  • 0

#3 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

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

Napisano 25.03.2009 20:02

IsHeadshot?
  • +
  • -
  • 0

#4 ToRRent

    Czempion

  • Power User

Reputacja: 229
Wszechwidzący

  • Postów:861
  • Imię:Łukasz
  • Lokalizacja:Wrocław
Offline

Napisano 27.05.2011 16:28

a jezeli nie zabijam z żadnej broni ? :P i chcę żeby były czaszki na deathnotice to co mam wpisać ?
  • +
  • -
  • 0

#5 Apple()

    Wszechpomocny

  • Użytkownik

Reputacja: 129
Zaawansowany

  • Postów:398
  • Steam:steam
  • Lokalizacja:Długość geo. 22.632246 szerokość 51.221584
Offline

Napisano 27.05.2011 16:46

Nie jestem pewien ale spróbuj trigger_hurt.Albo zostaw puste.

Użytkownik Apple() edytował ten post 27.05.2011 16:47

  • +
  • -
  • 0

#6 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 27.05.2011 18:15

weapon "world" powinno dzialac :D
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#7 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 28.05.2011 22:36

czaszka się pokazuje zawsze jak nie zostanie rozpoznana żadna z broni z gry, więc możesz tam wpisać nawet nazwisko rodowe swojej prababci :)

funkcja jest już trochę stara, odkąd w skład amxx weszła kanapka z szynką to ona najlepiej nadaje się do zabijania graczy
  • +
  • -
  • 0

#8 Nomaf

    Wszechpomocny

  • Użytkownik

Reputacja: 157
Profesjonalista

  • Postów:344
  • GG:
  • Imię:Mateusz
  • Lokalizacja:Polska
Offline

Napisano 07.07.2011 20:35

Można prosić o update?
  • +
  • -
  • 0

#9 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 07.07.2011 20:52

Podane tu podejście wygląda tak:
sprawdź czy po zabraniu graczowi HP za obrażenia powinien jeszcze żyć, jeśli nie to symuluj jego śmierć


Dzięki hamsandwich możemy zadać obrażenia tak samo jak robią to bronie. W przypadku śmiertelnych obrażeń klasa bytu ent będzie służyła za nazwę broni.
#include <fakemeta>
#include <hamsandwich>

stock UTIL_Kill(killer, victim, damagebits, ent = 0, const szWeapon[] = ""){
	new Float:fHP;
	pev(victim, pev_health, fHP);
	set_pev(victim, pev_health, 1.0);
	
	UTIL_Damage(killer, victim, fHP, damagebits, ent, szWeapon);
}

stock UTIL_Damage(attacker, victim, Float:fDamage, damagebits, ent = 0, const szWeapon[] = ""){
	static info_target = 0;
	if(!info_target)
		info_target = engfunc(EngFunc_AllocString, "info_target");
	
	if(pev_valid(ent))
		ExecuteHamB(Ham_TakeDamage, victim, ent, attacker, fDamage, damagebits);
	else{
		ent = engfunc(EngFunc_CreateNamedEntity, info_target);
		set_pev(ent, pev_classname, szWeapon);
		ExecuteHamB(Ham_TakeDamage, victim, ent, attacker, fDamage, damagebits);
		set_pev(ent, pev_flags, FL_KILLME);
	}
}

Powyższa funkcja powinna dostać id bytu (ent) lub 0 i naszą nazwę
UTIL_Damage(attacker, victim, Float:fDamage, damagebits, ent);
UTIL_Damage(attacker, victim, Float:fDamage, damagebits, 0, "nazwa broni");

warto przedtem sprawdzić czy gracz albo byt jest nieśmiertelny
if(pev(victim, pev_takedamage))
	UTIL_Damage(...)

  • +
  • -
  • 1

#10 Nomaf

    Wszechpomocny

  • Użytkownik

Reputacja: 157
Profesjonalista

  • Postów:344
  • GG:
  • Imię:Mateusz
  • Lokalizacja:Polska
Offline

Napisano 07.07.2011 21:31

Czyli jak mam zarejestrowaną funkcję, np. RegisterHam(Ham_Killed, "player", "death_event_post", 1)

to funkcja powinna wyglądać tak:

public death_event_post(id, attacker, shouldgib)
{
if(!is_user_connected(attacker))
return HAM_IGNORED;

if(get_user_team(id) != get_user_team(attacker))
UTIL_Kill(attacker, id, shouldgib, id, get_user_weapon(attacker))

return HAM_SUPERCEDE;
}


?
  • +
  • -
  • 0

#11 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 07.07.2011 21:38

Hamsandwich wymaga małej wprawy:
damagebits to suma flag z hlsdk DMG_*
szWeapon to string, a nie id broni

public death_event_post(id, attacker, shouldgib)
{
   if(!is_user_connected(attacker))
      return HAM_IGNORED;

   if(get_user_team(id) != get_user_team(attacker)){
   	new szWeapon[32];
   	new wid = get_user_weapon(attacker);
	get_weaponname(wid, szWeapon, 31);
	
	UTIL_Kill(attacker, id, (shouldgib?DMG_ALWAYSGIB:DMG_NEVERGIB), 0, szWeapon);
  }

   return HAM_SUPERCEDE;
}

Tylko uważaj, bo UTIL_Kill może wywołać Ham_Killed i dostaniesz nieskończoną rekurencję
  • +
  • -
  • 1

#12 Nomaf

    Wszechpomocny

  • Użytkownik

Reputacja: 157
Profesjonalista

  • Postów:344
  • GG:
  • Imię:Mateusz
  • Lokalizacja:Polska
Offline

Napisano 08.07.2011 20:39

ExecuteHam nie wywoluje zdarzen zarejestrowanych w RegisterHam


Więc jak zrobić?

Użytkownik Nomaf edytował ten post 08.07.2011 20:42

  • +
  • -
  • 0

#13 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 08.07.2011 23:09

normalnie poprostu cos w stylu

public plugin_init(){
    RegisterHam(Ham_Spawn,"player","fwd_spawn",1)
}
public test(id){
  //zabicie gracza
  ExecuteHam(Ham_Spawn,id)
}
public fwd_spawn(id)
   test(id)

nie spowoduje zapetlenia sie :D
  • +
  • -
  • 2
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D




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

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