In ActionMoverState.cpp
Search for:
Change the whole case to:
In buff.cpp
Search for:
Change it to:
In Mover.cpp
Search for:
Change the whole function to:
In MoverActEvent.cpp
Search for:
Change the whole if statement to:
In MoverParam.cpp
Search for:
Change the whole function to:
Search for:
Change the whole function to:
In WndCollecting.cpp
Search for:
Change the whole function to:
Search for:
Code:
case OBJSTA_STUN:
Code:
case OBJSTA_STUN:
if( pMover->m_dwMotion != MTI_GROGGY ) // 그로기 모션이 돌고 있지 않을때
if( (GetState() & (~OBJSTA_ACTION_ALL)) != OBJSTA_NOT_STAND ) // 아무것도 안하고 대기하는 상태에선 그로기 모션으로 다시 되돌려 놓자.
pMover->SetMotion( MTI_GROGGY, ANILOOP_LOOP, MOP_FIXED );
#ifdef __SLEEPING_FIX
if( (pMover->GetAdjParam(DST_CHRSTATE) & CHS_STUN) == 0 || (pMover->GetAdjParam(DST_CHRSTATE) & CHS_SLEEPING) == 0 )
#else
if( (pMover->GetAdjParam( DST_CHRSTATE ) & CHS_STUN) == 0 ) // 스턴상태가 끝났으면
#endif
{
pMover->m_wStunCnt = 0; // 스턴카운트 해제.
pMover->m_dwFlag &= (~MVRF_NOACTION); // 액션금지도 해제하고
ResetState( OBJSTA_ACTION_ALL ); // 액션상태도 해제한다.
#ifdef __SLEEPING_FIX
pMover->ResetDestParam( DST_CHRSTATE, CHS_STUN, FALSE );
pMover->ResetDestParam( DST_CHRSTATE, CHS_SLEEPING, FALSE );
#endif
}
break;
Search for:
Code:
case SI_MER_SHIELD_PROTECTION: case SI_MER_SHIELD_PANBARRIER: if( pMover->GetActiveHandItemProp( PARTS_SHIELD )->dwItemKind3 != IK3_SHIELD ) return TRUE; break;
Code:
case SI_MER_SHIELD_PROTECTION: case SI_MER_SHIELD_PANBARRIER: if( pMover->GetActiveHandItemProp( PARTS_SHIELD )->dwItemKind3 != IK3_SHIELD ) return TRUE; break; #ifdef __SLEEPING_FIX case SI_ELE_STF_SLIPPING: if( (pMover->GetAdjParam(DST_CHRSTATE) & CHS_STUN) == 0 ) return TRUE; break; #endif
Search for:
Code:
BOOL CMover::IsStateDbuff()
Code:
BOOL CMover::IsStateDbuff()
{
int nAdjParam = GetAdjParam( DST_CHRSTATE );
#ifdef __SLEEPING_FIX
if( nAdjParam & CHS_STUN || nAdjParam & CHS_SLEEPING || nAdjParam & CHS_POISON || nAdjParam & CHS_DARK ||
#else
if( nAdjParam & CHS_STUN || nAdjParam & CHS_POISON || nAdjParam & CHS_DARK ||
#endif
nAdjParam & CHS_GROGGY || nAdjParam & CHS_SILENT || nAdjParam & CHS_BLEEDING )
{
return TRUE;
}
return FALSE;
}
Search for:
Code:
if( nAdjParam & CHS_STUN )
Code:
#ifdef __SLEEPING_FIX
if( nAdjParam & CHS_STUN || nAdjParam & CHS_SLEEPING )
#else
if( nAdjParam & CHS_STUN ) // 스턴상태로...
#endif
{
if( pTarget->SetStun( TRUE, dwSkillTime ) == FALSE )
return FALSE;
// 일단 땜빵.
// 스턴이 걸리는건 두가지 루트가 있는데
// 1. 스킬에 맞았을때.
// 2. 스턴아이템에 맞았을때
// 3. 기타 상황(트랩같은..)
// 스킬을 사용해서 스턴이 걸린건 SkillInflu에서 처리해서
// 해제까지 시켜주기땜에 m_wStunCnt에 값이 들어가면 두군데서 해제를 시키게 된다.
// 아이템에 의해 스턴이 걸린건 SkillInflu에서 처리를 안하므로 m_wStunCnt가 필요하다.
// 이곳은 스킬에 의해서 들어오는 곳이기 때문.
// 구조가 잘못설계됐다. 스킬중심이 아니고 상태중심으로 처리가 됐어야 했다.
pTarget->m_wStunCnt = 0;
} else
Search for:
Code:
BOOL CMover::SetStun( BOOL bApply, DWORD tmMaxTime )
Code:
BOOL CMover::SetStun( BOOL bApply, DWORD tmMaxTime )
{
if( bApply )
{
MoverProp *pMoverProp = GetProp();
if( pMoverProp->dwClass == RANK_SUPER || pMoverProp->dwClass == RANK_MIDBOSS )
return FALSE; // 슈퍼몹은 스턴에 안걸린다. 이렇게 하지말고 스턴에 이뮨이 되게 설정하는게 좋다.
#ifdef __SLEEPING_FIX
if( GetAdjParam(DST_IMMUNITY) & CHS_STUN || GetAdjParam(DST_IMMUNITY) & CHS_SLEEPING )
#else
if( GetAdjParam( DST_IMMUNITY ) & CHS_STUN )
#endif
return FALSE; // 독에 면역상태다.
SetDestParam( DST_CHRSTATE, CHS_STUN, NULL_CHGPARAM, FALSE );
#ifdef __SLEEPING_FIX
SetDestParam( DST_CHRSTATE, CHS_SLEEPING, NULL_CHGPARAM, FALSE );
#endif
SendActMsg( OBJMSG_STUN ); // 스턴 상태 시작.
m_wStunCnt = (short)( (tmMaxTime / 1000.0f) * PROCESS_COUNT ); // 얼마동안이나 스턴상태가 되느냐.
}
else
{
#ifdef __SLEEPING_FIX
if( GetAdjParam(DST_CHRSTATE) & CHS_STUN || GetAdjParam(DST_CHRSTATE) & CHS_SLEEPING )
{
ResetDestParam( DST_CHRSTATE, CHS_STUN, FALSE );
ResetDestParam( DST_CHRSTATE, CHS_SLEEPING, FALSE );
}
#else
if( GetAdjParam( DST_CHRSTATE ) & CHS_STUN ) // 이거 검사안하면 매번 클라로 ResetDestParam을 날린다.
ResetDestParam( DST_CHRSTATE, CHS_STUN, FALSE); // 스턴 상태 해제.
#endif
m_wStunCnt = 0;
m_dwFlag &= (~MVRF_NOACTION); // 액션 금지 상태로 전환.
}
#ifdef __WORLDSERVER
g_UserMng.AddSetStun( this, tmMaxTime );
#endif // Worldserver
return TRUE;
}
Code:
void CMover::RemoveDebuff( DWORD dwState )
Code:
void CMover::RemoveDebuff( DWORD dwState )
{
// 스킬로 걸린건 이걸로 해제해야하고
RemoveChrStateBuffs( dwState );
// 스킬이 아닌 아이템같은걸로 상태만 걸린건 이걸로 풀어야 한다.
if( dwState & CHS_DARK )
SetDark( FALSE );
if( dwState & CHS_POISON )
SetPoison( FALSE );
#ifdef __SLEEPING_FIX
if( dwState & CHS_STUN || dwState & CHS_SLEEPING )
#else
if( dwState & CHS_STUN )
#endif
SetStun( FALSE );
#if __VER >= 10 //
if( dwState & CHS_BLEEDING )
SetBleeding( FALSE );
#if __VER >= 11 // __MA_VER11_06 // 확율스킬 효과수정 world,neuz
if( dwState & DST_CLEARBUFF )
{
RemoveDstParamBuffs( DST_SPEED );
RemoveDstParamBuffs( DST_CHR_CHANCEPOISON );
RemoveDstParamBuffs( DST_CHR_CHANCESTUN );
RemoveDstParamBuffs( DST_CHR_CHANCEBLEEDING );
}
#endif // __MA_VER11_06 // 확율스킬 효과수정 world,neuz
#endif //
// 이거 안에서 Reset을 호출한다.
SetDestParam( DST_CURECHR, dwState, NULL_CHGPARAM );
}
Search for:
Code:
BOOL CCollectingWnd::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
Code:
BOOL CCollectingWnd::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
#if __VER >= 11 // __SYS_COLLECTING
if(!g_pPlayer) return FALSE;
#ifdef __SLEEPING_FIX
if( !g_pPlayer->IsRegionAttr(RA_COLLECTING) )
{
g_WndMng.PutString( prj.GetText(TID_GAME_COLLECTING_REGION), NULL, prj.GetTextColor(TID_GAME_COLLECTING_REGION) );
return FALSE;
}
#endif
switch(nID)
{
case WIDC_BUTTON1 :
m_bIsCollecting = !m_bIsCollecting;
if(m_bIsCollecting)
{
if(!g_pPlayer->m_pActMover->IsFly())
g_DPlay.SendQueryStartCollecting();
else
g_WndMng.PutString( prj.GetText(TID_GAME_COLLECT_FLY), NULL, 0xffff0000 );
}
else
g_DPlay.SendQueryStopCollecting();
break;
};
#endif
return CWndNeuz::OnChildNotify( message, nID, pLResult );
}
This is also fixed:
After editing make sure to define __SLEEPING_FIX in your VersionCommon.h of neuz and worldserver.
Have a good one.








