Frictional Games Forum (read-only)

Full Version: Path nodes ain't showing up!
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
There's a grunt active, but the path nodes aren't showing up!

I'm not doing the "SetEntityActive" method, but instead I'm using the CreateEntity method because I need the grunt to keep coming from there indefinitely, not just once and then disappear. I'm using the "fade to smoke" thing to kill it, but it needs to keep coming back, and when I do "set entity active" on one that's been faded to smoke, it reappears right where it died, not where it started.

Is there any way to get it to use the pathnodes I've meticulously placed around the map???
Code please?

It is sometimes hard to make up a script from nothing... :/
The code isn't the problem. I can see the monster standing there, so that is working fine. In debug mode with "Show Entity Info" enabled, the path nodes normally show up when an enemy is present. They don't here, and the enemy doesn't move (state stays at "idle"). To me, this says there's something wrong with spawning an enemy via the CreateEntityAtArea function, as opposed to the SetEntityActive function. Is there any way to fix this?

If not, does anybody have any ideas as to how I can fix this? Here's the situation: I have a sort of labyrinth that is illuminated by gas torches. The gas only stays on for so long after you've pulled the lever. The monster, for whatever reason, is repelled by the light from these gas torches, and disintegrates when they're lit. Now suppose you're running through the maze, and the lights go out, now you've got to run back because the monster is coming after you now! So you run, run, run, and finally reach the lever, just as the monster reaches you. You turn around, pull the lever, and poof, the monster is gone. HERE IS THE PROBLEM: How do I spawn a new monster at the end of the maze? Simply doing SetEntityActive makes the monster appear where it disappeared, and that's obviously no good. Unless I've missed something, there doesn't appear to be any way of teleporting the monster back to the starting position.
Simply place a new monster at the end of the maze and then set him unactive. When the player reaches near the end of the maze, you set the second monster active.

Simply give the monster some crazy path and then keep on calling this command:

ShowEnemyPlayerPosition("MonsterName");
But the monster needs to be able to disappear and reset for an indefinite number of times.

The monster is activated when the lights go out. It then runs through the maze towards the player, wherever they may be. In the event the player manages to switch the lights on before the monster can kill them, the monster disappears in a cloud of smoke. Then, the gas lights should run for a little bit before shutting off again, allowing the monster to appear again, at the end of the maze. How to do this??? If I just do SetEntityActive on the one that got smokeified, it appears where it died, not at the beginning.
So when doing the "CreateEntityAtArea" the enemy isn't assigned pathnodes? Might want to look out for entity naming conflicts, and checking you are assigning the right enemy the pathnodes (this will happen if enemies have the same entity name, or if your generation of unique names is not giving you the correct result). If you were to post the function from your script using this method It would be possible for us to check the code for either of the above two bugs, and others.

CreateEntityAtArea should work, so a little more information is needed.
(05-31-2011, 04:05 AM)Kyle Wrote: [ -> ]ShowEnemyPlayerPosition("MonsterName");

What does that do?

(05-31-2011, 12:37 PM)laser50 Wrote: [ -> ]
(05-31-2011, 04:05 AM)Kyle Wrote: [ -> ]ShowEnemyPlayerPosition("MonsterName");

What does that do?
Makes the enemy "see" the player irrespective of where the player and enemy is. This can be used to force the enemy to chase after the player, e.g if the player has done some puzzle that makes a large amount of noise.
Here's the code:

Code:
void GasDepleted( string asTimer )
{
    SetLocalVarInt("gasOn",0);
    for(int i = 1; i <= 45; i++)
    {
        SetLampLit("gasTorch_" + i, false, true);
        FadeLightTo("gasLight_" + i, 0.0f, 0.0f, 0.0f, 1.0f, -1, 0.5f);
        SetLightFlickerActive("gasLight_" + i, false);
    }
    
    //Spawn the monster
    //SetEntityActive("mazeGrunt", true);\
    AddLocalVarInt("monsterId", 1);
    switch(GetLocalVarInt("targetArea"))
    {
        case 1:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_58", 0.0f, "");
        break;
        
        case 2:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_58", 0.0f, "");
        break;
        
        case 3:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_120", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_58", 0.0f, "");
        break;
        
        case 4:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_120", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_114", 0.0f, "");
        break;
        
        case 5:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_114", 0.0f, "");
        break;
        
        case 6:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_206", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_152", 0.0f, "");
        break;
        
        case 7:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_152", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_120", 0.0f, "");
        break;
        
        case 8:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_206", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_152", 0.0f, "");
        break;
        
        case 9:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawnAlt",false);
            ShowEnemyPlayerPosition("mg" + GetLocalVarInt("monsterId"));
        break;
        
        default:
            CreateEntityAtArea("mg" + GetLocalVarInt("monsterId"),"servant_grunt_noSound.ent","gruntSpawn",false);
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_11", 0.0f, "");
            AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_25", 0.0f, "");
        break;
    }
    
    AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_11", 0.0f, "");
    AddEnemyPatrolNode("mg" + GetLocalVarInt("monsterId"), "PathNodeArea_25", 0.0f, "");
}
Okay, can't see anything immediately wrong, but we can do a few improvements to the code and add a statement to check we aren't overlooking something obvious first.
Code:
void GasDepleted( string asTimer )
{
    SetLocalVarInt("gasOn",0);
    for(int i = 1; i <= 45; i++)
    {
        SetLampLit("gasTorch_" + i, false, true);
        FadeLightTo("gasLight_" + i, 0.0f, 0.0f, 0.0f, 1.0f, -1, 0.5f);
        SetLightFlickerActive("gasLight_" + i, false);
    }
    
    //Spawn the monster
    //SetEntityActive("mazeGrunt", true);\
        int mID = GetLocalVarInt("monsterId");
        string monster = "mg" + mID;
        SetLocalVarInt("monsterId",mID+1);
       CreateEntityAtArea(monster,"servant_grunt_noSound.ent","gruntSpawn",false);
//Couple of Debug Messages to verify stuff went OK.
        AddDebugMessage(monster + " exists: " + GetEntityExists(monster),false);
        AddDebugMessage( "moving to case " + GetLocalVarInt("targetArea"),false );
    switch(GetLocalVarInt("targetArea"))
    {
        case 1:
            AddEnemyPatrolNode(monster, "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_58", 0.0f, "");
        break;  
        
        case 2:         
            AddEnemyPatrolNode(monster, "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_58", 0.0f, "");
        break;
        
        case 3:         
            AddEnemyPatrolNode(monster, "PathNodeArea_120", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_51", 0.0f, "");
            AddEnemyPatrolNode(monster "PathNodeArea_54", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_58", 0.0f, "");
        break;
        
        case 4:
            AddEnemyPatrolNode(monster, "PathNodeArea_120", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_114", 0.0f, "");
        break;
        
        case 5:            
            AddEnemyPatrolNode(monster, "PathNodeArea_114", 0.0f, "");
        break;
        
        case 6:
            AddEnemyPatrolNode(monster, "PathNodeArea_206", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_152", 0.0f, "");
        break;
        
        case 7:
            AddEnemyPatrolNode(monster, "PathNodeArea_152", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_120", 0.0f, "");
        break;
        
        case 8:
            AddEnemyPatrolNode(monster, "PathNodeArea_206", 0.0f, "");
            AddEnemyPatrolNode(monster, "PathNodeArea_152", 0.0f, "");
        break;
        
        case 9:
            ShowEnemyPlayerPosition(monster);
        break;
        
    }
     //Removed the default case, as currently it duplicates the below//
    AddEnemyPatrolNode(monster, "PathNodeArea_11", 0.0f, "");
    AddEnemyPatrolNode(monster, "PathNodeArea_25", 0.0f, "");
}
Now we know each time this routine runs we know if the monster exists & what nodes should have been added - the next step is to check if they were. This can be done using the debug menu and some options to inspect the grunt's state (I believe this is something along the lines of "show entity info" - if not check the boxes until you find the option). In this mode IIRC you can view the nodes added / active.
Most likely, the nodes will have been added. It may be possible that your nodes are too far away / obstructed from the grunt, and adding some more (just one or two nearby to the grunt for now for testing purposes) may do the trick.
Pages: 1 2