Код за потвърждение: Избери целия код
#define PLUGINNAME ""
#define VERSION "0.3"
#define AUTHOR "JGHG"
/*
Copyleft 2005
====================
Where I come from, if you cut the wall repeteadly with your knife it means you're challenging your last opponent to a knife duel. ;-)
I decided to automate this process.
If only you and another person on the opposite team remain in the round, you can hit a wall (or another object) with your knife, THREE TIMES in fast succession.
By this action you challenge your opponent to a knife duel. The person you challenge gets a menu where he can accept/decline your
challenge. The challenged person has 10 seconds to decide his mind, else the challenge is automatically declined, and the menu should be closed automatically.
Should a knife duel start, it works out pretty much like a round of Knife Arena: you can only use the knife (and the C4!).
As soon as the round ends the Knife Arena mode is turned off.
/JGHG
VERSIONS
========
050421 0.3 You must now slash with your knife three times in fast succession to challenge someone.
050208 0.2 Fixed seconds display.
Bots should now respond correctly and a little human like. They will mostly accept challenges. ;-)
Small fixes here and there. :-)
050208 0.1 First version - largely untested
*/
#include <amxmodx>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <colorchat>
#define DEBUG
#if defined DEBUG
#include <amxmisc>
#endif // defined DEBUG
#define MENUSELECT1 0
#define MENUSELECT2 1
#define TASKID_CHALLENGING 2348923
#define TASKID_BOTTHINK 3242321
#define DECIDESECONDS 10
#define ALLOWED_WEAPONS 2
#define KNIFESLASHES 3 // the nr of slashes within a short amount of time until a challenge starts...
// Globals below
new g_allowedWeapons[ALLOWED_WEAPONS] = {CSW_KNIFE, CSW_C4}
new g_MAXPLAYERS
new bool:g_challenging = false
new bool:g_knifeArena = false
new bool:g_noChallengingForAWhile = false
new g_challengemenu
new g_challenger
new g_challenged
new g_challenges[33]
// Globals above
public plugin_precache()
{
precache_sound("misc/OG/round_berserker")
precache_model("models/v_knife.mdl")
precache_model("models/p_knife.mdl")
}
public plugin_init() {
register_plugin(PLUGINNAME, VERSION, AUTHOR)
register_event("CurWeapon", "event_holdwpn", "be", "1=1")
register_forward(FM_EmitSound, "forward_emitsound")
g_MAXPLAYERS = get_maxplayers()
g_challengemenu = register_menuid("JGHG's automatic knife duel"/*"You are challenged"*/)
register_menucmd(g_challengemenu, MENU_KEY_1 | MENU_KEY_2, "challenged_menu")
register_event("DeathMsg", "event_death", "a")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_terwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_ctwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_rounddraw")
register_event("ResetHUD", "event_hud_reset", "be");
register_clcmd("fullupdate", "clcmd_fullupdate") ;
register_event("TextMsg", "event_restart_attempt", "a", "2=#Game_will_restart_in");
#if defined DEBUG
register_clcmd("0challenge", "challengefn", ADMIN_CFG, "< desafiador > < desafiado > - inicia un duelo a cuchillos")
#endif // defined DEBUG
new Float:maptime = get_cvar_float("mp_timelimit")
if (maptime == 0.0)
maptime = 15.0
new Float:anntime = 60.0 * 5.0 // 5 minutes
if (maptime < 5.0)
anntime = maptime / 3.0
set_task(anntime, "Announcement", 0, "", 0, "b")
}
public forward_emitsound(const PIRATE, const Onceuponatimetherewasaverysmall, noise[], const Float:turtlewhoateabiggerturtleand, const Float:afterthatthesmallturtlegot, const veryveryverybig, const theend) {
if (g_noChallengingForAWhile || g_knifeArena || g_challenging || PIRATE < 1 || PIRATE > g_MAXPLAYERS || !is_user_alive(PIRATE) || !equal(noise, "weapons/knife_hitwall1.wav"))
return FMRES_IGNORED
new team = get_user_team(PIRATE), otherteam = 0, matchingOpponent = 0
// Make sure exactly one person on each team is alive.
for (new i = 1; i <= g_MAXPLAYERS; i++) {
if (!is_user_connected(i) || !is_user_alive(i) || PIRATE == i)
continue
if (get_user_team(i) == team) {
// No fun.
return FMRES_IGNORED
}
else {
if (++otherteam > 1) {
// No fun.
return FMRES_IGNORED
}
matchingOpponent = i
}
}
if (matchingOpponent == 0)
return FMRES_IGNORED
if (++g_challenges[PIRATE] >= KNIFESLASHES) {
Challenge(PIRATE, matchingOpponent)
if (is_user_bot(matchingOpponent)) {
new Float:val = float(DECIDESECONDS)
if (val < 2.0)
val = 2.0
remove_task(TASKID_BOTTHINK)
set_task(random_float(1.0, float(DECIDESECONDS) - 1.0), "BotDecides", TASKID_BOTTHINK)
}
g_challenges[PIRATE] = 0
}
else
set_task(1.0, "decreaseChallenges", PIRATE)
//client_print(PIRATE, print_chat, "Sus desafios: %d", g_challenges[PIRATE])
return FMRES_IGNORED
}
public decreaseChallenges(id) {
if (--g_challenges[id] < 0)
g_challenges[id] = 0
}
public BotDecides() {
if (!g_challenging)
return
if (random_num(0,9) > 0)
Accept()
else {
DeclineMsg()
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
}
Challenge(challenger, challenged) {
g_challenger = challenger
g_challenged = challenged
g_challenging = true
new challenger_name[32], challenged_name[32]
get_user_name(challenger, challenger_name, 31)
get_user_name(challenged, challenged_name, 31)
ColorChat(challenger, GREEN, "^3[OG]^1Has desafiado a ^4%s! ^1Espere la respuesta en: ^4[%d] ^31segundos...", challenged_name, DECIDESECONDS)
new menu[1024], keys = MENU_KEY_1 | MENU_KEY_2
format(menu, 1023, "%s te ha desafiado a un duelo a cuchillos!^n^nTienes %d segundos para responder!^n^n\y1\w. Dale gil!^n\y2\w. No gracias, te la doy sin faka!", challenger_name, DECIDESECONDS)
show_menu(challenged, keys, menu, DECIDESECONDS, "JGHG's automatic knife duel")
set_task(float(DECIDESECONDS), "timed_toolate", TASKID_CHALLENGING)
}
public timed_toolate() {
if (g_challenging) {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
ColorChat(0, GREEN, "^3[OG]^4%s ^1no respondio el duelo de ^4%s", challenged_name, challenger_name)
CancelAll()
}
}
public client_putinserver(id) {
set_task(25.0, "Announcement", id)
return PLUGIN_CONTINUE
}
public Announcement(id) {
ColorChat(id, GREEN, "^3[OG]^1Cuando solo quedes tu y un enemigo, golpea 3 veces el cuchillo en la pared para desafiarlo.")
}
public challenged_menu(id, key) {
switch (key) {
case MENUSELECT1: {
// Accept
Accept()
}
case MENUSELECT2: {
// Decline
DeclineMsg()
}
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
return PLUGIN_HANDLED
}
DeclineMsg() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
ColorChat(0, GREEN, "^3[OG]^4%s ^1rechazo el duelo de ^4%s", challenged_name, challenger_name)
}
Accept() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
set_user_health(g_challenger, 100);
set_user_health(g_challenged, 100);
ColorChat(0, GREEN, "^3[OG]^4%s ^1acepto el duelo de ^4%s", challenged_name, challenger_name)
g_knifeArena = true
give_item(g_challenger, "weapon_knife")
give_item(g_challenged, "weapon_knife")
engclient_cmd(g_challenger, "weapon_knife")
engclient_cmd(g_challenged, "weapon_knife")
client_cmd(0,"spk misc/OG/round_berserker")
}
public event_holdwpn(id) {
if (!g_knifeArena || !is_user_alive(id))
return PLUGIN_CONTINUE
new weaponType = read_data(2)
for (new i = 0; i < ALLOWED_WEAPONS; i++) {
if (weaponType == g_allowedWeapons[i])
return PLUGIN_CONTINUE
}
engclient_cmd(id, "weapon_knife")
return PLUGIN_CONTINUE
}
public event_roundend() {
if (g_challenging || g_knifeArena)
CancelAll()
g_noChallengingForAWhile = true
set_task(4.0, "NoChallengingForAWhileToFalse")
return PLUGIN_CONTINUE
}
public NoChallengingForAWhileToFalse() {
g_noChallengingForAWhile = false
}
CancelAll() {
if (g_challenging) {
g_challenging = false
// Close menu of challenged
if (is_user_connected(g_challenged)) {
new usermenu, userkeys
get_user_menu(g_challenged, usermenu, userkeys) // get user menu
// Hmm this ain't working :-/
if (usermenu == g_challengemenu) // Close it!
show_menu(g_challenged, 0, "blabla") // show empty menu
}
}
if (g_knifeArena) {
g_knifeArena = false
}
remove_task(TASKID_BOTTHINK)
remove_task(TASKID_CHALLENGING)
}
public event_death() {
if (g_challenging || g_knifeArena)
CancelAll()
return PLUGIN_CONTINUE
}
#if defined DEBUG
public challengefn(id, level, cid) {
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new challenger[64], challenged[64]
read_argv(1, challenger, 63)
read_argv(2, challenged, 63)
console_print(id, "Desafiador: %s, Desafiado: %s", challenger, challenged)
new r = str_to_num(challenger)
new d = str_to_num(challenged)
Challenge(r, d)
if (is_user_bot(d))
Accept()
return PLUGIN_HANDLED
}
#endif // defined DEBUG
stock chatcolor(id, const input[], any:...)
{
static szMsg[191], msgSayText;
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
vformat(szMsg, 190, input, 3);
replace_all(szMsg, 190, "!g", "^4");
replace_all(szMsg, 190, "!y", "^1");
replace_all(szMsg, 190, "!team", "^3");
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgSayText, .player = id);
write_byte(id ? id : 33);
write_string(szMsg);
message_end();
}
Код за потвърждение: Избери целия код
#define PLUGINNAME "Automatic knife duel"
#define VERSION "0.3"
#define AUTHOR "JGHG"
#include <amxmodx>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#define DEBUG
#if defined DEBUG
#include <amxmisc>
#endif // defined DEBUG
#define MENUSELECT1 0
#define MENUSELECT2 1
#define TASKID_CHALLENGING 2348923
#define TASKID_BOTTHINK 3242321
#define DECIDESECONDS 10
#define ALLOWED_WEAPONS 2
#define KNIFESLASHES 3 // the nr of slashes within a short amount of time until a challenge starts...
// Globals below
new g_allowedWeapons[ALLOWED_WEAPONS] = {CSW_KNIFE, CSW_C4}
new g_MAXPLAYERS
new bool:g_challenging = false
new bool:g_knifeArena = false
new bool:g_noChallengingForAWhile = false
new g_challengemenu
new g_challenger
new g_challenged
new g_challenges[33]
new Float:g_vKnifeOrigin[2][3];
new const g_szSpawnClassname[] = "info_player_deathmatch";
enum _:max_cvars {
CVAR_COUNT = 0,
CVAR_TIMER,
CVAR_MAXDISTANCE,
CVAR_ANNOUNCE,
CVAR_RESET
};
new g_Pcvar[max_cvars];
new g_iFwdSpawn;
new g_iMaxPlayers;
public plugin_modules()
{
require_module("fakemeta")
require_module("fun")
}
public plugin_precache()
{
g_iFwdSpawn = register_forward(FM_Spawn,"fwd_Spawn",1);
}
public fwd_Spawn(ent)
{
if(!pev_valid(ent))
return FMRES_IGNORED;
static szClassname[32];
pev(ent,pev_classname,szClassname,sizeof szClassname - 1);
if(equal(szClassname,g_szSpawnClassname))
{
if(vec_null(g_vKnifeOrigin[0]))
{
pev(ent,pev_origin,g_vKnifeOrigin[0]);
}
else if(!vec_null(g_vKnifeOrigin[0]) && vec_null(g_vKnifeOrigin[1]))
{
static Float:vTmp[3];
pev(ent,pev_origin,vTmp);
if((300.0 <= vector_distance(g_vKnifeOrigin[0],vTmp) < 600.0))
g_vKnifeOrigin[1] = vTmp;
}
}
return FMRES_IGNORED;
}
public forward_emitsound(const PIRATE, const Onceuponatimetherewasaverysmall, noise[], const Float:turtlewhoateabiggerturtleand, const Float:afterthatthesmallturtlegot, const veryveryverybig, const theend) {
if (g_noChallengingForAWhile || g_knifeArena || g_challenging || PIRATE < 1 || PIRATE > g_MAXPLAYERS || !is_user_alive(PIRATE) || !equal(noise, "weapons/knife_hitwall1.wav"))
return FMRES_IGNORED
new team = get_user_team(PIRATE), otherteam = 0, matchingOpponent = 0
// Make sure exactly one person on each team is alive.
for (new i = 1; i <= g_MAXPLAYERS; i++) {
if (!is_user_connected(i) || !is_user_alive(i) || PIRATE == i)
continue
if (get_user_team(i) == team) {
// No fun.
return FMRES_IGNORED
}
else {
if (++otherteam > 1) {
// No fun.
return FMRES_IGNORED
}
matchingOpponent = i
}
}
if (matchingOpponent == 0)
return FMRES_IGNORED
if (++g_challenges[PIRATE] >= KNIFESLASHES) {
Challenge(PIRATE, matchingOpponent)
if (is_user_bot(matchingOpponent)) {
new Float:val = float(DECIDESECONDS)
if (val < 2.0)
val = 2.0
remove_task(TASKID_BOTTHINK)
set_task(random_float(1.0, float(DECIDESECONDS) - 1.0), "BotDecides", TASKID_BOTTHINK)
}
g_challenges[PIRATE] = 0
}
else
set_task(1.0, "decreaseChallenges", PIRATE)
//client_print(PIRATE, print_chat, "Your challenges: %d", g_challenges[PIRATE])
return FMRES_IGNORED
}
public decreaseChallenges(id) {
if (--g_challenges[id] < 0)
g_challenges[id] = 0
}
public BotDecides() {
if (!g_challenging)
return
if (random_num(0,9) > 0)
Accept()
else {
DeclineMsg()
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
}
Challenge(challenger, challenged) {
g_challenger = challenger
g_challenged = challenged
g_challenging = true
new challenger_name[32], challenged_name[32]
get_user_name(challenger, challenger_name, 31)
get_user_name(challenged, challenged_name, 31)
client_print(challenger, print_chat, "", challenged_name, DECIDESECONDS)
new menu[1024], keys = MENU_KEY_1 | MENU_KEY_2
format(menu, 1023, "%s tarafindan bir bicak duellosuna davet edildiniz!^n^nNe Yapalim? Cevaplamak için %d saniyeniz var!^n^n\y1\w. EVET!^n\y2\w. HAYIR!", challenger_name, DECIDESECONDS)
show_menu(challenged, keys, menu, DECIDESECONDS, "JGHG's automatic knife duel")
set_task(float(DECIDESECONDS), "timed_toolate", TASKID_CHALLENGING)
}
public timed_toolate() {
if (g_challenging) {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s bicak duellosu meydan okumasina yeterince hızlı cevap vermedi...", challenged_name, challenger_name)
CancelAll()
}
}
public client_putinserver(id) {
set_task(25.0, "Announcement", id)
return PLUGIN_CONTINUE
}
public Announcement(id) {
client_print(id, print_chat, "[REALTR] 1VS1 kalinca duvara 3 kere vur..")
}
public challenged_menu(id, key) {
switch (key) {
case MENUSELECT1: {
// Accept
Accept()
}
case MENUSELECT2: {
// Decline
DeclineMsg()
}
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
return PLUGIN_HANDLED
}
DeclineMsg() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s bicak duellosu meydan okumasini geri ceviriyor...", challenged_name, challenger_name)
}
Accept() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s bicak duellosu meydan okumasini kabul etti", challenged_name, challenger_name)
g_knifeArena = true
strip_user_weapons(g_challenger)
strip_user_weapons(g_challenged)
give_item(g_challenger, "weapon_knife")
give_item(g_challenged, "weapon_knife")
engclient_cmd(g_challenger, "weapon_knife")
engclient_cmd(g_challenged, "weapon_knife")
engfunc(EngFunc_SetOrigin,g_challenged,g_vKnifeOrigin[0]);
engfunc(EngFunc_SetOrigin,g_challenger,g_vKnifeOrigin[1]);
fm_entity_set_aim(g_challenged,g_challenger,0);
fm_entity_set_aim(g_challenger,g_challenged,0);
if(get_pcvar_num(g_Pcvar[CVAR_RESET]))
{
set_pev(g_challenged,pev_health,100.0);
set_pev(g_challenger,pev_health,100.0);
}
}
public event_holdwpn(id) {
if (!g_knifeArena || !is_user_alive(id))
return PLUGIN_CONTINUE
new weaponType = read_data(2)
for (new i = 0; i < ALLOWED_WEAPONS; i++) {
if (weaponType == g_allowedWeapons[i])
return PLUGIN_CONTINUE
}
engclient_cmd(id, "weapon_knife")
return PLUGIN_CONTINUE
}
public event_roundend() {
if (g_challenging || g_knifeArena)
CancelAll()
g_noChallengingForAWhile = true
set_task(4.0, "NoChallengingForAWhileToFalse")
return PLUGIN_CONTINUE
}
public NoChallengingForAWhileToFalse() {
g_noChallengingForAWhile = false
}
CancelAll() {
if (g_challenging) {
g_challenging = false
// Close menu of challenged
if (is_user_connected(g_challenged)) {
new usermenu, userkeys
get_user_menu(g_challenged, usermenu, userkeys) // get user menu
// Hmm this ain't working :-/
if (usermenu == g_challengemenu) // Close it!
show_menu(g_challenged, 0, "blabla") // show empty menu
}
}
if (g_knifeArena) {
g_knifeArena = false
}
remove_task(TASKID_BOTTHINK)
remove_task(TASKID_CHALLENGING)
}
public event_death() {
if (g_challenging || g_knifeArena)
CancelAll()
return PLUGIN_CONTINUE
}
#if defined DEBUG
public challengefn(id, level, cid) {
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new challenger[64], challenged[64]
read_argv(1, challenger, 63)
read_argv(2, challenged, 63)
console_print(id, "challenger: %s, challenged: %s", challenger, challenged)
new r = str_to_num(challenger)
new d = str_to_num(challenged)
Challenge(r, d)
if (is_user_bot(d))
Accept()
return PLUGIN_HANDLED
}
#endif // defined DEBUG
public plugin_init() {
register_plugin(PLUGINNAME, VERSION, AUTHOR)
register_event("CurWeapon", "event_holdwpn", "be", "1=1")
register_forward(FM_EmitSound, "forward_emitsound")
g_MAXPLAYERS = get_maxplayers()
g_challengemenu = register_menuid("JGHG's automatic knife duel"/*"You are challenged"*/)
register_menucmd(g_challengemenu, MENU_KEY_1 | MENU_KEY_2, "challenged_menu")
register_event("DeathMsg", "event_death", "a")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_terwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_ctwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_rounddraw")
unregister_forward(FM_Spawn,g_iFwdSpawn,1);
g_Pcvar[CVAR_COUNT] = register_cvar("kd_knifecount","3");
g_Pcvar[CVAR_TIMER] = register_cvar("kd_preparetime","3");
g_Pcvar[CVAR_MAXDISTANCE] = register_cvar("kd_maxdistance","550");
g_Pcvar[CVAR_ANNOUNCE] = register_cvar("kd_announce","1");
g_Pcvar[CVAR_RESET] = register_cvar("kd_resethp","1");
g_iMaxPlayers = get_maxplayers();
#if defined DEBUG
register_clcmd("0challenge", "challengefn", ADMIN_CFG, "<challenger> <challenged> - start knife duel challenge")
#endif // defined DEBUG
new Float:maptime = get_cvar_float("mp_timelimit")
if (maptime == 0.0)
maptime = 15.0
new Float:anntime = 60.0 * 5.0 // 5 minutes
if (maptime < 5.0)
anntime = maptime / 3.0
set_task(anntime, "Announcement", 0, "", 0, "b")
}
stock fm_entity_set_aim(id,ent,bone = 0)
{
if(!is_user_connected(id) || !pev_valid(ent))
return 0;
new Float:vOrigin[3];
pev(ent,pev_origin,vOrigin);
new Float:vEntOrigin[3],Float:vAngles[3];
if(bone)
engfunc(EngFunc_GetBonePosition,id,bone,vEntOrigin,vAngles);
else
pev(id,pev_origin,vEntOrigin);
vOrigin[0] -= vEntOrigin[0];
vOrigin[1] -= vEntOrigin[1];
vOrigin[2] -= vEntOrigin[2];
new Float:v_length;
v_length = vector_length(vOrigin);
new Float:vAimVector[3];
vAimVector[0] = vOrigin[0] / v_length;
vAimVector[1] = vOrigin[1] / v_length;
vAimVector[2] = vOrigin[2] / v_length;
new Float:vNewAngles[3];
vector_to_angle(vAimVector,vNewAngles);
vNewAngles[0] *= -1;
if(vNewAngles[1] > 180.0) vNewAngles[1] -= 360;
if(vNewAngles[1] < -180.0) vNewAngles[1] += 360;
if(vNewAngles[1] == 180.0 || vNewAngles[1] == -180.0) vNewAngles[1] = -179.9;
set_pev(id,pev_angles,vNewAngles);
set_pev(id,pev_fixangle,1);
return 1;
}
stock vec_null(Float:vec[3])
{
if(!vec[0] && !vec[1] && !vec[2])
return 1;
return 0;
}
stock bool:check_players()
{
new iNum[2];
for(new i = 1 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;
if(get_user_team(i) == 1)
++iNum[0];
else if(get_user_team(i) == 2)
++iNum[1];
}
if((iNum[0] == 1) && (iNum[1] == 1))
return true;
return false;
}
stock get_opponent(team)
{
for(new i = 0 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;
if(get_user_team(i) == team)
return i;
}
return 0;
}
stock fm_get_speed_vector2(ent1,ent2,Float:speed,Float:new_velocity[3])
{
if(!pev_valid(ent1) || !pev_valid(ent2))
return 0;
static Float:vOrigin1[3];
pev(ent1,pev_origin,vOrigin1);
static Float:vOrigin2[3];
pev(ent2,pev_origin,vOrigin2);
new_velocity[0] = vOrigin2[0] - vOrigin1[0];
new_velocity[1] = vOrigin2[1] - vOrigin1[1];
new_velocity[2] = vOrigin2[2] - vOrigin1[2];
new Float:fNum = floatsqroot(speed * speed / (new_velocity[0] * new_velocity[0] + new_velocity[1] * new_velocity[1] + new_velocity[2] * new_velocity[2]));
new_velocity[0] *= fNum;
new_velocity[1] *= fNum;
new_velocity[2] *= fNum;
return 1;
}
stock Float:fm_get_entity_distance(ent1,ent2)
{
if(!pev_valid(ent1) || !pev_valid(ent2))
return 0.0;
static Float:vOrigin1[3];
pev(ent1,pev_origin,vOrigin1);
static Float:vOrigin2[3];
pev(ent2,pev_origin,vOrigin2);
return vector_distance(vOrigin1,vOrigin2);
}