T.Evil 5 Odesláno: 27. Září, 2016 Share Odesláno: 27. Září, 2016 (upraveno) Zdravim lidi,mám menší problém s timerem na pickupy. Jakmile hráč umře, objeví se mu pickupy hned. Nikoliv po 30ti minutách které mám v timeru. new pPickup[4]; forward mytimer(); public mytimer() { pPickup[1] = CreatePickup(1274,19,1492.1907,-1767.8684,18.7958,-1); pPickup[2] = CreatePickup(1212,19,1312.3002,-1006.9481,33.8984,-1); pPickup[3] = CreatePickup(1212,19,980.9848,-1064.0038,36.0387,-1); return 1; } public OnGameModeInit() { pPickup[1] = CreatePickup(1274,19,1492.1907,-1767.8684,18.7958,-1); pPickup[2] = CreatePickup(1212,19,1312.3002,-1006.9481,33.8984,-1); pPickup[3] = CreatePickup(1212,19,980.9848,-1064.0038,36.0387,-1); return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { if(pickupid == pPickup[1]) DestroyPickup(pPickup[1]),GivePlayerMoney(playerid, 10000),SetTimer("mytimer", 1800000, false); if(pickupid == pPickup[2]) DestroyPickup(pPickup[2]),GivePlayerMoney(playerid, 10000),,SetTimer("mytimer", 1800000, false); if(pickupid == pPickup[3]) DestroyPickup(pPickup[3]),GivePlayerMoney(playerid, 10000),SetTimer("mytimer", 1800000, false); return 1; } Zkrátka, chci aby se jakýkoliv sebraný pickup respawnul za 30 minut po tom co byl zničen a dal se znovu sebrat. Edited 27. Červenec, 2017 by T.Evil Link to comment Share on other sites More sharing options...
0 Administrátor Ewwe 434 Odesláno: 27. Září, 2016 Administrátor Share Odesláno: 27. Září, 2016 Problém je vtom že CreatePickup neumí zobrazit pickup pro jednitlivého hráče. tudíž ho vytvoříš jen a pouze pro všechny nebo pro nikoho teoreticky by to šlo jen v případě kdyby jsi hráče po smrti na tu půl hodinu přesunul do jiného virtual wordu. Ale nerozumím přesně tomu co chceš nebo o co ti přesně s těmi pickupy jde Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Září, 2016 Author Share Odesláno: 27. Září, 2016 Jde mi přesně o to, že pokud hráč sebere pPickup, chci aby se tento pickup "zničil (zmizel)" a znovu se objevil za 30 minut. S tím že mu nebude záležet na smrti hráče nebo jiných okolnostech. Prostě někdo ho sebere a objeví se za 30 minut. Problém je teď v tom že když hráč sebere pickup a zemře, pickup se znovu objeví proto že zemřel. Čemuž nerozumím... EDITUž jsem na to přišel...vtip je v tom že SetTimer("mytimer", 1800000, false) musí být SetTimer("mytimer", 1800000, 1)LOL Link to comment Share on other sites More sharing options...
0 Lukasz 336 Odesláno: 27. Září, 2016 Share Odesláno: 27. Září, 2016 Tak to jsi přišel na dobrou hovadinu. Užij si x spuštěných timerů. 1 Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Září, 2016 Author Share Odesláno: 27. Září, 2016 Máš lepší nápad? Link to comment Share on other sites More sharing options...
0 Stellet 7 Odesláno: 27. Září, 2016 Share Odesláno: 27. Září, 2016 Zkus změnit typ pickupu.. Každý typ něco znamená. Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Září, 2016 Author Share Odesláno: 27. Září, 2016 Typy pickupu znám, mě to s tímhle funguje. Mě už to vlsatně úplně funguje ale Lukasz říká že je v tom problém. Tak by mě zajímalo kde Link to comment Share on other sites More sharing options...
0 Scydo 397 Odesláno: 27. Září, 2016 Share Odesláno: 27. Září, 2016 ale Lukasz říká že je v tom problém. Tak by mě zajímalo kde SetTimer("mytimer", 1800000, 1) repeating Boolean (true/false) on whether the timer should repeat or not. http://wiki.sa-mp.com/wiki/SetTimer Link to comment Share on other sites More sharing options...
0 Lukasz 336 Odesláno: 28. Září, 2016 Share Odesláno: 28. Září, 2016 Zkus si to třeba opravit a ne vymýšlet kraviny, které ti to opravdu nevyřeší a jen nadělají další problémy. Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 1. Říjen, 2016 Author Share Odesláno: 1. Říjen, 2016 To bych byl rád, jenže nevím jak.. Napdá mě jenom udělat 1 timer pro všechny pickupy najednou s tím že se tedy respawnou všechny jendou za půl hodiny ať už je někdo sebere nebo ne. Jenom nevím jestli to bude fungovat. Dal bych tam tedy typ pickupy který zmizí po sebrání. Myslíš že to bude fachat? Link to comment Share on other sites More sharing options...
0 The hidden face 77 Odesláno: 1. Říjen, 2016 Share Odesláno: 1. Říjen, 2016 (upraveno) Jenom dotaz: chceš, aby zmizel na 30 minut pro všechny hráče, nebo jenom pro hráče, co ho sebrali? Edited 1. Říjen, 2016 by GaRGoyLeS Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Červenec, 2017 Author Share Odesláno: 27. Červenec, 2017 (upraveno) Jenom dotaz: chceš, aby zmizel na 30 minut pro všechny hráče, nebo jenom pro hráče, co ho sebrali? Potřebuji aby pickup zmizel na 30 minut pro všechny hráče nehledě na tom jestli se hráč odpojí nebo ne. Pokud hráč sebere pickup[1], musí pouze pickup[1] zmizet na 30 minut. Znamená to tedy že bych musel mít pro každý pickup jeden timer? Edited 27. Červenec, 2017 by T.Evil Link to comment Share on other sites More sharing options...
0 StreetGuy 1 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 (upraveno) Tak začneme ... 1. Kto ta prosím učil robiť toto ? if(pickupid == pPickup[1]) DestroyPickup(pPickup[1]),GivePlayerMoney(playerid, 10000),SetTimer("mytimer", 1800000, false); Popravde som si myslel, že to máš niaku funkciu keď tam máš za každým príkazom "," , aj keď neviem či sa to tak môže robiť. 2. DestroyPickup(pPickup[1]),GivePlayerMoney(playerid, 10000) Neviem či som až tak sprostý, alebo tam nevidím ukončenie príkazu s ";" 3. Keď sa snažíš šetriť riadkami, sprav si to jednoducho takto: if(pickupid == pPickup[1]) { DestroyPickup(pPickup[1]); GivePlayerMoney(playerid, 10000); SetTimer("mytimer", 1800000, false); } 4. Vymažeš jeden pickup a vytvoríš 3 ďalšie ? Znova si pozri čo ti robí public mytimer. Edited 27. Červenec, 2017 by StreetGuy Link to comment Share on other sites More sharing options...
0 xhunterx 55 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 (upraveno) Okej dost bolo, teraz realne opraveny kod. new pPickup[4]; forward mytimer(id); public mytimer(id) { switch(id) { case 1: if(pPickup[1] == -1) pPickup[1] = CreatePickup(1274,19,1492.1907,-1767.8684,18.7958,-1); case 2: if(pPickup[2] == -1) pPickup[2] = CreatePickup(1212,19,1312.3002,-1006.9481,33.8984,-1); case 3: if(pPickup[3] == -1) pPickup[3] = CreatePickup(1212,19,980.9848,-1064.0038,36.0387,-1); } return 1; } public OnGameModeInit() { pPickup[1] = CreatePickup(1274,19,1492.1907,-1767.8684,18.7958,-1); pPickup[2] = CreatePickup(1212,19,1312.3002,-1006.9481,33.8984,-1); pPickup[3] = CreatePickup(1212,19,980.9848,-1064.0038,36.0387,-1); return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { if(pickupid == pPickup[1]) DestroyPickup(pPickup[1]), GivePlayerMoney(playerid, 10000), SetTimerEx("mytimer", 1800000, false, "i", 1), pPickup[1] = -1; if(pickupid == pPickup[2]) DestroyPickup(pPickup[2]), GivePlayerMoney(playerid, 10000), SetTimerEx("mytimer", 1800000, false, "i", 2), pPickup[2] = -1; if(pickupid == pPickup[3]) DestroyPickup(pPickup[3]), GivePlayerMoney(playerid, 10000), SetTimerEx("mytimer", 1800000, false, "i", 3), pPickup[3] = -1; return 1; } Problem je v tom, ze pokazde ked sa ti zavolal mytimer si vymenil premenne za novy pickup, ale neznicil tie stare. Cize ti ostali na rovnakom mieste 2 pickupy a ked si jeden z nich zdvihol, ten sa znicil ale druhy zostal.PS: 1. Kto ta prosím učil robiť toto ? if(pickupid == pPickup[1]) DestroyPickup(pPickup[1]),GivePlayerMoney(playerid, 10000),SetTimer("mytimer", 1800000, false); Popravde som si myslel, že to máš niaku funkciu keď tam máš za každým príkazom "," , aj keď neviem či sa to tak môže robiť. Moze. A, B, C; je v pawne zlozeny vyraz, ktory returne hodnotu C. Cize napr "return func1(), func2();" ti vykona func1(), ptom func2() a returne hodnotu vratenu funkciou func2(). 2. DestroyPickup(pPickup[1]),GivePlayerMoney(playerid, 10000) Neviem či som až tak sprostý, alebo tam nevidím ukončenie príkazu s ";" Je to zlozeny vyraz, ; tam byt nemoze. 3. Keď sa snažíš šetriť riadkami, sprav si to jednoducho takto: if(pickupid == pPickup[1]) { DestroyPickup(pPickup[1]); GivePlayerMoney(playerid, 10000); SetTimer("mytimer", 1800000, false); } Taktiez moznost, ale zbyrocna, to co pouzil je dobre + sa s tym lepsie pracuje ak treba vracat hodnotu alebo nieco podobne. 4. Vymažeš jeden pickup a vytvoríš 3 ďalšie ? Znova si pozri čo ti robí public mytimer. Jop, presne toto je ten problem. Konkretne, ze tie 2 pickupy uz viac niesu ulozene v ziadnej premennej a preto sa nikdy nesmazu. Velmy podobne memory leaku v inych jazykoch. Edited 27. Červenec, 2017 by xhunterx 4 Link to comment Share on other sites More sharing options...
0 The hidden face 77 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 Udělal jsem ti scriptík, stačí použít CreateRePickup, který vše už zařídí, ale je to na tobě co použiješ, kód upravený od xhunterx je rozhodně kratší PASTEBIN.COM Link to comment Share on other sites More sharing options...
0 StreetGuy 1 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 Je to z roku 2016 ... Link to comment Share on other sites More sharing options...
0 xhunterx 55 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 Je to z roku 2016 ... OP az dneska upresnil, co chce Mi za to nemozeme, ze T.Evil odpovedal na GaRGoyLeSovu otazku az teraz. Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Červenec, 2017 Author Share Odesláno: 27. Červenec, 2017 (upraveno) Udělal jsem ti scriptík, stačí použít CreateRePickup, který vše už zařídí, ale je to na tobě co použiješ, kód upravený od xhunterx je rozhodně kratší PASTEBIN.COM Díky, ale přijde mi to zbytečně složitý, myslím že můj problém je pouze v resetování pickupu a nebo používám špatně timer... Je to z roku 2016 ... No vidíš jak to letí, po roce jsem se vrátil k pickupům, do teď jsem je zatim moc neřešil EDIT - DŮLEŽITÉ Když hráč sebere pickup[1], použiju DestroyPickup[1] , nastavím pickup[1] = -1, zapnu timer na 10000ms(10 vteřin) ... v timeru mám if(pickup[1] = -1) CreatePickup(...) To znamená, že pokud hráč sebere pickup, pickup zmizí a znovu se vytvoří za tu dobu kdy doběhne timer (10 vteřin). Což je super. Problém je však to, že když hráč sebere pickup a spustím timer, a jiný hráč sebere jiný pickup a spustí tento timer, timer začne zase znovu a oba pickupy se vytvoří za 10 vteřin. Já potřebuji aby hráč sebral pickup a ten se znovu vytvořil prostě za těch 10 vteřin nehledě na to jestli někdo jiný sebere jinej pickup jinde. Pokud timer udělám do ongamemodeinit a budu ho repeatovat pickupy se budou respawnovat všechny najednou po 10 vteřinách a to nechci. Znamená to tedy že bych musel pro každý pickup udělat zvláštní timer, nebo existuje něco "víc safe" ? Díky xHunterx Nevšiml jsem si že jsi to tam napsal. Vtipný je že jsem udělal přesně to samý mezitim co jsem tu nebyl až na to že v tom timeru nemám switch, je to tak, že když použiju switch timer se spustí pouze pro tento konkrétní case když player seberepickup? A jak moc je důležitý rozdíl mezi SetTimer a SetTimerEx v tomto případě? Hádám že to souvisí s caseováním těch pickupů v timeru že? Hned jsem zpět.. Edited 27. Červenec, 2017 by T.Evil Link to comment Share on other sites More sharing options...
0 The hidden face 77 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 (upraveno) Díky, ale přijde mi to zbytečně složitý, myslím že můj problém je pouze v resetování pickupu a nebo používám špatně timer... No vidíš jak to letí, po roce jsem se vrátil k pickupům, do teď jsem je zatim moc neřešil EDIT - DŮLEŽITÉ Když hráč sebere pickup[1], použiju DestroyPickup[1] , nastavím pickup[1] = -1, zapnu timer na 10000ms(10 vteřin) ... v timeru mám if(pickup[1] = -1) CreatePickup(...) To znamená, že pokud hráč sebere pickup, pickup zmizí a znovu se vytvoří za tu dobu kdy doběhne timer (10 vteřin). Což je super. Problém je však to, že když hráč sebere pickup a spustím timer, a jiný hráč sebere jiný pickup a spustí tento timer, timer začne zase znovu a oba pickupy se vytvoří za 10 vteřin. Já potřebuji aby hráč sebral pickup a ten se znovu vytvořil prostě za těch 10 vteřin nehledě na to jestli někdo jiný sebere jinej pickup jinde. Pokud timer udělám do ongamemodeinit a budu ho repeatovat pickupy se budou respawnovat všechny najednou po 10 vteřinách a to nechci. Znamená to tedy že bych musel pro každý pickup udělat zvláštní timer, nebo existuje něco "víc safe" ? Díky xHunterx Nevšiml jsem si že jsi to tam napsal. Vtipný je že jsem udělal přesně to samý mezitim co jsem tu nebyl až na to že v tom timeru nemám switch, je to tak, že když použiju switch timer se spustí pouze pro tento konkrétní case když player seberepickup? Není na tom vůbec nic složitého tobě stačí použít funkci stock CreateRePickup(model, Float:X, Float:Y, Float:Z, virtualworld = -1, delay = 30) // nemusíš zadávat ani virtualworld ani delay (tj. za jak dlouho se respawne) Nic víc znát nemusíš, pokud chceš změnit delay, tak ho jednoduše zadás, za VW: CreateRePickup(1274,1492.1907,-1767.8684,18.7958, -1, 15); // 15 minut delay Ovšem jak tam popisuju, má to nevýhodu, nebudeš to mít přesně na vteřinu ale se zpožděním 0 - 59 sekund (timer je dělaný na 1 minutu), dělal jsem to s tím, že ti to nevadí páč to máš na minuty a nějakých pár sekund na víc ti je určitě jedno, ovšem pokud to chceš na sekundy tak to chce předělat, což není problém. Jinak tohle používá jediný timer pro všechny... je zbytečný mít na každý pickup timer, buď toto a nebo se ti to bude resetovat zpět na 10 sekund jak píšeš... , nebo můžeš použít xhunterův kód, který ti to dělat nebude .. Takže pokud to potřebuješ na sekundy není problém, to předělat... Jak říkám výše kromě fce CreateRePickup nic jiného znát nepotřebuješ, takže na tom není vlastně nic složitého Edited 27. Červenec, 2017 by GaRGoyLeS Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 27. Červenec, 2017 Author Share Odesláno: 27. Červenec, 2017 (upraveno) @GaRGoyLeS Moc si vážím toho že jsi si s tím dal práci. Jenže já mám v kódu tisíce a stovky pickupů a fukncí s nimi spjaté že se mi to popravdě vůbec celý předělávat nechce PROBLÉM VYŘEŠEN - LOCK!Mockrát děkuji xHunterx za vyřešení problému. Také děkuji všem ostatním kteří nad tím strávili svůj čas, aby pomohli.Náhodný návštěvníku tohoto téma:Pokud používáš podobný systém pickupů musel jsi se setkat se stejným problémem,já osobně jsem nikde jinde než zde na pawno.cz řešení nemohl najít. Oceň tedy toho, kdoti právě pomohl. V tomto případě je to xHunterx ! Edited 27. Červenec, 2017 by T.Evil Link to comment Share on other sites More sharing options...
0 The hidden face 77 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 (upraveno) @GaRGoyLeS Moc si vážím toho že jsi si s tím dal práci. Jenže já mám v kódu tisíce a stovky pickupů a fukncí s nimi spjaté že se mi to popravdě vůbec celý předělávat nechce No tak to udělej jak xhunterx radí. Sice tam zadáváš každý pickup 2x, ale když ti to na předělávání přijde méně pracnější... Btw. to chceš předělat všechny pickupy? Já myslel, že pouze některé zmizí a objeví se po 30 minutách.. každopádně kopírovat to a v kládat ručně do polí mi přijde mnohem pracnější než jen k těm pickupům kde chceš mít time delay připsat za Create Re a odstranit typ, který je pro všechny stejný Ale je to na tobě, jak ti to říkám od začátku. Edit.: Jinak v pawnu existuje funkce Najít a nahradit Edited 27. Červenec, 2017 by GaRGoyLeS Link to comment Share on other sites More sharing options...
0 StreetGuy 1 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 Ešte jedna otázka... aký môd robíš ? Link to comment Share on other sites More sharing options...
0 xhunterx 55 Odesláno: 27. Červenec, 2017 Share Odesláno: 27. Červenec, 2017 (upraveno) Nevšiml jsem si že jsi to tam napsal. Vtipný je že jsem udělal přesně to samý mezitim co jsem tu nebyl až na to že v tom timeru nemám switch, je to tak, že když použiju switch timer se spustí pouze pro tento konkrétní case když player seberepickup? A jak moc je důležitý rozdíl mezi SetTimer a SetTimerEx v tomto případě? Hádám že to souvisí s caseováním těch pickupů v timeru že? Hned jsem zpět.. Rozdiel medzi SetTimer a SetTimerEx je, ze SetTimerEx ti da do publicu parametre. Cize do Ex som pridal 2 veci, prva je "i", coz oznacuje, ze ide o jeden ciselny parameter (i = integer = cele cislo). Napriklad "sii" by bol string a 2 cisla. Druha vec, ktoru som pridal je id pickupu, ktory hrac zobral, aby si v danom pickupe potom mal toto cislo pickupu a mohol vytvorit len ten jeden pickup. (aby sa nevytvorili vsetky naraz) Cize to cislo v tom SetTimerEx je ta premenna "id" v tom publicu timeru Nakoniec switch funguje rovnako ako if() else, cize switch(id) { case 1: case 2: case 3: } je to iste ako if(id == 1) else if(id == 2) else if(id == 3) Iba je to rychlejsie (menej narocne na CPU, mensia casova zlozitost) a prehladnejsie. Edited 27. Červenec, 2017 by xhunterx Link to comment Share on other sites More sharing options...
0 T.Evil 5 Odesláno: 28. Červenec, 2017 Author Share Odesláno: 28. Červenec, 2017 Edit.: Jinak v pawnu existuje funkce Najít a nahradit No, nepovídej Díky ale mám v modu svůj systém a vyhovuje mi tak jak je, především práce s pickupama je mnohem jednodušší a rychlejší. Rozdiel medzi SetTimer a SetTimerEx je, ze SetTimerEx ti da do publicu parametre. Cize do Ex som pridal 2 veci, prva je "i", coz oznacuje, ze ide o jeden ciselny parameter (i = integer = cele cislo). Napriklad "sii" by bol string a 2 cisla. Druha vec, ktoru som pridal je id pickupu, ktory hrac zobral, aby si v danom pickupe potom mal toto cislo pickupu a mohol vytvorit len ten jeden pickup. (aby sa nevytvorili vsetky naraz) Cize to cislo v tom SetTimerEx je ta premenna "id" v tom publicu timeru Díky moc za vysvětlení, rozhodně to v budoucno využiju vícekrát. Já jsem používal SetTimerEx pouze když jsem chtěl vyvolat timer por jednoho hráče, pro integer playerid ale teď už vim že se toho dá využít i jiným zplsobem Link to comment Share on other sites More sharing options...
Dotaz
T.Evil 5
Zdravim lidi,
mám menší problém s timerem na pickupy. Jakmile hráč umře, objeví se mu pickupy hned. Nikoliv po 30ti minutách které mám v timeru.
Zkrátka, chci aby se jakýkoliv sebraný pickup respawnul za 30 minut po tom co byl zničen a dal se znovu sebrat.
Link to comment
Share on other sites
23 odpovědí na tuto otázku
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now