Hand Viewmodels

From Valve Developer Community
Jump to: navigation, search

Have you ever wanted fancy c_ models like all those cool games? Well now you can!

Put this file in your shared folder or shared game folder.

handviewmodel_shared.cpp

#include "cbase.h"
#include "baseviewmodel_shared.h"

#if defined( CLIENT_DLL )
#define CHandViewModel C_HandViewModel
#endif

class CHandViewModel : public CBaseViewModel
{
	DECLARE_CLASS( CHandViewModel, CBaseViewModel );
public:
	DECLARE_NETWORKCLASS();
private:
};

LINK_ENTITY_TO_CLASS(hand_viewmodel, CHandViewModel);
IMPLEMENT_NETWORKCLASS_ALIASED(HandViewModel, DT_HandViewModel)

// for whatever reason the parent doesn't get sent 
// I don't really want to mess with the baseviewmodel
// so now it does
BEGIN_NETWORK_TABLE(CHandViewModel, DT_HandViewModel)
#ifndef CLIENT_DLL
SendPropEHandle(SENDINFO_NAME(m_hMoveParent, moveparent)),
#else
RecvPropInt(RECVINFO_NAME(m_hNetworkMoveParent, moveparent), 0, RecvProxy_IntToMoveParent),
#endif
END_NETWORK_TABLE()

I'd put something like this in your server/player.cpp or in your mod's server player.cpp below CreateViewModel.

server/player.cpp

void CBasePlayer::CreateHandModel(int index, int iOtherVm)
{
	Assert(index >= 0 && index < MAX_VIEWMODELS && iOtherVm >= 0 && iOtherVm < MAX_VIEWMODELS );

	if (GetViewModel(index))
		return;

	CBaseViewModel *vm = (CBaseViewModel *)CreateEntityByName("hand_viewmodel");
	if (vm)
	{
		vm->SetAbsOrigin(GetAbsOrigin());
		vm->SetOwner(this);
		vm->SetIndex(index);
		DispatchSpawn(vm);
		vm->FollowEntity(GetViewModel(iOtherVm), true);
		m_hViewModel.Set(index, vm);
	}
}

You should also add this to your server or mod's player.h below CreateViewModel.

server/player.h

virtual void	        CreateHandModel( int viewmodelindex = 1, int iOtherVm = 0 );

Now if you want this to actually work you're gonna need to call it. Call it sometime after CreateViewModel in either the BasePlayer or your mod's player spawn.

server/player.cpp

	CreateHandModel();

So now that the HandViewModel has been created we need to set its model. Put this in your mod's server's player's spawn sometime after the handmodel has been created.

server/your_mod/your_player.cpp

	GetViewModel(1)->SetModel("models/coolhandsfolder/cool_arms.mdl");

Make sure your model has been precached first!

Side note this might not work perfectly on Alien Swarm since it does weird stuff sometimes with bone merging.