←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Najlepszy gracz mapy

Zablokowany

  • +
  • -
dram - zdjęcie dram 07.10.2010

Witam.

Chciałbym napisać coś takiego.

Że pod koniec mapy plugin szuka najlepszego gracza z obydwu teamów i wykonuje na tym graczu dany kod. Przykładowo ten gracz dostaje HE.

Wiem ,że trzeba będzie pętlę użyć. Ale w którym miejscu na liście eventów nie ma eventu który wykonuje się pod koniec mapy tylko pod koniec rundy .

Tutaj ta lista: Half-Life 1 Game Events - AlliedModders Wiki

Pozdrawiam czekam na odpowiedź.
Odpowiedz

  • +
  • -
kyku - zdjęcie kyku 07.10.2010

co jakis czas taskiem musisz sprawdzac ile czasu pozostalo do konca mapy
get_timeleft np.
Odpowiedz

  • +
  • -
dram - zdjęcie dram 07.10.2010

No dobra ale teraz to w jedną logiczną całość przyjmując domyślne ustawienie ,że do końca mapy pozostało 25 minut. Ale już na 24 minucie będzie task do pętli, i jak ta pętla ma wyglądać która szuka najlepszego gracza na mapie*?

Pozdrawiam

Chociaż wole żeby pobierało mi samo ile zostało do końca mapy bo może być tak że mapa zostanie rozszerzona (podczas votowania w amxX)

Dodano 07 październik 2010 - 17:57:
Dobra mam taska.

Teraz kwestia pętli która szuka gracza który ma najwięcej fragów.

Proszę o pomoc.

Pozdrawiam.
Użytkownik dram edytował ten post 07.10.2010 17:33
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 08.10.2010

set_task ma flagę "d", która odpowiada za czas przed końcem mapy

Łatwo i szybko można to zrobić z sortowaniem tablicy polecam SortCustom2D
Dokumentacja AMXX.pl - Nieoficjalny polski support AMX Mod X
tu jest przykład użycia; myArray powinien mieć jeszcze 1 kolumnę na id gracza, ale funkcja sortująca porownaj2D się nie zmieni

Ten kod nie uwzględnienia przypadku, gdy jest kilku graczy którzy mają najlepsze fragi.

public taskEndMap(){
        new myArray[32][3], len = 0;
        
        for(int id=1;id<33;id++){
                if(!is_user_connected(id)) continue;
        
                myArray[len][0] = get_user_frags(id);
                myArray[len][1] = get_user_deaths(id);
                myArray[len][2] = id;
                len++;
        }
        if(len == 0) return;
        SortCustom2D(myArray, len, "porownaj2D");
       
        log_amx("Najlepszy gracz: %d! %d fragów, %d smierci", myArray[0][2], myArray[0][0], myArray[0][1]);
}

/*
 * Sortowanie malejące
 *
 * Nie używamy własnych danych, więc data[] i data_size nie są potrzebne
 * podobnie jak array, więc lista parametrów skróciła się do 2
 */
public porownaj2D(const elem1[], const elem2[]){
        if(elem1[0] == elem2[0]){
                //gdy ilość zabójstw obu graczy jest równa
                //o kolejności decyduje ilość śmierci

                if(elem1[1] == elem2[1])
                        //no cóż, takie same staty
                        return 0;
                else if(elem1[1] < elem2[1])
                        //zabił tyle samo przeciwników, lecz ginął rzadziej -> idzie przed
                        return -1;
                //zabił tyle samo przeciwników, lecz ginął częściej
                return 1;
        }
        else if(elem1[0] > elem2[0])
                // zabił więcej przeciwników, więc idzie przed
                return -1;
        //zabił mniej przeciwników
        return 1;
}
Odpowiedz

  • +
  • -
ZixI - zdjęcie ZixI 08.10.2010

plugin_end ( )
{
    //code 
}

Powyzsza funkcja jest wywolywana przy zmianie mapy lub prawidlowym zamknieciu serwera. Prawdopodobnie nie wychwyci crasha.

Nie wiem czy o to Ci chodzi, ale sprawdź :)
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 09.10.2010

Może i dobrze, ale komunikatu wtedy nie wyświetlisz

30s przed zmianą mapy:
set_task(30.0, "taskEndMap", 356, _, _, "d");
Odpowiedz
Zablokowany