←  Pluginy

AMXX.pl: Support AMX Mod X i SourceMod

»

Funkcja /me i najwiecej DMG pod koniec rundy

  • +
  • -
camilost - zdjęcie camilost 29.07.2010

Witam.
Potrzebuję pluginu z funkcją /me (Wyświetla zadane obrażenia - DMG), nie chcę statsx, ponieważ ma on funkcje które nie są dla mnie przydatne.

Jeśli gracz napisze "/me" i zadał jakieś DMG, wyświetla mu się wiadomość:

Zadales dotychczas %d obrazen.

Jeśli nie zadał DMG:

na razie nie zadales obrazen przeciwnikowi.


Co rundę oczywiście ma się DMG restartować(zerować)

I jeszcze, aby pod koniec przed zerowaniem wyświetlało:

Najwiecej obrazen zadal %s (%d obrazen!).

Jeśli jest tylko 1 osoba grająca nie wyświetla ; p

PS. Najlepiej by było, aby inni gracze nie widzieli jak ktoś wpisał /me :P.

01 sierpień 2010 - 15:41:
Refresz.

03 sierpień 2010 - 13:55:
Refresz 2. Pls pomóżcie ^.^
Odpowiedz

  • +
  • -
Ortega - zdjęcie Ortega 03.08.2010

Powinno działać ale ręki za to nie daję :F
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >

new Damage[33];
new Xdamage[33];

new g_playersnum;

new const PLUGIN_VERSION[] = "1.0";


public plugin_init() {
register_plugin("My Damage", PLUGIN_VERSION, "Ortega");

register_event( "HLTV", "NewRound", "a", "1=0", "2=0" );
register_logevent( "EndRound", 2, "1=Round_End" );

RegisterHam(Ham_TakeDamage, "player", "ForwardPlayerDmg", 1);

register_clcmd("say /me", "HookSay");
}

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

Damage[iAttacker] = pev(iVictim, pev_dmg_take);

return Damage[iAttacker];
}

public HookSay(id) {
if(Damage[id]) {
client_print(id, print_chat, "Zadales dotychczas %d obrazen.", Damage[id]);
}
else client_print(id, print_chat, "na razie nie zadales obrazen przeciwnikowi.");

return PLUGIN_HANDLED;
}

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

g_playersnum = get_playersnum();
}

public EndRound( ) {
//while by G[o]Q ;)
new k = 0; while( Damage[k] = Xdamage[k] ) k++;

SortIntegers(Xdamage[k], 33, Sort_Descending);

for(new i = 0; i<33; i++) {

static szName[32];
get_user_name(i, szName, sizeof(szName)-1);

if( ( Xdamage[0] == Damage[i] ) && g_playersnum > 1 ) {
client_print(i, print_chat, "Najwiecej obrazen zadal %s (%i obrazen!).", szName[i], Xdamage[0] );
}
}
}
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

Ortega ostatnia petla
if(!is_user_connected(i)) continue

public ForwardPlayerDmg(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits) {
        
        Damage[iAttacker] +=fDamage // inaczej nikt nie bedzie miec wiekszego wyniku niz 100 hp na normalnym serverze
        
   
}

i pozbywasz sie fakemety + Damage zmien na Float zeby uniknac mismatcha przy kompilacji :D

03 sierpień 2010 - 17:12:
dodatkowo mozesz zatrzymac ostatnia petle jak juz znajdziez wynik - break :D
Użytkownik G[o]Q edytował ten post 03.08.2010 16:11
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

posibbly unintended assigment
new k = 0; while( Damage[k] = Xdamage[k] ) k++;
WTF? : D

GoQ weź pokaż cały poprawiony kod, ja WC. :D
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

powinno byc

new k = 0; while(  Xdamage[k] = Damage[k] ) k+

warningiem sie nie przejmuj bo kompialtor mysli ze zle zrobiona petla :D
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

Ortega ostatnia petla

if(!is_user_connected(i)) continue

public ForwardPlayerDmg(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits) {
        
        Damage[iAttacker] +=fDamage // inaczej nikt nie bedzie miec wiekszego wyniku niz 100 hp na normalnym serverze
        
   
}

i pozbywasz sie fakemety + Damage zmien na Float zeby uniknac mismatcha przy kompilacji :D

03 sierpień 2010 - 17:12:
dodatkowo mozesz zatrzymac ostatnia petle jak juz znajdziez wynik - break :D



Pokaż jak to ma wyglądać

PS. new k = 0; while( Xdamage[k] = Damage[k] ) k++? Bo bez jednego + mi 1 error wyskoczył +dodatkowy warning ^.^

03 sierpień 2010 - 19:21:
Ile zadałem DMG działa ale wyświetlanie kto zadał najwięcej nie działa.
public EndRound( ) {
	//while by G[o]Q ;)
	new k = 0; while( Xdamage[k] = Damage[k] ) k++;
	
	SortIntegers(Xdamage[k], 33, Sort_Descending);
	
	for(new i = 0; i<33; i++) {
		
		static szName[32];
		get_user_name(i, szName, sizeof(szName)-1);
		
		if( ( Xdamage[0] == Damage[i] ) && g_playersnum >= 2 ) {
			client_print(i, print_chat, "Najwiecej obrazen zadal %s (%i obrazen!).", szName[i], Xdamage[0] );
		}
	}
}

W sumie g_playersnum >= 2 to to samo jak > 1 xD Ale co tam tak sobie dałem ^.^ .

03 sierpień 2010 - 19:50:
/me działa ale pokazuje ile ostatnio zadałem obrażen (np. trafiłem w głowe to pokazuje tylko te ostatnie obrażenie (140) : D a nie dodaje tych pozostałych.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

najwiecej dmg dziala tylko

client_print(i
zmien na

client_print(0
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

A czemu pokazuje tylko zadane ostatnio obrażenie (jedno) np. jeśli strzele w klatkę (60hp) i później w Heada(140) to wyskakuje zadane obrażenie 140 ^^ (Jak wpisze /me)
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

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

        

        Damage[iAttacker] +=fDamage // inaczej nikt nie bedzie miec wiekszego wyniku niz 100 hp na normalnym serverze

        

   

}

Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

Aha i takie coś wyskoczyło jak zamieniłem id na 0:
Spoiler


hehehe :D

SMA:
Spoiler

Użytkownik camilost edytował ten post 03.08.2010 20:26
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

zamen all %d i %i na %f

oraz

new Damage[33];
new Xdamage[33];


na

new Float:Damage[33];
new Float:Xdamage[33];
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

Tag mismatch:
	SortIntegers(Xdamage[k], 33, Sort_Descending);

i
		Damage[id] = 0;


WTD, wiem że chdzi o te Xdamage i Damage, bo dodałem w float!? : D
Zamiennik mam zrobić?
new zadanedmg = Float:Damage[id]
a samo new Float:Damage na new Damage? :P dobrze kombinuję?
Użytkownik camilost edytował ten post 03.08.2010 20:54
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

SortFloats(Xdamage[k], 33, Sort_Descending);

zamiast

SortIntegers(Xdamage[k], 33, Sort_Descending);

03 sierpień 2010 - 22:07:
nieeeee poprostu na samej gorze po new dodaj Float: i nic wiecej przed tymi dwoma funkcjami i zmien funkcje sortintegers na sortfloat
Użytkownik G[o]Q edytował ten post 03.08.2010 20:54
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

z tym drugi Tag mimatch zrobiłem: Damage[id] = 0.0; i odpuściło ^.^ Skoro float to float ^^

03 sierpień 2010 - 22:08:
Teraz kod wygląda tak:
Spoiler
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 03.08.2010

a jak z dzialaniem :?:
Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 03.08.2010

Nikogo nie ma na serwie już, muszę na botach sprawdzić : D

@EDIT:
Hmmm.. na botach: Ciągle pisze że jeszcze nie zadałem dmg ale to pewnie dlatego że na botach ^^
I dalej jest problem z:
Spoiler


Z tymi zerami to wiem jak sobie poradzić ^^ ale z tym spamem to nie xD

Może:
get_user_name(i, szName, sizeof(szName)-1);
zamienić na:
get_user_name(i, szName, sizeof szName - 1);
Pewnie się mylę xD bo to to samo teoretycznie.

@EDIT2:
Racja myliłem się xD

04 sierpień 2010 - 20:29:
Jak zlikwidować ten spam? : /
Wiem że trzeba jakoś wyłapać tego co ma najwięcej DMG, bo teraz tylko sortuje i wysyła spam posortowany ^^
Użytkownik camilost edytował ten post 03.08.2010 21:36
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 04.08.2010

for(new i = 0; i<33; i++) {

                

                static szName[32];

                get_user_name(i, szName, sizeof(szName)-1);

                

                if( ( Xdamage[0] == Damage[i] ) && g_playersnum > 1 ) {

                        client_print(0, print_chat, "Najwiecej obrazen zadal %s (%f obrazen!).", szName[i], Xdamage[0] );

                        break

                }

        }

Odpowiedz

  • +
  • -
camilost - zdjęcie camilost 05.08.2010

No no już jest prawie cacy:

Najwiecej obrazen zadal Nazwa [email protected] (0.000000 obrazen!)


Te .00 to mi zwisa na razie pozniej osune ale ze zle sortuje ;d
Odpowiedz

  • +
  • -
Ortega - zdjęcie Ortega 05.08.2010

Do trzech razy sztuka ;)
#include < amxmodx >
#include < hamsandwich >

new Float:Damage[33];
new Float:Xdamage[33];

new g_playersnum;

new const PLUGIN_VERSION[] = "1.0";


public plugin_init() {
register_plugin("My Damage", PLUGIN_VERSION, "Ortega");

register_event( "HLTV", "NewRound", "a", "1=0", "2=0" );
register_logevent( "EndRound", 2, "1=Round_End" );

RegisterHam(Ham_TakeDamage, "player", "ForwardPlayerDmg", 1);

register_clcmd("say /me", "HookSay");
}

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

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

public HookSay(id) {
if(Damage[id]) {
client_print(id, print_chat, "Zadales dotychczas %d obrazen.", Damage[id]);
}
else client_print(id, print_chat, "na razie nie zadales obrazen przeciwnikowi.");

return PLUGIN_HANDLED;
}

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

g_playersnum = get_playersnum();
}

public EndRound( ) {

new k = 0; while( Damage[k] == Xdamage[k] ) k++;

SortFloats(Xdamage[k], 33, Sort_Descending);

for(new i = 0; i<33; i++) {

static szName[32];
get_user_name(i, szName, sizeof(szName)-1);

floatround(Xdamage[i], floatround_floor);

if( ( Xdamage[0] == Damage[i] ) && g_playersnum > 1 ) {
client_print(0, print_chat, "Najwiecej obrazen zadal %s (%d obrazen!).", szName[i], Xdamage[0] );
break;
}
}
}
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 05.08.2010

public EndRound( ) {
        
        new k = 0; while( Xdamage[k] = Damage[k] ) k++;
        
        SortFloats(Xdamage[k], 33, Sort_Descending);
        
        for(new i = 0; i<33; i++) {
                
                static szName[32];
                get_user_name(i, szName, sizeof(szName)-1);
                
                floatround(Xdamage[i], floatround_floor);
                
                if( ( Xdamage[0] == Damage[i] ) && g_playersnum > 1 ) {
                        client_print(0, print_chat, "Najwiecej obrazen zadal %s (%d obrazen!).", szName[i], Xdamage[0] );
                        break;
                }
        }
}

hmm jak tak nie zadziala to polecam dodanie jakiegos debuga sobie zeby tablice wyswietlic cala albo cos :D
Odpowiedz