Trigger

» Siedler Map Source Forum » Siedler DEdK Script Forum » Trigger

Seiten: 1

Settlerman
#1
08.10.2017 12:19
Beiträge: 238

Trigger

Hallo zusammen,
Folgendes Problem: Ich starte den Trigger

	Trigger.RequestTrigger(Events.LOGIC_EVENT_ENTITY_IN_RANGE_OF_ENTITY, nil, function() local id = Event.GetEntityID1() Message(id) end, 1, nil, nil)


um abzufragen ob irgendein Objekt in der Nähe eines anderen ist und möchte mir dann die EntityID ausgeben lassen. Jedoch passiert nichts.
Hab ich irgenwas vergessen?
Trigger - Fix von mcb ist vorhanden.
lg

mcb
#2
08.10.2017 14:54
Beiträge: 1472

Das Problem ist, das der Trigger nicht so funktioniert, wie du denkst. Du musst mit Logic.AddEntityToEntityDistanceCheck(_entity1, _entity2, _distance, _eventtyp) die entitys und die Entfernung festlegen (auch mehrere, wenn ich mich richtig erinnere) und wenn die entitys sich dann näher kommen als _distance wird der Trigger ausgelöst. Das ganze wird allerdings nur wie ein SimpleJob geprüft, ist also völlig nutzlos.

Peter-FS
#3
08.10.2017 19:38
Beiträge: 1086

SetupExpedition

Hi, ich weiß jetzt ja nicht was du genau vor hast, aber mit SetupExpedition kann man einiges machen.

-- Setup Expedition: Entity must come close Enough to Other Entity
--
-- EntityName = Which unit should do the expedition...optional
-- Heroes = any hero should reach target...optional
-- Leaders = any leader should reach target...optional
-- Serfs = any serf should reach target...optional
-- TargetName = Where is the expedition center
-- Distance = Distance to center to finish expedition...max of 6400 if listening for heroes or military
-- Callback = Call this function if expedition quest done, return true if quest should be destroyed

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Settlerman
#4
09.10.2017 21:39
Beiträge: 238

@mcb Gut, dann kann ich das schon mal vergessen.
@Peter Damit könnte es klappen. Muss ich mal rumprobieren.

Danke euch für die Antworten.

lg

Settlerman
#5
10.10.2017 15:08
Beiträge: 238

So, hab das ganze jetzt mit dem EVERY_SECOND Trigger gelöst.
Bekomme jetzt von mcb's Trigger-Fix die Meldung, dass der Trigger zu lange braucht.

CreateTest = function()
 Truppen = {2, S_AI_AttackWay.CreateArmy(2, Entities.PU_LeaderSword1, 4, GetPosition("Serf")), S_AI_AttackWay.CreateArmy(2, Entities.PU_LeaderBow1, 4, GetPosition("Serf"))}
 Wegpunkte = {1, "PosOne"}
 S_AI_AttackWay.Init(Wegpunkte, Truppen)
end
-- Ai die Wege angreift

S_AI_AttackWay = {};

S_AI_AttackWay.CreateArmy = function(_player, _entity, _soldiers, _position)

	local id = Tools.CreateGroup(_player, _entity, _soldiers, _position.X, _position.Y,0);

	return id;

end

S_AI_AttackWay.Init = function(_posTable, _troopTable)

	-- Abfrage ob ein Gegner in der Nähe einer der Waypoints ist
	Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_SECOND, nil, function() 
																			
																			for i = 2, _posTable[1]  + 1 do
																			
																						local pos = GetPosition(_posTable[i]);
																						
																						if AreEntitiesInArea( 1, 0, pos, 1500, 1) then
																						-- Punkt wird attackiert
																							for j = 2, _troopTable[1] + 1 do
																							
																								Logic.GroupAttackMove(_troopTable[j], pos.X, pos.Y, -1);
																							
																							end
																							
																							Message("Läuft");
																							
																						end
																					
																			
																			end
																			
																			
																			end			, 1, nil, nil)

end


Irgendein Fehler drinnen den ich nicht sehe, oder liegt es nur an meinen Pc?
lg

Dieser Beitrag wurde von Settlerman am 10.10.2017 um 18:31 editiert.

Der_Deutsche
#6
15.10.2017 10:21
Beiträge: 349

Keine sorge, an deinem
PC liegt es nicht . ISt evt.
Irgendwo ein Counter?

____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"

Updatelösungen Siedler 5 Patch 1.06

Creators Update Lösung Windows 10 Siedler 5

Settlerman
#7
15.10.2017 16:07
Beiträge: 238

Wo soll denn da ein Counter sein? o.O

Lag an meinem Laptop, der PC kam damit klar.

warrior1024
#9
21.10.2017 11:35
Beiträge: 345

Der langsamste Befehl in deinem Skript müsste

AreEntitiesInArea( 1, 0, pos, 1500, 1)

sein, aber ein Aufruf sollte nicht 40 ms dauern.

Was passiert, wenn du auf PC und Laptop diese Zeile in den Debugger wirfst:

local t1 = XGUIEng.GetSystemTime(); for i  = 1, 1000 do AreEntitiesInArea( 1, 0, {X=0,Y=0}, 1500, 1) end; local t2 = XGUIEng.GetSystemTime(); LuaDebugger.Log(t2-t1)


Meldet sich mcbs Trigger-Fix schon bei dem Beispiel oder erst auf einer richtigen Karte?

Außerdem sollte das Skript im aktuellen Zustand nicht abspeicherbar sein, da _posTable und _troopTable in der Funktion im Trigger Upvalues sind, die nicht gespeichert werden.

Lösbar ist das ganze, indem du deine Parameter in einer globalen Variable speicherst:

S_AI_AttackWay.Data = {}
...
function S_AI_AttackWay.Init(_posT, _leaderIds)
    table.insert(S_AI_AttackWay.Data, {posT = _posT, leaderIds = _leaderIds})
end
function S_AI_AttackWay_Job()
    for k,v in pairs(S_AI_AttackWay.Data) do
        --Das, was du im Trigger machst mit _posTable = v.posT, _troopTable = v.leaderIds
    end
end



____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

mcb
#10
21.10.2017 12:30
Beiträge: 1472

Zeitmessungen mit aktivem Debugger sind nicht unbedingt Aussagekräftig, da der Debugger alle Lua-Operationen deutlich verlangsamt (und AreEntitiesInArea geht die Entities ein mal durch, um unfertige Gebäude auszuschließen).

Bei den Upvalues hab ich ihm schon erklärt, wie man das mit Parametern für die Trigger umgeht. Hat den Vorteil, das man keine globalen Variablen braucht

PS: Er hat auch schon geschrieben, das es an seinem Laptop lag, nicht an dem Script.

Seiten: 1

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

Impressum