bencarter007

Tutorial a teljesen kezdő pawno-soknak!

11 hozzászólás ebben a témában

/*
Köszöntelek a rövid tutorial scriptben!


a "per csillag" nyitja a kommentárt, a "csillag per" pedig zárja, mint azt láthatod itt is
*/
//a kommentárt így is hozzáadhatod, de a "//" után a teljes sor kommentként lesz jelen

/*
ha összehasonlítasz, azt mindig így tedd:
if(változó1 == változó2)            ez egyenlőséget jelez
if(változó1 >= változó2)            változó1 nagyobb vagy egyenlő a változó2-vel
if(változó1 <= változó2)            változó1 kisebb vagy egyenlő a változó1-el
if(változó1 > változó2)             változó1 nagyobb, mint a változó2
if(változó1 < változó2)             változó1 kisebb, mint a változó2

!!!FONTOS!!!
a változók nevébe ne adj meg ékezetes karaktereket!

a változókhoz rendelhetsz értéket:
new integer = 1;
new Float:value = 3.14;
new string[24] = "egy karakterlánc";

integer++; //az integer nevű változóhoz hozzáad egyet
integer--; //az integer nevű változóból kivon egyet
integer -= 2; //az integer értékből kivontunk 2-t, ugyanaz, mint: integer = integer -2;
integer += 2;//az integerhez hozzáadtunk 2-t, ugyanaz, mint: integer = integer +2;
integer *= 2; //az integer-t megszoroztuk kettővel, ugyanaz, mint: integer = integer * 2;
!!!FONTOS!!!
elkerülendő, hogy az érték átadáskor kifaggyon a program, figyelembe kell venni, hogy
a változó typusa megfelelő legyen az adott adat tárolására!
[GYAKORI HIBA]: integer /= 2; //az integer-t osztotuk kettővel,ugyanaz, mint: integer = integer /2;

az integer egész változó típusú, így nem tudja tárolni az adatokat.
Miért?
Fel van készítve arra, hogy az osztás nem egész számot ad vissza, pl.: 1/2 = 0.5
Ezt már nem tudja menteni egyszerű egész számra lefoglalt memóriaterületre a program

a lefoglalható memóriaterületekre most nem térek ki, aki kiváncsi rá, az olvasson utána
(Elnézést kérek érte)



include-ok

az include-ok amolyan beépülők, a pawno/includes mappájából olvassa be őket a konverter.
#include <a_samp> //ez egy olyan alap, amelyre minden módban szükség van
#include <zcmd> //ez egy parancsfeldolgozó, ezzel (szerintem/számomra) legegyszerűbb a parancsok feldolgozása, lentebb ki lesz fejtve
#include <sscanf2> //ez egy függvény, amely a zcmd-t segíti, feldarabolja a paramétereket, és segít feldolgozni azokat, további infó lentebb

néhány include megköveteli a plugin-okat, ezeket a plugins mappában találjuk és oda is kell őket beilleszteni.
az include-ok helyes felhasználásáról érdemes többet olvasni, a leírás végén linkelek pár leírást.
*/

//a script működése érdekében kivettem a kódot a megjegyzésekből, és a feldolgozandó részbe is kimásoltam
#include <a_samp>
#include <zcmd>
#include <sscanf2>


//definíciók
//definiálhatsz egy szavat, amihez hozzáadsz egy értéket, így például a zöld színt
#define COLOR_GREEN 0x33AA33AA
//#define kulcsszó érték

stock pName( playerid )
{
new name[ MAX_PLAYER_NAME ];
GetPlayerName( playerid, name, sizeof name );
return name;
}

main()//ezt a részt innen ne töröld ki, különben nem fut fel a szerver
{
/*a "print" a konzolba ír szöveget
pl.: print("hello world");

ha egy változót szeretnénk a szövegbe beilleszteni, nem kell sztringeket
létrehozni sé formázni őket, mint egyébként a SendClientMessage-nél kéne.
a változó beillesztős konzolos kiírás így néz ki:

new integer = 4;
printf("az integer értéke %d",integer);
*/
print("\n----------------------------------");
print(" A játékmód felfutott");
print("----------------------------------\n");
}
public OnGameModeInit()//amikor felfut a mód
{
SetGameModeText("teszt mód");//ez írja a szerver kliensben a GAMEMODE alá
//az AddPlayerClass-okból legalább egyet haggy bent, különben bugolni fog a szerver
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}

public OnGameModeExit()//amikor a szerver leáll
{
return 1;
}

public OnPlayerRequestClass(playerid, classid)//amikor a játékos spawn előtt választ
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerConnect(playerid)//amikor a játékos csatlakozik
{
new string[180];//létrehoztál egy új sztringet
format(string,sizeof(string),"%s csatlakozott a szerverhez!",pName(playerid));
SendClientMessageToAll(-1,string);
return 1;
}

public OnPlayerDisconnect(playerid, reason)//amikor egy játékos lecsatlakozik
{
    new string[180];//létrehoztál egy új sztringet, a []-ben szereplő érték a biteket foglalja le a memóriában
    //minél több karaktert szeretnél beletenni, annál több itet kell lefoglalni
format(string,sizeof(string),"%s lecsatlakozott a szerverről!",pName(playerid));
//a string változóba eltároltuk a szöveget. a " %s " a játékos nevét fogja behelyetesíteni.
//minden változó fajta behelyettesítéséhez más karaktert használunk.
//%s a sztring, %f a lebegőpontos, %d az egész változó
SendClientMessageToAll(-1,string);
switch(reason)//a switch a sok változós összehasonlításnál jó
//switch-be beírod a változót, a "case" után pedig hogy mit tartalmazzon.
{
	case 0: SendClientMessageToAll(-1,"Oka: időtúllépés"); //ha a változó egyet tartalmaz, akkor ezt írja
	case 1: SendClientMessageToAll(-1,"Oka: kilépett (/q)"); //ha a változó kettőt tartalmaz, akkor ezt írja
	case 2: SendClientMessageToAll(-1,"Oka: kick/ban"); //ha a változó hármat tartalmaz, akkor ezt írja
}
 /*
ez az összehasonlítás így is kinézhetett volna:
if (reason == 0) SendClientMessageToAll(-1,"Oka: időtúllépés");
else if (reason == 1) SendClientMessageToAll(-1,"Oka: kilépett (/q)");
else if (reason == 2) SendClientMessageToAll(-1,"Oka: kick/ban");
 */
return 1;
}

public OnPlayerSpawn(playerid)//mikor a játékos spawnol
{
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)//miko a játékos meghal
{
return 1;
}

public OnPlayerText(playerid, text[])//amikor a játékos beír valamilyen szöveget, a parancsok nem tartoznak ide
{
return 1;
}

public OnPlayerUpdate(playerid)//amikor a játékos és a szerver között van kapcsolat, tehát ezred másodpercenként
{
return 1;
}
CMD:car(playerid,params[])//amikor a játékos beírja ezt a parancsot
{
//itt létrehozol változókat
new car; //ez egy egyszerű változó, mely egy integer-t, tehát egy egész számot ment a memóriába.
new Float:x,Float:y,Float:z,Float:Angle;// a "Float:" lebegőpontos (pl 3.14) értéket ment
GetPlayerPos(playerid,x,y,z);//lekéri a játékos koordinátáit. a koordináták mindig lebegőpontosak
GetPlayerFacingAngle(playerid,Angle); //lekéri a játékos nézőszögét, ez szintén lebegőpontos
car = CreateVehicle(558,x,y,z,Angle,0,0,-1);//a "car" nevű változóra rátesszük a járművet, amit létrehozunk.
// CreateVehicle(jármű modell, x tengely, y tengely, z tengely, forgási tengely, szín 1, szín 2, respawn idő);
PutPlayerInVehicle(playerid,car,0);//beleteszi a járműbe a játékost, PutPlayerInVehicle(játékosid, jármű id, ülés száma)
//az ülések: 0-sofőr,1 - anyós, 2&3 - hátsó ülések,4 és több ritkán használt
SendClientMessage(playerid,-1,"Lekértél egy autót!");
//küldesz egy üzenetet a játékosnak, SendClientMessage(játékos id, szín id, "Üzenet");
return 1; //visszaadjuk a szervernek, hogy parancsot írt be a játékos
}
CMD:createcar(playerid, params[])
{
	new string[128],carmodel,Float:x,Float:y,Float:z,Float:angle;//létrehozzuk a változókat
if(sscanf(params, "d", carmodel)) return SendClientMessage(playerid, -1, "[TIPP]: /createcar <modell>");
//az SSCANF feldolgozza a paramétereket, kiolvassa a paraméterek közül a megadott modellt, pl.: /createcar 558
//itt az 558-as értéket menti át a "carmodel" változóba.
GetPlayerPos(playerid,x,y,z);//lekérjük a koordinátákat, az előző parancsnál magyarázva
GetPlayerFacingAngle(playerid,angle);//lekérjük a játékos nézőszögét, előző parancsnál magyarázva
new car = CreateVehicle(carmodel,x,y,z,angle,0,0,-1);//létrehozzuk a járművet, előző parancsnál magyarázva
PutPlayerInVehicle(playerid,car,0);//beleültetjük a játékost a járműbe, előző parancsnál magyarázva
format(string,sizeof(string),"Letettél egy %d modellű járművet! [iD:%d]",carmodel,car);
/*a sztringbe beillesztjük a szövegünket, melyben az első %d az általunk megadott jármű modellje lesz,
a második pedig a jármű ID-je, melyet az imént létrehoztunk*/
SendClientMessage(playerid,COLOR_GREEN,string);//elküldjük a játékosnak az üzenetet
return 1;
}

/*amennyiben a leírások valamelyike nem volt érthető, vagy nem merítettem ki a témát eléggé,
(mert nem írtam le mindent, ez az igazság) mellékelek egy link listát!
külön köszönet a www.sampforum.hu adminjainak és felhasználóinak!

zcmd leírása: http://sampforum.hu/index.php?topic=10780.0
sscanf leírása: http://sampforum.hu/index.php?topic=4400.0


!!!Figyelem!!!
Előfordulhatnak banális elírási, illetve fogalmazási és megnevezési hibák.
Amennyiben észrevételek vannak, kérem őket kommentbe, privát üzenetbe, vagy a
[email protected] címre.

Megértéseteket köszönöm!
*/

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

nem tudtam eldönteni, mert egyszerre egy működő gamemode és leírás

Jah oké a neve miatt gondoltam

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Ha ezt játékmódként töltötted fel akkor készíts hozzá egy leírást, ha viszont tutorialnak szánod, szólj és áthelyezzük.

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

én több dologgal/megfogalmazással nem értek egyet, ez később problémát jelenthet a kezdőknek, ha rosszul tanulják meg...

szerintem nézz utána a dolgoknak és javítsd/pontosítsd a leírást és külön CODE tag-ek közé rakd a kódot és elé/utána a magyarázatot, vagy ha fontos akkor ott commentbe :)

http://wiki.sa-mp.com/wiki/Terminology

http://wiki.sa-mp.com/wiki/Scripting_Basics

http://wiki.sa-mp.com/wiki/Control_Structures

ezek segíthetnek :)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Az utolsó pár sorban megjegyeztem, hogy nem vagyok pontos,

Elnézést is kérek érte,  de ezzel a tutoriallal már egy nagyon egyszerű szervert már össze lehet hozni. Kedvet szerettem volna csinálni a nagyon kezdőknek, és kicsit ösztönötni az RP editereket, hogy írjanak saját módot.

Még az egyszer biztos Elnézést kérek a hiányosságokért!

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Ne haragudj meg, hogy ezt mondom, de szerintem nem egy kezdőnek kellene megtanítania a kezdőknek mit, hogyan. Alapból ott elrontottad, hogy maga a programozási nyelv az PAWN, és nem pawnO. Másodszor még nem futottam át teljesen a "tanításodat", de ha egy valós számot osztasz el egy másik számmal (legyen pl 3/2), annak az értéke igenis eltud tárolódni a memóriába, annyi különbséggel, hogy a végét "lecsapja", és csak az egész számot veszi eredményül (3/2 esetében a változó értéke 1 lesz). Maga az sscanf nem csak a ZCMD-t segíti, hanem minden olyan helyzetben alkalmazható, ahol darabolás szükségeltetik. Maga az includek nem "beépülők", hanem függvénykönyvtárak. A #define az makró szimbólum, és nem szó definíció. Aztán még ott vannak a 180 karakter hosszúságú stringek OnPlayerConnectnél, ami pazarlás, hiszen a játékos neve maximum 24 karakteres lehet, plusz ha hozzácsapjuk a csatlakozós szöveget olyan 51 körül jön ki. OnPlayerUpdate akkor hívódik meg, amikor a kliens, és a szerver kommunikál, és nem ezred másodpercenként, persze függ attól, hogy éppen áll-e a játékos, ez esetben másodpercenként 1x hívódik meg, mert nincs mit szinkronizálni, viszont ha mozog, akkor durván 20x. Plusz egy paraméteres változónál felesleges az sscanf (maximum akkor, ha játékos id-t akarunk visszaadni, szám, vagy név alapján), ilyenkor elég az isnull makró szimbólum, plusz ha számmá akarjuk alakítani, akkor az strval függvény.

Hát nagyjából ennyi.

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon
Vendég
A téma le van zárva, így nem szólhatsz hozzá!