#include #include #include #include #include #define ZOMBIE //Закоментировать если будите использовать не на зомби моде #if defined ZOMBIE #include #endif new g_connect #define get_weapon(%0) (entity_get_int(%0, EV_INT_impulse) == 20144) #define set_weapon(%0) entity_set_int(%0, EV_INT_impulse, 20144) #define get_bit(%1,%2) ((%1 & (1 << (%2 & 31))) ? true : false) #define set_bit(%1,%2) %1 |= (1 << (%2 & 31)) #define reset_bit(%1,%2) %1 &= ~(1 << (%2 & 31)) const PRIMARY_WEAPONS_BIT_SUM = (1<= AMMO_CLIP) return HAM_SUPERCEDE clip = get_ammo_clip(weapon_ent) set_ammo_clip(weapon_ent, 0) ExecuteHam(Ham_Weapon_Reload, weapon_ent) set_ammo_clip(weapon_ent, clip) UTIL_PlayWeaponAnimation(id, RELOAD) set_next_attack(id, 3.0) set_next_idle(weapon_ent, 3.0) return HAM_SUPERCEDE } public Ham_Item_PostFrame_Pre(weapon_ent) { if(!is_valid_ent(weapon_ent)) return HAM_IGNORED static id; id = get_player(weapon_ent) static ammo; ammo = get_ammo(id) static clip; clip = get_ammo_clip(weapon_ent) static Float:NextAttack, Reload if(!g_weapon_m14ebr[id]) return HAM_IGNORED NextAttack = get_pdata_float(id, 83, 5) Reload = get_pdata_int(weapon_ent, 54, 4) if(Reload && NextAttack <= 0.0) { static old; old = min(AMMO_CLIP - clip, ammo) set_ammo_clip(weapon_ent, clip + old) set_ammo(id, ammo - old) set_pdata_int(weapon_ent, 54, 0, 4) Reload = 0 } return HAM_IGNORED } public Ham_Weapon_PrimaryAttack_Pre(weapon_ent) { if(!is_valid_ent(weapon_ent)) return HAM_IGNORED static id; id = get_player(weapon_ent) if(!g_weapon_m14ebr[id]) return HAM_IGNORED if(get_ammo_clip(weapon_ent) == 0) return HAM_IGNORED ExecuteHam(Ham_Weapon_PrimaryAttack, weapon_ent) emit_sound(id, CHAN_WEAPON, sound_shoot, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) set_weapon_reloil(weapon_ent, RECOIL) UTIL_PlayWeaponAnimation(id, SHOOT) set_next_attack(id, SPEED) set_next_idle(weapon_ent, 1.0) create_shell(weapon_ent, id, g_shell_index) return HAM_SUPERCEDE } public Ham_Weapon_WeaponIdle_Pre(weapon_ent) { if(!is_valid_ent(weapon_ent)) return HAM_IGNORED static id, Float:time_idle id = get_player(weapon_ent) if(!g_weapon_m14ebr[id]) return HAM_IGNORED time_idle = get_pdata_float(weapon_ent, 48, 4) if(time_idle > 0.0) return HAM_IGNORED UTIL_PlayWeaponAnimation(id, IDLE) set_next_idle(weapon_ent, 1.5) return HAM_SUPERCEDE } public Ham_Item_AddToPlayer_Post(weapon_ent, id) { if(!is_valid_ent(weapon_ent)) return HAM_IGNORED if(get_weapon(weapon_ent)) { g_weapon_m14ebr[id] = true Weaponlist(id, "weapon_m14ebr", AMMO_MAX) return HAM_HANDLED } Weaponlist(id, "weapon_galil", 90) return HAM_IGNORED } public Ham_TraceAttack_Post(entity, attacker, Float:damage, Float:fDir[3], ptr, damagetype) { static item; item = get_player_item(attacker) if(!get_weapon(item)) return HAM_HANDLED new Float:vecEnd[3] get_tr2(ptr, TR_vecEndPos, vecEnd); message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_GUNSHOTDECAL) engfunc(EngFunc_WriteCoord, vecEnd[0]) engfunc(EngFunc_WriteCoord, vecEnd[1]) engfunc(EngFunc_WriteCoord, vecEnd[2]) write_short(entity) write_byte(random_num(41, 45)) message_end() return HAM_IGNORED } public Ham_TraceAttack_Pre(entity, attacker, Float:damage) { if(get_bit(g_connect, attacker)) { if(get_user_weapon(attacker) == CSW_GALIL && g_weapon_m14ebr[attacker]) { SetHamParamFloat(3, damage * DAMAGE) return HAM_IGNORED } } return HAM_IGNORED } public FM_SetModel_Pre(entity, model[]) { if(!is_valid_ent(entity)) return FMRES_IGNORED static szClassName[33] entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName)) if(!equal(szClassName, "weaponbox")) return FMRES_IGNORED static id; id = entity_get_edict(entity, EV_ENT_owner) if(equal(model, "models/w_galil.mdl")) { static iStoredAugID; iStoredAugID = find_ent_by_owner(-1, "weapon_galil", entity) if(!is_valid_ent(iStoredAugID)) return FMRES_IGNORED if(g_weapon_m14ebr[id]) { entity_set_model(entity, models_weapon[2]) g_weapon_m14ebr[id] = false return FMRES_SUPERCEDE } } return FMRES_IGNORED } public Weaponlist(player, weaponlist_name[], ammo) { message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, player) write_string(weaponlist_name) write_byte(4) write_byte(ammo) write_byte(-1) write_byte(-1) write_byte(0) write_byte(17) write_byte(CSW_GALIL) write_byte(0) message_end() } stock set_ammo_clip(weapon, amount) { set_pdata_int(weapon, 51, amount, 4) } stock set_ammo(player, amount) { set_pdata_int(player, 380, amount, 5) } stock get_ammo(player) { return get_pdata_int(player, 380, 5) } stock get_ammo_clip(weapon) { return get_pdata_int(weapon, 51, 4) } stock get_player(weapon) { return get_pdata_cbase(weapon, 41, 4) } stock get_player_item(player) { return get_pdata_cbase(player, 373, 5) } stock set_next_attack(player, Float:time) { set_pdata_float(player, 83, time, 5) } stock set_next_idle(weapon, Float:time) { set_pdata_float(weapon, 48, time, 4) } stock set_weapon_reloil(weapon, Float:recoil) { set_pdata_float(weapon, 62, recoil, 4) } stock create_shell(weapon, player, shell_index) { set_pdata_int(weapon, 57, shell_index, 4) set_pdata_float(player, 111, get_gametime()) } stock UTIL_PlayWeaponAnimation(const Player, const Sequence) { entity_set_int(Player, EV_INT_weaponanim, Sequence) message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player) write_byte(Sequence) write_byte(0) message_end() } stock drop_weapons(player, dropwhat) { static weapons[32], num, i, weaponid num = 0 get_user_weapons(player, weapons, num) for (i = 0; i < num; i++) { weaponid = weapons[i] if (dropwhat == 1 && ((1<