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

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum