UGX-Mods

Call of Duty: Black Ops 3 => Tutorial Desk => Scripting => Topic started by: ZombieKid164 on May 18, 2017, 09:50:47 pm

Title: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: ZombieKid164 on May 18, 2017, 09:50:47 pm
(Note: Again, I originally posted this on modme, but I decided to post it here in case any ugx-only users needed it  :alone:)


Hello again! (I know it's been a while...)
I recreated my elevator script, which adds one main feature: You can now call the elevator. This should fix prior problems with having to make it start at the top, plus some people here and lots on Modme were asking for the call feature.

In case you never saw the first post, here are the features:
-Sliding Doors
-Elevator
-Call Feature
-Editable numbers (You can adjust the elevator to your liking)

All of the things you will need are in the download (I've made it so you no longer need a separate download if your doors open sideways)
mega.nz

IMPORTANT: Please DO NOT re-upload this script. If you are going to use this in your map or video, please credit me. (Ex: "ZombieKid164 - Youtube: http://www.youtube.com/channel/UCAm_2-Z_RGUmkLJcN1OfJrQ (http://www.youtube.com/channel/UCAm_2-Z_RGUmkLJcN1OfJrQ) ")

Also, if you want to turn off the debug text, set zk_debug to false in the script (Forgot to add that to instructions).
I hope you enjoy this script!
Thanks, and happy modding! -ZombieKid164
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: qbm1 on May 29, 2017, 05:32:41 pm
Im getting this error when trying to compile  ??? ERR(0) scripts/zm/zm_five.gsc (58,6) : syntax error, unexpected TOKEN USING, expecting TOKEN SEMICOLON : #using
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: ZombieKid164 on June 03, 2017, 12:50:53 am
Im getting this error when trying to compile  ??? ERR(0) scripts/zm/zm_five.gsc (58,6) : syntax error, unexpected TOKEN USING, expecting TOKEN SEMICOLON : #using

It seems you've put the script into your yourmapname.gsc file incorrectly. Here is an example of what it should look like:
Code Snippet
Plaintext
//Note that this is starting after "#using scripts\zm\zm_usermap;".

#using scripts\_ZK\zk_buyable_elevator_v2;

//*****************************************************************************
// MAIN
//*****************************************************************************

function main()
{
zm_usermap::main();

level._zombie_custom_add_weapons =&custom_add_weapons;

//Setup the levels Zombie Zone Volumes
level.zones = [];
level.zone_manager_init_func =&usermap_test_zone_init;
init_zones[0] = "start_zone";
level thread zm_zonemgr::manage_zones( init_zones );

level.pathdist_type = PATHDIST_ORIGINAL;
level thread zk_buyable_elevator_v2::init();
}

//Also there would be more after this


Hope this helps!
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Archaicvirus on June 11, 2017, 01:36:45 pm
(Note: Again, I originally posted this on modme, but I decided to post it here in case any ugx-only users needed it  :alone:)

(Content removed from quote.)
Hello again! (I know it's been a while...)
I recreated my elevator script, which adds one main feature: You can now call the elevator. This should fix prior problems with having to make it start at the top, plus some people here and lots on Modme were asking for the call feature.

In case you never saw the first post, here are the features:
-Sliding Doors
-Elevator
-Call Feature
-Editable numbers (You can adjust the elevator to your liking)

All of the things you will need are in the download (I've made it so you no longer need a separate download if your doors open sideways)
mega.nz

IMPORTANT: Please DO NOT re-upload this script. If you are going to use this in your map or video, please credit me. (Ex: "ZombieKid164 - Youtube: http://www.youtube.com/channel/UCAm_2-Z_RGUmkLJcN1OfJrQ (http://www.youtube.com/channel/UCAm_2-Z_RGUmkLJcN1OfJrQ) ")

Also, if you want to turn off the debug text, set zk_debug to false in the script (Forgot to add that to instructions).
I hope you enjoy this script!
Thanks, and happy modding! -ZombieKid164

Nice, scripting. Just one suggestion though, I've done elevator scripts before, and the problem is that players glitch through the floor iif they jump around or move too much. You can solve that problem by using this function on the elevator floor:
Code Snippet
Plaintext
void SetMovingPlatformEnabled()

CATEGORY:
CLIENT/SERVER: Server
SUMMARY: Enbles the moving platfrom.
EXAMPLE: platform SetMovingPlatformEnabled( true ) //Elevator gets threaded as self here
// elevator thread SetMovingPlatformEnabled(true);

This will match the player's velocity with the elevator's, and prevent any derpy behavior.
*edit - Also I believe in radiant there is an option on script_model and script_brushmodels to enable them as a moving platform. It's in the kvp's, I have only tested the function via script though so you'd have to test that.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Wolfilms on July 02, 2017, 12:46:32 am
Quote
Also I believe in radiant there is an option on script_model and script_brushmodels to enable them as a moving platform. It's in the kvp's, I have only tested the function via script though so you'd have to test that.

I have tested this out by ticking the setting in radiant, and I have found that it works without having to need any code.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Archaicvirus on July 02, 2017, 06:43:22 pm
I have tested this out by ticking the setting in radiant, and I have found that it works without having to need any code.

Cool, I figured it would work. That definitely helps when you have multiple elevators, or you could do it dynamically via script either way
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: TotiJr on July 21, 2017, 09:49:34 am
Can one of you explain how you did it? I'm not sure where to put the script or which ksp to add or change.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Wolfilms on July 21, 2017, 03:11:47 pm
Can one of you explain how you did it? I'm not sure where to put the script or which ksp to add or change.

I personally think the radiant way is easier, so here's how to do it in radiant.

Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: TotiJr on July 21, 2017, 08:33:44 pm
Thanks, it worked. Does anyone know how to use multiple of these at a time? As soon as i turn on the power the game crashes. Im assuming it has to do with the triggers being the exact same, as well as the debugger saying the same thing. Would i just change the trigger names? How do i get rid of the debugger on only one so that it wont say everything twice?
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Wolfilms on July 22, 2017, 01:13:50 am
I believe you would have to change all the kvp's on the elevator parts, and the triggers. You would then have to make sure all those kvp's are in the script and have all the code necessary assigned to them. I could be wrong as I haven't really taken a glance at the code, but I'm guessing that is how it would be done. I can try and explain more if this doesn't really help/make sense :)
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: TotiJr on July 24, 2017, 01:38:10 am
Yeah, I've been able to successfully duplicate the files and change the target names, but when i go in game whenever i turn on power the new one i made works 100%, but the original still says it needs power. Any ideas? Maybe its conflicting functions to wait for power, but I'm not sure how to resolve that. And if it was that I'd think that the original one would work rather than the new one or the game would just crash.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Wolfilms on July 24, 2017, 04:53:24 pm
Did you change the name of the wait_for_power() function? That might be a problem if you haven't done that.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: TotiJr on July 24, 2017, 10:21:17 pm
Change what? Because there are only 3 statements that involve power? 

function wait_for_power()
level flag::wait_till( "power_on" );
wait_for_power();
 I already tried adding a 1 in each statement after the word "power" but the problem seems to consist, and for some reason after I change it on level flag it doesn't even bother showing up the debug text from that elevator.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: Wolfilms on July 25, 2017, 04:02:17 pm
Change what? Because there are only 3 statements that involve power? 

function wait_for_power()
level flag::wait_till( "power_on" );
wait_for_power();
 I already tried adding a 1 in each statement after the word "power" but the problem seems to consist, and for some reason after I change it on level flag it doesn't even bother showing up the debug text from that elevator.

Can you post your code here so I can see what you are working with?
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: TotiJr on July 26, 2017, 09:49:47 pm
//This is the gsc file for the elevator
// ZombieKid164's buyable elevator
Code Snippet
Plaintext
#using scripts\zm\_zm_score;
#using scripts\shared\flag_shared;

function init()
{

//Things you can edit below \/
level.elevator_cost = 500; // Change this to change the cost of the elevator. Leave it undefined to make it free.
level.elevate_height = 250; //This is how far the elevator will travel up.
level.elevator_transition_time = 5; //How long it will take for the elevator travel.
level.elevator_cooldown_time = 30; // Cooldown time of the elevator.
level.zk_debug = true; //Enable or disable this to show action text in game. (Ex: "Debug: Elevator Moving" will be shown on the screen)
level.change_door_direction = true; //Change this to true if your doors slide backwards or forwards instead of side to side.
//Things you can edit above /\

level.elevator_trigger = GetEnt( "elevator_trigger1", "targetname" );
level.elevator_trigger_top = GetEnt( "elevator_trigger_top1", "targetname" );
level.elevator_trigger_outside_bottom = GetEnt( "elevator_trigger_outside_bottom1", "targetname");
level.elevator_trigger_outside_top = GetEnt( "elevator_trigger_outside_top1", "targetname");
level.elevator_model = GetEnt("elevator1", "targetname" );
level.elevator_top_door = GetEnt("top_door1", "targetname" );
level.elevator_bottom_door = GetEnt("bottom_door1", "targetname" );
level.elevator_called = false;
main();
}

function main()
{
level endon( "intermission" );
wait_for_power();
thread bottom_door_open();
level.elevator_trigger_top SetHintString( "" );

while(1)
{
thread wait_for_buy_bottom();
thread wait_for_call_top();
thread zk_print("Awaiting Activation Protocol 13255");
level waittill("Elevator_Used");
level notify("elevator_moving");
thread zk_print("Activation Protocol 13255");
thread clear_trigger_text();

thread bottom_door_close();
wait(1);
thread elevator_rise( level.elevate_height, level.elevator_transition_time );
wait( level.elevator_transition_time );
thread top_door_open();
level.elevator_trigger_top SetHintString( "Performing Integrity Check: Stand By" );
level.elevator_trigger_outside_bottom SetHintString( "Performing Integrity Check: Stand By" );
wait( level.elevator_cooldown_time );

thread wait_for_buy_top();
thread wait_for_call_bottom();
thread zk_print("Awaiting Activation Protocol 13255");
level waittill("Elevator_Used");
level notify("elevator_moving");
thread zk_print("Activation Protocol 13255 Recieved");
thread clear_trigger_text();

level.elevator_trigger_top SetHintString( "" );
thread top_door_close();
wait(1);
thread elevator_fall( level.elevate_height, level.elevator_transition_time );
wait( level.elevator_transition_time );
thread bottom_door_open();
level.elevator_trigger SetHintString( "Performing Integrity Check: Stand By.." );
level.elevator_trigger_outside_top SetHintString( "Performing Integrity Check: Stand By.." );
wait( level.elevator_cooldown_time );
}
}

function elevator_rise( height, speed )
{
level.elevator_model movez (height, speed);
level.elevator_model waittill ("movedone");
}

function elevator_fall( height, speed )
{
level.elevator_model movez (height - (height * 2), speed);
level.elevator_model waittill ("movedone");
}

function bottom_door_open()
{
if(!level.change_door_direction == true)
{
level.elevator_bottom_door movex (130, 1);
}
else
{
level.elevator_bottom_door movey (130, 1);
}
}

function bottom_door_close()
{
if(!level.change_door_direction == true)
{
level.elevator_bottom_door movex ((-130), 1);
}
else
{
level.elevator_bottom_door movey ((-130), 1);
}
}

function top_door_open()
{
if(!level.change_door_direction == true)
{
level.elevator_top_door movex (130, 1);
}
else
{
level.elevator_top_door movey (130, 1);
}
}

function top_door_close()
{
if(!level.change_door_direction == true)
{
level.elevator_top_door movex ((-130), 1);
}
else
{
level.elevator_top_door movey ((-130), 1);
}
}

function wait_for_power()
{
level.elevator_trigger_outside_bottom SetHintString( &"ZOMBIE_NEED_POWER" );
level.elevator_trigger_outside_top SetHintString( &"ZOMBIE_NEED_POWER" );
level flag::wait_till( "power_on" );
level.elevator_trigger_outside_bottom SetHintString( "" );
level.elevator_trigger_outside_top SetHintString( "" );
thread zk_print("Auxilary Power Active: All Systems Operational");
}

function wait_for_buy_bottom()
{
level endon("elevator_moving");
if( isDefined(level.elevator_cost) )
{
while(1)
{
level.elevator_trigger SetHintString( "Hold ^3&&1^7 to Activate Protocol 935 [Cost: "+level.elevator_cost+"]" );
level.elevator_trigger waittill( "trigger", player );
if( isDefined(level.elevator_cost) && player.score >= level.elevator_cost )
{
player zm_score::minus_to_player_score( level.elevator_cost );
level notify("Elevator_Used");
thread zk_print("Activation Protocol Accepted");
break;
}
else if( isDefined( level.elevator_cost ) && player.score < level.elevator_cost )
{
level.elevator_trigger SetHintString( "You do not have sufficient permissions." );
wait(4);
level.elevator_trigger SetHintString( "Hold ^3&&1^7 to Activate Protocol 935 [Cost: "+level.elevator_cost+"]" );
continue;
}
}
}
else
{
level.elevator_trigger SetHintString( "Hold ^3&&1^7 to Activate Protocol 935" );
level.elevator_trigger waittill( "trigger", player );
level.elevator_trigger SetHintString( "" );
level notify("Elevator_Used");
thread zk_print("Activation Protocol Accepted [Free]");
}
}

function wait_for_buy_top()
{
level endon("elevator_moving");
if( isDefined(level.elevator_cost) )
{
while(1)
{
level.elevator_trigger_top SetHintString( "Hold ^3&&1^7 to Activate Protocol 13255 [Cost: "+level.elevator_cost+"]" );
level.elevator_trigger_top waittill( "trigger", player );
if( isDefined(level.elevator_cost) && player.score >= level.elevator_cost )
{
player zm_score::minus_to_player_score( level.elevator_cost );
level notify("Elevator_Used");
thread zk_print("Activation Protocol Accepted");
break;
}
else if( isDefined( level.elevator_cost ) && player.score < level.elevator_cost )
{
level.elevator_trigger_top SetHintString( "You do not have sufficient permissions" );
wait(4);
level.elevator_trigger_top SetHintString( "Hold ^3&&1^7 to Activate Protocol 13255 [Cost: "+level.elevator_cost+"]" );
continue;
}
}
}
else
{
level.elevator_trigger SetHintString( "Hold ^3&&1^7 to Activate Protocol 13255" );
level.elevator_trigger waittill( "trigger", player );
level.elevator_trigger SetHintString( "" );
level notify("Elevator_Used");
thread zk_print("Activation Protocol Accepted [Free]");
}
}

function wait_for_call_bottom()
{
self endon("elevator_moving");
level.elevator_trigger_outside_bottom SetHintString( "Hold ^3&&1^7 to Activate Protocol 935" );
level.elevator_trigger_outside_bottom waittill( "trigger", player );
level.elevator_trigger_outside_bottom SetHintString( "" );
level notify("Elevator_Used");
thread zk_print("Requested Activation Protocol 935");
}

function wait_for_call_top()
{
self endon("elevator_moving");
level.elevator_trigger_outside_top SetHintString( "Hold ^3&&1^7 to Activate Protocol 13255" );
level.elevator_trigger_outside_top waittill( "trigger", player );
level.elevator_trigger_outside_top SetHintString( "" );
level notify("Elevator_Used");
thread zk_print("Requested Activation Protocol 13255");
}

function zk_print( string )
{
if( level.zk_debug == true )
{
iprintlnbold( "Brother Eye: "+string );
}
}

function clear_trigger_text()
{
level.elevator_trigger_outside_top SetHintString( "" );
level.elevator_trigger_outside_bottom SetHintString( "" );
level.elevator_trigger SetHintString( "" );
level.elevator_trigger_top SetHintString( "" );
}
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: soap-0723 on February 18, 2018, 10:13:55 pm
How do you change it so that the power isn't required to operate it? sorry, im a noob.
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: soap-0723 on February 19, 2018, 04:36:59 am
Zombies wont follow me inside? i don't want people to go in there just to glitch my maps.. is there any fix?
Title: Re: [Tutorial] How to add a buyable elevator (V2) [Now with call feature]
Post by: joshs1982 on June 08, 2019, 05:27:41 pm
Could one of you please help me with my elevator code I'm not sure what I'm doing wrong? Here is my script.

Code Snippet
Plaintext
main()
{
  level.elevDown=true;
  level.elevUp=true;
  level.elevMove=false;
  level.current_floor=0;
  level.current_floor=1;
  level.current_floor=2;
  switchTOP=getentarray("ups","targetname");
  for(i=0; i<switchTOP.size; i++)
   switchTOP[i] thread elev_think();
}

elev_think()
{
  IdoorLEFT=getent("leftindoor", "targetname");
  IdoorRIGHT=getent("rightindoor", "targetname");
  Odoor2L=getent("2leftdoor", "targetname");
  Odoor2R=getent("2rightdoor", "targetname");
  Odoor1L=getent("1leftdoor", "targetname");
  Odoor1R=getent("1rightdoor", "targetname");
  Odoor0L=getent("0leftdoor", "targetname");
  Odoor0R=getent("0rightdoor", "targetname");
  thread door_open(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);
  while(1)
  {
   self waittill ("trigger");
   if(level.elevMove==false)
    {
     level.elevMove=true;
     thread elev_move();
    }
  }
}

elev_move()
{
  etime=5;
  zdirec="z";
  zdist1=376;
  zdist2=248;
  zdist3=0;
  IdoorLEFT=getent("leftindoor", "targetname");
  IdoorRIGHT=getent("rightindoor", "targetname");
  Odoor2L=getent("2leftdoor", "targetname");
  Odoor2R=getent("2rightdoor", "targetname");
  Odoor1L=getent("1leftdoor", "targetname");
  Odoor1R=getent("1rightdoor", "targetname");
  Odoor0L=getent("0leftdoor", "targetname");
  Odoor0R=getent("0rightdoor", "targetname");
  Elevator=getent("elevator", "targetname");
  if(level.current_floor==2)
   {
    door_close(IdoorLEFT, IdoorRIGHT, Odoor2L, Odoor2R);
    wait(.1);
    Elevator thread move_func(zdist1, etime, zdirec);
    IdoorLEFT thread move_func(zdist1, etime, zdirec);
    IdoorRIGHT thread move_func(zdist1, etime, zdirec);
    Elevator waittill ("movedone");
    door_open(IdoorLEFT, IdoorRIGHT, Odoor2L, Odoor2R);
    level.elevDown=true;
    level.elevUp=false;
    level.elevMove=false;
   }
   else if(level.current_floor==1)
   {
    door_close(IdoorLEFT, IdoorRIGHT, Odoor1L, Odoor1R);
    wait(.1);
    Elevator thread move_func(zdist2, etime, zdirec);
    IdoorLEFT thread move_func(zdist2, etime, zdirec);
    IdoorRIGHT thread move_func(zdist2, etime, zdirec);
    Elevator waittill ("movedone");
    door_open(IdoorLEFT, IdoorRIGHT, Odoor1L, Odoor1R);
    level.elevDown=true;
    level.elevUp=true;
    level.elevMove=false;
   }
  else(level.current_floor==0)
  {
   door_close(IdoorLEFT, IdoorRIGHT, OdoorTL, OdoorTR);
   wait(.1);
   Elevator thread move_func(zdist3, etime, zdirec);
   IdoorLEFT thread move_func(zdist3, etime, zdirec);
   IdoorRIGHT thread move_func(zdist3, etime, zdirec);
   Elevator waittill ("movedone");
   door_open(IdoorLEFT, IdoorRIGHT, Odoor0L, Odoor0R);
   level.elevDown=false;
   level.elevUp=true;
   level.elevMove=false;
  }
  wait(.1);
}

door_close(leftIN, rightIN, leftOUT, rightOUT)
{
  LDclose=-66.8;
  RDclose=-211.1;
  ydirec="x";
  dtime=1.1;
  leftIN thread move_func(LDclose,dtime, ydirec);
  rightIN thread move_func(RDclose,dtime, ydirec);
  wait(1);
  leftOUT thread move_func(LDclose,dtime, ydirec);
  rightOUT thread move_func(RDclose,dtime, ydirec);
  wait(1);
 }

door_open(leftyIN, rightyIN, leftyOUT, rightyOUT)
{
  LDopen=-26.8;
  RDopen=-251.1;
  ydirec="x";
  dtime=1.1;
  leftyOUT thread move_func(LDopen,dtime, ydirec);
  rightyOUT thread move_func(RDopen,dtime, ydirec);
  wait(1);
  leftyIN thread move_func(LDopen,dtime, ydirec);
  rightyIN thread move_func(RDopen,dtime, ydirec);
 }

move_func(dist,time,direc)
{
  if(direc=="z")
  self movez (dist, time, (time/2), (time/2));
  if(direc=="x")
   self movex (dist, time, (time/2), (time/2));
   self waittill ("movedone");
}