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
 

Andrzejek - zdjęcie

Andrzejek

Rejestracja: 01.07.2012
Aktualnie: Nieaktywny
Poza forum Ostatnio: 28.07.2020 07:35
-----

#719164 Segmentation Fault pytanie

Napisane przez Master Yoga w 27.01.2016 17:46

Nie mam powodów by narzekać funkcja get_playersnum() pobiera aktualna ilość graczy należycie ponadto ma parametr który wyklucza badz włącza graczy którzy dopiero sie łączą z serwerem.

 
Załóżmy następującą sytuację:
Wchodzi gracz, dostaje id 1
wchodzi kolejny, dostaje id 2
itd..
mamy na serwerze 10 graczy, których id jest od 1 do 10.
wychodzą gracze o id 3, 4, 5
mamy na serwerze 7 graczy o id: 1,2,6,7,8,9,10
funkcja get_playersnum() zwraca nam 7, bo tylu jest graczy.
Dajesz pętlę:
for(new a=1;a<=get_playersnum();a++)
pętla wykonuje się 7 razy dla id: 1,2,3,4,5,6,7
wykonujesz operacje na nieistniejących bytach 3,4,5 natomiast pomijasz graczy o id 8,9,10.
W efekcie może wystąpić błąd Segmentation Fault, albo inny powodujący crash, może lecz nie musi. Pewne jest jedno: pomijasz 3 graczy.
 
 
 
 

Funkcja get_maxplayers() tak na dobra sprawę pobiera ci ilość slotów
Zakładając, że masz 25 slotowy serwer to petla powtórzy sie 25 razy nawet jak będzie tylko 3 graczy.

Czy aby na pewno na serwerze x-slotowym gracz nie może dostać id x+1?
Wydaje mi się, że taką sytuację miałem kiedyś, serwer miał 15 slotów a ktoś miał id 16.
Dlatego uważam, że powtarzanie pętli 32 razy i sprawdzanie w środku czy dany gracz istnieje, jest połączony, żywy itd. zależnie od potrzeb, jest napewniejszą i najbezpieczniejszą metodą, a przy tym względnie optymalną.
 
 
 

Pamiętaj, że gracz żywy to nie zawszę gracz połączony.

 
A nie odwrotnie? Jak coś nie istnieje to ja może być żywe?

I w sumie to mnie masz. Brawo ty.
Choć to sytuację czysto hipotetyczne ilość graczy się zmienia ktoś wchodzi, ktoś wychodzi ciężko pominąć gracza, ale to możliwe.

Spokojnie, to że mam ilość graczy nie znaczy, że na każdym mogę bezbłędnie wykonać operację, dlatego też przed wykonaniem jakichś operacji jest szereg warunków :) i ewentualne przejście do kolejnego powtórzenia pętli o ile warunek nie został spełniony.

Nie, nie odwrotnie. A grankee napisałem, że byt nie istnieję??
A jeżeli zostanie zerwane połączenie miedzy klientem a serwerem i w tym czasie zostaną wykonane jakieś funkcję to byt zostanie od razu zniszczony a klient rozłączony?? Nawet po dłuższym lagu ( ale bez przesady )możesz wrócić do gry.
Popracuj jeśli chcesz na najnowszym ZP tam czasem potrafią sie dziać cuda :D

W sumie to najlepszym sposobem byłoby tu zastosowanie pętli i instrukcji continue.
Zgadzasz sie grankee :P??
  • +
  • -
  • 1


#719251 Segmentation Fault pytanie

Napisane przez grankee w 28.01.2016 20:42


A dlaczego 32 a nie get_maxplayers?

Wydaje mi się, że taką sytuację miałem kiedyś, serwer miał 15 slotów a ktoś miał id 16.
Dlatego uważam, że powtarzanie pętli 32 razy i sprawdzanie w środku czy dany gracz istnieje, jest połączony, żywy itd. zależnie od potrzeb, jest napewniejszą i najbezpieczniejszą metodą, a przy tym względnie optymalną.


  • +
  • -
  • 1


#719042 Segmentation Fault pytanie

Napisane przez grankee w 25.01.2016 21:25

Odniosłem wrażenie trochę niemiłego tonu. Skąd wniosek, że nie sprawdzałem obu metod? W ogóle to może wypisz tu listę osób, którym zezwalasz na wypowiadanie się w tak 'trudnej' sprawie.

Napisałem wyraźnie, get_players działa wadliwie, po co się zastanawiać nad wydajnością pierwszej metody jeśli nie ma lepszej od niej? 

Jak masz dwa samochody i jeden nie ma koła to czym kierujesz się w decyzji którym pojechać? Osiągami do setki?

Przeczytaj co masz nad avatarem i zachowaj odrobinkę skromności :)


  • +
  • -
  • 1


#717490 Profiler amx --> Czyli pełny monitoring pluginów

Napisane przez Dziobak? w 04.01.2016 14:35

UP, ma ktoś wersje na 1.8.3 ??

http://www.amxmodx.org/snapshots.php

tu popatrz.


  • +
  • -
  • 1


#717293 Wykonanie funkcji gdy gracz jest na kucaka

Napisane przez GeDox w 02.01.2016 00:59

Podmień:
pev(id, pev_flags) & FL_ONGROUND
Na:
new Float:vct[3]
entity_get_vector(id, EV_VEC_velocity, vct)
new Float:speeds = floatsqroot(vct[0]*vct[0]+vct[1]*vct[1]+vct[2]*vct[2])

speeds == 0
//something
I spróbuj ;)
  • +
  • -
  • 1


#717295 Wykonanie funkcji gdy gracz jest na kucaka

Napisane przez NiczegoWinien w 02.01.2016 02:29

http://amxx.pl/topic...edy-gracz-stoi/


  • +
  • -
  • 1


#717296 Wykonanie funkcji gdy gracz jest na kucaka

Napisane przez Sniper Elite w 02.01.2016 03:25

No i warto dodać jakąś zmienną typu boolean (zasięg globalny, początkowo false), którą ustawisz na true po wykonaniu FUNKCJA(1) i będziesz sprawdzał jej stan przy 2 warunku co by się te funkcje nie wywoływały co klatkę serwera, np:

new Float:fVelocity[3];
pev(id, pev_velocity, fVelocity);

if(get_user_button(id) & IN_DUCK && get_user_weapon(id) == CSW_KNIFE && fVelocity[0] == 0.0 && fVelocity[1] == 0.0 && fVelocity[2] == 0.0 && !ma[id])    {
        //Gdy jest na kucaku, ma np. kosę oraz jest w bezruchu.
        FUNKCJA(1);
        ma[id] = true;
    }
else if(ma[id]){
        //Gdy nie jest na kucaku, nie ma broni kosy, oraz nie jest w bezruchu
        FUNKCJA(2);
       ma[id] = false;
    }

Chyba, że funkcje mają się wywoływać co klatkę.


  • +
  • -
  • 1


#712533 UB nie działa

Napisane przez jumpix w 30.09.2015 06:43

Masz zainstalowany sourcebans na jakims forum ? jak tak to tam jest ubteam i oni to robia...pomoglem daj +


  • +
  • -
  • -2


#711863 Zmiana prędkości graczy

Napisane przez WeBsteR w 16.09.2015 21:56

Miałem coś podobnego na swoim CodModzie, jak usunąłem CurWeapon i zastosowałem kanapkę. Rozwiązałem to robiąc sprawdzenie, czy jest freezetime, jeżeli nie ma to ustawić set_pev od prędkosci, czyli:

if(!freezetime)
        set_pev(id, pev_maxspeed, szybkosc_gracza[id]);

poblicu ZastosujAtrybuty.

 

Może to coś Ci pomoże :giggle:

 

Pozdrawiam.


  • +
  • -
  • 1


#711773 Zmiana prędkości graczy

Napisane przez GwynBleidD w 14.09.2015 08:53

No to krótkie wyjaśnienie, skoro nie rozumiesz:

 

silnik HLDS ustala prędkość bazową gracza na podstawie kilku kryteriów, jednym z nich jest trzymana w ręce broń. Silnik pobiera przy każdej zmianie broni (lub innym evencie) prędkość dla tej broni i ustala ją graczowi.

 

Klasyczne podejście do tematu polegało na podmianie prędkości gracza po tym, jak silnik mu ją nada. Podejście  przedstawione przez BlackPerfum polega na podmianie prędkości broni, którą gracz trzyma. Dzięki temu zostanie ustawiona graczowi nasza nowa prędkość. Sposób ten praktycznie nie posiada wad, ponieważ nadal zlecamy ustawienie prędkości silnikowi gry, który wie kiedy ta prędkość powinna wynosić zero (podczas freeze time lub podkładania paki), kiedy należy ją z jakiegoś powodu zredukować itp. Prędkość zwracana przez broń jest w każdym przypadku w normalnych warunkach stała i zależy wyłącznie od broni.

 

Dodatkowo w ten sposób możemy przypisać własne prędkości dla podanych broni, dzięki czemu możemy podwyższyć ogólną prędkość gracza ale nadal będzie zależała ona od broni.


  • +
  • -
  • 1


#709065 Dziwny problem ze sprawdzaniem poziomu

Napisane przez Master Yoga w 09.08.2015 21:35

Od razu co mi się rzuciło w oczy to:
new const nazwy_poziomu[]
21 stałych
 
new const zabojstwa_poziomu[]
20 stałych
  • +
  • -
  • 1


#671074 [ROZWIĄZANE] Problem z error 001: expected token: "{", but found...

Napisane przez grankee w 20.11.2014 03:43

get_user_attacker ( index, [ &weapon, &hitzone ] )

jak nie zadziała to zmień post/pre w rejestracji hama

 

Zrozumiałem, że chcesz wykryć obrażenia zadane graczowi x przez gracza y, ale tylko raz na rundę, ale co do tego ma headshot? Objaśnij dokładniej. I co z tym dalej robisz?


  • +
  • -
  • 1


#670203 Konsola serwera nie moze dać bana

Napisane przez grankee w 14.11.2014 00:50

@radim 

if(!cmd_access(id,level,cid) && id!=0)
        return PLUGIN_HANDLED

Nieważne, że część warunku

id!=0 

zostanie spełniona, bo jeżeli admin będzie miał odpowiednią flagę to część warunku

!cmd_access(id,level,cid)

nie zostanie spełniona, a co zatym idzie nie dojdzie to przerwania działania funkcji, ponieważ 

&&

oznacza, że aby całość była spełniona muszą być spełnione jej obie części.

Admin z odpowiednią flagą zatem będzie mógł dać bana.


  • +
  • -
  • 1


#668945 Pobieranie śmierci gracza w spoczynku i powietrzu

Napisane przez grankee w 03.11.2014 14:45

Leń jestes:D

new names[100][32]

public client_putinserver(id)
{
	new name[32]
	get_user_name(id,name,31)
	for(new i=0;i<100;i++)
	{
		if(equali(name,names[i]))
			return PLUGIN_CONTINUE
	}
	//w tym miejscu nie znaleziono gracza na liście więc go tam dodajemy
	for(new i=0;i<100;i++)
	{
		if(!names[i][0])
		{	
			copy(names[i],31,name)
			i=100
		}	
	}
	//tutaj musisz wykonać sobie kod zapisujący licznik wejść itd
}

  • +
  • -
  • 1


#668158 Pobieranie śmierci gracza w spoczynku i powietrzu

Napisane przez radim w 26.10.2014 21:05

1. FL_ONGROUND

2. https://forums.allie...ad.php?t=227657
https://forums.allie...15124?p=1215124


  • +
  • -
  • 1