Skip to content
Snippets Groups Projects
SXbaseTool.cpp 3.45 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "SXbaseTool.h"
    
    
    D-AIRY's avatar
    D-AIRY committed
    #include <particles/sxparticles.h>
    
    
    BEGIN_PROPTABLE(SXbaseTool)
    	DEFINE_FIELD_FLOAT(m_fReloadTime, PDFF_NOEDIT | PDFF_NOEXPORT, "reload_time", "", EDITOR_NONE)
    
    D-AIRY's avatar
    D-AIRY committed
    
    	DEFINE_FIELD_VECTOR(m_vSlotPos, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_offset", "", EDITOR_NONE)
    	DEFINE_FIELD_ANGLES(m_qSlotRot, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_rotation", "", EDITOR_NONE)
    	DEFINE_FIELD_VECTOR(m_vSlotPosAim, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_offset_aim", "", EDITOR_NONE)
    	DEFINE_FIELD_ANGLES(m_qSlotRotAim, PDFF_NOEDIT | PDFF_NOEXPORT, "slot_rotation_aim", "", EDITOR_NONE)
    
    END_PROPTABLE()
    
    REGISTER_ENTITY_NOLISTING(SXbaseTool, base_tool);
    
    SXbaseTool::SXbaseTool(EntityManager * pMgr):
    	BaseClass(pMgr),
    	m_bInPrimaryAction(false),
    	m_bInSecondaryAction(false),
    	m_bWorldModel(false),
    	m_bCanUse(true),
    	m_fZoomTime(0.0f),
    
    D-AIRY's avatar
    D-AIRY committed
    	m_fReloadTime(0.0f),
    	m_fZoomProgress(0.0f)
    
    {
    	m_bInvStackable = false;
    
    D-AIRY's avatar
    D-AIRY committed
    
    	m_iMuzzleFlash = SPE_EffectCopyName("muzzleflash_ak74");
    
    	m_iIvalUpdate = SET_INTERVAL(_Update, 1.0f / 60.0f);
    }
    
    SXbaseTool::~SXbaseTool()
    {
    	CLEAR_INTERVAL(m_iIvalUpdate);
    
    }
    
    void SXbaseTool::SetNextUse(float time)
    {
    	m_bCanUse = false;
    	SET_TIMEOUT(_AllowUse, time);
    }
    bool SXbaseTool::CanUse()
    {
    	return(m_bCanUse);
    }
    
    void SXbaseTool::PrimaryAction(BOOL st)
    {
    	m_bInPrimaryAction = st != FALSE;
    
    D-AIRY's avatar
    D-AIRY committed
    	if(st)
    	{
    		PlayAnimation("shoot1");
    		SPE_EffectEnableSet(m_iMuzzleFlash, true);
    	}
    
    }
    
    void SXbaseTool::SecondaryAction(BOOL st)
    {
    	m_bInSecondaryAction = st != FALSE;
    }
    
    void SXbaseTool::SetIsWorldModel(bool b)
    {
    	m_bWorldModel = b;
    }
    
    void SXbaseTool::Reload()
    {
    	if(CanUse())
    	{
    		SetNextUse(m_fReloadTime);
    		PlayAnimation("reload");
    	}
    }
    
    D-AIRY's avatar
    D-AIRY committed
    
    void SXbaseTool::AttachHands()
    {
    	if(m_pAnimPlayer)
    	{
    		m_pAnimPlayer->AddModel("models/weapons/hands.dse");
    		m_pAnimPlayer->Assembly();
    	}
    }
    
    void SXbaseTool::DbgMove(int dir, float dy)
    {
    	switch(dir)
    	{
    	case DSM_POS_X:
    		m_vOffsetPos.x += dy;
    		break;
    	case DSM_POS_Y:
    		m_vOffsetPos.y += dy;
    		break;
    	case DSM_POS_Z:
    		m_vOffsetPos.z += dy;
    		break;
    	case DSM_ROT_X:
    		m_vOffsetOrient = m_vOffsetOrient * SMQuaternion(dy, 'x');
    		break;
    	case DSM_ROT_Y:
    		m_vOffsetOrient = m_vOffsetOrient * SMQuaternion(dy, 'y');
    		break;
    	case DSM_ROT_Z:
    		m_vOffsetOrient = m_vOffsetOrient * SMQuaternion(dy, 'z');
    		break;
    
    	case DSM_PRINT:
    		printf(COLOR_GREEN "offset: " COLOR_LGREEN "%f %f %f\n"
    			COLOR_GREEN "orient: " COLOR_LGREEN "%f %f %f %f\n" COLOR_RESET
    			, m_vOffsetPos.x, m_vOffsetPos.y, m_vOffsetPos.z
    			, m_vOffsetOrient.x, m_vOffsetOrient.y, m_vOffsetOrient.z, m_vOffsetOrient.w);
    		break;
    	}
    }
    
    void SXbaseTool::OnSync()
    {
    	BaseClass::OnSync();
    	float3 pos = m_pAnimPlayer->GetBoneTransformPos(m_pAnimPlayer->GetBone("muzzle_rifle1"));
    	SPE_EffectPosSet(m_iMuzzleFlash, &pos);
    	pos = m_vOrientation * float3(0, 0, 1);
    	SPE_EffectDirSet(m_iMuzzleFlash, &pos);
    }
    
    void SXbaseTool::_Update(float dt)
    {
    	if(m_bInSecondaryAction)
    	{
    		if(m_fZoomProgress < 1.0f)
    		{
    			m_fZoomProgress += dt * 5.0f;
    			if(m_fZoomProgress > 1.0f)
    			{
    				m_fZoomProgress = 1.0f;
    			}
    			_Rezoom();
    		}
    	}
    	else
    	{
    		if(m_fZoomProgress > 0.0f)
    		{
    			m_fZoomProgress -= dt * 5.0f;
    			if(m_fZoomProgress < 0.0f)
    			{
    				m_fZoomProgress = 0.0f;
    			}
    			_Rezoom();
    		}
    	}
    }
    
    void SXbaseTool::SetParent(SXbaseEntity * pEnt, int attachment)
    {
    	BaseClass::SetParent(pEnt, attachment);
    
    	_Rezoom();
    }
    
    void SXbaseTool::_Rezoom()
    {
    	m_vOffsetPos = (float3)vlerp(m_vSlotPos, m_vSlotPosAim, m_fZoomProgress);
    	m_vOffsetOrient = SMquaternionSlerp(m_qSlotRot, m_qSlotRotAim, m_fZoomProgress);
    }