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

Wysłany: 2017-01-25, 08:57


MrLuzny







Wiek: 34
Na forum: 3462 dni
Posty: 57

Piwa: 4

Respekt: 60

witam mam w swoim kodzie na dawanie do auta nitra zrobione:
Pawn
AddVehicleComponent(vehicle1010);
Uzycienitra[vehicleid] = 500;


chce teraz zrobi? timer kt?ry co sekunde w kt?rej chcemy u?yc nitra ?eby sprawdza? czy:
Pawn
if(Uzycienitra[vehicleid] >= 1)
{
Uzycienitra[vehicleid] --;
//kod kt?ry wywo?a u?ycie nitra
}
if(Uzycienitra[vehicleid] == 0)
{
//kod kt?ry nie pozwoli u?y? nitra
//wiad kt?ra sie pokaze uzupe?nij nitro
}

widzia?em co? takiego na jednym zserwer?w wi?c wiem ?e to mo?liwe

Ostatnio zmieniony przez ToxiC. 2017-01-25, 10:58, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 11:02


ToxiC.







Wiek: 28
Na forum: 5246 dni
Posty: 3792

Piwa: 8590

Respekt: 1143,8
Respekt: 1143,8

i czego nie umiesz? Nitro usuwasz tak
Pawn
RemoveVehicleComponent(vehicleid,1010);


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 11:10


Wafelowski







Wiek: 29
Na forum: 5347 dni
Posty: 428

Piwa: 100

Respekt: 232
Respekt: 232Respekt: 232

Jest to mo?liwe, do tego potrzebujesz callbacka:


Więcej informacji znajdziesz w Wikipedii SA-MP:

OnPlayerKeyStateChange


i w nim sprawdzasz czy gracz trzyma przycisk odpowiadaj?cy za nitro (w tym przypadku id 4 makro KEY_FIRE) i albo tworzysz timer albo w nim odejmujesz nitro.

Lepsza opcj? wydaje si? tutaj timer globalny a w nim p?tla na wszystkich graczy. Najlepiej robisz sobie jak?? zmienn? bool (na gracza) kt?r? zmieniasz podczas trzymania przycisku na true a w przypadku kiedy pu?ci przycisk, zmieniasz na false przez co warunek si? nie wykona w timerze.

Testowa?em to troch? i wydaje mi si? ?e to jest jedna z lepszych opcji.

Tutaj przyk?adowy kod w OnPlayerKeyStateChange:

Pawn
if(HOLDING(KEY_FIRE) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && Uzycienitra[GetPlayerVehicleID(playerid)] > 0)
{
    AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);
    WlaczoneNitro[playerid] = true;
}
else if(RELEASED(KEY_FIRE) && WlaczoneNitro[playerid] == true)
{
    RemoveVehicleComponent(GetPlayerVehicleID(playerid), 1010);
    WlaczoneNitro[playerid] = false;
}


Timer:

Pawn
if(WlaczoneNitro[playerid] == true)
{
    new vehicleid GetPlayerVehicleID(playerid);
    
    if(Uzycienitra[vehicleid] <= 0)
    {
        SendClientMessage(playerid, -1"Uzupe?nij nitro");
        RemoveVehicleComponent(vehicleid1010);
        
        Uzycienitra[vehicleid] = 0;
        WlaczoneNitro[playerid] = false;
    }
    
    Uzycienitra[vehicleid]--;
}


To jest tylko przyk?ad, mo?e znajdziesz lepszy spos?b.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 19:18


MrLuzny







Wiek: 34
Na forum: 3462 dni
Posty: 57

Piwa: 4

Respekt: 60

o dzi?ki da?em timer przy po??czeniu gracza ??by sprawdza? co 100ms(tylko czy to nie obciazy zbytnio serwera? :/

I po za tym jak zrobic funkcje kiedy pusci klawisz czy od tego jest oldkey?

[ Dodano: 2017-01-25, 19:24 ]
daje tak:
Pawn

        if(HOLDING(KEY_FIRE) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && Uzycienitra[GetPlayerVehicleID(playerid)] > 0)
        {
            AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);
            WlaczoneNitro[playerid] = 1;
        }
        else if(PRESSED(KEY_FIRE) && WlaczoneNitro[playerid] == 1)
        {
            RemoveVehicleComponent(GetPlayerVehicleID(playerid), 1010);
            WlaczoneNitro[playerid] = 0;
        }
        if((oldkeys == (KEY_FIRE) && WlaczoneNitro[playerid] == 1))
        {
            RemoveVehicleComponent(GetPlayerVehicleID(playerid), 1010);
            Uzycienitra[veh] --;
            WlaczoneNitro[playerid] = 0;
        }


znaczy dzia?a to ale gdy wcisne przycisk nitra i przycisk "w" to wtedy nitro nadal w poje?dzie jest odpalone i dzia?a ale gdy nie wciskam w to normalnie sie usuwa

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 20:32


Wafelowski







Wiek: 29
Na forum: 5347 dni
Posty: 428

Piwa: 100

Respekt: 232
Respekt: 232Respekt: 232

Opisz dok?adniej o co Ci chodzi z tym W. Za puszczenie odpowiada RELEASED makro znajdziesz na wiki SAMP-a. Po za tym zamiast zrobi? timer na jednego gracza zr?b to jak wcze?niej napisa?em, nie wiem czy piszesz skrypt (od poczatku) czy nie bo je?eli jaki? edytujesz to prawdopodobnie znajdziesz tam timer z p?tl? na wszystkich graczy kt?ry wykonuje si? co sekund? czy tam ile? i w tej p?tli sprawdzaj czy nitro jest i ile i zamiast da? warto?? 500 to zmniejsz na mniejsz? (np. 50) i wyjdzie na to samo co timer co 100ms czy tam ile?.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 20:47


borsuk







Wiek: 17
Na forum: 3547 dni
Posty: 468

Piwa: 15622

Respekt: 412
Respekt: 412

Ostrzeżeń: 80%
Sry ze si? wtr?cam ale ja bym zrobi? tak mo?e nie dzia?a ale spoko
Pawn

Na pocz?tku
new Uzycirnitra[MAX_VEHICLES];

OnPlayerKeyStateChange

if(HOLDING(KEY_FIRE) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER  && Uzycienitra[GetPlayerVehicleID(playerid)] > 0)
{
    AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);
    Uzycienitra[GetPlayerVehicleID(playerid)]--;
}
else
{
    SendClientMessage(playerid, -1"Brak nitro");
}
else if(oldkeys == KEY_FIRE) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
    RemoveVehicleComponent(GetPlayerVehicleID(playerid), 1010);
}

W OnVehicleStreamIn
Uzycirnitra[vehicleid] = 1000;


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-25, 21:19


Wafelowski







Wiek: 29
Na forum: 5347 dni
Posty: 428

Piwa: 100

Respekt: 232
Respekt: 232Respekt: 232

Ten kod nie b?dzie dzia?a? dobrze, ju? to testowa?em i te odejmowanie w HOLDING r??nie dzia?a po za tym ten tw?j kod b?dzie ca?y czas odejmowa? t? zmienn? z nitrem a? w ko?cu zcrashuje ci si? klient (zrobi?em tak dzisiaj przez przypadek). Lepiej to zrobi? tak jak wspomnia?em wy?ej timer jeden g??wny, globalny na sekund? najlepiej i w nim p?telka i sprawdzanie. Nie wiem r?wnie? po co to else bez warunku ju? lepiej trzeba by?o warunek waln?? a tak to else co chwile si? b?dzie wykonywa?o (jak np. nie b?dzie pasowa? jaki? klawisz do kt?rego? z warunk?w, lub je?eli pu?ci?). M?j kod przecie? dzia?a dobrze, wystarczy dobrze wszystko "wklei?".

Rozumiem ?e chcesz bardzo pom?c ale zanim to zrobisz postaraj si? przemy?le? co i jak bo to jest p??niej takie mieszanie i wracanie do punktu wyj?cia. :eye:

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-26, 06:06


MrLuzny







Wiek: 34
Na forum: 3462 dni
Posty: 57

Piwa: 4

Respekt: 60

dobra relased zadzia?a?o tylko teraz ten timer Pytanie czy on bardzo bedzie nieoptymalny?
Wola? bym co 100ms zamiast 1s bo jezeli ktos pusci nitro przed timerem tomu nie zabierze a razcej take nitro b?d? oszcz?dza? :)
timer og?lny co 100ms zrobi?em i taki w nim kod:
https://hastebin.com/ahupusemab.cpp

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-26, 16:20


Wafelowski







Wiek: 29
Na forum: 5347 dni
Posty: 428

Piwa: 100

Respekt: 232
Respekt: 232Respekt: 232

Powiem tak, ci??ko powiedzie?. Kod niby nie jest jaki? ci??ki do prze?kni?cia ale to wiadomo jednak jest to te 100ms. Tak wi?c moja rada jest taka aby? przetestowa? co i jak, jak b?d? jakie? problemy to po prostu zwi?ksz warto??. Mo?esz te? ustawi? 500ms. Zamiast MAX_PLAYERS u?yj GetPlayerPoolSize()

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-26, 17:16


WWilk1







Wiek: 30
Na forum: 4699 dni
Posty: 116
Nick w MP: eep.Wilk

Piwa: 147

Respekt: 130
Respekt: 130

Ten kod co masz to tak jak wspomnia? Wafelowski jedynym problemem jest cz?stotliwo?? wykonywania si? timera. Trudniejsze operacje w Pawn nie b?d? tak dynamicznie pracowa? jak by?my chcieli. Kod w tym syfie wykonuje si? od g?ry do do?u. Robi?c tego typu bajerki zawsze nara?asz w jakim? tam stopniu optymalizacje game mode, co? za co?. Jakie? ci??sze obliczeniowe operacje nale?y robi? w pluginie przy pomocy sampgdk.

Tutaj masz include kt?ry poprawi dok?adno?? wykonywania si? timer?w oraz ich bug z niemo?liwo?ci? przenoszenia stringu w formacie http://gtao.pl.com/showthread.php?t=435525

Co do GetPlayerPoolSize() to trzeba zwr?ci? uwag? na to ?e ta funkcja zwraca najwi?ksze u?yte ID na serwerze, wi?c trzeba sprawdza? czy kt?rego? gracza nie ma na serwerze. Niestety niekt?rzy na to nie zwr?c? uwagi i p??niej maj? z tym problemy.

Pawn
for(new GetPlayerPoolSize(); >= 0i--)
{
    if(IsPlayerConnected(i))
    {
        TogglePlayerControllable(i0);
    }
}
SendClientMessageToAll(-1"Wszyscy gracze zostali zamro?eni!");


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-28, 18:20


MrLuzny







Wiek: 34
Na forum: 3462 dni
Posty: 57

Piwa: 4

Respekt: 60

to nielepiej zrobic zeby dopiero przy wcisnieciu nitra zrobic zeby timer dla danego gracza sie za??cza?? Nie b?dzie to bardziej optymalne?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-01-28, 21:56


Wafelowski







Wiek: 29
Na forum: 5347 dni
Posty: 428

Piwa: 100

Respekt: 232
Respekt: 232Respekt: 232

?rednie rozwi?zanie, powiem tak w HOLDING b?dzie Ci si? timer bugowa? a to ze wzgl?du takiego ?e kod b?dzie si? wykonywa? ca?y czas w warunku.

Wrzu? sobie co? takiego

Pawn
    if(HOLDING(KEY_FIRE))
    {
        SetTimer("txtest"1000true);
    }


i gdzie? po za skryptem

Pawn

new timerrr;

forward txtest();
public txtest()
{
    printf("Wykonanie %dms"GetTickCount() - timerrr);
    timerrr GetTickCount();
}


I zobacz jak logi wygl?daj? bo u mnie tak: http://pastebin.com/NcCzTuEz

Dodam ?e jest te? problem z zabiciem takiego timera nie ma jak go zabi? bo jak zabijesz to on ponownie si? uruchomi. Jak ju? tak musisz szale? z tym czasem to ustaw na jakie? 700-800ms i testuj.

Postaw piwo autorowi tego posta
 

 
Tagi: wykorzystywanie :: nitra
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » PAWN » wykorzystywanie nitra 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