#include <sdktools>
#include <sdkhooks>
new aimto[MAXPLAYERS+1]
new bool:aimOn[MAXPLAYERS+1]
new bool:recoil[MAXPLAYERS+1]
public OnPluginStart()
{
RegAdminCmd("sm_amm", createMenu, ADMFLAG_ROOT)
RegAdminCmd("sm_aimmod", Aim, ADMFLAG_ROOT)
RegAdminCmd("sm_aimmodid", AimId, ADMFLAG_ROOT)
RegAdminCmd("sm_aimmodto", AimTo, ADMFLAG_ROOT)
HookEvent("weapon_fire", OnBulletImpact,EventHookMode_Pre);
}
public OnClientPutInServer(client)
{
aimto[client]=0
aimOn[client]=false
recoil[client]=false
}
public Action Aim(client, args)
{
decl String:name[256]
GetClientName(client, name, sizeof(name))
aimOn[client] = !aimOn[client]
}
public bool:TraceRayDontHitSelf(entity, mask, any:data)
{
if (entity == data)
{
return false;
}
return true;
}
public Action createMenu( client, args ){
new Handle:menuHandle = CreateMenu( MenuHandler );
SetMenuTitle( menuHandle, "Admin Aim Menu" );
for( new iPlayer = 1 ; iPlayer <= MaxClients ; iPlayer++ ){
if( !IsClientConnected( iPlayer ) ){
continue;
}
new String:szName[ 64 ];
GetClientName( iPlayer , szName , sizeof( szName ) );
new String:szPlayer[ 128 ],
String:szDisplay[ 128 ];
Format( szPlayer , sizeof( szPlayer ) , "%d" , iPlayer );
Format( szDisplay , sizeof( szDisplay ) , "%s: %s" , szName , aimOn[ iPlayer ] ? "On":"Off" );
AddMenuItem( menuHandle , szPlayer , szDisplay );
}
DisplayMenu( menuHandle, client, MENU_TIME_FOREVER );
}
public MenuHandler(Handle:menu, MenuAction:action, param1, param2){
if (action == MenuAction_Select){
new String: szInfo[32];
GetMenuItem( menu, param2, szInfo, sizeof( szInfo ) - 1 );
new iPlayer = StringToInt( szInfo );
if(IsClientInGame( iPlayer ) ){
aimOn[ iPlayer ] = !aimOn[ iPlayer ];
}
decl String:name[256]
decl String:name2[256]
GetClientName(param1, name, sizeof(name))
GetClientName(iPlayer, name2, sizeof(name2))
if(aimOn[iPlayer])
PrintToChat(iPlayer,"[InkCore] Игрок %s врубил игроку %s Aim", name, name2)
else
PrintToChat(iPlayer,"[InkCore] Игрок %s вырубил игроку %s Aim", name, name2)
createMenu( param1, 0 );
}
else if (action == MenuAction_End){
CloseHandle(menu);
}
}
bool:IsVisible(iClient, iEntity)
{
decl Float:vClientEye[3], Float:vEntityOrigin[3];
GetClientEyePosition(iClient, vClientEye);
GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", vEntityOrigin);
TR_TraceRayFilter(vClientEye, vEntityOrigin, MASK_VISIBLE, RayType_EndPoint, Filter_NoPlayers);
return (TR_GetFraction() == 1.0);
}
public bool:Filter_NoPlayers(iEntity, iMask)
{
return (iEntity <= 0 || iEntity > MaxClients);
}
public Action:OnBulletImpact(Handle:event, const String:name32[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
decl Float:orin[3];
if(GetClientButtons(client) & IN_ATTACK2)
return Plugin_Continue
if(aimOn[client])
{
GetClientEyePosition(client, orin)
}
else
{
return Plugin_Continue
}
new target = 0
new Float:fVictimOrigin[3], Float:fAttackerOrigin[3], Float:fDirection[3], Float:Angles[3];
GetClientEyePosition(client, fAttackerOrigin);
new Float:dist = 99999999999999999.0
for(new i = 1;i<=MaxClients;i++)
{
if(IsClientInGame(i)&&IsPlayerAlive(i)&&GetClientTeam(i)!=GetClientTeam(client))
{
if(IsVisible(client, i))
{
GetClientEyePosition(i, fVictimOrigin);
if(dist > GetVectorDistance(orin, fVictimOrigin))
{
dist = GetVectorDistance(orin, fVictimOrigin)
target = i
}
}
}
}
if(target == 0||target == -1)
return Plugin_Continue
static const String:name[3][256] = {"m_aimPunchAngle", "m_aimPunchAngleVel", "m_viewPunchAngle"}
for(new i=0;i<=2;i++)
{
SetEntPropVector(client, Prop_Send, name[i], Float:{0.0,0.0,0.0})
}
GetClientEyePosition(target, fVictimOrigin);
fVictimOrigin[2]-=2.0
MakeVectorFromPoints(fAttackerOrigin, fVictimOrigin, fDirection);
NormalizeVector(fDirection, fDirection);
ScaleVector(fDirection, 220.0);
GetVectorAngles(fDirection, Angles)
TR_TraceRayFilter(orin, Angles, MASK_SOLID, RayType_Infinite, TraceRayDontHitSelf, client);
TR_GetEndPosition(orin);
if(GetVectorDistance(orin, fVictimOrigin) < 50.0)
{
TeleportEntity(client, NULL_VECTOR, Angles, NULL_VECTOR);
SDKHooks_TakeDamage(target, client, client, 500.0, DMG_GENERIC);
}
return Plugin_Continue
}
public Action AimTo(client, args)
{
decl String:arg[256]
GetCmdArg(1, arg, sizeof(arg))
int target
if(StringToInt(arg)!=0)
target = GetClientOfUserId(StringToInt(arg))
else
target = 0
if(target!=0)
if(!IsClientInGame(target)||!IsPlayerAlive(target))
{
PrintToChat(client, "[InkCore] Игрок должен быть жив и в игре")
return;
}
aimto[client]=target
}
public Action AimId(client,args)
{
decl String:arg[256]
GetCmdArg(1, arg, sizeof(arg))
int target = GetClientOfUserId(StringToInt(arg))
if(!IsClientInGame(target)||!IsPlayerAlive(target))
{
PrintToChat(client, "[InkCore] Игрок должен быть жив и в игре")
return;
}
new Float:fVictimOrigin[3], Float:fAttackerOrigin[3], Float:fDirection[3], Float:Angles[3];
GetClientEyePosition(target, fVictimOrigin);
GetClientEyePosition(client, fAttackerOrigin);
MakeVectorFromPoints(fAttackerOrigin, fVictimOrigin, fDirection);
NormalizeVector(fDirection, fDirection);
new Float:fForce = 220.0
ScaleVector(fDirection, fForce);
GetVectorAngles(fDirection, Angles)
TeleportEntity(client, NULL_VECTOR, Angles, NULL_VECTOR);
}