Eigentlich nicht wirklich schwer.
Wobei hier wieder interessant wird, dass die Tore in meinem Verfahren in .map-Datei erstellt werden, also man auch Objekte aus der .map-Datei ansprechen kann.
Ich habe damit eine Schranke am LVPD erstellt, falls irgendwer das ganze testen will. Ist die Schranke, westlich vom LVPD-Gebäude.
meta.xml
Muss ich denke ich nicht weiter erklären.
gate.map
<map>
<object id="lv_pd_barrier_01" model="2920" posX="2238.2000" posY="2450.4000" posZ="10.5500" rotX="270" rotY="0" rotZ="0" interior="0" dimension="0" state="closed" moving="false" />
</map>
Eigentlich alles, was der Map-Editor schon anlegt.
Wichtig sind hierbei
state="closed"
und
moving="false"
Ich übergebe hiermit direkt Element-Daten mit der .map-Datei.
gate.lua
addEventHandler("onElementClicked", getRootElement(),
function(button, bState, cPlayer, cPosX, cPosY, cPosZ)
if(button == "left" and bState == "up") then
local eID = getElementID(source)
if(eID == "lv_pd_barrier_01") then
local state = getElementData(source, "state")
local moving = getElementData(source, "moving")
local pX, pY, pZ = getElementPosition(cPlayer)
local cDist = getDistanceBetweenPoints3D(pX, pY, pZ, cPosX, cPosY, cPosZ)
local mDist = 10
if(cDist <= mDist) then
if(state == "closed" and moving == "false") then
setElementData(source, "moving", "true")
moveObject(gate, 1500, 2238.2000, 2450.4000, 10.5500, 80, 0, 0)
setTimer(function()
setElementData(gate, "state", "open")
setElementData(gate, "moving", "false")
end, 1500, 1)
setTimer(function()
local tState = getElementData(gate, "state")
local tMoving = getElementData(gate, "moving")
if(tState == "open" and tMoving == "false") then
setElementData(gate, "moving", "true")
moveObject(gate, 1500, 2238.2000, 2450.4000, 10.5500, -80, 0, 0)
setTimer(function()
setElementData(gate, "state", "closed")
setElementData(gate, "moving", "false")
end, 1500, 1)
end
end, 6500, 1)
end
if(state == "open" and moving == "false") then
setElementData(gate, "moving", "true")
moveObject(gate, 1500, 2238.2000, 2450.4000, 10.5500, -80, 0, 0)
setTimer(function()
setElementData(gate, "state", "closed")
setElementData(gate, "moving", "false")
end, 1500, 1)
end
else
outputChatBox("Du bist zu weit entfernt!", cPlayer, 255, 0, 0)
end
end
end
end
)
Alles anzeigen
Gut, hier tricksen wir ein wenig mit Timern, moveObject und ElementData um die Animation schön über die Bühne zu bekommen
Nach dem Check, ob der linke Mausbutton wieder losgelassen wurde, lesen wir uns erstmal unsere Element-ID aus und überprüfen, ob dies auch unsere Schranke ist, die dieses Script ansprechen soll.
Danach lesen wir uns noch die ElementData von state und moving aus, berechnen die Entfernung zwischen Schranke und Spieler und setzten noch eine lokale Variable für die maximale Entfernung.
Nun wirds lustig.
Erst checken wir, ob die aktuelle Entfernung kleiner/gleich der maximalen Entfernung ist. Wenn nicht, wird mit outputChatBox() abgebrochen.
Vom Normalfall ausgehend, wird nun noch gecheckt, welchen state (open/closed) unsere Schranke hat und ob sie sich nicht bewegt (moving).
Danach nur noch das Element über eine Zeit bewegen (moveObject()).
Die Timer sind nur dafür da, damit die Element-Daten richtig gesetzt werden.
Vor der Bewegung wird moving auf true gesetzt um ein mehrfaches Ausführen des Scripts zu verhindern.
Da unser Objekt über eine Zeit von 1500ms sich bewegt, soll erst nach 1500ms sowohl moving auf false (unsere Schranke bewegt sich ja nicht mehr) als auch state auf open (unsere Schranke ist ja jetzt offen) gesetzt werden.
Der zweite Timer macht nichts anderes, als 5 Sekunden, nachdem die Schranke oben ist, sie wieder zu schließen.
Umgekehrt dann in der unteren if-Abfrage.
Soviel dazu, falls irgendwer ein besseres System kennt, immer her damit