Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Kolizja na mapie OX


Rekomendowane odpowiedzi

Opublikowano

Witam, potrzebuję pomocy z eventem OX. Chodzi, żeby dało się przenikać przez graczy. Próbowałem to rozwiązać tak: ale niestety nie działa.

 

BOOL CInstanceBase::CheckAdvancing()
{
#ifdef __MOVIE_MODE__
    if (IsMovieMode())
        return FALSE;
#endif


    std::string strMapName = CPythonBackground::Instance().GetWarpMapName();
    if (strMapName == "metin2_map_oxevent")
    {
        //BlockMovement();
        return TRUE;
    }


    if (!__IsMainInstance() && !IsAttacking())
    {
        if (IsPC() && IsWalking())
        {
            CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
            for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd();++i)
            {
                CInstanceBase* pkInstEach=*i;
                if (pkInstEach==this)
                    continue;
                if (!pkInstEach->IsDoor())
                    continue;


                if (m_GraphicThingInstance.TestActorCollision(pkInstEach->GetGraphicThingInstanceRef()))
                {
                    BlockMovement();
                    return true;
                }
            }              
        }
        return FALSE;
    }


    if (m_GraphicThingInstance.CanSkipCollision())
    {
        //Tracenf("%x VID %d Ă浹 ˝şĹµ", ELTimer_GetMSec(), GetVirtualID());
        return FALSE;
    }




    BOOL bUsingSkill = m_GraphicThingInstance.IsUsingSkill();


    m_dwAdvActorVID = 0;
    UINT uCollisionCount=0;


    CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd();++i)
    {
        CInstanceBase* pkInstEach=*i;
        if (pkInstEach==this)
            continue;


        CActorInstance& rkActorSelf=m_GraphicThingInstance;
        CActorInstance& rkActorEach=pkInstEach->GetGraphicThingInstanceRef();


        //NOTE : SkilŔ» ľ˛´ő¶óµµ Door Type°ú´Â CollisionĂĽĹ© ÇŃ´Ů.
        if( bUsingSkill && !rkActorEach.IsDoor() )
            continue;
            
        // ľŐŔ¸·Î ŔüÁřÇŇĽö Ŕִ°ˇ?
        if (rkActorSelf.TestActorCollision(rkActorEach))
        {
            uCollisionCount++;
            if (uCollisionCount==2)
            {
                rkActorSelf.BlockMovement();
                return TRUE;
            }
            rkActorSelf.AdjustDynamicCollisionMovement(&rkActorEach);


            if (rkActorSelf.TestActorCollision(rkActorEach))
            {
                rkActorSelf.BlockMovement();
                return TRUE;
            }
            else
            {
                NEW_MoveToDestPixelPositionDirection(NEW_GetDstPixelPositionRef());
            }
        }
    }


    // ¸ĘĽÓĽş ĂĽĹ©
    CPythonBackground& rkBG=CPythonBackground::Instance();
    const D3DXVECTOR3 & rv3Position = m_GraphicThingInstance.GetPosition();
    const D3DXVECTOR3 & rv3MoveDirection = m_GraphicThingInstance.GetMovementVectorRef();


    // NOTE : ¸¸ľŕ Ŕ̵ż °Ĺ¸®°ˇ Ĺ©´Ů¸é ÂɰłĽ­ ±¸°Ł ş°·Î ĽÓĽşŔ» ĂĽĹ©ÇŘ ş»´Ů
    //        ÇöŔç ĽłÁ¤ÇŘ łőŔş 10.0f´Â ŔÓŔÇŔÇ °Ĺ¸® - [levites]
    int iStep = int(D3DXVec3Length(&rv3MoveDirection) / 10.0f);
    D3DXVECTOR3 v3CheckStep = rv3MoveDirection / float(iStep);
    D3DXVECTOR3 v3CheckPosition = rv3Position;
    for (int j = 0; j < iStep; ++j)
    {
        v3CheckPosition += v3CheckStep;


        // Check
        if (rkBG.isAttrOn(v3CheckPosition.x, -v3CheckPosition.y, CTerrainImpl::ATTRIBUTE_BLOCK))
        {
            BlockMovement();
            //return TRUE;
        }
    }


    // Check
    D3DXVECTOR3 v3NextPosition = rv3Position + rv3MoveDirection;
    if (rkBG.isAttrOn(v3NextPosition.x, -v3NextPosition.y, CTerrainImpl::ATTRIBUTE_BLOCK))
    {
        BlockMovement();
        return TRUE;
    }


    return FALSE;
}
  • 2 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...