Source Development Mob's Quest Marker

zLuke

Very Active Pirate
Developer
Registered
LV
4
 
Joined
Jan 29, 2026
Messages
74
Reaction score
59
Points
63
Age
41
Displays a marker over a mob if it is required for a quest and the goal has not yet been reached.

1776869439495.webp

\sources\Server\Mission.h:128
insert
C++:
BOOL    MisNeedKill(USHORT sWareID);

\sources\Server\Mission.cpp:1228
insert
C++:
BOOL CCharMission::MisNeedKill(USHORT sWareID)
{
    for (int i = 0; i < m_byNumTrigger; i++)
    {
        if (m_Trigger[i].byType == TE_KILL && sWareID == m_Trigger[i].wParam1)
        {
            return !(m_Trigger[i].wParam4 >= m_Trigger[i].wParam2);
        }
    }
    return FALSE;
}

\sources\Server\Mission.cpp:1572
after
C++:
if( Data.byType == TE_GET_ITEM )
{
    m_pRoleChar->RefreshNeedItem( Data.wParam1 );
}
insert
C++:
else if( Data.byType == TE_KILL )
        {
            m_pRoleChar->RefreshQuestKillMarkers( Data.wParam1 );
        }

\sources\Server\Mission.cpp:1622
in function void CCharMission::ClearTrigger( DWORD dwIndex )
after

C++:
if( dwIndex >= m_byNumTrigger )
            return;
insert
C++:
BYTE byOldType = m_Trigger[dwIndex].byType;
USHORT sOldParam1 = m_Trigger[dwIndex].wParam1;

after
C++:
memcpy( m_Trigger + dwIndex, Trigger + dwIndex + 1, sizeof(TRIGGER_DATA)*( m_byNumTrigger - dwIndex - 1 ) );
        m_byNumTrigger--;
insert
C++:
if( byOldType == TE_KILL && m_pRoleChar )
        {
            m_pRoleChar->RefreshQuestKillMarkers( sOldParam1 );
        }

\sources\Server\Character.h:335
after
C++:
BOOL    IsMisNeedItem( USHORT sItemID );
insert
C++:
BOOL    IsMisNeedKill(USHORT sWareID);
void    RefreshQuestKillMarkers(USHORT sWareID);

\sources\Server\Character.cpp:503
in function void CCharacter::OnBeginSeen(CCharacter *pCCha)
before

C++:
WRITE_CHAR( pk, byShowType );
WRITE_CHAR(pk,  byState );
insert
C++:
else if( pCCha && pCCha->GetPlayer() && m_pCChaRecord )
    {
        const Char chType = (Char)getAttr( ATTR_CHATYPE );
        const bool bIsMonster =
            (chType == enumCHACTRL_MONS) ||
            (chType == enumCHACTRL_MONS_TREE) ||
            (chType == enumCHACTRL_MONS_MINE) ||
            (chType == enumCHACTRL_MONS_FISH) ||
            (chType == enumCHACTRL_MONS_DBOAT) ||
            (chType == enumCHACTRL_MONS_REPAIRABLE);

        if( bIsMonster && pCCha->GetPlayer()->MisNeedKill( (USHORT)m_pCChaRecord->lID ) )
        {
            byState |= ROLE_MIS_ACCEPT;
        }
    }

\sources\Server\Character.cpp:3863
after
C++:
BOOL CCharacter::IsMisNeedItem( USHORT sItemID )
{T_B
    return ( GetPlayer() ) ? GetPlayer()->MisNeedItem( sItemID ) : FALSE;
T_E}
insert
C++:
BOOL CCharacter::IsMisNeedKill(USHORT sWareID)
{
    T_B
        return (GetPlayer()) ? GetPlayer()->MisNeedKill(sWareID) : FALSE;
    T_E
}
void CCharacter::RefreshQuestKillMarkers( USHORT sWareID )
{
    if( !GetPlayer() || !GetSubMap() )
        return;

    BYTE byState = GetPlayer()->MisNeedKill( sWareID ) ? ROLE_MIS_ACCEPT : 0;

    Point pt = GetPos();
    Rect rect = GetSubMap()->GetEyeshot( pt );
    for( long y = rect.ltop.y; y <= rect.rbtm.y; y++ )
    {
        for( long x = rect.ltop.x; x <= rect.rbtm.x; x++ )
        {
            Entity* pEnt = GetSubMap()->m_pCEyeshotCell[y][x].m_pCChaL;
            while( pEnt )
            {
                CCharacter* pCha = pEnt->IsCharacter();
                if( pCha && pCha != this && pCha->m_pCChaRecord )
                {
                    const Char chType = (Char)pCha->getAttr( ATTR_CHATYPE );
                    const bool bIsMonster =
                        (chType == enumCHACTRL_MONS) ||
                        (chType == enumCHACTRL_MONS_TREE) ||
                        (chType == enumCHACTRL_MONS_MINE) ||
                        (chType == enumCHACTRL_MONS_FISH) ||
                        (chType == enumCHACTRL_MONS_DBOAT) ||
                        (chType == enumCHACTRL_MONS_REPAIRABLE);

                    if( bIsMonster && (USHORT)pCha->m_pCChaRecord->lID == sWareID )
                    {
                        WPACKET packet = GETWPACKET();
                        WRITE_CMD( packet, CMD_MC_NPCSTATECHG );
                        WRITE_LONG( packet, pCha->GetID() );
                        WRITE_CHAR( packet, byState );
                        ReflectINFof( this, packet );
                    }
                }

                pEnt = pEnt->m_pCEyeshotCellNext;
            }
        }
    }
}

Enjoy!!!

(c) zLuke
 
Last edited:
If you want the marker color to be yellow, change ROLE_MIS_ACCEPT to ROLE_MIS_DELIVERY in two places.

1776875337958.webp