

function openDoor()
{
level.door = GetEnt("door", "targetname");
level.trig1 = GetEnt("trigger1", "targetname");
level.trig2 = GetEnt("trigger2", "targetname");
level.trig3 = GetEnt("trigger3", "targetname");
level.doorClip = GetEnt("door_clip", "targetname");
level.buttonsNeeded = 3;
level.buttonsPressed = 0;
thread Trig1();
thread Trig2();
thread Trig3();
}
function Trig1()
{
while(1)
{
level.trig1 waittill("trigger", player);
level.buttonsPressed++;
level.trig1 Delete();
CheckDoor();
break;
}
}
function Trig2()
{
while(1)
{
level.trig2 waittill("trigger", player);
level.buttonsPressed++;
level.trig2 Delete();
CheckDoor();
break;
}
}
function Trig3()
{
while(1)
{
level.trig3 waittill("trigger", player);
level.buttonsPressed++;
level.trig3 Delete();
CheckDoor();
break;
}
}
function CheckDoor()
{
if(level.buttonsPressed == level.buttonsNeeded)
{
level.door Delete();
level.doorClip Delete();
}
}
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
You would have to make sure that the door is either a script model or a script brushmodel and is named "door" for its target name and each of the triggers are named "trigger1", "trigger2", and "trigger3" in the targetname.
function openDoor()
{
level.door = GetEnt("door", "targetname");//I personally would pass the door, and not use a level var
// level.trig1 = GetEnt("trigger1", "targetname");
// level.trig2 = GetEnt("trigger2", "targetname");
// level.trig3 = GetEnt("trigger3", "targetname");
//instead of three level trigs above give them all the same targetname and do this
trigs = GetEntArray("triggers","targetname");
level.doorClip = GetEnt("door_clip", "targetname");//I personally would set the clip as the doors target and not use level var
//need to disconnect paths on the door so zombies don't try to go through
level.doorClip DisconnectPaths();//may not see this issue if no other way in that area
level.buttonsNeeded = trigs.size;//set this to the number of trigs by using array size
// level.buttonsPressed = 0;//we can comment this out and just use buttons needed and subtract
// thread Trig1();
// thread Trig2();
// thread Trig3();
//instead of threading the same function with a different name on each different trigger
//you can thread on the array, or iterate the array and thread on each trigger
//iterate method:
foreach(trig in trigs)
{
trig thread Trig1();//I personally would pass the door, and not use a level var
}
//thread_all method:
// array::thread_all(trigs, &Trig1);//this method requires adding #using scripts\shared\array_shared; to top
}
function Trig1()//I personally would pass the door, and not use a level var
{
//you should set the hint here
self SetCursorHint("HINT_NOICON");
self SetHintString("Press [{+activate}] to...");
// while(1)//no need for a while loop when you are breaking unconditionally
// {
self waittill("trigger", player);//self is the trigger, and player isn't used, so not really needed
level.buttonsPressed--;//subtract so we can check < 0 later
self Delete();//self delete
CheckDoor();
// break;
// }
}
//no need for multiple functions that do the same function
// function Trig2()
// {
// while(1)
// {
// level.trig2 waittill("trigger", player);
// level.buttonsPressed++;
// level.trig2 Delete();
// CheckDoor();
// break;
// }
// }
// function Trig3()
// {
// while(1)
// {
// level.trig3 waittill("trigger", player);
// level.buttonsPressed++;
// level.trig3 Delete();
// CheckDoor();
// break;
// }
// }
function CheckDoor()//I personally would pass the door, and not use a level var
{
// if(level.buttonsPressed >= level.buttonsNeeded)//check if >= instead of == just incase something bugs
if(level.buttonsNeeded<=0)//changed this to check for less than 0 since now we will subtract
{
level.doorClip ConnectPaths();
level.door Delete();
level.doorClip Delete();
//when you open a door, you'll need to connect the paths, which means you should disconnect the paths first
}
}
function openDoor()
{
trigs = GetEntArray("triggers","targetname");
level.buttonsNeeded = trigs.size;
door = GetEnt("door", "targetname");
doorClip = GetEnt("door_clip", "targetname");//I personally would set the clip as the doors target and not use level var
doorClip DisconnectPaths();
foreach(trig in trigs)
{
trig thread Trig1(door, doorClip);
}
}
function Trig1(door, doorClip)
{
self SetCursorHint("HINT_NOICON");
self SetHintString("Press [{+activate}] to...");
self waittill("trigger", player);
level.buttonsPressed--;
self Delete();
CheckDoor(door, doorClip);
}
function CheckDoor(door, doorClip)
{
if(level.buttonsNeeded<=0)
{
doorClip ConnectPaths();
door Delete();
doorClip Delete();
}
}
Some people get offended by this, but please know I mean no offense:
Here are some tips to clean up your code, make it more readable, and dynamic:function openDoor()
{
level.door = GetEnt("door", "targetname");//I personally would pass the door, and not use a level var
// level.trig1 = GetEnt("trigger1", "targetname");
// level.trig2 = GetEnt("trigger2", "targetname");
// level.trig3 = GetEnt("trigger3", "targetname");
//instead of three level trigs above give them all the same targetname and do this
trigs = GetEntArray("triggers","targetname");
level.doorClip = GetEnt("door_clip", "targetname");//I personally would set the clip as the doors target and not use level var
//need to disconnect paths on the door so zombies don't try to go through
level.doorClip DisconnectPaths();//may not see this issue if no other way in that area
level.buttonsNeeded = trigs.size;//set this to the number of trigs by using array size
// level.buttonsPressed = 0;//we can comment this out and just use buttons needed and subtract
// thread Trig1();
// thread Trig2();
// thread Trig3();
//instead of threading the same function with a different name on each different trigger
//you can thread on the array, or iterate the array and thread on each trigger
//iterate method:
foreach(trig in trigs)
{
trig thread Trig1();//I personally would pass the door, and not use a level var
}
//thread_all method:
// array::thread_all(trigs, &Trig1);//this method requires adding #using scripts\shared\array_shared; to top
}
function Trig1()//I personally would pass the door, and not use a level var
{
//you should set the hint here
self SetCursorHint("HINT_NOICON");
self SetHintString("Press [{+activate}] to...");
// while(1)//no need for a while loop when you are breaking unconditionally
// {
self waittill("trigger", player);//self is the trigger, and player isn't used, so not really needed
level.buttonsPressed--;//subtract so we can check < 0 later
self Delete();//self delete
CheckDoor();
// break;
// }
}
//no need for multiple functions that do the same function
// function Trig2()
// {
// while(1)
// {
// level.trig2 waittill("trigger", player);
// level.buttonsPressed++;
// level.trig2 Delete();
// CheckDoor();
// break;
// }
// }
// function Trig3()
// {
// while(1)
// {
// level.trig3 waittill("trigger", player);
// level.buttonsPressed++;
// level.trig3 Delete();
// CheckDoor();
// break;
// }
// }
function CheckDoor()//I personally would pass the door, and not use a level var
{
// if(level.buttonsPressed >= level.buttonsNeeded)//check if >= instead of == just incase something bugs
if(level.buttonsNeeded<=0)//changed this to check for less than 0 since now we will subtract
{
level.doorClip ConnectPaths();
level.door Delete();
level.doorClip Delete();
//when you open a door, you'll need to connect the paths, which means you should disconnect the paths first
}
}
Here is the code cleaned up. I would also set the doors as the target of the triggers and make some more tweaks, but this is cleaner and you can add as many triggers as you want this way: (sorry for any typos or errors, didn't test)
function openDoor()
{
trigs = GetEntArray("triggers","targetname");
level.buttonsNeeded = trigs.size;
door = GetEnt("door", "targetname");
doorClip = GetEnt("door_clip", "targetname");//I personally would set the clip as the doors target and not use level var
doorClip DisconnectPaths();
foreach(trig in trigs)
{
trig thread Trig1(door, doorClip);
}
}
function Trig1(door, doorClip)
{
self SetCursorHint("HINT_NOICON");
self SetHintString("Press [{+activate}] to...");
self waittill("trigger", player);
level.buttonsPressed--;
self Delete();
CheckDoor(door, doorClip);
}
function CheckDoor(door, doorClip)
{
if(level.buttonsNeeded<=0)
{
doorClip ConnectPaths();
door Delete();
doorClip Delete();
}
}
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
What am i doing wrong all my trigger are set and linked to the door but still say not available
Anytime that happens, the script is not running, or the kvps are wrong, or get ent is being used when you have multiple of a kvp.
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
Right so ive used your cleaned up version and put scriptparsetree,scripts/zm/Trigger_door.gsc in my zone folder and your script in scripts/zm/Trigger_door.gsc. is that right? Then my triggers targetname's as trigger and target as door.
target name of the script brush model as door. Something is wrong but i can't figure out what sorry im new ish to modding
Did you call or thread the function openDoor anywhere? Those were just two functions. They won't run by themselves, unless an auto exec was added to the script. Easiest to call or from main and add a using fit that script.
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
how and where would i add that sorry. Thanks for your help guess we all have to learn somewhere
#using scripts\zm\Trigger_door;
thread Trigger_door::openDoor();
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
#using scripts\zm\Trigger_door;
Oh, my bad, was on phone, just copied your text. I think your issue is the usings slash has to be like this:#using scripts\zm\Trigger_door;
fixed in op. The way I had it was just for zone files.
![]() | Has released one or more maps to the UGX-Mods community which have been added to the UGX Map Manager. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
Hahaha looking at the code now it's stands out so much as being wrong but it's still saying no available. So must be the kvp's is there any particular trigger type I need to use or kvp's for them or the script model. Don't know how I'm finding it so hard when I've followed everything lol
trigs = GetEntArray("triggers","targetname");