#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <reapi>
#define PLUGIN "CSGO DEATH CAM"
#define VERSION "1.0"
#define AUTHOR "Sugisaki"
#define CLASS "ent_camara"
#define CAMERA_MODEL "models/arcticorangeT.mdl"
#define CAMERA_MINS Float: { -10.0, -10.0, 0.0 }
#define CAMERA_MAXS Float: { 10.0, 10.0, 25.0 }
new killer[33]
new las_obs[33]
new play[33]
new Float:g_freeze_origin[33][33][3]
new g_freeze_sequence[33][33]
new g_freeze_frame[33][33]
new g_freeze_framerate[33][33]
new Float:g_freeze_angles[33][33][3]
new g_freeze_gaitsequence[33][33]
new g_freeze_weaponmodel[33][33]
new bool:g_bfreeze[33]
new Float:g_DamageStats[33][33]
new g_TraceStats[33][33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /dcam", "pfn_cam")
register_think(CLASS, "pfn_camera_think")
register_event("DeathMsg", "pfn_death", "a")
register_forward(FM_AddToFullPack, "AddToFullPack", 1)
register_event("TextMsg", "pfn_unfreeze", "b", "2&#Spec_Mode")
RegisterHam(Ham_Spawn, "player", "OnSpawnPlayer", 1)
register_touch("player", CLASS, "OnTouchCamera")
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true)
RegisterHookChain(RG_CBasePlayer_TraceAttack, "CBasePlayer_TraceAttack", false)
}
public CBasePlayer_TraceAttack(victim, attacker, Float:flDamage, Float:vecDir[3], tracehandle, bitsDamageType)
{
g_TraceStats[attacker][victim]++
}
public CBasePlayer_TakeDamage(victim, inflictor, attacker, Float:damage)
{
g_DamageStats[attacker][victim] += damage
}
public plugin_precache()
{
precache_model(CAMERA_MODEL)
}
pfn_SpawnCamera(id, target)
{
if(!is_user_connected(target))
return
freeze_map(id)
new ent = create_entity("info_target")
if(!is_valid_ent(ent))
{
client_print(id, print_chat, "Error create entity")
return
}
new Float:origin[3], Float:angles[3], Float:o2[3]
entity_get_vector(target, EV_VEC_origin, o2)
entity_get_vector(id, EV_VEC_origin, origin)
//entity_get_vector(id, EV_VEC_v_angle, angles)
//angles[0] = angles[0] * -1.0
entity_set_model(ent, CAMERA_MODEL)
entity_set_int(ent, EV_INT_movetype, MOVETYPE_NOCLIP)
entity_set_string(ent, EV_SZ_classname, CLASS)
entity_set_int(ent, EV_INT_solid, SOLID_TRIGGER)
entity_set_vector(ent, EV_VEC_origin, origin)
entity_set_vector(ent, EV_VEC_angles, angles)
entity_set_edict(ent, EV_ENT_owner, id)
//set aim
entity_set_aim(ent, o2)
// set speed
set_speed(ent, calculate_speed(id, target), o2)
//
attach_view(id, ent);
entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.001)
set_task(1.5, "pfn_remove_ent", id)
//PERF1337
new target_name[MAX_PLAYERS]
get_user_name(target, target_name, charsmax(target_name))
set_dhudmessage(.red = 0, .green = 255, .blue = 0, .x = -1.0, .y = -1.0, .effects = 0,
.fxtime = 1.5, .holdtime = 1.5, .fadeintime = 0.1, .fadeouttime = 0.2)
show_dhudmessage(id, "%s^nDamage taken: %.0f in %d hits^nDamage given: %.0f in %d hits", target_name, g_DamageStats[target][id], g_TraceStats[target][id], g_DamageStats[id][target], g_TraceStats[id][target])
client_print(id, print_console, "%s | Damage taken: %.0f in %d hits | Damage given: %.0f in %d hits", target_name, g_DamageStats[target][id], g_TraceStats[target][id], g_DamageStats[id][target], g_TraceStats[id][target])
//
}
public pfn_remove_ent(id)
{
remove_task(id)
new ent = find_ent_by_owner(-1, CLASS, id)
if(is_valid_ent(ent))
{
remove_entity(ent)
}
arrayset(g_DamageStats[id], 0, sizeof(g_DamageStats[]))
arrayset(g_TraceStats[id], 0, sizeof(g_TraceStats[]))
}
public pfn_camera_think(e)
{
if(!is_valid_ent(e))
{
return;
}
if(get_entity_distance(e, killer[entity_get_edict(e, EV_ENT_owner)]) < 100)
{
entity_set_vector(e, EV_VEC_velocity, Float:{0.0,0.0,0.0})
}
entity_set_float(e, EV_FL_nextthink, halflife_time() + 0.001)
}
public pfn_test(id)
{
new players[32], count
get_players(players, count, "ae", "TERRORIST")
new t = players[random(count)];
ExecuteHam(Ham_TakeDamage, id, t, t, 101.0, DMG_BULLET);
}
public pfn_cam(id)
{
play[id] = !play[id]
client_print(id, print_chat, "Death camera %sactivated", play[id] ? "":"de")
}
public pfn_death()
{
new k = read_data(1)
new v = read_data(2)
if(!is_user_connected(k) || v == k)
{
return
}
if(!play[v]) return
killer[v] = k
set_task(0.1, "dead_post", v)
}
public dead_post(id)
{
set_pev(id, pev_iuser1, OBS_NONE)
las_obs[id] = pev(id, pev_iuser1);
pfn_SpawnCamera(id, killer[id])
}
public AddToFullPack(es, e, ent, host, hostflags, player, pSet)
{
if(!player)
{
return
}
if(g_bfreeze[host])
{
set_es(es, ES_Angles, g_freeze_angles[host][ent])
set_es(es, ES_Origin, g_freeze_origin[host][ent])
set_es(es, ES_Sequence, g_freeze_sequence[host][ent])
set_es(es, ES_Frame, g_freeze_framerate[host][ent])
set_es(es, ES_FrameRate, g_freeze_framerate[host][ent])
set_es(es, ES_GaitSequence, g_freeze_gaitsequence[host][ent])
set_es(es, ES_WeaponModel, g_freeze_weaponmodel[host][ent])
}
}
freeze_map(id)
{
static szWM[60]
for(new i = 1; i <= get_maxplayers() ; i++)
{
if(!is_user_connected(i))
{
continue;
}
entity_get_vector(i, EV_VEC_origin, g_freeze_origin[id][i])
g_freeze_sequence[id][i] = entity_get_int(i, EV_INT_sequence)
g_freeze_frame[id][i] = entity_get_int(id, EV_FL_frame)
g_freeze_framerate[id][i] = entity_get_int(id, EV_FL_framerate)
entity_get_vector(i, EV_VEC_angles, g_freeze_angles[id][i])
g_freeze_gaitsequence[id][i] = entity_get_int(i, EV_INT_gaitsequence)
entity_get_string(i, EV_SZ_weaponmodel, szWM, charsmax(szWM))
g_freeze_weaponmodel[id][i] = engfunc(EngFunc_ModelIndex, szWM);
}
g_bfreeze[id] = true
}
public pfn_unfreeze(id)
{
g_bfreeze[id] = false
attach_view(id, id)
}
public client_putinserver(id)
{
g_bfreeze[id] = false
play[id] = true
arrayset(g_DamageStats[id], 0, sizeof(g_DamageStats[]))
arrayset(g_TraceStats[id], 0, sizeof(g_TraceStats[]))
}
public OnSpawnPlayer(id)
{
if(!is_user_alive(id))
{
return
}
pfn_unfreeze(id)
}
stock Float:calculate_speed(u1, u2)
{
return (float(get_entity_distance(u1, u2)) / 0.3)
}
public OnTouchCamera(ted, ter)
{
new id = pev(ter, pev_owner)
if(ted == killer[id])
{
entity_set_vector(ter, EV_VEC_velocity, Float:{0.0,0.0,0.0})
}
}
// CHR ENGINE
stock entity_set_aim(ent,const Float:origin2[3],bone=0)
{
if(!pev_valid(ent))
return 0;
static Float:origin[3]
origin[0] = origin2[0]
origin[1] = origin2[1]
origin[2] = origin2[2]
static Float:ent_origin[3], Float:angles[3]
if(bone)
engfunc(EngFunc_GetBonePosition,ent,bone,ent_origin,angles)
else
pev(ent,pev_origin,ent_origin)
origin[0] -= ent_origin[0]
origin[1] -= ent_origin[1]
origin[2] -= ent_origin[2]
static Float:v_length
v_length = vector_length(origin)
static Float:aim_vector[3]
aim_vector[0] = origin[0] / v_length
aim_vector[1] = origin[1] / v_length
aim_vector[2] = origin[2] / v_length
static Float:new_angles[3]
vector_to_angle(aim_vector,new_angles)
new_angles[0] *= -1
if(new_angles[1]>180.0) new_angles[1] -= 360
if(new_angles[1]<-180.0) new_angles[1] += 360
if(new_angles[1]==180.0 || new_angles[1]==-180.0) new_angles[1]=-179.999999
set_pev(ent,pev_angles,new_angles)
set_pev(ent,pev_fixangle,1)
return 1;
}
set_speed(ent, Float:speed, Float:origin[3])
{
static Float:origin1[3]
pev(ent,pev_origin,origin1)
static Float:new_velo[3]
new_velo[0] = origin[0] - origin1[0]
new_velo[1] = origin[1] - origin1[1]
new_velo[2] = origin[2] - origin1[2]
new Float:y
y = new_velo[0]*new_velo[0] + new_velo[1]*new_velo[1] + new_velo[2]*new_velo[2]
new Float:x
if(y) x = floatsqroot(speed*speed / y)
new_velo[0] *= x
new_velo[1] *= x
new_velo[2] *= x
if(speed<0.0)
{
new_velo[0] *= -1
new_velo[1] *= -1
new_velo[2] *= -1
}
set_pev(ent,pev_velocity,new_velo)
}