Skocz do zawartości


Podstawy Squirrel

Scripting IV-MP Squirrel

9 odpowiedzi w tym temacie

#1 Fafu

    Programista

  • Użytkownicy
  • 28 postów

Napisano 29 październik 2011 - 11:54

Jak wszyscy wiedzą, w IV-Multiplayer jest zaimplementowany język programowania Squirrel (ang. wiewiórka). Jest to język bardzo podobny do C i w pewnym stopniu podobny do PAWN. Język ten nie ma swojego edytora, można jedynie dodać jego obsługę do innych edytorów - jest to opisane tutaj (ja polecam Notepad++).
Najważniejszą rzeczą, z którą musicie się zaznajomić tą dokumentacja:
[Funkcje serwera] [Eventy serwera]
[Funkcje klienta] [Eventy klienta] (dopiero od wersji 0.1)
[Dokumentacja Squirrel] [Dokumentacja bibliotek]
Jak widać funkcje i eventy są podzielone na client-side i server-side (jak w MTA). To znaczy, że są 2 typy skryptów: te, które wykonują się na serwerze i te, które wykonują się na komputerze gracza. Oczywiście oba skrypty mogą się ze sobą komunikować przez odpowiednie funkcje.
No, ale teraz trochę o programowaniu. Przyjęło się, że pierwszym skryptem jest wyświetlenie tekstu "Hello World". W Squirrel'u jest to bardzo proste:
print("Hello World");
lub
log("Hello World"); // funkcja log() jest dodana w IV-MP, w normalnym Squirrelu jej nie ma
Powyższy kod spowoduje wyświetlenie się w konsoli tekstu "Hello World". Prawda, że łatwe? ;)
Teraz czas na praktyczną wiedzę: komentarze, zmienne, tablice, tabele, stałe, instrukcje warunkowe i operatory, pętle, instrukcja switch, funkcje, kolory, podstawowe funkcje i eventy.

Komentarze
Są dwa typy komentarzy:
/* Komentarz blokowy
zajmujący kilka
lini */

oraz
// komentarz jednoliniowy

Zmienne
Definiuje się je tak:
local zmienna;
z przypisaną wartością:
local zmienna = "test";
Jak widać nie musimy podawać jaki ma być typ zmiennej, może być to zarówno liczba, tekst, liczba zmiennoprzecinkowa czy typ logiczny.
local liczba = 123;
local tekst = "tekst";
local liczba2 = 12.34;
local prawda = true;
Przy zmiennych można używać następujących operatorów:
= przypisanie wartości
+= dodanie wartości
-= odjęcie wartości
/= podzielenie wartości
*= pomnożenie wartości
%= podzielenie wartości modulo

Przykładowo:
local liczba = 1;
liczba += 2;
print(liczba.tostring()); // wyświetli 3
liczba *= 3;
print(liczba.tostring()); // wyświetli 9

Tablice
Tablice definuje się praktycznie tak samo jak zmienne:
local tablica = [];
z przypisaną wartością:
local tablica = [123, "tekst", false];
Wartości mogą mieć dowolny typ danych. Tablice mogą być wielowymiarowe:
local tablica = [
	["pierwszy element", true],
	["drugi element", false]
];
Aby się dostać do jakiegoś elementu musimy wpisać:
print(tablica[1][0]); // wyświetli "drugi element"

Tabele
Tabele są praktycznie takie same jak tablice z tym, że są bardziej "dynamiczne" - oznacza to, że mają nieokreśloną liczbę elementów. Definiuje się je tak:
local tabela = {};
z przypisaną wartością:
local tabela = {[0] = "wartosc 1", [1] = "wartosc 2"};

można też używać nazw zamiast liczb:
local tabela = {pole1 = "wartosc 1", pole2 = "wartosc 2"};

Aby dostać się do jakiegoś elementu musimy wpisać:
print(tabela[1]);
print(tabela.pole2); // w obu przypadkach wyświetli "wartosc 2"

Jeśli korzystamy z tabel, łatwo można dodawać nowe wartości:
local tabela = {};
tabela[0] <- "wartosc 1";
tabela[1] <- "wartosc 2";
tabela.pole <- "wartosc 3";

oraz je usuwać:
delete tabela[0];

Aby sprawdzić ile elementów ma tablica lub tabela, należy użyć kodu:
nazwa_zmiennej.len();

Stałe
Stałe to nic innego jak zmienne, z tym, że raz ustawionej wartości nie da się już zmienić. Przykład:
const stala = 123.456;

Stałe mogą zawierać jedynie liczby całkowite i zmienno przecinkowe oraz tekst.

Instrukcje warunkowe i operatory
Dzięki instrukcji warunkowej możemy sprawdzić, np. czy jakaś zmienna równa się "true". Jej składnia jest następująca:
if(warunek) {
	// warunek spełniony
} else {
	// warunek nie spełniony
}

Przykładowo chcemy sprawdzić czy zmienna "imie" równa się "Rafal":
local imie = "Rafal";
if(imie == "Rafal") {
	print("Witaj, Rafal.");
} else {
	print("Imie jest niepoprawne, podano: "+imie);
}

Przy okazji można zauważyć jak łączyć zmienne i tekst - robimy to znakiem + (plus). Można łączyć kilka zmiennych tekstowych (zmienna1+zmienna2+zmienna3) lub nawet różne ciągi znaków ("Hello"+"World").
W instrukcji warunkowej możemy używać następujących operatorów:
== r&#243;wna się
!= nie r&#243;wna się
! zaprzeczenie
< mniejsze
> większe
<= mniejsze bądź r&#243;wne
=> większe bądź r&#243;wne

Oczywiście warunki możemy łączyć dzięki operatorom || (lub) oraz && (i), np.:
if((warunek && warunek2) || warunek3) {
	// zr&#243;b coś
}

Z czego wynika: albo warunek i warunek2 będą prawdziwe lub warunek3 będzie prawdziwy.
Pętle
Mamy 4 typy pętli:
for
for(local i = 0; i < 10; i++) {
	print(i.tostring());
}

foreach (iteracja po tablicach/tabelach)
foreach(i, val in zmienna) {
	print(val[0]);
}

while
local i = 0;
while(i < 10) {
	print(i.tostring());
	i++;
}

do ... while (różni się od while tym, że zawsze wykona się przynajmniej raz)
local i = 0;
do {
	print(i.tostring());
	i++;
} while(i < 10);

Instrukcja switch
Dzięki instrukcji switch nie musimy używać wiele razy if ... else. Przykładowe użycie:
local imie = "Patryk";
switch(imie) {
	case "Adam":
		print("Witaj, Adam.");
	break;

	case "Patryk":
		print("Witaj, Patryk.");
	break;

	case "Rafal":
		print("Witaj, Rafal.");
	break;

	default:
		print("Twoje imie jest niepoprawne.");
}

Jak widać należy użyć wyrażenia case wartosc oraz zatrzymać wykonywanie się dalszego kodu używając break; Aby ustawić co ma się robić gdy wartość jest inna używamy default:

Funkcje
Definiuje się je w następujący sposób:
function nazwa_funkcji(para, metry) {
	// treść funkcji
}

Parametrami funkcji może być cokolwiek. Aby funkcja zwracała jakąś wartość musimy użyć return. Przykład funkcji:
local wynik = dodaj(3, 4);
print(wynik.tostring()); // wyswietli 7

function dodaj(a, B) {
	return a + b;
}

Kolory
Kolory definiuje się wg. następującego schematu:
0xRRGGBBAA
RR - czerwony
GG - zielony
BB - niebieski
AA - poziom alpha

Czyli poprostu kolor w formacie hex (szesnastkowym) wraz z poziomem alpha. Kolory można brać z dowolnych generatorów, ja używam tego. Możecie użyć tych podstawowych kolorów:
const cBlack = 0x000000AA;
const cSilver = 0xC0C0C0AA;
const cGray = 0x808080AA;
const cGrey = 0x808080AA;
const cWhite = 0xFFFFFFAA;
const cMaroon = 0x800000AA;
const cRed = 0xFF0000AA;
const cPurple = 0x800080AA;	
const cFuchsia = 0xFF00FFAA;
const cGreen = 0x008000AA;
const cLime = 0x00FF00AA;
const cOlive = 0x808000AA;
const cYellow = 0xFFFF00AA;
const cNavy = 0x000080AA;
const cBlue = 0x0000FFAA;
const cTeal = 0x008080AA;
const cAqua = 0x00FFFFAA;
const cLightblue = 0x33CCFFAA;
const cOrange = 0xFF9900AA;

Podstawowe funkcje i eventy
Zaczniemy od eventów. Definiuje się je przy pomocy funkcji addEvent(); Eventy można przypisać do dowolnie nazywającej się funkcji. Przykładowo:
function onScriptInit( ) {
	log("Moj pierwszy skrypt zostal zaladowany.");
	return 1;
}
addEvent("scriptInit", onScriptInit);

Link do wszystkich eventów macie u góry, ale tutaj opisze te najważniejsze:

Cytat

scriptInit() - załadowanie skryptu
scriptExit() - wyjście skryptu
playerConnect(playerid) - dołączenie gracza do serwera
playerDisconnect(playerid, reason) - odłączenie gracza od serwera
playerText(playerid, text) - napisanie czegoś na czacie
playerCommand(playerid, command) - napisanie komendy przez gracza
playerSpawn(playerid) - zespawnowanie się gracza
playerDeath(playerid, killerid, killervehicle) - śmierć gracza
playerEnterVehicle(playerid, vehicleid, seatid) - wejście do pojazdu

Tak samo z podstawowymi funkcjami, opisze te najważniejsze (parametry w nawiasach kwadratowych są opcjonalne):

Cytat

string getPlayerName ( int playerid )
- pobierz nick gracza
bool setPlayerHealth ( int playerid, int health )
- ustaw ilość życia
float getPlayerHealth ( int playerid )
- pobierz ilość życia
bool setPlayerCoordinates ( int playerid, float x, float y, float z )
- ustaw pozycje gracza
pos = getPlayerCoordinates ( int playerid )
- pobierz pozycję gracza
bool sendMessageToAll(string message [, int color = 0xFFFFFFFF, bool allowTextFormatting = false])
- wyślij wiadomość do wszystkich
bool sendPlayerMessage(int playerid, string message [, int color = 0xFFFFFFFF, bool allowTextFormatting = false])
- wyślij wiadomość do gracza
int createVehicle ( int vehModelID, float x, float y, float z, float rx, float ry, float rz, [ int color1 = 0 , int color2 = 0 , int color3 = 0 , int color4 = 0 ] )
- zespawnuj samochód
int createObject ( int modelHash, float posX, float posY, float posZ, float rotX, float rotY, float rotZ )
- stwórz obiekt
int createCheckpoint ( int type, float posX, float posY, float posZ, float targetPosX, float targetPosY, float targetPosZ, float radius )
- stwórz checkpoint
bool addEvent(string event, function);
- dodaj funkcje do eventu
bool callEvent(string event, ...);
- wywołaj event
bool triggerClientEvent(int playerid, string event, ...);
- wywołaj event w skrypcie client-side (tylko w skryptach server-side)
bool triggerServerEvent(string event, ...);
- wywołaj event w skrypcie server-side (tylko w skryptach client-side)
bool displayPlayerText ( int playerid, float x, float y, string text, int time)
- pokaż tekst na ekranie dla użytkownika
bool displayTextForAll ( float x, float y, string text, int time )
- pokaż tekst na ekranie dla wszystkich
bool displayPlayerInfoText ( int playerid, string text, int time)
- pokaż tekst na dole ekranu dla użytkownika
bool displayInfoTextForAll ( string text, int time )
- pokaż tekst na dole ekranu dla wszystkich
int createBlip(int blipID, float x, float y, float z)
- stwórz ikonę na radarze
int createPickup(int model, int type, int value, float x, float y, float z, float rx, float ry, float rz)
- stwórz pickupa

Zapraszam na Rafal.Brzezinski.me

#2 RootKiller

    Huge Clucker

  • Użytkownicy
  • 204 postów

Napisano 01 listopad 2011 - 00:33

Fafu, pozwolę sobie ciebie poprawić. Funkcja log jest funkcją dodaną przez team IV:MP nie jest wbudowana w Squirrel'a. Radzę to dopisać aby nie wprowadzać nowych w Squirrelu w błąd ;).

#3 Fafu

    Programista

  • Użytkownicy
  • 28 postów

Napisano 01 listopad 2011 - 10:17

Wyświetl postUżytkownik RootKiller dnia 01 listopad 2011 - 00:33 napisał

Fafu, pozwolę sobie ciebie poprawić. Funkcja log jest funkcją dodaną przez team IV:MP nie jest wbudowana w Squirrel'a. Radzę to dopisać aby nie wprowadzać nowych w Squirrelu w błąd ;).
A to wiem, że jest dodana. Dzięki za uwagę, dopisze. Tylko że to jest poradnik konkretnie pod IV-MP więc raczej nie trzeba zwracać uwagi na to co zostało dodane.
Zapraszam na Rafal.Brzezinski.me

#4 valve

    Newbie

  • Użytkownicy
  • 9 postów

Napisano 01 listopad 2011 - 14:19

Squirrel... kojarzy mi się z filmami porno. :)

#5 RootKiller

    Huge Clucker

  • Użytkownicy
  • 204 postów

Napisano 01 listopad 2011 - 18:29

Wyświetl postUżytkownik Fafu dnia 01 listopad 2011 - 10:17 napisał

A to wiem, że jest dodana. Dzięki za uwagę, dopisze. Tylko że to jest poradnik konkretnie pod IV-MP więc raczej nie trzeba zwracać uwagi na to co zostało dodane.

Hmm, okey jak uważasz :). Lecz myślę że to jest istotna informacja.

#6 ViruS

    Pilot bombowca.

  • Użytkownicy
  • 74 postów

Napisano 11 grudzień 2011 - 19:49

Dobrze wykonany poradnik! Polecam! Pisany zrozumiałym i łatwym językiem (takie właśnie powinny być poradniki) - może dlatego, że uczę się C++ i dlatego mi tak łatwo przyszło zrozumienie tego języka.

#7 ownede

    Gangsta

  • Użytkownicy
  • 600 postów

Napisano 18 grudzień 2011 - 01:10

Wyświetl postUżytkownik Card dnia 01 listopad 2011 - 14:19 napisał

Squirrel... kojarzy mi się z filmami porno. Dołączona grafika
Oglądasz porno z wiewiórkami? Dziwne...
[18:10:44] |Restorer|: fajny jesteś, mogę Cię dotknąć ?
[18:10:54] Kacper Smółkowski (ownede): jesteś idiotą, możesz się odsunąć?

#8 Majkel

    Huge Clucker

  • Administracja
  • 221 postów

Napisano 18 grudzień 2011 - 13:45

Chodziło mu o squirting.

#9 ownede

    Gangsta

  • Użytkownicy
  • 600 postów

Napisano 18 grudzień 2011 - 13:49

Wyświetl postUżytkownik Majkel dnia 18 grudzień 2011 - 13:45 napisał

Chodziło mu o squirting.
No to w chuj też się z wiewiórkami kojarzy...
[18:10:44] |Restorer|: fajny jesteś, mogę Cię dotknąć ?
[18:10:54] Kacper Smółkowski (ownede): jesteś idiotą, możesz się odsunąć?

#10 Record

    Little Clucker

  • Użytkownicy
  • 23 postów

Napisano 26 grudzień 2011 - 21:52

Przydatne i to bardzo. Polecam :)





Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych