#include "stdafx.h" #include "MoveStateControl.h" #include "NumericValues.h" #include "Player.h" #include "PlayerRider.h" #include "./Status/StatusManager.h" #include "SkillSystem/CSSyncTuner.h" void MoveStateControl::Init(Character *pOwner, eCHAR_MOVE_STATE eMoveState) { m_pOwner = pOwner; SetMoveState(eMoveState); } void MoveStateControl::SetMoveState(eCHAR_MOVE_STATE eMoveState) { m_eMoveState = eMoveState; if(m_pOwner->IsEqualObjectKind(PLAYER_OBJECT)) { m_fBaseMoveSpeed = GetBaseMoveSpeedAsState(m_eMoveState); } else if(m_pOwner->IsEqualObjectKind(NPC_OBJECT)) { NPC* pNPC = static_cast(m_pOwner); const BASE_NPCINFO* npc_info = pNPC->GetBaseInfo(); switch(m_eMoveState) { case CMS_WALK: m_fBaseMoveSpeed = npc_info->m_fWalkSpeed * SPEED_MULTIPLIER; break; case CMS_RUN: m_fBaseMoveSpeed = npc_info->m_fRunSpeed * SPEED_MULTIPLIER; break; default: m_fBaseMoveSpeed = GetBaseMoveSpeedAsState(m_eMoveState); } } #ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT // must be settled at last position if (m_pOwner->IsEqualObjectKind(PLAYER_OBJECT)) { static_cast(m_pOwner)->GetSyncTuner()->OnChangeAttribute(); }; #endif } float MoveStateControl::GetMoveSpeed() { // (NOTE) »ó´çÈ÷ ÀÛÀº ¼öÄ¡ ¿¬»êÀÌ ÀÌ·ïÁø´Ù. Á¤È®µµ ¹®Á¦·Î Á» ´õ Å« ¼ö¿¡¼­ ³î´Ù°¡ ³ª´©ÀÚ. // (Dex.|Item|Skill) // (Base Formula) MoveSpeed = BaseMoveSpeed * Owner's MoveSpeedRatio / 100.0 // if(GM) then MoveSpeed = MoveSpeed * AddMoveSpeedRatio // (Riding Formula) MoveSpeed = // CHANGES: f110802.3L, synchronize gm speed with client const bool is_player = m_pOwner->IsEqualObjectKind(PLAYER_OBJECT); float move_speed = m_fBaseMoveSpeed; if (is_player == false) { float move_speed_ratio = static_cast(m_pOwner->GetMoveSpeedRatio()); move_speed = move_speed * move_speed_ratio / 100.0f; } else if (Player* player = static_cast(m_pOwner)) { // (THINKING) : µûÁ®º¸´Ï CMS_RUNÀÇ »óŰ¡ ¾Æ´Ñ »óÅ¿¡¼­ RidingÀ̶ó°í ´õ »¡¶óÁö´Â °Íµµ ¿ì½À´Ù. // ÇÏÁö¸¸ »ý°¢ ÀÌ»óÀ¸·Î Ŭ¶óÀÌ¾ðÆ®¿Í µ¿±â ¹®Á¦°¡ ¸¹ÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ» °Í °°¾Æ ÀÏ´Ü º¸·ù. const bool is_rider_summoned = player->GetStatusManager()->Status.IsRidingRider(); float add_move_speed_ratio = player->GetAddMoveSpeedRatio(); bool applied_gm_speed = (add_move_speed_ratio > 1.0f); // Çϱ⠳»¿ë¿¡¼­ ´ÜÀ§¸¦ Á¤È®È÷ ÆÄ¾ÇÇÏÀÚ. float move_speed_ratio = 100.0f; // Riding »óÅ¿¡¼­´Â GM ¼Óµµ Á¦¾î ¸í·É ¸ÔÈ÷Áö ¾Ê´Â´Ù. if (is_rider_summoned) { PlayerAttributes& player_attrs = static_cast(player->GetAttr()); move_speed_ratio = static_cast(player_attrs.GetRiderSpeedRatio()); } else if (applied_gm_speed == false) { move_speed_ratio = static_cast(player->GetMoveSpeedRatio()); }; move_speed = move_speed * move_speed_ratio; if (applied_gm_speed == false) { move_speed = move_speed / 100.0f; } else { move_speed = move_speed * add_move_speed_ratio / 100.0f; }; }; return move_speed; } // CHANGES: f110805.2L float MoveStateControl::GetPlayerSpeedInMoving() { if (m_pOwner == NULL || m_pOwner->IsEqualObjectKind(PLAYER_OBJECT) == false) { return 0.0f; }; if (m_eMoveState == CMS_RUN) { return this->GetMoveSpeed(); }; const eCHAR_MOVE_STATE backup_moving_state = m_eMoveState; const float running_speed = ns_formula::GetBaseMoveSpeedAsState(CMS_RUN); const float current_speed = ns_formula::GetBaseMoveSpeedAsState(backup_moving_state); if (running_speed <= current_speed) { return this->GetMoveSpeed(); }; float base_moving_speed = m_fBaseMoveSpeed; // m_eMoveState = CMS_RUN; m_fBaseMoveSpeed = ns_formula::GetBaseMoveSpeedAsState(CMS_RUN); float calculated_running_speed = this->GetMoveSpeed(); m_eMoveState = backup_moving_state; m_fBaseMoveSpeed = base_moving_speed; return calculated_running_speed; } #ifdef _NA_0_20110803_PLAYER_MOVEMENT_SYNC float MoveStateControl::GetLimitMaxSpeed() { eCHAR_MOVE_STATE move_state = m_eMoveState; SetMoveState(CMS_RUN); float speed = GetMoveSpeed(); SetMoveState(move_state); return speed; } #endif