void CMover::CMD_SetMeleeAttack( OBJID idTarget, FLOAT fRange ) { ItemProp *pProp = GetActiveHandItemProp(); if( pProp->dwItemKind2 == IK2_TOOLS ) // 툴을 들고선 공격못한다,. return; if( m_pActMover->IsActAttack() ) return; if( IsDie() ) return; // 죽었을때 사용금지. // 요요는 밀리어택이긴 하나 약간 거리를 두고 공격한다.( 프로퍼티 참조함 ) if( pProp->dwItemKind3 == IK3_YOYO ) fRange = GetAttackRange( pProp->dwAttackRange ); #ifdef __CLIENT ClearActParam(); SetDestObj( idTarget, fRange ); // 이동할 목표물을 idTarget으로 설정. SetCmd( OBJACT_MELEE_ATTACK, idTarget ); // 사정거리가 되었을때 실행할 명령 셋팅. #elif defined(__WORLDSERVER) #ifdef __TRAFIC_1222 if( GetDestId() == idTarget ) return; #endif // __TRAFIC_1222 SetDestObj( idTarget, fRange ); // 이동할 목표물을 idTarget으로 설정. g_UserMng.AddMoverSetDestObj( this, idTarget, fRange ); #endif // WORLDSERVER }
chassis_er1_reply ChassisEr1::SendCmd(unsigned char paddress, unsigned char pcode) { chassis_er1_cmd cmd; cmd = SetCmd(paddress, pcode); return _SendCmd(&cmd); }
int SVUnixOpMonitor::telnetExecCmd(char * strCmd) { SetCmd(strCmd); //return telnet(); return telnet_command(); }
void CMover::CMD_SetUseItem( CCtrl *pCtrl ) { ClearActParam(); if( m_pActMover->IsFly() ) SetDestObj( pCtrl, 20.0f ); else SetDestObj( pCtrl ); SetCmd( OBJACT_USEITEM ); // 사정거리가 되었을때 실행할 명령 셋팅. }
LONG PreventMediaRemoval(BOOLEAN Prevent) {{{ if (Prevent) SetCmd6(0x01E,0,1); else SetCmd6(0x01E,0,0); return In(SetCmd((BYTE *)&Cmd6, 6, NULL, 0, DefTimeout)); }}}
void SendCmd(int value) { unsigned long flag; unsigned b; SetCmd(0xAD); local_irq_save(flag); do { b = inb(0x64); } while (b & 0x2); outb(value, 0x60); SetCmd(0xAE); local_irq_restore(flag); }
LONG Write10(ULONG BlockAdr, UWORD TransferLen, void *buffer) {{{ LONG ret; while (TransferLen > MaxDmaLen / BlockLen) { SetCmd10(0x02A, BlockAdr, MaxDmaLen / BlockLen); ret = Out(SetCmd((BYTE *)&Cmd10, 10, buffer, MaxDmaLen / BlockLen * BlockLen, 20*200)); if (ret != 0) return ret; BlockAdr += MaxDmaLen / BlockLen; TransferLen -= MaxDmaLen / BlockLen; buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen); } SetCmd10(0x02A, BlockAdr, TransferLen); return Out(SetCmd((BYTE *)&Cmd10, 10, buffer, BlockLen * (ULONG)TransferLen, 20*200)); }}}
LONG Read6(ULONG BlockAdr, UWORD TransferLen, void *buffer) {{{ LONG ret; while (TransferLen > MaxDmaLen / BlockLen) { SetCmd6(0x08, BlockAdr, MaxDmaLen / BlockLen); ret = In(SetCmd((BYTE *)&Cmd6, 6, buffer, MaxDmaLen / BlockLen * BlockLen, DefTimeout)); if (ret != 0) return ret; BlockAdr += MaxDmaLen / BlockLen; TransferLen -= MaxDmaLen / BlockLen; buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen); } SetCmd6(0x08, BlockAdr, TransferLen); return In(SetCmd((BYTE *)&Cmd6, 6, buffer, BlockLen * (ULONG)TransferLen, DefTimeout)); }}}
LONG Inquiry(void *data, BOOLEAN Vital, UWORD VitalPage, WORD length) {{{ SetCmd6(0x12, 0, length); if (Vital) { Cmd6.LunAdr |= 1; /* Vital gefordert */ Cmd6.Adr = VitalPage * 0x100; /* Page eintragen */ } return (In(SetCmd((BYTE *)&Cmd6, 6, data, length, 1000))); }}}
LONG StartStop(BOOLEAN LoadEject, BOOLEAN StartFlag) {{{ if (StartFlag) SetCmd6(0x01B,0,1); else SetCmd6(0x01B,0,0); if (LoadEject) Cmd6.Len |= 1; return In(SetCmd((BYTE *)&Cmd6, 6, NULL, 0, 60*200)); }}}
static void UpdateConf (Widget_t w, void *p_pvPlugin) /* Called back when the configuration/options window is closed */ { struct plugin_t *poPlugin = (plugin_t *) p_pvPlugin; struct conf_t *poConf = &(poPlugin->oConf); struct gui_t *poGUI = &(poConf->oGUI); TRACE ("UpdateConf()\n"); SetCmd (poGUI->wTF_Cmd, poPlugin); SetLabel (poGUI->wTF_Title, poPlugin); SetMonitorFont (poPlugin); SetTimer (poPlugin); } /* UpdateConf() */
LONG ModeSelect(UWORD SelectFlags, void *Buffer, UWORD ParmLen) {{{ ParmLen = ParmLen + sizeof(tParmHead) /* ParameterHeader */ + sizeof(tBlockDesc); /* Block-Deskriptor */ SetCmd6(0x15, 0, ParmLen); Cmd6.LunAdr |= SelectFlags % 0x20; return Out(SetCmd((BYTE *)&Cmd6, 6, Buffer, ParmLen, DefTimeout)); }}}
// paddress = [0|1] left channel or right channel, pcode = code, uwData chassis_er1_cmd ChassisEr1::SetCmd_with_arg(unsigned char paddress, unsigned char pcode, int wData1) { chassis_er1_cmd cmd; cmd=SetCmd(paddress,pcode); cmd.data[0]=HIBYTE(wData1); cmd.data[1]=LOBYTE(wData1); cmd.checksum = ~(~(cmd.checksum-1)+ cmd.data[0] + cmd.data[1]) + 1; cmd.size = 6; return cmd; }
LONG ModeSense(UWORD PageCode, UWORD PageControl, void *Buffer, UWORD ParmLen) {{{ ParmLen = ParmLen + sizeof(tParmHead) /* ParameterHeader */ + sizeof(tBlockDesc); /* Block-Deskriptor */ SetCmd6(0x1A, 0, ParmLen); Cmd6.Adr = ((PageControl * 64 + PageCode) % 0x100)*0x100; return In(SetCmd((BYTE *)&Cmd6, 6, Buffer, ParmLen, DefTimeout)); }}}
void CMover::CMD_SetCollect( CObj *pObj ) { if( IsInvalidObj( pObj ) ) return; if( pObj->GetType() != OT_MOVER ) return; if( m_pActMover->IsActAttack() ) return; if( m_pActMover->IsActJump() ) return; if( m_pActMover->IsActDamage() ) return; if( IsDie() ) return; // 죽었을때 사용금지. // if( GetCollector()) { CMover *pTarget = (CMover *)pObj; ClearActParam(); SetDestObj( pTarget->GetId(), 3.0f ); // 이동할 목표물을 idTarget으로 설정. SetCmd( OBJACT_COLLECT, pTarget->GetId() ); // 사정거리가 되었을때 실행할 명령 셋팅. } }
VolumeActionCommand::VolumeActionCommand(Volume *aVolume, const char *aAction, const char *aExtraArgs, VolumeResponseCallback *aCallback) : VolumeCommand(aCallback), mVolume(aVolume) { nsAutoCString cmd; cmd = "volume "; cmd += aAction; cmd += " "; cmd += aVolume->Name().get(); // vold doesn't like trailing white space, so only add it if we really need to. if (aExtraArgs && (*aExtraArgs != '\0')) { cmd += " "; cmd += aExtraArgs; } SetCmd(cmd); }
LONG ReadCapacity(BOOLEAN PMI, ULONG *BlockAdr, ULONG *BlockLen) {{{ ULONG Data[2]; LONG ret; SetCmd10(0x25, *BlockAdr, 0); if (PMI) Cmd10.LenLow = 1; /* und rufen */ ret = In(SetCmd((BYTE *)&Cmd10, 10, Data, sizeof(Data), DefTimeout)); /* und Antwort, bitte */ if (ret == 0) { *BlockAdr = Data[0]; *BlockLen = Data[1]; } return ret; }}}
void CMover::CMD_SetMagicAttack( OBJID idTarget, int nMagicPower ) { TRACE("CMD_SetMagicAttack(%d, %d)\n", idTarget, nMagicPower ); if( m_pActMover->IsActAttack() ) // 이미 어택중이면 취소. return; if( IsDie() ) return; // 죽었을때 사용금지. // 손에 들고 있는 완드의 프로퍼티 꺼냄 // 사정거리 계산함 ItemProp *pItemProp = GetActiveHandItemProp(); if( pItemProp == NULL ) return; if( pItemProp->dwItemKind3 != IK3_WAND /*&& pItemProp->dwItemKind3 != IK3_STAFF*/ ) //Staff->ata2k // 들고있는 무기가 완드가 아니면 취소 return; // 도달범위 - 얼마나 가까이 근접해야하는가. 미터단위 float fArrivalRange = GetAttackRange( AR_WAND ); ClearActParam(); SetDestObj( idTarget, fArrivalRange ); // 이동할 목표물을 idTarget으로 설정. SetCmd( OBJACT_MAGIC_ATTACK, idTarget, nMagicPower ); // 사정거리가 되었을때 실행할 명령 셋팅. }
void CMover::CMD_SetRangeAttack( OBJID idTarget, int nPower ) { TRACE("CMD_SetRangeAttack(%d, %d)\n", idTarget, nPower ); if( m_pActMover->IsActAttack() ) // 이미 어택중이면 취소. return; if( IsDie() ) return; // 죽었을때 사용금지. ItemProp *pItemProp = GetActiveHandItemProp(); if( pItemProp == NULL ) return; if( pItemProp->dwItemKind3 != IK3_BOW ) // 들고있는 무기가 보우가 아니면 에러 return; if( IsBullet( pItemProp ) == FALSE ) return; ClearActParam(); SetDestObj( idTarget, GetAttackRange( pItemProp->dwAttackRange ), TRUE ); // 이동할 목표물(idTarget)과 그 거리를 설정 SetCmd( OBJACT_RANGE_ATTACK, idTarget, nPower, 0 ); // 사정거리가 되었을때 실행할 명령 셋팅. }
// // 외부에서 UseSkill을 명령할땐 이것으로 호출하자. // sutType : 스킬을 사용할때 스킬큐에서 연타로 사용한건가 일반적인 사용을 한건가.c // int CMover::CMD_SetUseSkill( OBJID idTarget, int nSkillIdx, SKILLUSETYPE sutType ) { m_oaCmd = OBJACT_NONE; TRACE( "CMD_SetUseSkill( " ); if( m_pActMover->IsFly() ) return 0; // 비행중엔 스킬사용 금지. if( m_pActMover->IsActAttack() ) return 0; if( m_pActMover->IsActJump() ) return 0; // 점프중엔 사용금지. if( m_pActMover->GetState() & OBJSTA_DMG_FLY_ALL ) return 0; // 데미지 플라이중엔 스킬사용금지. if( IsDie() ) return 0; // 죽었을때 사용금지. LPSKILL pSkill = GetSkill( 0, nSkillIdx ); // this가 가진 스킬중 nIdx에 해당하는 스킬을 꺼낸다. if( pSkill == NULL ) { Error( "CMD_SetUseSkill : %s skill(%d) not found", m_szName, nSkillIdx ); return 0; // } ItemProp* pSkillProp = pSkill->GetProp(); if( pSkillProp == NULL ) // JobSkill 리스트에서 꺼낸 스킬의 프로퍼티를 꺼냄. { Error( "CMD_SetUseSkill : %s. skill(%d) property not found", m_szName, pSkill->dwSkill ); return 0; // } if( IsPlayer() && IsStateMode( STATE_BASEMOTION_MODE ) ) // 시전중(준비시간)일땐 사용금지. { #ifdef __CLIENT g_DPlay.SendStateModeCancel( STATE_BASEMOTION_MODE, STATEMODE_BASEMOTION_CANCEL ); #endif return 0; } // 도달범위 - 얼마나 가까이 근접해야하는가. 미터단위 float fArrivalRange = 0.0f; fArrivalRange = GetAttackRange( pSkillProp->dwAttackRange ); switch( pSkillProp->dwUseChance ) { case WUI_NOW: // 타겟팅과 상관없이 자기자신에게 쓰는 방식. idTarget = GetId(); break; case WUI_TARGETINGOBJ: // 셀렉트 되어 있는 타겟에게 사용. { #ifdef __CLIENT CObj *pFocusObj = GetWorld()->GetObjFocus(); if( pFocusObj && pFocusObj->GetType() == OT_MOVER ) idTarget = ((CMover*)pFocusObj)->GetId(); #else if( IsPlayer() ) idTarget = ((CUser *)this)->m_idSetTarget; #endif // __CLIENT } break; #ifdef __CLIENT case WUI_TARGETCURSORPTZ: { idTarget = GetId(); CRect rect; D3DXVECTOR3 vPos; CWndWorld* pWndWorld; pWndWorld = (CWndWorld*)g_WndMng.GetWndBase( APP_WORLD ); rect = pWndWorld->GetClientRect(); if( GetWorld()->ClientPointToVector( NULL, rect, pWndWorld->GetMousePoint(), &GetWorld()->m_matProj, &GetWorld()->GetCamera()->m_matView, &vPos, TRUE ) ) { #ifdef __SKILL0517 AddSkillProp* pAddSkillProp = prj.GetAddSkillProp( pSkillProp->dwSubDefine, GetSkillLevel( pSkill ) ); // UseSkill에서 사용한 스킬의 프로퍼티 꺼냄 #else // __SKILL0517 AddSkillProp* pAddSkillProp = prj.GetAddSkillProp( pSkillProp->dwSubDefine, pSkill->dwLevel ); // UseSkill에서 사용한 스킬의 프로퍼티 꺼냄 #endif // __SKILL0517 if( pAddSkillProp == NULL ) { Error( "CMover::OnMagicSkill : %s. add스킬(%d)의 프로퍼티가 없다.", m_szName, nSkillIdx ); return 0; // property not found } FLOAT fDist; FLOAT fMaxDistSq; D3DXVECTOR3 vDist; fMaxDistSq = (float)pAddSkillProp->dwSkillRange; fMaxDistSq *= fMaxDistSq; vDist = vPos - GetPos(); fDist = D3DXVec3LengthSq( &vDist ); SetAngle( GetDegree(vPos, GetPos()) ); // 목표쪽으로 몸을 돌림. // 텔레포트 할 위치가 멀경우 현제 스킬에 해당하는 거리로 바꿔준다 if( fDist > fMaxDistSq ) { FLOAT fLength; D3DXVECTOR3 vDirNor; D3DXVec3Normalize( &vDirNor, &vDist ); fLength = (float)pAddSkillProp->dwSkillRange; float y = vPos.y; vPos = GetPos() + (vDirNor * fLength); vPos.y = y; // 스킬에 해당하는 거리로 바꾼곳이 못가는 지역이라면 갈수 있는 지역을 검사한다. int nAttr = GetWorld()->GetHeightAttribute( vPos.x, vPos.z ); if( nAttr != HATTR_NONE ) { while( nAttr != HATTR_NONE ) { if( nAttr == HATTR_NOFLY ) break; fLength -= 1.0f; // 1미터씩 줄여가며 계산한다. vPos = GetPos() + (vDirNor * fLength); nAttr = GetWorld()->GetHeightAttribute( vPos.x, vPos.z ); // 캐릭터의 앞 뒤로 이동불가 일 경우 뒷쪽이 이동불가 해제 될때 까지 계속 계산하여 이동시킴 // 그러므로 텔레포트 스킬 범위를 넘어설 경우 원래 자리로 텔레포트 하도록 처리 D3DXVECTOR3 vTemp = vPos - GetPos(); float fTemp = D3DXVec3LengthSq( &vTemp ); if(fTemp > fMaxDistSq) { vPos = GetPos(); break; } } // 한번더 줄여줌 fLength -= 1.0f; vPos = GetPos() + (vDirNor * fLength); // 줄인 곳이 이동불가 지역일 수 있다. nAttr = GetWorld()->GetHeightAttribute( vPos.x, vPos.z ); if( nAttr != HATTR_NONE ) { vPos = GetPos(); } } } else // 텔레포트 할 위치가 해당스킬 거리보다 작을경우 { int nAttr = GetWorld()->GetHeightAttribute( vPos.x, vPos.z ); FLOAT fLength; D3DXVECTOR3 vDirNor; D3DXVec3Normalize( &vDirNor, &vDist ); fLength = 0.0f; while( nAttr != HATTR_NONE ) { if( nAttr == HATTR_NOFLY ) break; fLength -= 1.0f; vPos = GetPos() + (vDirNor * fLength); nAttr = GetWorld()->GetHeightAttribute( vPos.x, vPos.z ); // 캐릭터의 앞 뒤로 이동불가 일 경우 뒷쪽이 이동불가 해제 될때 까지 계속 계산하여 이동시킴 // 그러므로 텔레포트 스킬 범위를 넘어설 경우 원래 자리로 텔레포트 하도록 처리 D3DXVECTOR3 vTemp = vPos - GetPos(); float fTemp = D3DXVec3LengthSq( &vTemp ); if(fTemp > fMaxDistSq) { vPos = GetPos(); break; } } } if( IsActiveMover() && g_eLocal.GetState( EVE_SCHOOL ) ) // 학교이벤섭이면. { D3DXVECTOR3 v1, v2; v1 = GetPos(); v1.y += 0.1f; v2 = vPos; v2.y += 0.1f; if( GetWorld()->IntersectObjLine( NULL, v1, v2, FALSE, FALSE ) ) // 텔레포트는 라인체크함. { g_WndMng.PutString( prj.GetText(TID_GAME_NOMOVING), NULL, prj.GetTextColor(TID_GAME_NOMOVING) ); g_WndMng.m_pWndWorld->SetNextSkill( NEXTSKILL_NONE ); return 0; } } pWndWorld->m_vTelePos = vPos; } else { g_WndMng.m_pWndWorld->SetNextSkill( NEXTSKILL_NONE ); g_WndMng.PutString( prj.GetText(TID_GAME_NOMOVING), NULL, prj.GetTextColor(TID_GAME_NOMOVING) ); return 0; } } break; #endif // __CLIENT } // 타인에게 쓰는경우에만 검사... if( idTarget != GetId() ) { CMover *pTarget = prj.GetMover( idTarget ); if( IsValidObj(pTarget) ) { if( pSkillProp->nEvildoing < 0 ) // 나쁜 스킬은 if( IsAttackAble(pTarget) == FALSE ) // 공격허용이 되지 않으면 사용할 수 없음. return 0; if( pSkill->dwSkill == SI_ASS_HEAL_RESURRECTION ) // 부활을 사용했을때 { if( pTarget->IsNPC() || pTarget->IsDie() == FALSE ) // 상대가 NPC거나 상대가 죽어있지 않다면 취소 return 0; } else { if( pTarget->IsDie() ) // 부활이 아닌 스킬을 사용했을때 상대가 죽어있으면 사용안됨. return 0; } } } // 타겟 근접 방식. switch( pSkillProp->dwExeTarget ) { case EXT_SELFCHGPARAMET: // 시전자 자신에게 사용하는 종류 idTarget = GetId(); // 타겟을 자기자신으로 설정. SetDestObj( idTarget, fArrivalRange, TRUE ); // 이동할 목표물을 idTarget으로 설정. << 이게 왜 필요하지? ㅡ.ㅡ? break; case EXT_MAGICATKSHOT: case EXT_MAGICATK: // 원거리에서 마법으로 타겟을 공격 case EXT_MAGICSHOT: if( idTarget == NULL_ID ) return 0; // 타겟이 없거나 유효하지 않으면 실패. SetDestObj( idTarget, fArrivalRange, TRUE ); // 이동할 목표물을 idTarget으로 설정. 다가가는 범위는 fArrivalRange값으로.. break; case EXT_ANOTHERWITH: // 나 혹은 다른사람에게 시전 if( idTarget == NULL_ID ) // 타겟이 잡혀있지 않으면 idTarget = GetId(); // 자신을 타겟으로 잡음 SetDestObj( idTarget, fArrivalRange, TRUE ); // 이동할 목표물을 idTarget으로 설정. break; case EXT_AROUNDATK: // 내 주위적들을 대상. idTarget = GetId(); // 타겟을 자기자신으로 설정. SetDestObj( idTarget, fArrivalRange, TRUE ); // 이동할 목표물을 idTarget으로 설정. break; case EXT_OBJCHGPARAMET: // 타인에게 사용 default: // 그외는 모두 근접하자. if( idTarget == NULL_ID ) return 0; // 타겟이 없거나 유효하지 않으면 실패. SetDestObj( idTarget, fArrivalRange, TRUE ); // 이동할 목표물을 idTarget으로 설정. break; } ClearActParam(); SetCmd( OBJACT_USESKILL, nSkillIdx, idTarget, sutType ); // 사정거리가 되었을때 실행할 명령 셋팅. TRACE( "\n)CMD_SetUseSkill\n" ); return 1; }
LONG TestUnitReady(void) { SetCmd6(0x00, 0, 0); return In(SetCmd((BYTE *)&Cmd6, 6, NULL, 0, DefTimeout)); }
// // // 클라이언트용 void CMover::ProcessMoveArrival( CCtrl *pObj ) { // 클라이언트 처리 if( IsActiveMover() ) { switch( m_oaCmd ) // 목표에 도착한 후의 명령 처리. { case OBJACT_USESKILL: if( pObj->GetType() == OT_MOVER && ( m_SkillTimerStop || m_SkillTimer.TimeOut() ) ) { CWorld *pWorld = GetWorld(); D3DXVECTOR3 vStart = GetPos(); vStart.y += 0.5f; D3DXVECTOR3 vEnd = pObj->GetPos(); vEnd.y += 0.5f; if( pWorld->IntersectObjLine( NULL, vStart, vEnd, FALSE, FALSE ) ) { g_WndMng.PutString( prj.GetText( TID_GAME_BLOCKTARGETING ), NULL, prj.GetTextColor( TID_GAME_BLOCKTARGETING ) ); g_WndMng.m_pWndWorld->SetNextSkill( NEXTSKILL_NONE ); break; } PlayCombatMusic(); int nSkillIdx = GetCmdParam(0); OBJID idTarget = (OBJID)GetCmdParam(1); SKILLUSETYPE sutType = (SKILLUSETYPE)GetCmdParam(2); if( (m_dwReqFlag & REQ_USESKILL) == 0 ) // 응답 요청중일땐 다시 보내선 안된다. { LPSKILL pSkill = GetSkill( 0, nSkillIdx ); // this가 가진 스킬중 nIdx에 해당하는 스킬을 꺼낸다. if( pSkill == NULL ) { Error( "CMD_SetUseSkill : %s skill(%d) not found", m_szName, nSkillIdx ); return; // skill not found } if( pSkill->dwSkill == SI_MAG_MAG_BLINKPOOL ) { CWndWorld* pWndWorld; pWndWorld = (CWndWorld*)g_WndMng.m_pWndWorld; { vStart = GetPos(); vStart.y += 1.0f; vEnd = pWndWorld->m_vTelePos; if( pWorld->IntersectObjLine( NULL, vStart, vEnd, FALSE, FALSE ) ) { g_WndMng.m_pWndWorld->SetNextSkill( NEXTSKILL_NONE ); g_WndMng.PutString( prj.GetText( TID_GAME_BLOCKTARGETING ), NULL, prj.GetTextColor( TID_GAME_BLOCKTARGETING ) ); break; } } if(g_pMoveMark!=NULL) g_pMoveMark->m_pSfxObj->m_nCurFrame=180; CreateSfx(g_Neuz.m_pd3dDevice,XI_GEN_MOVEMARK01,pWndWorld->m_vTelePos); } // 뒤에서 공격가능한 스킬인지 판단한다 // 강탈 스킬은 뒤에서 사용가능(일단 클라에서 판정하자~) if( pSkill->GetProp() && pSkill->GetProp()->dwAtkStyle == AS_BACK ) { D3DXVECTOR3 v3Pos; D3DXVECTOR3 v3PosSrc; D3DXVECTOR3 v3PosDest; // 방향벡터 1 v3PosSrc = pObj->GetPos() - GetPos(); D3DXVec3Normalize( &v3PosSrc, &v3PosSrc ); // 방향벡터 2 AngleToVectorXZ( &v3Pos, pObj->GetAngle(), 3.0f ); v3PosDest = (pObj->GetPos()+v3Pos) - pObj->GetPos(); D3DXVec3Normalize( &v3PosDest, &v3PosDest ); FLOAT fDir = D3DXVec3Dot( &v3PosSrc, &v3PosDest ); // 뒤가 아니면 스킬 사용 불가! if( fDir < 0.3f ) { g_WndMng.PutString( prj.GetText(TID_GAME_NEVERKILLSTOP) ); break; } } #if __VER >= 8 // __S8_PK // 카오에게 좋은 스킬을 사용할때는 Control 키를 눌러야 함 if( g_eLocal.GetState( EVE_PK ) ) { CMover * pMover; pMover = prj.GetMover( idTarget ); if( IsValidObj(pMover) && pMover != g_pPlayer && pMover->IsPlayer() && pMover->IsChaotic() ) if( pSkill->GetProp()->nEvildoing > 0 ) // 좋은 스킬 if( !(GetAsyncKeyState(VK_CONTROL) & 0x8000) ) break; } #endif // __VER >= 8 // __S8_PK TRACE( "OBJACT_USESKILL %d\n", nSkillIdx ); #if __VER >= 8 // __S8_PK BOOL bControl = ((GetAsyncKeyState(VK_CONTROL) & 0x8000)? TRUE:FALSE); g_DPlay.SendUseSkill( 0, nSkillIdx, idTarget, sutType, bControl ); // 목표지점에 도착하면 스킬쓴다고 알림. #else // __VER >= 8 // __S8_PK g_DPlay.SendUseSkill( 0, nSkillIdx, idTarget, sutType ); // 목표지점에 도착하면 스킬쓴다고 알림. #endif // __VER >= 8 // __S8_PK m_dwReqFlag |= REQ_USESKILL; // 응답 요청중 } ClearDestObj(); // 목표에 도달하면 추적을 멈춤. SendActMsg( OBJMSG_STOP ); if( !m_SkillTimerStop ) m_SkillTimer.Reset(); } break; //------------------------------------------ case OBJACT_MELEE_ATTACK: if( pObj->GetType() == OT_MOVER ) { ItemProp *pItemProp = GetActiveHandItemProp(); if( pItemProp && pItemProp->dwItemKind3 == IK3_YOYO ) { CWorld *pWorld = GetWorld(); D3DXVECTOR3 vStart = GetPos(); vStart.y += 0.5f; D3DXVECTOR3 vEnd = pObj->GetPos(); vEnd.y += 0.5f; if( pWorld->IntersectObjLine( NULL, vStart, vEnd, FALSE, FALSE ) ) { g_WndMng.PutString( prj.GetText( TID_GAME_BLOCKTARGETING ), NULL, prj.GetTextColor( TID_GAME_BLOCKTARGETING ) ); break; } } DoAttackMelee( (CMover *)pObj ); // pObj를 일반공격. } break; //--------------------------------------------- case OBJACT_MAGIC_ATTACK: if( pObj->GetType() == OT_MOVER ) { PlayCombatMusic(); OBJID idTarget = GetCmdParam(0); int nMagicPower = GetCmdParam(1); CMover *pTarget = prj.GetMover( idTarget ); // 타겟의 아이디를 포인터로 읽음. if( IsInvalidObj(pTarget) ) break; // 타겟이 거시기한 포인터면 취소시킴. SendActMsg( OBJMSG_STAND ); ClearDestObj(); // 목표에 도달하면 추적을 멈춤. DoAttackMagic( pTarget, nMagicPower ); } break; case OBJACT_RANGE_ATTACK: { if( pObj->GetType() == OT_MOVER ) { PlayCombatMusic(); OBJID idTarget = GetCmdParam(0); int nPower = GetCmdParam(1); CMover *pTarget = prj.GetMover( idTarget ); // 타겟의 아이디를 포인터로 읽음. if( IsInvalidObj(pTarget) ) break; // 타겟이 거시기한 포인터면 취소시킴. SendActMsg( OBJMSG_STAND ); SendActMsg( OBJMSG_STOP_TURN ); ClearDestObj(); // 목표에 도달하면 추적을 멈춤. DoAttackRange( pTarget, nPower, 0 ); // nPower를 dwItemID에 넣는다. } } break; //--------------------------------------------- case OBJACT_USEITEM: ClearDestObj(); // 그외는 목표에 도착하면 멈춤. SendActMsg( OBJMSG_STAND ); SetAngle( GetDegree(pObj->GetPos(), GetPos()) ); // 목표쪽으로 몸을 돌림. break; //--------------------------------------------- case OBJACT_COLLECT: ClearDestObj(); // 그외는 목표에 도착하면 멈춤. SendActMsg( OBJMSG_STOP ); SetAngle( GetDegree(pObj->GetPos(), GetPos()) ); // 목표쪽으로 몸을 돌림. g_DPlay.SendDoCollect( pObj ); // 서버로 보냄. break; //--------------------------------------------- default: ClearDestObj(); // 그외는 목표에 도착하면 멈춤. SendActMsg( OBJMSG_STOP ); break; } SetCmd( OBJACT_NONE ); } else { BOOL bQuery = m_pActMover->IsMove(); ClearDestObj(); // 그외는 목표에 도착하면 멈춤. SendActMsg( OBJMSG_STOP ); OnArrive( pObj->GetId(), 0 ); if( bQuery ) g_DPlay.SendQueryGetDestObj( this ); } }
// // // 월드서버용 void CMover::ProcessMoveArrival( CCtrl *pObj ) { switch( m_oaCmd ) // 목표에 도착한 후의 명령 처리. { case OBJACT_USESKILL: if( pObj->GetType() == OT_MOVER ) // 타겟이 무버일때면 처리함. { int nSkillIdx = GetCmdParam(0); OBJID idTarget = (OBJID)GetCmdParam(1); SKILLUSETYPE sutType = (SKILLUSETYPE)GetCmdParam(2); LPSKILL pSkill = GetSkill( 0, nSkillIdx ); // this가 가진 스킬중 nIdx에 해당하는 스킬을 꺼낸다. if( pSkill == NULL ) { Error( "ProcessMoveArrival mover:%s skill(%d) not found.", m_szName, nSkillIdx ); return; // skill not found } #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pSkill->dwSkill == SI_MAG_MAG_BLINKPOOL || pSkill->dwSkill == SI_RIG_HERO_RETURN ) #else //__LEGEND // 10차 전승시스템 Neuz, World, Trans if( pSkill->dwSkill == SI_MAG_MAG_BLINKPOOL ) #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans return; // 아직 서버명령으로는 블링크풀 사용못함. CWorld *pWorld = GetWorld(); D3DXVECTOR3 vStart = GetPos(); vStart.y += 0.5f; D3DXVECTOR3 vEnd = pObj->GetPos(); vEnd.y += 0.5f; if( pWorld->IntersectObjLine( NULL, vStart, vEnd, FALSE, FALSE ) ) // 시전자와 타겟사이 장애물을 검사. { if( IsPlayer() ) ((CUser *)this)->AddDefinedText( TID_GAME_BLOCKTARGETING, "" ); break; } #if __VER >= 8 // __S8_PK BOOL bSuccess = DoUseSkill( 0, nSkillIdx, idTarget, sutType, FALSE ); // 목표지점에 도착하면 스킬 사용시작. #else // __VER >= 8 // __S8_PK BOOL bSuccess = DoUseSkill( 0, nSkillIdx, idTarget, sutType ); // 목표지점에 도착하면 스킬 사용시작. #endif // __VER >= 8 // __S8_PK if( bSuccess == FALSE ) if( IsPlayer() ) ((CUser *)this)->m_playTaskBar.OnEndSkillQueue( (CUser *)this ); ClearDestObj(); // 목표에 도달하면 추적을 멈춤. SendActMsg( OBJMSG_STOP ); } break; default: SendActMsg( OBJMSG_STOP ); ClearDestObj(); // 목표에 도달하면 추적을 멈춤. OnArrive( pObj->GetId(), 0 ); break; } // switch SetCmd( OBJACT_NONE ); if( IsPlayer() ) ((CUser*)this)->AddQueryGetDestObj( NULL_ID ); }
int SVUnixOpMonitor::SSHCMD(char *strCmd) { SetCmd(strCmd); return SSH(); }