void CPHDestroyable::InitServerObject(CSE_Abstract* D) { CPhysicsShellHolder *obj =PPhysicsShellHolder() ; CSE_ALifeDynamicObjectVisual *l_tpALifeDynamicObject = smart_cast<CSE_ALifeDynamicObjectVisual*>(D); VERIFY (l_tpALifeDynamicObject); l_tpALifeDynamicObject->m_tGraphID =obj->ai_location().game_vertex_id(); l_tpALifeDynamicObject->m_tNodeID = obj->ai_location().level_vertex_id(); // l_tpALifePhysicObject->startup_animation=m_startup_anim; D->set_name_replace (""); //. D->s_gameid = u8(GameID()); D->s_RP = 0xff; D->ID = 0xffff; D->ID_Phantom = 0xffff; D->o_Position = obj->Position(); if (ai().get_alife()) l_tpALifeDynamicObject->m_tGraphID = ai().game_graph().current_level_vertex(); else l_tpALifeDynamicObject->m_tGraphID = 0xffff; obj->XFORM().getXYZ (D->o_Angle); D->s_flags.assign (M_SPAWN_OBJECT_LOCAL); D->RespawnTime = 0; }
void CPHShellSimpleCreator::CreatePhysicsShell() { CPhysicsShellHolder* owner = smart_cast<CPhysicsShellHolder*>(this); VERIFY(owner); if (!owner->Visual()) return; CKinematics* pKinematics = smart_cast<CKinematics*>(owner->Visual()); VERIFY (pKinematics); if(owner->PPhysicsShell()) return; owner->PPhysicsShell() = P_create_Shell(); #ifdef DEBUG owner->PPhysicsShell()->dbg_obj=owner; #endif owner->m_pPhysicsShell->build_FromKinematics (pKinematics,0); owner->PPhysicsShell()->set_PhysicsRefObject (owner); //m_pPhysicsShell->SmoothElementsInertia(0.3f); owner->PPhysicsShell()->mXFORM.set (owner->XFORM()); owner->PPhysicsShell()->SetAirResistance (0.001f, 0.02f); }
bool CPHSkeleton::Spawn(CSE_Abstract *D) { CSE_PHSkeleton *po = smart_cast<CSE_PHSkeleton*>(D); VERIFY (po); m_flags = po->_flags; CSE_Visual *visual = smart_cast<CSE_Visual*>(D); VERIFY (visual); m_startup_anim = visual->startup_animation; if(po->_flags.test(CSE_PHSkeleton::flSpawnCopy)) { CPHSkeleton* source=smart_cast<CPHSkeleton*>(Level().Objects.net_Find(po->source_id)); R_ASSERT2(source,"no source"); source->UnsplitSingle(this); m_flags.set (CSE_PHSkeleton::flSpawnCopy,FALSE); po->_flags.set (CSE_PHSkeleton::flSpawnCopy,FALSE); po->source_id =BI_NONE; return true; } else { CPhysicsShellHolder *obj = PPhysicsShellHolder(); IKinematics *K = NULL; if (obj->Visual()) { K= smart_cast<IKinematics*>(obj->Visual()); if(K) { K->LL_SetBoneRoot(po->saved_bones.root_bone); K->LL_SetBonesVisible(po->saved_bones.bones_mask); } } SpawnInitPhysics(D); RestoreNetState(po); if(obj->PPhysicsShell()&&obj->PPhysicsShell()->isFullActive()) obj->PPhysicsShell()->GetGlobalTransformDynamic(&obj->XFORM()); CPHDestroyableNotificate::spawn_notificate(D); if(K) { CInifile* ini=K->LL_UserData(); if(ini&&ini->section_exist("collide")) { if(ini->line_exist("collide","not_collide_parts")) { CGID gr= CPHCollideValidator::RegisterGroup(); obj->PPhysicsShell()->RegisterToCLGroup(gr); } } if(ini&&ini->section_exist("collide_parts")) { if(ini->line_exist("collide_parts","small_object")) { obj->PPhysicsShell()->SetSmall(); } if(ini->line_exist("collide_parts","ignore_small_objects")) { obj->PPhysicsShell()->SetIgnoreSmall(); } } } } return false; }