L 10/19/2018 - 16:14:15: Invalid player id 31
L 10/19/2018 - 16:14:15: [AMXX] Displaying debug trace (plugin "crxn_knife_abili
ties.amxx")
L 10/19/2018 - 16:14:15: [AMXX] Run time error 10: native error (native "get_use
r_weapon")
L 10/19/2018 - 16:14:15: [AMXX] [0] crxn_knife_abilities.sma::fwdTakeDamage (
line 635)
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <amxmisc>
#include <formatin>
#include <fun>
#include <hamsandwich>
#include <fakemeta_util>
#define HOOOK
#define TELEPOORT
#define HPREGEEN
#define THUNDEER
#define FREEZEER
#define JUUMPS
#if defined JUUMPS
#include <reapi>
#endif
#if defined HOOOK
#include <engine>
#endif
#if defined FREEZEER
#define is_user_frozen(%1) g_bFrozen[%1]
#endif
#define PLUGIN_VERSION "2.2"
#define DEFAULT_V "models/v_knife.mdl"
#define DEFAULT_P "models/p_knife.mdl"
#define is_true_player(%1) (1 <= %1 <= 32)
enum
{
SOUND_NONE = 0,
SOUND_DEPLOY,
SOUND_HIT,
SOUND_HITWALL,
SOUND_SLASH,
SOUND_STAB
}
enum _:Knives
{
NAME[128],
NAME2[128],
INFO[128],
INFO2[128],
V_MODEL[128],
P_MODEL[128],
DEPLOY_SOUND[128],
HIT_SOUND[128],
HITWALL_SOUND[128],
SLASH_SOUND[128],
STAB_SOUND[128],
Float: GRAVITY,
Float: SPEED,
Float: DAMAGE,
NOFOOTSTEPS,
TRANSPARENCY,
#if defined HPREGEEN
HPREGEN,
#endif
#if defined TELEPOORT
TELEPORT,
#endif
#if defined HOOOK
HOOK,
#endif
#if defined THUNDEER
THUNDER,
#endif
#if defined JUUMPS
JUMPS,
#endif
#if defined FREEZEER
FREEZE,
#endif
FLAG,
bool:HAS_CUSTOM_SOUND
}
new Array:g_aKnives,
bool:g_bFirstTime[33],
g_eKnife[33][Knives],
g_iKnife[33],
g_pAtSpawn,
g_pDebug,
g_pResetSpawn,
g_pOpenStyle,
bool:g_bOpenStatus[33],
g_iKnivesNum,
#if defined TELEPOORT
g_iCanTeleport[33],
Float:g_fLastUsedTele[33],
#endif
#if defined HOOOK
g_iCanHook[33],
g_iIsHooked[32] = false,
g_iHookCounter[33],
g_iHookOrigin[32][3],
g_HookSprite,
#endif
#if defined THUNDEER
g_iCanThunder[33],
g_iThunderCounter[33],
g_pThunderDamage,
g_pThunderFrags,
g_ThunderSprite,
#endif
#if defined JUUMPS
g_iCanJumps[33],
iJumps[33],
#endif
#if defined FREEZEER
g_iCanFreeze[33],
Float:g_fLastUsedFreezer[33],
bool: g_bFrozen[33],
Float:g_iAngles[33][3],
g_FreezerSprite,
g_FreezerSpriteBeam,
g_pFDuration,
g_iFreezerCounter[33],
#endif
g_iSayText;
#if defined TELEPOORT
#define TELEPORT_INTERVAL 120.0
#endif
#define FREEZER_INTERVAL 20.0
public plugin_init()
{
register_plugin("Knife Abilities", PLUGIN_VERSION, "OciXCrom_Nikolow")
register_cvar("CRXNKnifeAbilities", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
if(!g_iKnivesNum)
set_fail_state("No knives found in the configuration file.")
register_dictionary("KnifeAbilities.txt")
//register_event("CurWeapon", "OnSelectKnife", "be", "1=1", "2=29")
register_event("CurWeapon", "Knifeabilities", "be", "1=1")
RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamage", 0)
#if defined JUUMPS
RegisterHookChain(RG_CBasePlayer_Jump, "Fw_PlayerJump_Pre", 0)
#endif
#if defined HPREGEEN
register_event("Damage", "SetRegeneration", "be", "2>0");
#endif
RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
register_forward(FM_EmitSound, "OnEmitSound")
#if defined TELEPOORT
register_clcmd("teleporter", "tele_knife")
#endif
#if defined HOOOK
register_clcmd("+hook","hook_on")
register_clcmd("-hook","hook_off")
#endif
#if defined THUNDEER
register_clcmd( "+thor", "commandThunderOn" );
register_clcmd( "-thor", "commandThunderOff" );
#endif
register_event("HLTV", "OnNewRound", "a", "1=0", "2=0")
register_clcmd("say /knife", "ShowMenu")
register_clcmd("say_team /knife", "ShowMenu")
g_pAtSpawn = register_cvar("km_open_at_1st_spawn", "1")
g_pDebug = register_cvar("km_debug_damage", "0")
g_pResetSpawn = register_cvar("km_reset_at_spawn", "0")
g_pOpenStyle = register_cvar("km_only_open_style", "0") // 0 - Can be opened no meter what | 1 - Once per spawn | 2 - Once per round
#if defined THUNDEER
g_pThunderDamage = register_cvar("km_thunder_damage", "15")
g_pThunderFrags = register_cvar("km_thunder_frags", "1")
#endif
#if defined FREEZEER
g_pFDuration = register_cvar("km_freezer_freeze_duration", "3.0")
register_clcmd( "freezer", "freeze_knife" );
register_event( "DeathMsg" , "eventDeathMsg" , "a" );
#endif
g_iSayText = get_user_msgid("SayText")
}
public plugin_precache()
{
g_aKnives = ArrayCreate(Knives)
ReadFile()
#if defined HOOOK
g_HookSprite = precache_model("sprites/laserbeam.spr")
#endif
#if defined THUNDEER
g_ThunderSprite = precache_model("sprites/lgtning.spr")
#endif
#if defined FREEZEER
g_FreezerSprite = precache_model("sprites/freezer_exp.spr")
g_FreezerSpriteBeam = precache_model("sprites/lgtning.spr")
#endif
}
public plugin_end()
ArrayDestroy(g_aKnives)
ReadFile()
{
new szConfigsName[256], szFilename[256]
get_configsdir(szConfigsName, charsmax(szConfigsName))
formatex(szFilename, charsmax(szFilename), "%s/KnifeAbilities.ini", szConfigsName)
new iFilePointer = fopen(szFilename, "rt")
if(iFilePointer)
{
new szData[160], szKey[32], szValue[128]
new eKnife[Knives]
while(!feof(iFilePointer))
{
fgets(iFilePointer, szData, charsmax(szData))
trim(szData)
switch(szData[0])
{
case EOS, ';': continue
case '[':
{
if(szData[strlen(szData) - 1] == ']')
{
if(g_iKnivesNum)
PushKnife(eKnife)
g_iKnivesNum++
replace(szData, charsmax(szData), "[", "")
replace(szData, charsmax(szData), "]", "")
copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
}
else continue
}
default:
{
strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
trim(szKey); trim(szValue)
if(equal(szKey, "FLAG"))
eKnife[FLAG] = read_flags(szValue)
else if(equal(szKey, "V_MODEL"))
{
copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
precache_model(szValue)
}
else if(equal(szKey, "P_MODEL"))
{
copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
precache_model(szValue)
}
else if(equal(szKey, "DEPLOY_SOUND"))
{
eKnife[HAS_CUSTOM_SOUND] = true
copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "HIT_SOUND"))
{
eKnife[HAS_CUSTOM_SOUND] = true
copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "HITWALL_SOUND"))
{
eKnife[HAS_CUSTOM_SOUND] = true
copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "SLASH_SOUND"))
{
eKnife[HAS_CUSTOM_SOUND] = true
copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "STAB_SOUND"))
{
eKnife[HAS_CUSTOM_SOUND] = true
copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
precache_sound(szValue)
}
else if(equal(szKey, "GRAVITY"))
{
eKnife[GRAVITY] = _: str_to_float(szValue);
}
else if(equal(szKey, "SPEED"))
{
eKnife[SPEED] = _: str_to_float(szValue);
}
else if(equal(szKey, "DAMAGE"))
{
eKnife[DAMAGE] = _: str_to_float(szValue);
}
else if(equal(szKey, "NOFOOTSTEPS"))
{
eKnife[NOFOOTSTEPS] = _: str_to_num(szValue);
}
else if(equal(szKey, "TRANSPARENCY"))
{
eKnife[TRANSPARENCY] = _: str_to_num(szValue);
}
#if defined HPREGEEN
else if(equal(szKey, "HPREGEN"))
{
eKnife[HPREGEN] = _: str_to_num(szValue);
}
#endif
#if defined TELEPOORT
else if(equal(szKey, "CAN_USE_TELEPORT"))
{
eKnife[TELEPORT] = _: str_to_num(szValue);
}
#endif
#if defined HOOOK
else if(equal(szKey, "CAN_USE_HOOK"))
{
eKnife[HOOK] = _: str_to_num(szValue);
}
#endif
#if defined THUNDEER
else if(equal(szKey, "CAN_USE_THUNDER"))
{
eKnife[THUNDER] = _: str_to_num(szValue);
}
#endif
#if defined JUUMPS
else if(equal(szKey, "EXTRA_JUMPS"))
{
eKnife[JUMPS] = _: str_to_num(szValue);
}
#endif
#if defined FREEZEER
else if(equal(szKey, "CAN_USE_FREEZE"))
{
eKnife[FREEZE] = _: str_to_num(szValue);
}
#endif
else if(equal(szKey, "NAME"))
{
copy(eKnife[NAME2], charsmax(eKnife[NAME2]), szValue)
}
else if(equal(szKey, "INFO"))
{
copy(eKnife[INFO], charsmax(eKnife[INFO]), szValue)
}
else if(equal(szKey, "INFO2"))
{
copy(eKnife[INFO2], charsmax(eKnife[INFO2]), szValue)
}
}
}
}
if(g_iKnivesNum)
PushKnife(eKnife)
fclose(iFilePointer)
}
}
public client_putinserver(id)
{
g_bFirstTime[id] = true
g_bOpenStatus[id] = false;
ArrayGetArray(g_aKnives, 0, g_eKnife[id])
g_iKnife[id] = 0
#if defined TELEPOORT
g_iCanTeleport[id] = 0
#endif
#if defined HOOOK
g_iCanHook[id] = 0;
#endif
#if defined THUNDEER
g_iCanThunder[id] = 0;
#endif
#if defined JUUMPS
g_iCanJumps[id] = 0;
#endif
#if defined FREEZEER
g_iCanFreeze[id] = 0;
#endif
}
public OnEmitSound(id, iChannel, const szSample[])
{
if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
return FMRES_IGNORED
switch(detect_knife_sound(szSample))
{
case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
}
return FMRES_IGNORED
}
public ShowMenu(id)
{
if(g_bOpenStatus[id])
{
ColorChat(id, "%L", id, "KM_CHAT_CANT")
return PLUGIN_HANDLED;
}
new szTitle[128]
formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
new iMenu = menu_create(szTitle, "MenuHandler")
for(new eKnife[Knives], szItem[64], iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
{
ArrayGetArray(g_aKnives, i, eKnife)
if(eKnife[FLAG] == ADMIN_ALL || iFlags & eKnife[FLAG])
{
if(g_iKnife[id] == i)
{
formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_SELECTED")
menu_additem(iMenu, szItem, eKnife[NAME])
}
else
menu_additem(iMenu, eKnife[NAME], eKnife[NAME])
}
else
{
formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_VIP_ONLY")
menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG])
}
}
if(menu_pages(iMenu) > 1)
menu_setprop(iMenu, MPROP_TITLE, formatin("%s%L", szTitle, id, "KM_MENU_TITLE_PAGE"))
menu_display(id, iMenu)
return PLUGIN_HANDLED
}
public MenuHandler(id, iMenu, iItem)
{
if(iItem != MENU_EXIT)
{
if(g_iKnife[id] == iItem)
{
ColorChat(id, "%L", id, "KM_CHAT_ALREADY")
if(get_pcvar_num(g_pOpenStyle) > 0)
g_bOpenStatus[id] = true;
else
ShowMenu(id) // reopen the menu ?
}
else
{
new eKnife[Knives]
ArrayGetArray(g_aKnives, iItem, eKnife)
g_iKnife[id] = iItem
ArrayGetArray(g_aKnives, iItem, g_eKnife[id])
if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
Knifeabilities(id) //OnSelectKnife(id)
ham_strip_weapon(id, "weapon_knife"); // strip knife
give_item(id, "weapon_knife") // give knife
engclient_cmd(id, "weapon_knife") // switch to knife
//new szName[32], iUnused
//menu_item_getinfo(iMenu, iItem, iUnused, szName, charsmax(szName), .callback = iUnused)
ColorChat(id, "%L", id, "KM_CHAT_SELECTED", eKnife[NAME2])
ColorChat(id, "%L", id, "KM_CHAT_INFO", eKnife[INFO])
ColorChat(id, "%s", eKnife[INFO2])
if(get_pcvar_num(g_pOpenStyle) > 0)
g_bOpenStatus[id] = true;
else
ShowMenu(id) // reopen the menu ?
}
}
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
public OnPlayerSpawn(id)
{
if(is_user_alive(id))
{
if(get_pcvar_num(g_pAtSpawn) && !g_iKnife[id] && g_bFirstTime[id])
// ако квара е 1 + няма нож + влиза за първи път
{
// изкарваме менюто + казваме че първия му спаун е минал
g_bFirstTime[id] = false
ShowMenu(id)
}
if(get_pcvar_num(g_pResetSpawn)) // ако квара е 1
{
if(!g_bFirstTime[id]) // не му е първия спаун
{
// рескаме му ножа и му изкарваме меню-то на ново
ArrayGetArray(g_aKnives, 0, g_eKnife[id])
g_iKnife[id] = 0
ShowMenu(id)
}
}
if(get_pcvar_num(g_pOpenStyle) == 1) g_bOpenStatus[id] = false;
#if defined HOOOK
g_iHookCounter[id] = 0;
#endif
#if defined THUNDEER
g_iThunderCounter[id] = 0;
#endif
#if defined FREEZEER
if(is_user_frozen(id)) UnFreeze( id ); // махаме фрийза ако има такъв
g_iFreezerCounter[id] = 0;
#endif
}
}
public OnNewRound()
{
if(get_pcvar_num(g_pOpenStyle) == 2)
{
new players[32], num
get_players(players, num)
new player
for(new i = 0; i < num; i++)
{
player = players[i]
g_bOpenStatus[player] = false;
}
}
}
/*
public OnSelectKnife(id)
{
set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}*/
public Knifeabilities(id)
{
new weapon = read_data(2)
set_user_gravity(id, weapon == CSW_KNIFE ? g_eKnife[id][GRAVITY] : 1.0)
set_user_maxspeed(id, weapon == CSW_KNIFE? g_eKnife[id][SPEED] : 250.0)
set_user_footsteps(id, weapon == CSW_KNIFE? g_eKnife[id][NOFOOTSTEPS] : 0) // 1 - no footsteps, 0 - normal footsteps
set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, weapon == CSW_KNIFE? g_eKnife[id][TRANSPARENCY] : 255) // 255 - normal
#if defined TELEPOORT
g_iCanTeleport[id] = g_eKnife[id][TELEPORT];
#endif
#if defined HOOOK
g_iCanHook[id] = g_eKnife[id][HOOK];
#endif
#if defined THUNDEER
g_iCanThunder[id] = g_eKnife[id][THUNDER];
#endif
#if defined JUUMPS
g_iCanJumps[id] = g_eKnife[id][JUMPS];
#endif
#if defined FREEZEER
g_iCanFreeze[id] = g_eKnife[id][FREEZE];
#endif
if(weapon == CSW_KNIFE)
{
set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}
return PLUGIN_CONTINUE;
}
public fwdTakeDamage(victim, inflictor, attacker, Float:damage, damage_bits)
{
if(is_true_player(attacker) && get_user_weapon(attacker) == CSW_KNIFE && victim != attacker)
{
if(get_pcvar_num(g_pDebug)) client_print(attacker, print_center, "Knife Damage: %f", damage * g_eKnife[attacker][DAMAGE]);
SetHamParamFloat(4, damage * g_eKnife[attacker][DAMAGE])
}
}
#if defined HPREGEEN
public SetRegeneration(id)
{
if (!is_user_connected(id) || !is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
return;
new Health = get_user_health(id);
if (Health < 1)
return;
if (get_user_health(id) < 100)
set_task(3.0, "Regenerate", id, _, _, "b");
}
public Regenerate(id)
{
if (!is_user_connected(id) || !is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
return;
new Health = get_user_health(id);
if (Health < 1)
return;
new NeededHealth = 100 - Health;
if (NeededHealth <= g_eKnife[id][HPREGEN])
{
set_user_health(id, get_user_health(id) + NeededHealth)
remove_task(id);
return;
}
set_user_health(id, get_user_health(id) + g_eKnife[id][HPREGEN]);
}
#endif
PushKnife(eKnife[Knives])
{
if(!eKnife[V_MODEL][0])
copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), DEFAULT_V)
if(!eKnife[P_MODEL][0])
copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), DEFAULT_P)
ArrayPushArray(g_aKnives, eKnife)
}
bool:is_knife_sound(const szSample[])
return bool:equal(szSample[8], "kni", 3)
detect_knife_sound(const szSample[])
{
static iSound
iSound = SOUND_NONE
if(equal(szSample, "weapons/knife_deploy1.wav"))
iSound = SOUND_DEPLOY
else if(equal(szSample[14], "hit", 3))
iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
else if(equal(szSample[14], "sla", 3))
iSound = SOUND_SLASH
else if(equal(szSample[14], "sta", 3))
iSound = SOUND_STAB
return iSound
}
play_knife_sound(id, const szSound[])
engfunc(EngFunc_EmitSound, id, CHAN_WEAPON, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
ColorChat(const id, const szInput[], any:...)
{
new iPlayers[32], iCount = 1
static szMessage[191]
vformat(szMessage, charsmax(szMessage), szInput, 3)
format(szMessage[0], charsmax(szMessage), "%L %s", id ? id : LANG_PLAYER, "KM_CHAT_PREFIX", szMessage)
replace_all(szMessage, charsmax(szMessage), "!g", "^4")
replace_all(szMessage, charsmax(szMessage), "!n", "^1")
replace_all(szMessage, charsmax(szMessage), "!t", "^3")
if(id)
iPlayers[0] = id
else
get_players(iPlayers, iCount, "ch")
for(new i; i < iCount; i++)
{
if(is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMessage)
message_end()
}
}
}
stock ham_strip_weapon(id,weapon[])
{
if(!equal(weapon,"weapon_",7)) return 0;
new wId = get_weaponid(weapon);
if(!wId) return 0;
new wEnt;
while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
if(!wEnt) return 0;
if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);
if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0;
ExecuteHamB(Ham_Item_Kill,wEnt);
set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId));
return 1;
}
// TELEPORT
#if defined TELEPOORT
public tele_knife(id)
{
if(!is_user_alive(id) && !is_user_connected(id))
return PLUGIN_HANDLED;
if(g_iCanTeleport[id] > 0 && get_user_weapon(id) == CSW_KNIFE)
{
static Float:fTime;
fTime = get_gametime();
if(g_fLastUsedTele[id] > 0.0 && (fTime - g_fLastUsedTele[id]) < TELEPORT_INTERVAL)
{
ColorChat(id, "%L", id, "KM_CHAT_TP_INTERVAL", TELEPORT_INTERVAL - (fTime - g_fLastUsedTele[id]))
return PLUGIN_HANDLED;
}
static Float:start[3], Float:dest[3]
pev(id, pev_origin, start)
pev(id, pev_view_ofs, dest)
xs_vec_add(start, dest, start)
pev(id, pev_v_angle, dest)
engfunc(EngFunc_MakeVectors, dest)
global_get(glb_v_forward, dest)
xs_vec_mul_scalar(dest, 9999.0, dest)
xs_vec_add(start, dest, dest)
engfunc(EngFunc_TraceLine, start, dest, IGNORE_MONSTERS, id, 0)
get_tr2(0, TR_vecEndPos, start)
get_tr2(0, TR_vecPlaneNormal, dest)
static const player_hull[] = {HULL_HUMAN, HULL_HEAD}
engfunc(EngFunc_TraceHull, start, start, DONT_IGNORE_MONSTERS, player_hull[_:!!(pev(id, pev_flags) & FL_DUCKING)], id, 0)
if(!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen))
{
engfunc(EngFunc_SetOrigin, id, start)
return PLUGIN_HANDLED
}
static Float:size[3]
pev(id, pev_size, size)
xs_vec_mul_scalar(dest, (size[0] + size[1]) / 2.0, dest)
xs_vec_add(start, dest, dest)
engfunc(EngFunc_SetOrigin, id, dest)
g_fLastUsedTele[id] = fTime;
}
else ColorChat(id, "%L", id, "KM_CHAT_CANT_TP")
return PLUGIN_HANDLED;
}
#endif
// HOOK
#if defined HOOOK
public hook_on(id)
{
if(!is_user_alive(id))
return PLUGIN_HANDLED;
if(g_iCanHook[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
return PLUGIN_HANDLED
if(g_iHookCounter[id] < g_iCanHook[id] && get_user_weapon( id ) == CSW_KNIFE)
{
get_user_origin(id, g_iHookOrigin[id],3)
g_iIsHooked[id] = true
++g_iHookCounter[id]
emit_sound(id,CHAN_STATIC,"hook/hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)
}
else
{
ColorChat(id, "%L", id, "KM_CHAT_HOOK_LIMIT" ,g_iCanHook[id])
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
public is_hooked(id)
return g_iIsHooked[id]
public hook_off(id)
{
remove_hook(id)
return PLUGIN_HANDLED
}
public hook_task(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
remove_hook(id)
remove_beam(id)
draw_hook(id)
new origin[3], Float:velocity[3]
get_user_origin(id,origin)
new distance = get_distance(g_iHookOrigin[id],origin)
if(distance > 25)
{
velocity[0] = (g_iHookOrigin[id][0] - origin[0]) * (2.0 * 300 / distance)
velocity[1] = (g_iHookOrigin[id][1] - origin[1]) * (2.0 * 300 / distance)
velocity[2] = (g_iHookOrigin[id][2] - origin[2]) * (2.0 * 300 / distance)
entity_set_vector(id,EV_VEC_velocity,velocity)
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
remove_hook(id)
}
}
public draw_hook(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(1) // TE_BEAMENTPOINT
write_short(id) // entid
write_coord(g_iHookOrigin[id][0]) // origin
write_coord(g_iHookOrigin[id][1]) // origin
write_coord(g_iHookOrigin[id][2]) // origin
write_short(g_HookSprite) // sprite index
write_byte(0) // start frame
write_byte(0) // framerate
write_byte(100) // life
write_byte(10) // width
write_byte(0) // noise
// colors R G B
write_byte(random_num(0, 255))
write_byte(random_num(0, 255))
write_byte(random_num(0, 255))
write_byte(250) // brightness
write_byte(1) // speed
message_end()
}
public remove_hook(id)
{
if(task_exists(id))
remove_task(id)
remove_beam(id)
g_iIsHooked[id] = false
}
public remove_beam(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(99)
write_short(id)
message_end()
}
#endif
#if defined THUNDEER
public commandThunderOn( id )
{
if( !is_user_alive( id ) )
return PLUGIN_HANDLED;
if(g_iCanThunder[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
return PLUGIN_HANDLED
if( g_iThunderCounter[id] < g_iCanThunder[id] && get_user_weapon( id ) == CSW_KNIFE )
{
new target, body;
get_user_aiming( id, target, body );
if( is_valid_ent( target ) && is_user_alive( target ) )
{
if( get_user_team( id ) == get_user_team( target ) )
return PLUGIN_HANDLED;
++g_iThunderCounter[id]
new iPlayerOrigin[ 3 ], iEndOrigin[ 3 ];
get_user_origin( id, iPlayerOrigin );
get_user_origin( target, iEndOrigin );
show_beam( iPlayerOrigin, iEndOrigin );
ExecuteHam( Ham_TakeDamage, target, 0, id, float( get_pcvar_num( g_pThunderDamage ) ), DMG_ENERGYBEAM );
entity_set_float( id, EV_FL_frags, get_user_frags( id ) + float( get_pcvar_num( g_pThunderFrags ) ) );
}
}
else
{
ColorChat(id, "%L", id, "KM_CHAT_THUNDER_LIMIT" ,g_iCanThunder[id])
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED;
}
public commandThunderOff( id )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_KILLBEAM );
write_short( id );
message_end();
return PLUGIN_HANDLED;
}
stock show_beam( StartOrigin[ 3 ], EndOrigin[ 3 ] )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_BEAMPOINTS );
write_coord( StartOrigin[ 0 ] );
write_coord( StartOrigin[ 1 ] );
write_coord( StartOrigin[ 2 ] );
write_coord( EndOrigin[ 0 ] );
write_coord( EndOrigin[ 1 ] );
write_coord( EndOrigin[ 2 ] );
write_short( g_ThunderSprite );
write_byte( 1 );
write_byte( 1 );
write_byte( 3 );
write_byte( 33);
write_byte( 0 );
write_byte( 255 );
write_byte( 255 );
write_byte( 255 );
write_byte( 200 );
write_byte( 0 );
message_end();
}
#endif
#if defined JUUMPS
public Fw_PlayerJump_Pre(id)
{
if (!is_user_alive(id))
return HC_SUPERCEDE
new iFlags = get_entvar(id, var_flags)
if (iFlags & FL_WATERJUMP || get_entvar(id, var_waterlevel) >= 2 || !(get_member(id, m_afButtonPressed) & IN_JUMP))
return HC_CONTINUE
if (iFlags & FL_ONGROUND)
{
iJumps[id] = 0
return HC_CONTINUE
}
if (g_iCanJumps[id] > 0)
{
if (++iJumps[id] <= g_iCanJumps[id])
{
new Float:fVelocity[3]
get_entvar(id, var_velocity, fVelocity)
fVelocity[2] = 268.328157
set_entvar(id, var_velocity, fVelocity)
return HC_SUPERCEDE
}
}
return HC_CONTINUE
}
#endif
#if defined FREEZEER
public freeze_knife(id)
{
if(!is_user_alive(id))
return PLUGIN_HANDLED;
if(g_iCanFreeze[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
return PLUGIN_HANDLED
if(g_iFreezerCounter[id] < g_iCanFreeze[id] && get_user_weapon(id) == CSW_KNIFE)
{
static Float:fTime;
fTime = get_gametime();
if(g_fLastUsedFreezer[id] > 0.0 && (fTime - g_fLastUsedFreezer[id]) < FREEZER_INTERVAL)
{
ColorChat(id, "%L", id, "KM_CHAT_FREEZE_INTERVAL", FREEZER_INTERVAL - (fTime - g_fLastUsedFreezer[id]))
return PLUGIN_HANDLED;
}
cmd_freez(id)
++g_iFreezerCounter[id]
g_fLastUsedFreezer[id] = fTime;
}
else
{
ColorChat(id, "%L", id, "KM_CHAT_FREEZE_LIMIT" ,g_iCanFreeze[id])
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED;
}
cmd_freez(id)
{
new target, body
static Float:start[3]
static Float:aim[3]
pev(id, pev_origin, start)
fm_get_aim_origin(id, aim)
start[2] += 16.0; // raise
aim[2] += 16.0; // raise
get_user_aiming ( id, target, body, 1000 ) // 1000 - distance
if( is_user_alive( target ))
{
new iOrigin[ 3 ];
get_user_origin( target, iOrigin, 0 );
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( 15 );
write_coord( iOrigin[ 0 ] ); // start position (X)
write_coord( iOrigin[ 1 ] ); // start position (Y)
write_coord( iOrigin[ 2 ] + 40 ); // start position (Z)
write_coord( iOrigin[ 0 ] ); // end position (X)
write_coord( iOrigin[ 1 ] ); // end position (Y)
write_coord( iOrigin[ 2 ] ); // end position (Z)
write_short( g_FreezerSprite ); // sprite index
write_byte( 50 ); // count
write_byte( 20 ); // life in 0.1's
write_byte( 2 ); // scale in 0.1's
write_byte( 50 ); // velocity along vector in 10's
write_byte( 10 ); // randomness of velocity in 10's
message_end( );
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, aim[0])
engfunc(EngFunc_WriteCoord, aim[1])
engfunc(EngFunc_WriteCoord, aim[2])
write_short(g_FreezerSpriteBeam)
write_byte(10)
write_byte(30)
write_byte(4)
message_end()
Freeze(target)
set_task( get_pcvar_float( g_pFDuration ), "UnFreeze", target )
}
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(0)
engfunc(EngFunc_WriteCoord,start[0]);
engfunc(EngFunc_WriteCoord,start[1]);
engfunc(EngFunc_WriteCoord,start[2]);
engfunc(EngFunc_WriteCoord,aim[0]);
engfunc(EngFunc_WriteCoord,aim[1]);
engfunc(EngFunc_WriteCoord,aim[2]);
write_short(g_FreezerSpriteBeam); // sprite index
write_byte(0); // start frame
write_byte(10); // frame rate in 0.1's
write_byte(10); // life in 0.1's
write_byte(100); // line width in 0.1's
write_byte(4); // noise amplititude in 0.01's
write_byte(100); // red
write_byte(149); // green
write_byte(237); // blue
write_byte(100); // brightness
write_byte(50); // scroll speed in 0.1's
message_end();
}
stock Freeze(id)
{
new iFlags = pev( id , pev_flags );
if( ~iFlags & FL_FROZEN )
{
set_pev( id , pev_flags , iFlags | FL_FROZEN );
pev( id , pev_v_angle , g_iAngles[ id ] );
set_user_rendering( id , kRenderFxGlowShell , 0 , 100 , 200 , kRenderNormal , 16 );
}
g_bFrozen[ id ] = true;
}
public UnFreeze(id)
{
new frozenCount = 0;
g_bFrozen[ id ] = false;
new iFlags = pev( id , pev_flags ) ;
if( iFlags & FL_FROZEN )
{
set_pev( id , pev_flags , iFlags & ~FL_FROZEN ) ;
set_user_rendering( id , kRenderFxNone , 0 , 0 , 0 , kRenderNormal , 0 );
new iPlayers[ 32 ] , iNum , i , tid;
get_players( iPlayers , iNum , "a" );
for( i = 0; i < iNum; i++ )
{
tid = iPlayers[ i ];
if( is_user_frozen( tid ) )
{
frozenCount++;
}
}
}
}
public eventDeathMsg() if(is_user_frozen(read_data(2))) UnFreeze(read_data(2));
#endif