LV
4
- Joined
- Jan 29, 2026
- Messages
- 75
- Reaction score
- 60
- 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.

\sources\Server\Mission.h:128
insert
\sources\Server\Mission.cpp:1228
insert
\sources\Server\Mission.cpp:1572
after
insert
\sources\Server\Mission.cpp:1622
in function void CCharMission::ClearTrigger( DWORD dwIndex )
after
insert
after
insert
\sources\Server\Character.h:335
after
insert
\sources\Server\Character.cpp:503
in function void CCharacter::OnBeginSeen(CCharacter *pCCha)
before
insert
\sources\Server\Character.cpp:3863
after
insert
Enjoy!!!
(c) zLuke

\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 );
}
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;
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--;
C++:
if( byOldType == TE_KILL && m_pRoleChar )
{
m_pRoleChar->RefreshQuestKillMarkers( sOldParam1 );
}
\sources\Server\Character.h:335
after
C++:
BOOL IsMisNeedItem( USHORT sItemID );
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 );
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}
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:
