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
CoD Nowy

Problem 1/x z broni nie działa poprawnie

cod nowy

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

#1 ex0

    Wolny strzelec.

  • Power User

Reputacja: 383
Wszechpomocny

  • Postów:1 127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 10.06.2014 07:23

Witam, jak w temacie.
Od dnia wczorajszego zaobserwowałem dziwne zjawisko, a mianowicie stosując funkcję

 

if(weapon == CSW_HEGRENADE && damage > 20.0)
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);

Nie otrzymujemy 1/1 na zabicie jak powinno być a raczej różne rodzaje DMG.

Poczynając od 700 (Jeżeli mamy w granicach 1000 hp) do nawet 3700 (Jeżeli mamy w granicach 4500 hp)

 

Czyli jak widać funkcja niezbyt poprawnie działa, dodatkowo tylko pierwszy strzał jest tak mocny, a pozostałe już są standardowe, zwiększone zgodnie z DMG klasy lub zmniejszone odpowiednio do tego co pisałem na górze czyli wartości pozostałego HP u gracza przeciwnego.

następną sprawą jest, że kompletnie nie działa mi (bynajmniej tak mi się zdaje, lub działa tak jak to powyżej) 1/x z danej broni

if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);

Przykładowo to.

A cała funkcja wygląda u mnie tak:

 

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
	
	if(!is_user_connected(idattacker))
		return HAM_IGNORED; 
	
	if(!ma_klase[idattacker])
		return HAM_IGNORED;
	
	if(damagebits & DMG_BULLET)
	{	
		new weapon = get_user_weapon(idattacker);
	
		if(weapon == CSW_HEGRENADE && damage > 20.0)
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
	
		if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
			
		if(weapon == CSW_AK47 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);	
	
		if(weapon == CSW_DEAGLE && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);				
	
		if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_M4A1 && damagebits & DMG_BULLET)
			cod_inflict_damage(idattacker, this, 100.0, 1.0, idinflictor, damagebits);
	}
	
	return HAM_IGNORED;
	
}

Zdziwiło mnie to, lecz kolega dla faktu 1/1 stwierdził, że lepszym rozwiązaniem będzie użycie

SetParamFloat

Więc zastosowałem to tak:

 

 if(weapon == CSW_KNIFE && damage > 20.0) {
       SetParamFloat(4, get_user_health(this))

I tutaj ku mojemu ogromnemu zdziwieniu ....

 

publicTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
   if(!is_user_connected(idattacker))
       return HAM_IGNORED;

   if(!ma_klase[idattacker])
       return HAM_IGNORED;

   if(damagebits & DMG_BULLET)
   {
       new weapon = get_user_weapon(idattacker);

       if(weapon == CSW_KNIFE && damage > 20.0) {
       SetParamFloat(4, get_user_health(this))


	return HAM_HANDLED;
        }
   }
		return HAM_IGNORED
}

Tak wygląda funkcja, a mianowicie w oczy rzuca się dla mnie to :

 

publicTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)

Jak widać bez zastosowanej spacji, wtedy nie wyskakują errory z niezdefiniowanym symbolem (już nie pamiętam jakim), natomiast po oddzieleniu spacją wyskakuje własnie takowy error.
A tak to tutaj tylko warrning wyskakuje, że symbol nie jest (był) nigdzie używany(użyty).

 

Czy ktoś mi może odpowiedzieć co tutaj mogłoby szlag trafić i nie działać?
Ponieważ to bardzo irytujące ;>

 

Ogólnie podstawy jak:

 

#define DMG_BULLET (1<<1)

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

są zawarte w kodzie.

Jakieś pomysły? :google:


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#2 ex0

    Wolny strzelec.

  • Autor tematu
  • Power User

Reputacja: 383
Wszechpomocny

  • Postów:1 127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 12.06.2014 19:13

if(weapon == CSW_HEGRENADE && damage > 20.0)

Zmień na:

if(damagebits & (1<<24))

Przy broniach zrób tak:

if(weapon == CSW_M4A1 && damagebits & DMG_BULLET && random_num(1,6) == 1) 

Ogólnie mistrzu to nie pykło . :<


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#3 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 12.06.2014 20:06

Proszę wszystko jasno opisane:

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

public plugin_init()
{
	register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)")
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage",0)		//Rejestruje momęt zadania dmg graczu
}

public TakeDamage(id, ent, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !is_user_alive(id) || id == attacker)	return HAM_IGNORED
	// Sprawdzam czy osoba zadająca dmg jest graczem (+ czy jest naserwie)
	// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
	// Sprawdzam czy ktoś nie zadał sam sobie dmg
	
	if(ent == attacker)// Porównuje byt zadający dmg z bytem gracza 
	{	
		//(tzn. warunek spełni się gdy to gracz zada dmg bezpośrednio czyli nie za pomocą he lub innych bytów)
		// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
		new weapon = get_user_weapon(attacker) 
		switch(weapon)	//Sprawdzam aktualną broń atakującego
		{
			case CSW_KNIFE:
			{
				//Jeśli to nóż
				if(!random(8))
				{
					//I jeśli atakującemu się poszczęściło gdyż ma tylko 12,5% (1/8(ta ósemka jest tą z random)*100% = 12,5%)
					//To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić
					ExecuteHamB(Ham_Killed, id, attacker, 1) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg
				}
			}
			// Użyłem case byś mógł łatwo dodawać sobie bronie gdyż widziałem że ich tam parę masz
			// Pamiętaj w tym warunku nie złapiesz zadanie dmg przez he, lub inne byty niż gracz(i bronie palne+nóż)
		}
	}
	else
	{
		// Tutaj można się pokwapić o złapanie zadania dmg he
		// pobieranie broni nam tu nie pomoże gdyz gracz wyrzucił he i ma coś innego w łapie 
		// chyba że miał ich parę i nie zmienił broni ale nam to pomocne nie będzie gdyż szansa na to jest równa 1 na 1/0
		// Można pobrać classname ent'a zadającego dmg i porównać go do "weapon_hegranade" ale nie lubimy zbyt często porównywać string'ów
		// Dlatego z pomocą przychodzi nam fakemeta
		// Spróbujmy pobrać id broni ale nie bytu
		new weapon = get_pdata_int(ent,43,4) 
		// Tylko nwm czy wartość zostanie poprawnie pobrana gdy byt nie będzie bronią ale 
		// zawsze możesz użyć "damagebits" choć często pluginy używają go w nie konfortowy sposób
		// Czyli masz conajmniej dwa sposoby czy byt to he
		// Nr.1
		if(weapon == CSW_HEGRENADE)
		//Nr.2
		if(damagebits & (1<<24))
		
		//Osobiście użył bym pierwszego (ale najpierw sprawdził jak zachowuje się na byty które nie są brońmi) ale z mojej niewiedzy użyję sposobu nr.2
		if(damagebits & (1<<24))//A zatem jeśli byt zadający dmg to he
		{
			if(!random(2))
			{
				//I jeśli Została wylosowana liczba 0 (możliwe liczby do wylosowania: 0,1 tzn. 50% na liczbę 0)
				//To zabijam gracza
				ExecuteHamB(Ham_Killed, id, attacker, 1) // I to wszystko
			}
		}
	}
}

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#4 ex0

    Wolny strzelec.

  • Autor tematu
  • Power User

Reputacja: 383
Wszechpomocny

  • Postów:1 127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 12.06.2014 20:11   Najlepsza odpowiedź

Wielkie dzięki panu.
Bardzo jasno czytelnie i dobrze opisane.

Browara bym postawił, ale kolega nie z okolic :/


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)






Również z jednym lub większą ilością słów kluczowych: cod nowy

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

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