Ein paar Fragen

» Siedler Map Source Forum » Siedler DEdK Script Forum » Ein paar Fragen

Seiten: 1

wilma456
#1
25.03.2017 17:28
Beiträge: 460

Ein paar Fragen

Ich habe ein paar Fragen/Probleme

1. Warum funktioniert dieser Code nicht?

CreateMilitaryGroup(1, Entities.CU_BanditSoldierBow1, 4, GetPosition("Spawn1"))


Statt einer Truppe wird nur ein einzelner unselktierbarer Soldat gesapwnt. Wie kann man das beheben? Mit anderen Entities funktioniert das problemlos.

2. Wie kann ich in einem Briefing eine Entitie benutzen, die erst vor dem Briefing gespawnt wird?

3. Gibt es eine Funktion, die mir ie nächste Entitie eines bestmmten Typs eines bestimmten Spielers zurückgibt? Ich brauche das, um Soldaten zu sagen, sie sollen das nächste Militärgebäude angreifen.

Ich danke für die Beantwortung schonmal im Vorraus.

____________________
Schlacht um Crawford

Wilmasmod

Zedeg
#2
25.03.2017 18:18
Beiträge: 428

1. BanditLeaderBow1, nicht BanditSoldierBow1.
2. Puh, geht bestimmt vielleicht, kannst es ja aber mal ausprobieren:
Bei der betroffenen Seite keine Entität angeben, sondern was eindeutig anderes bspw. XOX, 564, SOS etc.
ID der erstellten Entität speichern.
Die Funktion ,,Briefing´´ hacken. Erst die Original-Funktion ausführen lassen, danach evtl. deine Entität als Kameraposition setzen. Da du bereits GUI-Modifikationen kannst, müsstest du so etwas alleine hinbekommen. (Briefing-Funktion in information.lua im maptools-Ordner)
3. Offizielle Funktion KeyBindings_SelectUnit, die auch mit Gebäuden funktioniert (aus localofficialkeybindings.lua im Ordner local):

--------------------------------------------------------------------------------
-- Toggle through units
--------------------------------------------------------------------------------

gvKeyBindings_LastSelectedEntityPos = 0

function KeyBindings_SelectUnit(_UpgradeCategory,_type)
	
	-- Do not jump in cutscene!
	if gvInterfaceCinematicFlag == 1 then
		return
	end
	
	local EntityTable ={}
	local UpgradeTypeTable = {}	
	
	if _type == 1 then	
		UpgradeTypeTable = {Logic.GetBuildingTypesInUpgradeCategory(_UpgradeCategory)}
	else 
		UpgradeTypeTable = {Logic.GetSettlerTypesInUpgradeCategory(_UpgradeCategory)}
	end
	
	local AmountOfUpgradeTypes = UpgradeTypeTable[1]	
	for i=1,AmountOfUpgradeTypes,1 
	do
		-- Get ID of upgradecategory of player
		local TempTable = {Logic.GetPlayerEntities( GUI.GetPlayerID(), UpgradeTypeTable[i+1], 48 )	}
		local number = TempTable[1]		
		for j=1,number,1 
		do
			table.insert(EntityTable,TempTable[j+1])
		end		
		
	end

	if table.getn(EntityTable) == 0 then
		return
	end

	local counter = gvKeyBindings_LastSelectedEntityPos
	
	--Counter at the end of table?
	counter = counter + 1
	if counter >= table.getn(EntityTable) then
		counter = 0
	end
	
	gvKeyBindings_LastSelectedEntityPos = counter
	
	
	local EntityID = EntityTable[ 1 + counter ]
		
	local IDPosX, IDPosY, IDPosZ = Logic.EntityGetPos( EntityID )
	Camera.ScrollSetLookAt(IDPosX, IDPosY)	
	
	GUI.SetSelectedEntity( EntityID  )	
	
	
	--GUIAction_FlyToEntity(EntityID)	

end



____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

Settlerman
#3
25.03.2017 18:44
Beiträge: 238

Zu 2:
Einfach der Entity einen Namen geben und den im Briefing eintragen.

Zedeg
#4
25.03.2017 18:51
Beiträge: 428

Manchmal übersieht man die einfachsten Lösungen: Die Entität nicht in briefing.started erstellen, sondern in einer Funktion, die zuerst die Entität erstellt und erst danach das Briefing aufruft.

@Settlerman:
Ich glaube, das Problem war, dass die Kamera immer zu (0|0) gesprungen ist anstatt auf die Entität.

@Admins:
Was für eine Serveruhr habt ihr denn da immer? Ich komme derzeit 9 min aus der Zukunft.

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

Dieser Beitrag wurde von Zedeg am 25.03.2017 um 18:58 editiert.

wilma456
#5
26.03.2017 13:21
Beiträge: 460

1) Danke

2) Das Problem ist nicht die Kamera, sondern dass das Spiel im Debuger abstürzt (assertion failed) und ohne Debuger einfach nichts passiert. Hier die Funktion:

function DarioEndBr()
CreateEntity(3,Entities.PU_Hero4,GetPosition("CutsceneIntroErec"),"ErecCut")
local briefing = {};
    local AP, ASP = AddPages(briefing);
	AP{ 
        text = Umlaute("Test Welt wie geht es so? Schon mal nachgedacht, was los sein könnte"),
        position =  GetPosition("ErecCut"),
        explore = 1500,
		action = function() Move("ErecCut","Spawn1") end
	};
	StartBriefing(briefing)
end


Wenn ich die CreateEntity Zeile auskommentiere und eine Entity namens "ErecCut" setze, funktioniert das Ganze problemlos. Gleiches Problem mit einem Boten der gespawnt wird, dessen Briefing aber erst kommen soll, wenn er eien bestimmten Punkt ereicht hat. Hier wird sogar der Code, der nach StartBriefing steht ausgeführt, nur das Briefing kommt nicht.

3) Bei _type wird wahrscheinlich Entities.Irgendwas erwartet. Aber was wird bei _UpgradeCategory erwartet? Zudem scheint die Funktion keinen Rückgabewert zu besitzen. return wird hier nur benutzt, um die Funktion bei einem Fehler abzubrechen.

____________________
Schlacht um Crawford

Wilmasmod

Zedeg
#6
26.03.2017 13:44
Beiträge: 428

2. Und wenn du die Entität außerhalb der Briefing-Funktion erstellst? Also eine Funktion hast mit Entitätserstellung und darauf folgendem Briefing-Aufruf?
3. Ich habe doch die ganze Funktion gepostet und nicht nur den Funktionsaufruf, damit du das Prinzip verstehst.
_UpgradeCategory: UpgradeCategories.Residence, UpgradeCategories.Farm, UpgradeCategories.VillageCenter etc
_type: 1 = Gebäude, sonst Siedler
Das ist die Funktion, die aufgerufen wird, wenn du oben auf die Soldaten-Finden-Buttons klickst oder die entsprechenden Tastenkombinationen betätigst. Füge am Ende return EntityTable[1] ein und du hast deine gewollte Funktion (wenn auch mit unnötigen Balast dann, den du vorher löschen solltest (und du müsstest das GUI.GetPlayerID() durch deine KI-ID ersetzen (und Funktion umbenennen))).

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

wilma456
#7
26.03.2017 14:04
Beiträge: 460

2) Das funktioniert leider auch nicht

3) Ich habe mir mal ein mitleres Wohnhaus (Spieler 1) in die Map gesetzt und die Funktion in mein Skript kopiert und in getNearestEntity umbenannt sowie reeturn EntityTable[1] am Ende eingefügt.. Leider führt der Aufruf Move("Truppe1",getNearestEntity(UpgradeCategories.Residence,1)) nur zu der Meldung atempt to index local "position" in Zeile 914 von Comfort.lua.

____________________
Schlacht um Crawford

Wilmasmod

mcb
#8
26.03.2017 15:25
Beiträge: 1472

Zu 2)
mach es nach diesem Muster:

function brief()
   -- entity create
   Logic.CreateEntuty(...)
   
   -- briefing
   local br = {}
   ...
   StartBriefing(br)
end



Zu 3)
Logic.GetPlayerEntitiesInArea(_playerId, _entityType, _posX, _posY, _range, _amount) sollte dir helfen. Achte darauf, die X und Y Koordinaten getrennt zu übergeben und auf die genaue Rückgabe. Die ist: numberOfEntitys, id1, id2,... ,id16
Gibt maximal 16 Entitys zurück.

wilma456
#9
26.03.2017 18:37
Beiträge: 460

2) Die Funktion erwartet als Argumente _entityType, _posX, _posY, _angle, _playerId. Wie lege ich den Skriptnamen fest?

3) Wird als ganze als Table zurückgegeben?

____________________
Schlacht um Crawford

Wilmasmod

Zedeg
#10
26.03.2017 19:02
Beiträge: 428

2. Logic.SetEntityName
2.&3. Bei solchen Fragen einfach die Komplette Sichtung und Dokumentierung der nicht Lua-Funktionen von mcb durschauen.

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

mcb
#11
26.03.2017 19:07
Beiträge: 1472

@wilma: wenn du das als table haben willst einfach:

local t = {Logic.GetPlayerEntitiesInArea(...)}

wilma456
#12
26.03.2017 19:39
Beiträge: 460

Muss nicht als Table sein. Allerdings habe ich das Problem, dass Logic.GetPlayerEntitiesInArea(2,Entities.CB_CrawfordCastle,GetPosition("HQ_Crawford",1000,1) nichts findet, obwohl es sich bei HQ_Crawford um Burg Crawford handelt.

Logic.SetEntityName erwartet die EntityID, die ich nicht habe.

____________________
Schlacht um Crawford

Wilmasmod

mcb
#13
26.03.2017 20:27
Beiträge: 1472

Du musst die X und Y Koordinate getrennt übergeben:

local p = GetPosition("HQ_Crawford")
local _, id = Logic.GetPlayerEntitiesInArea(2, Entities.CB_CrawfordCastle, p.X, p.Y, 1000, 1)

Peter-FS
#14
27.03.2017 09:48
Beiträge: 1086

Teile auf Funktion prüfen

Du solltest Schritt für Schritt testen.
- Briefing raus, wird der Hero erstellt
- wenn ja, Briefing testen
Irgendwo muss ja der Fehler entstehen!

Nimm mal als Position im Briefing deine ScriptEntity: "CutsceneIntroErec"
Die ist ja immer da, egal ob der Hero dort erstellt wurde oder nicht.

SetEntityName(Logic.CreateEntity( Entities.XD_ChestOrb,pos.X,pos.Y,7,0),"chest" )
CreateEntity liefert immer die Id zurück

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

Peter-FS
#15
27.03.2017 10:09
Beiträge: 1086

Umlaute

Fällt mir gerade auf, wer arbeitet noch mit der Umlaut Funktion?
Einmal ActivateBriefingsExpansion() rein und fertig!
Bei der erweiterten Version werden sogar im MiniMapDebug_SetText die Umlaute in z.B. ä = ae gewandelt.
z.B. in Robin I/II verwendet -> copy & paste = fertig!

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

wilma456
#16
27.03.2017 15:35
Beiträge: 460

Die Zeile SetEntityName(Logic.CreateEntity( Entities.XD_ChestOrb,pos.X,pos.Y,7,0),"chest" ) hat geholfen.

Ich habe allerdings nach ein Problem mit folgendem Code:

function ControlNebel()
for i=1,5 do
local p = GetPosition("NebelTruppe"..tostring(i))
	local num,id = Logic.GetPlayerEntitiesInArea(1,Entities.PB_Tower2,p.X,p.Y,1000,1)
	if num == 1 then
		Attack("NebelTruppe"..tostring(i),id)
		return
	end
	Attack("NebelTruppe"..tostring(i),GetPosition("HQ_Crawford"))
end
end


Als Simple Job gestartet. Eigentlich sollen die Truppen einen Balistaturm angreifen, wenn einer in der Nähe und sonst das Hauptquartier, allerdings greifen sie alle meine Gebäude an.

____________________
Schlacht um Crawford

Wilmasmod

mcb
#17
27.03.2017 16:07
Beiträge: 1472

Attack guft eigentlich Logic.GroupAttackMove auf, ist also eine Bewegung, bei der nahe Gegner angegriffen werden.
Du solltest Logic.GroupAttack(attackerId, targetId) verwenden. Musst aber die namen erst in ids umwandeln:

function ControlNebel()
	for i=1,5 do
		local p = GetPosition("NebelTruppe"..tostring(i))
		local num,id = Logic.GetPlayerEntitiesInArea(1,Entities.PB_Tower2,p.X,p.Y,1000,1)
		if num == 1 then
			Logic.GroupAttack(GetID("NebelTruppe"..i), id)
			return
		end
		Logic.GroupAttack(GetID("NebelTruppe"..i), GetID("HQ_Crawford"))
	end
end

wilma456
#18
27.03.2017 16:55
Beiträge: 460

Der Code führt leider nur dazu, dass nur ein Trupp angreift. Der Rest rennt einfach an den Türmen vorbei.

____________________
Schlacht um Crawford

Wilmasmod

wilma456
#19
27.03.2017 20:28
Beiträge: 460

Hat sich erledigt. Hab eine andere Möglichkeit gefunden.

Ein großes Dankeschön an alle, die mir hier geholfen haben!

____________________
Schlacht um Crawford

Wilmasmod

Seiten: 1

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

Impressum