//===========================================================================// // File: SRMWeaponSubsystem.cpp //---------------------------------------------------------------------------// // Date Who Modification // // -------- --- ---------------------------------------------------------- // // 05/18/99 DPB Created File //---------------------------------------------------------------------------// // Copyright (C) 1998, Fasa Interactive // // All Rights reserved worldwide // // This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL // //===========================================================================// #include "MW4Headers.hpp" #include "SRMWeaponSubsystem.hpp" #include "Missile.hpp" #include "MWObject.hpp" #include "SubsystemClassData.hpp" #include #include #include //############################################################################# //############################ SRMWeaponSubsystem ######################### //############################################################################# SRMWeaponSubsystem::ClassData* SRMWeaponSubsystem::DefaultData = NULL; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void SRMWeaponSubsystem::InitializeClass() { Verify(!DefaultData); DefaultData = new ClassData( SRMWeaponSubsystemClassID, "MechWarrior4::SRMWeaponSubsystem", MissileWeapon::DefaultData, 0, NULL, (Entity::Factory)Make, (Entity::CreateMessage::Factory)CreateMessage::ConstructCreateMessage, ExecutionStateEngine::DefaultData, (Entity::GameModel::Factory)GameModel::ConstructGameModel, NULL, (Entity::GameModel::ReadAndVerifier)GameModel::ReadAndVerify, (Entity::GameModel::ModelWrite)GameModel::WriteToText, (Entity::GameModel::ModelSave)GameModel::SaveGameModel, (Subsystem::StreamCreate)CreateStream ); Register_Object(DefaultData); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void SRMWeaponSubsystem::TerminateClass() { Unregister_Object(DefaultData); delete DefaultData; DefaultData = NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // SRMWeaponSubsystem* SRMWeaponSubsystem::Make( CreateMessage *message, ReplicatorID *base_id ) { Check_Object(message); gos_PushCurrentHeap(Heap); SRMWeaponSubsystem *new_entity = new SRMWeaponSubsystem(DefaultData, message, base_id, NULL); gos_PopCurrentHeap(); Check_Object(new_entity); return new_entity; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // SRMWeaponSubsystem::SRMWeaponSubsystem( ClassData *class_data, CreateMessage *message, ReplicatorID *base_id, ElementRenderer::Element *element ): MissileWeapon(class_data, message, base_id, element) { Check_Pointer(this); Check_Object(message); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // SRMWeaponSubsystem::~SRMWeaponSubsystem() { } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void SRMWeaponSubsystem::CreateProjectile(Time till) { Check_Object(this); const GameModel *model = GetGameModel(); Check_Object(model); if(model->projectileModelResource != ResourceID::Null) { // //--------------------------------- //Get the ClassID from the Resource //--------------------------------- // ClassID class_ID; class_ID = GetClassIDFromDataListID(model->projectileModelResource); Verify(class_ID != NullClassID); ReplicatorID site_id = ReplicatorID::Null; Normal3D target_normal; Motion3D initial_velocity = Motion3D::Identity; Motion3D initial_acceleration = Motion3D::Identity; LinearMatrix4D site_local_to_world; //-------------------------------- //Initialize the velocities //-------------------------------- // Check_Object(sitePointer); site_local_to_world = sitePointer->GetLocalToWorld(); // Check_Object(sitePointer); // site_local_to_world = sitePointer->GetLocalToWorld(); // MSL 5.02 SRM Tracking initial_velocity.linearMotion.Multiply( model->initialLinearVelocity, site_local_to_world ); initial_acceleration.linearMotion = model->initialLinearAcceleration; ReplicatorID target_id; target_id = ReplicatorID::Null; Point3D target_point; Entity *ray_source = targetQueryEntity.GetCurrent(); if(ray_source) { Check_Object(ray_source); target_id = ray_source->GetReplicatorID(); // Point3D trans; // targetQuery.m_line->FindEnd(&trans); // target_point.MultiplyByInverse( // trans, // ray_source->GetLocalToWorld() // ); // MSL 5.02 SRM Tracking target_point = m_lockedTargetEntityPartOffset; } else { targetQuery.m_line->FindEnd(&target_point); } // MSL 5.02 SRM Tracking // Vector3D direction; // direction.Subtract(target_point,(Stuff::Point3D)site_local_to_world); // LinearMatrix4D direction_matrix = LinearMatrix4D::Identity; // direction_matrix.BuildTranslation((Stuff::Point3D)site_local_to_world); // direction_matrix.AlignLocalAxisToWorldVector(direction, Z_Axis, Y_Axis, X_Axis); // initial_velocity.linearMotion.Multiply(model->initialLinearVelocity, direction_matrix); // //------------------------------------ //Create the Missile CreateMessage //------------------------------------ // // MSL 5.02 SRM Tracking int flags = WeaponMover::DefaultFlags; if(numberEffectedByAMS > 0) { numberEffectedByAMS --; flags |= Missile::DoesAMSDestroyFlag; } Missile::CreateMessage projectile_create_message( sizeof(Missile::CreateMessage), DefaultEventPriority, CreateMessage::DefaultFlags, class_ID, flags, // WeaponMover::DefaultFlags, model->projectileModelResource, // direction_matrix, sitePointer->GetLocalToWorld(), 0.0f, Missile::ExecutionStateEngine::SSRMMotionState, NameTable::NullObjectID, Entity::DefaultAlignment, initial_velocity, initial_acceleration, model->damageAmount, model->heatToDeal, model->maxDistance, // MSL 5.03 Min Distance // model->minDistance, GetParentVehicle()->GetReplicatorID(), model->splashRadius, model->percentageOfDamageToDirectHit, model->minPercentageOfDamageToSphereHit, model->maxPercentageOfDamageToSphereHit, model->itemID, target_id, target_point, model->burnTime ); MemoryStream stream(&projectile_create_message, projectile_create_message.messageLength); Entity *entity; ReplicatorID projectile_id = Connection::Hermit->GetNextReplicatorID(); entity = CreateEntity(&stream, &projectile_id, false); Check_Object(entity); Map::GetInstance()->AddChild(entity); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void SRMWeaponSubsystem::TestInstance() const { Verify(IsDerivedFrom(DefaultData)); }