Script:Files:script/placement/player.script

From Mod Wiki
object placement_player {
    void                preinit();
    void                init();
    void                destroy();
};

void placement_player::preinit() {
}

void placement_player::init() {

    float index = 1;

    float jointHandle;
    string jointName;

    float waistJoint = getJointHandle( getKeyWithDefault( "waist_joint", "Spine" ) );
    vector waistAngles;
    waistAngles_x = getFloatKey( "waist_pitch" );
    waistAngles_y = getFloatKey( "waist_yaw" );
    waistAngles_z = getFloatKey( "waist_roll" );
    setJointAngle( waistJoint, JOINTMOD_WORLD, waistAngles );

    float headJoint = getJointHandle( getKeyWithDefault( "head_joint", "Head" ) );
    vector headAngles;
    headAngles_x = getFloatKey( "head_pitch" );
    headAngles_y = getFloatKey( "head_yaw" );
    headAngles_z = getFloatKey( "head_roll" );
    setJointAngle( headJoint, JOINTMOD_WORLD, headAngles );

    float neckJoint = getJointHandle( getKeyWithDefault( "neck_joint", "Neck" ) );
    vector neckAngles;
    neckAngles_x = getFloatKey( "neck_pitch" );
    neckAngles_y = getFloatKey( "neck_yaw" );
    neckAngles_z = getFloatKey( "neck_roll" );
    setJointAngle( neckJoint, JOINTMOD_WORLD, neckAngles );

        index = 1;
    while ( true ) {
        jointName = getKey( "joint" + index );
        if ( jointName == "" ) {
            break;
        }

        float joint = getJointHandle( jointName );
        vector angles;
        angles_x = getFloatKey( "joint" + index + "_pitch" );
        angles_y = getFloatKey( "joint" + index + "_yaw" );
        angles_z = getFloatKey( "joint" + index + "_roll" );
        setJointAngle( joint, JOINTMOD_WORLD, angles );

        index = index + 1;
    }

    string anim = getKey( "anim" );
    float frame = getFloatKeyWithDefault( "frame", -1 );
    if ( anim != "" ) {
        if ( frame != -1 ) {
            setAnimFrame( anim, ANIMCHANNEL_ALL, frame );
        } else if ( getFloatKey( "cycle" ) ) {
            playCycle( ANIMCHANNEL_ALL, anim );
        } else {
            playAnim( ANIMCHANNEL_ALL, anim );
        }
    }

    string weaponModel = getKey( "weapon_model" );
    string weaponJoint;
    string weaponEffect;
    float weaponJointHandle;
    entity weapon;
    if ( weaponModel != "" ) {
        weapon = sys.spawn( "placement_weapon" );
        weapon.setModel( weaponModel );

        weaponJoint = getKey( "weapon_joint" );
        if ( weaponJoint == "" ) {
            sys.warning( "placement_player::init no joint specified for weapon" );
        } else {
            weaponJointHandle = getJointHandle( weaponJoint );
            weapon.setOrigin( getJointPos( weaponJointHandle ) );
            weapon.setAngles( getJointAngle( weaponJointHandle ) );

            weapon.bindToJoint( self, weaponJoint, 1 );
        }

        weaponEffect = getKey( "weapon_effect" );
    }    

    float modelNumber = 1;
    while ( true ) {
        string modelDefName = "model" + modelNumber;
        string modelName = getKey( modelDefName );    
        if ( modelName == "" ) {
            break;
        }

        entity model = sys.spawn( "placement_weapon" );
        model.setModel( modelName );
        string modelJoint = getKey( modelDefName + "_joint" );
        if ( modelJoint == "" ) {
            sys.warning( "placement_player::init no joint for " + modelDefName );
        } else {
            float modelJointHandle = getJointHandle( modelJoint );
            model.setOrigin( getJointPos( modelJointHandle ) );
            model.setAngles( getJointAngle( modelJointHandle ) );

            model.bindToJoint( self, modelJoint, 1 );
        }

        modelNumber++;
    }

    string effectJoint;
    float effectWait;
    if ( weaponEffect != "" ) {
        effectJoint = getKey( "weapon_effect_joint" );
        effectWait = getFloatKey( "weapon_effect_wait" );

        while ( true ) {
            weapon.playEffect( weaponEffect, effectJoint, 0 );

            if ( effectWait <= 0 ) {
                break;
            }
            sys.wait( effectWait );
        }
    }
}

void placement_player::destroy() {
}