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.
Der_Deutsche
|
#8 19.10.2017 16:57 Beiträge: 349 |
Hmm...
____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"
Updatelösungen Siedler 5 Patch 1.06
Creators Update Lösung Windows 10
Siedler 5
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