Zerstörer - was mache ich falsch?

» Siedler Map Source Forum » Siedler DEdK Script Forum » Zerstörer - was mache ich falsch?

Seiten: 1

Mordred
#1
23.02.2010 20:10
Beiträge: 939

Zerstörer - was mache ich falsch?

ein erecförmiger Zerstörer, der alle Entities von Player 1 um die Ecke bringt, die gerade in der nähe sind.
Von Player 2 wärs ja leicht - aber warum klappt das nicht?

function FirstMapAction()
 StartSimpleJob("Death")
end
function Death()
Tot = SucheAufDerWelt(1,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 0 then
    Tot = Tot[1]
  if not AreEntitiesInArea(1,Entities.PU_Hero4,GetPosition(Tot),100,1)then
    SetHealth(Tot,0)
    StartSimpleJob("Death")
   end
  return true
 end
end

Mordred
#2
23.02.2010 20:17
Beiträge: 939

okay, auch von Spieler 2 nicht leicht.
die Variable _player wirkt in SucheAufDerWelt nicht...
PS: erec ist von Spieler 1 und Die Comfortfunction ist auch drin

function Death()
Tot = SucheAufDerWelt(2,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 0 then
   Tot = Tot[1]
   SetHealth(Tot,0)
   StartSimpleJob("Death")
  return true
 end
end

Wladimir
#3
23.02.2010 20:35
Beiträge: 489

Mordred,
dein Fehler ist einfach, dass du geschrieben hast:

if table.getn(Tot) > 0 then
   Tot = Tot[1]



Erst setzt du die Variable "Tot" auf irgentwas und dann auf Tot[1], welches eine undefinierte Variable ist, weshalb folgt:
Tot = nil

Es müsste heißen:

Tot[1] = Tot



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

aCid
#4
23.02.2010 21:46
Beiträge: 275

Zitat von Wladimir:
Mordred,
dein Fehler ist einfach, dass du geschrieben hast:

if table.getn(Tot) > 0 then
   Tot = Tot[1]



Erst setzt du die Variable "Tot" auf irgentwas und dann auf Tot[1], welches eine undefinierte Variable ist, weshalb folgt:
Tot = nil

Es müsste heißen:

Tot[1] = Tot



Wladimir.



Falsch!
Tot[1] existiert. Wird ja durch SucheAufDerWelt gefüllt. Und die Abfrage ist auch richtig, ob der Table Tot mehr als 0 Einträge hat. Was ja so ist, sobald was gefunden wurde. Aber das bringt mich zu...

1.) SucheAufDerWelt(_player, _entity, _groesse, _punkt)

Deine Entity Mordred ist eine 0. Was suchst du genau????
Statt "0" gehört da eine Entity hin. Bspw.: Entities.PB_Blacksmith1

2.) Statt:

Tot = Tot[1]



Schreib lieber:

xyz = Tot[1]


um auf Nummer sicher zu gehen. xyz kann dabei ein beliebiger Variablenname sein.

3.) Was soll die Funktion genau machen? Und wie soll die laufen? Wann soll sie vlt. nicht laufen, wann genau starten und wann beendet werden?
Ich frage, weil du Death() als SimpleJob aufrufst und dann bei einer Bedingung wieder als SimpleJob aufrufst. Kannst also return true und StartsimpleJob in der Funktion weglassen, und gleich die Funktion als SimpleJob durchlaufen lassen, so wie du es bisher geschrieben hast.

Außer du beabsichtigst damit noch etwas. Aber dazu werden wir hier mehr Infos brauchen, um besser weiter zu helfen.

____________________
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

fritz_98
#5
24.02.2010 13:02
Beiträge: 472

"0" ist genauso richtig, erfasst dann alles, was Spieler 1 um Erec herum gehört.

function FirstMapAction()
 StartSimpleJob("Death")
end
function Death()
Tot = SucheAufDerWelt(1,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 0 then
  for i = 1,table.getn(Tot) do
    SetHealth(Tot[i],0)
  end
 end
end



Achtung mit SetHealth! Bei Truppen können einige Truppenmitglieder stehen bleiben, bei zu vielen sind Abstürze keine Seltenheit.

LG
Fritz

Mordred
#6
24.02.2010 18:36
Beiträge: 939

oha, okay, das mit den Abstürzen klingt schlecht und nach erfahrung. Das mit xyz = Tot[1], klappt auch mit Tot, aber versuchs mal anders.
Bei Tot[1] = Tot
Ich will ja Tot[1] auf Tot verkürzen.
Das andere wäre ja: irgendeine variable namens "Tot" in eine
neue Variable "Tot[1]" zu kopieren.
Aber eigentlich wichtiger: wieso klappt die Playerabfrage nicht?
ohne das kann ich das ganze vergessen.
Danke für eure bisherige hilfe!

kingsia
#7
24.02.2010 18:39
Beiträge: 750

Zitat von Mordred:
okay, auch von Spieler 2 nicht leicht.
die Variable _player wirkt in SucheAufDerWelt nicht...


Da hast du recht aber mit dieser geänderte Version funktioniert es.

Gruss
Kingsia

 --**********suche auf der Welt (von Peermanent? oder JugarTeam?)*********
function SucheAufDerWelt(_player, _entity, _groesse, _punkt)
	-------geändert bei Kingsia----------
  local punktX1, punktX2, punktY1, punktY2, data
  local gefunden = {}
  local rueck
  if not _groesse then
    _groesse = Logic.WorldGetSize()
	_groesse = math.floor(_groesse * 0.71)
  end
  if not _punkt then
    _punkt = {X = _groesse/2, Y = _groesse/2}
  end
  if _player == 0 then
    data ={Logic.GetEntitiesInArea(_entity, _punkt.X, _punkt.Y, _groesse, 16)}
  else
    data ={Logic.GetPlayerEntitiesInArea(_player,_entity, _punkt.X, _punkt.Y, _groesse, 16)}
  end
  if data[1] >= 16 then -- Aufteilen angesagt
    local _klgroesse = _groesse / 2 
    local punktX1 = _punkt.X - _groesse / 4
    local punktX2 = _punkt.X + _groesse / 4
    local punktY1 = _punkt.Y - _groesse / 4
    local punktY2 = _punkt.Y + _groesse / 4
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX1,Y=punktY1})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
		table.insert(gefunden, rueck[i])
		end
	end
	rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX1,Y=punktY2})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
        table.insert(gefunden, rueck[i])
      end
    end
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX2,Y=punktY1})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
        table.insert(gefunden, rueck[i])
      end
    end
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX2,Y=punktY2})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
         table.insert(gefunden, rueck[i])
      end
    end
  else
    table.remove(data,1)
    for i = 1, table.getn(data) do
      if not IstDrin(data[i], gefunden) then
        table.insert(gefunden, data[i])
      end
    end
  end
  return gefunden
end
 
function IstDrin(_wert, _table)
  for i = 1, table.getn(_table) do
    if _table[i] == _wert then 
        return true 
    end 
  end
  return false
end

Mordred
#8
24.02.2010 21:04
Beiträge: 939

Oh, danke!
Ist die selbergeändert?
PS: by kannst du auch mit von übersetzen
Nee, so erfahren, dass ich sowas hinkriegen würde,
bin ich leider nicht...

kingsia
#9
24.02.2010 21:31
Beiträge: 750

Zitat von Mordred:
Oh, danke!
Ist die selbergeändert?


Ich hatte selber festgestellt dass die Funktion für andere Spieler IDs ausser 0 und 1 nicht funktioniert daher dieser geänderte Version.

Zitat von Mordred:

PS: by kannst du auch mit von übersetzen


Ich danke dir wegen den deutsch-korrektur aber mein Muttersprache ist englisch und ich glaube bzw. hoffe jede hat verstanden was gemeint war und wie es gemeint war

Zitat von Mordred:

Nee, so erfahren, dass ich sowas hinkriegen würde,
bin ich leider nicht...


Entschuldige wenn ich etwas falsch verstanden habe aber mit diese geänderte Version, funktioniert den Aufruf und den Funktion wie geplant war. Du brauchst nichts anderes zu machen als wie vorher.

Gruss
Kingsia

Mordred
#10
24.02.2010 21:36
Beiträge: 939

Jaja, jetzt klappts! Siehe Screenshot
Aber wenn ich von player 0 enitity 0 (also alle) eingebe,
wird erec leider auch umgebracht...
@by:
machts ja nichts, sieht nur seltsam aus!

kingsia
#11
24.02.2010 21:41
Beiträge: 750

Dann bringe eine IF THEN ein das es verhindert.
Ganz einfach.

Gruss
Kingsia

Mordred
#12
25.02.2010 17:10
Beiträge: 939

Genau die bringt ja das Spiel zum Absturz...

kingsia
#13
25.02.2010 18:05
Beiträge: 750

Wie hast du diese IF THEN formuliert ?

Gruss
Kingsia

Mordred
#14
25.02.2010 20:40
Beiträge: 939

siehe ganz unten, das ist eigentlich dasselbe...
Dabei stürtz das Spiel ab. Ist mir rätselhaft
PS: Wie du auf dem Screen siehst, kann man das mit den Truppen
auch mit gefolge machen. Seeehr praktisch, 30 Trupps ernebelt,
noch kein Bug aufgetreten

aCid
#15
25.02.2010 22:00
Beiträge: 275

Zitat von Mordred:
siehe ganz unten, das ist eigentlich dasselbe...
Dabei stürtz das Spiel ab. Ist mir rätselhaft



hast du das im debugmodus laufen? welche fehlermeldung kommt dann?

____________________
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

kingsia
#16
26.02.2010 17:39
Beiträge: 750

Zitat von Mordred:
ein erecförmiger Zerstörer, der alle Entities von Player 1 um die Ecke bringt, die gerade in der nähe sind.
Von Player 2 wärs ja leicht - aber warum klappt das nicht?

function FirstMapAction()
 StartSimpleJob("Death")
end
function Death()
Tot = SucheAufDerWelt(1,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 0 then
    Tot = Tot[1]
  if not AreEntitiesInArea(1,Entities.PU_Hero4,GetPosition(Tot),100,1)then
    SetHealth(Tot,0)
    StartSimpleJob("Death")
   end
  return true
 end
end



Am besten poste die Funktion wie du es jetzt hast aber um deine erste Frage zu beantworten, Ich habe zwei und halb(?) Fehler in den obigen Skript gefunden.
1) Wenn "erec" auch Spieler ID1 hat, wird es nur einmal laufen. table.getn(Tot) wird wegen "erec" grosser als 0 sein daher wird die SimpleJob mit return true beendet. Weil Tot[1] den ID von "erec" hat wird den Job nicht wieder gestartet.
2) Wenn man
StartSimpleJob("Death" )
und
return true
entweder löscht oder auskommentiert, läuft den Job ständig aber nichts passiert weil Tot[1] den ID von "erec" hat und er wird nicht auf null gesetzt
3) Wenn es trotz die andere Fehler funktioniert hätte, wurde nur ein Entität pro Sekunde getotet

Gruss
Kingsia

Mordred
#17
26.02.2010 20:49
Beiträge: 939

function Death()
Tot = SucheAufDerWelt(2,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 0 then
   Tot = Tot[1]
   local pos = GetPosition(Tot);
   Logic.CreateEffect(GGL_Effects.FXKerberosFear,pos.X,pos.Y,1);
   DestroyEntity(Tot)
   StartSimpleHiResJob("Death")
  return true
 end
end


das ist momentan der Funktionierende Code. Nur, wenn ich player auf 0 setze, dann wird erec (von 1!) auch umgebracht.
Jetzt wird jede 10tel (oder 100tel?)sekunde eine entity
"bearbeitet".

kingsia
#18
27.02.2010 09:19
Beiträge: 750

Mit Player 0 wird alles erfasst und es scheint als ob die erste Eintrag immer erec ist daher losche nicht den ersten Eintrag sondern die letzte und nur solange bis mehr als ein Eintrag vorhanden ist.

function Death()
Tot = SucheAufDerWelt(0,0,1000,GetPosition("erec"))
 if table.getn(Tot) > 1 then
   Tot = Tot[table.getn(Tot)]
   local pos = GetPosition(Tot);
   Logic.CreateEffect(GGL_Effects.FXKerberosFear,pos.X,pos.Y,1);
   DestroyEntity(Tot)
   StartSimpleHiResJob("Death")
  return true
 end
end



Gruss
Kingsia

Mordred
#19
27.02.2010 20:17
Beiträge: 939

ok DAnke!

Mordred
#20
27.02.2010 22:37
Beiträge: 939

ne klappt auch nicht. dann wird erec erst gekillt, wenn die 2te
entity da ist
...

Seiten: 1

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

Impressum