Jump to content
  • 0

pomoc Prázdny slot v /garaz


Guyy

Dotaz

Ahoj :)

Šiel som na QWERov pastebin kedže som vedel že tam nájdem Vehicle Systém, našiel som, nakopíroval som si ho do módu, vyskúšal kupovanie vozidiel, všetko funguje akurát že ked mám viac ako 1 vozidlo, to na prvom slote predám, takže bude len na druhom, ale potom ked napíšem /garaz tak napíše že príkaz neexistuje aj ked existuje, tak prosím v dialogu urobiť, že ked na tom slote nebude vozidlo, dá tam vozidlo ktoré bude mať (Bude mať vozidlo na slote 2, tak ho dá na slot 1) tak ako na SuperPařbe.. Ďakujem za pomoc :)

CMD:garaz(playerid, params[])
{
new string1[700],string2[100];
for(new i;i<MAX_PLAYER_CARS;i++)
{
if(ID[playerid][i]==-1){
format(string2,100,"- Prázdny slot -\n");
}else{
format(string2,100,"%s(%i)\n",aVehicleNames[GetVehicleModel(ID[playerid][i])-400], ID[playerid][i]);
}
format(string1,256,"%s%s",string1,string2);
}
ShowPlayerDialog(playerid,DIALOG_MENU,DIALOG_STYLE_LIST,"Garáž",string1,"Vybrať","Zrušiť");
return 1;
}
Edited by Carlosoo
Link to comment
Share on other sites

22 odpovědí na tuto otázku

Recommended Posts

  • 0
  • Globální moderátor

Vůbec jsem nepochopil, co vlastně potřebuješ. Zkus to nějak lépe přepsat do vět a ne to takhle vecpat do jednoho hnusného souvětí.

Link to comment
Share on other sites

  • 0

Vis proc ti tu zatim nikdo nepomohl? protoze vubec neni k pochopeni to, co tu pises, rad bych ti pomohl, tak to uprav prosimte :d

Edited by xDave
Link to comment
Share on other sites

  • 0

No.. Tak to teda lepšie vysvetlím.. Ja chcem to aby tam nebolo '- Prázdny slot -' ale aby to zoradilo.. Pokial na tom slote nebude vozidlo tak tam dá vozidlo ktoré bude mať.. Že mám vozidlá na 1 a 2 slote a vozidlo na slote 1 predám tak aby tam dalo vozidlo na slote 2 a nie aby tam bolo '- Volný slot -'.. Už chápete ?? :d Lebo ked nie tam už asi idem robiť screeny :d Neviem to lepšie vysvetliť... :)

Link to comment
Share on other sites

  • 0

No.. tak toto neviem jak urobiť, prosím uprav tento kód :)

 

 

stock DeletePlayerVehicle(playerid,slot){
if(ID[playerid][slot] == -1) return 0;
new str[100];
format(str,100,"Cars/%s.%d.cfg",PlayerName(playerid),slot);
if(fexist(str))
fremove(str);
DestroyVehicle(ID[playerid][slot]);
ID[playerid][slot] = -1;
return true;
}
Link to comment
Share on other sites

  • 0
  • Globální moderátor

Poměrně jednoduše, 

new i = slot;
for(new j = i+1; j < sizeof(ID[]); j ++)
 PROHOD i,j prvky, inkrementuj i, odstran j-prvek

a voila, není to nic těžkého, měl bys s tím co jsem ti teď poskytnul schopen to sám napsat.

Link to comment
Share on other sites

  • 0

To má isť do /garaz alebo stocku odstránenia vozidla ??


 PROHOD i,j prvky, inkrementuj i, odstran j-prvek

Keď mi niekto takto napíše čo mám urobiť, tak sa zasmejem, pretože to za žiadnu cenu neviem pochopiť :d 'PRIHOD i' ale kam ?? 'j prvky' WTF. 'inkrementuj i' Inkrementuj ?? To je čo :d 'Odstran j-prvek' s kadial ?? :d Sry ale tak takéto postupy pochopiť neviem no :d

Edited by Carlosoo
Link to comment
Share on other sites

  • 0
  • Globální moderátor

Tomu se říká pseudokód :) a pokud nevíš co s těma indexama dělat, tak je mi tě líto a poslal bych tě naučit si základy. 

 

zkus se nad tím víc zamyslet... Zkusím ti dát lepší příklad:

 

1 2 3 4 5

 

Odstraňuješ 2. prvek (resp. nastavuješ -1)

 

1 -1 3 4 5

 

Tak ty chceš aby to "probublalo" takto:

 

1 3 -1 4 5

1 3 4 -1 5

1 3 4 5 -1

 

 

EDIT: ode mě neočekávej přepsaný kód... chci vás naučit algoritmizovat a logicky přemýšlet při programování, a ne vám psát kódy

Edited by HighPrint
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

  • 0

Aj tak som nepochopil  :haha: Pošli radšej hotove to kam to malo ísť pretože ja neviem kam, a čo si to teraz písal :d


CMD:garaz(playerid, params[]){
new string1[700],string2[100], new i = slot;
for(new j = i+1; j < sizeof(ID[playerid][i]); j ++){
 
format(string1,100,"%s\n",aVehicleNames[GetVehicleModel(ID[playerid][j])-400]);
}
ShowPlayerDialog(playerid,DIALOG_MENU,DIALOG_STYLE_LIST,"Garáž",string1,"Vybrať","Zrušiť");
return 1;
}
 
Tak ?? :d
Link to comment
Share on other sites

  • 0
  • Globální moderátor
EDIT: ode mě neočekávej přepsaný kód... chci vás naučit algoritmizovat a logicky přemýšlet při programování, a ne vám psát kódy

 

nicméně

 

 

Tělo cyklu jsem napsal standardním způsobem a ty jedinou správnou věc neopíšeš ani správně... 

 

 

Víc ti už neřeknu, protože ty si marnej...

 

 

Edited by HighPrint
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Tak ako niesom nejako dobrý, a ty mi tu hned napíšeš toto, zložitý postup, nepovieš kam to má ísť.. Aspoň kebyže napíšeš "Toto daj tam, odstraň hento, daj tak toto, uprav toto" a nie to čo si ty napísal..

Link to comment
Share on other sites

  • 0

To má isť do /garaz alebo stocku odstránenia vozidla ??

 

Keď mi niekto takto napíše čo mám urobiť, tak sa zasmejem, pretože to za žiadnu cenu neviem pochopiť :d 'PRIHOD i' ale kam ?? 'j prvky' WTF. 'inkrementuj i' Inkrementuj ?? To je čo :d 'Odstran j-prvek' s kadial ?? :d Sry ale tak takéto postupy pochopiť neviem no :d

 

Aj tak som nepochopil  :haha: Pošli radšej hotove to kam to malo ísť pretože ja neviem kam, a čo si to teraz písal :d

 

Tak ako niesom nejako dobrý, a ty mi tu hned napíšeš toto, zložitý postup, nepovieš kam to má ísť.. Aspoň kebyže napíšeš "Toto daj tam, odstraň hento, daj tak toto, uprav toto" a nie to čo si ty napísal..

Buď rád, že ti to píše alespoň v češtině. Ono je taky potíž tvoje lenost a tupost... Když se podíváš, o co jde? Cyklus. Napíše do google cyklus. Vyjede ti wiki. Ihned jako první kód máš ukázku cyklu a... NO PROBOHA TO MI PO*** ZÁDA, ono tam je i tvoje "složité" slovíčko, vysvětlené! Neuvěřitelná magie, že ano?

 

Kdyby jsi mi náhodou nevěřil -> https://cs.wikipedia.org/wiki/Cyklus_for

Link to comment
Share on other sites

  • 0

Ale tie tvoje Off-Topické odpovede.. Už ked som videl na 'Timeban' poslednú odpoveď 'SkiBig' tak už som čakal že čo zas napíšeš.. Mne nerobí problém cyklus, ale ten postup.. Mod mám na 3768 riadkov tak ako jak som mal vedieť kam to dať ??

Link to comment
Share on other sites

  • 0

Pokud nerozumíš tomu, co poradil HighPrint, tak je tu spousta dalších možností, jak udělat to stejné.

 

Například

for(new j = slot; j < sizeof(ID[]) - 1; j++)
    PŘIŘAĎ j-tému PRVKU (j + 1)-tý PRVEK
ODSTRAŇ (sizeof ID[] - 1)-tý prvek
Edited by Lukasz
Link to comment
Share on other sites

  • 0
  • Globální moderátor

Dobře, budu předpokládat, že máš IQ houpacího koně a popíšu ti to co nejvíc jednoduše, máme dva způsoby jak to lze zrealizovat:

1) Posuneme všechny indexy o 1

2) Vyměníme chybějící místo s posledním (mnohem efektivnější)

 

 

1) Způsob (neefektivní)

 

Ty máš funkci pro odstranění vozidel, kterou nazýváš (nazval QWER) DeletePlayerVehicle. Pro ulehčení ještě předpokládejme, že max. počet aut, které může hráč vlastnit jsou 4. Dále budem předpokládat, že hráč vlastní všech 4 vozidel. Hráč má teda vozidla č. 1, 2, 3, 4. 

 

Při odstranění libovolného vozidla se danému indexu (čti slotu), nastavuje -1. 

 

Dosud snad chápeme..., předešlá věta pouze vystihuje kód k mazání (DeletePlayerVehicle). Čeho ty chceš dosáhnout je přehodit vozidla, aby zaplnily prázdná místa mezi nima. Pro ulehčení si to pojďme ukázat na reálném příkladu: označme si indexy vozidel jako i, j k, l.

 

1) Pole vozidel daného hráče bude vypadat takto:

 

Fnba.png

 

2) Mažeš hráči vozidlo č. 2, posíláš do funkce DeletePlayerVehicle(playerid,slot), kde playerid je ID daného hráče a slot v tomto případě bude j.

 

3Qhe.png

 

Tady momentálně končí tvůj kód a proto se ti při vypisování v dialogu vypíše:

 

Vozidlo č. 1

- Prázdný slot -

Vozidlo č. 3

Vozidlo č. 4

 

Naším cílem je dostat

 

Vozidlo č. 1

Vozidlo č. 3

Vozidlo č. 4

- Prázdný slot -

 

Proto si posuneme všechny prvky o jeden index níž. Naším cílem je teda prohodit prvky tak aby prázdný byl co nejvíc na pravé straně

 

g1s2.png

26tt.png

 

Ca3J.png

uQKB.png

Takže když popíšeme tento "mechanismus", provedli jsme následující:

if(j == -1)
{
      if(k != -1)
      {
          j = k;
          k = -1;
      }
}
if(k == -1)
{
      if(l != -1)
      {
          k = l;
          l = -1;
      }
}

My chceme ale tento "mechanismus" algoritmizovat. A jak to provést? No přeci cyklem. Tím, že si předáváme index slotu, které mažeme, máme vlastně to naše j a stačí jen probublat tu horní část (chápejme jako posunovat k prázdnému prvku vyšší prvky do konce pole).

 

 

zde je pseudokód k příkladu:

pro j = slot, které mažeme, i = jeden prvek dál od slotu.
Dokud i není na konci pole
        prohodíme prvek j a i
        posuneme index j dále
        nastavíme prvku i -1
        zvětšíme i o 1

opakuji, je to jen pseudokód se základními operacemi, (=, ++), proto se základní znalostí bys měl být schopen to udělat. Pokud ne, chybí ti znalosti a doporučuji si přečíst tutoriály!

 

 

2) Způsob

 

Efektivnější způsob je, že prohodíš chybějící prvek s posledním prvkem. Asymptoticky se ti zrychlí kód o mnohem víc. V případě, že jsi pochopil mechanismus prvního způsobu, druhý způsob pochopíš ihned, protože je dokonce i jednodušší. 

 

Vlastně když vezmeme předchozí příklad a přeskočíme ostatní kroky, tak ve výsledku při dialogu budeš mít:

 

Vozidlo č. 1

Vozidlo č. 4

Vozidlo č. 3

- Prázdný slot -

 

// EDIT: na druhý způsob aby bylo asymptoticky lepší doplatíme navíc proměnnou, která bude označovat počet vozidel, které vlastní hráč.

Edited by HighPrint
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

  • 0

No... Tak zatial som to pochopil, len sry za túto otázku :d Kam to mám dať ?? :haha: Do Stocku vymazavania vozidla alebo /garaz ?? Len napíš kam a už sa posnažím aj sám :d


Tak nakoniec to nefunguje vôbec... Prosím uprav mi to.. Lebo ja nechápem prečo to nechce ísť..

 

 

stock DeletePlayerVehicle(playerid,slot){
if(ID[playerid][slot] == -1) return 0;
new i = slot;
for(new j = i+1; j < sizeof(ID[]); j ++)
{
if(ID[playerid][i] == -1)
{
if(ID[playerid][j] != -1)
{
ID[playerid][i] = ID[playerid][j];
ID[playerid][j] = -1;
}
}
}
new str[100];
format(str,100,"SAF/Cars/%s.%d.cfg",PlayerName(playerid),slot);
if(fexist(str))
fremove(str);
DestroyVehicle(ID[playerid][slot]);
ID[playerid][slot] = -1;
return true;
}
Link to comment
Share on other sites

  • 0
  • Globální moderátor

Popiš mi co teď dělá DeletePlayerVehicle, krok za krokem (každý řádek) přesně v pořadí jak to máš teď napsané. 

Link to comment
Share on other sites

  • 0

- Keď ten slot sa rovná -1 neurobí nič

- "nanewuje" i ktoré sa rovná slotu vozidla

- Urobí cyklus i+1 a ked je pod ID[ playerid ][ slot ] tak pridá ku j +1

- Keď sa ID[ playerid ][ i ] rovná -1

- Keď sa ID[ playerid ][ j ] nerovná -1

- Nastaví ID[ playerid ][ i ] ID[ playerid ][ j ]

- Nastaví ID[ playerid ][ j ] na -1

- Ukončí Ked ID[ playerid ][ j ] nieje -1

- Ukončí Keď ID[ playerid ][ i ] je -1

- Ukončí cyklus i+1

- "nanewuje" str čo sa rovná 100

- Naformátuje cestu ku Vozidlám

- Zistí či existuje cesta ku Vozidlám

- Vymaže súbor s vozidlom

- Zničí vozidlo so slotu

- Nastaví danému slotu -1

 

Tak tu máš všetko.. :d

Edited by Carlosoo
Link to comment
Share on other sites

  • 0
  • Globální moderátor

Ten cyklus jsi blbě popsal a divím se že do téhle chvíle ti ještě nedocvaklo proč to máš špatně...

 

Zkusím ti přidat realnej příklad:

 

Sedíš v autě, zamkneš auto a vyjdeš...

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