Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2015-01-06, 18:43


Loghain







Wiek: 29
Na forum: 4506 dni
Posty: 51

Piwa: 1

Respekt: 50

Cze??, jak si? robi te otwierane drzwi na serwerach? Chodzi o to co si? w nie wbiega a one si? otwieraj?, bez ?adnych komend, itp. Mam MTA.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-06, 18:51


awfesa







Wiek: 29
Na forum: 4705 dni
Posty: 563

Piwa: 223

Respekt: 280
Respekt: 280Respekt: 280Respekt: 280

Jak sie mie myle to jest zwykly obiekt jak sie nie myle to ma takie id 19374

Podpis

Cokolwiek robicie w swoim życiu, nie będzie to legendarne,
jeżeli wasi przyjaciele nie będą mogli tego zobaczyć.
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-06, 19:19


Loghain







Wiek: 29
Na forum: 4506 dni
Posty: 51

Piwa: 1

Respekt: 50

Ja chc? wiedzie? jak si? robi by tak si? otwiera?y a nie jakie id maj? x.x
Chyba ?e chodzi ci o to ?e one maj? to ju? w siebie wbudowane?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-06, 19:20


PeqX

Heisenberg






Wiek: 30
Na forum: 5568 dni
Posty: 170

Piwa: 99

Respekt: 223,3
Respekt: 223,3Respekt: 223,3

Tak, one ju? powinny takie by?. Chyba.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-07, 00:33


Nickk888







Wiek: 30
Na forum: 5460 dni
Posty: 8
Nick w MP: Nickk888

Piwa: 206

Respekt: 70

Witaj Loghain :) To ja ci odpowiem ;)

Mysle ze chcesz miec drzwi takie przesuwane skryptowo tak?
Obiekty mozna poruszyc za pomoca funkcji
Kod:

MoveObject(objectid, x, y, z, predkosc);


Dam ci maly przyklad:

Najpierw potrzebujesz zmappowac takie drzwi co mysle ze juz zrobiles :)
Wiec na pewno posiadasz
Kod:

CreateObject(objectid, x, y, z, xr, yr, zr);

albo jesli korzystasz ze streamera od Incognito to
Kod:

CreateDynamicObject(objectid, x, y, z, xr, yr, zr);


Wiec teraz musisz zapisywac id tego obiektu do zmiennej, zmienna ta moze a najlepiej musi byc na gorze skryptu pod wszelkimi definicjami i includami

Na przyklad:
Kod:

new Drzwi1;


Wiec zeby zapisywac ID obiektu do tej zmiennej musisz zrobic to tak:
Kod:

Drzwi1 = CreateObject(objectid, x, y, z, xr, yr, zr);

CreateObject po stworzeniu obiektu wydaje ID obiektu w return, a te ID mozemy wlasnie za pomoca (= rownasie) zapisywac do jakiejs zmiennej, na przyklad do "Drzwi1".

Okej, wiec mamy teraz ID obiektu zapisywane w tej zmiennej, teraz mozemy w kazdym skryptcie do niego sie zwracac.

Teraz by te drzwi sie poruszaly jesli jest sie w poblizu musimy stworzyc Timer ktory sprawdza czy jakis gracz jest w poblizu

Wiec wchodzisz do OnGameModeInit i stworz Timer:
Kod:

SetTimer("CheckDoor", 500, true);


Na dole skryptu musimy teraz stworzyc public tego timera, robi sie to tak:
Kod:

forward CheckDoor();
public CheckDoor()
{

return 1;
}


Dobrze, mamy teraz Timer i public ktory sie wlacza co 500 milisekund(pol sekundy)

Wiec widzimy ze Timer ten nie posiada zadnych parametrow na temat graczy itd. wiec w najlepszy sposob by sprawdzac kazdego gracza to
stworzenie petli, petle robi sie tak:
Kod:

for(new i; i < MAX_PLAYERS; i++)
{

}


i to damy nad returnem w "CheckDoor"

Okej, ta petla teraz przechodzi wszelkie numery od 0 az do wartosci w MAX_PLAYERS.

wiec by sprawdzac czy jakis gracz jest w poblizu tych drzwi musimy zrobi sprawdzanie IF z funkcja sprawdzajaca czy gracz jest w poblizu punktu,
a robi sie to tak:
Kod:

if(IsPlayerInRangeOfPoint(i, radius, X, Y, Z))
{

}


Okej, pierwszy parametr to ID gracza, w tym przypadku bedzie to kazdy gracz na serwerze, potem mamy radius, radius to odleglosc od drzwi,
czyli jesli dasz 3, to gracz musi byc 3 jednostek(Wyobraz sobie to jak metry) w poblizu drzwi by IsPlayerInRangeOfPoint wydal wartosc "true"
Potem mamy X, Y , Z, w tym miejscu daj pozycje X, Y ,Z z CreateObject zamknietych drzwi.

Okej teraz jesli gracz bedzie w poblizu bramy to IsPlayerInRangeOfPoint wyda "true" a jesli nie to "false"
Teraz mamy jeden problem, petla ta sprawdza kazdego gracza czy jest w poblizu, wiec jesli Ty bedziesz w poblizu a twoj kolega nie, to IsPlayerInRangeOfPoint wyda "true" i "false".
co sprawia ze drzwi beda migotac albo otwierac sie i zamykac odrazu.

Wiec zeby to omijac potrzebujemy jedna zmienna ktora bedzie trzymala wartosc "true" albo "false" jesli jakis gracz bedzie.
Wiec nad petla dajemy prosta zmienna bool'owa na przyklad:
Kod:

new bool:InRange;


Okej, teraz w IF'ie IsPlayerInRangeOfPoint pomiedzy klamer musimy dac wlasnie nasza zmienna "InRange" jako true.
Cos takiego:
Kod:

InRange = true;


chodzi o to ze po przejscu kazdego gracza ma ustawic "InRange" na "true" wtedy czy chociaz jeden jest w poblizu.

Wiec wyglada to teraz mniej wiecej tak:

Kod:

if(IsPlayerInRangeOfPoint(i, radius, X, Y, Z))
{
InRange = true;
}


Oczywiscie mozesz sobie to skrocic by miec to tak:
Kod:

if(IsPlayerInRangeOfPoint(i, radius, X, Y, Z)) InRange = true;


Okej, teraz POD petla damy sprawdzanie czy InRange jest na "true" albo na "false".
Robimy to w ten sposob:
Kod:

if(InRange)
{

}

albo mozesz i tez w taki sposob:
Kod:

if(InRange == true)
{

}

teraz damy pod tym IFem negacje w postaci else
cos jak:
Kod:

else
{

}

mozesz takze zrobic to tak:
Kod:

if(!InRange)
{

}

albo
Kod:

if(InRange == false)
{

}

ale pozostanmy przy else.

Okej czyli kod ma wygladac mniej wiecej tak:
Kod:

if(InRange)
{

}
else
{

}


Nastepnie w IF(InRange) aby drzwi sie otwieraly dajemy:
Kod:

MoveObject(Drzwi1, X, Y, Z, Predkosc);

albo jesli korzystasz ze streamera od Incognito to
Kod:

MoveDynamicObject(Drzwi1, X, Y, Z, Predkosc);

Wyjasnie ci to. Pierwszy parametr to ID obiektu ktorego chcemy poruszyc, w naszym przypadku jest to "Drzwi1" iz wlasnie tam zapisywalismy ID obiektu ktorego stworzylismy.

Potem X, Y ,Z, w tych koordynatach dajemy pozycje do ktorego nasze drzwi maja sie poruszyc.

Wiec w takim wypadku nalezy stworzyc 2 obiekty, drzwi w pozycji zamknietej, i drzwi w pozycji otwartej. Po zrobieniu tego pobierasz koordynaty X, Y, Z pozycji otwartej i dajesz je wlasnie tam.

Nastepnie mamy Predkosc, predkosc poruszania sie tego obiektu, im wieksza liczba tym szybciej drzwi sie poruszaja, Predkosc jest liczba Floatowa wiec mozesz uzywac kropki typu 1.0, 3.0 itd. Na u siebie w skryptach do poruszajacych sie drzwi korzystam z 3.0, mysle ze jest to optymalne, ale mozesz sobie samemu ustalac predkosc.

Okej, po kompilacji, drzwi po zblizeniu sie, drzwi sie otwieraja,
teraz zajmiemy sie z zamykaniem drzwi.
w tym przypadku robisz tak samo jak z otwierajacymi sie drzwiami ALE, w X, Y, Z daj koordynaty drzwi zamknietej, wiec mozesz smialo pobrac koordynaty z CreateObject.

I ten "MoveObject" dajemy do else. Wiec calosc ma wygladac mniej wiecej tak:
Kod:

if(InRange)
{
MoveObject(Drzwi1, X, Y, Z, Predkosc);
}
else
{
MoveObject(Drzwi1, X, Y, Z, Predkosc);
}

mozesz sobie totakze skrocic:
Kod:

if(InRange) MoveObject(Drzwi1, X, Y, Z, Predkosc);
else MoveObject(Drzwi1, X, Y, Z, Predkosc);


Jesli teraz wejdziesz na serwer i zblizysz sie do drzwi to sie otwieraja i zamykaja zaleznie od zblizajacyh sie graczy :)

Jeszcze ci wyjasnie jak to dziala.
Timer ktory co 500 milisekund odpala publica "CheckDoor", tworzy bool "InRange" standardowo w pozycji "false", wiec jesli nie bedzie jakiegos gracza
w poblizu drzwi pozostanie to na "false" odpalajac negacje w if(InRange) czyli "else", jesli jakikolwiek gracz bedzie w poblizu to bool "InRange" ustawia sie na "true" po czym po
przejsciu calej petli nadal pozostanie to na "true", wiec if(InRange) jest na "true" co sprawia ze drzwi sie otwieraja.

Tutaj ci dam gotowy kod, ale otworz to w ostatecznosci jesli masz bledy czy cokolwiek sie dzieje.
Odkryta wiadomość / Unhidden message(aby ją zobaczyć nie musisz nic robić)
Kod:

forward CheckDoor();
public CheckDoor()
{
new bool:InRange;
for(new i; i < MAX_PLAYERS; i++)
{
if(IsPlayerInRangeOfPoint(i, radius, X, Y, Z)) InRange = true;
}
if(InRange) MoveObject(Drzwi1, X, Y, Z, Predkosc); //Koordynaty drzwi otwartej
else MoveObject(Drzwi1, X, Y, Z, Predkosc); //Koordynaty drzwi zamknietej
}
return 1;
}


Pozdrawiam :)

[ Komentarz dodany przez: Iggy: 2015-01-10, 12:45 ]
Regulamin dzia?u punkt 5, zakazuje si? u?ywania tagu [hide]. :)

Ostatnio zmieniony przez Iggy 2015-01-10, 12:45, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-07, 17:51


Loghain







Wiek: 29
Na forum: 4506 dni
Posty: 51

Piwa: 1

Respekt: 50

U?ytkownik/U?ytkowniczka awfesa mia?/a racj?, wystarczy te drzwi postawi? i same si? otwieraj? gdy posta? w nie wejdzie. Wszyscy macie po piwku. Thx, mo?na lock

Postaw piwo autorowi tego posta
 

 
Tagi: drzwi
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » PAWN Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku