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