Added ability to fire trigger only once (VOLATILE). It's a good thing I did because it exposed an issue with the merge trigger function. The old code was allowing a trigger to exist more than once in the various lists (eg. LogicTriggers), causing major issues when a temporary (VOLATILE) trigger got sprung. This is resolved.

This commit is contained in:
nev6502
2020-06-21 14:51:56 -06:00
parent 2b0c6f4157
commit 569c925c04
2 changed files with 102 additions and 8 deletions
+93 -8
View File
@@ -2643,8 +2643,7 @@
TriggerTypeClass* this_trigger_type = new TriggerTypeClass();
this_trigger_type->House = (HousesType)houseType;
this_trigger_type->IsActive = 1;
this_trigger_type->IsPersistant = TriggerTypeClass::PERSISTANT;
this_trigger_type->IsPersistant = TriggerTypeClass::VOLATILE;
this_trigger_type->Event1 = TEVENT_BUILDING_EXISTS;
this_trigger_type->EventControl = MULTI_ONLY;
this_trigger_type->Event1.Data.Value = buildingType;
@@ -2857,24 +2856,43 @@
int mergeTriggerIndex = lua_tointeger(L, 2);
TriggerClass* resulting_trigger = Triggers.Ptr(triggerIndex);
TriggerTypeClass* resulting_trigger_type = resulting_trigger->Class;
TriggerClass* merge_trigger = Triggers.Ptr(mergeTriggerIndex);
if (resulting_trigger != NULL && merge_trigger != NULL) {
// Set event 2 to event 1 of the merge trigger
resulting_trigger->Class->Event2 = merge_trigger->Class->Event1;
resulting_trigger_type->Event2.Event = (TEventType)merge_trigger->Class->Event1.Event;
resulting_trigger_type->Event2.Data.Value = (long)merge_trigger->Class->Event1.Data.Value;
resulting_trigger_type->Event2.Team = (TeamTypeClass*)merge_trigger->Class->Event1.Team;
// Make this an "AND" coniditional trigger (event 1 AND event 2)
resulting_trigger->Class->EventControl = MULTI_AND;
resulting_trigger->Class->ActionControl = MULTI_ONLY;
// TODO: only do these individual cleanups for actions that they represent (for efficiency)
// Now switch over any LogicTrigger references (we're getting rid of the second trigger)
for (int t_index = 0; t_index < LogicTriggers.Count(); t_index++) {
TriggerClass* _trigger = LogicTriggers[t_index];
if (_trigger == merge_trigger) {
LogicTriggers[t_index] = resulting_trigger;
LogicTriggers.Delete(t_index);
bool find_existing_result;
for (int t2_index = 0; t2_index < LogicTriggers.Count(); t2_index++) {
if (LogicTriggers[t2_index] == resulting_trigger) {
find_existing_result = true;
break;
}
}
if (!find_existing_result) {
LogicTriggers.Add(resulting_trigger);
}
break;
}
}
@@ -2885,7 +2903,21 @@
if (_trigger != NULL) {
if (_trigger == merge_trigger) {
MapTriggers[t_index] = resulting_trigger;
MapTriggers.Delete(t_index);
bool find_existing_result;
for (int t2_index = 0; t2_index < MapTriggers.Count(); t2_index++) {
if (MapTriggers[t2_index] == resulting_trigger) {
find_existing_result = true;
break;
}
}
if (!find_existing_result) {
MapTriggers.Add(resulting_trigger);
}
break;
}
}
@@ -2899,7 +2931,21 @@
if(_trigger != NULL){
if (_trigger == merge_trigger) {
HouseTriggers[h_index][t_index] = resulting_trigger;
HouseTriggers[h_index].Delete(t_index);
bool find_existing_result;
for (int t2_index = 0; t2_index < HouseTriggers[h_index].Count(); t2_index++) {
if (HouseTriggers[h_index][t2_index] == resulting_trigger) {
find_existing_result = true;
break;
}
}
if (!find_existing_result) {
HouseTriggers[h_index].Add(resulting_trigger);
}
break;
}
}
@@ -2915,15 +2961,17 @@
}
}
//TriggerClass* Editor_trigger = Triggers.Ptr(0);
//TriggerTypeClass* Editor_trigger_type = Editor_trigger->Class;
// Now that we've merged the contents, and it's no longer being referred to, we can safely delete the merge trigger
Detach_This_From_All(merge_trigger->As_Target());
delete merge_trigger;
}
return 1;
}
/***********************************************************************************************
* Script_GetTriggerByName - Gets the trigger with a given name *
* *
@@ -2967,6 +3015,42 @@
return -1;
}
/***********************************************************************************************
* Script_TriggerSetPersistence - Sets whether a trigger runs once or indefinitely *
* *
* SCRIPT INPUT: triggerIndex (int) - The trigger ID of which this will apply *
* isPersistent (int) - The persistence value *
* *
* SCRIPT OUTPUT: void *
* *
* INPUT: lua_State - The current Lua state *
* *
* OUTPUT: int; Did the function run successfully? Return 1 *
* *
* WARNINGS: ? *
* *
*=============================================================================================*/
static int Script_TriggerSetPersistence(lua_State* L) {
int triggerIndex = lua_tointeger(L, 1);
unsigned char isPersistent = lua_tointeger(L, 2);
TriggerClass* trigger = Triggers.Ptr(triggerIndex);
if (trigger != NULL) {
TriggerTypeClass* trigger_type = trigger->Class;
trigger_type->IsPersistant = (TriggerTypeClass::PersistantType)isPersistent;
}
return -1;
}
/**********************************************************************************************
* Mission Utility Functions *
*=============================================================================================*/
@@ -4169,6 +4253,7 @@
lua_register(L, "GetCellObject", Script_GetCellObject); // Gets an object (ID - building/vehicle/aircraft/infantry/vessel), if any, at [Cell/X],[Cell/Y]
lua_register(L, "MergeTriggers", Script_MergeTriggers); // Combines the events of two triggers (for multi-event triggers :)
lua_register(L, "GetTriggerByName", Script_GetTriggerByName); // Gets the ID of the trigger with a given name
lua_register(L, "TriggerSetPersistence", Script_TriggerSetPersistence); // Does a trigger go on and on or just run once?
/**********************************************************************************************
* Mission Utility Functions *
+9
View File
@@ -185,3 +185,12 @@
TARGET_TYPE_BASE_THREATS=9
TARGET_TYPE_POWER=10
TARGET_TYPE_FAKE_BUILDINGS=11
-- *********************************************************
-- * *
-- * Trigger persistance *
-- * *
-- *********************************************************
TRIGGER_VOLATILE=0
TRIGGER_SEMI_PERSISTENT=1
TRIGGER_PERSISTENT=2