Jestem początkującą osobą, nie mam pojęcia co odpowiada czemu. Prosiłbym o pomoc przy edycji kodu/kodów tak, aby pozbyć się rozrzutu kulek, tzw. Zacinania się broni, sprintu itp. Chce tylko czyste bronie. Bez żadnych menu itp. Chodzi mi o to, aby jeśli ktoś np podniesie/kupi/dostanie scouta, to dostawał jego PaintBallowy odpowiednik z odpowiednim modelem, kulkami jak i soundem.
Kody:
paintbalmod.sma
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#define PLUGIN "R Paintball Mod"
#define VERSION "5.8b"
#define TASK_DELAY 0.1 // The delay between model changing tasks
#define MODELSET_TASK 3000 // offset for the models task
#define MENU_TASK 3500
new onoff, cmodel, money, strip, death, protc, pbgun, pbnade, pbsnade, randomgun, maxplayers, vendetta, vendetta_cant;
new g_team_select[33], g_plyr_skin[33], g_has_kill[33];
new MenuState[33]
new ShowMenu[33]
new g_has_custom_model[33] // whether the player is using a custom model
new g_team[33]
new got_killed_by[33], vendetta_bonus[33], got_killed_times[33], in_vendetta[33]
new pbslauncher, got_slauncher;
new Float:g_models_counter // counter used to set task durations
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("rpaintballmod", VERSION, FCVAR_SERVER|FCVAR_UNLOGGED);
set_cvar_string("rpaintballmod", VERSION)
if (get_pcvar_num(onoff))
{
register_logevent("new_round", 2, "0=World triggered", "1=Round_Start");
register_event("ResetHUD", "ev_resethud", "be");
register_event("DeathMsg", "ev_death", "a")
register_event("Money", "ev_money", "be");
register_clcmd("say /respawn", "say_respawn", _, "<Respawns you if enabled>");
register_clcmd("say pbguns", "enableMenu")
register_clcmd("say /pbguns", "enableMenu")
register_forward(FM_GetGameDescription, "fw_gamedesc");
register_forward(FM_SetModel, "fw_setmodel", 1);
if (get_pcvar_num(cmodel))
{
register_forward(FM_ClientUserInfoChanged, "fw_clientuserinfochanged");
register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
//register_message(get_user_msgid("ClCorpse"), "spawn_clcorpse")
//set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET);
}
maxplayers = get_maxplayers();
//initialize the menu
for (new a = 0; a < 33; a++)
{
ShowMenu[a] = 1;
in_vendetta[a] = 0
got_killed_by[a] = -1
got_killed_times[a] = 0
}
//load the config
new file[64]
get_configsdir(file, 63)
format(file, 63, "%s/rpaintball.cfg", file)
if(file_exists(file))
server_cmd("exec %s", file)
}
}
public plugin_precache()
{
onoff = register_cvar("amx_pbmod", "1");
pbgun = register_cvar("amx_pbgun", "1");
pbnade = register_cvar("amx_pbnade", "1");
pbsnade = register_cvar("amx_pbsnade", "1");
if (get_pcvar_num(onoff)){
cmodel = register_cvar("amx_pbmodel", "1");
money = register_cvar("amx_pbmoney", "1");
strip = register_cvar("amx_pbstrip", "1");
death = register_cvar("amx_pbdm", "0");
protc = register_cvar("amx_pbspawnprotect", "5");
randomgun = register_cvar("pbgun_selectmode", "1");
vendetta = register_cvar("pbgun_vendetta_enabled", "1");
vendetta_cant = register_cvar("pbgun_vendetta_cant", "3");
pbslauncher = register_cvar("pbgun_pbslauncher", "1");
if (get_pcvar_num(cmodel))
precache_model("models/player/paintballer/paintballer.mdl");
}
}
public fw_gamedesc()
{
if (get_pcvar_num(onoff))
{
forward_return(FMV_STRING, PLUGIN);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public new_round()
{
if (get_pcvar_num(onoff) && get_pcvar_num(strip))
{
new ent;
while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "armoury_entity")) != 0)
engfunc(EngFunc_RemoveEntity, ent);
}
// Reset the models task counter
g_models_counter = 0.0
select_new_slauncher()
}
public select_new_slauncher()
{
new original = got_slauncher
got_slauncher++
while((!is_user_connected(got_slauncher) && !is_user_bot(got_slauncher) && got_slauncher != original))
{
got_slauncher++
if (got_slauncher > 32)
got_slauncher = 0
}
//client_print(0, print_chat, "%d got it", got_slauncher)
}
public ev_resethud(id)
{
if (get_pcvar_num(onoff))
{
if (!task_exists(id))
set_task(0.3, "player_spawn", id);
}
}
public player_spawn(id)
if (is_user_alive(id))
{
if (get_pcvar_num(protc))
{
set_pev(id, pev_takedamage, DAMAGE_NO);
set_task(float(get_pcvar_num(protc)), "player_godmodeoff", id+100);
}
if (get_pcvar_num(strip)) //&& !user_has_mp5(id))
{
if (pev(id, pev_weapons) & (1 << CSW_C4))
engclient_cmd(id, "drop", "weapon_c4")
fm_strip_user_weapons(id);
}
if (get_pcvar_num(money))
{
message_begin(MSG_ONE_UNRELIABLE, 94, _, id);
write_byte(1 << 5);
message_end();
}
if (get_pcvar_num(cmodel))
{
set_task(0.1 + g_models_counter, "task_set_model", id+MODELSET_TASK)
g_models_counter += TASK_DELAY
}
remove_task(id);
set_task(random_float(0.9, 1.3), "player_weapons", id);
set_task(2.0, "clear_moneyhud", id + 300);
}
public client_command(id)
if (get_pcvar_num(cmodel))
{
new command[10], speech[2];
read_argv(0, command, 9);
read_argv(1, speech, 1);
if (containi(command, "join") != -1)
if (equali(command, "jointeam"))
g_team_select[id] = str_to_num(speech);
else if (equali(command, "joinclass"))
g_plyr_skin[id] = (g_team_select[id] == 1) ? str_to_num(speech) - 1: str_to_num(speech) + 3;
}
public player_weapons(id)
if (is_user_alive(id))
{
menu_cancel(id)
if(in_vendetta[id])
{
new kname[32]; get_user_name(got_killed_by[id],kname,31);
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 5.0, 5.0);
show_hudmessage(id, "You took %s's gow** poraz ostatni.. to jest wandeta!!!", kname);
}
set_pdata_int(id, 386, 120, 5);
fm_give_item(id, "weapon_knife");
if (get_user_team(id) == 1)
fm_give_item(id, "weapon_glock18");
else
{
set_pdata_int(id, 382, 48, 5);
fm_give_item(id, "weapon_usp");
}
if (get_pcvar_num(pbgun) && !vendetta_bonus[id]){
if (get_pcvar_num(randomgun)==1){
if(is_user_bot(id))
{
ShowMenu[id] = false;
MenuState[id] = random(4);
}
if (ShowMenu[id])
launchMenu(id);
else
{
give_menu_weapon(id, MenuState[id]);
client_print(id, print_chat, "[RPaintballMod] nie masz menu broni ? wpisz /pbguns i poczekaj runde!.")
}
}
else
{
new choose;
if (get_pcvar_num(randomgun)==2){
choose = random(4);
if (random(20)==0){
fm_give_item(id, "weapon_p90");
cs_set_user_bpammo(id, CSW_P90, 300);
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 5.0, 5.0);
show_hudmessage(id, "Masz Szczescie ! masz a SUPER MARKER!!!!");
}
else
switch (choose)
{
case 0: fm_give_item(id, "weapon_mp5navy");
case 1: fm_give_item(id, "weapon_scout");
case 2: fm_give_item(id, "weapon_m3");
case 3: fm_give_item(id, "weapon_xm1014");
default: fm_give_item(id, "weapon_mp5navy");
}
cs_set_user_bpammo(id, CSW_MP5NAVY, 150);
cs_set_user_bpammo(id, CSW_SCOUT, 20);
cs_set_user_bpammo(id, CSW_M3, 16);
cs_set_user_bpammo(id, CSW_XM1014, 80);
cs_set_user_bpammo(id, CSW_P90, 300);
}else
{
//always gets a marker
fm_give_item(id, "weapon_mp5navy");
cs_set_user_bpammo(id, CSW_MP5NAVY, 150);
//did not kill someone, has a chance of getting a shotgun
choose = random(3);
if (!g_has_kill[id] && !choose){
fm_give_item(id, "weapon_xm1014");
cs_set_user_bpammo(id, CSW_XM1014, 80);
}
//killed 2 or more, gets a sniper or a launcher
choose = random(2);
if (g_has_kill[id]>2)
if (g_has_kill[id]>4){
fm_give_item(id, "weapon_p90");
cs_set_user_bpammo(id, CSW_P90, 300);
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 5.0, 5.0);
show_hudmessage(id, "o Kur**! masz SUPER MARKER!!!!");
}
else
if (choose){
fm_give_item(id, "weapon_scout");
cs_set_user_bpammo(id, CSW_SCOUT, 20);
}else
{
fm_give_item(id, "weapon_m3");
cs_set_user_bpammo(id, CSW_M3, 16);
}
g_has_kill[id] = 0;
}
}
}
if(vendetta_bonus[id] == 1)
{
fm_give_item(id, "weapon_p90");
cs_set_user_bpammo(id, CSW_P90, 300);
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 5.0, 5.0);
show_hudmessage(id, "Niemozliwe! dostal SUPER MARKER!!!!");
}
if(vendetta_bonus[id] == -1)
{
vendetta_bonus[id] = 0
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 5.0, 5.0);
show_hudmessage(id, "Haha! You got punk'd and didn't get a main gun this round!!!!");
}
if (get_pcvar_num(pbnade))
fm_give_item(id, "weapon_hegrenade");
if (get_pcvar_num(pbsnade))
fm_give_item(id, "weapon_smokegrenade");
if (get_pcvar_num(pbslauncher) && id == got_slauncher)
{
new kname[32]; get_user_name(id,kname,31);
new teamname[3][] = {"None", "Red Team", "Blue Team"};
set_hudmessage(255, 255, 255, -1.0, 0.7, 0, 5.0, 5.0);
show_hudmessage(0, "%s: %s dostal Super Launchera (Flesh), UWAGA!!!!", teamname[get_user_team(id)], kname);
//client_print(0, print_chat, "%s: %s dostal Super Launchera (Flesh), UWAGA!!!!", teamname[get_user_team(id)], kname)
fm_give_item(id, "weapon_flashbang");
//fm_give_item(id, "weapon_flashbang");
if (get_pcvar_num(death))
select_new_slauncher()
}
remove_task(id);
}
public clear_moneyhud(id)
if (get_pcvar_num(money))
{
message_begin(MSG_ONE_UNRELIABLE, 94, _, id - 300); //HideWeapon
write_byte(1 << 5);
message_end();
}
public ev_death()
{
new killer = read_data(1);
new victim = read_data(2);
g_has_kill[killer] += 1;
if (get_pcvar_num(death))
{
new id = victim + 200;
set_task(3.0, "player_spawner", id);
set_task(3.2, "player_spawner", id);
}
if (get_pcvar_num(vendetta) && killer != victim)
{
vendetta_bonus[victim] = 0
if (got_killed_by[victim] == killer)
{
got_killed_times[victim] += 1;
}
else
{
got_killed_by[victim] = killer;
got_killed_times[victim] = 1;
}
if (got_killed_times[victim] < get_pcvar_num(vendetta_cant))
in_vendetta[victim] = 0;
else
in_vendetta[victim] = 1;
if (got_killed_by[killer] == victim)
if (in_vendetta[killer])
{
in_vendetta[killer] = 0
vendetta_bonus[killer] = 1
vendetta_bonus[victim] = -1
got_killed_times[killer] = 0
got_killed_by[killer] = -1
new kname[32]; get_user_name(killer,kname,31);
set_hudmessage(255, 255, 255, -1.0, 0.4, 0, 5.0, 5.0);
show_hudmessage(0, "%s got VENDETTA!!!!", kname);
}
else
got_killed_times[killer] = 0
}
}
public ev_money(id)
if (get_pcvar_num(money))
if (get_pdata_int(id, 115, 5) > 0)
set_pdata_int(id, 115, 0, 5);
public say_respawn(id)
if (get_pcvar_num(death))
if (!is_user_alive(id))
if (get_user_team(id) == 1 || get_user_team(id) == 2)
{
set_task(1.5, "player_spawner", id + 200);
set_task(1.7, "player_spawner", id + 200);
}
public player_godmodeoff(id)
set_pev(id-100, pev_takedamage, DAMAGE_AIM);
public player_spawner(id)
if (is_user_connected(id - 200))
if (get_user_team(id - 200) == 1 || get_user_team(id - 200) == 2)
dllfunc(DLLFunc_Spawn, id - 200);
stock user_has_mp5(id)
{
new weapons[32], num;
get_user_weapons(id, weapons, num);
for (new i = 0; i < num; i++)
if (weapons[i] == CSW_MP5NAVY)
return 1;
return 0;
}
public fw_setmodel(ent, model[])
{
if (get_pcvar_num(death) && pev_valid(ent))
{
new id = pev(ent, pev_owner);
if ((!is_user_alive(id) || task_exists(id + 200)) && equali(model, "models/w_", 9) && !equali(model, "models/w_weaponbox.mdl"))
{
new classname[16];
pev(ent, pev_classname, classname, 15);
if (equal(classname, "weaponbox") && !equal(model, "models/w_backpack.mdl"))
for (new i = maxplayers + 1; i < engfunc(EngFunc_NumberOfEntities) + 5; i++)
if (pev_valid(i))
if (ent == pev(i, pev_owner))
{
dllfunc(DLLFunc_Think, ent);
return FMRES_IGNORED;
}
}
}
return FMRES_IGNORED;
}
public fw_clientuserinfochanged(id, infobuffer)
{
// return (get_pcvar_num(cmodel) && pev(id, pev_deadflag) == DEAD_NO) ? FMRES_SUPERCEDE : FMRES_IGNORED;
if (get_pcvar_num(cmodel) && (g_has_custom_model[id]))
{
if (g_team[id] != get_user_team(id))
g_has_custom_model[id] = 0;
// Get current model
static currentmodel[32]
engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", currentmodel, 31)
// Check whether it matches the custom model - if not, set it again
if (!equal(currentmodel, "paintballer") || g_has_custom_model[id] == 0)
{
set_task(0.1 + g_models_counter, "task_set_model", id+MODELSET_TASK)
g_models_counter += TASK_DELAY
}
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED
}
public fw_SetClientKeyValue(id, const infobuffer[], const key[])
{
// Block CS model changes
if (g_has_custom_model[id] && equal(key, "model"))
return FMRES_SUPERCEDE;
return FMRES_IGNORED;
}
////////*****************VEN STOCKS START*****************////////
stock fm_strip_user_weapons(index)
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"));
if (!pev_valid(ent))
return 0;
dllfunc(DLLFunc_Spawn, ent);
dllfunc(DLLFunc_Use, ent, index);
engfunc(EngFunc_RemoveEntity, ent);
return 1;
}
stock fm_give_item(index, const item[])
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item));
if (!pev_valid(ent))
return 0;
new Float:origin[3];
pev(index, pev_origin, origin);
engfunc(EngFunc_SetOrigin, ent, origin);
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, ent);
new save = pev(ent, pev_solid);
dllfunc(DLLFunc_Touch, ent, index);
if (pev(ent, pev_solid) != save)
return ent;
engfunc(EngFunc_RemoveEntity, ent);
return -1;
}
////////*****************VEN STOCKS END*****************////////
public enableMenu(id)
{
ShowMenu[id] = 1
client_print(id, print_chat, "[PaintballMod] Your equip menu has been re-enabled.")
return PLUGIN_HANDLED
}
public launchMenu(id)
{
new menu = menu_create("\rChoose your main Paintball Gun:", "menu_handler")
menu_additem(menu, "\wMarker", "0", 0)
menu_additem(menu, "\wShotgun", "1", 0)
menu_additem(menu, "\wLauncher", "2", 0)
menu_additem(menu, "\wSniper", "3", 0)
menu_additem(menu, "Ostatnio brana bron", "4", 0, -1)
menu_additem(menu, "Ostatnia bron + nie pokazuje menu", "5", 0, -1)
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, 0)
}
public menu_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)
new key = str_to_num(data);
if (key==4)
key = MenuState[id]
if(key == 5)
{
ShowMenu[id] = 0;
client_print(id, print_chat, "[RPaintballMod] Nie masz menu broni? wpisz /pbguns i poczekaj Runde.")
key = MenuState[id]
}
MenuState[id] = key
give_menu_weapon(id, MenuState[id]);
menu_destroy(menu)
return PLUGIN_HANDLED
}
public give_menu_weapon(id,key)
{
switch (key)
{
case 0: fm_give_item(id, "weapon_mp5navy");
case 1: fm_give_item(id, "weapon_xm1014");
case 2: fm_give_item(id, "weapon_m3");
case 3: fm_give_item(id, "weapon_scout");
default: fm_give_item(id, "weapon_mp5navy");
}
cs_set_user_bpammo(id, CSW_MP5NAVY, 150);
cs_set_user_bpammo(id, CSW_SCOUT, 20);
cs_set_user_bpammo(id, CSW_M3, 16);
cs_set_user_bpammo(id, CSW_XM1014, 80);
}
public task_set_model(id)
{
remove_task(id)
// Get player id
id -= MODELSET_TASK
// Actually set the player's model
set_user_model(id, "paintballer")
}
public set_user_model(player, const modelname[])
{
// Set new model
engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", modelname)
g_team[player] = get_user_team(player)
//if (!g_has_custom_model[player])
if (g_team[player] == 1)
{
g_plyr_skin[player] = 0//random(4);
}
else
{
g_plyr_skin[player] = 4 // + random(4);
}
set_pev(player, pev_skin, g_plyr_skin[player]);
g_has_custom_model[player] = 1
}
public spawn_clcorpse()
{
// Get player id
static id
id = get_msg_arg_int(12)
new entCorpse = read_data(2);
set_pev(entCorpse, pev_skin, g_plyr_skin[id]);
// Check if the player is using a custom player model
if (false && g_has_custom_model[id])
{
//client_print(0, print_chat, "spawning corpse for %d", id);
set_msg_arg_string(1, "")
new entCorpse = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if(entCorpse > 0)
{
new Float:modelOrigin[3], Float:modelAngle[3]
pev(id, pev_origin, modelOrigin)
pev(id, pev_angles, modelAngle)
client_print(0, print_chat, "corpse coords %f %f %f", float(get_msg_arg_int(2)), float(get_msg_arg_int(3)), float(get_msg_arg_int(4)));
client_print(0, print_chat, "corpse coords %i %i %i", get_msg_arg_int(2), get_msg_arg_int(3), get_msg_arg_int(4));
//client_print(0, print_chat, "corpse string %f %f %f", float(get_msg_arg_string(2)), float(get_msg_arg_string(3)), float(get_msg_arg_string(4)));
client_print(0, print_chat, "player coords %f %f %f", modelOrigin[0], modelOrigin[1], modelOrigin[2]);
// client_print(0, print_chat, "player %f %f %f", modelAngle[0], modelAngle[1], modelAngle[2]);
modelAngle[0] += 90.0
modelOrigin[2] -= 35.0
set_pev(entCorpse, pev_owner, id)
set_pev(entCorpse, pev_classname, "clcorpse")
engfunc(EngFunc_SetSize, entCorpse, Float:{-6.0,-12.0,-6.0},Float:{6.0,12.0,6.0})
engfunc(EngFunc_SetModel, entCorpse, "models/player/paintballer/paintballer.mdl");
set_pev(entCorpse, pev_skin, g_plyr_skin[id]);
set_pev(entCorpse, pev_solid, SOLID_NOT)
set_pev(entCorpse, pev_movetype, MOVETYPE_TOSS)
set_pev(entCorpse, pev_sequence, 103)
set_pev(entCorpse, pev_origin, modelOrigin)
set_pev(entCorpse, pev_angles, modelAngle)
set_pev(entCorpse, pev_v_angle, pev(id, pev_v_angle))
set_pev(entCorpse, pev_nextthink, 1.0)
}
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang11274\\ f0\\ fs16 \n\\ par }
*/
paintballgun.sma
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#define PLUGIN "R Paintball Gun"
#define VERSION "5.10"
#define MAX_PAINTBALLS 200
#define TASK_PB_RESET 1000
#define TASK_RELOAD 2000
#define TASK_NADE 5000
#define CROSSHAIR_REMOVED ( 1<<6 )
#define PB_MARKER 1
#define PB_USP 2
#define PB_GLOCK 3
#define PB_SNIPER 4
#define PB_LAUNCHER 5
#define PB_SHOTGUN 6
#define PB_SUPERMARKER 7
new g_msgHideWeapon;
new g_paintballs[MAX_PAINTBALLS], g_pbstatus[MAX_PAINTBALLS], g_pbcount, Float:lastshot[33], Float:nextattack[33], freezetime;
new pbgun, color, shots, blife, sound, bglow, damage, friendlyfire, beamspr;
new blood1, blood2, knife_ohk, jamon, pellets_real, pbslauncher;
new fire_rate_low, fire_rate_medium, fire_rate_high, jam_prob_low, jam_prob_high, gravity, speed_marker, speed_pistol, speed_shotgun, speed_sniper, dispersion, removecrosshair, speed_launcher, speed_smarker ;
static const g_shot_anim[8] = {0, 3, 9, 5, 1, 1, 1, 3};
static const g_pbgun_models[11][] = {"models/v_pbgun.mdl", "models/v_pbgun1.mdl", "models/v_pbgun2.mdl", "models/v_pbgun3.mdl", "models/v_pbgun4.mdl", "models/v_pbgun5.mdl", "models/v_pbgun6.mdl", "models/v_pbgun7.mdl", "models/v_pbgun8.mdl", "models/v_pbgun9.mdl", "models/v_pbgun10.mdl"};
new g_Jammed[33];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("rpaintballgun", VERSION, FCVAR_SERVER|FCVAR_UNLOGGED);
set_cvar_string("rpaintballgun", VERSION)
register_clcmd("say /ent", "ent_info", ADMIN_SLAY);
g_msgHideWeapon = get_user_msgid( "HideWeapon" );
if (get_pcvar_num(pbgun))
{
register_event("CurWeapon", "ev_curweapon", "be");
register_logevent("ev_roundstart", 2, "0=World triggered", "1=Round_Start");
if (get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "ev_freezetime", "a", "1=0", "2=0");
register_forward(FM_Touch, "fw_touch");
register_forward(FM_SetModel, "fw_setmodel");
register_forward(FM_CmdStart, "fw_cmdstart");
register_forward(FM_UpdateClientData, "fw_updateclientdata",1);
if (get_pcvar_num(pbslauncher))
register_forward(FM_Think, "fw_think");
RegisterHam ( Ham_TakeDamage, "player", "fwd_TakeDamage" );
RegisterHam (Ham_Weapon_Reload, "weapon_m3", "fw_reload", 1);
RegisterHam (Ham_Weapon_Reload, "weapon_xm1014", "fw_reload", 1);
RegisterHam (Ham_Weapon_Reload, "weapon_scout", "fw_reload", 1);
set_cvar_num ("sv_maxvelocity", 4000);
new a, max_ents_allow = global_get(glb_maxEntities) - 5;
for (a = 1; a <= get_pcvar_num(shots); a++)
if (a < MAX_PAINTBALLS)
if (engfunc(EngFunc_NumberOfEntities) < max_ents_allow)
{
g_paintballs[a] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if (pev_valid(g_paintballs[a]))
{
set_pev(g_paintballs[a], pev_effects, pev(g_paintballs[a], pev_effects) | EF_NODRAW);
g_pbcount++;
}
}
if (g_pbcount < 1)
set_fail_state("[AMXX] Failed to load Realism for Paintball Gun (unable to create ents)");
server_print("*** %s v%s by %s Enabled ***", PLUGIN, VERSION, AUTHOR);
}
}
public plugin_precache()
{
pbgun = register_cvar("amx_pbgun", "1");
knife_ohk = register_cvar("amx_knifeonehitkill", "1");
jamon = register_cvar("amx_pbgun_jam","1");
friendlyfire = get_cvar_pointer("mp_friendlyfire");
if (get_pcvar_num(pbgun)) {
color = register_cvar("pbgun_color", "1");
shots = register_cvar("pbgun_shots", "100");
blife = register_cvar("pbgun_life", "15");
sound = register_cvar("pbgun_sound", "1");
bglow = register_cvar("pbgun_glow", "c");
damage = register_cvar("pbgun_damage", "100");
fire_rate_low = register_cvar("pbgun_fireratelow", "1.1");
fire_rate_high = register_cvar("pbgun_fireratehigh", "0.16");
fire_rate_medium = register_cvar("pbgun_fireratemedium", "0.7");
jam_prob_low = register_cvar("pbgun_jamproblow", "30");
jam_prob_high = register_cvar("pbgun_jamprobhigh", "100");
gravity = register_cvar("pbgun_gravity", "1");
speed_marker = register_cvar("pbgun_velocity_marker", "2000");
speed_smarker = register_cvar("pbgun_velocity_super_marker", "2500");
speed_pistol = register_cvar("pbgun_velocity_pistol", "1500");
speed_launcher = register_cvar("pbgun_velocity_launcher", "1500");
speed_shotgun = register_cvar("pbgun_velocity_shotgun", "1500");
speed_sniper = register_cvar("pbgun_velocity_sniper", "4000");
dispersion = register_cvar("pbgun_dispersion", "100");
removecrosshair = register_cvar("pbgun_nocrosshair", "1");
pellets_real = register_cvar("pbgun_real_pellets", "1");
pbslauncher = register_cvar("pbgun_pbslauncher", "1");
precache_model(g_pbgun_models[3]);
precache_model(g_pbgun_models[7]);
precache_model("models/v_pbgun1.mdl");
precache_model("models/v_pbgun6.mdl");
precache_model("models/p_pbgun.mdl");
precache_model("models/p_pbgun1.mdl");
precache_model("models/w_pbgun.mdl");
precache_model("models/v_pb_sniper.mdl");
precache_model("models/p_pb_sniper.mdl");
precache_model("models/w_pb_sniper.mdl");
precache_model("models/v_pb_shotgun.mdl");
precache_model("models/p_pb_shotgun.mdl");
precache_model("models/w_pb_shotgun.mdl");
precache_model("models/v_pb_launcher.mdl");
precache_model("models/w_pb_launcher.mdl");
precache_model("models/p_pb_launcher.mdl");
precache_model("models/w_pb_launch_he.mdl");
precache_model("models/p_pb_knife.mdl");
precache_model("models/v_pb_knife.mdl");
precache_model("models/v_pb_superlauncher.mdl");
precache_model("models/w_pb_supernade.mdl");
blood1 = precache_model("sprites/blood.spr");
blood2 = precache_model("sprites/bloodspray.spr");
precache_model("models/v_pbusp.mdl");
precache_model("models/p_pbusp.mdl");
precache_model("models/v_pbglock.mdl");
precache_model("models/p_pbglock.mdl");
precache_sound("misc/pb1.wav");
precache_sound("misc/pb2.wav");
precache_sound("misc/pb3.wav");
precache_sound("misc/pb4.wav");
precache_sound("misc/pbg.wav");
precache_sound("misc/pb_launcher.wav");
precache_model("models/w_paintball.mdl");
precache_model("sprites/paintball.spr");
precache_sound("weapons/scout_fire-1.wav");
precache_sound("weapons/dryfire_pistol.wav");
precache_sound("weapons/scout_bolt.wav");
precache_sound("weapons/draw.wav");
precache_sound("weapons/insert.wav");
precache_sound("weapons/magin.wav");
precache_sound("weapons/magout.wav");
precache_sound("weapons/magrel.wav");
precache_sound("weapons/pullout.wav");
precache_sound("weapons/roll.wav");
}
beamspr = precache_model("sprites/laserbeam.spr");
}
public ent_info(id)
client_print(id, print_chat, "[AMXX] [Ent Info (Current/Max)] Paintballs: (%d/%d) Entities: (%d/%d)", g_pbcount, get_pcvar_num(shots), engfunc(EngFunc_NumberOfEntities), global_get(glb_maxEntities));
public ev_curweapon(id)
{
//replace the weapon model with the PB model
new model[25];
pev(id, pev_viewmodel2, model, 24);
if (equali(model, "models/v_mp5.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, (get_user_team(id) == 1) ? g_pbgun_models[3] : g_pbgun_models[7]);
set_pev(id, pev_weaponmodel2, "models/p_pbgun1.mdl");
}
else if (equali(model, "models/v_usp.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pbusp.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pbusp.mdl");
}
else if (equali(model, "models/v_glock18.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pbglock.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pbglock.mdl");
}else if (equali(model, "models/v_scout.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pb_sniper.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pb_sniper.mdl");
}else if (equali(model, "models/v_m3.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pb_launcher.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pb_launcher.mdl");
}else if (equali(model, "models/v_knife.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pb_knife.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pb_knife.mdl");
}else if (equali(model, "models/v_p90.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, (get_user_team(id) == 1) ? "models/v_pbgun1.mdl" : "models/v_pbgun6.mdl" );
set_pev(id, pev_weaponmodel2, "models/p_pbgun1.mdl");
}else if (equali(model, "models/v_xm1014.mdl") && get_pcvar_num(pbgun))
{
set_pev(id, pev_viewmodel2, "models/v_pb_shotgun.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pb_shotgun.mdl");
}else if (equali(model, "models/v_flashbang.mdl") && get_pcvar_num(pbgun) && get_pcvar_num(pbslauncher))
{
set_pev(id, pev_viewmodel2, "models/v_pb_superlauncher.mdl");
set_pev(id, pev_weaponmodel2, "models/p_pb_shotgun.mdl");
}
new my_pbgun = user_has_pbgun(id);
if (my_pbgun){
if (get_pcvar_num(removecrosshair))
{
//Remove the crosshair
message_begin( MSG_ONE_UNRELIABLE, g_msgHideWeapon, _, id );
write_byte( CROSSHAIR_REMOVED );
message_end();
}
}
}
public fw_setmodel(ent, model[])
{
//replace dropped models with PB models
if (equali(model, "models/w_mp5.mdl") || equali(model, "models/w_p90.mdl"))
if (get_pcvar_num(pbgun))
{
engfunc(EngFunc_SetModel, ent, "models/w_pbgun.mdl");
return FMRES_SUPERCEDE;
}
if (equali(model, "models/w_scout.mdl"))
if (get_pcvar_num(pbgun))
{
engfunc(EngFunc_SetModel, ent, "models/w_pb_sniper.mdl");
return FMRES_SUPERCEDE;
}
if (equali(model, "models/w_m3.mdl"))
if (get_pcvar_num(pbgun))
{
engfunc(EngFunc_SetModel, ent, "models/w_pb_launcher.mdl");
return FMRES_SUPERCEDE;
}
if (equali(model, "models/w_xm1014.mdl"))
if (get_pcvar_num(pbgun))
{
engfunc(EngFunc_SetModel, ent, "models/w_pb_shotgun.mdl");
return FMRES_SUPERCEDE;
}
if (equali(model, "models/w_flashbang.mdl") && get_pcvar_num(pbslauncher))
if (get_pcvar_num(pbgun))
{
engfunc(EngFunc_SetModel, ent, "models/w_pb_supernade.mdl");
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public fw_updateclientdata(id, sw, cd_handle)
{
//this function overrides the client side sounds and stuff
if (user_has_pbgun(id) && cd_handle)
{
set_cd(cd_handle, CD_ID, 1);
get_cd(cd_handle, CD_flNextAttack, nextattack[id]);
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public fw_reload(weapon)
{
new id = pev(weapon, pev_owner)
new ammo, null = get_user_weapon(id, ammo, null);
new my_pbgun = user_has_pbgun(id)
if ((my_pbgun == PB_LAUNCHER && ammo < 8) || (my_pbgun == PB_SHOTGUN && ammo < 7) || (my_pbgun == PB_SNIPER && ammo < 10))
{
lastshot[id] = get_gametime();
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 1.0, 1.0);
show_hudmessage(id, "Przeladowywanie...");
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id);
write_byte(3);
write_byte(0);
message_end();
}
}
public try_to_jam(id, my_pbgun){
//chance of jamming the current weapon
if(get_pcvar_num(jamon) && !g_Jammed[id] && my_pbgun != PB_GLOCK && my_pbgun != PB_USP && !is_user_bot(id))
{
new average_usage_jam;
switch (my_pbgun)
{
case PB_MARKER: average_usage_jam = get_pcvar_num(jam_prob_high);
case PB_GLOCK: average_usage_jam = get_pcvar_num(jam_prob_high);
case PB_USP: average_usage_jam = get_pcvar_num(jam_prob_high);
case PB_SNIPER: average_usage_jam = get_pcvar_num(jam_prob_low);
case PB_LAUNCHER: average_usage_jam = get_pcvar_num(jam_prob_low);
case PB_SHOTGUN: average_usage_jam = get_pcvar_num(jam_prob_low);
case PB_SUPERMARKER: average_usage_jam = get_pcvar_num(jam_prob_high) * 2;
default: average_usage_jam = get_pcvar_num(jam_prob_high);
}
new jam = (random(average_usage_jam)==0);
if(jam)
{
emit_sound(id,CHAN_AUTO, "weapons/dryfire_pistol.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
g_Jammed[id] = my_pbgun;
}
}
}
public fw_cmdstart( id, uc_handle, random_seed )
{
if ( !is_user_alive( id ) )
return FMRES_IGNORED
static buttons; buttons = get_uc( uc_handle, UC_Buttons )
new my_pbgun = user_has_pbgun(id);
//if jammed, clear the chamber
if ( buttons & IN_USE && my_pbgun == g_Jammed[id] && my_pbgun && get_pcvar_num(jamon))
clear_chamber(id);
//if he is shooting with a PBGUN
if ( buttons & IN_ATTACK && my_pbgun)
{
//check if weapon is jammed
if(g_Jammed[id] == my_pbgun && !is_user_bot(id) && get_pcvar_num(jamon))
{
weapon_jam(id, uc_handle);
return FMRES_IGNORED;
}
set_uc (uc_handle, UC_Buttons, buttons & ~IN_ATTACK);
new ammo, null = get_user_weapon(id, ammo, null);
if (ammo)
{
new Float:gametime = get_gametime(), Float:g_speed;
switch (my_pbgun)
{
case PB_MARKER: g_speed = get_pcvar_float(fire_rate_high);
case PB_GLOCK: g_speed = get_pcvar_float(fire_rate_high);
case PB_USP: g_speed = get_pcvar_float(fire_rate_high);
case PB_SNIPER: g_speed = get_pcvar_float(fire_rate_low);
case PB_LAUNCHER: g_speed = get_pcvar_float(fire_rate_low);
case PB_SHOTGUN: g_speed = get_pcvar_float(fire_rate_medium);
case PB_SUPERMARKER: g_speed = get_pcvar_float(fire_rate_high)/2.0;
default: g_speed = get_pcvar_float(fire_rate_high);
}
new cangofull = (my_pbgun == PB_MARKER || my_pbgun == PB_LAUNCHER || my_pbgun == PB_SHOTGUN || my_pbgun == PB_SUPERMARKER);
//check that the button was not pressed before or that the weapon can go full-auto
new auto = !(pev(id, pev_oldbuttons) & IN_ATTACK) || cangofull;
//check the fire-rate and freezetime
if (gametime-lastshot[id] > g_speed && (is_user_bot(id) || nextattack[id] < 0.0) && !freezetime && auto)
{
new fired;
if (my_pbgun == PB_SHOTGUN)
{ //shoot 5 pellets
for (new a = 0; a < 5; a++)
fired = paint_fire(id, a) || fired;
}
else //shoot 1 pellet
fired = paint_fire(id, 0);
if (fired)
{
lastshot[id] = gametime;
set_user_clip(id, ammo - 1);
//show the animation
set_pev(id, pev_punchangle, Float:{-0.5, 0.0, 0.0});
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id);
write_byte(g_shot_anim[my_pbgun]);
write_byte(0);
message_end();
//shooting sound
if (get_pcvar_num(sound))
if (my_pbgun != PB_SNIPER)
if (my_pbgun != PB_LAUNCHER)
emit_sound(id, CHAN_AUTO, "misc/pbg.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
else
emit_sound(id, CHAN_AUTO, "misc/pb_launcher.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
else
emit_sound(id, CHAN_AUTO, "weapons/scout_fire-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
try_to_jam(id,my_pbgun)
}
}
}
return FMRES_IGNORED;
}
return FMRES_IGNORED
}
public paint_fire(id, num)
{
new a, ent;
while (a++ < g_pbcount - 1 && !ent)
if (g_pbstatus[a] == 0)
ent = g_pbstatus[a] = g_paintballs[a];
if (!ent)
while (a-- > 1 && !ent)
if (g_pbstatus[a] == 2)
ent = g_pbstatus[a] = g_paintballs[a];
if (pev_valid(ent) && is_user_alive(id))
{
new Float:vangles[3], Float:nvelocity[3], Float:voriginf[3], vorigin[3], clr;
set_pev(ent, pev_owner, id);
new my_pbgun = user_has_pbgun(id);
if (my_pbgun != PB_LAUNCHER) { //create a pellet
set_pev(ent, pev_classname, "pbBullet");
engfunc(EngFunc_SetModel, ent, "models/w_paintball.mdl");
if (my_pbgun == PB_SHOTGUN) //make them smaller to avoid creation collisions
engfunc(EngFunc_SetSize, ent, Float:{0.0, 0.0, 0.0}, Float:{1.0, 1.0, 1.0});
else
engfunc(EngFunc_SetSize, ent, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
switch (get_pcvar_num(color))
{
case 2: clr = (get_user_team(id) == 1) ? 0 : 1;
case 3: clr = (get_user_team(id) == 1) ? 4 : 3;
case 4: clr = (get_user_team(id) == 1) ? 2 : 5;
default: clr = random_num(0, 6);
}
set_pev(ent, pev_skin, clr);
set_pev(ent, pev_gravity, 0.5);
}else
{ //create a nade
set_pev(ent, pev_classname, "pbExplosive");
engfunc(EngFunc_SetModel, ent, "models/w_pb_launch_he.mdl");
engfunc(EngFunc_SetSize, ent, Float:{-3.0, -3.0, -3.0}, Float:{3.0, 3.0, 3.0});
set_pev(ent, pev_gravity, 1.0);
}
get_user_origin(id, vorigin, 1);
if (my_pbgun == PB_SHOTGUN)
{ //avoid creation collisions
vorigin[0] += random(5)-2;
vorigin[1] += random(5)-2;
vorigin[2] += num*5
}
IVecFVec(vorigin, voriginf);
engfunc(EngFunc_SetOrigin, ent, voriginf);
vangles[0] = random_float(-180.0, 180.0);
vangles[1] = random_float(-180.0, 180.0);
set_pev(ent, pev_angles, vangles);
pev(id, pev_v_angle, vangles);
set_pev(ent, pev_v_angle, vangles);
pev(id, pev_view_ofs, vangles);
set_pev(ent, pev_view_ofs, vangles);
new veloc;
if (get_pcvar_num(gravity))
set_pev(ent, pev_movetype, MOVETYPE_BOUNCE);
else
set_pev(ent, pev_movetype, MOVETYPE_FLY);
set_pev(ent, pev_solid, 2);
//Different guns shoot at different speeds
switch (my_pbgun)
{
case PB_MARKER: veloc = get_pcvar_num(speed_marker);
case PB_GLOCK: veloc = get_pcvar_num(speed_pistol);
case PB_USP: veloc = get_pcvar_num(speed_pistol);
case PB_SNIPER: veloc = get_pcvar_num(speed_sniper);
case PB_LAUNCHER: veloc = get_pcvar_num(speed_launcher);
case PB_SHOTGUN: veloc = get_pcvar_num(speed_shotgun);
case PB_SUPERMARKER: veloc = get_pcvar_num(speed_smarker);
default: veloc = get_pcvar_num(speed_pistol);
}
velocity_by_aim(id, veloc, nvelocity);
//Fix aim for bots
if (is_user_bot(id))
switch (my_pbgun)
{
case PB_MARKER: nvelocity[2] += (get_pcvar_num(gravity))? 150 : 0;
case PB_GLOCK: nvelocity[2] += (get_pcvar_num(gravity))? 200 : 0;
case PB_USP: nvelocity[2] += (get_pcvar_num(gravity))? 200 : 0;
case PB_SNIPER: nvelocity[2] += (get_pcvar_num(gravity))? 35 : 0;
case PB_LAUNCHER: nvelocity[2] += 250;
case PB_SHOTGUN: nvelocity[2] += (get_pcvar_num(gravity))? 50 : 0;
case PB_SUPERMARKER: nvelocity[2] += (get_pcvar_num(gravity))? 100 : 0;
default: nvelocity[2] += (get_pcvar_num(gravity))? 150 : 0;
}
//Recoil!!!
if (cs_get_user_zoom(id)== CS_SET_NO_ZOOM){
//the sniper will shoot terribly bad without a scope
new modifier = (my_pbgun != PB_SNIPER)? 1 : 5;
new buttons = pev(id, pev_button);
if (my_pbgun == PB_SHOTGUN)
modifier = 2;
else //shoot worse while moving
if (buttons & IN_JUMP || buttons & IN_FORWARD || buttons & IN_BACK || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT)
modifier *= 2;
new disp = get_pcvar_num(dispersion);
nvelocity[0] += (random(disp)-disp/2) * modifier;
nvelocity[1] += (random(disp)-disp/2) * modifier;
nvelocity[2] += (random(disp)-disp/2) * modifier;
}
set_pev(ent, pev_velocity, nvelocity);
set_pev(ent, pev_effects, pev(ent, pev_effects) & ~EF_NODRAW);
//glow
set_task(0.1, "paint_glow", ent);
if (my_pbgun != PB_LAUNCHER) //make it dissapear after a while
set_task(15.0 , "paint_reset", ent+TASK_PB_RESET);
else //make it explode if there is no impact
set_task(2.0, "time_explode", ent+TASK_PB_RESET);
}
return ent;
}
public fw_touch(bullet, ent)
{
new class[20];
pev(bullet, pev_classname, class, 19);
if (!equali(class, "pbBullet")&&!equali(class, "pbHarmlessBullet")&&!equali(class, "pbExplosive"))
return FMRES_IGNORED;
new owner = pev(bullet, pev_owner);
new Float:origin[3], class2[20], is_ent_alive = is_user_alive(ent);
pev(ent, pev_classname, class2, 19);
pev(bullet, pev_origin, origin);
if (equali(class, "pbExplosive")){ //it is a nade
new Float:gametime = get_gametime();
//if it hits something after this time, explode
if (gametime-lastshot[owner] > 0.5){
act_explode(bullet);
set_pev(bullet, pev_velocity, Float:{0.0, 0.0, 0.0});
set_pev(bullet, pev_classname, "pbPaint");
set_pev(bullet, pev_solid, 0);
set_pev(bullet, pev_movetype, 0);
engfunc(EngFunc_SetModel, bullet, "sprites/paintball.spr");
new a, findpb = 0;
while (a++ < g_pbcount && !findpb)
if (g_paintballs[a] == bullet)
findpb = g_pbstatus[a] = 2;
remove_task(bullet);
remove_task(bullet+TASK_PB_RESET);
paint_reset(bullet+TASK_PB_RESET);
return FMRES_HANDLED;
}
else if (!equali(class2, "pbBullet")&&!equali(class2, "pbHarmlessBullet")&&get_pcvar_num(gravity)){
//make it bounce and loose some velocity
new Float:vel[3];
pev(bullet,pev_velocity,vel);
vel[0] /= 5.0;
vel[1] /= 5.0;
vel[2] /= 5.0;
set_pev(bullet, pev_velocity, vel);
if (!is_ent_alive) //make damage to world stuff
ExecuteHam(Ham_TakeDamage, ent, owner, owner, get_pcvar_float(damage), 4098);
return FMRES_IGNORED;
}
}
//The bullet hits or bounces
new hit;
hit = random(5);
if (is_ent_alive) //make damage
{
if (owner == ent || pev(ent, pev_takedamage) == DAMAGE_NO)
return FMRES_IGNORED;
if (get_user_team(owner) == get_user_team(ent))
if (!get_pcvar_num(friendlyfire))
return FMRES_IGNORED;
if (hit != 0 && !equali(class, "pbHarmlessBullet"))
ExecuteHam(Ham_TakeDamage, ent, owner, owner, get_pcvar_float(damage), 4098);
}
if (!equali(class2, "pbBullet")&&!equali(class2, "pbHarmlessBullet"))
if (hit != 0 || !get_pcvar_num(pellets_real))
{ //stop the pellet and make a splat
set_pev(bullet, pev_velocity, Float:{0.0, 0.0, 0.0});
set_pev(bullet, pev_classname, "pbPaint");
set_pev(bullet, pev_solid, 0);
set_pev(bullet, pev_movetype, 0);
engfunc(EngFunc_SetModel, bullet, "sprites/paintball.spr");
new a, findpb = 0;
while (a++ < g_pbcount && !findpb)
if (g_paintballs[a] == bullet)
findpb = g_pbstatus[a] = 2;
remove_task(bullet);
remove_task(bullet+TASK_PB_RESET);
if (get_pcvar_num(sound))
{
static wav[20];
formatex(wav, 20, is_ent_alive ? "player/pl_pain%d.wav" : "misc/pb%d.wav", is_ent_alive ? random_num(4,7) : random_num(1,4));
emit_sound(bullet, CHAN_AUTO, wav, 1.0, ATTN_NORM, 0, PITCH_NORM);
}
new bool:valid_surface = (is_ent_alive || containi(class2, "door") != -1) ? false : true;
if (pev(ent, pev_health) && !is_ent_alive)
{
ExecuteHam(Ham_TakeDamage, ent, owner, owner, float(pev(ent, pev_health)), 0);
valid_surface = false;
}
if (valid_surface)
{
paint_splat(bullet);
set_task(float(get_pcvar_num(blife)), "paint_reset", bullet+TASK_PB_RESET);
}
else
paint_reset(bullet+TASK_PB_RESET);
return FMRES_HANDLED;
}else
{ //the pellet bounces, reduce its speed
if (get_pcvar_num(gravity)){
new Float:vel[3];
pev(bullet,pev_velocity,vel);
vel[0] /= 10.0;
vel[1] /= 10.0;
vel[2] /= 10.0;
set_pev(bullet, pev_velocity, vel);
}
//A bullet that bounces becomes harmless to players
set_pev(bullet, pev_classname, "pbHarmlessBullet");
return FMRES_IGNORED;
}
/*else
{
paint_reset(bullet+TASK_PB_RESET);
return FMRES_HANDLED;
}
*/
return FMRES_IGNORED;
}
//for the super launcher
public fw_think(ent)
{
new model[35];
pev(ent, pev_model, model, 34);
if (!equali(model, "models/w_pb_supernade.mdl"))
return FMRES_IGNORED;
if(!is_user_alive(pev(ent, pev_owner)))
return FMRES_IGNORED;
set_task(1.6, "act_superboom", ent);
return FMRES_SUPERCEDE;
}
public act_superboom(ent)
{
for (new a = 0; a < 10; a++)
set_task(0.1 + a*0.2, "launch_nade", ent + TASK_NADE);
set_task(2.5, "remove_nade", ent + TASK_NADE);
}
public remove_nade(ent)
{
remove_task (ent)
ent -= TASK_NADE
act_explode(ent);
engfunc(EngFunc_RemoveEntity, ent);
}
public launch_nade(param)
{
new spawnent = param - TASK_NADE
new a, ent;
while (a++ < g_pbcount - 1 && !ent)
if (g_pbstatus[a] == 0)
ent = g_pbstatus[a] = g_paintballs[a];
if (!ent)
while (a-- > 1 && !ent)
if (g_pbstatus[a] == 2)
ent = g_pbstatus[a] = g_paintballs[a];
if (pev_valid(ent)&&pev_valid(spawnent))
{
new Float:nvelocity[3], vorigin[3];
set_pev(ent, pev_owner, pev(spawnent, pev_owner));
//create a nade
set_pev(ent, pev_classname, "pbExplosive");
engfunc(EngFunc_SetModel, ent, "models/w_pb_launch_he.mdl");
engfunc(EngFunc_SetSize, ent, Float:{-3.0, -3.0, -3.0}, Float:{3.0, 3.0, 3.0});
set_pev(ent, pev_gravity, 1.0);
pev(spawnent,pev_origin, vorigin)
vorigin[2] += 30
set_pev(ent, pev_origin, vorigin)
//IVecFVec(vorigin, voriginf);
//engfunc(EngFunc_SetOrigin, ent, vorigin);
set_pev(ent, pev_movetype, MOVETYPE_BOUNCE);
set_pev(ent, pev_solid, 2);
nvelocity[0] = random_float(-200.0, 200.0);
nvelocity[1] = random_float(-200.0, 200.0);
nvelocity[2] = 500.0;
set_pev(ent, pev_velocity, nvelocity);
set_pev(ent, pev_effects, pev(ent, pev_effects) & ~EF_NODRAW);
set_task(2.0, "time_explode", ent+TASK_PB_RESET);
}
return ent;
}
public act_explode(ent)
{
new origin[3], Float:forigin[3], colors[4], owner = pev(ent, pev_owner), user_team = get_user_team(owner);
colors = (user_team == 1) ? { 255, 0, 247, 70} : { 0, 255, 208, 30};
pev(ent, pev_origin, forigin);
FVecIVec(forigin, origin);
new id, Float:distance = 150.0, Float:porigin[3];
new MaxPlayers = get_maxplayers();
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BLOODSPRITE);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2] + 20);
write_short(blood2);
write_short(blood1);
write_byte(colors[2]);
write_byte(30);
message_end();
while (id++ < MaxPlayers)
if (is_user_alive(id))
{
pev(id, pev_origin, porigin);
if (get_distance_f(forigin, porigin) <= distance)
if (fm_is_visible(ent, id))
ExecuteHam(Ham_TakeDamage, id, owner, owner, (user_team != get_user_team(id)) ? 100.0 : 300.0, 4098);
}
emit_sound(ent, CHAN_AUTO, "weapons/sg_explode.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
set_pev(ent, pev_classname, "pbHarmlessBullet");
}
stock bool:fm_is_visible(ent, target)
{
if (pev_valid(ent) && pev_valid(target))
{
new Float:start[3], Float:view_ofs[3], Float:point[3];
pev(ent, pev_origin, start);
pev(ent, pev_view_ofs, view_ofs);
pev(target, pev_origin, point);
start[0] += view_ofs[0];
start[1] += view_ofs[1];
start[2] += view_ofs[2];
engfunc(EngFunc_TraceLine, start, point, 1, ent, 0);
new Float:fraction;
get_tr2(0, TR_flFraction, fraction);
if (fraction == 1.0)
return true;
}
return false;
}
public paint_splat(ent)
{
new Float:origin[3], Float:norigin[3], Float:viewofs[3], Float:angles[3], Float:normal[3], Float:aiming[3];
pev(ent, pev_origin, origin);
pev(ent, pev_view_ofs, viewofs);
pev(ent, pev_v_angle, angles);
norigin[0] = origin[0] + viewofs[0];
norigin[1] = origin[1] + viewofs[1];
norigin[2] = origin[2] + viewofs[2];
aiming[0] = norigin[0] + floatcos(angles[1], degrees) * 1000.0;
aiming[1] = norigin[1] + floatsin(angles[1], degrees) * 1000.0;
aiming[2] = norigin[2] + floatsin(-angles[0], degrees) * 1000.0;
new tr = 0
engfunc(EngFunc_TraceLine, norigin, aiming, 0, ent, tr);
//get_tr2(tr, TR_vecPlaneNormal, normal);
//EngFunc_TraceHull,(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
//engfunc(EngFunc_TraceHull, norigin, aiming, 0, HULL_LARGE, ent, tr)
get_tr2(tr, TR_vecPlaneNormal, normal)
vector_to_angle(normal, angles);
angles[1] += 180.0;
if (angles[1] >= 360.0) angles[1] -= 360.0;
set_pev(ent, pev_angles, angles);
set_pev(ent, pev_v_angle, angles);
origin[0] += (normal[0] * random_float(0.3, 2.7));
origin[1] += (normal[1] * random_float(0.3, 2.7));
origin[2] += (normal[2] * random_float(0.3, 2.7));
engfunc(EngFunc_SetOrigin, ent, origin);
set_pev(ent, pev_frame, float(random_num( (pev(ent, pev_skin) * 18), (pev(ent, pev_skin) * 18) + 17 ) ));
if (pev(ent, pev_renderfx) != kRenderFxNone)
set_rendering(ent);
}
public paint_glow(ent)
{
if (pev_valid(ent))
{
static pbglow[5], clr[3];
get_pcvar_string(bglow, pbglow, 4);
switch (get_pcvar_num(color))
{
case 2: clr = (get_user_team(pev(ent, pev_owner))==1) ? {255, 0, 0} : {0, 0, 255};
default: clr = {255, 255, 255};
}
if (read_flags(pbglow) & (1 << 0))
set_rendering(ent, kRenderFxGlowShell, clr[0], clr[1], clr[2], kRenderNormal, 255);
if (read_flags(pbglow) & (1 << 1))
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMFOLLOW);
write_short(ent);
write_short(beamspr);
write_byte(4);
write_byte(2);
write_byte(clr[0]);
write_byte(clr[1]);
write_byte(clr[2]);
write_byte(255);
message_end();
}
}
}
public paint_reset(ent)
{
remove_task(ent);
ent -= TASK_PB_RESET;
new a, findpb = 1;
while (a++ <= g_pbcount && findpb)
if (g_paintballs[a] == ent)
findpb = g_pbstatus[a] = 0;
set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW);
engfunc(EngFunc_SetSize, ent, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0});
set_pev(ent, pev_velocity, Float:{0.0, 0.0, 0.0});
engfunc(EngFunc_SetOrigin, ent, Float:{-2000.0, -2000.0, -2000.0});
if (pev(ent, pev_renderfx) != kRenderFxNone)
set_rendering(ent);
}
public time_explode(ent)
{
remove_task(ent);
ent -= TASK_PB_RESET;
if (!pev_valid(ent))
return;
act_explode(ent);
set_pev(ent, pev_velocity, Float:{0.0, 0.0, 0.0});
set_pev(ent, pev_classname, "pbPaint");
set_pev(ent, pev_solid, 0);
set_pev(ent, pev_movetype, 0);
engfunc(EngFunc_SetModel, ent, "sprites/paintball.spr");
new a, findpb = 0;
while (a++ < g_pbcount && !findpb)
if (g_paintballs[a] == ent)
findpb = g_pbstatus[a] = 2;
remove_task(ent);
paint_reset(ent+TASK_PB_RESET);
}
public ev_roundstart()
{
for (new a = 1; a <= g_pbcount; a++)
if (g_pbstatus[a] != 0)
paint_reset(g_paintballs[a]+TASK_PB_RESET);
if (freezetime)
freezetime = 0;
}
public ev_freezetime()
freezetime = 1;
stock user_has_pbgun(id)
{
new retval;
if (is_user_alive(id))
{
switch(get_user_weapon(id))
{
case CSW_MP5NAVY: retval = PB_MARKER;
case CSW_USP: retval = PB_USP;
case CSW_GLOCK18: retval = PB_GLOCK;
case CSW_SCOUT: retval = PB_SNIPER;
case CSW_M3: retval = PB_LAUNCHER;
case CSW_XM1014: retval = PB_SHOTGUN;
case CSW_P90: retval = PB_SUPERMARKER;
default: retval = 0;
}
}
return retval;
}
stock set_user_clip(id, ammo)
{
new weaponname[32], weaponid = -1, weapon = get_user_weapon(id, _, _);
get_weaponname(weapon, weaponname, 31);
while ((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponname)) != 0)
if (pev(weaponid, pev_owner) == id) {
set_pdata_int(weaponid, 51, ammo, 4);
return weaponid;
}
return 0;
}
// teame06's function
stock set_rendering(index, fx=kRenderFxNone, r=0, g=0, b=0, render=kRenderNormal, amount=16)
{
set_pev(index, pev_renderfx, fx);
new Float:RenderColor[3];
RenderColor[0] = float(r);
RenderColor[1] = float(g);
RenderColor[2] = float(b);
set_pev(index, pev_rendercolor, RenderColor);
set_pev(index, pev_rendermode, render);
set_pev(index, pev_renderamt, float(amount));
}
public fwd_TakeDamage ( id, i_Inflictor, i_Attacker, Float:f_Damage, i_DamageBits )
{
if (!is_user_alive(i_Attacker))
return PLUGIN_CONTINUE;
if ( get_user_weapon(i_Attacker) == CSW_KNIFE && get_pcvar_num(knife_ohk))
{
ExecuteHam(Ham_TakeDamage, id, i_Attacker, i_Attacker, 101.0, 4098);
}
return PLUGIN_CONTINUE;
}
public weapon_jam(id, uc_handle)
{
if (get_pcvar_num(jamon))
{
// show messages
set_hudmessage(255, 255, 255, -1.0, 0.33, 0, 6.0, 12.0)
show_hudmessage(id, "Zaciela Ci sie bron - kliknij klawisz domyslnie (e)")
// block the attack button
static buttons; buttons = get_uc( uc_handle, UC_Buttons )
set_uc (uc_handle, UC_Buttons, buttons & ~IN_ATTACK);
}
}
public clear_chamber(id)
{
if (get_pcvar_num(jamon))
{
g_Jammed[id] = false;
emit_sound(id,CHAN_AUTO,"weapons/scout_bolt.wav",1.0,ATTN_NORM,0,PITCH_NORM);
// show messages
set_hudmessage(255, 255, 255, -1.0, 0.3, 0, 3.0, 12.0);
show_hudmessage(id, "wyczysc");
}
}
public make_solid(ent)
{
remove_task(ent);
ent -= TASK_PB_RESET;
if (!pev_valid(ent))
return;
set_pev(ent, pev_solid, 2);
if (get_pcvar_num(gravity))
set_pev(ent, pev_movetype, MOVETYPE_BOUNCE);
}
stock is_rpaintball_active()
{
if(!cvar_exists("amx_pbmod"))
{
log_amx("Cvar: ^"amx_pbmod^" does not exist.")
return 0
}
return get_cvar_num("amx_pbmod")
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang11274\\ f0\\ fs16 \n\\ par }
*/


Dodatki SourceMod












