[ROZWIĄZANE] Ostatni żywy człowiek/grupa
K!113r
29.08.2012
Witam, więc zaczne od tego nad czym pracuję, a więc gracze (tt) są podzieleni na grupy, zmiena[33] przechowuje id grupy dla każdego gracza, jeżeli gracz nie ma grupy to zmienna przyjmuje wartość -1 i teraz chodzi mi by wykryć (Event Death jak mniemam) ostatnią żywą osobe (oczywiście cały czas chodzi o team TT, żaden inny) lub ostatnie żywe osoby, lecz one muszą być z jednej grupy.
Proszę o kod i wytłumaczenie (jak się będzie Ci chciało się pisać wytłumaczenie
)
Proszę o kod i wytłumaczenie (jak się będzie Ci chciało się pisać wytłumaczenie

K!113r
29.08.2012
Dobra, myślałem i myślałem i wyklepałem jakiś kod ale nie działa...
kod w evencie death
i public Koniec()
I moje pytanie jest następujące, czemu to nie działa?
I czy w ogóle można tak zrobić?
kod w evencie death
if(g_bZabawa)
{
new iPlayers[ 32 ], iNum, InneGangi;
get_players( iPlayers, iNum );
new iPlayer;
{
for( new i = 0; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];
if( iPlayer == iKiller )
continue;
if( ((g_iGrupa[ iKiller ] != g_iGrupa[ iPlayer ]) || (g_iGrupa[iKiller] == g_iGrupa[iPlayer] && g_iGrupa[iKiller] == -1)) && is_user_alive(iPlayer))
{
InneGrupy++
}
}
if(InneGrupy == 0)
Koniec(iKiller)
}
}
i public Koniec()
public Koniec(killer)
{
if(g_iGrupa[ killer ] == -1)
{
new szName[32]
get_user_name(killer, szName, 31)
client_print(0, print_chat, "Jeden wygral")
}
else
{
new aData[ GrupaInfo ]
ArrayGetArray( g_aGrupy, g_iGrupa[ killer ], aData );
client_print(0, print_chat, "Wygrala jakas druzyna")
// nagrody
}
g_bZabawa = false
}
I moje pytanie jest następujące, czemu to nie działa?

I czy w ogóle można tak zrobić?
K!113r
29.08.2012
Chcę aby sprawdzić czy zostali żywi gracze z jednej grupy (czyli ich g_iGrupa[id]>-1) lub tylko jeden żywy gracz bez grupy ( czyli jego g_iGrupa == -1), jeżeli zostanie jedna żywa grupa/osoba bez grupy to wywołuje się public Koniec(iKiller) (potrzebne mi id zabójcy).
W moim kodzie założyłem że jeżeli grupa gracza nie jest grupą zabójcy to żyją jeszcze inne grupy, a jeżeli takowych nie znajdzie to wywołuje się dana funkcja. Lecz mój kod jest pisany "na szybko".
Edit: to id zabójcy nie jest mi bardzo potrzebne
Użytkownik K!113r edytował ten post 29.08.2012 17:39
W moim kodzie założyłem że jeżeli grupa gracza nie jest grupą zabójcy to żyją jeszcze inne grupy, a jeżeli takowych nie znajdzie to wywołuje się dana funkcja. Lecz mój kod jest pisany "na szybko".
Edit: to id zabójcy nie jest mi bardzo potrzebne

Użytkownik K!113r edytował ten post 29.08.2012 17:39
Stachuu :D ??
29.08.2012
if(g_bZabawa){
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );
new iPlayer,licz_graczy,licz_grupe;
for( new i = 0; i < iNum; i++ )
{
iPlayer = iPlayers[i];
if(is_user_alive(iPlayer))
continue;
if(iPlayer == iKiller)
continue;
licz_graczy++
if(licz_graczy==1)
Koniec(iKiller,1)
if(g_iGrupa[iKiller] == g_iGrupa[iPlayer])
licz_grupe++
}
if(licz_graczy==licz_grupe)
Koniec(iKiller,2)
}
public Koniec(killer,mode)
{
if(mode==1)
{
new szName[32]
get_user_name(killer, szName, 31)
client_print(0, print_chat, "Jeden wygral")
}
else
{
new aData[ GrupaInfo ]
ArrayGetArray( g_aGrupy, g_iGrupa[ killer ], aData );
client_print(0, print_chat, "Wygrala jakas druzyna")
// nagrody
}
g_bZabawa = false
}
nie testowane , nie wiem czy dziala , zamulony jestem troche

@ sry ale tabulacja cos sie usuwa jak wklejam kod
Użytkownik Stachuu :D ?? edytował ten post 29.08.2012 18:01
Kubaczek <3
29.08.2012
public DeathMsg(){
new KID = read_data(1);
new VID = read_data(2);
if(g_bZabawa)
{
new iLol;
for(new i = 1; i <= get_maxplayers(); i++){
if(i == KID)
continue;
if(get_user_team(i) != 1)
continue;
if(g_iGrupa[i] == -1)
iLol++;
}
if(iLol == 0)
client_print(id, print_chat, "0 graczy w grupie -1");
if(iLol == 1)
client_print(id, print_chat, "ostatni gracz w grupie -1");
}
Użytkownik Kubaczek <3 edytował ten post 29.08.2012 20:54
Kubaczek <3
29.08.2012
Ja nadal nie bardzo rozumiem co chcesz osiągnąć, więc dałem takie coś. dopisz to co ci potrzebne
K!113r
29.08.2012
Napisze prostsze wymagania i prościej. Chce wykryć czy została żywa tylko jakaś grupa, nie ważne czy gracz nie ma grupy bo wtedy id jego grupy wynosi -1 więc można ich zebrać w kupę
. Czyli przy zabiciu sprawdza czy są żywi gracze z innej grupy.

Kubaczek <3
29.08.2012
public DeathMsg(){
new KID = read_data(1);
new VID = read_data(2);
if(g_bZabawa)
{
new grupaUjemna;
new grupaPierwsza;
for(new i = 1; i <= get_maxplayers(); i++){
if(i == KID)
continue;
if(get_user_team(i) != 1)
continue;
switch(g_iGrupa[i])
{
case -1: grupaUjemna++;
case 1: grupaPierwsza++;
}
}
}
Gdy masz np 5 grup (powyżej -1 oczywiście, bo -1 w tablice nie wejdzie^^) możesz dać tablicę zamiast grupaPierwsza + pętlę
K!113r
30.08.2012
Tego chciałem uniknąć (taki też był mój pierwszy pomysł...
Grupy są zapisywane i przy starcie mapy wszystkie są ładowane w tablice dynamiczne, więc przy 100 utworzonych grupach może być to mało wydajne. Jeżeli to będzie jedyne wyjście to dopiero tak zrobię.
Grupy są zapisywane i przy starcie mapy wszystkie są ładowane w tablice dynamiczne, więc przy 100 utworzonych grupach może być to mało wydajne. Jeżeli to będzie jedyne wyjście to dopiero tak zrobię.
Kubaczek <3
30.08.2012
100 grup? 32 sloty to maks, a o wydajność się nie martw, pętla przez 100 to nie problem dla serwera.
K!113r
30.08.2012
tak 100 grup, one są zapisywane a przy starcie mapy wszystkie wczytywane do tablic dynamicznych (czyli w kodzie ich liczba jest niewiadoma ale da się sprawdzić ich liczbę), nie ważne czy członkowie/członek grupy jest on line, grupa jest wczytana
Gość_21977_* 03.09.2012
Zrozumiałem, że chcesz wykryć moment, kiedy pozostanie ostatni żywy terrorysta (bez grupy) lub ostatnia żywa grupa terrorystów.
Podejrzewam, że docelowo zamiast "lub" powinno widnieć "albo" (nie żebym się czepiał
) i na tym przypuszczeniu oprę swój kod:
Podejrzewam, że docelowo zamiast "lub" powinno widnieć "albo" (nie żebym się czepiał

#include <amxmodx>
#include <hamsandwich>
new g_iGrupa[33];
new g_maxPlayers; // maxymalna liczba graczy
public plugin_init() {
register_plugin("last group detect", "0.1", "benio101");
RegisterHam(Ham_Killed, "player", "Ham_Killed_Post", 1); // rejestrujemy zdarzenie zabojstwa
// dlaczego 1 na końcu? ponieważ chcemy zarejestrować wykonane już zabójstwo
// hook Ham_Killed z 0 na końcu może zostać zablokowany poprzez zwrócenie HAM_SUPERCEDE
// wówczas do zabójstwa nie dojdzie, a my go i tak wykryjemy. Dlatego istotna jest ta jedynka.
}
public plugin_cfg(){
// pobranie maxymalnej liczby graczy na serwerze
// (tak - to w uproszczeniu tzw. liczba slotów)
g_maxPlayers=get_maxplayers();
}
public Ham_Killed_Post(vid, kid){
// vid - victim id - id ofiary (zabitego)
// kid - killer id - id zabojcy
new groups[33]; // tutaj bedziemy przechowywac numery grup pozostalych zyjacych terrorystow
// grup nie moze byc wiecej niz 33, wiec taki ustawimy jej rozmiar
new groupsNum=0; // tutaj bedziemy przechowywac liczbe tych grup w tablicy groups[]
for(new id=1; id<g_maxPlayers; ++id){
// dla kazdego gracza...
// numery graczy to od 1 do g_maxPlayers wlacznie
if(
is_user_alive(id) && // jesli zyje
get_user_team(id)==1 // i jest terrorysta (1 - TT, 2 - CT, 3 - Spect, 0 - Unassigned)
){
groups[groupsNum]=g_iGrupa[id]; // dodajemy grupe gracza do tablicy grup
++groupsNum; // zwiekszamy liczbe wpisow w tablicy
}
}
// teraz mamy pelna tablice groups[groupsNum] wypelniona grupami zyjacych terrorystow
if(groupsNum==0){
// to oznacza, ze nie ma juz zadnego zyjacego terrorysty
// nie wiem, co w tym wypadku zamierzasz zrobic, ale kod wklep wlasnie tutaj
return PLUGIN_CONTINUE; // poki co, nie zrobimy w takim wypadku absolutnie nic
} else {
// zyje przynajmniej jeden terrorysta, wiec przejdzmy do sprawdzania
new group; // tutaj bedziemy przechowywac id pierwszej napotkanej grupy
// jesli kolejna napotkana grupa bedzie inna, niz pierwsza, to oznacza
// ze mamy do czynienia z kilkoma grupami, wiec mozemy przerwac dzialanie
// jesli natomiast grupa jest taka sama, to jesli id grupy == -1, to
// oznacza, ze mamy kilka osob bez grupy, w przeciwnym wypadku to musi
// byc czlonek tej samej, pierwszej grupy, wiec idziemy wszystko jest ok
group=groups[0]; // no i pobieramy wartosc pierwszej grupy z tablicy grup
for(new i=1; i<groupsNum; ++i){
// przeszukujemy kolejne wartosci tablicy groups[groupsNum]
// pomijajac pierwsza, ktora zapisana jest jako zmienna group
if(groups[i]!=group){
// no wlasnie, grupy sa inne, czyli mozemy przerwac dalsze zwracanie
// to nie jest jeszcze ten moment, ktorego szukamy, gdyz musza
// istniec przynajmniej 2 rozne grupy (albo grupa + brak grupy)
return PLUGIN_CONTINUE;
}
// grupy sa takie same, wiec sprawdzmy, czy grupa ta nie jest grupa o id=-1
// czyli, czy nie mamy do czynienia z kilkoma zyjacymi terrorystami bez grupy
if(group==-1){
// jesli grupa wynosi -1, to nie jest jeszcze ten moment
// ktorego szukamy, wiec mozemy przerwac dalsze sprawdzanie
// gryz mamy przynajmniej 2 zyjacych terrorystow bez grupy
return PLUGIN_CONTINUE;
}
// jesli doszlismy az tutaj, to grupa musi byc taka sama
// (wczesniej nie spelniony warunek if(groups[i]!=group))
// oraz grupa musi byc rozna od -1, czyli jest to grupa
// tym samym mozemy pozwolic na przejscie do kolejnego sprawdzania
// az w koncu dojdziemy (lub nie) do konca wykonywania petli for
}
// jesli tutaj doszlismy, to oznacza, ze nastapil wlasnie ten moment,
// kiedy pozostala ostatnia grupa zywych terrorystow lub ostatni terrorysta
// bez grupy, a pod zmienna kid kryje sie id zabojcy, teraz mozna wreszcie wykonac:
Koniec(kid);
}
return PLUGIN_CONTINUE;
}
K!113r
04.09.2012
Oj beniu, działa jak ta lala 
Łopatologicznie wytłumaczone, do zamknięcia.

Łopatologicznie wytłumaczone, do zamknięcia.
Gość_21977_* 04.09.2012
Wiadomość wygenerowana automatycznie
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz,
raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz,

Z pozdrowieniami,
Zespół AMXX.PL