Sterbende Entities finden
» Siedler Map Source Forum » Siedler DEdK Script Forum » Sterbende Entities finden
Seiten: 1
Messoras
|
#1 01.08.2018 14:51 Beiträge: 84 |
Sterbende Entities finden
Hallo zusammen,
Ich melde mich auch mal wieder und bin diesmal auf der Suche nach einer Sterbefunktion, die ich überschreiben kann.
Um euch mal genau zu erklären, wie das gemeint ist hier ein Beispiel:
Auf der Map rennen verschiedene Armeen der KI und des Spielers rum. Nun tötet ein Effekt verschiedene Entities, wobei, sofern ein Hauptmann erwischt wurde, seine Truppe nicht zwangsläufig mitstirbt, so dass die Soldaten jetzt blöd rumstehen, bis jemand versucht sie anzugreifen und sie verpuffen.
Ich bin sicher, dass es eine Funktion gibt, die entsprechende Referenzen auslöst und auch diese kleinen Misc Entities erstellt, wenn ein Soldat stirbt.
Kann mir jemand sagen, wie die heißt, so dass ich sie überschreiben kann?
Außerdem würde ich gerne im Skript mit Vertexfarben arbeiten, habe aber keinen Plan wie ich das machen könnte.
Es soll z.B. wenn eine Einheit stirbt ein kleiner roter Fleck unter ihr spawnen.
Falls ich die entsprechenden Threads im Forum übersehen habe, nehmt es mir nicht übel, ich habe mein bestes mit der Foren-Suche getan, kann mir aber eine Google-Suche dank des Datenvolumens nicht leisten "
Gruß,
Messoras
#EDIT:
Ich hab mir im Editor die Standardgruppen zerschossen, kann ich die von irgendwo wieder importieren?
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Dieser Beitrag wurde von Messoras am 01.08.2018 um 15:09 editiert.
mcb
|
#2 01.08.2018 16:00 Beiträge: 1472 |
Also am einfachsten wäre es, deinen Spezialeffekt der die Leader tötet zu ändern, das er statt einem Leader mit Soldaten einen (oder alle) der Soldaten tötet (einfach auch SetHealt 0).
Vertexfarben: Sieht so aus:
Logic.SetTerrainVertexColor(x/100, y/100, r, g, b)
Du musst die Koordinaten von GetPosition durch 100 teilen und dann einzeln als 2 Parameter übergeben. die letzten 3 Parameter sind der rgb wert (3 ints 0-255).
Messoras
|
#3 01.08.2018 18:25 Beiträge: 84 |
Ah die Vertexfarbenfunktion hilft schon echt weiter. Danke dafür
Also wegen des Effekts:
Wie töte ich denn die Truppe eines Hauptmanns, sobald ich weiß, dass die Entity ein Hauptmann ist?
Gibt's irgend eine GetSolders Funktion, die eine EntityTable ausspuckt?
Und das mit den sterbenden Einheiten:
Könnte man vielleicht nach FX.Die, also Sterbe-Effekten suchen und deren Position benutzen?
Gruß,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
mcb
|
#4 01.08.2018 19:15 Beiträge: 1472 |
Logic.GetSoldiersAttachedToLeader(_id) gibt numberofsoldiers, id1, id2... zurück.Wenn du alle soldiers brauchst, stopfst du die Rückgabe am besten direkt in ein table:
local sol = {Logic.GetSoldiersAttachedToLeader(_id)} local num = table.remove(sol, 1)
Du kannst per lua weder rausfinden wann ein effekt erzeugt wird, noch über alle iterieren.
Messoras
|
#5 01.08.2018 19:53 Beiträge: 84 |
Zitat von mcb:
Logic.GetSoldiersAttachedToLeader(_id) gibt numberofsoldiers, id1, id2... zurück.Wenn du alle soldiers brauchst, stopfst du die Rückgabe am besten direkt in ein table:
local sol = {Logic.GetSoldiersAttachedToLeader(_id)} local num = table.remove(sol, 1)
Du kannst per lua weder rausfinden wann ein effekt erzeugt wird, noch über alle iterieren.
Super, dankeschön.
Ich hab mir wegen der "Sachen hinterlassen" Effekte mal folgendes ausgedacht:
function BloodJob() local pos = GetPosition("warcenter") local t1 = {Logic.GetEntitiesInArea(Entities.XD_DroppedAxeShield, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t1[1] >= 1 then for i = 2, t1.size, 1 do -- Fehler CreateBloodPool(GetPosition(t1[i])) ReplaceEntity(t1[i],Entities.MiscAxeShield) end end local t2 = {Logic.GetEntitiesInArea(Entities.XD_DroppedBow, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t2[1] >= 1 then for i = 2, t2.size, 1 do -- Fehler CreateBloodPool(GetPosition(t2[i])) ReplaceEntity(t2[i],Entities.MiscBow) end end local t3 = {Logic.GetEntitiesInArea(Entities.XD_DroppedPoleArm, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t3[1] >= 1 then for i = 2, t3.size, 1 do -- Fehler CreateBloodPool(GetPosition(t3[i])) ReplaceEntity(t3[i],Entities.MiscPoleArm) end end local t4 = {Logic.GetEntitiesInArea(Entities.XD_DroppedShield, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t4[1] >= 1 then for i = 2, t4.size, 1 do -- Fehler CreateBloodPool(GetPosition(t4[i])) ReplaceEntity(t4[i],Entities.MiscShield) end end local t5 = {Logic.GetEntitiesInArea(Entities.XD_DroppedSword, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t5[1] >= 1 then for i = 2, t5.size, 1 do -- Fehler CreateBloodPool(GetPosition(t5[i])) ReplaceEntity(t5[i],Entities.MiscSword) end end local t6 = {Logic.GetEntitiesInArea(Entities.XD_DroppedSwordShield, pos.X, pos.Y, 100000, 16)} --Parameter: spielerId, Entitytyp, pos.X, pos.Y, reichweite, menge(maximal 16) --Rückgabe: menge, id1, id2, id3... mit {} in einem table zusammengefasst if t6[1] >= 1 then for i = 2, t6.size, 1 do -- Fehler CreateBloodPool(GetPosition(t6[i])) ReplaceEntity(t6[i],Entities.MiscSwordShield) end end end
Merkwürdigerweise bekomme ich in der markierten Zeile diese Fehlermeldung:
`for' limit must be a number
t[1] müsste die Anzahl der anderen enthaltenen Objekte (Entities) sein. Dementsprechend muss t.size mindestens 2 sein. Bin ich doof oder ist da irgendwo noch ein Fehler?
Gruß,
Messoras
#EDIT:
Alles klar, bin doof...
Lua hat nunmal Tables und keine Arrays...
Mit t[1]+1 statt size ist alles gut xD
Danke für die Hilfe
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Dieser Beitrag wurde von Messoras am 01.08.2018 um 20:05 editiert.
mcb
|
#6 01.08.2018 20:52 Beiträge: 1472 |
Also einfacher wäre da ein entity-created trigger, da brauchst du keine 10 area checks pro Sekunde. (Und die area checks würd ich mit dem EntityIterator machen.)
(Und
local t = -- logic call table.remove(t, 1) for _,id in ipairs(t) do end
sieht deutlich besser aus.)
Peter-FS
|
#7 01.08.2018 22:44 Beiträge: 1086 |
Entities Schaden zufügen
Hi,
Schau dir mal die Priester Map an, dort wird den Einheiten durch Spezialeffekte manuell Schaden zugefügt. Erst den Soldaten, dann dem Hauptmann.
Gruß Peter
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Messoras
|
#8 02.08.2018 02:26 Beiträge: 84 |
Ich krieg den Enassen-Button nicht weg
-- wird in der WeatherInit aufgerufen, um Savegame-sicher zu bleiben. GameCallback_GUI_SelectionChangedOrig = GameCallback_GUI_SelectionChanged GameCallback_GUI_SelectionChanged = function() GameCallback_GUI_SelectionChangedOrig() if GUI.GetSelectedEntity() == GetID("hero") then Message("Override active") XGUIEng.DisableButton(1395,1) --XGUIEng.ShowWidget(1395,0) geht auch nicht. end end
Ich habe es geprüft und die Funktion wird jedes mal aufgerufen, wenn ich den Held anklicke, aber der Entlassen-Button macht weiterhin seinen Job...
Findet wer einen Fehler?
Gruß,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Peter-FS
|
#9 02.08.2018 05:53 Beiträge: 1086 |
Ich kann im Moment nicht nachsehen ob 1395 der Richtige ist, aber verwende nicht die ID's, sondern die Widget-Texte.
Es gibt sonst Probleme bei den Spielern.
War bei meiner letzten Map so
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Messoras
|
#10 02.08.2018 12:05 Beiträge: 84 |
Zitat von Peter-FS:
Ich kann im Moment nicht nachsehen ob 1395 der Richtige ist, aber verwende nicht die ID's, sondern die Widget-Texte.
Es gibt sonst Probleme bei den Spielern.
War bei meiner letzten Map so
Die Widget ID
gvGUI_WidgetID.ExpelSettler
ist 1395
Wenn ich stattdessen die Konstante nehme ändert sich nichts.
Ich habe zusätzlich mal 808 (Leibeigener Miliz) und 809 (nochmal Entlassen) deaktiviert, aber auch davon merke ich im Spiel nichts. Die IDs habe ich rausbekommen, indem ich die entsprechenden Widgets anzeigen lassen und die passenden Bilder gefunden habe.
Die Entity ist ein PU_Serf und alles was ich in ihrer SelectionChanged ändere ist
XGUIEng.DisableButton(1395,1) XGUIEng.DisableButton(808,1) XGUIEng.DisableButton(809,1)
Wie gesagt: Die Funktion wird definitiv aufgerufen und XGUIEng iat initialisiert, alle XGUIEng Funktionen sind jedoch wirkungslos.
Gruß,
Messoras
#EDIT:
Mit anderen Entities funktioniert es. Es scheint etwas mit dem Leibeigenen zu tun zu haben.
Vielleicht wird der Entlassen Button da in irgendeiner Table verpackt aufgerufen?
#EDIT2:
Fortschritt! Das Entlassen und Bewaffnen ist im Beautifications-Menü mit 808 und 809 deaktiviert.
#EDIT3:
Geschafft!
Das Problem ist, dass Leibeigene andere Widgets als Soldaten nutzen.
Um einen Leibeigenen effektiv zu schützen braucht man das:
XGUIEng.DisableButton( 808 , 1 ) -- Militia ( Beautification Menu ) XGUIEng.DisableButton( 809 , 1 ) -- Expel ( Beautification Menu ) XGUIEng.DisableButton( 832 , 1 ) -- Militia ( Buildings Menu ) XGUIEng.DisableButton( 833 , 1 ) -- Expel ( Buildings Menu )
Gruß,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Dieser Beitrag wurde von Messoras am 02.08.2018 um 13:27 editiert.
mcb
|
#11 02.08.2018 14:58 Beiträge: 1472 |
Ich würde an deiner Stelle wirklich nicht die ids verwenden, die sind je nach Spielversion unterschiedlich. Die entsprechenden strings müssten "ExpelSerf" , "ChangeIntoBattleSerf" , "BeautificationMenu_ChangeIntoBattleSerf" und "BeautificationMenu_ExpelSerf" sein.
Seiten: 1