Jump to content
  • 0

pomoc Nová možnosť


Twixo

Dotaz

Popis problému:


Zdravím,

robil som taký jednoduchá race system, hrač dá prikaz, v ňom určí počet závodnikov (napr. 3) a vybere auto.

Robil som to pomocou kontroli premennej (v kode vypísané). Je to také amatérske a chcem sa vás opýtať, či sa to nedá najeko lepšie a ľahšie napísať, pretože toto je i zĺhavejšie a by som sa niečo nové priučil čo by mi pomohlo do budúcna.

btw. ten systém mi šiel, tak ako som chcel, len sa chcem naučiť lepší systém.


Chyby/varování kompilátoru a při běhu:
--

Kód:

 

CMD:createzavod(playerid, params[])
{
   error správy
    bridgeauto = CreateVehicle(402,-1634.3036,570.2895,39.5560,314.9972,random(255),random(255),1,0);
    zalozenybridge = 1;
    PutPlayerInVehicle(playerid, bridgeauto,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s{007700} založil závod {FF9900}Bridge{007700}",Jmeno(playerid));
    format(str2,sizeof(str2),"Počet zavodníkov je {FF9900}%d/%d{007700}. Zostáva 60sekund na pripojenie",pripojenychzavodnikov,zavodnicibridge);
    format(str3,sizeof(str3),"Pre pripojenie {FF9900}/zavod Bridge");
    SendClientMessageToAll(0x007700FF,str);
    SendClientMessageToAll(0x007700FF,str2);
    SendClientMessageToAll(0x007700FF,str3);
   
    cakanie = SetTimer("OdpocetBridge1",20000,1);
    return 1;
}

/*Všímajte si viac toho postupu:
if(zavodnicibridge == 4)
{
if(pripojenýchzavodnikov == 1 )
*/
//takže sa chcem spýtať, ako to ľahšie zapísať. Lebo napríklad do 10 závodnikov by to bolo až moc.
CMD:zavod(playerid, params[])
{
new str[256];
if(zalozenybridge == 0) return SendClientMessage(playerid, 0xFF0000FF,"[ ! ] {FF9900}Zavod neni založený");
if(zavodnicibridge == 2)
{
    if(pripojenychzavodnikov == 1)
    {
    bridgeauto = CreateVehicle(402,-1631.4750,567.4609,39.5436,314.9977,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    format(str,sizeof(str),"{007700}Hráč{FF9900} %s{007700} sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)\nZávod odštartovaný!",pripojenychzavodnikov,zavodnicibridge);
    KillTimer(cakanie);
    SendClientMessageToAll(0x007700FF,str);
    SetTimer("OdpocetZavodu",3000,0);
    finalodpocet = SetTimer("OdpocetZavodu",3000,1);
    KillTimer(cakanie3);
    KillTimer(cakanie2);
    KillTimer(cakanie);
    BridgeZavodnici[playerid] = 1;
    pripojenychzavodnikov = 0;
    }
}
if(zavodnicibridge == 3)
{
    if(pripojenychzavodnikov == 1)
    {
    bridgeauto = CreateVehicle(402,-1631.4750,567.4609,39.5436,314.9977,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    BridgeZavodnici[playerid] = 1;
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s {007700}sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)",pripojenychzavodnikov,zavodnicibridge);
    SendClientMessageToAll(0x007700FF,str);
    }
    
    if(pripojenychzavodnikov == 2)
    {
    bridgeauto = CreateVehicle(402,-1639.9576,564.6311,39.3077,314.9983,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s{007700} sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)\nZávod odštartovaný!",pripojenychzavodnikov,zavodnicibridge);
    KillTimer(cakanie);
    SendClientMessageToAll(0x007700FF,str);
    BridgeZavodnici[playerid] = 1;
    pripojenychzavodnikov = 0;
    finalodpocet = SetTimer("OdpocetZavodu",1,1);
    KillTimer(cakanie3);
    KillTimer(cakanie2);
    KillTimer(cakanie);
    }
}
if(zavodnicibridge == 4)
{
    if(pripojenychzavodnikov == 1)
    {
    bridgeauto = CreateVehicle(402,-1631.4750,567.4609,39.5436,314.9977,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    BridgeZavodnici[playerid] = 1;
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s {007700}sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)",pripojenychzavodnikov,zavodnicibridge);
    SendClientMessageToAll(0x007700FF,str);
    }
    if(pripojenychzavodnikov == 2)
    {
    bridgeauto = CreateVehicle(402,-1639.9576,564.6311,39.3077,314.9983,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    TogglePlayerControllable(playerid,0);
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    BridgeZavodnici[playerid] = 1;
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s{007700} sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)",pripojenychzavodnikov,zavodnicibridge);
    SendClientMessageToAll(0x007700FF,str);
    }
    
    if(pripojenychzavodnikov == 3)
    {
    bridgeauto = CreateVehicle(402,-1637.1326,561.8021,39.3039,314.9993,random(255),random(255),1,0);
    pripojenychzavodnikov++;
    PutPlayerInVehicle(playerid, bridgeauto, 0);
    TogglePlayerControllable(playerid,0);
    format(str,sizeof(str),"{007700}Hráč {FF9900}%s{007700} sa napojil do zavodu ({FF9900}%d/%d{007700} zavodnikov)\nZávod odštartovaný!",pripojenychzavodnikov,zavodnicibridge);
    KillTimer(cakanie);
    SendClientMessageToAll(0x007700FF,str);
    BridgeZavodnici[playerid] = 1;
    SetTimer("OdpocetZavodu",1,0);
    pripojenychzavodnikov = 0;
    }
}
return 1;
}

 




Dodatečné poznámky:
--

Edited by Twixo
Link to comment
Share on other sites

6 odpovědí na tuto otázku

Recommended Posts

  • 0

Tak kvoli pohodliu hračov by som si naukladal (/save) pozície všetkych možnych štartovnych pozicii aut.

enum BridgeCarsEnum {
  Float:POSX,
  Float:POSY,
  Float:POSZ,
  bool:OCCUPIED 
};

new BridgeCars[20][BridgeCarsEnum]; // tu si nasledne niekde napln tento enum.. Radsej v inom subore, bude to prehladnejsie

/joinbridge
new bool:joined;
for (new i; i < sizeof BridgeCars; i++) {
  if (!BridgeCars[i][OCCUPIED]) { // zaradom prirad hracov do dalsieho volneho auta
    BridgeCars[i][OCCUPIED] = true;
    bridgeauto = CreateVehicle(402, BridgeCars[i][POSX], BridgeCars[i][POSY], BridgeCars[i][POSZ], 1, 1, 1, 0); 
    joined = true;
    ...
    break; // rovno skonci cyklus
  }
}
if (!joined) SendClientMessage(playerid, -1, "Zavod je uz plny, nemohol si sa pripojit.");

/konieczavodu
for (new i; i < sizeof BridgeCars; i++)
  BridgeCars[i][OCCUPIED] = false;

Nasledne by som hračov posadil na trať na volne pozicie.

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

  • 0

Tak kvoli pohodliu hračov by som si naukladal (/save) pozície všetkych možnych štartovnych pozicii aut.

enum BridgeCarsEnum {
  Float:POSX,
  Float:POSY,
  Float:POSZ,
  bool:OCCUPIED 
};

new BridgeCars[20][BridgeCarsEnum]; // tu si nasledne niekde napln tento enum.. Radsej v inom subore, bude to prehladnejsie

/joinbridge
for (new i; i < sizeof BridgeCars; i++) {
  if (!BridgeCars[i][OCCUPIED]) { // zaradom prirad hracov do dalsieho volneho auta
    BridgeCars[i][OCCUPIED] = true;
    bridgeauto = CreateVehicle(402, BridgeCars[i][POSX], BridgeCars[i][POSY], BridgeCars[i][POSZ], 1, 1, 1, 0); 
    ...
  } else return SendClientMessage(playerid, -1, "Zavod uz je plny");
}

/konieczavodu
for (new i; i < sizeof BridgeCars; i++)
  BridgeCars[i][OCCUPIED] = false;

Nasledne by som hračov posadil na trať na volne pozicie.

 

Pěkný a přehledný kód, ale připojování bych nedělal přes cyklus, už jen kvůli tomu, že ti nebude korektně pracovat. (Připojí se první hráč, splní se if a na 0. index nastaví, že je auto obsazeno. Ovšem, jakmile se zavolá příkaz znovu, cyklus pojede zase od nuly, tentokrát se if nesplní a přejde do else sekvence a vrátí SCM, což je nevyhovující, protože více jak jeden člověk se ti nepřipojí...)

 

Ale jde to vyřešit pomocí nějaké proměnné s počtem připojených hráčů. Kdy se po každém připojení navýší hodnota o jednu, takže se bude moci využívat jako index.

new pHracu; //globální proměnná
//joinbridge
  if(pHracu != 20) //pokud není závod maximálně obsazen
  {
      if (!BridgeCars[pHracu][OCCUPIED]) { // nemuselo by to tu být, pokud budeš správně pracovat s proměnnou pHracu, tak by vše mělo fungovat i bez této podmínky
        BridgeCars[pHracu][OCCUPIED] = true;
        bridgeauto = CreateVehicle(402, BridgeCars[pHracu][POSX], BridgeCars[pHracu][POSY], BridgeCars[pHracu][POSZ], 1, 1, 1, 0);
        pHracu++; 
    ...
  }
  else return SendClientMessage(playerid, -1, "Zavod uz je plny");
//konieczavodu
for (new i; i < sizeof BridgeCars; i++)
BridgeCars[i][OCCUPIED] = false;
pHracu = 0;
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Pěkný a přehledný kód, ale připojování bych nedělal přes cyklus, už jen kvůli tomu, že ti nebude korektně pracovat. (Připojí se první hráč, splní se if a na 0. index nastaví, že je auto obsazeno. Ovšem, jakmile se zavolá příkaz znovu, cyklus pojede zase od nuly, tentokrát se if nesplní a přejde do else sekvence a vrátí SCM, což je nevyhovující, protože více jak jeden člověk se ti nepřipojí...)

Ajoo, diky, fixed.

 

Ale jde to vyřešit pomocí nějaké proměnné s počtem připojených hráčů. Kdy se po každém připojení navýší hodnota o jednu, takže se bude moci využívat jako index.

...

Hej, dobre že si napísal aj tento spôsob.

Akurát z toho tvojho nebude môcť hocikto odísť pred štartom (/quitbridge) ak sa rozhodne. Z môjho ešte hej. :)

Aspoň má zakladateľ príspevku lepší výber. ;)

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

  • 0

S enumom som moc nerobil, má sa to robíť, že

enum BridgeCarsEnum {
Float:POSX,
Float:POSY,
Float:POSZ,
bool:OCCUPIED

 

Float:POSXďalšieho auta

y

z

obsadený

atd
}; ?

Edited by Twixo
Link to comment
Share on other sites

  • 0

Bol mi poradený lepší systém, kt. vyzerá prehladno a pekne. Bolo mi tím navrhnuté aby som ukladal auta a potom ich zapisoval, kt. chcem mať na zavode. Tanga mi na ukážku priložil kód, lenže to bol enum s kt. som ešte moc nepracoval a nemám s ním také skusenosti (odkazy na enum netreba viem ako pracuje, len ešte nemám také skusenosti), tím, že tam bolo slovo "cars", tak ma napadlo, že v tom enume bude viac ako jedno auto, takže všetky pozície, aké chcem na tom zavode, tak som sa spýtal, či idem na to dobre. Takže odpoveď na tvoju otázku je: "Ako docielim zapísanie všetkých pozícií".

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