Код:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>
#include <hl>
#define PLUGIN "Minigun Controll"
#define VERSION "1.0"
#define AUTHOR "Dias"
new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33],
g_preparing[33], g_ending[33], g_reloading[500]
new Float:g_last_firesound[33]
new const base_model[] = "models/mw2_auto/base.mdl"
new const main_model[] = "models/mw2_auto/main.mdl"
new const muzzleflash_spr[] = "sprites/muzzleflash3_auto.spr"
new muzzleflash_spr_id, Float:g_last_shoot[33]
new g_blood, g_bloodspray, g_dead[500], g_exp_id, g_owner[500], Float:g_check_heat[33]
new const minigun_sound[3][] = {
"mw2_auto/minigun-starting.wav",
"mw2_auto/minigun-shooting.wav",
"mw2_auto/minigun-stoping.wav"
}
new g_had_minigun[33], g_reg, g_heat[500]
new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end,
cvar_delay_attack, cvar_reload_time
// Weapon entity names
new const WEAPONENTNAMES[][] = { "", "weapon_crowbar", "", "weapon_9mmhandgun", "weapon_9mmar", "weapon_357", "weapon_crossbow", "weapon_shotgun",
"weapon_gauss", "weapon_rpg", "weapon_hornetgun", "weapon_handgrenade", "weapon_satchel", "weapon_snark",
"weapon_tripine", "weapon_egon" }
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_think("mw2_mingun_main", "fw_main_think")
register_forward(FM_CmdStart, "fw_CmdStart")
for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
//Cvars
cvar_minigun_health = register_cvar("minigun_health", "500")
cvar_minigun_dmgrand_start = register_cvar("minigun_dmgrand_start", "10")
cvar_minigun_dmgrand_end = register_cvar("minigun_dmgrand_end", "30")
cvar_delay_attack = register_cvar("minigun_delay_attack", "0.1")
cvar_reload_time = register_cvar("minigun_reload_time", "30.0")
//
register_clcmd("say /make", "create_minigun")
register_clcmd("say /remote", "remote_minigun")
register_clcmd("say /giveshit", "mgive")
}
public plugin_precache()
{
precache_model(base_model)
precache_model(main_model)
for(new i = 0; i < sizeof(minigun_sound); i++)
engfunc(EngFunc_PrecacheSound, minigun_sound[i])
muzzleflash_spr_id = precache_model(muzzleflash_spr)
g_blood = precache_model("sprites/blood.spr")
g_bloodspray = precache_model("sprites/bloodspray.spr")
g_exp_id = precache_model("sprites/zerogxplode.spr")
}
public reset_minigun(id)
{
attach_view(id, id)
g_had_minigun[id] = 0
g_player_main[id] = 0
g_player_main2[id] = 0
g_remoting[id] = 0
g_preparing[id] = 0
g_firing[id] = 0
g_ending[id] = 0
remove_task(id+2479)
}
public mgive(id)
{
g_had_minigun[id] = 1
create_minigun(id)
}
public create_minigun(id)
{
if(!g_had_minigun[id])
return
g_had_minigun[id] = 0
new Float:Origin[3], Float:Angles[3]
get_position(id, 40.0, 0.0, 0.0, Origin)
pev(id, pev_angles, Angles)
// Make the Base
new ent = create_entity("info_target")
entity_set_origin(ent, Origin);
Angles[0] = 0.0
entity_set_vector(ent, EV_VEC_angles, Angles)
entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base")
entity_set_model(ent, base_model);
entity_set_int(ent,EV_INT_solid, SOLID_NOT)
entity_set_float(ent,EV_FL_takedamage,1.0)
entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 10000.0)
new Float:maxs[3] = {10.0,10.0,1.0}
new Float:mins[3] = {-10.0,-10.0,-1.0}
entity_set_size(ent,mins,maxs)
set_entity_anim(ent, 0)
g_dead[ent] = 0
g_owner[ent] = id
entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
drop_to_floor(ent)
// Create Main
ent = create_entity("info_target")
Origin[2] -= 35.0
entity_set_origin(ent, Origin);
entity_set_vector(ent, EV_VEC_angles, Angles)
entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main")
entity_set_model(ent, main_model);
entity_set_int(ent,EV_INT_solid, SOLID_BBOX)
entity_set_float(ent,EV_FL_takedamage,1.0)
entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 10000.0)
new Float:maxs2[3] = {10.0,10.0,20.0}
new Float:mins2[3] = {-10.0,-10.0,-20.0}
entity_set_size(ent,mins2,maxs2)
set_entity_anim(ent, 0)
g_heat[ent] = 0
entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
g_player_main[id] = ent
g_dead[ent] = 0
g_owner[ent] = id
g_reloading[ent] = 0
drop_to_floor(ent)
if(!g_reg)
{
g_reg = 1
RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage")
}
// Create View Ent
ent = create_entity("info_target")
get_position(id, 40.0, 0.0, 10.0, Origin)
entity_set_origin(ent, Origin);
entity_set_vector(ent, EV_VEC_angles, Angles)
entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view")
entity_set_model(ent, main_model);
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
g_player_main2[id] = ent
}
public do_remote(id)
{
id -= 2479
remote_minigun(id)
}
public remote_minigun(id)
{
if(!g_player_main[id])
return
attach_view(id, g_player_main2[id])
engclient_cmd(id, "weapon_crowbar")
set_task(1.0, "task_delay", id)
}
public task_delay(id)
{
g_remoting[id] = 1
}
public client_PostThink(id)
{
if(!g_remoting[id])
return
if(!g_player_main[id])
return
if(!pev_valid(g_player_main[id]))
{
reset_minigun(id)
return
}
if(!g_firing[id] && !g_reloading[g_player_main[id]])
{
if(g_heat[g_player_main[id]] > 0)
{
static Float:CurTime
CurTime = get_gametime()
if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id])
{
g_heat[g_player_main[id]]--
g_check_heat[id] = CurTime
}
}
}
static Float:NewAngles[3], Float:OldAngles[3], Float:Origin[3]
pev(id, pev_angles, NewAngles)
pev(g_player_main[id], pev_angles, OldAngles)
NewAngles[2] = OldAngles[2]
pev(g_player_main2[id], pev_origin, Origin)
//get_position(g_player_main2[id], -10.0, 0.0, 0.0, Origin)
set_pev(g_player_main[id], pev_v_angle, NewAngles)
set_pev(g_player_main2[id], pev_angles, NewAngles)
NewAngles[0] -= NewAngles[0] * 2
set_pev(g_player_main[id], pev_angles, NewAngles)
if(get_user_weapon(id) != HLW_CROWBAR)
engclient_cmd(id, "weapon_crowbar")
}
public fw_main_think(ent)
{
if(!pev_valid(ent))
return
if(pev(ent, pev_health) - 1000.0 < 0)
{
if(!g_dead[ent])
minigun_dead(ent)
return
}
if(!g_dead[ent])
entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
}
public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits)
{
if(!is_user_alive(attacker) || !is_user_connected(attacker))
return HAM_IGNORED
static Health
Health = pev(victim, pev_health) - 1000
client_print(attacker, print_center, "Health: %i", Health)
return HAM_HANDLED
}
public minigun_dead(ent)
{
g_dead[ent] = 1
static Float:Origin[3]
pev(ent, pev_origin, Origin)
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_short(g_exp_id) // sprite index
write_byte(30) // scale in 0.1's
write_byte(30) // framerate
write_byte(0) // flags
message_end()
static id
id = g_owner[ent]
if(is_user_connected(id))
{
reset_minigun(id)
}
Origin[0] = 9999.0
Origin[1] = 9999.0
Origin[2] = 9999.0
set_pev(ent, pev_origin, Origin)
}
public fw_CmdStart(id, uc_handle, seed)
{
if(!is_user_alive(id) || !is_user_connected(id))
return FMRES_IGNORED
if(!g_player_main[id])
return FMRES_IGNORED
static PressButton
PressButton = get_uc(uc_handle, UC_Buttons)
if(g_remoting[id])
{
if(PressButton & IN_ATTACK)
{
static Float:CurTime
CurTime = get_gametime()
if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id])
{
if(!g_preparing[id] && !g_firing[id] && !g_ending[id])
{
g_preparing[id] = 1
g_firing[id] = 0
set_entity_anim(g_player_main[id], 1)
set_task(1.5, "start_attack", id)
emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100)
{
minigun_shoot(id)
if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id])
{
if(g_heat[g_player_main[id]] < 100)
{
g_heat[g_player_main[id]]++
}
g_check_heat[id] = CurTime
}
} else if(g_heat[g_player_main[id]] >= 100) {
if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]])
{
g_firing[id] = 0
g_preparing[id] = 0
g_ending[id] = 1
set_entity_anim(g_player_main[id], 3)
emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(2.0, "stop_attack", id)
g_reloading[g_player_main[id]] = 1
set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id)
}
}
g_last_shoot[id] = CurTime
}
PressButton &= ~IN_ATTACK
set_uc(uc_handle, UC_Buttons, PressButton)
} else {
if(pev(id, pev_oldbuttons) & IN_ATTACK)
{
if(g_preparing[id] || g_firing[id])
{
g_firing[id] = 0
g_preparing[id] = 0
g_ending[id] = 1
set_entity_anim(g_player_main[id], 3)
emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(2.0, "stop_attack", id)
}
}
}
}
if(PressButton & IN_USE)
{
if(g_remoting[id])
{
set_task(1.0, "task_delay2", id)
attach_view(id, id)
g_preparing[id] = 0
g_firing[id] = 0
PressButton &= ~IN_USE
set_uc(uc_handle, UC_Buttons, PressButton)
} else {
if(!task_exists(id+2479))
{
set_task(3.0, "do_remote", id+2479)
}
}
} else {
if(pev(id, pev_oldbuttons) & IN_USE)
{
remove_task(id+2479)
}
}
return FMRES_HANDLED
}
public reload_heat(id)
{
if(!pev_valid(g_player_main[id]))
return
g_heat[g_player_main[id]] = 0
g_reloading[g_player_main[id]] = 0
}
public task_delay2(id)
{
g_remoting[id] = 0
}
public start_attack(id)
{
g_preparing[id] = 0
g_firing[id] = 1
}
public stop_attack(id)
{
g_preparing[id] = 0
g_firing[id] = 0
g_ending[id] = 0
}
public minigun_shoot(id)
{
if(!g_remoting[id])
{
return PLUGIN_HANDLED
}
static Float:CurTime
CurTime = get_gametime()
if(CurTime - 0.1 > g_last_firesound[id])
{
client_cmd(id, "spk %s", minigun_sound[1])
emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
g_last_firesound[id] = CurTime
}
set_entity_anim(g_player_main[id], 2)
static Float:Origin[3], Float:AimOrigin[3]
get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin)
Origin[2] += 20.0
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_short(muzzleflash_spr_id) // sprite index
write_byte(5) // scale in 0.1's
write_byte(10) // framerate
write_byte(4) // flags
message_end()
static Float:Punch[3]
Punch[0] = random_float(1.0, 5.0)
Punch[1] = random_float(1.0, 5.0)
Punch[2] = random_float(1.0, 10.0)
set_pev(id, pev_punchangle, Punch)
get_position(g_player_main[id], 70.0, 0.0, 30.0, Origin)
get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin)
create_tracer(id, Origin, AimOrigin)
get_position(g_player_main[id], 4000.0, -30.0, 50.0, AimOrigin)
create_tracer(id, Origin, AimOrigin)
get_position(g_player_main[id], 4000.0, 30.0, -50.0, AimOrigin)
create_tracer(id, Origin, AimOrigin)
get_position(g_player_main[id], 4000.0, -60.0, -70.0, AimOrigin)
create_tracer(id, Origin, AimOrigin)
get_position(g_player_main[id], 4000.0, 60.0, 70.0, AimOrigin)
create_tracer(id, Origin, AimOrigin)
return PLUGIN_HANDLED
}
// Ham Weapon Deploy Forward
public fw_Item_Deploy_Post(weapon_ent)
{
if(pev_valid(weapon_ent))
return HAM_IGNORED
static id
id = pev(weapon_ent, pev_owner)
if(g_remoting[id])
engclient_cmd(id, "weapon_crowbar")
return HAM_HANDLED
}
stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
pev(id, pev_origin, vOrigin)
pev(id, pev_view_ofs,vUp) //for player
xs_vec_add(vOrigin,vUp,vOrigin)
pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
vAngle[0] = 0.0
angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}
stock create_tracer(id, Float:start[3], Float:end[3])
{
new start_[3], end_[3]
FVecIVec(start, start_)
FVecIVec(end, end_)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_TRACER)
write_coord(start_[0])
write_coord(start_[1])
write_coord(start_[2])
write_coord(end_[0])
write_coord(end_[1])
write_coord(end_[2])
message_end()
static tr, Float:End_Origin[3], Target
engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)
get_tr2(tr, TR_vecEndPos, End_Origin)
Target = get_tr2(tr, TR_pHit)
if(is_user_alive(Target))
{
static Float:Origin[3]
pev(Target, pev_origin, Origin)
// Show some blood :)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
write_coord(floatround(Origin[0]))
write_coord(floatround(Origin[1]))
write_coord(floatround(Origin[2]))
write_short(g_bloodspray)
write_short(g_blood)
write_byte(70)
write_byte(random_num(1,2))
message_end()
ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET)
}
make_bullet(id, End_Origin)
}
stock make_bullet(id, Float:Origin[3])
{
// Find target
new target, body
get_user_aiming(id, target, body, 999999)
if(target > 0 && target <= get_maxplayers())
{
new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
pev(id, pev_origin, fStart)
// Get ids view direction
velocity_by_aim(id, 64, fVel)
// Calculate position where blood should be displayed
fStart[0] = Origin[0]
fStart[1] = Origin[1]
fStart[2] = Origin[2]
fEnd[0] = fStart[0]+fVel[0]
fEnd[1] = fStart[1]+fVel[1]
fEnd[2] = fStart[2]+fVel[2]
// Draw traceline from victims origin into ids view direction to find
// the location on the wall to put some blood on there
new res
engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
get_tr2(res, TR_vecEndPos, fRes)
// Show some blood :)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
write_coord(floatround(fStart[0]))
write_coord(floatround(fStart[1]))
write_coord(floatround(fStart[2]))
write_short(g_bloodspray)
write_short(g_blood)
write_byte(70)
write_byte(random_num(1,2))
message_end()
} else {
new decal = 41
// Check if the wall hit is an entity
if(target)
{
// Put decal on an entity
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DECAL)
write_coord(floatround(Origin[0]))
write_coord(floatround(Origin[1]))
write_coord(floatround(Origin[2]))
write_byte(decal)
write_short(target)
message_end()
} else {
// Put decal on "world" (a wall)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
write_coord(floatround(Origin[0]))
write_coord(floatround(Origin[1]))
write_coord(floatround(Origin[2]))
write_byte(decal)
message_end()
}
// Show sparcles
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOTDECAL)
write_coord(floatround(Origin[0]))
write_coord(floatround(Origin[1]))
write_coord(floatround(Origin[2]))
write_short(id)
write_byte(decal)
message_end()
}
}
stock set_entity_anim(ent, anim)
{
entity_set_float(ent, EV_FL_animtime, get_gametime())
entity_set_float(ent, EV_FL_framerate, 1.0)
entity_set_int(ent, EV_INT_sequence, anim)
}