Problem mit Patrullienfunktion
» Siedler Map Source Forum » Siedler DEdK Script Forum » Problem mit Patrullienfunktion
Seiten: 1
Wladimir
|
#1 06.02.2010 16:11 Beiträge: 489 |
Problem mit Patrullienfunktion
Um die Patrullien einiger Truppen genauer kontrollieren zu können, habe ich eine (leider noch fehlerhafte) Comfortfunktion erstellt.
Auf eine Testmap habe ich eine Bank namens "burg", ein Scriptentity davor namens "burgsp" und eines weiter weg namens "burgp" gesetzt. Dies war auch alles.
Der einzige Aufruf in der FMA ist:
VerteidigungsTruppenPatrullie(1,"burg","burgsp","burgp",3,Entities.PU_LeaderBow2,3)
Bei dieser Funktion muss nur ein Trupp in die Nähe des jeweiligen Zieles, statt alle drei, damit sie sich auf den jeweils anderen Punkt zubewegen.
Weiß jemand, wo der Fehler liegt?
Wladimir.
PS: Das kam weiter unten ins Skript:
function VerteidigungsTruppenPatrullie(_player,_spwanGen,_spwanPos,_patrolPos,_menge,_typ,_soldAnz) player = _player gen = _spwanGen spPos = _spwanPos patrol = _patrolPos meng = _menge Smeng = _soldAnz typ = _typ nr = 0 da = 0 for i = 1,meng do CreateMilitaryGroup(player,typ,Smeng,GetPosition(spPos),"trupp"..i) nr = nr + 1 Attack("trupp"..i,patrol) end gvMission.patrol1 = StartSimpleJob("Patrullie1Beenden") gvMission.alleda1 = StartSimpleJob("AlleDa1") StartSimpleJob("SpawngeneratorKaputt") gvMission.truppsfehlen = StartSimpleJob("TruppsFehlen") end function TruppsFehlen() for i = 1,nr do if IsDead("trupp"..i) then CreateMilitaryGroup(player,typ,Smeng,GetPosition(spPos),"trupp"..i) end end end function Patrullie1Beenden() for i = 1,nr do if IsNear("trupp"..i,patrol,1000) then da = da + 1 Message(da) end end end function AlleDa1() if da == nr then -- falls soviele da, wie existieren, dann: da = 0 EndJob(gvMission.patrol1) for i = 1,nr do Attack("trupp"..i,spPos) end gvMission.patrol2 = StartSimpleJob("Patrullie2Beenden") gvMission.alleda2 = StartSimpleJob("AlleDa2") return true end end function Patrullie2Beenden() for i = 1,nr do if IsNear("trupp"..i,spPos,1000) then da = da + 1 Message(da) end end end function AlleDa2() if da == nr then -- falls soviele da, wie existieren, dann: da = 0 EndJob(gvMission.patrol2) for i = 1,nr do Attack("trupp"..i,patrol) end gvMission.patrol1 = StartSimpleJob("Patrullie1Beenden") gvMission.alleda1 = StartSimpleJob("AlleDa1") return true end end function SpawngeneratorKaputt() if IsDead(gen) then EndJob(gvMission.patrol1) EndJob(gvMission.patrol2) EndJob(gvMission.alleda1) EndJob(gvMission.alleda2) EndJob(gvMission.truppsfehlen) return true end end
____________________
Viele, die leben, verdienen den Tod und viele die tot sind, das Leben. Kannst du es ihnen geben? Dann sei auch nicht so rasch mit einem Todesurteil zur Hand!
Gandalf
aCid
|
#2 06.02.2010 16:46 Beiträge: 275 |
1. Das heisst Patroullie.
2. Die beiden Fkt., eine mal als Bsp.:
function Patrullie1Beenden() for i = 1,nr do if IsNear("trupp"..i,patrol,1000) then da = da + 1 Message(da) end end end
Hier sagst du sobald einer von denen da ist, wird da um 1 erhöht. Das wird nun jede Sekunde kontrolliert. Da du aber da nicht bei jeder Überprüfung auf 0 setzt und neu anfangen lässt zu zählen, reicht einer aus, um innerhalb von "meng" Sekunden den anderen Job zu erfüllen.
Probier mal so:
function Patrullie1Beenden() da = 0 for i = 1,nr do if IsNear("trupp"..i,patrol,1000) then da = da + 1 Message(da) end end end
Um jetzt aber noch auf Nummer sicher zu gehen, solltest du die PatBeenden und AlleDa SimpleJobs noch jeweils zu 1 zusammenführen.
Kann ja sein, dass die andere Abfrage mit da == nr immer dann kommt, wenn im anderen SimpleJob da auf 0 gesetzt wird.
____________________
Das ist und bleibt ein Spiel! - Wir sind hier nicht vor Gericht.
----------------------------------------------------------------------
Mapperhilfen für S5:
http://www.siedler-maps.de/forum/Siedler-DEdK-Script-Forum-27/index.htm
http://www.siedler-maps.de/for...und-andere-Ressourcen-8688.htm
http://www.siedler-maps.de/for...unktionen-Skripte-etc-8706.htm
Wladimir
|
#3 06.02.2010 17:10 Beiträge: 489 |
Auf jeden Fall eines: danke, aCid!
Nun patrullieren die schonmal ordentlich!
Wladimir.
____________________
Viele, die leben, verdienen den Tod und viele die tot sind, das Leben. Kannst du es ihnen geben? Dann sei auch nicht so rasch mit einem Todesurteil zur Hand!
Gandalf
Dieser Beitrag wurde von Wladimir am 06.02.2010 um 17:49 editiert.
Wladimir
|
#4 06.02.2010 17:50 Beiträge: 489 |
Einige Logicfehler behoben!
Auch wurde die Funktion um einen SimpleJob verkleinert --> bessere Performance im Spiel.
Aufruf:
VerteidigungsTruppenPatroullie(2,"burg","burgsp","burgp",3,Entities.PU_LeaderBow2,8,Ende)
Ein Callback muss(!) angegeben werden! Falls unerwünscht einfach so:
function Ende() end
Comfortfunktion:
function VerteidigungsTruppenPatroullie(_player,_spwanGen,_spwanPos,_patrolPos,_menge,_typ,_soldAnz,_callback) -- localisiere globale Variablen player = _player gen = _spwanGen spPos = _spwanPos patrol = _patrolPos Smeng = _soldAnz typ = _typ VTPCallback = _callback nr = 0 da = 0 -- erzeuge Truppen for i = 1,_menge do CreateMilitaryGroup(player,typ,Smeng,GetPosition(spPos),"trupp"..i) nr = nr + 1 Attack("trupp"..i,patrol) end aufMarsch = true -- starte Ueberwachungen gvMission.patrol1 = StartSimpleJob("Patroullie1Beenden") gvMission.alleda1 = StartSimpleJob("AlleDa1") gvMission.truppsfehlen = StartSimpleJob("TruppsFehlen") end function TruppsFehlen() for i = 1,nr do if IsDead("trupp"..i) then CreateMilitaryGroup(player,typ,Smeng,GetPosition(spPos),"trupp"..i) if aufMarsch == true then Attack("trupp"..i,patrol) end elseif IsDead(gen) then VTPCallback() return true end end end function Patroullie1Beenden() if Counter.Tick2("Patroullie1Beenden", 10) then da = 0 for i = 1,nr do if IsNear("trupp"..i,patrol,1000) then da = da + 1 Message(da) elseif IsDead(gen) then return true else for i = 1,nr do Attack("trupp"..i,patrol) end end end end end function AlleDa1() if da == nr then -- falls soviele da, wie existieren, dann: aufMarsch = false da = 0 EndJob(gvMission.patrol1) for i = 1,nr do Attack("trupp"..i,spPos) end gvMission.patrol2 = StartSimpleJob("Patroullie2Beenden") gvMission.alleda2 = StartSimpleJob("AlleDa2") return true elseif IsDead(gen) then return true end end function Patroullie2Beenden() if Counter.Tick2("Patroullie2Beenden", 10) then da = 0 for i = 1,nr do if IsNear("trupp"..i,spPos,1000) then da = da + 1 Message(da) elseif IsDead(gen) then return true else for i = 1,nr do Attack("trupp"..i,spPos) end end end end end function AlleDa2() if da == nr then -- falls soviele da, wie existieren, dann: aufMarsch = true da = 0 EndJob(gvMission.patrol2) for i = 1,nr do Attack("trupp"..i,patrol) end gvMission.patrol1 = StartSimpleJob("Patroullie1Beenden") gvMission.alleda1 = StartSimpleJob("AlleDa1") return true elseif IsDead(gen) then return true end end
EDIT: Nun auch ein Callback möglich gemacht!
____________________
Viele, die leben, verdienen den Tod und viele die tot sind, das Leben. Kannst du es ihnen geben? Dann sei auch nicht so rasch mit einem Todesurteil zur Hand!
Gandalf
Dieser Beitrag wurde von Wladimir am 06.02.2010 um 18:43 editiert.
Seiten: 1