Do not fire script triggers while the world is being destroyed

This commit is contained in:
Oliver Brakmann
2015-06-21 19:37:25 +02:00
parent e269a74b3e
commit fbd5938f3f
2 changed files with 49 additions and 0 deletions

View File

@@ -379,8 +379,12 @@ namespace OpenRA
} }
} }
public bool Disposing;
public void Dispose() public void Dispose()
{ {
Disposing = true;
frameEndActions.Clear(); frameEndActions.Clear();
// Dispose newer actors first, and the world actor last // Dispose newer actors first, and the world actor last

View File

@@ -59,6 +59,9 @@ namespace OpenRA.Mods.Common.Scripting
public void TickIdle(Actor self) public void TickIdle(Actor self)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnIdle]) foreach (var f in Triggers[Trigger.OnIdle])
{ {
try try
@@ -76,6 +79,9 @@ namespace OpenRA.Mods.Common.Scripting
public void Damaged(Actor self, AttackInfo e) public void Damaged(Actor self, AttackInfo e)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnDamaged]) foreach (var f in Triggers[Trigger.OnDamaged])
{ {
try try
@@ -94,6 +100,9 @@ namespace OpenRA.Mods.Common.Scripting
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)
{ {
if (world.Disposing)
return;
// Run Lua callbacks // Run Lua callbacks
foreach (var f in Triggers[Trigger.OnKilled]) foreach (var f in Triggers[Trigger.OnKilled])
{ {
@@ -116,6 +125,9 @@ namespace OpenRA.Mods.Common.Scripting
public void UnitProduced(Actor self, Actor other, CPos exit) public void UnitProduced(Actor self, Actor other, CPos exit)
{ {
if (world.Disposing)
return;
// Run Lua callbacks // Run Lua callbacks
foreach (var f in Triggers[Trigger.OnProduction]) foreach (var f in Triggers[Trigger.OnProduction])
{ {
@@ -138,6 +150,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnPlayerWon(Player player) public void OnPlayerWon(Player player)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnPlayerWon]) foreach (var f in Triggers[Trigger.OnPlayerWon])
{ {
try try
@@ -155,6 +170,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnPlayerLost(Player player) public void OnPlayerLost(Player player)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnPlayerLost]) foreach (var f in Triggers[Trigger.OnPlayerLost])
{ {
try try
@@ -172,6 +190,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnObjectiveAdded(Player player, int id) public void OnObjectiveAdded(Player player, int id)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnObjectiveAdded]) foreach (var f in Triggers[Trigger.OnObjectiveAdded])
{ {
try try
@@ -190,6 +211,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnObjectiveCompleted(Player player, int id) public void OnObjectiveCompleted(Player player, int id)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnObjectiveCompleted]) foreach (var f in Triggers[Trigger.OnObjectiveCompleted])
{ {
try try
@@ -208,6 +232,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnObjectiveFailed(Player player, int id) public void OnObjectiveFailed(Player player, int id)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnObjectiveFailed]) foreach (var f in Triggers[Trigger.OnObjectiveFailed])
{ {
try try
@@ -226,6 +253,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnCapture]) foreach (var f in Triggers[Trigger.OnCapture])
{ {
try try
@@ -249,6 +279,9 @@ namespace OpenRA.Mods.Common.Scripting
public void Infiltrated(Actor self, Actor infiltrator) public void Infiltrated(Actor self, Actor infiltrator)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnInfiltrated]) foreach (var f in Triggers[Trigger.OnInfiltrated])
{ {
try try
@@ -267,6 +300,9 @@ namespace OpenRA.Mods.Common.Scripting
public void AddedToWorld(Actor self) public void AddedToWorld(Actor self)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnAddedToWorld]) foreach (var f in Triggers[Trigger.OnAddedToWorld])
{ {
try try
@@ -284,6 +320,9 @@ namespace OpenRA.Mods.Common.Scripting
public void RemovedFromWorld(Actor self) public void RemovedFromWorld(Actor self)
{ {
if (world.Disposing)
return;
// Run Lua callbacks // Run Lua callbacks
foreach (var f in Triggers[Trigger.OnRemovedFromWorld]) foreach (var f in Triggers[Trigger.OnRemovedFromWorld])
{ {
@@ -305,6 +344,9 @@ namespace OpenRA.Mods.Common.Scripting
public void UnitProducedByOther(Actor self, Actor producee, Actor produced) public void UnitProducedByOther(Actor self, Actor producee, Actor produced)
{ {
if (world.Disposing)
return;
// Run Lua callbacks // Run Lua callbacks
foreach (var f in Triggers[Trigger.OnOtherProduction]) foreach (var f in Triggers[Trigger.OnOtherProduction])
{ {
@@ -327,6 +369,9 @@ namespace OpenRA.Mods.Common.Scripting
public void OnDiscovered(Actor self, Player discoverer, bool playNotification) public void OnDiscovered(Actor self, Player discoverer, bool playNotification)
{ {
if (world.Disposing)
return;
foreach (var f in Triggers[Trigger.OnDiscovered]) foreach (var f in Triggers[Trigger.OnDiscovered])
{ {
try try