Source SDK

Source SDK

Not enough ratings
Ironsights "apuntar con armas" Source Sdk 2013 (obsoleto)
By Oitnemood
El objetivo de este tutorial es crear un sistema de visión artificial. Mueve el origen de la posición del arma hasta los ojos del jugador.

guía original de valve
https://developer.valvesoftware.com/wiki/Ironsights
   
Award
Favorite
Favorited
Unfavorite
Intro
HL2DM y SDK para un jugador

Esto podría funcionar también con el Scratch. Normalmente todo lo que tienes que hacer es sustituir hl2mp_ por sdk_xxx.cpp y encontrarás los archivos adecuados para ponerlo.

Este es un proyecto de la comunidad. El código original viene de este hombre: Cin.

Él tiene los créditos de la mayor parte de este código tal y como está ahora.

Para hacerlo: Hay que cambiar el fov en el toggle
hl2mp_weapon_parse.h (DM) or weapon_parse.h (Singleplayer)
Añade esto en la parte inferior del archivo. Añade sólo las líneas con //ADDED detrás.
public: //jorg40 - ironsight Vector m_expOffset; //ADDED QAngle m_expOriOffset; //ADDED int m_iPlayerDamage; };
hl2mp_weapon_parse.cpp (DM) or weapon_parse.cpp (Singleplayer)
Añade esto en el archivo.
void CHL2MPSWeaponInfo::Parse( KeyValues *pKeyValuesData, const char *szWeaponName ) { ... // this just saves off the data in the script file for later use KeyValues *pEt = pKeyValuesData->FindKey("ExpOffset"); if (pEt) { m_expOffset.x = pEt->GetFloat("x", 0.0f); m_expOffset.y = pEt->GetFloat("y", 0.0f); m_expOffset.z = pEt->GetFloat("z", 0.0f); m_expOriOffset.x = pEt->GetFloat("xori", 0.0f); m_expOriOffset.y = pEt->GetFloat("yori", 0.0f); m_expOriOffset.z = pEt->GetFloat("zori", 0.0f); } else { m_expOffset = vec3_origin; m_expOriOffset.Init(); } ... }
baseviewmodel_shared.cpp
Cambia al principio del archivo para que se vea así
#include "cbase.h" #include "baseviewmodel_shared.h" #include "datacache/imdlcache.h" #if defined( CLIENT_DLL ) #include "iprediction.h" #include "prediction.h" // cin: 070105 - ironsight mode changes #include "convar.h" #include "c_hl2mp_player.h" #include "weapon_hl2mpbase.h" #else #include "vguiscreen.h" #endif // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h"
Luego, debajo de eso, agrega lo que debe verse así.
//THIS IS ALREADY IN THE CODE, just so you know where we are #define VIEWMODEL_ANIMATION_PARITY_BITS 3 #define SCREEN_OVERLAY_MATERIAL "vgui/screens/vgui_overlay" //ALL BELOW IS NEW #if defined( CLIENT_DLL ) void ExpWpnTestOffset(ConVar *pConVar, char *pszString); ConVar cl_exp_test_wpn_offset("cl_exp_test_wpn_offset", "0", 0, "Tests weapon offsets", (FnChangeCallback_t)ExpWpnTestOffset); ConVar cl_exp_test_wpn_offset_x("cl_exp_test_wpn_offset_x", "0"); ConVar cl_exp_test_wpn_offset_y("cl_exp_test_wpn_offset_y", "0"); ConVar cl_exp_test_wpn_offset_z("cl_exp_test_wpn_offset_z", "0"); ConVar cl_exp_test_wpn_ori_offset_x("cl_exp_test_wpn_ori_offset_x", "0"); ConVar cl_exp_test_wpn_ori_offset_y("cl_exp_test_wpn_ori_offset_y", "0"); ConVar cl_exp_test_wpn_ori_offset_z("cl_exp_test_wpn_ori_offset_z", "0"); // cin: 070105 - applies existing weapon offsets when // entering test mode (this will not be called upon // weapon change, so beware) // this mode should only be used for calibrating the // ironsighted mode offests for a particular weapon void ExpWpnTestOffset(ConVar *pConVar, char *pszString) { CBasePlayer *pPlayer = UTIL_PlayerByIndex(engine->GetLocalPlayer()); if (pPlayer) { CWeaponHL2MPBase *pWeapon = dynamic_cast<CWeaponHL2MPBase *>(pPlayer->GetActiveWeapon()); if (pWeapon) { cl_exp_test_wpn_offset_x.SetValue(pWeapon->GetHL2MPWpnData().m_expOffset.x); cl_exp_test_wpn_offset_y.SetValue(pWeapon->GetHL2MPWpnData().m_expOffset.y); cl_exp_test_wpn_offset_z.SetValue(pWeapon->GetHL2MPWpnData().m_expOffset.z); cl_exp_test_wpn_ori_offset_x.SetValue(pWeapon->GetHL2MPWpnData().m_expOriOffset.x); cl_exp_test_wpn_ori_offset_y.SetValue(pWeapon->GetHL2MPWpnData().m_expOriOffset.y); cl_exp_test_wpn_ori_offset_z.SetValue(pWeapon->GetHL2MPWpnData().m_expOriOffset.z); } } } // last time ironsighted mode was toggled float gIronsightedTime(0.0f); // I bound this to a key for testing(i.e. bind [ ironsight_toggle) CON_COMMAND(ironsight_toggle, "toggles ironsight mode for the current weapon") { if (gpGlobals->curtime - gIronsightedTime < 0.5f) return; CBasePlayer *pPlayer = UTIL_PlayerByIndex(engine->GetLocalPlayer()); if (pPlayer) { C_BaseViewModel *pVm = pPlayer->GetViewModel(); if (pVm) { pPlayer->m_Local.m_iHideHUD ^= HIDEHUD_CROSSHAIR ; pVm->m_bExpSighted ^= true; gIronsightedTime = gpGlobals->curtime; } } } void CalcExpWpnOffsets(CBasePlayer *owner, Vector &pos, QAngle &ang) { Vector forward, right, up, offset; // this is a simple test mode to help determine the proper values // to place in the weapon script if (cl_exp_test_wpn_offset.GetBool()) { ang.x += cl_exp_test_wpn_ori_offset_x.GetFloat(); ang.y += cl_exp_test_wpn_ori_offset_y.GetFloat(); ang.z += cl_exp_test_wpn_ori_offset_z.GetFloat(); offset.Init(cl_exp_test_wpn_offset_x.GetFloat(), cl_exp_test_wpn_offset_y.GetFloat(), cl_exp_test_wpn_offset_z.GetFloat()); } else { CWeaponHL2MPBase *pWeapon = dynamic_cast<CWeaponHL2MPBase *>(ToHL2MPPlayer(owner)->GetActiveWeapon()); if (pWeapon) { ang += pWeapon->GetHL2MPWpnData().m_expOriOffset; offset = pWeapon->GetHL2MPWpnData().m_expOffset; } } // get eye direction angles AngleVectors(ang, &forward, &right, &up); // apply the offsets pos += forward * offset.x; pos += right * offset.y; pos += up * offset.z; } #endif

Desplázate un poco hacia abajo y encontrarás el ViewModel::Spawn Edítalo para que se vea así:
void CBaseViewModel::Spawn( void ) { Precache( ); SetSize( Vector( -8, -4, -2), Vector(8, 4, 2) ); SetSolid( SOLID_NONE ); #ifdef CLIENT_DLL // cin: 070105 - ironsighted mode changes m_bExpSighted = false; m_expFactor = 0.0f; gIronsightedTime = 0.0f; #endif }
Animación de la pistola
Ahora mientras estamos en el archivo necesitamos algo más. Busca el void CBaseViewModel::CalcViewModelView. Reemplaza toda la función con esto.

void CBaseViewModel::CalcViewModelView( CBasePlayer *owner, const Vector& eyePosition, const QAngle& eyeAngles ) { // UNDONE: Calc this on the server? Disabled for now as it seems unnecessary to have this info on the server #if defined( CLIENT_DLL ) QAngle vmangoriginal = eyeAngles; QAngle vmangles = eyeAngles; Vector vmorigin = eyePosition; CBaseCombatWeapon *pWeapon = m_hWeapon.Get(); //Allow weapon lagging if ( pWeapon != NULL ) { #if defined( CLIENT_DLL ) if ( !prediction->InPrediction() ) #endif { pWeapon->AddViewmodelBob( this, vmorigin, vmangles ); CalcViewModelLag( vmorigin, vmangles, vmangoriginal ); } } #if defined( CLIENT_DLL ) if ( !prediction->InPrediction() ) { // Let the viewmodel shake at about 10% of the amplitude of the player's view vieweffects->ApplyShake( vmorigin, vmangles, 0.1 ); } #endif // cin: 070105 - ironsighted mode changes // get the wpn offsets CalcExpWpnOffsets(owner, vmorigin, vmangles); // get delta time for 1 sec interpolation and interpolate to/from positional offset float delta(gpGlobals->curtime - gIronsightedTime); m_expFactor = (m_bExpSighted) ? (delta > 1.0f) ? 1.0f : delta : (delta > 1.0f) ? 0.0f : 1.0f - delta; Vector difPos(vmorigin - eyePosition); vmorigin = eyePosition + (difPos * m_expFactor); SetLocalOrigin(vmorigin); SetLocalAngles(vmangles); #endif }

Parece fácil, ¿no? ¿Qué hace entonces? Las variables delta dicen qué es qué. 1.0 es cuando el arma está completamente apuntada, y 0.0 dice cuando no está apuntada en absoluto. Así que estos códigos calculan la distancia entre y deslizar el arma de 0 a 1.
baseviewmodel_shared.h
Aquí hay que añadir un par de definiciones públicas.
class CBaseViewModel : public CBaseAnimating { DECLARE_CLASS( CBaseViewModel, CBaseAnimating ); public: bool m_bExpSighted; //ADDED float m_expFactor; //ADDED DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); #if !defined( CLIENT_DLL ) DECLARE_DATADESC(); #endif
Extra
Algunos de ustedes podrían pensar que el arma se está moviendo hasta el punto designado un poco demasiado lento, entonces aquí está la solución a la misma. Nada difícil, nada especial, sólo 2 líneas de código.

Busca esta línea: float gIronsightedTime(0.0f); Debajo de ella añade esto.

float gMoveTime(0.1f); //Jorg40 - Segundos de uso para subir el modelo a la vista de los jugadores
Última línea. Ir al delta de flotación delta(gpGlobals->curtime - gIronsightedTime); Change it to look like this:

float delta((gpGlobals->curtime - gIronsightedTime) / gMoveTime);

Ya está. Todo lo que tenemos que hacer es cambiar los archivos de script.
weapon_pistol.txt
Añade esto en algún lugar de la sección "WeaponData" en el archivo de script.

ExpOffset
{
"x" "-15"
"y" "-5.5"
"z" "4.2"
// "xori" "-2.9" //No funciona
// "yori" "1.1" //No funciona
// "zori" "2.0" // No funciona
}
Diferencias para un jugador "Singleplayer"
Para conseguirlo en el modo de un solo jugador, haz las siguientes modificaciones:

Reemplazar:
CWeaponHL2MPBase *pWeapon = dynamic_cast<CWeaponHL2MPBase *>(pPlayer->GetActiveWeapon());
con
CBaseCombatWeapon *pWeapon = pPlayer->GetActiveWeapon();
Reemplazar:
CWeaponHL2MPBase *pWeapon = dynamic_cast<CWeaponHL2MPBase *>(ToHL2MPPlayer(owner)->GetActiveWeapon());
con
CBaseCombatWeapon *pWeapon = owner->GetActiveWeapon();
Reemplazar:
ConVar cl_exp_test_wpn_offset("cl_exp_test_wpn_offset", "0", 0, "Tests weapon offsets", (FnChangeCallback_t)ExpWpnTestOffset);
con
#include "convar.h" #include "c_hl2mp_player.h" #include "weapon_hl2mpbase.h"
Reemplazar:
ConVar cl_exp_test_wpn_offset("cl_exp_test_wpn_offset", "0", 0, "Tests weapon offsets", (FnChangeCallback)ExpWpnTestOffset);
con
#include "convar.h" #include "c_baseplayer.h"
Reemplazar:
pWeapon->GetHL2MPWpnData()
con
pWeapon->GetWpnData()
Resultados
A la derecha se muestra una imagen de ejemplo. Ironsights_result.jpg]Imagen de muestra[/url]
También está disponible un vídeo que muestra el resultado final: http://www.youtube.com/watch?v=BJ0YTHQDx8I
Notas
Cita/nota del autor real: La forma de establecer m_expFactor (la interpolación basada en el tiempo es la más fácil) y m_bExpSighted (pulsar un botón) depende de ti.
También, considera cómo puedes pasar esta información al servidor para que el modo ironsighted pueda ser propagado a otros clientes (es decir, otros jugadores verán que estás en modo ironsighted).

También en el juego, abre la consola, escribe cl_exp y aparecerán todos los comandos necesarios.

Nota de Pretador: Añadiendo los Keybinds: Para añadir el keybind para alternar la ironsight, abre tu kb_act. Bajo "#Valve_Combat_Title" Añade:

"ironsight_toggle" "#MOD_ironsight_toggle"

Luego abre tu mod_english.txt en mod/resource y escribe:

"MOD_ironsight_toggle" "ironsight_toggle"