GTA-Center.com » Forum
http://www.gta-center.com/forums/

[GUIDA] Funzioni Roleplay
http://www.gta-center.com/forums/viewtopic.php?f=40&t=704
Pagina 1 di 1

Autore:  OSTAAA [ 28/01/2011, 11:55 ]
Oggetto del messaggio:  [GUIDA] Funzioni Roleplay

E' la mia prima guida perciò perdonatemi se fa schifo :asd:
Sono Funzioni Molto Banali per i RP e non
Qui spiegheremo come aggiungere alcune funzioni per Roleplay.
1. Casco sulla Moto
Cominciamo Definendo in alto la funzione che siamo sulla moto
Codice:
forward IsModelABike(carid);

Così ora fuori da tutto mettiamo la funzione che dice che noi siamo su una moto..perciò sulle auto non può essere usato
Codice:
public IsModelABike(carid)
{
    new modelid = GetVehicleModel(carid);
   if(modelid == 448 || modelid == 461 || modelid == 462 || modelid == 463 || modelid == 468 || modelid == 471 || modelid == 481 || modelid == 509 || modelid == 510 || modelid == 521 || modelid == 522 || modelid == 523 || modelid == 581 || modelid == 586)
   {
      return 1;
   }
   return 0;
}

Così abbiamo aggiiunto l'ID e definendo che sono delle moto,Ora dobbiamo definire la funzione del che ci dice che stiamo usando il casco
In cima
Codice:
new UsingBelt[MAX_PLAYERS];
e anche
Codice:
   new sendername[MAX_PLAYER_NAME];

che ci servirà dopo per il messaggio
Ed ora dobbiamo fare il comando vero e proprio
Codice:
   if (strcmp(cmd, "/helmet", true) == 0)
   {
       if(IsPlayerConnected(playerid))
       {
         if(IsPlayerInAnyVehicle(playerid))
         {
             if(IsModelABike(GetPlayerVehicleID(playerid)))
             {
                if(UsingBelt[playerid] == 0)
                {
                   SendClientMessage(playerid, COLOR_X, "* Ti sei messo il casco in testa");
                   format(string, sizeof(string), "* %s Si è messo il casco", sendername);
                     UsingBelt[playerid] = 1;
               }
               else
               {
                  SendClientMessage(playerid, COLOR_X, "* Hai tolto il tuo casco);
                   format(string, sizeof(string), "* %s Si è tolto il casco", sendername);

                     UsingBelt[playerid] = 0;
               }
            }
            else
            {
            
               return 1;
            }

La funzione UsingBelt[playerid] = 1 spiega se stiamo usando il casco o no con 1 è on con 0 è off mentre IsModelABike spiega se siamo su una moto.
Perciò basterà scrivere /helmet per mettersi o togliere il casco :ghgh:


2. Bustapaga Semplice
Ecco comme creare un sistema di Pay Day semplice che darà ai player una somma di denaro ogni Tot di tempo.
Iniziamo e lo chiameremo Salary e lo definiamo
Codice:
forward Salary();

Ora dobbiamo creare il timer che ci permetterà di dare i soldi ogni tot di tempo perciò creiamo il timer nel OnGameModeInit
Codice:
   SetTimer("Salary",720000,1);

al posto di 720000 possiamo cambiare il tempo che è espresso in millisecondi
Ora tocca alla parte finale,il denaro vero e propria. Fuori da tutto creaiamo la funzione Salary
Codice:
public Salary()
{
  new counter;
    if(IsPlayerConnected(counter))
    SendClientMessageToAll(COLOR_X,"Hai ricevuto la tua Bustapaga ");
    GivePlayerMoney(counter,500);
      }

IsPlayerConncted determina se il giocatore è connesso.

3. Refresh
Refresh è una funzione Banale che ci aiuterà a sbuggarci dagli Int
In alto definiamo solo la funzione
Codice:
   new Float:slx, Float:sly, Float:slz;

che si servirà per sbuggarci se siamo incastrati
Codice:
if(strcmp(cmd, "/refresh", true) == 0)
   {
      if(IsPlayerConnected(playerid))
       {
           SetPlayerVirtualWorld(playerid, 0);
           SetPlayerInterior(playerid,0);
      GetPlayerPos(playerid, slx, sly, slz);
      SetPlayerPos(playerid, slx, sly, slz+2);
           SendClientMessage(playerid,COLOR_X,"Sei stato Re-Freshato,se hai altri problemi contatta una admin!");
           return 1;
      }

La funzione SetPlayerVirtualWorld serve a metterci al "world" 0 che è quello base...per chi non sapesse i virtual world sono funzioni che permettono di creare mondi virtuali ad esempio io sono nel virtual world 1 e un altro player è nello 0 anche se siamo nello stesso punto non ci vedremo.
SetPlayerInterior specifica in quale interior siamo: 0 mondo normale
GetPlayerPos(playerid, slx, sly, slz); e il Set serviranno per alzarci di un pochino in modo se siamo incastrati eccetera.
Lo so è una funzione babbea l'ho appena creata.

4. Blocchi stradali
In quasi tutti gli RP i poliziotti hanno quella funzione di poter spawnare dei posti di blocco per bloccare i veicoli. Ora vi spiego come crearli innanzitutto in cima aggiungiamo la funzione statica Block
Codice:
static Block[MAX_PLAYERS];

Che saranno i nostri posti di blocco,ora nei comandi aggiungiamo
Codice:
   if(strcmp(cmdtext, "/roadblock", true)==0)
{
for(new i = 0; i < MAX_PLAYERS; i++)
      {
      if(IsPlayerConnected(i))
      {
          {
    if(Block[playerid])
    {
         SendClientMessage(playerid, COLOR_X, "Hai già creato un posto di blocco scrivi /removeroadblock per riumovere il blocco.");
         return 1;
    }
    new Float:X1, Float:Y1, Float:Z1, Float:A;
    GetPlayerPos(playerid, X1, Y1, Z1);
    GetPlayerFacingAngle(playerid, A);
    Block[playerid] = CreateObject(981, X1-3, Y1, Z1, 0.0, 0.0, A);
    SendClientMessage(playerid, COLOR_X, "Posto di blocco piazzato.");
    }
    }
    }
    return 1;
}

Block[playerid] = CreateObject(981, X1-3, Y1, Z1, 0.0, 0.0, A); Servirà a creare il posto di blocco davanti a noi
Non possiamo mica lasciare i Blocchi li a marcire quindi creiamo il comando per distruggerli

Codice:
if(strcmp(cmdtext, "/removeroadblock", true)==0)
{
        if(!Block[playerid])
        {
                SendClientMessage(playerid, COLOR_GREY, "Non hai creatyo nessun blocco.");
           return 1;
        }
        DestroyObject(Block[playerid]);
        Block[playerid] = 0;
        SendClientMessage(playerid, COLOR_X, "Posto di blocco rimosso.");
        return 1;
}

Sarà come la funzione precedente ma solo con il DestroyObject che ci distruggerà il nostro povero blocco.

5. Automessaggi
Questa funzione servirà a mandare messaggi varii ogni tot di tempo...si basa sul metodo del Salary perciò non è complicato,Definiamo in alto AutoMSG
Codice:
forward AutoMsg();

Ora dobbiamo creare il timer che farà comparire i messaggi ogni tot di tempo
Nel OnGameModeInit
Codice:
   SetTimer("AutoMsg",170000,1);

170000 Lo possiamo sostituire con un tempo differente in millisecondi
Ora fuori da tutto mettiamo il vero corpo del messaggio
Codice:
public AutoMsg()
{
    new rnd = random(3);
    switch(rnd)
    {
        case 0:
        {
            SendClientMessageToAll(COLOR_X,"SERVER: Se ti Serve qualcosa sicuramente lo troverai su /help!!");
        }
        case 1:
        {
            SendClientMessageToAll(COLOR_X,"SERVER: Visita  ww.gta-center.com/forums");
        }
        case 2:
        {
         SendClientMessageToAll(COLOR_X,"SERVER : We we");
        }
    }
}

new rnd = random(3); Servirà a determinare che sono casuali,potete aggiungere più messaggi basta inserire
Codice:
}
        case NUMERO:
        {
            SendClientMessageToAll(COLOR_X,"SERVER:we we");

Al posto di numero mettiamo il numero di sequenza del messaggio

Finisco qua la guida poi l'aggiornerò! :awesome:

Autore:  .:Phantom:. [ 28/01/2011, 12:01 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Be' che dire, non ti conosco ma hai fatto una bella guida :what:
Complimenti. :sese:

Autore:  Alby Fire [ 28/01/2011, 12:05 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Carina ^^

Autore:  mitosking [ 28/01/2011, 12:41 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Complimenti, come prima guida sei andato bene ;)

Autore:  OSTAAA [ 28/01/2011, 12:42 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Grazie :D

Autore:  Peppe [ 28/01/2011, 13:47 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Nei comandi l'IsPlayerConnected è del tutto inutile, la funzione Salary è totalmente sbagliata e nella funzione IsModelABike il public/forward è totalmente inutile.

Autore:  Angelo [ 28/01/2011, 14:13 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

quoto con peppe, isplayerconnected è inutile, perchè se un player fa il comando è logico che egli sia connesso.
La funzione salary darà i soldi soltanto all'id 0, bisogna usare il for
Invece nel IsModelABike potevi creare una funzione e non usare il forward e il public.

Se vuoi posso sistemare io ;)

Autore:  Peppinux AKA Peppe_Stasu [ 28/01/2011, 15:08 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

:asd: Beh come ti hanno già detto gli altri si poteva fare molto meglio:

1.Inutile dichiarare la funzione IsModelABike usando il forward + public dato che non deve essere usata in un Timer/TimerEx.

2.Inutile dichiarare sendername in cima se poi viene usato solo in un comando.

3.Inutile controllare se il player è connesso (IsPlayerConnected) in ogni comando dato che, se il player ha digitato il comando, è ovvio che è connesso.

4.Nel comando /helmet hai formattato una stringa senza poi utilizzarla.

4.Il salary è fatto malissimo e non potrà mai funzionare. Se ti compila i soldi li darà solo al playerid 0. Dovresti rifarlo d'accapo.

5.Inutile definire Float:slx, Float:sly e Float:slz in cima alla GM.

6.Non riesco a capire a cosa serve il for nel comando /roadblock.

7.Per memorizzare la posizione del player potevi utilizzare un array con 3 di grandezza al posto di definire in una variabile x, in un'altra y e in un'altra ancora z.

8.Per gli auto-messaggi, almeno secondo me, sarebbe meglio usare questo metodo: http://wiki.sa-mp.com/wiki/Random_Messages

9.Il codice non mi sembra scritto molto "pulito".

Ricorda che questo sono solo critiche COSTRUTTIVE e che spero ti saranno utili per migliorare il codice e il tuo modo di scriptare. Bye ;).

Autore:  OSTAAA [ 28/01/2011, 19:40 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Grazie è la mia prima guida e devo ancora capire come fare :asd:

Autore:  Peppinux AKA Peppe_Stasu [ 28/01/2011, 20:47 ]
Oggetto del messaggio:  Re: [GUIDA] Funzioni Roleplay

Di niente ;).

Pagina 1 di 1 Tutti gli orari sono UTC + 1 ora [ ora legale ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/