Chciałbym się dowiedzieć, czy jest możliwość zrobienia na PB, tj. losowej szansy na dmg - jak może wiecie albo i nie, na PB przeważnie zabija się na 1 strzał, a jakby to urozmaicić i mamy np 50% szansy na to że zada 100 dmg albo zada mniej np. 95
Plugin ma cvar
cvar[DAMGE] = register_cvar("pbgun_damage", "100");
I tj. część odpowiadająca za "dotyk"
public fw_touch(bullet, ent)
{
new class[20];
pev(bullet, pev_classname, class, 19);
if(!equali(class, "pbBullet"))
return FMRES_IGNORED;
new Float:origin[3], class2[20], owner = pev(bullet, pev_owner), is_ent_alive = is_user_alive(ent);
pev(ent, pev_classname, class2, 19);
pev(bullet, pev_origin, origin);
if(is_ent_alive)
{
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(cvar[FRIENDLYF]))
return FMRES_IGNORED;
ExecuteHam(Ham_TakeDamage, ent, owner, owner, float(get_pcvar_num(cvar[DAMGE])), 4098);
}
if(!equali(class, class2))
{
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(cvar[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(get_pcvar_num(cvar[BOMBS]))
{
if(pev(ent, pev_health) && !is_ent_alive)
{
ExecuteHam(Ham_TakeDamage, ent, owner, owner, float(pev(ent, pev_health)), 0);
valid_surface = false;
}
}
else
{
if(pev(ent, pev_health) && !is_ent_alive && pev(ent,pev_takedamage))
{
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(cvar[BLIFE])), "paint_reset", bullet+TASK_PB_RESET);
}
else
paint_reset(bullet+TASK_PB_RESET);
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
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;
engfunc(EngFunc_TraceLine, norigin, aiming, 0, ent, 0);
get_tr2(0, 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)
fm_set_rendering(ent);
}


Dodatki SourceMod













