/* ================ sdWalker::Spawn ================ */ void sdWalker::Spawn( void ) { animator.RemoveOriginOffset( true ); animator.ClearAllAnims( gameLocal.time, 0 ); animator.ClearAllJoints(); int anim = animator.GetAnim( "base" ); animator.PlayAnim( ANIMCHANNEL_TORSO, anim, gameLocal.time, 0 ); animator.CreateFrame( gameLocal.time, true ); LoadAF(); LoadVehicleScript(); if ( !spawnArgs.GetBool( "ik_disabled", "0" ) ) { LoadIK(); } physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f ); physicsObj.SetMass( spawnArgs.GetFloat( "mass", "10000" ) ); physicsObj.SetClipMask( MASK_VEHICLESOLID | CONTENTS_WALKERCLIP | CONTENTS_MONSTER ); // move up to make sure the monster is at least an epsilon above the floor physicsObj.SetOrigin( GetPhysics()->GetOrigin() + idVec3( 0, 0, CM_CLIP_EPSILON ) ); physicsObj.SetAxis( mat3_identity ); idVec3 gravity = spawnArgs.GetVector( "gravityDir", "0 0 -1" ); float gravityScale; if ( spawnArgs.GetFloat( "gravity", DEFAULT_GRAVITY_STRING, gravityScale ) ) { gravity *= gravityScale; } else { gravity *= g_gravity.GetFloat(); } physicsObj.SetGravity( gravity ); SetPhysics( &physicsObj ); BecomeActive( TH_THINK ); physicsObj.SetMaxStepHeight( spawnArgs.GetFloat( "ik_maxStepSpeed", "1" ) ); physicsObj.SetContents( CONTENTS_MONSTER ); stompDamage = gameLocal.declDamageType[ spawnArgs.GetString( "dmg_stomp" ) ]; minStompScale = spawnArgs.GetFloat( "stomp_min_scale" ); maxStompScale = spawnArgs.GetFloat( "stomp_max_scale" ); stompSpeedScale = spawnArgs.GetFloat( "stomp_speed_scale" ); groundPoundMinSpeed = spawnArgs.GetFloat( "ground_pound_min_speed", "200" ); groundPoundForce = spawnArgs.GetFloat( "ground_pound_force", "25000000" ); groundPoundRange = spawnArgs.GetFloat( "ground_pound_range", "512" ); kickForce = spawnArgs.GetFloat( "kick_force", "25000000" ); UpdateVisuals(); Present(); }
/* ================ rvMonsterFailedTransfer::OnDeath ================ */ void rvMonsterFailedTransfer::OnDeath ( void ) { idAI::OnDeath ( ); if ( allowSplit ) { idEntity* torso; idDict args; LoadAF ( "ragdoll_legs", true ); PlayEffect ( "fx_bloodyburst", animator.GetJointHandle ( "chest" ) ); SetSkin ( declManager->FindSkin ( spawnArgs.GetString ( "skin_legs" ) ) ); args.Copy ( *gameLocal.FindEntityDefDict ( "monster_failed_transfer_torso" ) ); args.SetVector ( "origin", GetPhysics()->GetOrigin() + GetPhysics()->GetGravityNormal() * -50.0f ); args.SetInt ( "angle", move.current_yaw ); gameLocal.SpawnEntityDef ( args, &torso ); torso->fl.takedamage = false; PostEventMS( &AI_TakeDamage, 100, 1.0f ); } }
/* ================ rvMonsterFailedTransfer::Spawn ================ */ void rvMonsterFailedTransfer::Spawn ( void ) { LoadAF ( "ragdoll_legs", true ); LoadAF ( NULL, true ); }
/* ===================== idActor::Spawn ===================== */ void idActor::Spawn( void ) { idEntity *ent; idStr jointName; float fovDegrees; copyJoints_t copyJoint; animPrefix = ""; spawnArgs.GetInt( "rank", "0", rank ); spawnArgs.GetInt( "team", "0", team ); spawnArgs.GetVector( "offsetModel", "0 0 0", modelOffset ); spawnArgs.GetBool( "use_combat_bbox", "0", use_combat_bbox ); viewAxis = GetPhysics()->GetAxis(); spawnArgs.GetFloat( "fov", "90", fovDegrees ); SetFOV( fovDegrees ); pain_debounce_time = 0; pain_delay = SEC2MS( spawnArgs.GetFloat( "pain_delay" ) ); pain_threshold = spawnArgs.GetInt( "pain_threshold" ); LoadAF(); walkIK.Init( this, IK_ANIM, modelOffset ); reachIK.Init( this, IK_ANIM, modelOffset ); // the animation used to be set to the IK_ANIM at this point, but that was fixed, resulting in // attachments not binding correctly, so we're stuck setting the IK_ANIM before attaching things. animator.ClearAllAnims( gameLocal.time, 0 ); animator.SetFrame( ANIMCHANNEL_ALL, animator.GetAnim( IK_ANIM ), 0, 0, 0 ); // spawn any attachments we might have //const idKeyValue *kv = spawnArgs.MatchPrefix( "def_attach", NULL ); //while ( kv ) { // idDict args; // args.Set( "classname", kv->GetValue().c_str() ); // // make items non-touchable so the player can't take them out of the character's hands // args.Set( "no_touch", "1" ); // // don't let them drop to the floor // args.Set( "dropToFloor", "0" ); // //gameLocal.SpawnEntityDef( args, &ent ); // if ( !ent ) { // gameLocal.Error( "Couldn't spawn '%s' to attach to entity '%s'", kv->GetValue().c_str(), name.c_str() ); // } else { // Attach( ent ); // } // kv = spawnArgs.MatchPrefix( "def_attach", kv ); //} SetupDamageGroups(); //SetupHead(); // clear the bind anim animator.ClearAllAnims( gameLocal.time, 0 ); finalBoss = spawnArgs.GetBool( "finalBoss" ); FinishSetup(); idRenderModelMD5* pModel = (idRenderModelMD5*)renderEntity.hModel; idMD5Mesh* mesh; int i; for( mesh = pModel->meshes.Ptr(), i = 0; i < pModel->meshes.Num(); i++, mesh++ ) { const idMaterial *shader = mesh->shader; /*shader = R_RemapShaderBySkin( shader, renderEntity.customSkin, renderEntity.customShader ); if ( !shader || ( !shader->IsDrawn() && !shader->SurfaceCastsShadow() ) ) { continue; }*/ } // Test BecomeActive( TH_THINK | TH_PHYSICS ); }