52 changes: 22 additions & 30 deletions scripting/ttt_item_jihad.sma
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include <amx_settings_api>

new cvar_jihad_radius, cvar_jihad_damage, cvar_jihad_timer, cvar_price_jihad, g_iItemBought;
new g_szSounds[2][TTT_MAXFILELENGHT];
new g_szSounds[2][TTT_FILELENGHT];
new g_iTimerJihad[33], g_iHasJihad[33], g_iDidDieJihad[33], Float:g_fSoundPlaying[33], g_iItem_Jihad, g_iItem_Backpack[33], g_iItem_Backpack2[33];

public plugin_precache()
Expand Down Expand Up @@ -36,19 +36,20 @@ public plugin_init()
cvar_jihad_timer = my_register_cvar("ttt_jihad_timer", "3");
cvar_price_jihad = my_register_cvar("ttt_price_jihad", "2");

RegisterHam(Ham_Killed, "player", "Ham_Killed_pre", 0, true);
RegisterHamPlayer(Ham_Killed, "Ham_Killed_pre", 0);

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID3");
g_iItem_Jihad = ttt_buymenu_add(name, get_pcvar_num(cvar_price_jihad), TRAITOR);
g_iItem_Jihad = ttt_buymenu_add(name, get_pcvar_num(cvar_price_jihad), PC_TRAITOR);
ttt_item_exception(g_iItem_Jihad);
}

public ttt_gamemode(gamemode)
{
if(!g_iItemBought)
return;

if(gamemode == PREPARING || gamemode == RESTARTING)
if(gamemode == GAME_PREPARING || gamemode == GAME_RESTARTING)
{
new num, id;
static players[32];
Expand Down Expand Up @@ -77,7 +78,7 @@ public ttt_item_selected(id, item, name[], price)
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM2", name, id, "TTT_ITEM_BACKPACK", name);
g_iItem_Backpack[id] = ttt_backpack_add(id, name);

static out[TTT_ITEMNAME];
static out[TTT_ITEMLENGHT];
formatex(out, charsmax(out), "%L Call", id, "TTT_ITEM_ID3");
g_iItem_Backpack2[id] = ttt_backpack_add(id, out);

Expand Down Expand Up @@ -116,19 +117,15 @@ public ttt_item_backpack(id, item)

public Ham_Killed_pre(victim, killer, shouldgib)
{
if(!is_user_connected(victim) || !is_user_connected(killer))
if(!is_user_connected(killer))
return HAM_IGNORED;

if(g_iHasJihad[victim] && g_iTimerJihad[victim] == 1)
if(g_iHasJihad[victim] && g_iTimerJihad[victim] == 1 && victim == killer)
{
ttt_set_karma_modifier(killer, victim, ttt_get_playerdata(killer, PD_KARMASELF), 2, 1);
g_iHasJihad[victim] = false;
g_iTimerJihad[victim] = 0;
}

if(g_iDidDieJihad[victim])
ttt_set_karma_modifier(killer, victim, ttt_get_playerdata(victim, PD_KARMATEMP), 1, 1);

if(task_exists(victim))
{
emit_sound(victim, CHAN_AUTO, g_szSounds[0], 1.0, ATTN_NORM, SND_STOP, PITCH_NORM);
Expand All @@ -140,7 +137,7 @@ public Ham_Killed_pre(victim, killer, shouldgib)

public jihad_bomber(id)
{
if(!is_user_alive(id) || ttt_get_game_state() == ENDED || ttt_get_game_state() == PREPARING || !g_iHasJihad[id])
if(!is_user_alive(id) || !g_iHasJihad[id] || ttt_get_gamemode() == GAME_ENDED || ttt_get_gamemode() == GAME_PREPARING)
{
remove_task(id);
return PLUGIN_HANDLED;
Expand All @@ -164,34 +161,29 @@ CreateExplosion(id)
static Float:origin[3];
entity_get_vector(id, EV_VEC_origin, origin);

new victim = -1, Float:flDistance;
new victim = -1, Float:damage;
new Float:radius = get_pcvar_float(cvar_jihad_radius);
new Float:dmg = get_pcvar_float(cvar_jihad_damage);

while((victim = find_ent_in_sphere(victim, origin, radius)) != 0)
{
if(entity_get_float(victim, EV_FL_takedamage) != DAMAGE_NO)
if(is_valid_ent(victim) && entity_get_float(victim, EV_FL_takedamage) != DAMAGE_NO)
{
if(is_user_alive(victim))
{
flDistance = entity_range(id, victim);
new Float:damage = (dmg/radius)*(radius-flDistance);

if(damage > 0.0)
{
if(id != victim)
g_iDidDieJihad[victim] = true;
damage = (dmg/radius)*(radius - entity_range(id, victim));

ExecuteHam(Ham_TakeDamage, victim, id, id, damage, DMG_BLAST);
entity_set_vector(victim, EV_VEC_velocity, Float:{0.0, 0.0, 0.0});
}
if(damage > 0.0)
{
if(is_user_connected(victim))
ttt_set_playerdata(victim, PD_KILLEDBYITEM, g_iItem_Jihad);
ExecuteHam(Ham_TakeDamage, victim, id, id, damage, DMG_BLAST);
entity_set_vector(victim, EV_VEC_velocity, Float:{0.0, 0.0, 0.0});
if(is_user_alive(victim))
ttt_set_playerdata(victim, PD_KILLEDBYITEM, -1);
}
else ExecuteHam(Ham_TakeDamage, victim, id, id, dmg, DMG_BLAST);
}
if(is_user_alive(victim))
g_iDidDieJihad[victim] = false;
}

ttt_set_playerdata(id, PD_KILLEDBYITEM, g_iItem_Jihad);
ExecuteHam(Ham_TakeDamage, id, id, id, dmg, DMG_BLAST);
}

Expand Down
189 changes: 80 additions & 109 deletions scripting/ttt_item_knife.sma
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <ttt>
#include <amx_settings_api>
#include <ttt>

#define XO_WEAPON 4
#define m_pPlayer 41
Expand All @@ -15,12 +15,10 @@ enum _:TYPE
{
K_NONE,
K_TEMP,
K_ON,
K_BOTH
K_ON
}

new Array:g_aKnifeModels;
new const g_szKnifeModels[][] = {"models/v_knife.mdl", "models/p_knife.mdl", "models/ttt/w_throwingknife.mdl"};
new g_szModels[3][TTT_FILELENGHT];
new const Float:g_szDroppedSize[][3] =
{
{-20.0, -20.0, -5.0},
Expand All @@ -33,44 +31,26 @@ new cvar_dmgmult, cvar_pattack_rate, cvar_sattack_rate, cvar_pattack_recoil,

public plugin_precache()
{
new model[TTT_MAXFILELENGHT];
g_aKnifeModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Knife", "MODEL_V", g_aKnifeModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_V", g_szModels[0], charsmax(g_szModels[])))
{
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_V", g_szKnifeModels[0]);
precache_model(g_szKnifeModels[0]);
ArrayPushString(g_aKnifeModels, g_szKnifeModels[0]);
}
else
{
ArrayGetString(g_aKnifeModels, 0, model, charsmax(model));
precache_model(model);
g_szModels[0] = "models/v_knife.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_V", g_szModels[0]);
}
precache_model(g_szModels[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Knife", "MODEL_P", g_aKnifeModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_P", g_szModels[1], charsmax(g_szModels[])))
{
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_P", g_szKnifeModels[1]);
precache_model(g_szKnifeModels[1]);
ArrayPushString(g_aKnifeModels, g_szKnifeModels[1]);
}
else
{
ArrayGetString(g_aKnifeModels, 1, model, charsmax(model));
precache_model(model);
g_szModels[1] = "models/p_knife.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_P", g_szModels[1]);
}
precache_model(g_szModels[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Knife", "MODEL_W", g_aKnifeModels))
{
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_W", g_szKnifeModels[2]);
precache_model(g_szKnifeModels[2]);
ArrayPushString(g_aKnifeModels, g_szKnifeModels[2]);
}
else
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_W", g_szModels[2], charsmax(g_szModels[])))
{
ArrayGetString(g_aKnifeModels, 2, model, charsmax(model));
precache_model(model);
g_szModels[2] = "models/ttt/w_throwingknife.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Knife", "MODEL_W", g_szModels[2]);
}
precache_model(g_szModels[2]);
}

public plugin_init()
Expand All @@ -91,37 +71,38 @@ public plugin_init()
register_touch("grenade", "*", "Touch_Grenade");

RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_smokegrenade", "Ham_PrimaryAttack_Grenade_pre", 0);
RegisterHam(Ham_Killed, "player", "Ham_Killed_pre", 0, true);
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_pre", 0, true);
RegisterHam(Ham_Killed, "player", "Ham_Killed_pre", 0);
RegisterHamPlayer(Ham_TakeDamage, "Ham_TakeDamage_pre", 0);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "Ham_PrimaryAttack_post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "Ham_SecondaryAttack_post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_knife", "Ham_Item_Deploy_post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_smokegrenade", "Ham_Item_Deploy_Grenade_post", 1);

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID11");
g_iItem_Knife = ttt_buymenu_add(name, get_pcvar_num(cvar_price_knife), TRAITOR);
g_iItem_Knife = ttt_buymenu_add(name, get_pcvar_num(cvar_price_knife), PC_TRAITOR);

register_clcmd("drop", "clcmd_drop");
register_clcmd("weapon_knife", "clcmd_knife");
}

public plugin_natives()
{
register_library("ttt");
register_native("ttt_knife_holding", "_knife_holding");
}

public client_disconnect(id)
{
g_iKnifeType[id] = K_NONE;
change_knife_holding(id, K_NONE);
g_iNadeVelocity[id][0] = false;
g_iNadeVelocity[id][1] = false;
}

public change_knife_holding(id, type)
{
ttt_set_playerdata(id, PD_HOLDINGITEM, type == K_ON ? g_iItem_Knife : -1);
ttt_set_playerdata(id, PD_ITEMSTATE, type);
g_iKnifeType[id] = type;
}

public ttt_gamemode(gamemode)
{
if(gamemode == ENDED || gamemode == RESTARTING)
if(gamemode == GAME_ENDED || gamemode == GAME_RESTARTING)
{
move_grenade();
new num, id;
Expand All @@ -135,7 +116,7 @@ public ttt_gamemode(gamemode)

if(is_user_alive(id) && g_iKnifeType[id] == K_ON)
reset_user_knife(id);
g_iKnifeType[id] = K_NONE;
change_knife_holding(id, K_NONE);
}
}
}
Expand All @@ -146,7 +127,7 @@ public ttt_item_selected(id, item, name[], price)
{
if(get_user_weapon(id) == CSW_KNIFE)
strip_knife(id, K_ON);
else g_iKnifeType[id] = K_TEMP;
else change_knife_holding(id, K_TEMP);

client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM2", name, id, "TTT_ITEM5");
return PLUGIN_HANDLED;
Expand All @@ -157,7 +138,7 @@ public ttt_item_selected(id, item, name[], price)

public clcmd_drop(id)
{
if(g_iKnifeType[id] == K_ON)
if(check_player_knife(id))
{
clcmd_throw(id, 64, 1);
return PLUGIN_HANDLED;
Expand All @@ -171,14 +152,18 @@ public clcmd_throw(id, vel, value)
new ent;
if(!user_has_weapon(id, CSW_SMOKEGRENADE))
ent = ham_give_weapon(id, "weapon_smokegrenade", 1);
else ent = fm_find_ent_by_owner(-1, "weapon_smokegrenade", id);
else ent = find_ent_by_owner(-1, "weapon_smokegrenade", id);

g_iNadeVelocity[id][0] = vel;
g_iNadeVelocity[id][1] = value;
ExecuteHamB(Ham_Weapon_PrimaryAttack, ent);
set_pdata_float(ent, m_flTimeWeaponIdle, 0.0, XO_WEAPON);
ExecuteHam(Ham_Weapon_WeaponIdle, ent);
strip_knife(id, K_NONE);

static name[32];
get_user_name(id, name, charsmax(name));
ttt_log_to_file(LOG_ITEM, "%s a throwed %L", name, LANG_PLAYER, "TTT_ITEM_ID11");
}

public clcmd_knife(id)
Expand Down Expand Up @@ -214,17 +199,13 @@ public grenade_throw(id, ent, nade)
UTIL_SetRendering(ent, kRenderFxGlowShell, Float:{255.0, 0.0, 0.0}, _, 50.0);

if(entity_get_float(ent, EV_FL_dmgtime) != 0.0)
{
static model[TTT_MAXFILELENGHT];
ArrayGetString(g_aKnifeModels, 2, model, charsmax(model));
entity_set_model(ent, model);
}
entity_set_model(ent, g_szModels[2]);
}
}

public Think_Grenade(ent)
{
if(!is_valid_ent(ent) || GetGrenadeType(ent) != CSW_SMOKEGRENADE || !entity_get_int(ent, EV_INT_iuser4) || ttt_get_game_state() != STARTED)
if(!is_valid_ent(ent) || GetGrenadeType(ent) != CSW_SMOKEGRENADE || !entity_get_int(ent, EV_INT_iuser4) || ttt_get_gamemode() != GAME_STARTED)
return;

static Float:origin[3], Float:velocity[3], Float:angles[3];
Expand Down Expand Up @@ -256,7 +237,7 @@ public Think_Grenade(ent)

public Touch_Grenade(nade, id)
{
if(!is_valid_ent(nade) || GetGrenadeType(nade) != CSW_SMOKEGRENADE || !entity_get_int(nade, EV_INT_iuser4) || ttt_get_game_state() != STARTED)
if(!is_valid_ent(nade) || GetGrenadeType(nade) != CSW_SMOKEGRENADE || !entity_get_int(nade, EV_INT_iuser4) || ttt_get_gamemode() != GAME_STARTED)
return PLUGIN_CONTINUE;

if(is_user_alive(id))
Expand Down Expand Up @@ -307,79 +288,69 @@ public Touch_Grenade(nade, id)

public Ham_Killed_pre(victim, killer, shouldgib)
{
if(is_user_alive(killer) && g_iKnifeType[killer] == K_ON && get_user_weapon(killer) == CSW_KNIFE)
if(is_user_connected(killer) && check_player_knife(killer))
ttt_set_playerdata(victim, PD_KILLEDBYITEM, g_iItem_Knife);

g_iKnifeType[victim] = K_NONE;
change_knife_holding(victim, K_NONE);
}

public Ham_PrimaryAttack_post(knife)
{
if(!is_valid_ent(knife))
public Ham_PrimaryAttack_post(ent)
{
new id;
if(!is_valid_ent(ent) || !(id = check_player_knife(ent)))
return;

new id = get_pdata_cbase(knife, m_pPlayer, XO_WEAPON);
if(is_user_connected(id) && g_iKnifeType[id] == K_ON)
{
attack_post(id, knife, get_pcvar_float(cvar_pattack_rate), get_pcvar_float(cvar_pattack_recoil));
clcmd_throw(id, get_pcvar_num(cvar_knife_velocity), 0);
}
attack_post(id, ent, get_pcvar_float(cvar_pattack_rate), get_pcvar_float(cvar_pattack_recoil));
clcmd_throw(id, get_pcvar_num(cvar_knife_velocity), 0);
}

public Ham_SecondaryAttack_post(knife)
{
if(!is_valid_ent(knife))
public Ham_SecondaryAttack_post(ent)
{
new id;
if(!is_valid_ent(ent) || !(id = check_player_knife(ent)))
return;

new id = get_pdata_cbase(knife, m_pPlayer, XO_WEAPON);
if(is_user_connected(id) && g_iKnifeType[id] == K_ON)
attack_post(id, knife, get_pcvar_float(cvar_sattack_rate), get_pcvar_float(cvar_sattack_recoil));
attack_post(id, ent, get_pcvar_float(cvar_sattack_rate), get_pcvar_float(cvar_sattack_recoil));
}

public Ham_Item_Deploy_post(knife)
public Ham_Item_Deploy_post(ent)
{
if(!is_valid_ent(knife))
if(!is_valid_ent(ent))
return;

new id = get_pdata_cbase(knife, m_pPlayer, XO_WEAPON);
new id = get_pdata_cbase(ent, m_pPlayer, XO_WEAPON);
if(is_user_alive(id) && g_iKnifeType[id] == K_ON)
{
static model[TTT_MAXFILELENGHT];
ArrayGetString(g_aKnifeModels, 0, model, charsmax(model));
entity_set_string(id, EV_SZ_viewmodel, model);
ArrayGetString(g_aKnifeModels, 1, model, charsmax(model));
entity_set_string(id, EV_SZ_weaponmodel, model);
attack_post(id, knife, 0.5, 0.0);
entity_set_string(id, EV_SZ_viewmodel, g_szModels[0]);
entity_set_string(id, EV_SZ_weaponmodel, g_szModels[1]);
attack_post(id, ent, 0.5, 0.0);
}
}

public Ham_Item_Deploy_Grenade_post(nade)
public Ham_Item_Deploy_Grenade_post(ent)
{
if(!is_valid_ent(nade))
if(!is_valid_ent(ent))
return;

new id = get_pdata_cbase(nade, m_pPlayer, XO_WEAPON);
new id = get_pdata_cbase(ent, m_pPlayer, XO_WEAPON);
if(is_user_alive(id) && g_iKnifeType[id] == K_ON)
{
static model[TTT_MAXFILELENGHT];
ArrayGetString(g_aKnifeModels, 0, model, charsmax(model));
entity_set_string(id, EV_SZ_viewmodel, model);
ArrayGetString(g_aKnifeModels, 1, model, charsmax(model));
entity_set_string(id, EV_SZ_weaponmodel, model);
attack_post(id, nade, 0.5, 0.0);
entity_set_string(id, EV_SZ_viewmodel, g_szModels[0]);
entity_set_string(id, EV_SZ_weaponmodel, g_szModels[1]);
attack_post(id, ent, 0.5, 0.0);
}
}

public Ham_PrimaryAttack_Grenade_pre(nade)
public Ham_PrimaryAttack_Grenade_pre(ent)
{
if(!is_valid_ent(nade))
if(!is_valid_ent(ent))
return;

new id = get_pdata_cbase(nade, m_pPlayer, XO_WEAPON);
new id = get_pdata_cbase(ent, m_pPlayer, XO_WEAPON);
if(is_user_alive(id) && g_iKnifeType[id] == K_ON)
{
set_pdata_float(nade, m_flTimeWeaponIdle, 0.0, XO_WEAPON);
ExecuteHam(Ham_Weapon_WeaponIdle, nade);
set_pdata_float(ent, m_flTimeWeaponIdle, 0.0, XO_WEAPON);
ExecuteHam(Ham_Weapon_WeaponIdle, ent);
}
}

Expand All @@ -399,7 +370,8 @@ public give_knife(id, knife)
strip_knife(id, K_ON);
emit_sound(id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
if(is_valid_ent(knife))
remove_entity(knife);
entity_set_origin(knife, Float:{-8191.0, -8191.0, -8191.0});
// remove_entity(knife);
}

public attack_post(id, knife, Float:flRate, Float:cvar)
Expand All @@ -419,7 +391,7 @@ public attack_post(id, knife, Float:flRate, Float:cvar)

public strip_knife(id, type)
{
g_iKnifeType[id] = type;
change_knife_holding(id, type);
reset_user_knife(id);
}

Expand Down Expand Up @@ -475,14 +447,13 @@ stock GetGrenadeType(ent)
return 0;
}

public _knife_holding(plugin, params)
stock check_player_knife(id)
{
if(params != 2)
return ttt_log_to_file(LOG_ERROR, "Wrong number of params (ttt_knife_holding)");
if(!is_user_connected(id))
id = get_pdata_cbase(id, m_pPlayer, XO_WEAPON);

new id = get_param(1);
if(get_param(2))
return g_iKnifeType[id] == K_TEMP ? true : false;
if(is_user_alive(id) && g_iKnifeType[id] == K_ON && get_user_weapon(id) == CSW_KNIFE)
return id;

return g_iKnifeType[id] == K_ON ? true : false;
}
return 0;
}
95 changes: 36 additions & 59 deletions scripting/ttt_item_newton.sma
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
#include <amx_settings_api>
#include <ttt>

#define CSW_WEAPON CSW_FIVESEVEN
#define WEAPON_CSWID CSW_FIVESEVEN
#define WEAPON_NAME "weapon_fiveseven"
#define m_bitsDamageType 76

new g_iItemID, g_iWasPushed[33];
new const g_szModels[][] = {"models/ttt/v_newton.mdl", "models/ttt/p_newton.mdl", "models/ttt/w_newton.mdl"};
new Array:g_aModels, cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price, cvar_weapon_force;
new g_szModels[3][TTT_FILELENGHT];
new cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price, cvar_weapon_reload, cvar_weapon_recoil, cvar_weapon_force;

public plugin_precache()
{
Expand All @@ -24,88 +24,72 @@ public plugin_precache()
precache_sound("weapons/sfpistol_shoot_start.wav");
precache_sound("weapons/sfpistol_shoot1.wav");

new model[TTT_MAXFILELENGHT];
g_aModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_V", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_V", g_szModels[0], charsmax(g_szModels[])))
{
g_szModels[0] = "models/ttt/v_newton.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_V", g_szModels[0]);
precache_model(g_szModels[0]);
ArrayPushString(g_aModels, g_szModels[0]);
}
else
{
ArrayGetString(g_aModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_P", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_P", g_szModels[1], charsmax(g_szModels[])))
{
g_szModels[1] = "models/ttt/p_newton.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_P", g_szModels[1]);
precache_model(g_szModels[1]);
ArrayPushString(g_aModels, g_szModels[1]);
}
else
{
ArrayGetString(g_aModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_W", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_W", g_szModels[2], charsmax(g_szModels[])))
{
g_szModels[2] = "models/ttt/w_newton.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Newton Launcher", "MODEL_W", g_szModels[2]);
precache_model(g_szModels[2]);
ArrayPushString(g_aModels, g_szModels[2]);
}
else
{
ArrayGetString(g_aModels, 2, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[2]);
}

public plugin_init()
{
register_plugin("[TTT] Item: Newton Launcher", TTT_VERSION, TTT_AUTHOR);

cvar_weapon_damage = my_register_cvar("ttt_newton_damage", "0.0");
cvar_weapon_speed = my_register_cvar("ttt_newton_speed", "2.0");
cvar_weapon_ammo = my_register_cvar("ttt_newton_ammo", "10");
cvar_weapon_clip = my_register_cvar("ttt_newton_clip", "1");
cvar_weapon_ammo = my_register_cvar("ttt_newton_ammo", "10");
cvar_weapon_speed = my_register_cvar("ttt_newton_speed", "2.0");
cvar_weapon_damage = my_register_cvar("ttt_newton_damage", "0.0");
cvar_weapon_reload = my_register_cvar("ttt_newton_reload", "0.0");
cvar_weapon_recoil = my_register_cvar("ttt_newton_recoil", "0.0");
cvar_weapon_force = my_register_cvar("ttt_newton_force", "100.0");
cvar_weapon_price = my_register_cvar("ttt_price_newton", "1");

RegisterHam(Ham_Killed, "player", "Ham_Killed_pre", 0, true);
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_pre", 0, true);
RegisterHamPlayer(Ham_Killed, "Ham_Killed_pre", 0);

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID16");
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), TRAITOR);
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), PC_TRAITOR);
}

public ttt_item_selected(id, item, name[], price)
{
if(g_iItemID == item)
{
if(user_has_weapon(id, CSW_WEAPON))
if(user_has_weapon(id, WEAPON_CSWID))
engclient_cmd(id, "drop", WEAPON_NAME);

static data[STOREABLE_STRUCTURE];
if(!data[STRUCT_CSWA_CSW])
{
data[STRUCT_CSWA_ITEMID] = g_iItemID;
data[STRUCT_CSWA_CSW] = CSW_WEAPON;
data[STRUCT_CSWA_CSW] = WEAPON_CSWID;
data[STRUCT_CSWA_CLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_MAXCLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_AMMO] = get_pcvar_num(cvar_weapon_ammo);
data[STRUCT_CSWA_STACKABLE] = true;
data[STRUCT_CSWA_SILENCED] = -1;
data[STRUCT_CSWA_SPEEDDELAY] = _:get_pcvar_float(cvar_weapon_speed);
data[STRUCT_CSWA_DAMAGE] = _:get_pcvar_float(cvar_weapon_damage);
data[STRUCT_CSWA_RELOADTIME] = _:0.0;
ArrayGetString(g_aModels, 0, data[STRUCT_CSWA_MODEL_V], charsmax(data[STRUCT_CSWA_MODEL_V]));
ArrayGetString(g_aModels, 1, data[STRUCT_CSWA_MODEL_P], charsmax(data[STRUCT_CSWA_MODEL_P]));
ArrayGetString(g_aModels, 2, data[STRUCT_CSWA_MODEL_W], charsmax(data[STRUCT_CSWA_MODEL_W]));
data[STRUCT_CSWA_RELOADTIME] = _:get_pcvar_float(cvar_weapon_reload);
data[STRUCT_CSWA_RECOIL] = _:get_pcvar_float(cvar_weapon_recoil);
data[STRUCT_CSWA_MODEL_V] = g_szModels[0];
data[STRUCT_CSWA_MODEL_P] = g_szModels[1];
data[STRUCT_CSWA_MODEL_W] = g_szModels[2];
}

cswa_give_specific(id, data);
Expand All @@ -125,25 +109,18 @@ public Ham_Killed_pre(victim, killer, shouldgib)
g_iWasPushed[victim] = false;
}

public Ham_TakeDamage_pre(victim, inflictor, attacker, Float:damage)
public cswa_damage(weapon_id, victim, attacker, Float:damage)
{
if(is_user_alive(inflictor) && attacker == inflictor && get_user_weapon(inflictor) == CSW_WEAPON && !ttt_return_check(attacker))
if(get_weapon_edict(weapon_id, REPL_CSWA_ITEMID) == g_iItemID)
{
new ent = find_ent_by_owner(-1, WEAPON_NAME, inflictor);
if(get_weapon_edict(ent, REPL_CSWA_SET) == 2 && get_weapon_edict(ent, REPL_CSWA_ITEMID) == g_iItemID)
{
new Float:push[3], Float:velocity[3];
entity_get_vector(victim, EV_VEC_velocity, velocity);
create_velocity_vector(victim, attacker, push);
push[0] += velocity[0];
push[1] += velocity[1];
entity_set_vector(victim, EV_VEC_velocity, push);
g_iWasPushed[victim] = inflictor;
return HAM_HANDLED;
}
new Float:push[3], Float:velocity[3];
entity_get_vector(victim, EV_VEC_velocity, velocity);
create_velocity_vector(victim, attacker, push);
push[0] += velocity[0];
push[1] += velocity[1];
entity_set_vector(victim, EV_VEC_velocity, push);
g_iWasPushed[victim] = attacker;
}

return HAM_IGNORED;
}

stock create_velocity_vector(victim, attacker, Float:velocity[3])
Expand Down
76 changes: 35 additions & 41 deletions scripting/ttt_item_revolver.sma
Original file line number Diff line number Diff line change
@@ -1,99 +1,85 @@
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <cs_weapons_api>
#include <amx_settings_api>
#include <ttt>

#define CSW_WEAPON CSW_DEAGLE
#define WEAPON_CSWID CSW_DEAGLE
#define WEAPON_NAME "weapon_deagle"

new g_iItemID;
new const g_szModels[][] = {"models/ttt/v_colt.mdl", "models/ttt/p_colt.mdl", "models/ttt/w_colt.mdl"};
new Array:g_aModels, cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price;
new g_szModels[3][TTT_FILELENGHT];
new cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price, cvar_weapon_reload, cvar_weapon_recoil;

public plugin_precache()
{
precache_sound("weapons/bull_draw.wav");
precache_sound("weapons/bull_reload.wav");

new model[TTT_MAXFILELENGHT];
g_aModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_V", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_V", g_szModels[0], charsmax(g_szModels[])))
{
g_szModels[0] = "models/ttt/v_colt.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_V", g_szModels[0]);
precache_model(g_szModels[0]);
ArrayPushString(g_aModels, g_szModels[0]);
}
else
{
ArrayGetString(g_aModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_P", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_P", g_szModels[1], charsmax(g_szModels[])))
{
g_szModels[1] = "models/ttt/p_colt.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_P", g_szModels[1]);
precache_model(g_szModels[1]);
ArrayPushString(g_aModels, g_szModels[1]);
}
else
{
ArrayGetString(g_aModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_W", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_W", g_szModels[2], charsmax(g_szModels[])))
{
g_szModels[2] = "models/ttt/w_colt.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Pocket Revolver", "MODEL_W", g_szModels[2]);
precache_model(g_szModels[2]);
ArrayPushString(g_aModels, g_szModels[2]);
}
else
{
ArrayGetString(g_aModels, 2, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[2]);
}

public plugin_init()
{
register_plugin("[TTT] Item: Pocket revolver", TTT_VERSION, TTT_AUTHOR);

cvar_weapon_damage = my_register_cvar("ttt_revolver_damage", "1000.0");
cvar_weapon_speed = my_register_cvar("ttt_revolver_speed", "0.3");
cvar_weapon_ammo = my_register_cvar("ttt_revolver_ammo", "0");
cvar_weapon_clip = my_register_cvar("ttt_revolver_clip", "6");
cvar_weapon_ammo = my_register_cvar("ttt_revolver_ammo", "0");
cvar_weapon_speed = my_register_cvar("ttt_revolver_speed", "0.7");
cvar_weapon_damage = my_register_cvar("ttt_revolver_damage", "0.0");
cvar_weapon_reload = my_register_cvar("ttt_revolver_reload", "0.0");
cvar_weapon_recoil = my_register_cvar("ttt_revolver_recoil", "0.0");
cvar_weapon_price = my_register_cvar("ttt_price_revolver", "2");

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID13");
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), DETECTIVE);
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), PC_DETECTIVE);
}

public ttt_item_selected(id, item, name[], price)
{
if(g_iItemID == item)
{
if(user_has_weapon(id, CSW_WEAPON))
if(user_has_weapon(id, WEAPON_CSWID))
engclient_cmd(id, "drop", WEAPON_NAME);

static data[STOREABLE_STRUCTURE];
if(!data[STRUCT_CSWA_CSW])
{
data[STRUCT_CSWA_ITEMID] = g_iItemID;
data[STRUCT_CSWA_CSW] = CSW_WEAPON;
data[STRUCT_CSWA_CSW] = WEAPON_CSWID;
data[STRUCT_CSWA_CLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_MAXCLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_AMMO] = get_pcvar_num(cvar_weapon_ammo);
data[STRUCT_CSWA_STACKABLE] = true;
data[STRUCT_CSWA_SILENCED] = -1;
data[STRUCT_CSWA_SPEEDDELAY] = _:get_pcvar_float(cvar_weapon_speed);
data[STRUCT_CSWA_DAMAGE] = _:get_pcvar_float(cvar_weapon_damage);
data[STRUCT_CSWA_RELOADTIME] = _:0.0;
ArrayGetString(g_aModels, 0, data[STRUCT_CSWA_MODEL_V], charsmax(data[STRUCT_CSWA_MODEL_V]));
ArrayGetString(g_aModels, 1, data[STRUCT_CSWA_MODEL_P], charsmax(data[STRUCT_CSWA_MODEL_P]));
ArrayGetString(g_aModels, 2, data[STRUCT_CSWA_MODEL_W], charsmax(data[STRUCT_CSWA_MODEL_W]));
data[STRUCT_CSWA_RELOADTIME] = _:get_pcvar_float(cvar_weapon_reload);
data[STRUCT_CSWA_RECOIL] = _:get_pcvar_float(cvar_weapon_recoil);
data[STRUCT_CSWA_MODEL_V] = g_szModels[0];
data[STRUCT_CSWA_MODEL_P] = g_szModels[1];
data[STRUCT_CSWA_MODEL_W] = g_szModels[2];
}

cswa_give_specific(id, data);
Expand All @@ -103,4 +89,12 @@ public ttt_item_selected(id, item, name[], price)
}

return PLUGIN_CONTINUE;
}

public cswa_damage(weapon_id, victim, attacker, Float:damage)
{
if(get_weapon_edict(weapon_id, REPL_CSWA_ITEMID) == g_iItemID)
{
ExecuteHamB(Ham_Killed, victim, attacker, 2);
}
}
67 changes: 26 additions & 41 deletions scripting/ttt_item_silencedusp.sma
Original file line number Diff line number Diff line change
Expand Up @@ -11,95 +11,80 @@
#define m_iPlayer 41
#define m_flNextSecondaryAttack 47

#define CSW_WEAPON CSW_USP
#define WEAPON_CSWID CSW_USP
#define WEAPON_NAME "weapon_usp"

new g_iItemID;
new const g_szModels[][] = {"models/ttt/v_silencedusp.mdl", "models/ttt/p_silencedusp.mdl", "models/ttt/w_silencedusp.mdl"};
new Array:g_aModels, cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price;
new g_szModels[3][TTT_FILELENGHT];
new cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price, cvar_weapon_reload, cvar_weapon_recoil;

public plugin_precache()
{
new model[TTT_MAXFILELENGHT];
g_aModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Silenced USP", "MODEL_V", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_V", g_szModels[0], charsmax(g_szModels[])))
{
g_szModels[0] = "models/ttt/v_silencedusp.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_V", g_szModels[0]);
precache_model(g_szModels[0]);
ArrayPushString(g_aModels, g_szModels[0]);
}
else
{
ArrayGetString(g_aModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Silenced USP", "MODEL_P", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_P", g_szModels[1], charsmax(g_szModels[])))
{
g_szModels[1] = "models/ttt/p_silencedusp.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_P", g_szModels[1]);
precache_model(g_szModels[1]);
ArrayPushString(g_aModels, g_szModels[1]);
}
else
{
ArrayGetString(g_aModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Silenced USP", "MODEL_W", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_W", g_szModels[2], charsmax(g_szModels[])))
{
g_szModels[2] = "models/ttt/w_silencedusp.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Silenced USP", "MODEL_W", g_szModels[2]);
precache_model(g_szModels[2]);
ArrayPushString(g_aModels, g_szModels[2]);
}
else
{
ArrayGetString(g_aModels, 2, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[2]);
}

public plugin_init()
{
register_plugin("[TTT] Item: Silent USP", TTT_VERSION, TTT_AUTHOR);

cvar_weapon_damage = my_register_cvar("ttt_usp_damage", "2.0");
cvar_weapon_speed = my_register_cvar("ttt_usp_speed", "-2.0");
cvar_weapon_ammo = my_register_cvar("ttt_usp_ammo", "50");
cvar_weapon_clip = my_register_cvar("ttt_usp_clip", "10");
cvar_weapon_ammo = my_register_cvar("ttt_usp_ammo", "50");
cvar_weapon_speed = my_register_cvar("ttt_usp_speed", "0.9");
cvar_weapon_damage = my_register_cvar("ttt_usp_damage", "2.0");
cvar_weapon_reload = my_register_cvar("ttt_usp_reload", "0.0");
cvar_weapon_recoil = my_register_cvar("ttt_usp_recoil", "0.0");
cvar_weapon_price = my_register_cvar("ttt_price_usp", "2");

RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_NAME, "Ham_SecondaryAttack_pre", 0);

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID10");
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), TRAITOR);
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), PC_TRAITOR);
}

public ttt_item_selected(id, item, name[], price)
{
if(g_iItemID == item)
{
if(user_has_weapon(id, CSW_WEAPON))
if(user_has_weapon(id, WEAPON_CSWID))
engclient_cmd(id, "drop", WEAPON_NAME);

static data[STOREABLE_STRUCTURE];
if(!data[STRUCT_CSWA_CSW])
{
data[STRUCT_CSWA_ITEMID] = g_iItemID;
data[STRUCT_CSWA_CSW] = CSW_WEAPON;
data[STRUCT_CSWA_CSW] = WEAPON_CSWID;
data[STRUCT_CSWA_CLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_MAXCLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_AMMO] = get_pcvar_num(cvar_weapon_ammo);
data[STRUCT_CSWA_STACKABLE] = true;
data[STRUCT_CSWA_SILENCED] = true;
data[STRUCT_CSWA_SPEEDDELAY] = _:get_pcvar_float(cvar_weapon_speed);
data[STRUCT_CSWA_DAMAGE] = _:get_pcvar_float(cvar_weapon_damage);
data[STRUCT_CSWA_RELOADTIME] = _:0.0;
ArrayGetString(g_aModels, 0, data[STRUCT_CSWA_MODEL_V], charsmax(data[STRUCT_CSWA_MODEL_V]));
ArrayGetString(g_aModels, 1, data[STRUCT_CSWA_MODEL_P], charsmax(data[STRUCT_CSWA_MODEL_P]));
ArrayGetString(g_aModels, 2, data[STRUCT_CSWA_MODEL_W], charsmax(data[STRUCT_CSWA_MODEL_W]));
data[STRUCT_CSWA_RELOADTIME] = _:get_pcvar_float(cvar_weapon_reload);
data[STRUCT_CSWA_RECOIL] = _:get_pcvar_float(cvar_weapon_recoil);
data[STRUCT_CSWA_MODEL_V] = g_szModels[0];
data[STRUCT_CSWA_MODEL_P] = g_szModels[1];
data[STRUCT_CSWA_MODEL_W] = g_szModels[2];
}

cswa_give_specific(id, data);
Expand Down
10 changes: 5 additions & 5 deletions scripting/ttt_item_teleport.sma
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ public plugin_init()
cvar_price_tele = my_register_cvar("ttt_price_tele", "1");
cvar_teleport_wait = my_register_cvar("ttt_teleport_wait", "5.0");

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID12");
g_iItem_Teleporter = ttt_buymenu_add(name, get_pcvar_num(cvar_price_tele), DETECTIVE);
g_iItem_Teleporter = ttt_buymenu_add(name, get_pcvar_num(cvar_price_tele), PC_DETECTIVE);
}

public ttt_gamemode(gamemode)
{
if(!g_iItemBought)
return;

if(gamemode == PREPARING || gamemode == RESTARTING)
if(gamemode == GAME_PREPARING || gamemode == GAME_RESTARTING)
{
new num, id;
static players[32];
Expand All @@ -43,7 +43,7 @@ public ttt_item_selected(id, item, name[], price)
{
if(g_iItem_Teleporter == item)
{
static out[TTT_ITEMNAME];
static out[TTT_ITEMLENGHT];
g_iHasTeleporter[id] = true;
formatex(out, charsmax(out), "%L", id, "TTT_ITEM_TELE1", 0.0, 0.0, 0.0);
g_iItem_Coordinates[id] = ttt_backpack_add(id, out);
Expand All @@ -67,7 +67,7 @@ public ttt_item_backpack(id, item, name[])
if(entity_get_int(id, EV_INT_flags) & FL_DUCKING)
g_fPlayerOrigin[id][2] += 40.0;

static out[TTT_ITEMNAME];
static out[TTT_ITEMLENGHT];
formatex(out, charsmax(out), "%L", id, "TTT_ITEM_TELE1", g_fPlayerOrigin[id][0], g_fPlayerOrigin[id][1], g_fPlayerOrigin[id][2]);
g_iItem_Coordinates[id] = ttt_backpack_add(id, out);

Expand Down
97 changes: 36 additions & 61 deletions scripting/ttt_item_ump.sma
Original file line number Diff line number Diff line change
@@ -1,99 +1,81 @@
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <cs_weapons_api>
#include <amx_settings_api>
#include <ttt>

#define CSW_WEAPON CSW_UMP45
#define WEAPON_CSWID CSW_UMP45
#define WEAPON_NAME "weapon_ump45"

new g_iItemID;
new const g_szModels[][] = {"models/ttt/v_ump.mdl", "models/ttt/p_ump.mdl", "models/ttt/w_ump.mdl"};
new Array:g_aModels, cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price;
new g_szModels[3][TTT_FILELENGHT];
new cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_ammo, cvar_weapon_clip, cvar_weapon_price, cvar_weapon_reload, cvar_weapon_recoil;

public plugin_precache()
{
new model[TTT_MAXFILELENGHT];
g_aModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_V", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_V", g_szModels[0], charsmax(g_szModels[])))
{
g_szModels[0] = "models/ttt/v_ump.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_V", g_szModels[0]);
precache_model(g_szModels[0]);
ArrayPushString(g_aModels, g_szModels[0]);
}
else
{
ArrayGetString(g_aModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_P", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_P", g_szModels[1], charsmax(g_szModels[])))
{
g_szModels[1] = "models/ttt/p_ump.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_P", g_szModels[1]);
precache_model(g_szModels[1]);
ArrayPushString(g_aModels, g_szModels[1]);
}
else
{
ArrayGetString(g_aModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_W", g_aModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_W", g_szModels[2], charsmax(g_szModels[])))
{
g_szModels[2] = "models/ttt/w_ump.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "UMP Prototype", "MODEL_W", g_szModels[2]);
precache_model(g_szModels[2]);
ArrayPushString(g_aModels, g_szModels[2]);
}
else
{
ArrayGetString(g_aModels, 2, model, charsmax(model));
precache_model(model);
}
precache_model(g_szModels[2]);
}

public plugin_init()
{
register_plugin("[TTT] Item: UMP Prototype", TTT_VERSION, TTT_AUTHOR);

cvar_weapon_damage = my_register_cvar("ttt_ump_damage", "0.0");
cvar_weapon_speed = my_register_cvar("ttt_ump_speed", "0.8");
cvar_weapon_ammo = my_register_cvar("ttt_ump_ammo", "30");
cvar_weapon_clip = my_register_cvar("ttt_ump_clip", "10");
cvar_weapon_ammo = my_register_cvar("ttt_ump_ammo", "30");
cvar_weapon_speed = my_register_cvar("ttt_ump_speed", "10.0");
cvar_weapon_damage = my_register_cvar("ttt_ump_damage", "0.0");
cvar_weapon_reload = my_register_cvar("ttt_ump_reload", "0.0");
cvar_weapon_recoil = my_register_cvar("ttt_ump_recoil", "0.0");
cvar_weapon_price = my_register_cvar("ttt_price_ump", "1");

RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_pre", 0, true);

new name[TTT_ITEMNAME];
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID6");
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), DETECTIVE);
g_iItemID = ttt_buymenu_add(name, get_pcvar_num(cvar_weapon_price), PC_DETECTIVE);
}

public ttt_item_selected(id, item, name[], price)
{
if(g_iItemID == item)
{
if(user_has_weapon(id, CSW_WEAPON))
if(user_has_weapon(id, WEAPON_CSWID))
engclient_cmd(id, "drop", WEAPON_NAME);

static data[STOREABLE_STRUCTURE];
if(!data[STRUCT_CSWA_CSW])
{
data[STRUCT_CSWA_ITEMID] = g_iItemID;
data[STRUCT_CSWA_CSW] = CSW_WEAPON;
data[STRUCT_CSWA_CSW] = WEAPON_CSWID;
data[STRUCT_CSWA_CLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_MAXCLIP] = get_pcvar_num(cvar_weapon_clip);
data[STRUCT_CSWA_AMMO] = get_pcvar_num(cvar_weapon_ammo);
data[STRUCT_CSWA_STACKABLE] = true;
data[STRUCT_CSWA_SILENCED] = -1;
data[STRUCT_CSWA_SPEEDDELAY] = _:get_pcvar_float(cvar_weapon_speed);
data[STRUCT_CSWA_DAMAGE] = _:get_pcvar_float(cvar_weapon_damage);
data[STRUCT_CSWA_RELOADTIME] = _:0.0;
ArrayGetString(g_aModels, 0, data[STRUCT_CSWA_MODEL_V], charsmax(data[STRUCT_CSWA_MODEL_V]));
ArrayGetString(g_aModels, 1, data[STRUCT_CSWA_MODEL_P], charsmax(data[STRUCT_CSWA_MODEL_P]));
ArrayGetString(g_aModels, 2, data[STRUCT_CSWA_MODEL_W], charsmax(data[STRUCT_CSWA_MODEL_W]));
data[STRUCT_CSWA_RELOADTIME] = _:get_pcvar_float(cvar_weapon_reload);
data[STRUCT_CSWA_RECOIL] = _:get_pcvar_float(cvar_weapon_recoil);
data[STRUCT_CSWA_MODEL_V] = g_szModels[0];
data[STRUCT_CSWA_MODEL_P] = g_szModels[1];
data[STRUCT_CSWA_MODEL_W] = g_szModels[2];
}

cswa_give_specific(id, data);
Expand All @@ -105,27 +87,20 @@ public ttt_item_selected(id, item, name[], price)
return PLUGIN_CONTINUE;
}

public Ham_TakeDamage_pre(victim, inflictor, attacker, Float:damage)
public cswa_damage(weapon_id, victim, attacker, Float:damage)
{
if(is_user_alive(inflictor) && attacker == inflictor && get_user_weapon(inflictor) == CSW_WEAPON && !ttt_return_check(attacker))
if(get_weapon_edict(weapon_id, REPL_CSWA_ITEMID) == g_iItemID)
{
new ent = find_ent_by_owner(-1, WEAPON_NAME, inflictor);
if(get_weapon_edict(ent, REPL_CSWA_SET) == 2 && get_weapon_edict(ent, REPL_CSWA_ITEMID) == g_iItemID)
{
new Float:angles[3];
entity_get_vector(victim, EV_VEC_angles, angles);
new Float:angles[3];
entity_get_vector(victim, EV_VEC_angles, angles);

angles[0] += random_float(-damage, damage);
angles[1] += random_float(-damage, damage);
entity_set_vector(victim, EV_VEC_angles, angles);
angles[0] += random_float(-damage, damage);
angles[1] += random_float(-damage, damage);
entity_set_vector(victim, EV_VEC_angles, angles);

angles[2] += random_float(-damage, damage);
entity_set_vector(victim, EV_VEC_punchangle, angles);
angles[2] += random_float(-damage, damage);
entity_set_vector(victim, EV_VEC_punchangle, angles);

entity_set_int(victim, EV_INT_fixangle, 1);
return HAM_HANDLED;
}
entity_set_int(victim, EV_INT_fixangle, 1);
}

return HAM_IGNORED;
}
41 changes: 27 additions & 14 deletions scripting/ttt_items_backpack.sma
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
#include <engine>
#include <ttt>

new g_iTotalItems[33], g_iPlayerItems[33][TTT_TOTAL_BACKPACK], g_iItemData[33][TTT_TOTAL_BACKPACK][TTT_ITEMNAME];
new g_iTotalItems[33], g_iPlayerItems[33][TTT_MAXBACKPACK], g_iItemData[33][TTT_MAXBACKPACK][TTT_ITEMLENGHT];
new g_iItemForward;

public plugin_init()
{
register_plugin("[TTT] Backpack base", TTT_VERSION, TTT_AUTHOR);
RegisterHam(Ham_Player_ImpulseCommands, "player", "Ham_Impulse_pre", 0, true);
RegisterHamPlayer(Ham_Player_ImpulseCommands, "Ham_Impulse_pre", 0);
g_iItemForward = CreateMultiForward("ttt_item_backpack", ET_CONTINUE, FP_CELL, FP_CELL, FP_STRING);
}

Expand All @@ -24,7 +24,7 @@ public plugin_natives()
public client_disconnect(id)
{
g_iTotalItems[id] = 0;
for(new i = 0; i < TTT_TOTAL_BACKPACK; i++)
for(new i = 0; i < TTT_MAXBACKPACK; i++)
{
g_iPlayerItems[id][i] = -1;
g_iItemData[id][i][0] = EOS;
Expand All @@ -45,7 +45,7 @@ public Ham_Impulse_pre(id)

public ttt_gamemode(gamemode)
{
if(gamemode == PREPARING || gamemode == RESTARTING)
if(gamemode == GAME_PREPARING || gamemode == GAME_RESTARTING)
{
new num, id, i;
static players[32];
Expand All @@ -54,7 +54,7 @@ public ttt_gamemode(gamemode)
{
id = players[num];
g_iTotalItems[id] = 0;
for(i = 0; i < TTT_TOTAL_BACKPACK; i++)
for(i = 0; i < TTT_MAXBACKPACK; i++)
{
g_iPlayerItems[id][i] = -1;
g_iItemData[id][i][0] = EOS;
Expand All @@ -77,14 +77,14 @@ public ttt_backpack_showup(id)
static item[128], num[3];
new menu = menu_create("\rBackpack", "ttt_backpack_handle");

for(new i = 0; i < TTT_TOTAL_BACKPACK; i++)
{
for(new i = 0; i < TTT_MAXBACKPACK; i++)
{
if(g_iPlayerItems[id][i] == -1) continue;
formatex(item, charsmax(item), "%s\R\y ", g_iItemData[id][i]);

num_to_str(i, num, charsmax(num));
menu_additem(menu, item, num);
}
}

menu_display(id, menu, 0);
return PLUGIN_HANDLED;
Expand All @@ -111,10 +111,9 @@ public ttt_backpack_handle(id, menu, item)
formatex(name, charsmax(name), "%L", LANG_PLAYER, "TTT_ITEM_ID7");
if(!equal(name, g_iItemData[id][itemid]) && ret == PLUGIN_HANDLED)
{
static msg[128], name[32];
static name[32];
get_user_name(id, name, charsmax(name));
formatex(msg, charsmax(msg), "Player %s used item %s from backpack with ID %d", name, g_iItemData[id][itemid], itemid);
ttt_log_to_file(LOG_ITEM, msg);
ttt_log_to_file(LOG_ITEM, "Player %s used item %s from backpack with ID %d", name, g_iItemData[id][itemid], itemid);

g_iPlayerItems[id][itemid] = -1;
g_iItemData[id][itemid][0] = EOS;
Expand All @@ -125,8 +124,11 @@ public ttt_backpack_handle(id, menu, item)
return PLUGIN_HANDLED;
}

public _backpack_add(plugin, param)
public _backpack_add(plugin, params)
{
if(params != 2)
return ttt_log_api_error("ttt_backpack_add needs 2 params(p1: %d)", plugin, params, get_param(1)) -1;

new id = get_param(1);
if(is_user_alive(id))
{
Expand All @@ -147,8 +149,11 @@ public _backpack_add(plugin, param)
return -1;
}

public _backpack_remove(plugin, param)
public _backpack_remove(plugin, params)
{
if(params != 2)
return ttt_log_api_error("ttt_backpack_remove needs 2 params(p1: %d, p2: %d)", plugin, params, get_param(1), get_param(2)) -2;

new item = get_param(2);
if(item > -1)
{
Expand All @@ -166,9 +171,17 @@ public _backpack_remove(plugin, param)
return -2;
}

public _backpack_show(plugin, param)
public _backpack_show(plugin, params)
{
if(params != 1)
return ttt_log_api_error("ttt_backpack_show needs 1 param(p1: %d)", plugin, params, get_param(1));

new id = get_param(1);
if(is_user_alive(id))
{
ttt_backpack_showup(id);
return 1;
}

return 0;
}
180 changes: 102 additions & 78 deletions scripting/ttt_items_base.sma
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@
#include <cstrike>
#include <ttt>

enum _:ItemData
enum _:ITEM_DATA
{
ItemName[TTT_ITEMNAME],
ItemCost,
ItemTeam
ITEM_NAME[TTT_ITEMLENGHT],
ITEM_COST,
ITEM_TEAM
}

new g_iTotalItems = -1, g_iSetupItems = -1;
new g_iItemForward, Array:g_iItems, Array:g_iSetup;
new g_iTotalItems, g_iSetupItems = -1;
new g_iItemForward, Array:g_aSetup;
new g_szItems[TTT_MAXSHOP][ITEM_DATA];

new const g_szBuyCommands[][] =
{
"buy", "buyequip", "usp", "glock", "deagle", "p228", "elites", "fn57", "m3", "xm1014", "mp5", "tmp", "p90", "mac10", "ump45", "ak47",
"galil", "famas", "sg552", "m4a1", "aug", "scout", "awp", "g3sg1", "sg550", "m249", "vest", "vesthelm", "flash", "hegren",
"sgren", "defuser", "nvgs", "shield", "primammo", "secammo", "km45", "9x19mm", "nighthawk", "228compact", "12gauge",
"autoshotgun", "smg", "mp", "c90", "cv47", "defender", "clarion", "krieg552", "bullpup", "magnum", "d3au1", "krieg550",
"buyammo1", "buyammo2", "cl_autobuy", "cl_rebuy", "cl_setautobuy", "cl_setrebuy"
"buy", "buyequip", "usp", "glock", "deagle", "p228", "elites", "fn57", "m3", "xm1014", "mp5", "tmp", "p90", "mac10", "ump45", "ak47",
"galil", "famas", "sg552", "m4a1", "aug", "scout", "awp", "g3sg1", "sg550", "m249", "vest", "vesthelm", "flash", "hegren",
"sgren", "defuser", "nvgs", "shield", "primammo", "secammo", "km45", "9x19mm", "nighthawk", "228compact", "12gauge",
"autoshotgun", "smg", "mp", "c90", "cv47", "defender", "clarion", "krieg552", "bullpup", "magnum", "d3au1", "krieg550",
"buyammo1", "buyammo2", "cl_autobuy", "cl_rebuy", "cl_setautobuy", "cl_setrebuy"
};

public plugin_precache()
Expand All @@ -31,12 +32,17 @@ public plugin_init()
register_clcmd("say /buy", "ttt_buymenu_show");
register_clcmd("say_team /buy", "ttt_buymenu_show");

g_iItems = ArrayCreate(ItemData);
g_iSetup = ArrayCreate(SetupData);
//COULD NOT WORK
g_aSetup = ArrayCreate(SETUP_DATA);

g_iItemForward = CreateMultiForward("ttt_item_selected", ET_STOP, FP_CELL, FP_CELL, FP_STRING, FP_CELL);
}

public plugin_end()
{
ArrayDestroy(g_aSetup);
}

public plugin_natives()
{
register_library("ttt");
Expand All @@ -47,12 +53,13 @@ public plugin_natives()
register_native("ttt_item_setup_get", "_item_setup_get");
register_native("ttt_is_item_setup", "_is_item_setup");
register_native("ttt_get_item_name", "_get_item_name");
register_native("ttt_get_item_id", "_get_item_id");
}

public ttt_gamemode(gamemode)
{
if(gamemode == PREPARING)
ArrayClear(g_iSetup);
if(gamemode == GAME_PREPARING)
ArrayClear(g_aSetup);
}

public client_command(id)
Expand Down Expand Up @@ -96,25 +103,24 @@ public ttt_buymenu_show(id)
}

new inno;
static data[ItemData], item[128], num[3];
static item[128], num[3];
new menu = menu_create("\rTTT Buy menu", "ttt_buymenu_handle");
new team = ttt_get_special_state(id);
new team = ttt_get_playerstate(id);
for(new i = 0; i < g_iTotalItems; i++)
{
ArrayGetArray(g_iItems, i, data);
if(data[ItemCost] == -1) continue;
if(data[ItemTeam] == INNOCENT)
{
if(g_szItems[i][ITEM_COST] == -1) continue;
if(g_szItems[i][ITEM_TEAM] == PC_INNOCENT)
inno++;

if((data[ItemTeam] == SPECIAL && (team == TRAITOR || team == DETECTIVE)) || team == data[ItemTeam])
if((g_szItems[i][ITEM_TEAM] == PC_SPECIAL && (team == PC_TRAITOR || team == PC_DETECTIVE)) || team == g_szItems[i][ITEM_TEAM])
{
formatex(item, charsmax(item), "%s\R\y%i ", data[ItemName], data[ItemCost]);
formatex(item, charsmax(item), "%s\R\y%i ", g_szItems[i][ITEM_NAME], g_szItems[i][ITEM_COST]);
num_to_str(i, num, charsmax(num));
menu_additem(menu, item, num);
}
}
}

if(!inno && team == INNOCENT)
if(!inno && team == PC_INNOCENT)
{
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_NOITEMSTEAM", id, special_names[team]);
return PLUGIN_HANDLED;
Expand All @@ -140,59 +146,57 @@ public ttt_buymenu_handle(id, menu, item)
menu_destroy(menu);

new itemid = str_to_num(num);
static data[ItemData];
ArrayGetArray(g_iItems, itemid, data);

new player_state = ttt_get_special_state(id);
if((data[ItemTeam] == SPECIAL && player_state != TRAITOR && player_state != DETECTIVE) || (player_state != data[ItemTeam] && SPECIAL != data[ItemTeam]))
new player_state = ttt_get_playerstate(id);
if((g_szItems[itemid][ITEM_TEAM] == PC_SPECIAL && player_state != PC_TRAITOR && player_state != PC_DETECTIVE) || (player_state != g_szItems[itemid][ITEM_TEAM] && PC_SPECIAL != g_szItems[itemid][ITEM_TEAM]))
{
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM3", id, special_names[data[ItemTeam]], data[ItemName]);
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM3", id, special_names[g_szItems[itemid][ITEM_TEAM]], g_szItems[itemid][ITEM_NAME]);
return PLUGIN_HANDLED;
}

new credits = ttt_get_playerdata(id, PD_CREDITS);
if(credits < data[ItemCost])
if(credits < g_szItems[itemid][ITEM_COST])
{
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM4", data[ItemName], data[ItemCost]);
client_print_color(id, print_team_default, "%s %L", TTT_TAG, id, "TTT_ITEM4", g_szItems[itemid][ITEM_NAME], g_szItems[itemid][ITEM_COST]);
return PLUGIN_HANDLED;
}

new ret;
ExecuteForward(g_iItemForward, ret, id, itemid, data[ItemName], data[ItemCost]);
ExecuteForward(g_iItemForward, ret, id, itemid, g_szItems[itemid][ITEM_NAME], g_szItems[itemid][ITEM_COST]);

if(ret == PLUGIN_HANDLED)
{
//emit_sound(id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
client_cmd(id, "spk ^"%s^"", "items/gunpickup2.wav");
ttt_set_playerdata(id, PD_CREDITS, credits-data[ItemCost]);
ttt_set_playerdata(id, PD_CREDITS, credits-g_szItems[itemid][ITEM_COST]);

static name[32];
get_user_name(id, name, charsmax(name));
ttt_log_to_file(LOG_ITEM, "Player %s bought item %s with ID %d", name, g_szItems[itemid][ITEM_NAME], itemid);
}

static msg[70], name[32];
get_user_name(id, name, charsmax(name));
formatex(msg, charsmax(msg), "Player %s bought item %s with ID %d", name, data[ItemName], itemid);
ttt_log_to_file(LOG_ITEM, msg);

return PLUGIN_HANDLED;
}

public _buymenu_add(plugin, param)
public _buymenu_add(plugin, params)
{
static data[ItemData];
get_string(1, data[ItemName], charsmax(data[ItemName]));
data[ItemCost] = get_param(2);
data[ItemTeam] = get_param(3);
if(params != 3)
return ttt_log_api_error("ttt_buymenu_add needs 3 params(p2: %d, p3: %d)", plugin, params, get_param(2), get_param(3)) -1;

ArrayPushArray(g_iItems, data);
if(g_iTotalItems == -1)
g_iTotalItems = 0;
get_string(1, g_szItems[g_iTotalItems][ITEM_NAME], charsmax(g_szItems[][ITEM_NAME]));
g_szItems[g_iTotalItems][ITEM_COST] = get_param(2);
g_szItems[g_iTotalItems][ITEM_TEAM] = get_param(3);

g_iTotalItems++;
return (g_iTotalItems - 1);
}

public _item_setup_add(plugin, param)
public _item_setup_add(plugin, params)
{
static data[SetupData];
if(params != 7)
return ttt_log_api_error("ttt_item_setup_add needs 7 params", plugin, params) -1;

static data[SETUP_DATA];
data[SETUP_ITEMID] = get_param(1);
data[SETUP_ITEMENT] = get_param(2);
data[SETUP_ITEMTIME] = get_param(3);
Expand All @@ -201,32 +205,38 @@ public _item_setup_add(plugin, param)
data[SETUP_ITEMACTIVE] = get_param(6);
get_string(7, data[SETUP_ITEMNAME], charsmax(data[SETUP_ITEMNAME]));

ArrayPushArray(g_iSetup, data);
g_iSetupItems = ArraySize(g_iSetup);
ArrayPushArray(g_aSetup, data);
g_iSetupItems = ArraySize(g_aSetup);

return (g_iSetupItems -1);
}

public _item_setup_remove(plugin, param)
public _item_setup_remove(plugin, params)
{
if(params != 1)
return ttt_log_api_error("ttt_item_setup_remove needs 1 param(p1: %d)", plugin, params, get_param(1)) -1;

new item = get_param(1);
if(item > -1)
{
new data[SetupData] = {0, 0, ...};
ArraySetArray(g_iSetup, item, data);
new data[SETUP_DATA] = {0, 0, ...};
ArraySetArray(g_aSetup, item, data);
return 1;
}

return -1;
}

public _item_setup_get(plugin, param)
public _item_setup_get(plugin, params)
{
if(params != 2)
return ttt_log_api_error("ttt_item_setup_get needs 2 params(p1: %d)", plugin, params, get_param(1)) -1;

new item = get_param(1);
if(item > -1)
{
static data[SetupData];
ArrayGetArray(g_iSetup, item, data);
static data[SETUP_DATA];
ArrayGetArray(g_aSetup, item, data);

set_array(2, data, sizeof(data));
return 1;
Expand All @@ -235,52 +245,66 @@ public _item_setup_get(plugin, param)
return -1;
}

public _item_setup_update(plugin, param)
public _item_setup_update(plugin, params)
{
if(params != 2)
return ttt_log_api_error("ttt_item_setup_update needs 2 params(p1: %d)", plugin, params, get_param(1)) -1;

new item = get_param(1);
if(item > -1)
{
static data[SetupData];
static data[SETUP_DATA];
get_array(2, data, sizeof(data));

ArraySetArray(g_iSetup, item, data);
ArraySetArray(g_aSetup, item, data);
return 1;
}

return -1;
}

public _is_item_setup(plugin, param)
public _is_item_setup(plugin, params)
{
if(param != 1)
return ttt_log_to_file(LOG_ERROR, "Wrong number of params (ttt_is_item_setup)") -1;
if(params != 1)
return ttt_log_api_error("ttt_is_item_setup needs 1 param(p1: %d)", plugin, params, get_param(1));


if(g_iSetupItems > 0 && ArraySize(g_iSetup))
if(g_iSetupItems > 0 && ArraySize(g_aSetup))
{
new ent = get_param(1);
new i, data[SetupData], msg = -1;
for(i = 0; i < g_iSetupItems-1; i++)
new data[SETUP_DATA];
for(new i = 0; i < g_iSetupItems-1; i++)
{
ArrayGetArray(g_iSetup, i, data);
ArrayGetArray(g_aSetup, i, data);
if(ent == data[SETUP_ITEMENT])
{
msg = i;
break;
}
return i;
}
return msg;
}

return -1;
}

public _get_item_name(plugin, param)
public _get_item_name(plugin, params)
{
if(param != 3)
return ttt_log_to_file(LOG_ERROR, "Wrong number of params (ttt_get_item_name)") -1;
if(params != 3)
return ttt_log_api_error("ttt_get_item_name needs 3 params(p1: %d, p3: %d)", plugin, params, get_param(1), get_param(3));

new data[SetupData];
ArrayGetArray(g_iItems, get_param(1), data);
set_string(2, data[ItemName], get_param(3));
set_string(2, g_szItems[get_param(1)][ITEM_NAME], get_param(3));
return 1;
}

public _get_item_id(plugin, params)
{
if(params != 1)
return ttt_log_api_error("ttt_get_item_id needs 1 param(p1: %d)", plugin, params, get_param(1)) -2;

new name[TTT_ITEMLENGHT];
get_string(1, name, charsmax(name));
for(new i = 0; i < g_iTotalItems-1; i++)
{
if(equal(g_szItems[i][ITEM_NAME], name))
return i;
}

return -2;
}
270 changes: 148 additions & 122 deletions scripting/ttt_logging.sma
Original file line number Diff line number Diff line change
Expand Up @@ -4,207 +4,203 @@
#include <engine>
#include <ttt>

#define logdir "addons/amxmodx/logs/ttt"
#define TTT_LOG_SIZE 192
#define LOG_MSG_SIZE 200
#define LOG_MSG_DIR "addons/amxmodx/logs/ttt"
#define LOG_MSG_PREFIX "TTT"

new g_szFileNames[2][64] = {"", "addons/amxmodx/logs/ttt/ttt_errors.log"};
new g_iDamageHolder[33][33]; //ATTACKER - VICTIM
new cvar_logging, cvar_logging_error, cvar_logging_type;

new const g_szLogMessages[][] =
{
"DEFAULT",
"ERROR",
"GAMETYPE",
"ITEM",
"KILL",
"DAMAGE",
"MISC"
};
new g_szFileNames[2][64];
new g_iDamageHolder[33][33]; //ATTACKER - VICTIM

public plugin_init()
{
register_plugin("[TTT] Logging", TTT_VERSION, TTT_AUTHOR);

RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_post", 1, true);
RegisterHam(Ham_Killed, "player", "Ham_Killed_post", 1, true);
RegisterHamPlayer(Ham_TakeDamage, "Ham_TakeDamage_post", 1);
RegisterHamPlayer(Ham_Killed, "Ham_Killed_post", 1);

cvar_logging = my_register_cvar("ttt_logging", "1");
cvar_logging_error = my_register_cvar("ttt_logging_error", "1");// separate error logs
cvar_logging_type = my_register_cvar("ttt_logging_type", "abcdefg"); // a=default, b=error, c=gametype, d=item, e=kill, f=damage, g=misc
cvar_logging = my_register_cvar("ttt_logging", "1");
cvar_logging_error = my_register_cvar("ttt_logging_error", "1");// separate error logs
cvar_logging_type = my_register_cvar("ttt_logging_type", "abcdefg"); // a=default, b=error, c=gametype, d=item, e=kill, f=damage, g=misc

new time[10];
get_time("%Y%m%d", time, charsmax(time));
formatex(g_szFileNames[0], charsmax(g_szFileNames[]), "%s/TTT%s.log", logdir, time);
new msg[32];
get_time("%Y%m%d", msg, charsmax(msg));
formatex(g_szFileNames[0], charsmax(g_szFileNames[]), "%s/%s%s.log", LOG_MSG_DIR, LOG_MSG_PREFIX, msg);
formatex(g_szFileNames[1], charsmax(g_szFileNames[]), "%s/%s_ERRORS.log", LOG_MSG_DIR, LOG_MSG_PREFIX);

new out[64], mapname[32];
get_mapname(mapname, charsmax(mapname));
formatex(out, charsmax(out), "Map changed to %s", mapname);
add_to_log(LOG_DEFAULT, out);
get_mapname(msg, charsmax(msg));
_ttt_log_to_file(LOG_DEFAULT, "Map changed to %s", msg);
}

public plugin_natives()
{
register_library("ttt");
register_native("ttt_log_to_file", "_log_to_file");
register_native("ttt_logging", "_logging");
}

public plugin_end()
{
new mapname[32];
get_pcvar_string(get_cvar_pointer("amx_nextmap"), mapname, charsmax(mapname));
_ttt_log_to_file(LOG_DEFAULT, "amx_nextmap is %s", mapname);
}

public client_putinserver(id)
{
static name[32], out[64];
static name[32];
get_user_name(id, name, charsmax(name));
formatex(out, charsmax(out), "%s joined the game", name);
add_to_log(LOG_DEFAULT, out);
_ttt_log_to_file(LOG_DEFAULT, "%s connected", name);
}

public client_disconnect(id)
{
new num, victim;
static players[32], name[32], out[64];
new num;
static players[32];
get_players(players, num);
for(--num; num >= 0; num--)
{
victim = players[num];
g_iDamageHolder[id][victim] = 0;
}
g_iDamageHolder[id][players[num]] = 0;

get_user_name(id, name, charsmax(name));
formatex(out, charsmax(out), "%s disconnected", name);
add_to_log(LOG_DEFAULT, out);
get_user_name(id, players, charsmax(players));
_ttt_log_to_file(LOG_DEFAULT, "%s disconnected", players);
}

public ttt_gamemode(gamemode)
public ttt_winner(winner)
{
if(gamemode == ENDED)
{
static players[32];
new num, attacker;

get_players(players, num);
for(--num; num >= 0; num--)
{
attacker = players[num];
log_all_damage(attacker);
}
}
}

public log_all_damage(attacker)
{
static players[32], ids[2];
new num, victim;

new num, numA;
static players[32];
get_players(players, numA, "a");
get_players(players, num);
ttt_log_to_file(LOG_DEFAULT, "Round was won by %s", winner == PC_TRAITOR ? "TRAITORS" : "INNOCENTS");
ttt_log_to_file(LOG_DEFAULT, "Current player count %d/%d", numA, num);
for(--num; num >= 0; num--)
{
victim = players[num];
if(g_iDamageHolder[attacker][victim] > 0)
{
ids[0] = attacker;
ids[1] = victim;
set_task(0.1, "log_damage", _, ids, 2);
}
}
log_all_damage(players[num]);
}

public Ham_Killed_post(victim, killer, shouldgib)
public ttt_bomb_status(id, status)
{
if(ttt_return_check(killer))
return;

static name[32], killmsg[64], msg[TTT_LOG_SIZE];
get_user_name(victim, name, charsmax(name));
ttt_get_kill_message(victim, killer, killmsg, charsmax(killmsg), 1);

formatex(msg, charsmax(msg), "[%L] %s was killed by %s", LANG_PLAYER, special_names[ttt_get_playerdata(victim, PD_KILLEDSTATE)], name, killmsg);
add_to_log(LOG_KILL, msg);
static const c4_status[][] =
{
"planted",
"defused",
"failed to defuse",
"exploded"
};

new ids[2];
ids[0] = killer;
ids[1] = victim;
set_task(0.1, "log_damage", _, ids, 2);
static name[32];
get_user_name(id, name, charsmax(name));
_ttt_log_to_file(LOG_ITEM, "%s %s the C4", name, c4_status[status]);
}

public Ham_TakeDamage_post(victim, inflictor, attacker, Float:damage, DamageBits)
public Ham_TakeDamage_post(victim, inflictor, attacker, Float:damage, bits)
{
if(ttt_return_check(attacker))
if(!is_user_connected(attacker))
return;

new dmg = floatround(entity_get_float(victim, EV_FL_dmg_take));
g_iDamageHolder[attacker][victim] += dmg;
}

public log_damage(param[])
public Ham_Killed_post(victim, killer, shouldgib)
{
new attacker = param[0], victim = param[1];
if(g_iDamageHolder[attacker][victim] > 0)
static name[32], killmsg[64];
get_user_name(victim, name, charsmax(name));

ttt_get_kill_message(victim, killer, killmsg, charsmax(killmsg), 1);
_ttt_log_to_file(LOG_KILL, "[%L] %s was killed by %s", LANG_PLAYER, special_names[ttt_get_alivestate(victim)], name, killmsg);

if(is_user_connected(killer))
{
new aliveV = ttt_get_special_alive(victim), aliveK = ttt_get_special_alive(attacker);
static name[2][32];

get_user_name(attacker, name[0], charsmax(name[]));
get_user_name(victim, name[1], charsmax(name[]));

new msg[TTT_LOG_SIZE];
formatex(msg, charsmax(msg), "[%L] %s attacked [%L] %s with %d damage", LANG_PLAYER, special_names[aliveV], name[0], LANG_PLAYER, special_names[aliveK], name[1], g_iDamageHolder[attacker][victim]);
add_to_log(LOG_DAMAGE, msg);
g_iDamageHolder[attacker][victim] = 0;
new ids[2];
ids[0] = killer;
ids[1] = victim;
set_task(0.1, "log_damage", _, ids, 2);
}
}

public _log_to_file(plugin, params)
public log_damage(params[])
{
new cvar = get_pcvar_num(cvar_logging);

if(!cvar)
return -1;
log_damage_one(params[0], params[1]);
}

new type = get_param(1);
//
public _logging(plugin, params)
{
if(params != 2)
return add_to_log(LOG_ERROR, "Wrong number of params (ttt_log_to_file)");
return _ttt_log_api_error("ttt_logging needs 2 params(p1: %d, p2: %d)", plugin, params, get_param(1), get_param(2));

static msg[TTT_LOG_SIZE];
static msg[LOG_MSG_SIZE];
get_string(2, msg, charsmax(msg));
add_to_log(type, msg);
remove_colors(msg, charsmax(msg));
cs_log_file(get_param(1), msg);

return 1;
}

stock _ttt_log_api_error(text[], plugin, params, any:...)
{
static plugin_name[32], msg[LOG_MSG_SIZE];
get_plugin(plugin, plugin_name, charsmax(plugin_name));
vformat(msg, charsmax(msg), text, 4);
_ttt_log_to_file(LOG_ERROR, "%s (params %d, plugin: %s)", msg, params, plugin_name);
return 0;
}

stock add_to_log(type, msg[])
stock _ttt_log_to_file(type, text[], any:...)
{
if(!get_pcvar_num(cvar_logging))
return 0;
static msg[LOG_MSG_SIZE];
vformat(msg, charsmax(msg), text, 3);
cs_log_file(type, msg);
}

new num;
static players[32];
get_players(players, num);
if(num < 3 && (type != LOG_ERROR && type != LOG_DEFAULT))
stock cs_log_file(type, text[])
{

if(!get_pcvar_num(cvar_logging))
return 0;

static cvar[10];
static cvar[15];
get_pcvar_string(cvar_logging_type, cvar, charsmax(cvar));
if(!cvar[0])
return 0;

if(read_flags(cvar) & type)
{
static out[TTT_LOG_SIZE], time[24];
get_time("%m/%d/%Y - %H:%M:%S", time, charsmax(time));
format(out, charsmax(out), "[TTT] %s: [%s] --- %s", time, g_szLogMessages[bit_to_int(type)], msg);
write_to_file(g_szFileNames[0], out);
static const log_messages[][] =
{
"DEFAULT",
"ERROR",
"GAMETYPE",
"ITEM",
"KILL",
"DAMAGE",
"MISC"
};

static time_msg[24], msg[LOG_MSG_SIZE];
get_time("%m/%d/%Y - %H:%M:%S", time_msg, charsmax(time_msg));
format(msg, charsmax(msg), "[LOG] %s: [%-8s] --- %s", time_msg, log_messages[bit_to_int(type)], text);
write_to_file(g_szFileNames[0], msg);

if(type == LOG_ERROR && get_pcvar_num(cvar_logging_error))
write_to_file(g_szFileNames[1], out);
write_to_file(g_szFileNames[1], msg);
return 1;
}

return 0;
}

stock remove_colors(string[], len)
{
replace_all(string, len, "^1", "");
replace_all(string, len, "^2", "");
replace_all(string, len, "^3", "");
replace_all(string, len, "^4", "");
}

stock write_to_file(file[], msg[])
{
if(!dir_exists(logdir))
mkdir(logdir);
if(!dir_exists(LOG_MSG_DIR))
mkdir(LOG_MSG_DIR);

if(!file_exists(file))
{
Expand All @@ -228,4 +224,34 @@ stock bit_to_int(n)
}

return count;
}

stock log_all_damage(attacker)
{
new num, victim;
static players[32];

get_players(players, num);
for(--num; num >= 0; num--)
{
victim = players[num];
if(g_iDamageHolder[attacker][victim] > 0)
log_damage_one(attacker, victim);
}
}

stock log_damage_one(attacker, victim)
{
if(g_iDamageHolder[attacker][victim] > 0)
{
static name[2][32];
get_user_name(attacker, name[0], charsmax(name[]));
get_user_name(victim, name[1], charsmax(name[]));

_ttt_log_to_file(LOG_DAMAGE, "[%L] %s attacked [%L] %s with %d damage",
LANG_PLAYER, special_names[ttt_get_alivestate(attacker)], name[0],
LANG_PLAYER, special_names[ttt_get_alivestate(victim)], name[1], g_iDamageHolder[attacker][victim]);

g_iDamageHolder[attacker][victim] = 0;
}
}
4 changes: 2 additions & 2 deletions scripting/ttt_mapsupport.sma
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public ttt_gamemode(gamemode)
if(!g_iJBMap)
return;

if(gamemode == PREPARING)
if(gamemode == GAME_PREPARING)
{
set_task(1.0, "jail_open");
g_fRoundTime = 0.0;
Expand All @@ -58,7 +58,7 @@ public pfn_keyvalue(ent)

public jail_open_id(id)
{
new Float:cvar = get_pcvar_float(cvar_cell_open_delay), Float:round = get_roundtime();
new Float:cvar = get_pcvar_float(cvar_cell_open_delay), Float:round = ttt_get_roundtime();
if(round > g_fRoundTime+cvar)
{
g_fRoundTime = round;
Expand Down
31 changes: 0 additions & 31 deletions scripting/ttt_minmodels.sma

This file was deleted.

8 changes: 4 additions & 4 deletions scripting/ttt_random_weapon.sma
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ public give_random_weap(id)
{
strip_weapons(id);

new iPri = random_num(0, charsmax(g_szPriWeap));
new iSec = random_num(0, charsmax(g_szSecWeap));
new pri = random_num(0, charsmax(g_szPriWeap));
new sec = random_num(0, charsmax(g_szSecWeap));

cswa_give_normal(id, g_szSecWeap[iSec], -1, g_szSecAmmo[iSec]);
cswa_give_normal(id, g_szPriWeap[iPri], -1, g_szPriAmmo[iPri]);
cswa_give_normal(id, g_szSecWeap[sec], -1, g_szSecAmmo[sec]);
cswa_give_normal(id, g_szPriWeap[pri], -1, g_szPriAmmo[pri]);

if(task_exists(id))
remove_task(id);
Expand Down
175 changes: 53 additions & 122 deletions scripting/ttt_replacements.sma
Original file line number Diff line number Diff line change
Expand Up @@ -11,106 +11,66 @@
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47

new const g_szCrowbarModel[][] = {"models/ttt/v_crowbar.mdl", "models/ttt/p_crowbar.mdl"};
new const g_szGrenadeModel[][] = {"models/ttt/v_hegrenade.mdl", "models/ttt/p_hegrenade.mdl", "models/ttt/w_hegrenade.mdl"};
new g_szCrowbarModel[2][TTT_FILELENGHT];
new g_szGrenadeModel[3][TTT_FILELENGHT];
new const g_szCrowbarSound[][] = {"weapons/cbar_hitbod2.wav", "weapons/cbar_hitbod1.wav", "weapons/bullet_hit2.wav", "weapons/cbar_miss1.wav"};
new const g_szHeadShotSound[][] = {"player/headshot1.wav", "player/headshot2.wav", "player/headshot3.wav"};

new const g_szWeaponsList[][] =
{
"weapon_p228", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10", "weapon_aug",
"weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18",
"weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1",
"weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90"
};

new HamHook:g_HamPrimaryAttack[sizeof(g_szWeaponsList)], HamHook:g_HamSecondaryAttack[sizeof(g_szWeaponsList)],
HamHook:g_HamItemDeploy[sizeof(g_szWeaponsList)];
new Array:g_aCrowbarModels, Array:g_aGrenadeModels;
new g_szPlayerModel[32];
new g_szPlayerModel[32], g_iKnifeID = -1;

public plugin_precache()
{
new i, model[TTT_MAXFILELENGHT];
g_aCrowbarModels = ArrayCreate(TTT_MAXFILELENGHT, 2);
g_aGrenadeModels = ArrayCreate(TTT_MAXFILELENGHT, 3);

// PLAYER
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Player model", "MODEL", g_szPlayerModel, charsmax(g_szPlayerModel)))
{
g_szPlayerModel = "terror";
amx_save_setting_string(TTT_SETTINGSFILE, "Player model", "MODEL", g_szPlayerModel);
}

new model[TTT_FILELENGHT];
formatex(model, charsmax(model), "models/player/%s/%s.mdl", g_szPlayerModel, g_szPlayerModel);
precache_model(model);

// END

// CROWBAR
if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Crowbar", "MODEL_V", g_aCrowbarModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Crowbar", "MODEL_V", g_szCrowbarModel[0], charsmax(g_szCrowbarModel[])))
{
g_szCrowbarModel[0] = "models/ttt/v_crowbar.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Crowbar", "MODEL_V", g_szCrowbarModel[0]);
precache_model(g_szCrowbarModel[0]);
ArrayPushString(g_aCrowbarModels, g_szCrowbarModel[0]);
}
else
{
ArrayGetString(g_aCrowbarModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szCrowbarModel[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Crowbar", "MODEL_P", g_aCrowbarModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Crowbar", "MODEL_P", g_szCrowbarModel[1], charsmax(g_szCrowbarModel[])))
{
g_szCrowbarModel[1] = "models/ttt/p_crowbar.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Crowbar", "MODEL_P", g_szCrowbarModel[1]);
precache_model(g_szCrowbarModel[1]);
ArrayPushString(g_aCrowbarModels, g_szCrowbarModel[1]);
}
else
{
ArrayGetString(g_aCrowbarModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szCrowbarModel[1]);
// END

// GRENADE
if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Grenade", "MODEL_V", g_aGrenadeModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_V", g_szGrenadeModel[0], charsmax(g_szGrenadeModel[])))
{
g_szGrenadeModel[0] = "models/ttt/v_hegrenade.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_V", g_szGrenadeModel[0]);
precache_model(g_szGrenadeModel[0]);
ArrayPushString(g_aGrenadeModels, g_szGrenadeModel[0]);
}
else
{
ArrayGetString(g_aGrenadeModels, 0, model, charsmax(model));
precache_model(model);
}
precache_model(g_szGrenadeModel[0]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Grenade", "MODEL_P", g_aGrenadeModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_P", g_szGrenadeModel[1], charsmax(g_szGrenadeModel[])))
{
g_szGrenadeModel[1] = "models/ttt/p_hegrenade.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_P", g_szGrenadeModel[1]);
precache_model(g_szGrenadeModel[1]);
ArrayPushString(g_aGrenadeModels, g_szGrenadeModel[1]);
}
else
{
ArrayGetString(g_aGrenadeModels, 1, model, charsmax(model));
precache_model(model);
}
precache_model(g_szGrenadeModel[1]);

if(!amx_load_setting_string_arr(TTT_SETTINGSFILE, "Grenade", "MODEL_W", g_aGrenadeModels))
if(!amx_load_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_W", g_szGrenadeModel[2], charsmax(g_szGrenadeModel[])))
{
g_szGrenadeModel[2] = "models/ttt/w_hegrenade.mdl";
amx_save_setting_string(TTT_SETTINGSFILE, "Grenade", "MODEL_W", g_szGrenadeModel[2]);
precache_model(g_szGrenadeModel[2]);
ArrayPushString(g_aGrenadeModels, g_szGrenadeModel[2]);
}
else
{
ArrayGetString(g_aGrenadeModels, 2, model, charsmax(model));
precache_model(model);
}
precache_model(g_szGrenadeModel[2]);
// END

new i;
for(i = 0; i <= charsmax(g_szCrowbarSound); i++)
precache_sound(g_szCrowbarSound[i]);

Expand Down Expand Up @@ -150,42 +110,32 @@ public plugin_init()
register_forward(FM_EmitSound, "Forward_EmitSound_pre", 0);
register_forward(FM_GetGameDescription, "Forward_GetGameDescription_pre", 0);

RegisterHam(Ham_Spawn, "player", "Ham_Spawn_post", 1, true);
RegisterHamPlayer(Ham_Spawn, "Ham_Spawn_post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_knife", "Ham_Knife_Deploy_post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_hegrenade", "Ham_Knife_Deploy_post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_hegrenade", "Ham_He_Deploy_post", 1);

for(i = 0; i <= charsmax(g_szWeaponsList); i++)
{
DisableHamForward((g_HamPrimaryAttack[i] = RegisterHam(Ham_Weapon_PrimaryAttack, g_szWeaponsList[i], "Ham_BlockWeapon_post", 1)));
DisableHamForward((g_HamSecondaryAttack[i] = RegisterHam(Ham_Weapon_SecondaryAttack, g_szWeaponsList[i], "Ham_BlockWeapon_post", 1)));
DisableHamForward((g_HamItemDeploy[i] = RegisterHam(Ham_Item_Deploy, g_szWeaponsList[i], "Ham_BlockWeapon_post", 1)));
}
register_clcmd("drop", "clcmd_drop");
}

public cswa_killed(ent, victim, killer)
public clcmd_drop(id)
{
ttt_set_playerdata(victim, PD_KILLEDBYITEM, get_weapon_edict(ent, REPL_CSWA_ITEMID));
if(get_user_weapon(id) == CSW_C4)
return PLUGIN_HANDLED;

return PLUGIN_CONTINUE;
}

public ttt_gamemode(gamemode)
public cswa_killed(ent, victim, killer)
{
if(gamemode == PREPARING)
my_ham_hooks(true);
else if(gamemode == STARTED || gamemode == OFF)
my_ham_hooks(false);
ttt_set_playerdata(victim, PD_KILLEDBYITEM, get_weapon_edict(ent, REPL_CSWA_ITEMID));
}

public grenade_throw(id, ent, nade)
{
if(nade == CSW_HEGRENADE && is_user_alive(id))
{
if(entity_get_float(ent, EV_FL_dmgtime) != 0.0)
{
static model[TTT_MAXFILELENGHT];
if(!model[0])
ArrayGetString(g_aGrenadeModels, 2, model, charsmax(model));
entity_set_model(ent, model);
}
entity_set_model(ent, g_szGrenadeModel[2]);
}
}

Expand Down Expand Up @@ -233,21 +183,24 @@ public Forward_EmitSound_pre(id, channel, sample[])

if((equal(sample, "player/die", 10) || equal(sample, "player/death6.wav")) && !is_user_alive(id) && ttt_get_playerdata(id, PD_KILLEDBYITEM) > -1)
return FMRES_SUPERCEDE;
if(equal(sample, "weapons/knife_", 14))

if(g_iKnifeID == -1)
{
new knife = ttt_knife_holding(id, 0), temp = ttt_knife_holding(id, 1);
if(!knife && (!temp || temp))
new name[TTT_ITEMLENGHT];
formatex(name, charsmax(name), "%L", LANG_SERVER, "TTT_ITEM_ID11");
g_iKnifeID = ttt_get_item_id(name);
}

if(equal(sample, "weapons/knife_", 14) && ttt_get_playerdata(id, PD_HOLDINGITEM) != g_iKnifeID)
{
switch(sample[17])
{
switch(sample[17])
{
case('b'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);
case('w'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[1], 1.0, ATTN_NORM, 0, PITCH_LOW);
case('s'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[3], 1.0, ATTN_NORM, 0, PITCH_NORM);
case('1', '2'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[2], random_float(0.5, 1.0), ATTN_NORM, 0, PITCH_NORM);
}
return FMRES_SUPERCEDE;
case('b'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[0], 1.0, ATTN_NORM, 0, PITCH_NORM);
case('w'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[1], 1.0, ATTN_NORM, 0, PITCH_LOW);
case('s'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[3], 1.0, ATTN_NORM, 0, PITCH_NORM);
case('1', '2'): emit_sound(id, CHAN_WEAPON, g_szCrowbarSound[2], random_float(0.5, 1.0), ATTN_NORM, 0, PITCH_NORM);
}
return FMRES_SUPERCEDE;
}

return FMRES_IGNORED;
Expand All @@ -265,44 +218,22 @@ public Ham_Spawn_post(id)
}
}

public Ham_BlockWeapon_post(const ent)
{
new Float:time = get_roundtime()*(-1.0);
set_pdata_float(ent, m_flNextPrimaryAttack, time, LINUX_WEAPON_OFF);
set_pdata_float(ent, m_flNextSecondaryAttack, time, LINUX_WEAPON_OFF);
}

public Ham_Knife_Deploy_post(ent)
{
new id = get_weapon_owner(ent);
if(is_user_alive(id))
{
static model[TTT_MAXFILELENGHT];
ArrayGetString(g_aCrowbarModels, 0, model, charsmax(model));
entity_set_string(id, EV_SZ_viewmodel, model);
ArrayGetString(g_aCrowbarModels, 1, model, charsmax(model));
entity_set_string(id, EV_SZ_weaponmodel, model);
entity_set_string(id, EV_SZ_viewmodel, g_szCrowbarModel[0]);
entity_set_string(id, EV_SZ_weaponmodel, g_szCrowbarModel[1]);
}
}

my_ham_hooks(val)
public Ham_He_Deploy_post(ent)
{
if(val)
{
for(new i = 0; i <= charsmax(g_szWeaponsList); i++)
{
EnableHamForward(g_HamPrimaryAttack[i]);
EnableHamForward(g_HamSecondaryAttack[i]);
EnableHamForward(g_HamItemDeploy[i]);
}
}
else
new id = get_weapon_owner(ent);
if(is_user_alive(id))
{
for(new i = 0; i <= charsmax(g_szWeaponsList); i++)
{
DisableHamForward(g_HamPrimaryAttack[i]);
DisableHamForward(g_HamSecondaryAttack[i]);
DisableHamForward(g_HamItemDeploy[i]);
}
entity_set_string(id, EV_SZ_viewmodel, g_szGrenadeModel[0]);
entity_set_string(id, EV_SZ_weaponmodel, g_szGrenadeModel[1]);
}
}
74 changes: 33 additions & 41 deletions scripting/ttt_round_winner.sma
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,16 @@
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <fun>
#include <ttt>
#include <round_terminator>
#include <amx_settings_api>

#define TASK_ROUNDEND 1111

new g_iWonGame;
new g_iWonScore[Special], g_pWonForward, cvar_karma_win;
new g_iWonScore[PLAYER_CLASS], g_pWonForward, cvar_karma_win;

new g_szWinSounds[3][TTT_MAXFILELENGHT];
new g_szWinSounds[3][TTT_FILELENGHT];
new const g_szWinner[][] =
{
"",
Expand Down Expand Up @@ -45,8 +44,7 @@ public plugin_init()
cvar_karma_win = my_register_cvar("ttt_karma_win", "20");
register_message(get_user_msgid("TextMsg"), "Message_Winner");

RegisterHam(Ham_Spawn, "player", "Ham_Spawn_post", 1, true);
RegisterHam(Ham_Killed, "player", "Ham_Killed_post", 1, true);
RegisterHamPlayer(Ham_Killed, "Ham_Killed_post", 1);
g_pWonForward = CreateMultiForward("ttt_winner", ET_IGNORE, FP_CELL);
}

Expand All @@ -59,26 +57,26 @@ public plugin_natives()

public ttt_gamemode(gamemode)
{
if(gamemode != STARTED && task_exists(TASK_ROUNDEND))
if(gamemode != GAME_STARTED && task_exists(TASK_ROUNDEND))
remove_task(TASK_ROUNDEND);

switch(gamemode)
{
case RESTARTING:
case GAME_RESTARTING:
{
g_iWonGame = false;
g_iWonScore[DETECTIVE] = 0;
g_iWonScore[TRAITOR] = 0;
g_iWonScore[PC_DETECTIVE] = 0;
g_iWonScore[PC_TRAITOR] = 0;
}
case PREPARING: set_task(floatmul(get_pcvar_float(get_cvar_pointer("mp_roundtime")), 60.0) + get_pcvar_float(get_cvar_pointer("ttt_preparation_time")), "End_Round_False", TASK_ROUNDEND);
case GAME_PREPARING: set_task(floatmul(get_pcvar_float(get_cvar_pointer("mp_roundtime")), 60.0) + get_pcvar_float(get_cvar_pointer("ttt_preparation_time")), "End_Round_False", TASK_ROUNDEND);
}

// set_task(0.2, "Update_Scores");
}

public client_disconnect(id)
{
if(ttt_get_game_state() == STARTED && get_winner(0))
if(ttt_get_gamemode() == GAME_STARTED && get_winner(0))
{
//new alive, num;
//static players[32];
Expand All @@ -92,7 +90,7 @@ public client_disconnect(id)

public client_putinserver(id)
{
if(ttt_get_game_state() == OFF || ttt_get_game_state() == UNSET)
if(ttt_get_gamemode() == GAME_OFF || ttt_get_gamemode() == GAME_UNSET)
{
new total, alive;
static players[32];
Expand All @@ -104,15 +102,9 @@ public client_putinserver(id)
}
}

public Ham_Spawn_post(id)
{
if(is_user_alive(id) && ttt_get_game_state() == PREPARING)
set_user_godmode(id, 1);
}

public Ham_Killed_post(victim, killer)
{
if(ttt_get_special_count(TRAITOR) == 0 && ttt_get_special_alive(victim) == TRAITOR)
if(ttt_get_specialcount(PC_TRAITOR) == 0 && ttt_get_alivestate(victim) == PC_TRAITOR)
{
new bomb = -1, count;
while((bomb = find_ent_by_model(-1, "grenade", "models/w_c4.mdl")) != 0)
Expand All @@ -130,9 +122,9 @@ public Ham_Killed_post(victim, killer)

public End_Round_False()
{
new mode = ttt_get_game_state();
if(mode == STARTED || mode == OFF || mode == UNSET)
TerminateRound(RoundEndType_TeamExtermination, DETECTIVE, MapType_Bomb);
new mode = ttt_get_gamemode();
if(mode == GAME_STARTED || mode == GAME_OFF || mode == GAME_UNSET)
TerminateRound(RoundEndType_TeamExtermination, PC_DETECTIVE, MapType_Bomb);
}

public get_winner(type)
Expand All @@ -144,36 +136,36 @@ public get_winner(type)
if(num == 0)
{
//log_amx("END by NUM %d", num);
who = TRAITOR;
who = PC_TRAITOR;
}
else if(ttt_get_special_count(DETECTIVE) == 0 && ttt_get_special_count(INNOCENT) == 0)
else if(ttt_get_specialcount(PC_DETECTIVE) == 0 && ttt_get_specialcount(PC_INNOCENT) == 0)
{
//log_amx("END by COUNT1 %d, %d", ttt_get_special_count(DETECTIVE), ttt_get_special_count(INNOCENT));
who = TRAITOR;
//log_amx("END by COUNT1 %d, %d", ttt_get_specialcount(PC_DETECTIVE), ttt_get_specialcount(PC_INNOCENT));
who = PC_TRAITOR;
}
else if(ttt_get_special_count(TRAITOR) == 0)
else if(ttt_get_specialcount(PC_TRAITOR) == 0)
{
//log_amx("END by COUNT2 %d", ttt_get_special_count(TRAITOR));
who = DETECTIVE;
//log_amx("END by COUNT2 %d", ttt_get_specialcount(PC_TRAITOR));
who = PC_DETECTIVE;
}

if(type && who > 0)
{
new id, specstate;
new id, specstate, cvar = get_pcvar_num(cvar_karma_win);
for(--num; num >= 0; num--)
{
id = players[num];
specstate = ttt_get_special_state(id);
if(specstate == who || (who == DETECTIVE && specstate == INNOCENT))
ttt_set_playerdata(id, PD_KARMATEMP, ttt_get_playerdata(id, PD_KARMATEMP)+get_pcvar_num(cvar_karma_win));
specstate = ttt_get_playerstate(id);
if(specstate == who || (who == PC_DETECTIVE && specstate == PC_INNOCENT))
ttt_set_playerdata(id, PD_KARMATEMP, ttt_get_playerdata(id, PD_KARMATEMP) + cvar);
}
}
return who;
}

public Message_Winner(msgid, dest, id)
{
if(g_iWonGame && ttt_get_game_state() != STARTED)
if(g_iWonGame && ttt_get_gamemode() != GAME_STARTED)
return PLUGIN_CONTINUE;

static message[20];
Expand All @@ -183,9 +175,9 @@ public Message_Winner(msgid, dest, id)
new who;
get_winner(1);
if(equal(message, "#Terrorists_Win"))
who = TRAITOR;
who = PC_TRAITOR;
else if(equal(message, "#CTs_Win"))
who = DETECTIVE;
who = PC_DETECTIVE;

if(!who)
who = get_winner(0);
Expand Down Expand Up @@ -216,12 +208,12 @@ public Update_Scores()

message_begin(MSG_BROADCAST, msg, _, 0);
write_string("TERRORIST");
write_short(g_iWonScore[TRAITOR]);
write_short(g_iWonScore[PC_TRAITOR]);
message_end();

message_begin(MSG_BROADCAST, msg, _, 0);
write_string("CT");
write_short(g_iWonScore[DETECTIVE]);
write_short(g_iWonScore[PC_DETECTIVE]);
message_end();

g_iWonGame = false;
Expand All @@ -233,11 +225,11 @@ public _get_winner()
public _set_winner(plugin, params)
{
if(params != 1)
return ttt_log_to_file(LOG_ERROR, "Wrong number of params (ttt_set_winner)");
return ttt_log_api_error("ttt_set_winner needs 1 param(p1: %d)", plugin, params, get_param(1));

new team = get_param(1);
if(team != TRAITOR && team != DETECTIVE)
return ttt_log_to_file(LOG_ERROR, "Team isn't Traitor or Detective (ttt_set_winner)");
if(team != PC_TRAITOR && team != PC_DETECTIVE)
return ttt_log_api_error("ttt_set_winner team isn't Traitor or Detective, team: %d", plugin, params, team);

TerminateRound(RoundEndType_TeamExtermination, team);
return 1;
Expand Down
11 changes: 9 additions & 2 deletions scripting/ttt_rules.sma
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,17 @@ public plugin_init()
strtok(right, left, charsmax(left), right, charsmax(right), ''');
ArrayPushString(g_aFileName, left);
}
}
}
while(next_file(handle, filename, charsmax(filename)));
close_dir(handle);
}

public plugin_end()
{
ArrayDestroy(g_aFilePath);
ArrayDestroy(g_aFileName);
}

public client_putinserver(id)
{
static out[2];
Expand All @@ -55,7 +61,8 @@ public ttt_rules_show(id)
new menu = menu_create("\rRules", "ttt_rules_handler");

static data[5], option[20];
for(new i = 0; i < ArraySize(g_aFileName); i++)
new size = ArraySize(g_aFileName);
for(new i = 0; i < size; i++)
{
ArrayGetString(g_aFileName, i, option, charsmax(option));
num_to_str(i, data, charsmax(data));
Expand Down
6 changes: 3 additions & 3 deletions scripting/ttt_say_team.sma
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public hook_sayteam(id)
if(message[0] == '@' || equal(message, "") || equal(message, " "))
return PLUGIN_HANDLED;

new spec = ttt_get_special_state(id);
if(spec == TRAITOR || spec == DETECTIVE)
new spec = ttt_get_playerstate(id);
if(spec == PC_TRAITOR || spec == PC_DETECTIVE)
{
static chat[192], name[32];
get_user_name(id, name, charsmax(name));
Expand All @@ -30,7 +30,7 @@ public hook_sayteam(id)
for(--num; num >= 0; num--)
{
i = players[num];
if(ttt_get_special_state(i) != spec) continue;
if(ttt_get_playerstate(i) != spec) continue;

message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, i);
write_byte(id);
Expand Down
65 changes: 35 additions & 30 deletions scripting/ttt_show_infos.sma
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ public plugin_init()
register_clcmd("say /tttme", "ttt_show_me");
register_clcmd("say_team /tttme", "ttt_show_me");

RegisterHam(Ham_Killed, "player", "Ham_Killed_pre", 0, true);
RegisterHamPlayer(Ham_Killed, "Ham_Killed_pre", 0);
}

public ttt_gamemode(gamemode)
{
if(gamemode == PREPARING || gamemode == RESTARTING)
if(gamemode == GAME_PREPARING || gamemode == GAME_RESTARTING)
{
new num, id;
static players[32];
Expand Down Expand Up @@ -86,14 +86,14 @@ public ttt_winner(team)

public ttt_showinfo(id, target)
{
new mode = ttt_get_game_state();
if(!is_user_alive(target) && is_user_alive(id) && mode != ENDED && mode != OFF)
new mode = ttt_get_gamemode();
if(!is_user_alive(target) && is_user_alive(id) && mode != GAME_ENDED && mode != GAME_OFF)
show_motd_info(id, target);
}

public ttt_show_me(id)
{
if(ttt_get_game_state() == OFF)
if(ttt_get_gamemode() == GAME_OFF)
return;

if(!is_user_alive(id))
Expand All @@ -105,7 +105,7 @@ public ttt_show_me(id)
len += formatex(msg[len], SIZE - len, "<html><head><meta charset='utf-8'><style>body{background:#ebf3f8 no-repeat center top;}</style></head><body>");
len += formatex(msg[len], SIZE - len, "</br><center><h2>%L</h2></center>", id, "TTT_WINNER_LINE7");

new num, player, count;
new num, player, count, alive_state;
static players[32];
get_players(players, num);
for(--num; num >= 0; num--)
Expand All @@ -114,7 +114,8 @@ public ttt_show_me(id)
if(g_iKilledWho[id][player])
{
count++;
len += formatex(msg[len], SIZE - len, "[%L] %n</br>", id, special_names[ttt_get_special_alive(player)], player);
alive_state = ttt_get_alivestate(player);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>[%L] %n</b></br>", g_szColors[alive_state], id, special_names[alive_state], player);
}
}

Expand All @@ -128,16 +129,16 @@ public ttt_show_me(id)

public Ham_Killed_pre(victim, killer, shouldgib)
{
if(!is_user_connected(victim) || !is_user_connected(killer) || ttt_get_game_state() == ENDED)
if(!is_user_connected(victim) || !is_user_connected(killer) || ttt_get_gamemode() == GAME_ENDED)
return HAM_IGNORED;

g_iKilledWho[killer][victim] = true;
g_iKilledWho[killer][victim] = ttt_get_alivestate(victim);
return HAM_HANDLED;
}

public show_motd_winner(id)
{
if(!is_user_connected(id) || ttt_get_game_state() == OFF)
if(!is_user_connected(id) || ttt_get_gamemode() == GAME_OFF)
return;

const SIZE = 1536;
Expand All @@ -153,13 +154,13 @@ public show_motd_winner(id)
{
i = players[num];

killedstate = ttt_get_special_alive(i);
killedstate = ttt_get_alivestate(i);
get_user_name(i, name, charsmax(name));

if(ttt_get_special_state(i) == TRAITOR || killedstate == TRAITOR)
if(ttt_get_playerstate(i) == PC_TRAITOR || killedstate == PC_TRAITOR)
format(Traitors, charsmax(Traitors), "%s, %s", name, Traitors);

if(ttt_get_special_state(i) == DETECTIVE || killedstate == DETECTIVE)
if(ttt_get_playerstate(i) == PC_DETECTIVE || killedstate == PC_DETECTIVE)
format(Detectives, charsmax(Detectives), "%s, %s", name, Detectives);

if(ttt_get_playerdata(i, PD_KILLEDBY) == 3005)
Expand All @@ -170,8 +171,8 @@ public show_motd_winner(id)

if(ttt_get_playerdata(i, PD_KILLCOUNT) > highest)
{
if(ttt_get_special_state(i) != DEAD)
zum = ttt_get_special_state(i);
if(ttt_get_playerstate(i) != PC_DEAD)
zum = ttt_get_playerstate(i);
else zum = killedstate;

highest = ttt_get_playerdata(i, PD_KILLCOUNT);
Expand All @@ -192,29 +193,29 @@ public show_motd_winner(id)
c4[strlen(c4)-2] = '^0';

new winner = ttt_get_winner();
if(winner == DETECTIVE)
if(winner == PC_DETECTIVE)
winner++;

if(winner == TRAITOR)
if(winner == PC_TRAITOR)
formatex(out, charsmax(out), "%L", LANG_SERVER, "TTT_TWIN");
else if(winner == INNOCENT)
else if(winner == PC_INNOCENT)
formatex(out, charsmax(out), "%L", LANG_SERVER, "TTT_IWIN");

len += formatex(msg[len], SIZE - len, "<html><head><meta charset='utf-8'><style>body{background:#ebf3f8 url('gfx/ttt/%d.gif') no-repeat center top;}</style></head><body>", winner);
len += formatex(msg[len], SIZE - len, "</br><center><h1>%s</h1></center>", out);

if(strlen(Detectives) > 0)
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L: %s</b><br/>", g_szColors[DETECTIVE], LANG_SERVER, special_names[DETECTIVE], Detectives);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L: %s</b><br/><br/>", g_szColors[TRAITOR], LANG_SERVER, special_names[TRAITOR], Traitors);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L: %s</b><br/>", g_szColors[PC_DETECTIVE], LANG_SERVER, special_names[PC_DETECTIVE], Detectives);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L: %s</b><br/><br/>", g_szColors[PC_TRAITOR], LANG_SERVER, special_names[PC_TRAITOR], Traitors);

if(strlen(kills) > 0)
len += formatex(msg[len], SIZE - len, "%s<br/>", kills);

if(strlen(suicide) > 0)
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L<br/>", g_szColors[SPECIAL], LANG_SERVER, "TTT_WINNER_LINE2", suicide);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L<br/>", g_szColors[PC_SPECIAL], LANG_SERVER, "TTT_WINNER_LINE2", suicide);

if(strlen(c4) > 0)
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L<br/>", g_szColors[SPECIAL], LANG_SERVER, "TTT_WINNER_LINE3", c4);
len += formatex(msg[len], SIZE - len, "<b style='color:%s'>%L<br/>", g_szColors[PC_SPECIAL], LANG_SERVER, "TTT_WINNER_LINE3", c4);

formatex(motdname, charsmax(motdname), "%L", LANG_SERVER, "TTT_WINNER_LINE1");
g_iCached[0] = true;
Expand All @@ -223,8 +224,8 @@ public show_motd_winner(id)
len = staticsize;
formatex(wholemsg, charsmax(msg), "%s", msg);

len += formatex(wholemsg[len], SIZE - len, "%L</br>", LANG_SERVER, "TTT_WINNER_LINE7");
new num, player, count;
// len += formatex(wholemsg[len], SIZE - len, "%L</br>", LANG_SERVER, "TTT_WINNER_LINE7");
new num, player, count, alive_state;
static players[32];
get_players(players, num);
for(--num; num >= 0; num--)
Expand All @@ -233,14 +234,15 @@ public show_motd_winner(id)
if(g_iKilledWho[id][player])
{
count++;
len += formatex(wholemsg[len], SIZE - len, "%L [%L] %n</br>", LANG_SERVER, "TTT_WINNER_LINE7", LANG_SERVER, special_names[ttt_get_special_alive(player)], player);
alive_state = ttt_get_alivestate(player);
len += formatex(wholemsg[len], SIZE - len, "%L <b style='color:%s'>[%L] %n</b></br>", LANG_SERVER, "TTT_WINNER_LINE7", g_szColors[alive_state], LANG_SERVER, special_names[alive_state], player);
}
}

if(!count) formatex(wholemsg[len], SIZE - len, "%L", id, "TTT_WINNER_LINE6");

new karma = ttt_get_playerdata(id, PD_KARMA), karmatemp = ttt_get_playerdata(id, PD_KARMATEMP);
zum = ttt_get_special_alive(id);
zum = ttt_get_alivestate(id);
len += formatex(wholemsg[len], SIZE - len, "%L<br/>", LANG_SERVER, "TTT_WINNER_LINE5", g_szColors[zum], karma, g_szColors[zum], karmatemp-karma, g_szColors[zum], karmatemp);
len += formatex(wholemsg[len], SIZE - len, "</body></html>");

Expand All @@ -250,24 +252,27 @@ public show_motd_winner(id)

public show_motd_info(id, target)
{
static name[32], killmsg[64];
get_user_name(target, name, charsmax(name));
static name[2][32], killmsg[64];
get_user_name(target, name[0], charsmax(name[]));
new minutes = (ttt_get_playerdata(target, PD_KILLEDTIME) / 60) % 60;
new seconds = ttt_get_playerdata(target, PD_KILLEDTIME) % 60;
ttt_get_kill_message(target, ttt_get_playerdata(target, PD_KILLEDBY), killmsg, charsmax(killmsg), 0);

const SIZE = 1536;
static msg[SIZE+1], motdname[64];
new len, killedstate = ttt_get_special_alive(target);
new len, killedstate = ttt_get_alivestate(target);
if(killedstate > 3)
killedstate = 0;

len += formatex(msg[len], SIZE - len, "<html><head><meta charset='utf-8'><style>body{background:#ebf3f8 url('gfx/ttt/%d.gif') no-repeat center top;}</style></head><body>", killedstate);
len += formatex(msg[len], SIZE - len, "</br><center><h1>%L %s</h1>", id, special_names[killedstate], name);
len += formatex(msg[len], SIZE - len, "</br><center><h1>%L %s</h1>", id, special_names[killedstate], name[0]);
len += formatex(msg[len], SIZE - len, "<h1>%L</h1>", id, "TTT_INFO_LINE3", g_szColors[killedstate], ttt_get_bodydata(target, BODY_TIME));
len += formatex(msg[len], SIZE - len, "%L <img src='gfx/ttt/%s.gif'></center>", id, "TTT_INFO_LINE2", g_szColors[killedstate], minutes, seconds, killmsg);
len += formatex(msg[len], SIZE - len, "</body></html>");
formatex(motdname, charsmax(motdname), "%L", id, "TTT_INFO_LINE1");

show_motd(id, msg, motdname);

get_user_name(id, name[1], charsmax(name[]));
ttt_log_to_file(LOG_MISC, "%s inspected dead of %s", name[1], name[0]);
}