Jump to content

"IF" Function Problem


Recommended Posts

Hallo, I have a problem with an "if" function. I want to make a script where when luke will be has less than 50 HP then he will change into a Kyle. I put "if" function in many ways and it not working,

 

Here is the Code:
 

( //Generated by BehavEd

rem ( "luke1" );

affect ( "luke1", /*@AFFECT_TYPE*/ FLUSH )
{
    camera ( /*@CAMERA_COMMANDS*/ ENABLE );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref3", ORIGIN)$, 0 );
    camera ( /*@CAMERA_COMMANDS*/ PAN, < 0.000 90.000 0.000 >, < 0.000 0.000 0.000 >, 0 );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref4", ORIGIN)$, 16000 );
    set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
    set ( /*@SET_TYPES*/ "SET_NAVGOAL", "nav1b" );
    wait ( 16000.000 );

    task ( "lukedial1" )
    {
        sound ( /*@CHANNELS*/ CHAN_AUTO, "sound/chars/luke1/lukedia1.mp3" );
    }

    dowait ( "lukedial1" );
//$"default"@6
    set ( /*!*/ "SET_BEHAVIOR_STATE", /*!*/ "BS_DEFAULT" );
    set ( /*!*/ "SET_CHASE_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_LOOK_FOR_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_IGNOREALERTS", /*!*/ "false" );
    set ( /*!*/ "SET_WALKING", /*!*/ "false" );
    set ( /*!*/ "SET_RUNNING", /*!*/ "false" );
    wait ( 2000.000 );
    set ( /*@SET_TYPES*/ "SET_SABERACTIVE", /*@BOOL_TYPES*/ "true" );
    wait ( 20000.000 );
    camera ( /*@CAMERA_COMMANDS*/ DISABLE );

    if ( $get( FLOAT, "SET_HEALTH")$, $<$, $50$ )
    {
        set ( /*@SET_TYPES*/ "SET_PLAYERMODEL", "Kyle" );
    }

}

)

What should I Do?

Edited by Circa
code tags
Link to comment

It depends on how you use the script. If you set it up so that it only runs once, it will do its tasks and perform only one check for Luke's health. You can either loop that health check so that every X seconds it will check his health, but in my opinion the best solution is to separate it into a new script that you'll then set to Luke's painscript. It would then work like this: every time he is hit, the script will run and check his health, and the "fatal hit" that would lower his health below 50 will turn him into Kyle. At that point you should also probably set his painscript to none, so that it won't loop over and over.

Asgarath83 and therfiles like this
Link to comment

Heh, I am not on this "level" of programming, is it for you a problem to show me that step by step? I would be greatful :)


This is second script:

rem ( "kyle_check" );

loop ( 1 )
{

    if ( $get( FLOAT, "SET_HEALTH")$, $<$, $50$ )
    {
        set ( /*@SET_TYPES*/ "SET_PLAYERMODEL", "Kyle" );
    }
Edited by Circa
CODE TAGS
Link to comment

Sure. Simply delete that last snippet checking for his health, so that the script would look like this:

( //Generated by BehavEd

rem ( "luke1" );

affect ( "luke1", /*@AFFECT_TYPE*/ FLUSH )
{
    camera ( /*@CAMERA_COMMANDS*/ ENABLE );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref3", ORIGIN)$, 0 );
    camera ( /*@CAMERA_COMMANDS*/ PAN, < 0.000 90.000 0.000 >, < 0.000 0.000 0.000 >, 0 );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref4", ORIGIN)$, 16000 );
    set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
    set ( /*@SET_TYPES*/ "SET_NAVGOAL", "nav1b" );
    wait ( 16000.000 );

    task ( "lukedial1" )
    {
        sound ( /*@CHANNELS*/ CHAN_AUTO, "sound/chars/luke1/lukedia1.mp3" );
    }

    dowait ( "lukedial1" );
//$"default"@6
    set ( /*!*/ "SET_BEHAVIOR_STATE", /*!*/ "BS_DEFAULT" );
    set ( /*!*/ "SET_CHASE_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_LOOK_FOR_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_IGNOREALERTS", /*!*/ "false" );
    set ( /*!*/ "SET_WALKING", /*!*/ "false" );
    set ( /*!*/ "SET_RUNNING", /*!*/ "false" );
    wait ( 2000.000 );
    set ( /*@SET_TYPES*/ "SET_SABERACTIVE", /*@BOOL_TYPES*/ "true" );
    wait ( 20000.000 );
    camera ( /*@CAMERA_COMMANDS*/ DISABLE );

}

)

Then make a new script that only does the check on his health, like this:

( //Generated by BehavEd

    if ( $get( FLOAT, "SET_HEALTH")$, $<$, $50$ )
    {
        set ( /*@SET_TYPES*/ "SET_PLAYERMODEL", "Kyle" );
        set ( /*@SET_TYPES*/ "SET_PAINSCRIPT", "" );
    }

)

Name it, for example, luke_health_check. Now, if you're making the map yourself and you have a direct control on the NPC_Spawner / NPC_Luke in Radiant, select it and simply input:

 

Key: painscript

Value: <script path after "scripts/", if there's any>/luke_health_check

 

Otherwise, if you're not mapping it yourself, you can do it through your main script, like this:

( //Generated by BehavEd

rem ( "luke1" );

affect ( "luke1", /*@AFFECT_TYPE*/ FLUSH )
{
    camera ( /*@CAMERA_COMMANDS*/ ENABLE );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref3", ORIGIN)$, 0 );
    camera ( /*@CAMERA_COMMANDS*/ PAN, < 0.000 90.000 0.000 >, < 0.000 0.000 0.000 >, 0 );
    camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "ref4", ORIGIN)$, 16000 );
    set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
    set ( /*@SET_TYPES*/ "SET_NAVGOAL", "nav1b" );
    wait ( 16000.000 );

    task ( "lukedial1" )
    {
        sound ( /*@CHANNELS*/ CHAN_AUTO, "sound/chars/luke1/lukedia1.mp3" );
    }

    dowait ( "lukedial1" );
//$"default"@6
    set ( /*!*/ "SET_BEHAVIOR_STATE", /*!*/ "BS_DEFAULT" );
    set ( /*!*/ "SET_CHASE_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_LOOK_FOR_ENEMIES", /*!*/ "true" );
    set ( /*!*/ "SET_IGNOREALERTS", /*!*/ "false" );
    set ( /*!*/ "SET_WALKING", /*!*/ "false" );
    set ( /*!*/ "SET_RUNNING", /*!*/ "false" );
    wait ( 2000.000 );
    set ( /*@SET_TYPES*/ "SET_SABERACTIVE", /*@BOOL_TYPES*/ "true" );
    wait ( 20000.000 );
    camera ( /*@CAMERA_COMMANDS*/ DISABLE );

    
    set ( /*@SET_TYPES*/ "SET_PAINSCRIPT", "<path again, if any>/luke_health_check" );


}

)

If everything works correctly, every time Luke is hit that luke_health_check will verify if his health decreased below 50. Once it is, it sets the character model to Kyle and resets the painscript, so that it won't run any more checks every time Kyle is hit.

Hope this helps.

Link to comment

You should make a simple script to verify that the SET_PLAYERMODEL thing even works on NPC. I know it works for the player, but I'm not 100% sure it does for NPCs. If it doesn't we can do some other dark magic.

 

This, apparently the SET_PLAYERMODEL command doesn't work on NPCs. The only dark magic I can think of, is that as soon as the health drops below 50, an already spawned Kyle is teleported to the exact origin and angles of the original Luke entity, which is erased in the meantime.

therfiles likes this
Link to comment

This, apparently the SET_PLAYERMODEL command doesn't work on NPCs. The only dark magic I can think of, is that as soon as the health drops below 50, an already spawned Kyle is teleported to the exact origin and angles of the original Luke entity, which is erased in the meantime.

 

and player Kyle get Playermodel Luke with Icarus. yes, should be work. :)

Link to comment

@@Ramikad you read my mind, good sir! :D It won't be pretty, but maybe if the Luke NPC froze in a specific animation and then the Kyle NPC ported to that place in that same animation and angle direction. That might make a rough transition smoother.

 

The only other (weird) way was if you somehow fused Kyle and Luke's actual .GLM models together and then used two .skins to toggle between them.

Link to comment

With my luck all i wanted to do with that "Set Playermodel" function was check is that 'If' function is working :) I replaced setplayermodel with Setdismemberlimb and gues what, its working perfectly! Thank you all for your help and Time! You are great Masters of this! one more time thank you!

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...