/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /****************************************************************************** * * FILE * Toolkit_Triggers.cpp * * DESCRIPTION * Designer Toolkit for Mission Construction - Triggers Subset * * PROGRAMMER * Design Team * * VERSION INFO * $Author: Byon_g $ * $Revision: 5 $ * $Modtime: 11/29/01 11:05a $ * $Archive: /Commando/Code/Scripts/Toolkit_Triggers.cpp $ * ******************************************************************************/ #include "toolkit.h" /* Associated Custom Types: Trigger Activation/Deactivation Customs - Send 1 for On, 0 for Off: M00_CUSTOM_TRIGGER_ACTIVATE_ALL M00_CUSTOM_TRIGGER_ACTIVATE_KILLED M00_CUSTOM_TRIGGER_ACTIVATE_DESTROYED M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_ENTERED M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_EXITED M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_ENTERED_OR_EXITED M00_CUSTOM_TRIGGER_ACTIVATE_ENEMY_SEEN M00_CUSTOM_TRIGGER_ACTIVATE_DAMAGED M00_CUSTOM_TRIGGER_ACTIVATE_WAYPATH_COMPLETE M00_CUSTOM_TRIGGER_ACTIVATE_ANIMATION_COMPLETE M00_CUSTOM_TRIGGER_TIMER_EXPIRED */ /* Function - M00_Controller_Trigger_RMV This script handles all operations of triggers. Parameters: GameObject * obj = The object that is sending the trigger. GameObject * target = The target of the trigger. float time_lower_bound = A time fluctuator to delay activation. float time_upper_bound = A time fluctuator to delay activation. int custom_type = The type of the custom to send. int custom_param = The parameter of the custom to send. */ void M00_Controller_Trigger_RMV (GameObject * obj, GameObject * target, float time_lower_bound, float time_upper_bound, int custom_type, int custom_param) { if ((time_lower_bound == 0.0) && (time_upper_bound == 0.0)) { if (target) Commands->Send_Custom_Event(obj, target, custom_type, custom_param); } else if ((time_lower_bound != 0.0) && (time_upper_bound == 0.0)) { if (target) Commands->Send_Custom_Event(obj, target, custom_type, custom_param, time_lower_bound); } else if (time_upper_bound != 0.0) { float random_time = Commands->Get_Random(time_lower_bound, time_upper_bound); if (target) Commands->Send_Custom_Event(obj, target, custom_type, custom_param, random_time); } }; /* Editor Script - M00_Trigger_When_Killed_RMV This script triggers when the object it is attached to is killed. */ DECLARE_SCRIPT(M00_Trigger_When_Killed_RMV, "Start_Now=1:int, Receive_Type=1:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Debug_Mode=0:int") { bool script_enabled; bool debug_mode; REGISTER_VARIABLES() { SAVE_VARIABLE(script_enabled, 1); SAVE_VARIABLE(debug_mode, 2); } void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV DISABLED.\n")); } } void Killed(GameObject * obj, GameObject * killer) { int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (script_enabled) { SCRIPT_DEBUG_MESSAGE (("Unit killed with active M00_Trigger_When_Killed_RMV attached.\n")); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV found its target object.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_When_Killed_RMV could not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_KILLED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV ENABLED.\n")); script_enabled = true; } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Killed_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Destroyed_RMV This script triggers when the object it is attached to is destroyed. */ DECLARE_SCRIPT(M00_Trigger_When_Destroyed_RMV, "Start_Now=1:int, Receive_Type=2:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Debug_Mode=0:int") { bool script_enabled; bool debug_mode; REGISTER_VARIABLES() { SAVE_VARIABLE(script_enabled, 1); SAVE_VARIABLE(debug_mode, 2); } void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV DISABLED.\n")); } } void Destroyed(GameObject * obj) { int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (script_enabled) { SCRIPT_DEBUG_MESSAGE (("Unit destroyed with active M00_Trigger_When_Destroyed_RMV attached.\n")); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV found its target object.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_When_Destroyed_RMV could not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_DESTROYED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV ENABLED.\n")); script_enabled = true; } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Destroyed_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Created_RMV This script triggers when the object it is attached to is created. NOTE that this script has no ability to be enabled/disabled. */ DECLARE_SCRIPT(M00_Trigger_When_Created_RMV, "Target_ID:int, Send_Type:int, Send_Parameter:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Debug_Mode=0:int") { bool debug_mode; REGISTER_VARIABLES() { SAVE_VARIABLE(debug_mode, 1); } void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; SCRIPT_DEBUG_MESSAGE (("Unit created with active M00_Trigger_When_Created_RMV attached.\n")); int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Created_RMV found its target object.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_When_Created_RMV could not find its target object, id = %d!\n", target_id)); } } }; /* Editor Script - M00_Trigger_Zone_Entered_RMV This script triggers when the zone it is attached to is entered. Parameters: Trigger_Count = How many times this trigger will fire. Triggerer = Who can activate this trigger. Special Information: Values for Triggerer: 0 = Anyone, 1 = Commando Only, 2 = Non-Commando only Values for Trigger_Count: Enter 0 for infinite triggering. */ DECLARE_SCRIPT(M00_Trigger_Zone_Entered_RMV, "Start_Now=1:int, Receive_Type=3:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Triggerer=0:int, Debug_Mode=0:int") { bool script_enabled; bool debug_mode; int trigger_count; typedef enum { ANYONE, COMMANDO, NONCOMMANDO } EntererType; EntererType allowed; REGISTER_VARIABLES() { SAVE_VARIABLE(script_enabled, 1); SAVE_VARIABLE(debug_mode, 2); SAVE_VARIABLE(trigger_count, 3); SAVE_VARIABLE(allowed, 4); } void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV DISABLED.\n")); } } void Entered(GameObject * obj, GameObject * enterer) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Zone entered with active M00_Trigger_Zone_Entered_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); int who = Get_Int_Parameter("Triggerer"); switch (who) { case (0): { allowed = ANYONE; break; } case (1): { allowed = COMMANDO; break; } case (2): { allowed = NONCOMMANDO; break; } } GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV found its target object.\n")); if ((allowed == COMMANDO) && (enterer == Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if ((allowed == NONCOMMANDO) && (enterer != Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if (allowed == ANYONE) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_Zone_Entered_RMV did not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_ENTERED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_Zone_Exited_RMV This script triggers when the zone it is attached to is exited. Parameters: Trigger_Count = How many times this trigger will fire. Triggerer = Who can activate this trigger. Special Information: Values for Triggerer: 0 = Anyone, 1 = Commando Only, 2 = Non-Commando only Values for Trigger_Count: Enter 0 for infinite triggering. */ DECLARE_SCRIPT(M00_Trigger_Zone_Exited_RMV, "Start_Now=1:int, Receive_Type=4:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Triggerer=0:int, Debug_Mode=0:int") { bool script_enabled; bool debug_mode; int trigger_count; typedef enum { ANYONE, COMMANDO, NONCOMMANDO } EntererType; EntererType allowed; REGISTER_VARIABLES() { SAVE_VARIABLE(script_enabled, 1); SAVE_VARIABLE(debug_mode, 2); SAVE_VARIABLE(trigger_count, 3); SAVE_VARIABLE(allowed, 4); } void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV DISABLED.\n")); } } void Exited(GameObject * obj, GameObject * enterer) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Zone exited with active M00_Trigger_Zone_Exited_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); int who = Get_Int_Parameter("Triggerer"); switch (who) { case (0): { allowed = ANYONE; break; } case (1): { allowed = COMMANDO; break; } case (2): { allowed = NONCOMMANDO; break; } } GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV found its target object.\n")); if ((allowed == COMMANDO) && (enterer == Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if ((allowed == NONCOMMANDO) && (enterer != Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if (allowed == ANYONE) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_Zone_Exited_RMV could not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_ENTERED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Exited_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_Zone_Entered_Or_Exited_RMV This script triggers when the zone it is attached to is entered or exited. Parameters: Trigger_Count = How many times this trigger will fire. Triggerer = Who can activate this trigger. Special Information: Values for Triggerer: 0 = Anyone, 1 = Commando Only, 2 = Non-Commando only Values for Trigger_Count: Enter 0 for infinite triggering. */ DECLARE_SCRIPT(M00_Trigger_Zone_Entered_Or_Exited_RMV, "Start_Now=1:int, Receive_Type=5:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Triggerer=0:int, Debug_Mode=0:int") { bool script_enabled; bool debug_mode; int trigger_count; typedef enum { ANYONE, COMMANDO, NONCOMMANDO } EntererType; EntererType allowed; void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV DISABLED.\n")); } } void Exited(GameObject * obj, GameObject * enterer) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Zone exited with active M00_Trigger_Zone_Entered_Or_Exited_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); int who = Get_Int_Parameter("Triggerer"); switch (who) { case (0): { allowed = ANYONE; break; } case (1): { allowed = COMMANDO; break; } case (2): { allowed = NONCOMMANDO; break; } } GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV found its target object.\n")); if ((allowed == COMMANDO) && (enterer == Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if ((allowed == NONCOMMANDO) && (enterer != Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if (allowed == ANYONE) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_Zone_Entered_Or_Exited_RMV did not find its target object, id = %d!\n", target_id)); } } } void Entered(GameObject * obj, GameObject * enterer) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Zone entered with active M00_Trigger_Zone_Entered_Or_Exited_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); int who = Get_Int_Parameter("Triggerer"); switch (who) { case (0): { allowed = ANYONE; break; } case (1): { allowed = COMMANDO; break; } case (2): { allowed = NONCOMMANDO; break; } } GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV found its target object.\n")); if ((allowed == COMMANDO) && (enterer == Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if ((allowed == NONCOMMANDO) && (enterer != Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)))) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else if (allowed == ANYONE) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV triggered properly.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_Zone_Entered_Or_Exited_RMV could not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ZONE_ENTERED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_Zone_Entered_Or_Exited_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Enemy_Seen_RMV This script triggers when an enemy is seen. Parameters: Trigger_Count = How many times this trigger will fire. Enter 0 for infinite. */ DECLARE_SCRIPT(M00_Trigger_When_Enemy_Seen_RMV, "Start_Now=1:int, Receive_Type=6:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Parameter:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Debug_Mode=0:int") { bool script_enabled; int trigger_count; bool debug_mode; void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV DISABLED.\n")); } } void Enemy_Seen(GameObject * obj, GameObject * enemy) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Enemy seen by unit with active M00_Trigger_When_Enemy_Seen_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV has found its target object.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_When_Enemy_Seen_RMV could not find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ENEMY_SEEN) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Enemy_Seen_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Damaged_RMV This script triggers when the unit is damaged. Parameters: Trigger_Count = How many times this will trigger. */ DECLARE_SCRIPT(M00_Trigger_When_Damaged_RMV, "Start_Now=1:int, Receive_Type=7:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Debug_Mode=0:int") { bool script_enabled; int trigger_count; bool debug_mode; void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV DISABLED.\n")); } } void Damaged(GameObject * obj, GameObject * damager, float amount) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE (("Unit damaged with active M00_Trigger_When_Damaged_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV found the target object.\n")); M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } else { SCRIPT_DEBUG_MESSAGE (("ERROR - M00_Trigger_When_Damaged_RMV could not find the target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV received custom type %d,param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_DAMAGED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE (("M00_Trigger_When_Damaged_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Action_Complete_RMV This script triggers when the unit completes any action. It is designed to respond to a particular Action ID. Parameters: Trigger_Count = How many times this will trigger. */ DECLARE_SCRIPT(M00_Trigger_When_Action_Complete_RMV, "Start_Now=1:int, Receive_Type=8:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Action_ID:int, Trigger_Count=0:int, Debug_Mode=0:int") { bool script_enabled; int trigger_count; bool debug_mode; void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV_ENABLED.\n")); } else { script_enabled = false; SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV DISABLED.\n")); } } void Action_Complete(GameObject * obj, int action_id) { if (script_enabled) { if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE(("Action complete by unit with active M00_Trigger_When_Action_Complete_RMV attached.\n")); trigger_count--; SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV found its target object.\n")); if (action_id == Get_Int_Parameter("Action_ID")) { M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE(("ERROR - M00_Trigger_When_Action_Complete_RMV cannot find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ACTION_COMPLETE) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Action_Complete_RMV DISABLED.\n")); script_enabled = false; } } } }; /* Editor Script - M00_Trigger_When_Animation_Complete_RMV This script triggers when the unit completes an animation. Parameters: Animation_Name = The name of the animation that is completing. Trigger_Count = How many times this will trigger. */ DECLARE_SCRIPT(M00_Trigger_When_Animation_Complete_RMV, "Start_Now=1:int, Receive_Type=9:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Target_ID:int, Animation_Name:string, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Trigger_Count=0:int, Debug_Mode=0:int") { bool script_enabled; int trigger_count; bool debug_mode; void Created(GameObject * obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; trigger_count = Get_Int_Parameter("Trigger_Count"); if (Get_Int_Parameter("Start_Now")) { script_enabled = true; SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV ENABLED.\n")); } else { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV DISABLED.\n")); script_enabled = false; } } void Animation_Complete(GameObject * obj, const char * name) { if (script_enabled) { SCRIPT_DEBUG_MESSAGE(("Animation complete by unit with active M00_Trigger_When_Animation_Complete_RMV attached.\n")); if (trigger_count == 1) { script_enabled = false; } if (trigger_count > 0) { trigger_count--; SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV has %d triggers remaining.\n", trigger_count)); } int target_id = Get_Int_Parameter("Target_ID"); float time_low = Get_Float_Parameter("Min_Delay"); float time_up = Get_Float_Parameter("Max_Delay"); int param = Get_Int_Parameter("Send_Param"); int type = Get_Int_Parameter("Send_Type"); const char *anim = Get_Parameter("Animation_Name"); GameObject *target = Commands->Get_A_Star(Vector3(0.0f,0.0f,0.0f)); if (target_id > 0) { target = Commands->Find_Object(target_id); } if (target) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV found its target object.\n")); if (stricmp(anim, name)) { M00_Controller_Trigger_RMV(obj, target, time_low, time_up, type, param); } } else { SCRIPT_DEBUG_MESSAGE(("ERROR - M00_Trigger_When_Animation_Complete_RMV cannot find its target object, id = %d!\n", target_id)); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_ACTIVATE_ANIMATION_COMPLETE) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV ENABLED.\n")); script_enabled = true; trigger_count = Get_Int_Parameter("Trigger_Count"); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_When_Animation_Complete_RMV DISABLED.\n")); script_enabled = false; } } } }; DECLARE_SCRIPT(M00_Trigger_Timer_Expired_RAD, "Start_Now=0:int, Receive_Type=15:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Timer_Min=0.0:float, Timer_Max=1.0:float, Trigger_Count=0:int, Target_ID:int, Send_Type:int, Send_Param:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Debug_Mode=0:int") { bool debug_mode; bool script_active; int trigger_count; void Created(GameObject* obj) { script_active = false; debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; if (Get_Int_Parameter("Start_Now")) { Start_Now(obj); } } void Start_Now(GameObject* obj) { script_active = true; trigger_count = Get_Int_Parameter("Trigger_Count"); if (trigger_count <= 0) { trigger_count = -1; } SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD ENABLED.\n")); Set_Timer(obj); } void Set_Timer(GameObject* obj) { float timer_min; float timer_max; float timer_value; timer_min = Get_Float_Parameter("Timer_Min"); timer_max = Get_Float_Parameter("Timer_Max"); if (timer_max > timer_min) { timer_value = Commands->Get_Random(timer_min, timer_max); } else { timer_value = timer_min; } SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD is starting the timer.\n")); Commands->Start_Timer (obj, this, timer_value, M00_TIMER_TRIGGER_EXPIRED); } void Timer_Expired (GameObject * obj, int timer_id) { SCRIPT_DEBUG_MESSAGE(("A timer has expired on M00_Trigger_Timer_Expired_RAD.\n")); if (script_active) { if (trigger_count > 0) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD has %d triggers remaining.\n", trigger_count)); trigger_count--; } if (trigger_count) { GameObject* target_obj; int target_id; int min_delay; int max_delay; int delay_value; target_id = Get_Int_Parameter("Target_ID"); if (timer_id == M00_TIMER_TRIGGER_EXPIRED) { target_obj = Commands->Find_Object(target_id); if (target_obj) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD found its target object.\n")); min_delay = Get_Float_Parameter("Min_Delay"); max_delay = Get_Float_Parameter("Max_Delay"); if (max_delay > min_delay) { delay_value = Commands->Get_Random(min_delay, max_delay); } else { delay_value = min_delay; } Commands->Send_Custom_Event (obj, target_obj, Get_Int_Parameter("Send_Type"), Get_Int_Parameter("Send_Param"), delay_value); } } else { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD cannot find its target object, id = %d!\n", target_id)); } Set_Timer(obj); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD received custom type %d, param %d.\n", type, param)); if ((type == M00_CUSTOM_TRIGGER_ACTIVATE_ALL) || (type == M00_CUSTOM_TRIGGER_TIMER_EXPIRED) || (type == Get_Int_Parameter("Receive_Type"))) { if (param == Get_Int_Parameter("Receive_Param_On")) { script_active = true; trigger_count = Get_Int_Parameter("Trigger_Count"); Start_Now(obj); } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_Timer_Expired_RAD DISABLED.\n")); script_active = false; } } } }; /* Custom Parameter Settings: 0 = Turn this state sequence off. -1 = Advance to the next state. 1+ = Adjust to this particular numbered state. */ DECLARE_SCRIPT(M00_Trigger_State_Sequence_RAD, "Start_Now=0:int, Receive_Type:int, Num_States=2:int, Loop_States=0:int, Send_Type:int, Target_ID:int, Min_Delay=0.0:float, Max_Delay=0.0:float, Debug_Mode=0:int") { int state_num; bool debug_mode; void Created(GameObject* obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; state_num = 1; if (Get_Int_Parameter("Start_Now")) { Send_Custom(obj); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_State_Sequence_RAD received custom type %d, param %d.\n", type, param)); if (type == Get_Int_Parameter("Receive_Type")) { if (param < 0) { // Advance to the next state. state_num++; if (state_num > Get_Int_Parameter("Num_States")) { if (Get_Int_Parameter("Loop_States")) { state_num = 1; } else { state_num = 0; } } Send_Custom(obj); } if (param > 0) { // Adjust to this numbered state. state_num = param; if (state_num > Get_Int_Parameter("Num_States")) { if (Get_Int_Parameter("Loop_States")) { state_num = 1; } else { state_num = 0; } } Send_Custom(obj); } if (!param) { // Turn this state engine off. state_num = 0; } } } void Send_Custom(GameObject* obj) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_State_Sequence_RAD is sending its state custom.\n")); GameObject* target_obj; int target_id; float min_delay; float max_delay; float delay_value; if (state_num) { target_id = Get_Int_Parameter("Target_ID"); target_obj = Commands->Find_Object(target_id); if (target_obj) { SCRIPT_DEBUG_MESSAGE(("M00_Trigger_State_Sequence_RAD found its target object.\n")); min_delay = Get_Float_Parameter("Min_Delay"); max_delay = Get_Float_Parameter("Max_Delay"); if (max_delay > min_delay) { delay_value = Commands->Get_Random(min_delay, max_delay); } else { delay_value = min_delay; } Commands->Send_Custom_Event (obj, target_obj, Get_Int_Parameter("Send_Type"), state_num, delay_value); } else { SCRIPT_DEBUG_MESSAGE(("ERROR - M00_Trigger_State_Sequence_RAD could not find its target object, id = %d!\n", target_id)); } } } };