forked from Mirrors/openclonk
Add sequence triggers: Interval and object count in container
parent
e6c483953a
commit
7e87b62e3e
|
@ -361,6 +361,12 @@ public func Definition(def)
|
|||
ID = { Name="$ID$", EditorHelp="$IDHelp$", Type="def", Set="SetTriggerID", SetRoot=true },
|
||||
Radius = { Type="circle", Color=0xff8000, Relative=true, Set="SetTriggerRadius", SetRoot=true }
|
||||
} } },
|
||||
{ Name="$ObjectCountInContainer$", EditorHelp="$ObjectCountInContainerHelp$", Value={ Trigger="contained_object_count", Count=1 }, Delegate={ Name="$ObjectCountInContainer$", EditorHelp="$ObjectCountInContainerHelp$", Type="proplist", EditorProps = {
|
||||
Container = { Name="$Container$", EditorHelp="$CountContainerHelp$", Type="object" },
|
||||
ID = { Name="$ID$", EditorHelp="$CountIDHelp$", Type="def", EmptyName="$AnyID$" },
|
||||
Count = { Name="$Count$", Type="int", Min=1 }
|
||||
} } },
|
||||
{ Name="$Interval$", EditorHelp="$IntervalHelp$", Value={ Trigger="interval", Interval=60 }, ValueKey="Interval", Delegate={ Name="$IntervalTime$", Type="int", Min=1, Set="SetIntervalTimer", SetRoot=true } },
|
||||
{ Name="$GameStart$", Value={ Trigger="game_start" } },
|
||||
{ Name="$PlayerJoin$", Value={ Trigger="player_join" } },
|
||||
{ Name="$PlayerRemove$", Value={ Trigger="player_remove" } },
|
||||
|
@ -384,11 +390,7 @@ public func SetTrigger(proplist new_trigger)
|
|||
{
|
||||
trigger = new_trigger;
|
||||
// Set trigger: Restart any specific trigger timers
|
||||
if (active && !finished)
|
||||
{
|
||||
StopTrigger();
|
||||
StartTrigger();
|
||||
}
|
||||
if (active && !finished) StartTrigger();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -488,6 +490,14 @@ public func StartTrigger()
|
|||
this.search_mask = Find_And(Find_Distance(trigger.Radius), Find_OCF(OCF_Alive), Find_Func("IsClonk"), id_search);
|
||||
AddTimer(this.EnterRegionTimer, check_interval);
|
||||
}
|
||||
else if (fn == "contained_object_count")
|
||||
{
|
||||
AddTimer(this.CountContainedObjectsTimer, check_interval);
|
||||
}
|
||||
else if (fn == "interval")
|
||||
{
|
||||
AddTimer(this.OnTrigger, trigger.Interval);
|
||||
}
|
||||
else return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -497,6 +507,8 @@ public func StopTrigger()
|
|||
SetGraphics();
|
||||
// Remove any timers that may have been added
|
||||
RemoveTimer(this.EnterRegionTimer);
|
||||
RemoveTimer(this.CountContainedObjectsTimer);
|
||||
RemoveTimer(this.OnTrigger);
|
||||
trigger_started = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -507,6 +519,12 @@ public func SetCheckInterval(new_interval)
|
|||
return SetTrigger(trigger); // restart trigger
|
||||
}
|
||||
|
||||
public func SetIntervalTimer(int new_interval)
|
||||
{
|
||||
if (trigger) trigger.Interval = new_interval;
|
||||
return SetTrigger(trigger); // restart trigger
|
||||
}
|
||||
|
||||
private func EnterRegionTimer()
|
||||
{
|
||||
for (var clonk in FindObjects(this.search_mask))
|
||||
|
@ -517,6 +535,14 @@ private func EnterRegionTimer()
|
|||
}
|
||||
}
|
||||
|
||||
private func CountContainedObjectsTimer()
|
||||
{
|
||||
if (trigger.Container && trigger.Container->ContentsCount(trigger.ID) >= trigger.Count)
|
||||
{
|
||||
OnTrigger(nil, NO_OWNER);
|
||||
}
|
||||
}
|
||||
|
||||
public func OnTrigger(object triggering_clonk, int triggering_player, bool is_editor_test)
|
||||
{
|
||||
// Editor test: Triggered by first player
|
||||
|
|
|
@ -29,3 +29,13 @@ ObjectEnterRegionCircle=Objektyp in Bereich (Radius)
|
|||
Condition=Bedingung
|
||||
CheckInterval=Pruefintervall
|
||||
CheckIntervalHelp=Gibt das Intervall in Frames an, in dem die Bedingung ueberprueft wird.
|
||||
ObjectCountInContainer=Objektzahl in Container
|
||||
ObjectCountInContainerHelp=Wird ausgeloest, wenn eine bestimmte Anzahl von Objekten in einem Inhaltsobjekt vorhanden sind. Zum Beispiel wenn der Spieler 20 Kristalle in eine Truhe gelegt hat.
|
||||
Container=Container
|
||||
CountContainerHelp=Inhaltsobjekt, in dem Objekte gezaehlt werden.
|
||||
CountIDHelp=Objekttyp der gezaehlt wird.
|
||||
AnyID=Beliebig
|
||||
Count=Anzahl
|
||||
Interval=Intervall
|
||||
IntervalHelp=Sequenz wird in regelmaessigem Abstand ausgefuehrt. Der Parameter gibt das Interval in Frames an.
|
||||
IntervalTime=Anzahl Frames zwischen zwei Ausloesungen.
|
||||
|
|
|
@ -28,4 +28,14 @@ IDHelp=Definition of object type that triggers this sequence. If nil, any object
|
|||
ObjectEnterRegionCircle=Object of type enters radius
|
||||
Condition=Condition
|
||||
CheckInterval=Check interval
|
||||
CheckIntervalHelp=Defines the interval in frames at which the condition ist checked.
|
||||
CheckIntervalHelp=Defines the interval in frames at which the condition ist checked.ObjectCountInContainer=Objektzahl in Container
|
||||
ObjectCountInContainer=Object count in container
|
||||
ObjectCountInContainerHelp=Triggered when a minimum number of objects is found in a container. This could for example be when the player put 20 diamonds into a chest.
|
||||
Container=Container
|
||||
CountContainerHelp=Container within which objects are counted.
|
||||
CountIDHelp=Type of object to be counted.
|
||||
AnyID=Any
|
||||
Count=Number
|
||||
Interval=Interval
|
||||
IntervalHelp=Sequence will be executed in regular interval. The parameter defines the interval in frames.
|
||||
IntervalTime=Number of frames between executions.
|
Loading…
Reference in New Issue