/* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. * * Penumbra Overture is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Penumbra Overture is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Penumbra Overture. If not, see . */ #include "StdAfx.h" #include "PlayerState_Weapon.h" #include "Init.h" #include "Player.h" #include "HudModel_Weapon.h" #include "HudModel_Throw.h" ////////////////////////////////////////////////////////////////////////// // THROW STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_Throw::cPlayerState_Throw(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Throw) { mfLastForward = 1.0f; mfLastSideways = 1.0f; mpHudObject = NULL; } //----------------------------------------------------------------------- void cPlayerState_Throw::OnUpdate(float afTimeStep) { if( mpInit->mpNotebook->IsActive()==false && mpInit->mpInventory->IsActive()==false && mpInit->mpNumericalPanel->IsActive()==false && mpInit->mpDeathMenu->IsActive()==false) { mpPlayer->ResetCrossHairPos(); } ///////////////////////////////////// // If run is down, run!! cInput *pInput = mpInit->mpGame->GetInput(); if( pInput->IsTriggerd("Run") && mpPlayer->GetMoveState() == ePlayerMoveState_Walk) { mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart,vEnd; vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + mpPlayer->GetCamera()->GetForward() * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(),vStart,vEnd,true,false,true); mpPlayer->GetPickRay()->CalculateResults(); if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); //Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if(CrossState != eCrossHairState_None && pEntity->GetDescription()!=_W("") && !pEntity->GetHasBeenExamined()) { mpPlayer->SetCrossHairState(eCrossHairState_Examine); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Call entity //pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Quick fix but works, the OnLeave of the previous states sets an old cross hair state. //mpPlayer->SetCrossHairState(eCrossHairState_None); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnDraw() { } //----------------------------------------------------------------------- void cPlayerState_Throw::OnPostSceneDraw() { //mpHudObject->PostSceneDraw(); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnJump() { return true; } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartInteractMode() { } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartInteract() { mpHudObject->OnAttackDown(); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStopInteract() { mpHudObject->OnAttackUp(); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartExamine() { //mpInit->mpPlayerHands->SetCurrentModel(1,""); //mpInit->mpPlayer->ChangeState(ePlayerState_Normal); if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartHolster() { mpInit->mpPlayerHands->SetCurrentModel(1,""); mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnAddYaw(float afVal) { return true;//mpHudObject->OnMouseMove(cVector2f(afVal,0)); } bool cPlayerState_Throw::OnAddPitch(float afVal) { return true;//return mpHudObject->OnMouseMove(cVector2f(0,afVal)); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnMoveForwards(float afMul, float afTimeStep) { mfLastForward = afMul; return true; } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnMoveSideways(float afMul, float afTimeStep) { mfLastSideways = afMul; return true; } //----------------------------------------------------------------------- void cPlayerState_Throw::EnterState(iPlayerState* apPrevState) { mpHudObject->OnStart(); } //----------------------------------------------------------------------- void cPlayerState_Throw::LeaveState(iPlayerState* apNextState) { if( apNextState->mType != ePlayerState_Message && apNextState->mType != ePlayerState_WeaponMelee && mpInit->mpPlayerHands->GetCurrentModel(1) == mpHudObject) { mpInit->mpPlayerHands->SetCurrentModel(1,""); } } //----------------------------------------------------------------------- // No running when you have a weapon: void cPlayerState_Throw::OnStartRun() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Walk) mpPlayer->ChangeMoveState(ePlayerMoveState_Run); if( mpPlayer->GetMoveState() == ePlayerMoveState_Jump) { mpPlayer->SetPrevMoveState(ePlayerMoveState_Run); } } void cPlayerState_Throw::OnStopRun() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump) mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartCrouch() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump)return; if(mpInit->mpButtonHandler->GetToggleCrouch()) { if(mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void cPlayerState_Throw::OnStopCrouch() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnStartInventory() { //mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnStartInventoryShortCut(int alNum) { return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON MELEE STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_WeaponMelee::cPlayerState_WeaponMelee(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_WeaponMelee) { mfLastForward = 1.0f; mfLastSideways = 1.0f; } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnUpdate(float afTimeStep) { if( mpInit->mpNotebook->IsActive()==false && mpInit->mpInventory->IsActive()==false && mpInit->mpNumericalPanel->IsActive()==false && mpInit->mpDeathMenu->IsActive()==false) { mpPlayer->ResetCrossHairPos(); } ///////////////////////////////////// // If run is down, run!! cInput *pInput = mpInit->mpGame->GetInput(); if( pInput->IsTriggerd("Run") && mpPlayer->GetMoveState() == ePlayerMoveState_Walk) { mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart,vEnd; vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + mpPlayer->GetCamera()->GetForward() * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(),vStart,vEnd,true,false,true); mpPlayer->GetPickRay()->CalculateResults(); if(mpPlayer->GetPickedBody() && mpHudWeapon->IsAttacking()==false) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); //Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if(CrossState != eCrossHairState_None && pEntity->GetDescription()!=_W("") && !pEntity->GetHasBeenExamined()) { mpPlayer->SetCrossHairState(eCrossHairState_Examine); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Call entity //pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Quick fix but works, the OnLeave of the previous states sets an old cross hair state. //mpPlayer->SetCrossHairState(eCrossHairState_None); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnDraw() { } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnPostSceneDraw() { mpHudWeapon->PostSceneDraw(); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnJump() { return true; } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartInteractMode() { } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartInteract() { mpHudWeapon->OnAttackDown(); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStopInteract() { mpHudWeapon->OnAttackUp(); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartExamine() { //mpPlayer->ChangeState(ePlayerState_Normal); if(mpPlayer->GetPickedBody() && mpHudWeapon->IsAttacking()==false) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartHolster() { mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnAddYaw(float afVal) { return mpHudWeapon->OnMouseMove(cVector2f(afVal,0)); } bool cPlayerState_WeaponMelee::OnAddPitch(float afVal) { return mpHudWeapon->OnMouseMove(cVector2f(0,afVal)); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnMoveForwards(float afMul, float afTimeStep) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("Run")) { if(mfLastForward == 0.0f && afMul != 0.0f && mpPlayer->GetCharacterBody()->IsOnGround()) { cVector3f vFwd = mpPlayer->GetCharacterBody()->GetForward(); cVector3f vDir = afMul>0 ? vFwd : vFwd * -1.0f; mpPlayer->GetCharacterBody()->AddForce( vDir * 300 * mpPlayer->GetDefaultMass() + cVector3f(0,200 * mpPlayer->GetDefaultMass() ,0)); } mfLastForward = afMul; return false; } else*/ { mfLastForward = afMul; return true; } } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnMoveSideways(float afMul, float afTimeStep) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("Run")) { if(mfLastSideways == 0.0f && afMul != 0.0f && mpPlayer->GetCharacterBody()->IsOnGround()) { cVector3f vRight = mpPlayer->GetCharacterBody()->GetRight(); cVector3f vDir = afMul>0 ? vRight : vRight * -1.0f; mpPlayer->GetCharacterBody()->AddForce( vDir * 400 * mpPlayer->GetDefaultMass() + cVector3f(0,200 * mpPlayer->GetDefaultMass() ,0)); } mfLastSideways = afMul; return false; } else*/ { mfLastSideways = afMul; return true; } } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::EnterState(iPlayerState* apPrevState) { //get the callback /*mpWeaponCallback = mpPlayer->GetWeaponCallback(); if(mpWeaponCallback==NULL) { Error("No weapon callback for player weapon state!\n"); mpPlayer->ChangeState(ePlayerState_Normal); } //Load the data cCamera3D *pCamera = mpPlayer->GetCamera(); cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); cResources *pResources = mpInit->mpGame->GetResources(); cMesh* pMesh = pResources->GetMeshManager()->CreateMesh(mpWeaponCallback->GetModelFile().c_str()); if(pMesh==NULL) { Error("Couldn't load mesh %s for player weapon state!\n",mpWeaponCallback->GetModelFile().c_str()); mpPlayer->ChangeState(ePlayerState_Normal); } mpMeshEntity = pWorld->CreateMeshEntity("Weapon",pMesh); m_mtxOffset = mpWeaponCallback->GetOffsetMatrix(); mpMeshEntity->SetMatrix(cMath::MatrixMul(cMath::MatrixInverse(pCamera->GetViewMatrix()),m_mtxOffset)); mpMeshEntity->SetPosition(pCamera->GetPosition() + pCamera->GetForward()); mpPlayer->SetCrossHairState(eCrossHairState_None);*/ //Try not doing this. //mpPlayer->GetGlowStick()->SetActive(false); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::LeaveState(iPlayerState* apNextState) { if( apNextState->mType != ePlayerState_Message && apNextState->mType != ePlayerState_Throw && mpInit->mpPlayerHands->GetCurrentModel(1) == mpHudWeapon) { mpInit->mpPlayerHands->SetCurrentModel(1,""); } } //----------------------------------------------------------------------- // No running when you have a weapon: void cPlayerState_WeaponMelee::OnStartRun() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Walk) mpPlayer->ChangeMoveState(ePlayerMoveState_Run); if( mpPlayer->GetMoveState() == ePlayerMoveState_Jump) { mpPlayer->SetPrevMoveState(ePlayerMoveState_Run); } } void cPlayerState_WeaponMelee::OnStopRun() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump) mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartCrouch() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump)return; if(mpInit->mpButtonHandler->GetToggleCrouch()) { if(mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void cPlayerState_WeaponMelee::OnStopCrouch() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnStartInventory() { //mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnStartInventoryShortCut(int alNum) { return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON STATE ////////////////////////////////////////////////////////////////////////// /*class cPlayerState_Weapon : public iPlayerState { public: iPlayerWeaponCallback *mpWeaponCallback; cMatrixf m_mtxOffset; cMeshEntity *mpMeshEntity; cVector3f mvPosition; cPlayerState_Weapon(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Weapon) { mvPosition = cVector3f(0.13f, -0.16f, 0.2f); } //----------------------------------------------------------------------- void OnUpdate(float afTimeStep) { //Quick fix but works, the OnLeave of the previous states sets an old cross hair state. mpPlayer->SetCrossHairState(eCrossHairState_None); cCamera3D *pCamera = mpPlayer->GetCamera(); cMatrixf mtxInv = cMath::MatrixInverse(pCamera->GetViewMatrix()); mpMeshEntity->SetMatrix(cMath::MatrixMul(mtxInv,m_mtxOffset)); cVector3f vLocalPos = mvPosition + cVector3f(0,-mpPlayer->GetHeadMove()->GetPos()*0.1f,0); cVector3f vPos = pCamera->GetForward() * vLocalPos.z + pCamera->GetUp() * vLocalPos.y + pCamera->GetRight() * vLocalPos.x; mpMeshEntity->SetPosition(pCamera->GetPosition() + vPos); } //----------------------------------------------------------------------- void OnDraw() { } //----------------------------------------------------------------------- void OnPostSceneDraw() { } //----------------------------------------------------------------------- bool OnJump() { return true; } //----------------------------------------------------------------------- void OnStartInteractMode() { //Do nothing } //----------------------------------------------------------------------- void OnStartInteract() { mpWeaponCallback->OnAttackDown(); } //----------------------------------------------------------------------- void OnStopInteract() { mpWeaponCallback->OnAttackUp(); } //----------------------------------------------------------------------- void OnStartExamine() { mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool OnAddYaw(float afVal) { return true; } bool OnAddPitch(float afVal) { return true; } //----------------------------------------------------------------------- bool OnMoveForwards(float afMul, float afTimeStep) { return true; } //----------------------------------------------------------------------- bool OnMoveSideways(float afMul, float afTimeStep) { return true; } //----------------------------------------------------------------------- void EnterState(iPlayerState* apPrevState) { //get the callback mpWeaponCallback = mpPlayer->GetWeaponCallback(); if(mpWeaponCallback==NULL) { Error("No weapon callback for player weapon state!\n"); mpPlayer->ChangeState(ePlayerState_Normal); } //Load the data cCamera3D *pCamera = mpPlayer->GetCamera(); cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); cResources *pResources = mpInit->mpGame->GetResources(); cMesh* pMesh = pResources->GetMeshManager()->CreateMesh(mpWeaponCallback->GetModelFile().c_str()); if(pMesh==NULL) { Error("Couldn't load mesh %s for player weapon state!\n",mpWeaponCallback->GetModelFile().c_str()); mpPlayer->ChangeState(ePlayerState_Normal); } mpMeshEntity = pWorld->CreateMeshEntity("Weapon",pMesh); m_mtxOffset = mpWeaponCallback->GetOffsetMatrix(); mpMeshEntity->SetMatrix(cMath::MatrixMul(cMath::MatrixInverse(pCamera->GetViewMatrix()),m_mtxOffset)); mpMeshEntity->SetPosition(pCamera->GetPosition() + pCamera->GetForward()); mpPlayer->SetCrossHairState(eCrossHairState_None); //Try not doing this. //mpPlayer->GetGlowStick()->SetActive(false); } //----------------------------------------------------------------------- void LeaveState(iPlayerState* apNextState) { cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); pWorld->DestroyMeshEntity(mpMeshEntity); //Skipping this... //mpPlayer->SetWeaponCallback(NULL); } //----------------------------------------------------------------------- // No running when you have a weapon: void OnStartRun() { //if(mpPlayer->GetMoveState() == ePlayerMoveState_Walk) // mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } void OnStopRun() { //if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) // mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); //else if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump) // mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void OnStartCrouch() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump)return; if(mpInit->mpButtonHandler->GetToggleCrouch()) { if(mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void OnStopCrouch() { if(mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool OnStartInventory() { mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool OnStartInventoryShortCut(int alNum) { return false; } //----------------------------------------------------------------------- };*/