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); }