Schwere Kavallerie, Kampfformationen?

» Siedler Map Source Forum » Siedler DEdK Script Forum » Schwere Kavallerie, Kampfformationen?

Seiten: 1

W0lfkri3g3r
#1
16.11.2020 17:20
Beiträge: 39

Schwere Kavallerie, Kampfformationen?

Hallo zusammen, nachdem mir das jetzt in mehreren Maps aufgefallen ist, hier mal meine Frage.

Einheiten können ja alle, mit Ausnahme von Kavallerie und Kanonen, verschiedene Kampfformationen einnehmen.

Nun habe ich in manchen Maps, z.B Dario vs Kerberos von Play4Fun, die Möglichkeit auch mit Kavallerie in diese Kampfformationen zu gehen. (Was ich extrem cool finde )

Gibt es da irgendeinen Scriptteil? Befehl?

Oder warum funktioniert das mal und mal nicht?

Hoffe mir kann vllt jemand helfen

Gruß

Play4FuN
#2
16.11.2020 19:51
Beiträge: 704

Das ist anscheinend vom Spiel nicht vorgesehen (oder wurde vergessen). Ich baue es seit einiger Zeit eigentlich in alle meine Maps ein. So sah mein ursprüngliches Skript dazu in etwa aus:

GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	
	GameCallback_GUI_SelectionChanged_Orig()
	
	-- Get selected entity
	local EntityId = GUI.GetSelectedEntity()
	if Logic.IsLeader( EntityId ) == 1 then
		if Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryHeavy) == 1
		or Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryLight) == 1 then
			XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 1)
		end
	end
end



Direkt daneben habe ich den Fix gespeichert, dass wenn man Milizen (Leibgeigene) selektiert, danach nicht mehr die Formationen Buttons verschwinden:

GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	
	GameCallback_GUI_SelectionChanged_Orig()
	
	-- Get selected entity
	local EntityId = GUI.GetSelectedEntity()
	local EntityType = Logic.GetEntityType( EntityId )
	local EntityTypeName = Logic.GetEntityTypeName( EntityType )
	
	if EntityType == Entities.PU_BattleSerf then
		XGUIEng.ShowWidget("Commands_Leader", 1)
		XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 0)
	end

	if Logic.IsLeader( EntityId ) == 1 then
		if Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryHeavy) == 1
		or Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryLight) == 1 then
			XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 1)
		end
	end
end



Nachtrag: da fällt mir noch was wichtiges auf. Nicht mehrmals die Zuweisung GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged verwenden! Wenn man beides verwenden will, entweder alles in eine Funktion kombinieren oder verschiedene "Backups" verwenden. Also so z.B.

GameCallback_GUI_SelectionChanged_MilitaFix = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	GameCallback_GUI_SelectionChanged_MilitaFix()
	-- (milita fix here)
end

GameCallback_GUI_SelectionChanged_CavalryFix = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	GameCallback_GUI_SelectionChanged_CavalryFix()
	-- (cavalry fix here)
end



____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#3
16.11.2020 19:52
Beiträge: 1472

Ja, das wird per Script gemacht. Und zwar musst du die GameCallback_GUI_SelectionChanged ändern.
Das machst du z.b. so:

GameCallback_GUI_SelectionChangedCavOrig = GameCallback_GUI_SelectionChanged
function GameCallback_GUI_SelectionChanged()
   GameCallback_GUI_SelectionChangedCavOrig()
   local id = GUI.GetSelectedEntity()
   if IsAlive(id) and Logic.IsEntityInCategory(id,EntityCategories.Military) == 1 and (Logic.IsEntityInCategory(id,EntityCategories.CavalryHeavy) == 0 or Logic.IsEntityInCategory(id,EntityCategories.CavalryLight) == 0)
      XGUIEng.ShowWidget("Selection_Leader", 1)
   end
end


(Das dann aus der FMA aufrufen)

Edit: Sieh an, da hast du sogar 2 Antworten für den Preis von einer Frage bekommen

W0lfkri3g3r
#4
19.11.2020 20:24
Beiträge: 39

Danke für die Antworten

W0lfkri3g3r
#5
24.11.2020 21:57
Beiträge: 39

Nachtrag: da fällt mir noch was wichtiges auf. Nicht mehrmals die Zuweisung GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged verwenden! Wenn man beides verwenden will, entweder alles in eine Funktion kombinieren oder verschiedene "Backups" verwenden. Also so z.B.

GameCallback_GUI_SelectionChanged_MilitaFix = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	GameCallback_GUI_SelectionChanged_MilitaFix()
	-- (milita fix here)
end

GameCallback_GUI_SelectionChanged_CavalryFix = GameCallback_GUI_SelectionChanged
GameCallback_GUI_SelectionChanged = function()
	GameCallback_GUI_SelectionChanged_CavalryFix()
	-- (cavalry fix here)
end

[/quote]

So ich bins nochmal. Hab jetzt mehrmals verzweifelt versucht die Funktionen zu kombinieren. Also einmal das ich Kavellerie in Formation bringen kann und das der Leibeigenen "Bug" gefixt ist.
Hat nicht geklappt. Ich kann die Einheit nach Spielstart einmal in Formation bringen. Sobald ich sie erneut auswähl sind die Formationsbuttons ausgegraut.

Könntest du mir die komplette kombinierte Funktion mal hier reinstellen, so wie du sie verwendest?
Danke im Vorraus

Play4FuN
#6
25.11.2020 09:40
Beiträge: 704

Ich sehe gerade, das war ungünstig strukturiert von mir. Der zweite Codeabschnitt ist eigentlich alles, was du brauchst - da ist schon beides drin. Also so habe ich es in meinen Maps:

function P4FComforts_SelectionFix()
	GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged_Orig or GameCallback_GUI_SelectionChanged
	GameCallback_GUI_SelectionChanged = function()
		
		GameCallback_GUI_SelectionChanged_Orig()
		
		-- Get selected entity
		local EntityId = GUI.GetSelectedEntity()
		local EntityType = Logic.GetEntityType( EntityId )
		local EntityTypeName = Logic.GetEntityTypeName( EntityType )
		
		if EntityType == Entities.PU_BattleSerf then
			XGUIEng.ShowWidget("Commands_Leader", 1)
			XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 0)
		end

		if Logic.IsLeader( EntityId ) == 1 then
			if Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryHeavy) == 1
			or Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryLight) == 1 then
				XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 1)
			end
		end

	end
end


Du musst also nur noch in der FMA die Funktion einmal aufrufen (in dem Falle P4FComforts_SelectionFix). Und aufpassen, dass du "GameCallback_GUI_SelectionChanged_Orig" nicht nochmal verwendest.

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

W0lfkri3g3r
#7
25.11.2020 21:12
Beiträge: 39

Noch eine Frage

Hallo,
erstmal danke. Hat geklappt.
Nun noch eine Frage in die Runde, einfach mal hier rein ohne einen neuen Thread zu erstellen.

Wenn ich mit:

MapEditor_SetupAI(7, 3, 12000, 1, "spawnP7", 3, 0) --Verbündeter
SetupPlayerAi( 7, { serfLimit = 8, extracting = 0, constructing = true, repairing = true } )

ja meine KI erstelle, dann ist ja der Punkt an dem sich die Truppen sammeln "spawnP7". Gibt es irgendeine möglichkeit den dann im späteren Verlauf zu ändern?
Die Idee: Am Anfang "spawnP7" verteidigen, im späteren verlauf dann einen anderen Punkt z.B "spawnP7_2

Danke im Vorraus
Gruß

Play4FuN
#8
26.11.2020 09:55
Beiträge: 704

Jou, intern stehen die Armeen der KI dann in so einer Tabelle:

MapEditor_Armies[_playerId][i]

und die Position kannst du also so ändern:

MapEditor_Armies[_playerId][i].position = GetPosition(_position)

wobei das "i" jeweils die ID der Armee ist. Eine KI hat - wenn mit MapEditor_SetupAI erstellt - immer (Stärke) * 2 Armeen. In deinem Beispiel also 3*2 = 6 Armeen -> also setzt du die Position in etwa so:

local pos = GetPosition("spawnP7_2")
for i = 1,6 do
 MapEditor_Armies[_playerId][i].position = pos
end



Nochmal ein Nachtrag wenn du die Armeen ein bisschen verteilen möchtest, kannst du auch sowas in der Art nutzen:

local pos = GetPosition( "spawnP7_2" )
local radius = 1000
local a = Round( 360/6 )	-- 360° / number of armys
for i = 1,6 do
 local angle = math.rad( a*i )
 MapEditor_Armies[_playerId][i].position = {
  X = pos.X + radius * math.cos( angle ),
  Y = pos.Y + radius * math.sin( angle ),
 }
end


Den Radius kannst du einstellen. Die Armeen werden dann gleichmäßig in einem Kreis mit dem gegebenen Radius verteilt (sodass nicht alle auf einem Haufen stehen). Bei mehr bzw. weniger Armeen muss natürlich das "i" und der Wert bei Round( 360/? ) angepasst werden. Falls die Round Funktion noch nicht vorhanden ist, hier:

function Round(_number)
 return math.floor(_number + 0.5)
end


(Randnotiz: wenn die KI Position am Kartenrand ist, kann es passieren, dass sich die neue Armeeposition außerhalb der Karte befindet...)

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Dieser Beitrag wurde von Play4FuN am 26.11.2020 um 10:14 editiert.

W0lfkri3g3r
#9
05.12.2020 13:16
Beiträge: 39

Neue Frage^^

Ich würde gerne folgendes realisieren:

wenn pilgrim in der nähe einer script enity ist, soll ein briefing starten.

Geht das nicht über einen Simple Job mit der if IsNear funktion?

wie würde der Scriptteil denn aussehen?

Danke im Vorraus

Play4FuN
#10
05.12.2020 17:14
Beiträge: 704

StartSimpleJob("PilgrimNearXyzJob")
function PilgrimNearXyzJob()
 if IsNear("Pilgrim","posEntity",2000) then
  PilgrimBriefing()
  return true -- nicht vergessen!
 end
end



____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Play4FuN
#11
04.01.2022 21:05
Beiträge: 704

Soldaten Kommandos für BattleSerfs

Nachtrag: Code für Kavallerie Formationen + Selektionsfix bei Selektion von battle serfs erweitert, so dass man auch im Selektionsmenü von battle serfs die Kommandos hat (Angreifen, Verteidigen etc.)

function P4FComforts_SelectionFix()
	GameCallback_GUI_SelectionChanged_Orig = GameCallback_GUI_SelectionChanged_Orig or GameCallback_GUI_SelectionChanged
	GameCallback_GUI_SelectionChanged = function()
		
		GameCallback_GUI_SelectionChanged_Orig()
		
		-- Get selected entity
		local EntityId = GUI.GetSelectedEntity()
		local EntityType = Logic.GetEntityType( EntityId )
		local EntityTypeName = Logic.GetEntityTypeName( EntityType )
		
		if EntityType == Entities.PU_BattleSerf then
			XGUIEng.ShowWidget("Commands_Leader", 1)
			-- Commands_generic enable to use defend, patrol etc. commands
			-- plus it enabels to expell battle serfs directly
			XGUIEng.ShowWidget("Commands_generic", 1)
			XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 0)	-- formation buttons
		end

		if Logic.IsLeader( EntityId ) == 1 then
			if Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryHeavy) == 1
			or Logic.IsEntityInCategory(EntityId,EntityCategories.CavalryLight) == 1 then
				XGUIEng.ShowWidget(gvGUI_WidgetID.SelectionLeader, 1)
			end
		end

	end
end



____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Seiten: 1

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

Impressum