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