Jump to content
  • 0

pomoc [HELP] Pickup + timer


T.Evil

Dotaz

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 by T.Evil
Link to comment
Share on other sites

23 odpovědí na tuto otázku

Recommended Posts

  • 0
  • Administrátor

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

  • 0

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... 

 


EDIT

Už 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

  • 0

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

  • 0

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 by T.Evil
Link to comment
Share on other sites

  • 0

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 by StreetGuy
Link to comment
Share on other sites

  • 0

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 by xhunterx
  • Líbí se mi to! (+1) 4
Link to comment
Share on other sites

  • 0

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ší icon_e_biggrin.gificon_e_wink.gif

 

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 ... icon_e_biggrin.gif

 

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" ? icon_e_biggrin.gif

 

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?icon_e_biggrin.gif 

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 by T.Evil
Link to comment
Share on other sites

  • 0

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" ? icon_e_biggrin.gif

 

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?icon_e_biggrin.gif 

 

 

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. icon_e_wink.gif

 

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... icon_e_wink.gif 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 icon_e_wink.gificon_e_biggrin.gif

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0

@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 icon_e_biggrin.gif

 

 

 

 

 

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, kdo
ti právě pomohl. V tomto případě je to xHunterx !

 

Edited by T.Evil
Link to comment
Share on other sites

  • 0

@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 icon_e_biggrin.gif

 

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ší... icon_e_biggrin.gif

 

Btw. to chceš předělat všechny pickupy? icon_e_biggrin.gif 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ý icon_e_wink.gif Ale je to na tobě, jak ti to říkám od začátku. icon_e_wink.gif

 

Edit.: Jinak v pawnu existuje funkce Najít a nahradit ;) 

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0
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 by xhunterx
Link to comment
Share on other sites

  • 0

 

 

Edit.: Jinak v pawnu existuje funkce Najít a nahradit icon_e_wink.gif

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...