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

Wyjaśnienie pluginu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
31 odpowiedzi w tym temacie

#1 IntelCom

    Wszechwiedzący

  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 30.12.2014 15:35

Proszę o wyjaśnienie mi na jakiej zasadzie działa ten plugin, bo niby prosty, ale mam problemy.

#include <amxmodx>

#define PLUGIN "Huddni"
#define VERSION "1.0"
#define AUTHOR "intelcom"

new const g_sDayName[][] = 
{
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota",
"Niedziela"
}

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent( "RoundStart", 2, "1=Round_Start" );
}
 
public RoundStart()
{
	static i_day;
	if(i_day > 6)
	i_day = 0;
	
	set_hudmessage(0, 255, 0, -1.0, 0.25, 0, 1.5, 3.0, 1.0, 1.0, 4);
	show_hudmessage(0, "Dzisiaj jest: %s", g_sDayName[i_day]);
	
	i_day++;
	
	return 1;
}
 

Za pomoc oczywiście plusy.Głownie chodzi mi tutaj o:

 

1)

new const g_sDayName[][]

2)

public RoundStart()

3) Do static'a (zmienna statyczna), nie przypisujemy żadnej wartości liczbowej, a mimo to stawiamy warunek:

if(i_day > 6)

  • +
  • -
  • 0

#2 Proziom1

    Życzliwy

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:30
  • Imię:Damian
  • Lokalizacja:Polska
Offline

Napisano 30.12.2014 15:44

Ojj IntelCom IntelCom i ty się bierzesz za pisanie Vip'a :) .

A więc :

new const g_sDayName[][]

oznacza tablicę dwuwymiarową  którą zadeklarowałeś.Jest ona typu const czyli stała i nie można w nią ingerować zmieniając jakieś wartości.

public RoundStart()

natomiast to co jest powyżej to funkcja która będzie wywoływana na początku każdej rundy.

if(i_day > 6)

Nie przypisujemy ale zmiennym tego typu automatycznie kompilator przypisuje wartość 0 ,chyba że sobie ją zainicjalizujemy sami jakąś wartością to kompilator nie będzie nam tego zmieniał.


  • +
  • -
  • 0

#3 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 30.12.2014 15:52


if(i_day > 6)

 

To w takim razie jak zero może być większe od 6?

 

Nie poprawna instrukcja warunkowa ?

 


new const g_sDayName[][]

 

Czyli new const oznacza tablicę stałą, g_sDayName - nazwa tej tablicy, [][] - oznacza tablicę dwuwymiarową ?


  • +
  • -
  • 0

#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 30.12.2014 15:59

To w takim razie jak zero może być większe od 6?

 

Nie może ale potem ta zmienna co wykonanie jest powiększana o 1


  • +
  • -
  • 0

#5 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 30.12.2014 16:07


Nie może ale potem ta zmienna co wykonanie jest powiększana o 1

 

Przyznam się, że nie za bardzo rozumiem co napisałeś.

 

Zmienna jest powiększana o 1 co wykonanie?A kiedy ta zmienna się wykonuje?


  • +
  • -
  • 0

#6 radim

    Godlike

  • Moderator

Reputacja: 939
Master

  • Postów:2 725
  • Steam:steam
  • Imię:Arkadiusz
  • Lokalizacja:Janów Lub.
Offline

Napisano 30.12.2014 16:11

Funkcji RoundStart która jest eventem nowej rundy dokładnie tutaj:

i_day++;

  • +
  • -
  • 0

Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !


#7 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 30.12.2014 16:16

Przeczytaj chociaż jeden tutorial w dziale tutoriale a przynajmniej kilka albo wszystkie


  • +
  • -
  • 0

#8 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 30.12.2014 16:35


Przeczytaj chociaż jeden tutorial w dziale tutoriale a przynajmniej kilka albo wszystkie

 

Czytałem poradniki na amxx.pl, wszystkie jeśli chodzi o podstawy tworzenia pluginów.

 

edit@

 

"Co wykonanie jest powiększana o jeden"

 

Tzn.

 

W każdej nowej rundzie zmienna i_day jest powiększana o 1?

 

Nie rozumiem tego, jak ktoś będzie łaskawy dać jakiś dobry, czytelny i w miarę łatwy do zrozumienia poradnik to będę wdzięczny ;)

 

Taki, który pozwoli mi bardziej zrozumieć to co napisaliście Cię.


Użytkownik IntelCom edytował ten post 30.12.2014 16:48

  • +
  • -
  • 0

#9 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

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

Napisano 30.12.2014 17:06

Plugin jest na serwery JB i ma za zadanie pokazywanie, który jest aktualnie dzień tygodnia. Jak zapewne wiesz, nowy dzień tygodnia następuje w nowej rundzie. Ludzie piszący pluginy wymyślili więc, że stworzą tablicę z dniami tygodnia i z niej będą pokazywali aktualny dzień. Ale jak zrobić, aby ten dzień się zmieniał? Do tego celu wykorzystano zmienną i_Day, która podczas nowej rundy jest inkrementowana, czyli jej wartość jest powiekszana o 1 (np. Z 3 na 4). Jak zapewne wiesz, tydzień ma 7 dni. Z tego też powodu plugin sprawdza, czy zmienna nie przekroczyła tej granicy. Jeśli tak, jest resetowana do 1 - poniedziałku. Samo zastosowanie zmiennej ma miejsce w show_hudmessage g_SDayname[g_iDay]. Wyrażenie to wybiera z tablicy z nazwami tygodnia właściwy dzień. Gdybyś napisał, g_Sdayname[1], w hud pokazalby się poniedziałek i nie zmienialby się on bez względu na faktyczny dzień. My jednak potrzebujemy rozwiązania dynamicznego, które samo będzie zmieniało dzień w nowej rundzie i właśnie dlatego zmienna g_iDay jest tutaj wykorzystywana.
Prościej nie da rady
  • +
  • -
  • 1

#10 Proziom1

    Życzliwy

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:30
  • Imię:Damian
  • Lokalizacja:Polska
Offline

Napisano 30.12.2014 17:14

Kolego MAGNET popełniłeś błąd ,ponieważ napisałeś coś takiego:

"Gdybyś napisał, g_Sdayname[1], w hud pokazalby się poniedziałek"

 

Nieprawda bo przecież tablice numerujemy od 0 czyli pokazałby mu się już Wtorek a nie Poniedziałek :)


  • +
  • -
  • 1

#11 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 30.12.2014 17:17


Plugin jest na serwery JB i ma za zadanie pokazywanie, który jest aktualnie dzień tygodnia. Jak zapewne wiesz, nowy dzień tygodnia następuje w nowej rundzie. Ludzie piszący pluginy wymyślili więc, że stworzą tablicę z dniami tygodnia i z niej będą pokazywali aktualny dzień. Ale jak zrobić, aby ten dzień się zmieniał? Do tego celu wykorzystano zmienną i_Day, która podczas nowej rundy jest inkrementowana, czyli jej wartość jest powiekszana o 1 (np. Z 3 na 4). Jak zapewne wiesz, tydzień ma 7 dni. Z tego też powodu plugin sprawdza, czy zmienna nie przekroczyła tej granicy. Jeśli tak, jest resetowana do 1 - poniedziałku. Samo zastosowanie zmiennej ma miejsce w show_hudmessage g_SDayname[g_iDay]. Wyrażenie to wybiera z tablicy z nazwami tygodnia właściwy dzień. Gdybyś napisał, g_Sdayname[1], w hud pokazalby się poniedziałek i nie zmienialby się on bez względu na faktyczny dzień. My jednak potrzebujemy rozwiązania dynamicznego, które samo będzie zmieniało dzień w nowej rundzie i właśnie dlatego zmienna g_iDay jest tutaj wykorzystywana.
Prościej nie da rady

 

Ok, myślę że swoją długą i wyczerpującą odpowiedzią na pewno przybliżyłeś mi to czego wcześniej nie rozumiałem.Jednak nadal mam problem ze zrozumieniem tego warunku i to mnie nurtuje  ;)

 

Oczywiście + :)


Użytkownik IntelCom edytował ten post 30.12.2014 17:19

  • +
  • -
  • 0

#12 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

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

Napisano 30.12.2014 17:21

Proziom1

 

Faktycznie, nie popatrzyłem się na kod. pisałem z telefonu, stąd tez problemy z wielkością liter. Oczywiście masz rację, 0 to poniedziałek

 

@EDIT

 

if(i_day > 6)
    i_day = 0;

 

 

W tym warunku sprawdzasz, czy wartośc zmiennej i_day jest większa on 6. Oznacza to ni mniej ni więcej tyle, ze ma ona wartość 7, czyli niedzielę. Jeśli tak jest, wartość zmiennej jest zerowana. Równie dobrze (dla przejrzystości kodu) mógłbyś zrobić coś takiego:

 

if(i_day == 7)
    i_day = 0;

 

Czyli: jeśli juz była niedzielna, dajemy tydzień od początku - od poniedziałku. Czy teraz jest to dla Ciebie bardziej jasne? :)

 


Użytkownik MAGNET edytował ten post 30.12.2014 17:24

  • +
  • -
  • 0

#13 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

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

Napisano 30.12.2014 18:16

Po 1. pamiętaj, że kod programu wykonywany jest krok po kroku.
Po 2. zmienne są po to, by zapamiętywać wartości i później się odwoływać.

Biorąc sobie do serca te 2 reguły:
    new zmienna=0
    for (new i=0; i<10; ++i) { // Zignoruj to jeśli nie rozumiesz jak działa, to po prostu wykona 10 razy kod pomiędzy klamrami.
        if (zmienna>3) {
            client_print(id, print_chat, "Jest większe")
        }
        zmienna++;
    }
kod ten wyświetli napis "Jest większe" 6 razy w czacie. Dlaczego? Krok po kroku
1. Stworzona zostanie zmienna i przypisana do niej wartość 0
2. wejście do pętli
3. 0 nie jest większe od 3, pomijamy if
4. zwiększamy zmienna o 1
5. na początek pętli
6. 1 nie jest większe od 3, pomijamy if
7. zwiększamy zmienna o 1
8. na początek pętli
9. 2 nie jest większe od 3, pomijamy if
10. zwiększamy zmienna o 1
11. na początek pętli
12. 3 nie jest większe od 3, pomijamy if
13. zwiększamy zmienna o 1
14. na początek pętli
15. 4 jest większe od 3
16. wypisujemy "Jest większe" w czacie gracza o ID równym id
17. zwiększamy zmienna o 1
18. na początek pętli
19. 5 jest większe od 3
20. wypisujemy "Jest większe" w czacie gracza o ID równym id
21. zwiększamy zmienna o 1
22. na początek pętli
23. 6 jest większe od 3
24. wypisujemy "Jest większe" w czacie gracza o ID równym id
25. zwiększamy zmienna o 1
26. na początek pętli

i tak dalej...
  • +
  • -
  • 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


#14 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 31.12.2014 15:13

GwynBleidD, bardzo mi pomogłeś, ale mam jeszcze jedno pytanie.A mianowicie opierając się na tym pluginie w moim pierwszym poście w tym temacie, to tak:

 

1) Tworzę tablicę typu const, dwu wymiarową i w niej wypisuje po kolei dni tygodnia.

new const g_sDayName[][] = 
{
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota",
"Niedziela"
} 

2) W funckji RoundStart tworzę zmienną statyczną static i_day i nie przypisuję jej żadnej wartości, czyli jest równa 0 (domyślnie).

static i_day; 

Skąd plugin wie, który dzień odpowiednio wyświetlić w danej rundzie?Wiem, że co rundę zmienna i_day++ się dodaje.Ale nigdzie nie jest przypisane, że np.

0 - Poniedziałek
1- Wtorek
2- Środa
3- Czwartek
4- Piątek
itd.

Czyżby odpowiedź znajdowała się w tej linijce naszego kodu?

show_hudmessage(0, "Dzisiaj jest: %s", g_sDayName[i_day]);

  • +
  • -
  • 0

#15 MAGNET

    SourceLearned ;)

  • Moderator

Reputacja: 661
Wszechmogący

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

Napisano 31.12.2014 15:18

Jest przypisane właśnie w tej zmiennej! W nowej rundzie wartość zmiennej jest powiekszana o 1, a wartość ta jest zapisywana i dalej istnieje. W kolejnej rundzie będzie 2, a w kolejnej 3. A serwer wyświetla dzień tygodnia, ponieważ mówisz mu który element z tablicy z dniami tygodnia ma być pokazany
  • +
  • -
  • 0

#16 IntelCom

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 100
Zaawansowany

  • Postów:500
  • GG:
  • Imię:Dawid
  • Lokalizacja:Opole
Offline

Napisano 31.12.2014 15:32

Czyli zmienna i_day jest przypisana do tej tablicy o czym świadczą te nawiasy kwadratowe []:

show_hudmessage(0, "Dzisiaj jest: %s", g_sDayName[i_day]);

 

I dlatego plugin wie, który dzień w danej rundzie wyświetlić tak ?


  • +
  • -
  • 0

#17 Proziom1

    Życzliwy

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:30
  • Imię:Damian
  • Lokalizacja:Polska
Offline

Napisano 31.12.2014 15:35

A ja mam jeszcze takie pytanko odnośnie tego tematu.Dokładniej chodzi mi o tą tablice:

new const g_sDayName[][] = 
{
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota",
"Niedziela"
} 

Czy ta tablica w jednych komórkach pamięci przechowuje dni tygodnia a w drugich długość łańcuchu znaków poszczególnych dni ?


  • +
  • -
  • 0

#18 NoLiFeR

    Wszechobecny

  • Użytkownik

Reputacja: 103
Zaawansowany

  • Postów:483
  • GG:
  • Imię:Adrian
  • Lokalizacja:Sosnowiec
Offline

Napisano 31.12.2014 15:41

Patrz...


new const g_sDayName[][] =
{
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota",
"Niedziela"
} 

To działa jak enum :)

poniedziałek to 0
wtorek to 1
itd itp


//Pytanie g_sDayName[numeracja od zera][] < Tutaj przechowujemy te "Poniedziałek" etc


Użytkownik NoLiFeR edytował ten post 31.12.2014 15:42

  • +
  • -
  • 0

#19 Proziom1

    Życzliwy

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:30
  • Imię:Damian
  • Lokalizacja:Polska
Offline

Napisano 31.12.2014 15:42

Aha tak jak myslałem.Thx :)


Użytkownik Proziom1 edytował ten post 31.12.2014 15:43

  • +
  • -
  • 0

#20 Proziom1

    Życzliwy

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:30
  • Imię:Damian
  • Lokalizacja:Polska
Offline

Napisano 31.12.2014 15:48

Ale zaraz,czemu te dni nie mogłby być zapisane po prostu w tablicy jednowymiarowej.

 

Np. new const g_sDayName[]

 

i tak element [0] - przechowywał by poniedziałek ,element [1]-wtorek itd. 


  • +
  • -
  • 0




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

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