Frictional Games Forum (read-only)

Full Version: Help with a pipe puzzle
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello I need help with using the "if" in my script, I just dont get it. So I have 3 pipes use them on 3 separate scripts and every time one placed right an pipe entity appears so the player sees that it's placed right. Now When all are placed right I want to swap a stuck valve with a valve that can be turned. So here's my script so far

Spoiler below!

void OnStart()
{
AddUseItemCallback("GetOil", "pipe_piece_1", "PipeArea1", "PipeQuest1", true);
AddUseItemCallback("GetOil", "pipe_piece_2", "PipeArea2", "PipeQuest2", true);
AddUseItemCallback("GetOil", "pipe_piece_3", "PipeArea3", "PipeQuest3", true);
}

///PIPEQUEST
void PipeQuest1(string &in asItem, string &in asEntity)
{
RemoveItem("pipe_piece_1");
SetEntityActive("Pipe1", true);
PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
}

void PipeQuest2(string &in asItem, string &in asEntity)
{
RemoveItem("pipe_piece_2");
SetEntityActive("Pipe2", true);
PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
}

void PipeQuest3(string &in asItem, string &in asEntity)
{
RemoveItem("pipe_piece_3");
SetEntityActive("Pipe3", true);
PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
}



I don't know how to script it to understand when all 3 pipes are placed right it should swap the stuck valve with the unstuck
Help appreciated! Smile
You use a local variable.

Try this:

Code:
void OnStart()
{
     AddUseItemCallback("GetOil", "pipe_piece_1", "PipeArea1", "PipeQuest1", false);
     AddUseItemCallback("GetOil", "pipe_piece_2", "PipeArea2", "PipeQuest2", false);
     AddUseItemCallback("GetOil", "pipe_piece_3", "PipeArea3", "PipeQuest3", false);
     SetLocalVarInt("Var01", 1);
}
void PipeQuestDone()
{
     [Do whatever you want to happen here]
}
void PipeQuest1(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 1)
     {
          RemoveItem("pipe_piece_1");
          SetEntityActive("Pipe1", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          SetLocalVarInt("Var01", 2);
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_1", "PipeArea1", "PipeQuest1", false);
     }
}
void PipeQuest2(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 2)
     {
          RemoveItem("pipe_piece_2");
          SetEntityActive("Pipe2", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          SetLocalVarInt("Var01", 3);
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_2", "PipeArea2", "PipeQuest2", false);
     }
}
void PipeQuest3(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 3)
     {
          RemoveItem("pipe_piece_3");
          SetEntityActive("Pipe3", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          PipeQuestDone();
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_3", "PipeArea3", "PipeQuest3", false);
     }
}

I think this should fix most of it. Smile
(05-23-2011, 09:28 PM)Kyle Wrote: [ -> ]You use a local variable.

Try this:

Code:
void OnStart()
{
     AddUseItemCallback("GetOil", "pipe_piece_1", "PipeArea1", "PipeQuest1", false);
     AddUseItemCallback("GetOil", "pipe_piece_2", "PipeArea2", "PipeQuest2", false);
     AddUseItemCallback("GetOil", "pipe_piece_3", "PipeArea3", "PipeQuest3", false);
     SetLocalVarInt("Var01", 1);
}
void PipeQuestDone()
{
     [Do whatever you want to happen here]
}
void PipeQuest1(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 1)
     {
          RemoveItem("pipe_piece_1");
          SetEntityActive("Pipe1", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          SetLocalVarInt("Var01", 2);
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_1", "PipeArea1", "PipeQuest1", false);
     }
}
void PipeQuest2(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 2)
     {
          RemoveItem("pipe_piece_2");
          SetEntityActive("Pipe2", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          SetLocalVarInt("Var01", 3);
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_2", "PipeArea2", "PipeQuest2", false);
     }
}
void PipeQuest3(string &in asItem, string &in asEntity)
{
     if (GetLocalVarInt("Var01") == 3)
     {
          RemoveItem("pipe_piece_3");
          SetEntityActive("Pipe3", true);
          PlaySoundAtEntity("", "puzzle_place_jar.snt", "Player", 0, false);
          PipeQuestDone();
          return;
     }
     else
     {
          AddUseItemCallback("GetOil", "pipe_piece_3", "PipeArea3", "PipeQuest3", false);
     }
}

I think this should fix most of it. Smile

Thanks mate, i'll try when I get home, btw could you explain to me what that "SetLocalVarInt("Var01", 1);" or what the var01 does? I can just copy this but I'm not sure how it actually works Tongue

EDIT: Yep, works like a charm, still don't know how it works tho
I'd like to know how variables work too Big Grin

I have a problem and I posted it here;
http://www.frictionalgames.com/forum/thr...l#pid74695
And the public says it's a variable problem >.> I have no idea what those are or how to use em but this could help me in some way im sure
Well, it's basically something like when the local variable is 0 something happens, and when it is 1 something else happens, so when you use the "if", the script checks if the variable is equal to 0 or 1. So if you set the local variable to 1 it will do the script you created for local var 1. If, lets say you haven't collected the item, the variable is 0 and will skip the script which had the variable 1 and do whatever is on 0, until you get the necessary items (or w/e it is you use to change the variable to 1) and then it does the script you created for 1 Smile Since english isn't my main language I might've explained a bit confusing, but I hope this helped a little at least xD

The if does exactly what it's named, IF something is 0 the script is activated, else it does the 1 or what the local variable is Smile
SOLVED: CANT USE 180, only -1, 0, and 1, figured it out self, sorry for useless bump.

Bumping old instead of making new:

I got a problem with a valve for my script, I got one working but it's not working correctly. So am I not using the right script for this? I just want to turn the valve to 180 and the stuff to happen



void OnStart()
{
SetEntityConnectionStateChangeCallback("Valve_1", "MakeAcid");
}

void MakeAcid(string &in asEntity, int alState)
{
if (alState == 180)
{
SetLeverStuckState("Valve_1", 180, true);
SetEntityActive("13_burner_1", true);
AddTimer("Timer", 3.0, "AcidFinished");
}
}


void AcidFinished(string&in asTimer)
{
SetEntityActive("13_burner_1", false);
SetEntityActive("chemical_container_full_1", true);
}

Please Help.
@Rownbear;

Wow, I didn't know that you had to do -1, 0, or 1 for a valve, because I was always trying to do it the way you said you first did it. XD