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

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

Impressum