Szerző Téma: Tutorial a teljesen kezdő pawno-soknak!  (Megtekintve 3783 alkalommal)

Tutorial a teljesen kezdő pawno-soknak!
« Dátum: 2015. március 29. - 23:52:39 »
0 Show voters
/*
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!
*/
« Utoljára szerkesztve: 2015. március 30. - 07:21:24 írta ƒlaﻛh »

Nem elérhető Lofoli

  • 296
    • Profil megtekintése
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #1 Dátum: 2015. március 30. - 00:20:32 »
0 Show voters
Szia!
Szerintem ezt ide kellet volna
http://sampforum.hu/index.php?board=17.0

Tutorial a teljesen kezdő pawno-soknak!
« Válasz #2 Dátum: 2015. március 30. - 00:21:58 »
0 Show voters
nem tudtam eldönteni, mert egyszerre egy működő gamemode és leírás

Nem elérhető Lofoli

  • 296
    • Profil megtekintése
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #3 Dátum: 2015. március 30. - 00:23:58 »
0 Show voters
Idézetet írta: bencarter007 date=1427667718\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"53513\" data-ipsquote-contentclass=\"forums_Topic
nem tudtam eldönteni, mert egyszerre egy működő gamemode és leírás
 
Jah oké a neve miatt gondoltam

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #4 Dátum: 2015. március 30. - 07:12:12 »
0 Show voters
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.

Tutorial a teljesen kezdő pawno-soknak!
« Válasz #5 Dátum: 2015. március 30. - 07:14:54 »
0 Show voters
Helyezd kérlek át! Köszönöm! :)

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #6 Dátum: 2015. március 30. - 11:35:59 »
0 Show voters
é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 :)
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Tutorial a teljesen kezdő pawno-soknak!
« Válasz #7 Dátum: 2015. március 30. - 12:48:53 »
0 Show voters
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!

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #8 Dátum: 2015. március 30. - 15:01:22 »
0 Show voters
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.

Tutorial a teljesen kezdő pawno-soknak!
« Válasz #9 Dátum: 2015. március 30. - 15:05:15 »
0 Show voters
Teljes mértékben igazad van, egy admin pls törölje a témát!

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Tutorial a teljesen kezdő pawno-soknak!
« Válasz #10 Dátum: 2015. március 30. - 15:06:37 »
0 Show voters
[gmod]Zárok inkább.[/gmod]

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal