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

[ROZWIĄZANE] Ostatni żywy człowiek/grupa


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

#1 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 01:36

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 ;))
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#2 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 15:31

Dobra, myślałem i myślałem i wyklepałem jakiś kod ale nie działa...

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? :D
I czy w ogóle można tak zrobić?
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#3 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 29.08.2012 17:24

napisz co dokladnie potrzebujesz i do czego to potrzebujesz
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#4 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 17:38

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 :D

Użytkownik K!113r edytował ten post 29.08.2012 17:39

  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#5 Stachuu :D ??

    Wszechobecny

  • Użytkownik

Reputacja: 237
Wszechwidzący

  • Postów:476
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Karsznice
Offline

Napisano 29.08.2012 18:00

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 ;P

@ sry ale tabulacja cos sie usuwa jak wklejam kod

Użytkownik Stachuu :D ?? edytował ten post 29.08.2012 18:01

  • +
  • -
  • 0

#6 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 18:43

Niestety to nie działa... (testowałem we 3, ja w grupie reszta bez)
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#7 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 29.08.2012 20:53


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

  • +
  • -
  • 0

#8 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 21:31

@Kubaczek, a co z graczami których g_iGrupa jest od 0 do x?
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#9 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 29.08.2012 22:16

Ja nadal nie bardzo rozumiem co chcesz osiągnąć, więc dałem takie coś. dopisz to co ci potrzebne
  • +
  • -
  • 0

#10 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 29.08.2012 23:19

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ę :D. Czyli przy zabiciu sprawdza czy są żywi gracze z innej grupy.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#11 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 29.08.2012 23:37


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ę
  • +
  • -
  • 0

#12 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 30.08.2012 00:13

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ę.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#13 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 30.08.2012 10:37

100 grup? 32 sloty to maks, a o wydajność się nie martw, pętla przez 100 to nie problem dla serwera.
  • +
  • -
  • 0

#14 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 30.08.2012 11:17

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
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#15 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 01.09.2012 09:51

@Odświeżam
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#16 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 03.09.2012 00:55

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ł :P) i na tym przypuszczeniu oprę swój kod:

#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;
}


#17 K!113r

    Teraz to chyba Sławek kek

  • Autor tematu
  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 04.09.2012 20:44

Oj beniu, działa jak ta lala ^D^
Łopatologicznie wytłumaczone, do zamknięcia.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#18 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 04.09.2012 20:47

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, Dołączona grafika raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL




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

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