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
|
#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
|
#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