←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak pobrać id broni

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 13.08.2015

Witam.

Na serwerze posiadam plugin pod komendą "/me":

 

public cmdMe(id) 
{ 
     if(Damage[id]) 
     {
            ColorChat(0, GREEN, "*^x01 Zadales dotychczas^x03 %d^x01 obrazen.", Damage[id]);
     }
     else ColorChat(0, GREEN, "*^x01 Nie zadales obrazen przeciwnikowi.");


     return PLUGIN_HANDLED;
}

Jest możliwość zrobienia, gdy gracz zada dmg np z m4a1 oraz z deagla to wyświetli się tekst:

 

* (M4A1) Zadałeś dotychczas 70 obrazen.

* (Deagle) Zadałeś dotychczas 30 obrazen.

 

I tak z każdą bronią oraz granatami ;)

Jak zada tylko dmg z deagla to tekst:

 

* (Deagle) Zadałeś dotychczas 150 obrazen.

Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 13.08.2015

Tworzymy tablicę która będzie odpowiadać za nazwy broni.

new const playerWeapon[][] = {
	"",
	"P228",
	"",
	"SCOUT",
	"HEGRENADE",
	"XM1014",
	"",
	"MAC10",
	"AUG",
	"",
	"ELITE",
	"FIVESEVEN",
	"UMP45",
	"SG550",
	"GALIL",
	"FAMAS",
	"USP",
	"GLOCK18",
	"AWP",
	"MP5",
	"M249",
	"M3",
	"M4A1",
	"TMP",
	"G3SG1",
	"",
	"DEAGLE",
	"SG552",
	"AK47",
	"KNIFE",
	"P90"
}

Teraz wystarczy odpowiednie ID które będzie równe naszej nazwie z tablicy. W prosty sposób ID pobieramy przez get_user_weapon.

A więc twoja funkcja cmdMe będzie wyglądać tak:

public cmdMe(id) 
{ 
	if(Damage[id]) 
	{
		ColorChat(id, RED, "^x04*^x03(%s)^x01 Zadales dotychczas^x04 %d^x01 obrazen.", playerWeapon[get_user_weapon(id)], Damage[id]);
	}
	else ColorChat(id, RED, "*^x01 Nie zadales obrazen przeciwnikowi.");
	
	
	return PLUGIN_HANDLED;
}

A i zmieniłem w ColorChat(0, [...]) na ColorChat(id, [...]) - chyba nie chcesz żeby każdy widział wiadomość ile gracz i jaką bronią zadał obrażenia :)

 

Po napisaniu wszystkiego dopiero się skapłem o co Ci chodzi dokładniej. Tylko powiedz mi jeszcze jedno. Chcesz by obrażenia był zaliczane osobno, więc muszą się zapisać do jakiejś zmiennej (z tym nie będzie problemu), jednak czy one mają być tylko na jedną rundę? Od nowej rundy się zerują mam nadzieję?

Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 13.08.2015

 

 



Po napisaniu wszystkiego dopiero się skapłem o co Ci chodzi dokładniej. Tylko powiedz mi jeszcze jedno. Chcesz by obrażenia był zaliczane osobno, więc muszą się zapisać do jakiejś zmiennej (z tym nie będzie problemu), jednak czy one mają być tylko na jedną rundę? Od nowej rundy się zerują mam nadzieję?

 

Tak mają być na jedną rundę.

A jak zrobić, gdy gracz zada dmg np z Ak i deagla to wyświetla sie tak:

 

* (AK47) Zadales dotychczas 50 obrazen.*

* (Deagle) Zadales dotychczas 30 obrazen.

 

public cmdMe(id) 
{ 
if(Damage[id]) 
{
if(xxx) 
{
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", playerWeapon[get_user_weapon(id)], Damage[id]);
}
else
{
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", playerWeapon[get_user_weapon(id)], Damage[id]);
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", playerWeapon[get_user_weapon(id)], Damage[id]);
}
}
else ColorChat(id, RED, "*^x01 Nie zadales obrazen przeciwnikowi.");




return PLUGIN_HANDLED;
}

Tylko co wpisać w miejsce XXX ? 

 


Użytkownik 1stADXionC edytował ten post 13.08.2015 21:45
Odpowiedz

  • +
  • -
NoLiFeR - zdjęcie NoLiFeR 13.08.2015

musisz stworzyć tablice, która będzie miała ilość slotów taką jak weaponki od Oena, lecz będzie to tablica dodatkowo taka, do której będziemy mogli przypisać te dane graczowi.

 

new damages[33][31]

 

i sprawdzać, czy ilość slotów zawierających dla danego gracza wartości większe od 0 jest wieksza niż zero.

dam ci funkcyjke

bool:wiecejnizjeden(id)
{
    if(!is_user_connected(id))
        return false;

    new bool:temp = false;

    for(new i=0;i<31;i++){
        if(damages[id][i] > 0){
            if(!temp)
                temp = true;
            else
                return true;
        }
    }
    return false;
}

(Tak wiem, z flasha np nie zadam dmg ^^, ale zachowanie konpatybilności z get_user_weapon przyda Ci się przy pisaniu tych funkcji.)

 

 

Możesz również zastosować 100 razy wydajniejszą, pewniejszą pętle :)
Jeżeli gracz zadał z broni dmg, to napisz mu to :)


Użytkownik NoLiFeR edytował ten post 13.08.2015 23:28
Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 13.08.2015

public ForwardPlayerDmg(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits) 
{


Damage[iAttacker] += fDamage;
floatround(Damage[iAttacker], floatround_floor);
}


public cmdMe(id) 
{ 
if(Damage[id]) 
{
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", playerWeapon[get_user_weapon(id)], Damage[id]);
}
}
else ColorChat(id, RED, "*^x01 Nie zadales obrazen przeciwnikowi.");




return PLUGIN_HANDLED;
}


public NewRound() 
{
for(new id = 0; id<33; id++) 
{
Damage[id] = 0.0;
}


g_playersnum = get_playersnum();
}

Czyli jak ten kod powinien wyglądać? :)

Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 14.08.2015

public GetWeaponName(id, szReturn[], iLen)
{
	new szName[24];
	if(get_weaponname(get_user_weapon(id), szName, 23)) {
		replace(szName, 23, "weapon_", "");
		copy(szReturn, iLen, szName);
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

przyklad

new szWeapon[24];
GetWeaponName(id, szWeapon, 23);
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", szWeapon, Damage[id]);

Użytkownik Asiap edytował ten post 14.08.2015 00:57
Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 14.08.2015

public GetWeaponName(id, szReturn[], iLen)
{
	new szName[24];
	if(get_weaponname(get_user_weapon(id), szName, 23)) {
		replace(szName, 23, "weapon_", "");
		copy(szReturn, iLen, szName);
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

przyklad

new szWeapon[24];
GetWeaponName(id, szWeapon, 23);
ColorChat(id, RED, "^x04 *^x03 (%s)^x01 Zadales dotychczas^x03 %d^x01 obrazen.", szWeapon, Damage[id]);

Fajna funkcja tylko że nazwa będzie z małych liter :X

 

Wyskrobałem co nieco :D

#include <amxmodx>
#include <colorchat>
#include <hamsandwich>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "oeN."

new pWeapon[33][31], Damage[33][31], bool:pDamage[33];

new const playerWeapon[][] = {
	"",
	"P228",
	"",
	"SCOUT",
	"HEGRENADE",
	"XM1014",
	"",
	"MAC10",
	"AUG",
	"",
	"ELITE",
	"FIVESEVEN",
	"UMP45",
	"SG550",
	"GALIL",
	"FAMAS",
	"USP",
	"GLOCK18",
	"AWP",
	"MP5",
	"M249",
	"M3",
	"M4A1",
	"TMP",
	"G3SG1",
	"",
	"DEAGLE",
	"SG552",
	"AK47",
	"KNIFE",
	"P90"
}

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_clcmd("say /me", "cmdMe");
	register_clcmd("say_team/me", "cmdMe");
	register_logevent("NewRound", 2, "1=Round_Start");
	RegisterHam(Ham_TakeDamage, "player", "ForwardPlayerDmg", 1);
}

public NewRound() {
	for(new id = 1; id<=32; id++){
		if(!is_user_connected(id)) continue;
		
		pDamage[id] = false;
		for(new i=1;i<=31;i++){
			Damage[id][i] = 0;
			pWeapon[id][i] = 0;
		}
	}
}

public ForwardPlayerDmg(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits) {
	pWeapon[iAttacker][get_user_weapon(iAttacker)] = get_user_weapon(iAttacker);
	Damage[iAttacker][get_user_weapon(iAttacker)] += floatround(fDamage);
	if(!pDamage[iAttacker]) pDamage[iAttacker] = true;
}

public cmdMe(id) 
{ 
	if(pDamage[id]){
		for(new i=1;i<=31;i++){
			if(pWeapon[id][i])
				ColorChat(id, RED, "^x04*^x03(%s)^x01 Zadales dotychczas^x04 %d^x01 obrazen.", playerWeapon[pWeapon[id][i]], Damage[id][pWeapon[id][i]]);
		}
	}
	else ColorChat(id, RED, "*^x01 Nie zadales obrazen przeciwnikowi.");
	
	return PLUGIN_HANDLED;
}

pWeapon - zapisuje id broni jakiej użył gracz podczas zadawania obrażeń

Damage - zapisuje obrażenia danej broni (id broni)

pDamage - sprawdza czy gracz zadał obrażenia

 

Dzięki pWeapon możemy wypisywać z tablicy nazwy broni oraz ile z tej broni zadano obrażeń. Wszystko resetuje się przy nowej rundzie.

 

Sprawdź :P


Użytkownik oeN. edytował ten post 14.08.2015 09:04
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 14.08.2015

no to mozna zrobic aby pierwsza lutera byla duza lub wszystkie duze

public GetWeaponName(id, szReturn[], iLen)
{
	if(get_weaponname(get_user_weapon(id), szReturn, iLen)) {
		replace(szReturn, iLen, "weapon_", "");
		ucfirst(szReturn); // pierwsza litera z duzej np. knife -> Knife
		strtoupper(szReturn) // pelna nazwa broni z duzych liter np. knife -> KNIFE
		copy(szReturn, iLen, szReturn);
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

Użytkownik Asiap edytował ten post 14.08.2015 11:42
Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 14.08.2015

Dzięki działa, leczy są takie logi:

 

L 08/14/2015 - 13:15:55: [AMXX] Displaying debug trace (plugin "ranga_dd2.amxx")
L 08/14/2015 - 13:15:55: [AMXX] Run time error 4: index out of bounds 
L 08/14/2015 - 13:15:55: [AMXX]    [0] ranga_dd2.sma::NewRound (line 183)

Nie będę pisał nowego tematu więc napisze tutaj.

Chcę zrobić jeszcze pod komendą "/hp" :

 

Zabity przez (nick gracza, ktory nas zabił) z (bron) 

Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 14.08.2015

W cmdMe:

for(new i=1;i<=31;i++)

Na

for(new i=1;i<=30;i++)
Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 14.08.2015

Chcę zrobić jeszcze pod komendą "/hp" :

 

Zabity przez (nick gracza, ktory nas zabił) z (bron) 

Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 14.08.2015

Proste.

#include <amxmodx>
#include <colorchat>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "oeN."

new killName[33][32], killWpn[33];

new const playerWeapon[][] = {
	"",
	"P228",
	"",
	"SCOUT",
	"HEGRENADE",
	"XM1014",
	"",
	"MAC10",
	"AUG",
	"",
	"ELITE",
	"FIVESEVEN",
	"UMP45",
	"SG550",
	"GALIL",
	"FAMAS",
	"USP",
	"GLOCK18",
	"AWP",
	"MP5",
	"M249",
	"M3",
	"M4A1",
	"TMP",
	"G3SG1",
	"",
	"DEAGLE",
	"SG552",
	"AK47",
	"KNIFE",
	"P90"
}

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_clcmd("say /hp", "cmdHp");
	register_clcmd("say_team /hp", "cmdHp");
}

public DeathMsg()
{
	new kid = read_data(1);
	new vid = read_data(2);
	
	get_user_name(kid, killName[vid], 31);
	killWpn[vid] = get_user_weapon(kid);
}

public cmdHp(id){
	if(!is_user_alive(id))
		ColorChat(id, RED, "^x01Zabity przez^x03 %s^x01 z^x03 %s", killName[id], playerWeapon[killWpn[id]]);
	else
		client_print(id, print_chat, "Jestes nadal zywy.");
}


Użytkownik oeN. edytował ten post 14.08.2015 20:54
Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 14.08.2015

tekst na say:

 

Zabity przez  z  

 

To oznacza, że nie pobiera id więc co jest zle?

public cmdHp(id)
{
if(!is_user_alive(id))
ColorChat(id, GREEN, "*^x01 Zabity przez^x03 %s^x01 z^x03 %s", killName[id], playerWeapon[killWpn[id]]);
else
ColorChat(id, GREEN, "*^x01 Jestes nadal zywy.");
}

 


Użytkownik 1stADXionC edytował ten post 14.08.2015 21:48
Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 14.08.2015

:wstyd: :mur:

register_event("DeathMsg", "DeathMsg", "a")

Do plugin_init

Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 14.08.2015

Nadal nie działa ;/

Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 14.08.2015

E no, nie możliwe.

 

Podaj cały kod.

Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 14.08.2015

O to wszystko co dodałem do mojego silnika.

register_event("DeathMsg", "DeathMsg", "a")

new killName[33][32], killWpn[33];

new const playerWeapon[][] = {
    "",
    "P228",
    "",
    "SCOUT",
    "HEGRENADE",
    "XM1014",
    "",
    "MAC10",
    "AUG",
    "",
    "ELITE",
    "FIVESEVEN",
    "UMP45",
    "SG550",
    "GALIL",
    "FAMAS",
    "USP",
    "GLOCK18",
    "AWP",
    "MP5",
    "M249",
    "M3",
    "M4A1",
    "TMP",
    "G3SG1",
    "",
    "DEAGLE",
    "SG552",
    "AK47",
    "KNIFE",
    "P90"
}

public DeathMsg()
{
new kid = read_data(1);
new vid = read_data(2);


get_user_name(kid, killName[vid], 31);
killWpn[vid] = get_user_weapon(kid);
}


public cmdHp(id)
{
if(!is_user_alive(id))
ColorChat(id, GREEN, "*^x01 Zostales zabity przez^x03 %s^x01 z^x03 %s", killName[id], playerWeapon[killWpn[id]]);
else
ColorChat(id, GREEN, "*^x01 Jestes nadal zywy.");
}
Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 15.08.2015

Jeśli dobrze to wkleiłeś to musi działać, nie ma tutaj żadnego błędu.

Jeśli nie chcesz upubliczniać całego kodu, wyślij mi go na PW.


Użytkownik oeN. edytował ten post 15.08.2015 08:26
Odpowiedz

  • +
  • -
1stADXionC - zdjęcie 1stADXionC 16.08.2015

Dzięki działa :)

 

A mógłbyś mi jeszcze powiedzieć jak zrobić top15 aby wyświetlało się tak:

 

#     Nick                Ranga              Kill        Ded

1     1stADXionC     Wieśniak          15         20

2     1stADXionC     Wieśniak          15         20

3     1stADXionC     Wieśniak          15         20


Użytkownik 1stADXionC edytował ten post 16.08.2015 11:40
Odpowiedz

  • +
  • -
oeN. - zdjęcie oeN. 16.08.2015

Zmieniałeś coś w statsx pluginie? Jeśli tak to musisz go podesłać żeby go przerobić.


Użytkownik oeN. edytował ten post 16.08.2015 16:15
Odpowiedz