Fragen zur RobArmee Funktion

» Siedler Map Source Forum » Siedler DEdK Script Forum » Fragen zur RobArmee Funktion

Seiten: 1

Ludwig
#1
26.04.2017 11:31
Beiträge: 440

Fragen zur RobArmee Funktion

Ich wollte mal sehen, was die Funktion noch so alles kann und deshalb das Script genauer angesehen. Dabei bin ich auf einiges gestoßen, was ich mir nicht erklären kann.

1. Die Funktion verlangt unter anderem die Eingabe von einem Wert für den - _kriegRadius - .

CreateRobArmee(_player, _ePos, _Type, _erfahrung, _ziel, _menge, _lebensFaden, _zeit, _tod, _kriegRadius, _refresh, _scharf)


in der Funktion wird dann dieser Wert mit

_kriegRadius = _kriegRadius or 2000


verarbeitet.
Egal welchen Wert ich der Funktion übergebe, im Spiel erscheint in dem Table für RobArmee immer der unter or stehende Wert 2000. Warum ?

2. An anderer Stelle gibt es die Zeile:

elseif type(_player) == "table" and type(_player.type) =="table" then
-
end


Ich habe nun nach dem table _player gesucht und nicht gefunden. Es gab folgende Ergebnisse.
Die Zeile umgewandelt in

if type(_player) == "table" then


und danach eingefügt

Message("_player ist "..type(_player))


ergibt die Anzeige _player ist Table
weiter eingefügt

table.foreach(_player,function(k,v) Message("Key: "..k.." Wert "..v)end)


ergibt die Fehlermeldung das kein table _player existiert ?

Die RobArmee Funktion wird von vielen angewendet und arbeitet einwandfrei. Hat Jemand schon ähnliche Feststellungen gemacht, warum ist das so ?

Gruß
Ludwig

Peter-FS
#2
26.04.2017 13:32
Beiträge: 1086

Hallo Ludwig,

zu 1) hast du meine Chatabfrage aktiv, womit du während dem Speiel Variablen auslesen kannst (Testroutine)?
Ich kann es jetzt nicht prüfen, aber schau dir doch damit mal die Variable robArmee an, dort solltest du den kriegRadius sehen. kriegRadius -> muss aber als number übergeben werden, nicht als string!


zu 2) man kann die RobArmee ja auf zwei verschiedene Arten starten.
1. mit Einzelparameter, dann ist _player kein Table

CreateRobArmee(_player, _ePos, _Type, _erfahrung, _ziel, _menge, _lebensFaden, _zeit, _tod, _kriegRadius, _refresh, _scharf) 


2. mit Table (so mache ich das immer), dann ist _player ein Table

function Create_P2_Army4()
	local Army4_p2 = {
	player = 2,
	erstehungsPunkt = "p2_haus4_pos",
	type = {28,29},	
	erfahrung = 3,	
	ziel = {"insel2"},
	menge = 2,	
	lebensFaden = "p2_haus4",
	zeit = 15,	
	tod = true,
	kriegRadius = 10000,
	refresh = 6,
	scharf = true,
	}
	Armee_4_p2 =  CreateRobArmee(Army4_p2)
	StartArmee(Armee_4_p2)
end 



____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Ludwig
#3
26.04.2017 17:51
Beiträge: 440

Hallo Peter,
ich starte die Map über den LuaDebugger und habe so eben gesehen, dass der Krieg Radius den unter or angegebenen Wert hat auch wenn ich einen anderen Wert als Zahl eingegeben habe.

Zum _Player Table ist das eigenartige, das Programm entscheidet _player ist ein Table wenn ich es mir aber anzeigen lassen möchte kommt die Fehlermeldung es gibt kein Table _player.
Es wird ja auch nirgends deklariert und das eingegebene Table hat doch in Deinem Beispiel den Namen "local Army4_p2{}" und nicht _player.
Komme da nicht klar, aber die Funktion läuft eben nur wenn man den Teil

elseif type(_player) == "table" and type(_player.type) =="table" then

drin lässt.
Gruß
Ludwig

mcb
#4
26.04.2017 17:56
Beiträge: 1472

Das table hat den namen _player, es ist der erste Parameter

Sieh das mal so:

function foo()
   local foovar = 5
   bar(foovar)
end
function bar(barvar)
   Message(foovar or "nil") -- ausgabe nil
   Message(barvar) -- ausgabe 5
end
foo()

Peter-FS
#5
26.04.2017 18:01
Beiträge: 1086

_player ist die erste variable beim Aufruf der Funktion, in der Klammer! CreateRobArmee(_player,.........
Da wird sie deklariert und ist nur innerhalb der Funktion gültig.

Übergibst du einen number Wert?

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Ludwig
#6
26.04.2017 19:15
Beiträge: 440

Das ist mein table Army61, mit dem ich die robArmee Funktion aufrufe.

function CreateArmy61()
	Army61 = {
	player = 2,
	erstehungsPunkt = "spw_21",
	type = {26,27},	
	erfahrung = 3,	
	ziel = {Logic.GetPlayerEntitiesInArea(1,0,21800,34500,15000,6)},
	menge = 2,	
	lebensFaden = "bast_21",
	zeit =10,	
	tod = true,
	kriegRadius = 15000,
	refresh = 8,
	scharf = true,
	endAktion = function ()
		Message(" Lebensfaden zerstört !")	
	end
	}
	Armee_61 =  CreateRobArmee(Army61)
	StartArmee(Armee_61)
end


Die Werte werden doch dann durch die Funktion CreateRobArmee übernommen. Wenn da ein Table in der Funktion erzeugt wird, warum kann es dann nicht auch in der Funktion ausgelesen werden ?
Die Message das _Player ein Table ist kommt noch aber mit table.foreach kommt dann die Fehlermeldung kein Table vorhanden ?

Peter-FS
#7
27.04.2017 08:49
Beiträge: 1086

du hast Recht

Oh ich ungläubiger!!!

Du hattest Recht!
Es fehlt die Übergabe, wenn _player eine Tabelle ist, wie in unserem Fall.

Mit dieser zusätzlichen Zeile funktioniert es.

_scharf = _player.scharf
_kriegRadius = _player.kriegRadius or 2000
if _player.maxS then lvmaxS = _player.maxS end
if _player.minS then lvmaxS = _player.minS end

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Ludwig
#8
27.04.2017 13:23
Beiträge: 440

Oh ich blinder,
hätte mir natürlich auffallen müssen wenn alles andere über Player.table geht, dass es dann auch mit dem kriegRadius über Player geht.
Nun ja je mehr Augen desto schneller wird die Lösung gefunden.
Warum sich aber _plaer table nicht auslesen lässt ist mir immer noch unklar.
Ludwig

mcb
#9
27.04.2017 17:57
Beiträge: 1472

Parameter sind lokale Variablen und nur in der Funktion gültig, zu der sie gehören. Da du aber normalerweise von Außerhalb darauf zugreifen willst, funktioniert das nicht.

function foo(param)
   local bar = 5
   Message(bar + param)
end
foo(5) -- 10
Message(bar) -- nil
Message(param) --nil

Ludwig
#10
27.04.2017 22:51
Beiträge: 440

Hallo mcb
Wie ich schrieb, habe ich den Versuch innerhalb der Funktion ausgeführt.
Also zuerst in der Funktion die Abfrage nach dem Typ von _Player die mit Table beantwortet wurde und in der nächsten Zeile versucht den Inhalt auszulesen der mit "Table nicht vorhanden" beantwortet wurde.
Aber das kann auch an dem Befehl table.foreach liegen.
So habe ich das Beispiel aus dem Wicki mal eigegeben und erhalte nur eine Fehlermeldung Syntaxfehler.
Das Beispiel (nur die entscheidenden Zeilen):

_table={"eins", zwei = "drei", "vier", "fuenf"="fuenf"} 
table.foreach(_table, function(k,v) Message("Key "..k.."  Value "..v)end)


Das Ergebnis laut Wicki sollte sein :
Key 1 Value 2
usw.
Irgend etwas mache ich wohl falsch, dass alles bei mir nicht klappt.
Ludwig

mcb
#11
27.04.2017 23:13
Beiträge: 1472

Sorry, da muss ich dich falsch verstanden haben.
Bei dem Beispiel wird das table falsch aufgebaut, so ist es besser:

_table={"eins", zwei = "drei", "vier", ["fuenf"]="fuenf"}



Was da genau los ist, weiß ich nicht, vielleicht ein Tippfehler?

(Ich hab auch grad nochmal geprüft ob table.foreach überhaupt funktioniert, hab ich glaub ich noch niemanden benutzen sehen )

Ludwig
#12
27.04.2017 23:39
Beiträge: 440

Teilerfolg

habe weiter probiert und einen Teilerfolg erzielt.
Folgendes geht:

_table={
	player = 2, 
	erfahrung = 3, 
	zeit =10, 
	kriegRadius = 15000,
	lebensFaden = "bast_21",
}

wird alles correct angezeigt, aber wenn ich ein UnterTable einfügen möchte (z.B. Type = {25,26} ) dann bleibt das Programm hängen. Muß also noch weiter versuchen.
Ludwig

mcb
#13
28.04.2017 00:00
Beiträge: 1472

table.foreach ist deprecated, falls du es genauer wissen willst: http://lua-users.org/wiki/TableLibraryTutorial
Versuch mal die Version:

for k, v in pairs(_table) do
   Message(tostring(k).." - "..tostring(v))
end



(Wenn du den Debugger hast, kannst du auch einfach ein LuaDebugger.Break() da reinschreiben und dir das table im Debugger ansehen, geht wahrscheinlich einfacher)

Seiten: 1

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

Impressum