#pragma once namespace nProjectile { enum eTraceType { TRACE_TYPE_NONE, // ´ë»óÀ» ÃßÀûÇϰųª ÇÏÁö ¾Ê´Â´Ù TRACE_TYPE_TARGET_VISIBLE_POSITION, // ´ë»óÀÇ Visible Æ÷½Ã¼ÇÀ¸·Î Ç×»óÃßÀû TRACE_TYPE_TARGET_VISIBLE_POSITION_ONCE, // ´ë»óÀÇ Visible Æ÷Áö¼ÇÀ» ¸ñÇ¥·ÎÇÔ (ù¹øÂ° À§Ä¡·Î ¸ñÇ¥À§Ä¡°¡ °áÁ¤µÇ°í ÀÌÈÄ È£¹ÖÇÏÁö ¾ÊÀ½) TRACE_TYPE_TARGET_ARROW_POSITION, // ´ë»óÀÇ Arrow Æ÷Áö¼ÇÀ» Ç×»óÃßÀû TRACE_TYPE_TARGET_ARROW_POSITION_ONCE, // ´ë»óÀÇ Arrow Æ÷Áö¼ÇÀ» ¸ñÇ¥·ÎÇÔ (ù¹øÂ° À§Ä¡·Î ¸ñÇ¥À§Ä¡°¡ °áÁ¤µÇ°í ÀÌÈÄ È£¹ÖÇÏÁö ¾ÊÀ½) TRACE_TYPE_TARGET_TOP_POSITION, TRACE_TYPE_TARGET_TOP_POSITION_ONCE, TRACE_TYPE_BONE, TRACE_TYPE_ARROW, }; }; class cTargetPosition { nProjectile::eTraceType m_Type; WzVector m_Position; WzVector m_Rotate; WzVector m_Scale; BOOL m_SyncTargetAngle; BOOL m_Trace; DWORD m_TargetObjectKey; eSKILLEFFECT_POS m_PositionType; int m_BoneIndex; WzVector m_OffsetPosition; public: cTargetPosition(); void SetPosition( const WzVector& Position ); void SetTargetBonePosition( DWORD TargetObjectKey, eSKILLEFFECT_POS PositionType, int BoneIndex, BOOL Trace ); void SetTargetVisiblePosition( DWORD TargetObjectKey, BOOL Trace ); void SetTargetArrowPosition( DWORD TargetObjectKey, BOOL Trace ); void SetTargetTopPosition( DWORD TargetObjectKey, BOOL Trace ); void SetArrowPosition( const WzVector& Position, DWORD TargetObjectKey, BOOL Trace ); WzVector GetOffsetPosition() const { return m_OffsetPosition; } void SetOffsetPosition(const WzVector& value) { m_OffsetPosition = value; } void SetOffsetPosition( float x, float y, float z ) { m_OffsetPosition.x = x; m_OffsetPosition.y = y; m_OffsetPosition.z = z; } void SetSyncTargetAngle( BOOL SyncTargetAngle ) { m_SyncTargetAngle = m_SyncTargetAngle; } void SetTrace(BOOL Trace) { m_Trace = Trace; } BOOL UpdatePosition(); const WzVector& GetPosition() const { return m_Position; } const WzVector& GetRotate() const { return m_Rotate; } const WzVector& GetScale() const { return m_Scale; } }; #include "Camera.h" class cProjectileHit { BOOL m_IsDamageProcessed; DWORD m_OwnerObjectKey; DWORD m_AttackSerial; BOOL m_IsAddNextAttackSerial; DWORD m_DamageTime; WzID m_HitEffectID; BOOL m_IsCameraShakeHit; Camera::VIBE_TYPE m_CameraViberationType; float m_CameraViberationTime; float m_CameraViberationPower; protected: cProjectileHit(); virtual DWORD GetCurrentDamageTickTime() PURE; virtual const WzVector& GetDamageEffectPosition() const PURE; void Process(); void Destroy(); public: void SetHitData( DWORD AttackObjectKey, DWORD AttackSerial, WzID DamageEffectID, BOOL CameraShake, DWORD MaxWaitTime, BOOL IsAddNextAttackSerial ); void SetAddNextAttackSerial( BOOL IsAddNextAttackSerial ) { m_IsAddNextAttackSerial = IsAddNextAttackSerial; } void SetAllDamage( BOOL IsProcessAllDamage ) {} void SetCameraShakeHit( BOOL UseCameraShakeHit ) { m_IsCameraShakeHit = UseCameraShakeHit; } void SetCameraShakeType( Camera::VIBE_TYPE ViberationType, float ViberationTime, float ViberationPower ); private: void _ProcessDamage(); }; class cProjectileTarget { cTargetPosition m_PositionData; protected: cProjectileTarget(); void Process(); void Destroy() {} const WzVector& GetPosition() const { return m_PositionData.GetPosition(); } const WzVector& GetRotate() const { return m_PositionData.GetRotate(); } const WzVector& GetScale() const { return m_PositionData.GetScale(); } public: // const cTargetPosition& GetPositionData() const { return m_PositionData; } // cTargetPosition& GetPositionData() { return m_PositionData; } void SetPositionData( const cTargetPosition& PositionData ) { m_PositionData = PositionData; } void SetTargetPosition( const WzVector& TargetPosition ) { m_PositionData.SetPosition(TargetPosition); } void SetTargetObjectKey( DWORD TargetObjectKey, BOOL Trace ) { m_PositionData.SetTargetArrowPosition( TargetObjectKey, Trace ); } }; class cProjectileBezier { enum eBezierType { TYPE_DUAL_CONTROL, TYPE_SINGLE_CONTROL, TYPE_TRACE_OBJECT_SINGLE_CONTROL, }; eBezierType m_Type; WzVector m_StartPosition; WzVector m_TargetPosition; WzVector m_CurvePosition1; WzVector m_CurvePosition2; WzVector m_CurrentPosition; WzVector m_CurrentRotate; DWORD m_TargetObjectKey; public: void SetPosition( const WzVector& StartPosition, const WzVector& TargetPosition, float Height1, float Height2 ); void SetBezierCourse( const WzVector& StartPosition, const WzVector& TargetPosition, const WzVector& ControlPoint1, const WzVector& ControlPoint2 ); void SetBezierCourseSingleControl( const WzVector& StartPosition, const WzVector& TargetPosition, const WzVector& ControlPoint1 ); void SetBezierCourseSingleControl( const WzVector& StartPosition, const WzVector& ControlPoint, DWORD TargetObjectKey ); protected: cProjectileBezier(); virtual float GetArrowMoveTimeRate() PURE; const WzVector& GetBezierStartPosition() const { return m_StartPosition; } const WzVector& GetBezierTargetPosition() const { return m_TargetPosition; } const WzVector& GetCurrentPosition() const { return m_CurrentPosition; } const WzVector& GetCurrentRotate() const { return m_CurrentRotate; } void Process(); void Destroy() {} }; class cProjectileArrow { WzVector m_ArrowPosition; WzVector m_ArrowRotate; WzVector m_ArrowScale; WzVector m_StartPosition; cTargetPosition m_TargetPosition; public: void SetArrowStartPosition( const WzVector& StartPosition ) { m_StartPosition = StartPosition; } void SetArrowTargetPosition( const WzVector& TargetPosition ) { m_TargetPosition.SetPosition( TargetPosition ); } void SetArrowTargetObjectKey( DWORD TargetObjectKey, BOOL Trace ) { m_TargetPosition.SetTargetArrowPosition( TargetObjectKey, Trace ); } protected: cProjectileArrow(); virtual float GetArrowMoveTimeRate() PURE; void Process(); void Destroy() {} protected: const WzVector& GetArrowPosition() const { return m_ArrowPosition; } const WzVector& GetArrowRotate() const { return m_ArrowRotate; } const WzVector& GetArrowScale() const { return m_ArrowScale; } const WzVector& GetArrowStartPosition() const { return m_StartPosition; } const WzVector& GetArrowTargetPosition() const { return m_TargetPosition.GetPosition(); } }; class cProjectileBase { DWORD m_Key; DWORD m_Delay; DWORD m_LifeTime; DWORD m_RemainTime; BOOL m_IsActived; DWORD m_ActiveDelay; protected: cProjectileBase(); BOOL IsActived() { return m_IsActived; } BOOL IsTimeout(); DWORD GetCurrentTickTime(); //float GetLifeTimeRate(); float GetMovingTimeRate(); float GetTotalLifeTimeRate(); public: virtual void Destroy() {}; virtual void Render() {}; virtual BOOL Process( DWORD dwTick ); void SetKey(DWORD value) { m_Key = value; } DWORD GetKey() { return m_Key; } virtual void SetActiveDelayTime( DWORD ActiveDelayTime ); void SetLifeTime( DWORD LifeTime ); void SetRemainTime( DWORD RemainTime ); };