Guten Tag,
da mein Kanal nun die 300 Abonnenten erreicht hat, ist dies ein guter Anlass, endlich meine lang geplanten Anfängertutorials bereitzustellen. Zu diesem Zweck habe ich auch ein Infovideo aufgenommen. Um genau zu sein wird es 10 Videos geben, die in einem Zweitage-Rhythmus veröffentlicht werden. Hier der Plan:
Tutorial 1 - den MTA Server starten, richtig einstellen, Adminrechte geben
Status: fertig
Zum Video
(wenn mir jemand das Einbetten von Youtube-Videos (für ALLE Browser) per PM erklären würde, wäre das sehr nett)
Tutorial 2 - das erste eigene Script (meta.xml, client- und serverseitige Scripts)
Status: fertig
Zum Video
Code:
Tutorial 3 - MTA verstehen und MTA-Funktionen richtig benutzen
Status: fertig
Zum Video
Code:
outputChatBox("Hallo du da")
outputChatBox("Ich bin rot",getRootElement(),255,0,0)
outputChatBox("Ich bin rot",getRootElement(),255,123,0)
Tutorial 4 - eigene Funktionen erstellen, Abfragen verstehen
Status: fertig
Zum Video
Code:
function outputPlayerName(player,cmd,farbe)
local pname = getPlayerName(player)
if not farbe then return false end
if farbe == "rot" then
outputChatBox(pname,getRootElement(),255,0,0)
elseif farbe == "gruen" then
outputChatBox(pname,getRootElement(),0,255,0)
elseif farbe == "blau" then
outputChatBox(pname,getRootElement(),0,0,255)
else
outputChatBox(pname)
end
return true
end
addCommandHandler("pname",outputPlayerName)
Alles anzeigen
Tutorial 5 - Events, Kommunikation von Server und Client
Status: fertig
Zum Video
Code:
--Serverseitig
--Funktion, die beim Einstieg in ein Fahrzeug den Spieler- und Fahrzeugnamen ausgibt
function outputPlayerNameOnEnter(player)--Player ist von mir definiert als der einsteigende Spieler
local pname = getPlayerName(player)
local vname = getVehicleName(source)
outputChatBox(tostring(pname).." ist in eine "..vname.." eingestiegen.")
end
addEventHandler("onVehicleEnter",getRootElement(),outputPlayerNameOnEnter)--hier der EventHandler
function clientEffect(player)--vom Server zum Client triggern
triggerClientEvent(player,"createClientEffect",getRootElement()) -- hier triggern wir
end
addCommandHandler("cce",clientEffect)
addEvent("showBlip",true)-- mein eigenes Event, um vom Client zum Server zu triggern
addEventHandler("showBlip",getRootElement(),function()
if source ~= client then return end
local playerblip = createBlipAttachedTo(client,58)
setTimer(function()
--[[
setTimer ist eine Funktion, die es ermöglicht Code nach der angegebenen Zeit nach dem Funktionsaufruf
auszuführen, also eine Verzögerung ins Script zu bauen
Dies ist übrigens ein Kommentar, der sich über mehrere Zeilen streckt :)
]]
destroyElement(playerblip)
end,2000,1)
end)
--Clientseitig
local lp = getLocalPlayer()
addEvent("createClientEffect",true) -- MTA zeigen, dass es dieses Event gibt
-- EventHandler, der beim Aufruf den Code der anonymen Funktion in seinen Parametern ausführt
addEventHandler("createClientEffect",getRootElement(),function()
local x,y,z = getElementPosition(lp)
createEffect("explosion_large",x,y,z)
outputChatBox("Du stinkst!")
end)
Alles anzeigen
Tutorial 6 - Interaktion mit dem Script
Status: fertig
Zum Video
Code:
--Serverseitig
local meinMarker = createMarker(-706,946,11.5,"cylinder",1,255,0,0,255)
local meinPickup = createPickup(-706,948,12,3,1239,-1)
function onHit (hitElement)
if getElementType(hitElement) == "player" then
randSkin = math.random(0,300)
setPedSkin(hitElement,randSkin)
end
end
addEventHandler("onMarkerHit",meinMarker,onHit)
addEventHandler("onPickupHit",meinPickup,onHit)--beide Events verweisen auf die Funktion onHit, da sie ähnliche Parameter übergeben
--Clientseitig
--m zum anzeigen deiner Maus
bindKey("m","both",function()
showCursor(not isCursorShowing())
end)
--wenn der Client klickt
addEventHandler("onClientClick",getRootElement(),function(btn,state,sx,sy,x,y,z,element)
if not element then return end
if btn == "left" and state == "down" then
outputChatBox(getElementType(element))
end
end)
Alles anzeigen
Tutorial 7 - Tabellen und Schleifen richtig benutzen
Status: fertig
Zum Video
Code:
-- da der Code in diesem Video immer geändert wird, schreibe ich hier andere Beispiele!
--//
--|| generische Tabelle
--\\
meineTabelle = {
["Text1"] = "der erste Text",
["Text2"] = "der zweite Text",
["Text3"] = "der dritte Text",
["Text4"] = "der vierte Text",
}
outputChatBox(#meineTabelle) -- 0, da keine numerische Tabelle
for i, v in ipairs(meineTabelle) do -- nichts, da keine numerische Tabelle
outputChatBox(i.." = "..v)
end
for i, v in pairs(meineTabelle) do
outputChatBox(i.." = "..v) -- es gibt die Texte aus, da wir pairs genommen haben. Die Reihenfolge wird nicht beachtet
end
--//
--|| numerische Tabelle
--\\
meineNumerischeTabelle = {
"der erste Text",
"der zweite Text",
"der dritte Text",
"der vierte Text",
}
outputChatBox(#meineNumerischeTabelle) -- 4, da 4 Indices
for i, v in ipairs(meineNumerischeTabelle) do
outputChatBox(i.." = "..v) -- jeweils der Index und der Text
end
for i, v in pairs(meineNumerischeTabelle) do
outputChatBox(i.." = "..v) -- es gibt die Texte ebenfalls aus, die Reihenfolge wird durch die numerischen Indices auch beachtet!
end
Alles anzeigen
Tutorial 8 - effizient scripten
Status: fertig
Zum Video
Tutorial 9 - Scripts testen, entbuggen
Status: fertig
Zum Video
Code:
--//
--|| Fehlertypen
--|| aktiviere jede Zeile des Codes einzeln, um die Fehler zu sehen!
--\\
--outputChatBox(test)
--Tabelle = {}
--local test = Tabelle["Test"].test3467
--local test2 = Tabelle[fahrzeug].test3467
--local veh = createVehicle(411,0,0,Tabelle,0,0,0)
--local veh = createVehicle(411,0,0) --Vektorfehler
--Der funktionierende Code vom Beispiel mit outputChatBox
local krasseBedingung = true
local marker = createMarker(0,0,4)
addEventHandler("onMarkerHit",resourceRoot,function(hitElement)
if hitElement and getElementType(hitElement) == "player" then
if krasseBedingung then
outputChatBox("Die Bedingungen sind erfüllt!",hitElement)
end
end
end)
Alles anzeigen
Tutorial 10 - Schlusswort, Anregungen, Kritik (aus den Kommentaren)
Status: fertig
Zum Video
Code:
--Clientseitig, NUR zu Testzwecken!
local mPunktX, mPunktY, mPunktZ = -2326, -1630, 484
local Radius = 10
local Hoehe = mPunktZ -1
local Winkel = 0
function circleMoveCamera()
local posX = mPunktX + math.sin(Winkel)*Radius
local posY = mPunktY + math.cos(Winkel)*Radius
Winkel = Winkel + 0.001
setCameraMatrix(posX,posY,Hoehe,mPunktX, mPunktY, mPunktZ)
showPlayerHudComponent("all",false)
end
addEventHandler("onClientRender",getRootElement(),circleMoveCamera)
Alles anzeigen
Scriptcodes werden - sofern etwas in den Videos gescriptet wird - auch hier unter dem jeweiligen Video eingefügt, damit man sich alles nochmal in Ruhe ansehen kann (oder kopieren, wenn man seinen Fehler nicht findet).
einige Worte an die MTA-Community:
Ich mache diese Tutorials um Anfängern zu helfen. Dabei gehe ich nicht immer den effektivsten Weg, damit man mir besser folgen kann. Diese Tutorials sind KEINE LUA-Tutorials! LUA wird zum Teil am Rand erklärt, aber nicht vollständig behandelt. Angemessen formulierte und nachvollziehbare Kritik ist immer erwünscht, aber denkt dran: Ich mach es wenigstens - es gibt hier Scripter, die viel besser sind und LUA bestimmt auch verständlicher erklären können, aber bisher hat noch kein einziger zuammenhängende Videos für Anfänger gemacht (oder ich finde sie nicht). Wenn die Kritik ein bestimmtes Video betrifft, dann schreibt sie bitte als Kommentar darunter (oder mir als PN), damit die Übersichtlichkeit dieses Themas gewährleistet werden kann. Vielen dank fürs Lesen.
MfG MasterM