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] Używanie get_user_team zamiast is_user_connected + get_user_team


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

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 14.03.2015 12:39

Witam,

pytanie takie z ciekawości. Patrzę sobie w kod źródłowy AMXX'a i znalazłem:

static cell AMX_NATIVE_CALL is_user_connected(AMX *amx, cell *params) /* 1 param */
{
      int index = params[1];
      if (index < 1 || index > gpGlobals->maxClients)
            return 0;
      CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
      return (pPlayer->ingame ? 1 : 0);
}
static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) /* 3 param */
{
      int index = params[1];
      if (index < 1 || index > gpGlobals->maxClients)
            return -1;
      CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
      if (pPlayer->ingame)
      {
            // SidLuke, DoD fix
            if (g_bmod_dod)
            {
                  int iTeam = pPlayer->pEdict->v.team;
                  if (params[3])
                  {
                        const char *szTeam = "";
                        switch (iTeam)
                        {
                        case 1:
                              szTeam = "Allies";
                              break;
                        case 2:
                              szTeam = "Axis";
                              break;
                        }
                        set_amxstring(amx, params[2], szTeam, params[3]);
                  }
                  return iTeam;
            }
            //
            if (params[3])
            {
                  set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]);
            }
            return pPlayer->teamId;
      }
      return -1;
}

Wnioskuje, że gdy mam taki kod:

if(is_user_connected(id) && get_user_team(id) == 2)

To mogę użyć:

if(get_user_team(id) == 2)

bez obawy, że wywali błąd o graczu invalidzie? Z tego co widzę to kod się powtarza tam...


  • +
  • -
  • 0

#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 14.03.2015 14:40

Tak, można tego użyć w ten sposób. Funkcja sprawdzania gracza nie zawierza ślepo w istnienie gracza na serwerze. Jednak cs_get_user_team chyba już się w tym momencie wysypie.
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 14.03.2015 14:47

static cell AMX_NATIVE_CALL cs_get_user_team(AMX *amx, cell *params) // cs_get_user_team(index); = 1 param
{
// Get user team
// params[1] = user index
// Valid entity should be within range
cell *model;
CHECK_PLAYER(params[1]);
// Make into edict pointer
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
if ((params[0] / sizeof(cell)) >= 2)
{
model = MF_GetAmxAddr(amx, params[2]);
*model = *((int *)pPlayer->pvPrivateData + OFFSET_INTERNALMODEL);
}
return *((int *)pPlayer->pvPrivateData + OFFSET_TEAM);
}

Chyba, że CHECK_PLAYER sprawdza.


  • +
  • -
  • 0

#4 he1st

    Diablo Mody i te sprawy ;3

  • Użytkownik

Reputacja: 132
Zaawansowany

  • Postów:357
  • GG:
  • Imię:Michał
  • Lokalizacja:Legionowo
Offline

Napisano 15.03.2015 14:53

Tak samo jest z 

if(is_user_connected(id) && is_user_alive(id))

 

V

if(is_user_alive(id))

 

Bo Gracz niepołączony nie może być żywy. 

 

 

 

 

static cell AMX_NATIVE_CALL cs_get_user_team(AMX *amx, cell *params) // cs_get_user_team(index); = 1 param
{
// Get user team
// params[1] = user index
// Valid entity should be within range
cell *model;
CHECK_PLAYER(params[1]);
// Make into edict pointer
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
if ((params[0] / sizeof(cell)) >= 2)
{
model = MF_GetAmxAddr(amx, params[2]);
*model = *((int *)pPlayer->pvPrivateData + OFFSET_INTERNALMODEL);
}
return *((int *)pPlayer->pvPrivateData + OFFSET_TEAM);
}

Chyba, że CHECK_PLAYER sprawdza.

 

 

Sądzac po tym, moim zdaniem nawet z 

cs_get_user_team

 

nie będzie problemu. Ale to oczywiście moje zdanie i moja perspektywa.


  • +
  • -
  • 0

b_350_20_000000_000000_FFFFFF_DA0707.png
b_350_20_000000_000000_FFFFFF_DA0707.png


#5 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 15.03.2015 15:11

CHECK_PLAYER sprawdza z tego co wiem wyłącznie czy ID gracza jest w przedziale od 1 do ilości slotów serwera, nie sprawdza czy gracz istnieje. Więc cs_get_user_team może się wysypać.


  • +
  • -
  • 2

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#6 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 15.03.2015 16:26

Z connected i alive to wiem.

 

Ale są przypadki gdzie trzeba oba. Np. Gracz jest martwy. Bo tam jest alternatywa


  • +
  • -
  • 0

#7 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 17.03.2015 15:09

Jednak coś chyba jest nie tak :X

 

Wywala

Run time error 4: index out of bounds 

W tym kodzie:

public Damage(id)
{
	new idattacker = get_user_attacker(id);
	
	if(get_user_team(id) == get_user_team(idattacker))
		return PLUGIN_CONTINUE;
	
	if(ma_perk[idattacker] && !random(2)) //tutaj
	{
        }
	
	return PLUGIN_CONTINUE;
}

Czyżby nie sprawdzało? oO


  • +
  • -
  • 0

#8 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 17.03.2015 15:54

Nie sprawdzasz czy idattacker jest graczem, a może przecież nim nie być...


  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#9 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 17.03.2015 16:00

a get_user_team?

      if (index < 1 || index > gpGlobals->maxClients)
            return -1;

Nie filtruje tego?


  • +
  • -
  • 0

#10 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.03.2015 16:39

A czy gdzieś w kodzie masz przerwanie kodu wtedy gdy atakujący nie jest graczem?
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#11 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 17.03.2015 16:56

Czekaj czekaj, dobrze kminię?

 

Jeżeli gracz nie jest podłączony albo nie jest graczem to get_user_team zwraca -1 i w tym momencie dzieje się to:

if(get_user_team(id) == -1)
		return PLUGIN_CONTINUE;

?

 

Czyli ofiara też musiałaby być niepodłączona albo nie być graczem?

 


  • +
  • -
  • 0

#12 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 28.03.2015 18:41   Najlepsza odpowiedź

Wyobraź sobie sytuację, że gracz spadł w przepaść na de_prodigy, atakującym jest zatem trigger_hurt czyli byt numer np. 72.

id = 1 (przyjmijmy, bo to bez znaczenia)

idattacker = 72

zatem warunek:

if(get_user_team(id) == get_user_team(idattacker))

nie spełni się, ponieważ

get_user_team(idattacker) 

zwróci -1

a jego zawartość

return PLUGIN_CONTINUE;

się nie wykona, kod idzie dalej i 

ma_perk[idattacker]

próbujesz się tutaj odwołać do elementu nr 72, a domyślam się, że to tablica 33 elementowa


  • +
  • -
  • 1

#13 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

  • Postów:1 535
  • GG:
  • Imię:Olek
  • Lokalizacja:Dalekoo
Offline

Napisano 28.03.2015 18:55

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0




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

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