[Help] 3rd View shoot accuracy (Not Solved)
I have this code
PHP Code:
#include <amxmodx> #include <fakemeta> #include <fakemeta_util> #include <hamsandwich> #include <xs>
#define VERSION "0.0.2"
#define MAX_PLAYERS 32
#define USE_TOGGLE 3
#define CAMERA_FORWARD -35.0 #define CAMERA_RIGHT 30.0 #define CAMERA_UP 10.0 #define CAMERA_FRACTION -35.0
new g_iPlayerCamera[MAX_PLAYERS+1]
new g_iMaxPlayers
public plugin_init() { register_plugin("Camera View AUTOMATIC", VERSION, "ConnorMcLeod") RegisterHam(Ham_Spawn, "player", "CBasePlayer_Spawn_Post", 1) register_forward(FM_SetView, "SetView") RegisterHam(Ham_Think, "trigger_camera", "Camera_Think") g_iMaxPlayers = get_maxplayers() }
public CBasePlayer_Spawn_Post( id ) { if( !is_user_alive(id) ) { return } new iEnt = g_iPlayerCamera[id] if( !pev_valid(iEnt) ) { static iszTriggerCamera if( !iszTriggerCamera ) { iszTriggerCamera = engfunc(EngFunc_AllocString, "trigger_camera") } iEnt = engfunc(EngFunc_CreateNamedEntity, iszTriggerCamera) set_kvd(0, KV_ClassName, "trigger_camera") set_kvd(0, KV_fHandled, 0) set_kvd(0, KV_KeyName, "wait") set_kvd(0, KV_Value, "999999") dllfunc(DLLFunc_KeyValue, iEnt, 0) set_pev(iEnt, pev_spawnflags, SF_CAMERA_PLAYER_TARGET|SF_CAMERA_PLAYER_POSITION) set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_ALWAYSTHINK) dllfunc(DLLFunc_Spawn, iEnt) g_iPlayerCamera[id] = iEnt // } new Float:flMaxSpeed, iFlags = pev(id, pev_flags) pev(id, pev_maxspeed, flMaxSpeed) ExecuteHam(Ham_Use, iEnt, id, id, USE_TOGGLE, 1.0) set_pev(id, pev_flags, iFlags) // depending on mod, you may have to send SetClientMaxspeed here. // engfunc(EngFunc_SetClientMaxspeed, id, flMaxSpeed) set_pev(id, pev_maxspeed, flMaxSpeed) } }
public SetView(id, iEnt) { if( is_user_alive(id) ) { new iCamera = g_iPlayerCamera[id] if( iCamera && iEnt != iCamera ) { new szClassName[16] pev(iEnt, pev_classname, szClassName, charsmax(szClassName)) if( !equal(szClassName, "trigger_camera") ) // should let real cams enabled { engfunc(EngFunc_SetView, id, iCamera) // shouldn't be always needed return FMRES_SUPERCEDE } } } return FMRES_IGNORED }
public client_disconnect(id) { new iEnt = g_iPlayerCamera[id] if( pev_valid(iEnt) ) { engfunc(EngFunc_RemoveEntity, iEnt) } g_iPlayerCamera[id] = 0 }
public client_putinserver(id) { g_iPlayerCamera[id] = 0 }
public get_cam_owner(iEnt) { static id for(id = 1; id<=g_iMaxPlayers; id++) { if( g_iPlayerCamera[id] == iEnt ) { return id } } return 0 }
public Camera_Think( iEnt ) { static id if( !(id = get_cam_owner( iEnt )) ) { return } static Float:fVecPlayerOrigin[3], Float:fVecCameraOrigin[3], Float:fVecAngles[3], Float:fVecForward[3], Float:fVecRight[3], Float:fVecUp[3]
pev(id, pev_origin, fVecPlayerOrigin) pev(id, pev_view_ofs, fVecAngles) fVecPlayerOrigin[2] += fVecAngles[2] pev(id, pev_v_angle, fVecAngles) angle_vector(fVecAngles, ANGLEVECTOR_FORWARD, fVecForward) angle_vector(fVecAngles, ANGLEVECTOR_RIGHT, fVecRight) angle_vector(fVecAngles, ANGLEVECTOR_UP, fVecUp) fVecCameraOrigin[0] = fVecPlayerOrigin[0] + fVecForward[0] * CAMERA_FORWARD + fVecRight[0] * CAMERA_RIGHT + fVecUp[0] * CAMERA_UP fVecCameraOrigin[1] = fVecPlayerOrigin[1] + fVecForward[1] * CAMERA_FORWARD + fVecRight[1] * CAMERA_RIGHT + fVecUp[1] * CAMERA_UP fVecCameraOrigin[2] = fVecPlayerOrigin[2] + fVecForward[2] * CAMERA_FORWARD + fVecRight[2] * CAMERA_RIGHT + fVecUp[2] * CAMERA_UP engfunc(EngFunc_TraceLine, fVecPlayerOrigin, fVecCameraOrigin, IGNORE_MONSTERS, id, 0) static Float:flFraction get_tr2(0, TR_flFraction, flFraction) if( flFraction != 1.0 ) // adjust camera place if close to a wall { flFraction *= CAMERA_FRACTION //fVecCameraOrigin[0] = fVecPlayerOrigin[0] + fVecForward[0] * flFraction + fVecRight[0] * flFraction + fVecUp[0] * flFraction //fVecCameraOrigin[1] = fVecPlayerOrigin[1] + fVecForward[1] * flFraction + fVecRight[1] * flFraction + fVecUp[1] * flFraction //fVecCameraOrigin[2] = fVecPlayerOrigin[2] + fVecForward[2] * flFraction + fVecRight[2] * flFraction + fVecUp[2] * flFraction fVecCameraOrigin[0] = fVecPlayerOrigin[0] + (fVecForward[0] * flFraction) fVecCameraOrigin[1] = fVecPlayerOrigin[1] + (fVecForward[1] * flFraction) fVecCameraOrigin[2] = fVecPlayerOrigin[2] + (fVecForward[2] * flFraction) } set_pev(iEnt, pev_origin, fVecCameraOrigin) set_pev(iEnt, pev_angles, fVecAngles) }
This code make the players see their character from back side and right side... But when i fire a bullet, the hit origin is different from the crosshair origin... Could someone help me to solve it ? :)
http://i.imgur.com/0PG5jq8.png
|