void CSPCharacter::Think() { BaseClass::Think(); CPlanet* pPlanet = GetNearestPlanet(); if (pPlanet && !HasMoveParent()) { m_flLastEnteredAtmosphere = GameServer()->GetGameTime(); m_flRollFromSpace = GetGlobalAngles().r; } SetMoveParent(pPlanet); if (pPlanet) { // Estimate this planet's mass given things we know about earth. Assume equal densities. double flEarthVolume = 1097509500000000000000.0; // cubic meters double flEarthMass = 5974200000000000000000000.0; // kilograms // 4/3 * pi * r^3 = volume of a sphere CScalableFloat flPlanetVolume = pPlanet->GetRadius()*pPlanet->GetRadius()*pPlanet->GetRadius()*(M_PI*4/3); double flPlanetMass = RemapVal(flPlanetVolume, CScalableFloat(), CScalableFloat(flEarthVolume, SCALE_METER), 0, flEarthMass); double flG = 0.0000000000667384; // Gravitational constant CScalableVector vecDistance = (pPlanet->GetGlobalOrigin() - GetGlobalOrigin()); CScalableFloat flDistance = vecDistance.Length(); CScalableFloat flGravity = CScalableFloat(flPlanetMass*flG, SCALE_METER)/(flDistance*flDistance); CScalableVector vecGravity = vecDistance * flGravity / flDistance; SetGlobalGravity(vecGravity); } }
void CSPCharacter::StandOnNearestPlanet() { CPlanet* pPlanet = GetNearestPlanet(FINDPLANET_ANY); if (!pPlanet) return; CScalableVector vecPlanetOrigin = pPlanet->GetGlobalOrigin(); CScalableVector vecCharacterOrigin = GetGlobalOrigin(); CScalableVector vecCharacterDirection = (vecCharacterOrigin - vecPlanetOrigin).Normalized(); SetMoveParent(pPlanet); TVector vecPoint, vecNormal; pPlanet->CollideLocal(vecCharacterDirection * (pPlanet->GetRadius()*2.0f), TVector(), vecPoint, vecNormal); SetLocalOrigin(vecPoint); }
BOOL CMainDlg::OnInitDialog() { CDialog::OnInitDialog(); m_BitmapBk.LoadBitmap(IDB_MAIN); ::SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX); CRect rect; GetClientRect(&rect); rect.bottom -= 3; rect.right -= 2; MoveWindow(&rect); CenterWindow(); SetMoveParent(FALSE); SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); SetWindowText(WINDOW_CAPTION); CreateCaption(WINDOW_CAPTION); SetButton(&m_Button[BUTTON_MONITOR], IDC_MONITOR); SetButton(&m_Button[BUTTON_LOG], IDC_LOG); SetButton(&m_Button[BUTTON_ACL], IDC_ACL); SetButton(&m_Button[BUTTON_SYSTEMSET], IDC_SYSTEMSET); SetButton(&m_Button[BUTTON_ONLINE], IDC_ONLINE); SetButton(&m_Button[BUTTON_HELP], IDHELP); SetButton(&m_Button[BUTTON_ABOUT], IDC_ABOUT); SetButton(&m_Button[BUTTON_PARAMETER], IDC_PARAMETER); m_ButtonClose.SubclassDlgItem(IDC_CLOSE, this); m_ButtonClose.SetBitmaps(IDB_CLOSE); m_ButtonClose.SetToolTipText(BUTTON_CAPTION_HIDE); m_ButtonMin.SubclassDlgItem(IDC_MIN, this); m_ButtonMin.SetBitmaps(IDB_MIN); m_ButtonMin.SetToolTipText(BUTTON_CAPTION_MIN); m_ButtonTopMost.SubclassDlgItem(IDC_TOPMOST, this); m_ButtonTopMost.SetBitmaps(IDB_TOPMOST_NORMAL); m_ButtonTopMost.SetToolTipText(BUTTON_CAPTION_TOPMOST); m_ButtonPasseck.SubclassDlgItem(IDC_PASSECK, this); m_ButtonPasseck.SetBitmaps(IDB_PASSECK_FOCUS, IDB_PASSECK_NORMAL); m_ButtonPasseck.DrawBorder(FALSE); m_ButtonPasseck.SetBtnCursor(IDC_HAND); m_ButtonLamp[WORKMODE_PASSALL].SetLamp(IDC_GREEN, IDB_GREEN_FOCUS, IDB_GREEN_NORMAL, IDB_GREEN_SELECT, BUTTON_CAPTION_GREEN, this); m_ButtonLamp[WORKMODE_FILTER].SetLamp(IDC_YELLOW, IDB_YELLOW_FOCUS, IDB_YELLOW_NORMAL, IDB_YELLOW_SELECT, BUTTON_CAPTION_YELLOW, this); m_ButtonLamp[WORKMODE_DENYALL].SetLamp(IDC_RED, IDB_RED_FOCUS, IDB_RED_NORMAL, IDB_RED_SELECT, BUTTON_CAPTION_RED, this); SetLampSelect(theApp.m_AclFile.GetHeader()->bWorkMode); m_SubParent.SubclassDlgItem(IDC_SUB_PARENT, this); m_ParameterSub.Create(IDD_PARAMETER_SUB, &m_SubParent); m_AclSub.Create(IDD_ACL_SUB, &m_SubParent); m_MonitorSub.Create(IDD_MONITOR_SUB, &m_SubParent); m_LogSub.Create(IDD_LOG_SUB, &m_SubParent); m_SystemSet.Create(IDD_SYSTEM_SET, &m_SubParent); m_OnLine.Create(IDD_ONLINE, &m_SubParent); m_About.Create(IDD_ABOUT, &m_SubParent); OnParameter(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }