Frictional Games Forum (read-only)

Full Version: Elevator Lever to Level Transition
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
I've been sitting here ages trying to figure this script out, even tearing apart other scripts, and nothing is working. Obviously, I am missing something.

The idea is the rods will unlock the levers (which has not been scripted), and the levers will allow to the elevator to "move", which results in a level transition when the elevator lever is pulled down.

Some things may look a bit weird (like a sob activating when the lever puzzle is complete), but these are just stand-ins for the time being.

Here is the script as it is right now:

Code:
void OnStart()
{

}

void OnEnter()
{    
    AddUseItemCallback("", "guiding_rod01", "rodarea_1", "RodMeOnce", true);
    AddUseItemCallback("", "guiding_rod02", "rodarea_2", "RodMeTwice", true);
    AddUseItemCallback("", "guiding_rod03", "rodarea_3", "RodMeThrice", true);
}

void OnLeave()
{

}

void LeverBox(string &in asEntity, int LeverState)
{
    if(GetLeverState("lever_machine_lever_1") == -1
    && GetLeverState("lever_machine_lever_2") == -1
    && GetLeverState("lever_machine_lever_3") == -1
    && GetLeverState("lever_machine_lever_4") == -1
    && GetLeverState("lever_machine_lever_5") == -1
    && GetLeverState("lever_machine_lever_6") == -1)
        {
            PlaySoundAtEntity("", "sob01.snt", "Player", 0, false);
            SetEntityActive("elevator_lever_1", false);
            SetEntityActive("elevator_lever_2", true);
                
            for(int i = 1; i <= 6; i++)
            SetEntityInteractionDisabled("lever_machine_lever_"+i, true);
        }
        
    if(GetLeverState("elevator_lever_2") == -1)
    {
        SetEntityPlayerInteractCallback("elevator_lever_2", "Activate", true);
    }
}

void RodMeOnce(string &in asItem, string &in asEntity)
{
    SetEntityActive("guiding_rod01_stat", true);
    PlaySoundAtEntity("", "13_rod_in.snt", "rods", 0, false);
    RemoveItem("guiding_rod01");
    AddLocalVarInt("Rods", 1);
    
    if(GetLocalVarInt("Rods") == 3)
    {
        PlaySoundAtEntity("", "13_machine_extra.snt", "machine_sound", 0, false);
        PlaySoundAtEntity("", "13_machine_run.snt", "machine_sound", 0, false);
    }
}

void RodMeTwice(string &in asItem, string &in asEntity)
{
    SetEntityActive("guiding_rod02_stat", true);
    PlaySoundAtEntity("", "13_rod_in.snt", "rods", 0, false);
    RemoveItem("guiding_rod02");
    AddLocalVarInt("Rods", 1);
    
    if(GetLocalVarInt("Rods") == 3)
    {
        PlaySoundAtEntity("", "13_machine_extra.snt", "machine_sound", 0, false);
        PlaySoundAtEntity("", "13_machine_run.snt", "machine_sound", 0, false);
    }
}

void RodMeThrice(string &in asItem, string &in asEntity)
{
    SetEntityActive("guiding_rod03_stat", true);
    PlaySoundAtEntity("", "13_rod_in.snt", "rods", 0, false);
    RemoveItem("guiding_rod03");
    AddLocalVarInt("Rods", 1);
    
    if(GetLocalVarInt("Rods") == 3)
    {
        PlaySoundAtEntity("", "13_machine_extra.snt", "machine_sound", 0, false);
        PlaySoundAtEntity("", "13_machine_run.snt", "machine_sound", 0, false);
    }
}

void Activate(string &in asParent, string &in asChild, int alState)
{
    PlaySoundAtEntity("", "14_elevator_activate.snt", "Player", 0, false);
    AddTimer("", 2.0, "Fade");
    StartScreenShake(0.06f, 4.0, 1.0, 1.0);
}

void Fade(string &in asTimer)
{
    FadeOut(5);
    AddTimer("", 5, "TimerTransition");
}

void TimerTransition(string &in asTimer)
{
        ChangeMap("helena_001.map", "PlayerStartArea_1", "", "");
}

My scripting skills are still rather newbie level alas. This is about as far as I could get. :/
Redacted - wouldn't make any difference.
Nothing is changing. :/ It doesn't do anything.

I attached the map that I've been testing the script on. Maybe there is something in the map that's been looked-over?
First off you can remove those Once, Twice, Thrice scripts and use a single one with parameters to shorten the code.

PHP Code:
void RodMeOnce(string &in asItemstring &in asEntity)
{
    
SetEntityActive(asEntity "_stat"true);
    
PlaySoundAtEntity("""13_rod_in.snt""rods"0false);
    
RemoveItem(asEntity);
    
AddLocalVarInt("Rods"1);
    
    if(
GetLocalVarInt("Rods") == 3)
    {
        
PlaySoundAtEntity("""13_machine_extra.snt""machine_sound"0false);
        
PlaySoundAtEntity("""13_machine_run.snt""machine_sound"0false);
    }


Do the sounds play though? I think the script stops right there. There are only those three callbacks when you enter, and those three code blocks (which could be only one) don't seem to advance the script to the other ones. Unless you have callbacks added to entities in the level? I'm guessing you do at least for the levers. I can't really check the level at the moment though.



This script might not do what you want it to. Let's just see what will happen if done.

PHP Code:
void LeverBox(string &in asEntityint LeverState)
{
    if(
GetLeverState("lever_machine_lever_1") == -1
    
&& GetLeverState("lever_machine_lever_2") == -1
    
&& GetLeverState("lever_machine_lever_3") == -1
    
&& GetLeverState("lever_machine_lever_4") == -1
    
&& GetLeverState("lever_machine_lever_5") == -1
    
&& GetLeverState("lever_machine_lever_6") == -1)
        {
            
PlaySoundAtEntity("""sob01.snt""Player"0false);
            
SetEntityActive("elevator_lever_1"false);
            
SetEntityActive("elevator_lever_2"true);
                
            for(
int i 1<= 6i++)
            
SetEntityInteractionDisabled("lever_machine_lever_"+itrue);
        }
        
    if(
GetLeverState("elevator_lever_2") == -1)
    {
        
SetEntityPlayerInteractCallback("elevator_lever_2""Activate"true);
    }


Is this callback added to all the lever_machine_lever entities? Anything else?

Pulling all lever_machine_lever to state -1 will activate the main code, which plays some sounds and changes the elevator_lever entity. To prevent this some happening again, interaction is disabled for these levers. The last part will only activate if elevator_lever_2 is already set to state -1 before the other levers are set, or else they will remain uninteractable and can not call the code. Because elevator_lever_2 is enabled after pulling the other levers, this can cause it to not be finished, unless this callback is also added to the elevator_lever_2, however if so, it will also run the main code again once pulled, because even though the other levers are uninteractable, they're still in state -1 which will pass the code.
No the sounds do not play.

Changing the script down to the one RodMe (<-- my pathetic attempt at humor) made it so only one rod would go into the machine; the others would not work.

There are callbacks for the levers, but nothing else.
Welp, I know what the problem is. Now I just have to fix it and reupload it. (For the level change, not the sounds).

Assuming that elevator_lever_2 is the one which you need to pull down to start the transition to the next level through the fade.
Ah, right, I see the different areas now. Missed that.

If you changed it to use only 1 callback block, don't forget to add the same one to all the items in OnStart or, OnEnter in your case.

PHP Code:
for(int i 1<= 3i++) AddUseItemCallback("""guiding_rod0"+i"rodarea_"+i"RodMe"true); 
(11-26-2014, 08:31 AM)Mudbill Wrote: [ -> ]Is this callback added to all the lever_machine_lever entities? Anything else?

Pulling all lever_machine_lever to state -1 will activate the main code, which plays some sounds and changes the elevator_lever entity. To prevent this some happening again, interaction is disabled for these levers. The last part will only activate if elevator_lever_2 is already set to state -1 before the other levers are set, or else they will remain uninteractable and can not call the code. Because elevator_lever_2 is enabled after pulling the other levers, this can cause it to not be finished, unless this callback is also added to the elevator_lever_2, however if so, it will also run the main code again once pulled, because even though the other levers are uninteractable, they're still in state -1 which will pass the code.

Sounds like script-ception. o.o The callbacks are only on the lever_machine_levers.

And it still doesn't do anything but play the sound.

(11-26-2014, 08:44 AM)Romulator Wrote: [ -> ]Welp, I know what the problem is. Now I just have to fix it and reupload it. (For the level change, not the sounds).

Assuming that elevator_lever_2 is the one which you need to pull down to start the transition to the next level through the fade.

Yes. the elevator_lever_2 starts the level transition. I think I messed up though on the callback state (the lever should be pulled down and not up; I think it's script to be pulled up.)
(11-26-2014, 08:48 AM)AGP Wrote: [ -> ]
(11-26-2014, 08:44 AM)Romulator Wrote: [ -> ]Welp, I know what the problem is. Now I just have to fix it and reupload it. (For the level change, not the sounds).

Assuming that elevator_lever_2 is the one which you need to pull down to start the transition to the next level through the fade.

Yes. the elevator_lever_2 starts the level transition. I think I messed up though on the callback state (the lever should be pulled down and not up; I think it's script to be pulled up.)

Actually, elevator_lever_2 does nothing, at least it never did anything for me, even when the levers got stuck. Maybe I did something wrong... ;-;

Back to the vanilla. Juuuuuuuust in case. Post 1800. Yay!
Does it eventually make the levers uninteractable once you've put them all in state -1? What type of levers are they? If they reset to state 0 after being pulled, you can't have them all at state -1 at the same time.

PS: State 1 and -1 depend on the lever if it will be up or down. I think the control room piston levers use static states and -1 is down, but I think most levers have -1 to be up. Might be mistaken.

Edit: Does elevator_lever_2 have a callback added? Is it set to run Activate? Well, no, not really, because that's a collision callback but I see nothing calling it.
Pages: 1 2