

Стаж: 13 лет
Сообщений: 1191
Благодарностей: 1297
Полезность: 1230
|
Antiflash, конфликт с Colored Flashbangs(решено) Q:Имеется код от краша. Код:
#include <amxmodx> #include <amxmisc> #include <fakemeta> #define PLUGIN "AntiFlash" #define VERSION "1.0" #define AUTHOR "CrAsH" new g_PlayerFlasher public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_event("ScreenFade", "CheckFlash", "be", "4=255", "5=255", "6=255", "7>199") register_event("23", "RemoveFlasher", "a", "1=5", "6=25", "7=6") register_forward(FM_SetModel, "CheckFlasher") } public CheckFlash(id) { if(get_user_team(id) == get_user_team(g_PlayerFlasher)) { message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0, 0, 0}, id) write_short(1) write_short(1) write_short(1) write_byte(0) write_byte(0) write_byte(0) write_byte(255) message_end() } } public RemoveFlasher() { set_task(0.05,"ResetFlasher") return PLUGIN_CONTINUE } public ResetFlasher() { g_PlayerFlasher = 0 } public SetFlasher(id) { g_PlayerFlasher = id - 12345 } public CheckFlasher(iEntity, szModel[]) { if(!equal(szModel, "models/w_flashbang.mdl")) return FMRES_IGNORED new iOwner = pev(iEntity, pev_owner) if(iOwner == 0) return FMRES_IGNORED set_task(1.52, "SetFlasher", iOwner + 12345) return FMRES_IGNORED }
Работает, всё нормально, но идет конфликт с другим плагином Код:
#include <amxmodx>
#define PLUGIN "Colored Flashbangs" #define VERSION "1.0" #define AUTHOR "v3x"
new g_nMsgScreenFade
public plugin_init() { register_plugin(PLUGIN,VERSION,AUTHOR) register_event("ScreenFade","FlashedEvent","be","4=255","5=255","6=255","7>199") g_nMsgScreenFade = get_user_msgid("ScreenFade") // Cvars register_cvar("amx_fb_mode", "1") register_cvar("amx_fb_r", "255") register_cvar("amx_fb_g", "25") register_cvar("amx_fb_b", "25") }
public FlashedEvent( id ) { new iMode = get_cvar_num("amx_fb_mode")
if ( !iMode ) return PLUGIN_CONTINUE
new iRed,iGreen,iBlue
switch( iMode ) { case 1: { iRed = get_cvar_num("amx_fb_r") iGreen = get_cvar_num("amx_fb_g") iBlue = get_cvar_num("amx_fb_b") } case 2: { iRed = random_num(0,255) iGreen = random_num(0,255) iBlue = random_num(0,255) } }
if ( !( iRed ) || !( iGreen ) || !( iBlue ) ) { iRed = 100 iGreen = 100 iBlue = 100 }
message_begin( MSG_ONE,g_nMsgScreenFade,{0,0,0},id ) write_short( read_data( 1 ) ) // Duration write_short( read_data( 2 ) ) // Hold time write_short( read_data( 3 ) ) // Fade type write_byte ( iRed ) // Red write_byte ( iGreen ) // Green write_byte ( iBlue ) // Blue write_byte ( read_data( 7 ) ) // Alpha message_end()
return PLUGIN_HANDLED } Конфликт в том, что colored_flashbangs перекрывают действие no_team_flash. Можно ли сделать так, чтобы своих тиммейтов и себя нельзя было ослепить, а colored_flashbangs действовал только на соседнюю команду? A: от voed в сообщении #5 CS_NADE_DROPS, пофиксить баг Q: Существует несущественный, но неприятный баг в плагине. Если у игрока на руках находится граната, и если он её начинает кидать и в этот момент его убивают, то мы получаем труп+брошенная граната+плагин дропает ту гранату, которая уже кинута игроком. Код:
#include <amxmodx> #include <engine> #include <fun>
#define VOL_LOW 0.5 // volume used to play nade bouncing sound #define NADE_OFFSET 10 // distance (vaguely) between death origin and nade origin
// DeathMSG public event_damage(id) {
// if player is still alive or plugin is disabled if(get_user_health(id) > 0 || get_cvar_num("mp_nadedrops") < 1) { return PLUGIN_CONTINUE; }
// if player had HE grenade if(hasweapon(id,"weapon_hegrenade") > 0) { new grenade = create_entity("info_target"); // create grenade entity entity_set_string(grenade,EV_SZ_classname,"fake_hegrenade"); // change name entity_set_int(grenade,EV_ENT_owner,id); // set owner entity_set_int(grenade,EV_INT_iuser1,0); // hasn't bounced yet
// set grenade entity's size new Float:minbox[3] = { -2.5, -2.5, -2.5 } new Float:maxbox[3] = { 2.5, 2.5, 2.5 }; entity_set_vector(grenade,EV_VEC_mins,minbox); entity_set_vector(grenade,EV_VEC_maxs,maxbox);
// set grenade's overall being of a whole entity_set_int(grenade,EV_INT_solid,SOLID_TRIGGER); entity_set_int(grenade,EV_INT_movetype,MOVETYPE_TOSS);
// set a random angle new Float:angles[3] = { 0.0, 0.0, 0.0 }; angles[1] = 90.0; entity_set_vector(grenade,EV_VEC_angles,angles);
// get player's origin new Float:origin[3]; entity_get_vector(id,EV_VEC_origin,origin); //origin[0] += NADE_OFFSET; // offset
// set model and origin entity_set_model(grenade,"models/w_hegrenade123.mdl"); entity_set_vector(grenade,EV_VEC_origin,origin); }
// if player had smoke grenade if(hasweapon(id,"weapon_smokegrenade") > 0) { new grenade = create_entity("info_target"); // create grenade entity entity_set_string(grenade,EV_SZ_classname,"fake_smokegrenade"); // change name entity_set_int(grenade,EV_ENT_owner,id); // set owner entity_set_int(grenade,EV_INT_iuser1,0); // hasn't bounced yet
// set grenade entity's size new Float:minbox[3] = { -2.5, -2.5, -2.5 } new Float:maxbox[3] = { 2.5, 2.5, 2.5 }; entity_set_vector(grenade,EV_VEC_mins,minbox); entity_set_vector(grenade,EV_VEC_maxs,maxbox);
// set grenade's overall being of a whole entity_set_int(grenade,EV_INT_solid,SOLID_TRIGGER); entity_set_int(grenade,EV_INT_movetype,MOVETYPE_TOSS);
// set a random angle new Float:angles[3] = { 0.0, 0.0, 0.0 }; angles[1] = 90.0; entity_set_vector(grenade,EV_VEC_angles,angles);
// get player's origin new Float:origin[3]; entity_get_vector(id,EV_VEC_origin,origin); origin[1] -= NADE_OFFSET; // offset
// set model and origin entity_set_model(grenade,"models/w_smokegrenade123.mdl"); entity_set_vector(grenade,EV_VEC_origin,origin); }
// if player had at least one flashbang if(hasweapon(id,"weapon_flashbang") > 0) { new grenade = create_entity("info_target"); // create grenade entity entity_set_string(grenade,EV_SZ_classname,"fake_flashbang"); // change name entity_set_int(grenade,EV_ENT_owner,id); // set owner entity_set_int(grenade,EV_INT_iuser1,0); // hasn't bounced yet
// set grenade entity's size new Float:minbox[3] = { -2.5, -2.5, -2.5 } new Float:maxbox[3] = { 2.5, 2.5, 2.5 }; entity_set_vector(grenade,EV_VEC_mins,minbox); entity_set_vector(grenade,EV_VEC_maxs,maxbox);
// set grenade's overall being of a whole entity_set_int(grenade,EV_INT_solid,SOLID_TRIGGER); entity_set_int(grenade,EV_INT_movetype,MOVETYPE_TOSS);
// set a random angle new Float:angles[3] = { 0.0, 0.0, 0.0 }; angles[1] = 90.0; entity_set_vector(grenade,EV_VEC_angles,angles);
// get player's origin new Float:origin[3]; entity_get_vector(id,EV_VEC_origin,origin); origin[1] += NADE_OFFSET; // offset
// set model and origin entity_set_model(grenade,"models/w_flashbang123.mdl"); entity_set_vector(grenade,EV_VEC_origin,origin); }
// if player had two flashbangs, drop another if(hasweapon(id,"weapon_flashbang") > 1) { new grenade = create_entity("info_target"); // create grenade entity entity_set_string(grenade,EV_SZ_classname,"fake_flashbang"); // change name entity_set_int(grenade,EV_ENT_owner,id); // set owner entity_set_int(grenade,EV_INT_iuser1,0); // hasn't bounced yet
// set grenade entity's size new Float:minbox[3] = { -2.5, -2.5, -2.5 } new Float:maxbox[3] = { 2.5, 2.5, 2.5 }; entity_set_vector(grenade,EV_VEC_mins,minbox); entity_set_vector(grenade,EV_VEC_maxs,maxbox);
// set grenade's overall being of a whole entity_set_int(grenade,EV_INT_solid,SOLID_TRIGGER); entity_set_int(grenade,EV_INT_movetype,MOVETYPE_TOSS);
// set a random angle new Float:angles[3] = { 0.0, 0.0, 0.0 }; angles[1] = 90.0; entity_set_vector(grenade,EV_VEC_angles,angles);
// get player's origin new Float:origin[3]; entity_get_vector(id,EV_VEC_origin,origin); origin[1] -= NADE_OFFSET; // offset origin[1] -= NADE_OFFSET; // offset
// set model and origin entity_set_model(grenade,"models/w_flashbang123.mdl"); entity_set_vector(grenade,EV_VEC_origin,origin); }
return PLUGIN_CONTINUE; }
// ResetHUD public event_resethud(id) { if(is_user_connected(id) == 1 && get_user_team(id) < 3) { set_task(0.5,"checkalive",id); // delay, because client is technically dead on ResetHUD } }
// check if user is alive public checkalive(id) { if(is_user_alive(id) == 1) { // if so clear_nades(id); // clear nades (they just spawned) } }
// entity touching public pfn_touch(ptr,ptd) { if(!is_valid_ent(ptd)) { // invalid toucher return PLUGIN_CONTINUE; }
new classname[32]; entity_get_string(ptd,EV_SZ_classname,classname,31); // get name of toucher
new bounced = entity_get_int(ptd,EV_INT_iuser1); // bounced yet?
// check if one of our fake grenades is colliding with world and mp_nadedropsounds is positive if((equal(classname,"fake_hegrenade") || equal(classname,"fake_flashbang") || equal(classname,"fake_smokegrenade")) && ptr == 0 && bounced == 0 && get_cvar_num("mp_nadedropsounds") > 0) { emit_sound(ptd,CHAN_ITEM,"weapons/he_bounce-1.wav",VOL_LOW,ATTN_NORM,0,PITCH_LOW); // play sound entity_set_int(ptd,EV_INT_iuser1,1); // has bounced return PLUGIN_CONTINUE; }
// now check for more invalid entities or players if(!is_valid_ent(ptr) || !is_valid_ent(ptd) || !is_user_connected(ptd)) { return PLUGIN_CONTINUE; }
entity_get_string(ptr,EV_SZ_classname,classname,31); // get name of touched
// if player is touching hegrenade and doesn't have one if(equal(classname,"fake_hegrenade") && hasweapon(ptd,"weapon_hegrenade") == 0) { give_item(ptd,"weapon_hegrenade"); remove_entity(ptr); return PLUGIN_CONTINUE; }
// if player is touching smokegrenade and doesn't have one if(equal(classname,"fake_smokegrenade") && hasweapon(ptd,"weapon_smokegrenade") == 0) { give_item(ptd,"weapon_smokegrenade"); remove_entity(ptr); return PLUGIN_CONTINUE; }
// if player is touching flashbang and has room for another if(equal(classname,"fake_flashbang") && hasweapon(ptd,"weapon_flashbang") < 2) { give_item(ptd,"weapon_flashbang"); remove_entity(ptr); return PLUGIN_CONTINUE; }
return PLUGIN_CONTINUE; }
// client disconnection public client_disconnect(id) { clear_nades(id); }
// function to check if player has a specific weapon. // returns the amount of ammo for that weapon in backpack. // we use this so we can check for multiple flashbangs as well public hasweapon(id,weaponname[32]) { if(is_user_connected(id) == 0 || get_user_team(id) > 2) { return 0; }
new weapons[32], num; get_user_weapons(id,weapons,num); // get weapons
new foundweapon; // if we found the weapon yet (and if we did how much ammo for it)
// loop through weapons for(new i=0;i<num;i++) { new checkweaponname[32]; get_weaponname(weapons[i],checkweaponname,31);
if(equal(weaponname,checkweaponname)) { // compare names new clip, ammo; // clip and ammo get_user_ammo(id,weapons[i],clip,ammo); // get clip and ammo foundweapon = ammo; // return amount in clip (for multiple FBs) break; } }
return foundweapon; }
// clear user's grenades public clear_nades(id) { new currnade;
// go through fake HE grenades currnade = -1; while((currnade = find_ent_by_class(currnade,"fake_hegrenade")) > 0) { if(entity_get_int(currnade,EV_ENT_owner) == id) { remove_entity(currnade); } }
// go through fake smoke grenades currnade = -1; while((currnade = find_ent_by_class(currnade,"fake_smokegrenade")) > 0) { if(entity_get_int(currnade,EV_ENT_owner) == id) { remove_entity(currnade); } }
// go through fake flashbangs currnade = -1; while((currnade = find_ent_by_class(currnade,"fake_flashbang")) > 0) { if(entity_get_int(currnade,EV_ENT_owner) == id) { remove_entity(currnade); } } }
// plugin precache public plugin_precache() { precache_model("models/w_hegrenade123.mdl"); precache_model("models/w_flashbang123.mdl"); precache_model("models/w_smokegrenade123.mdl"); precache_sound("weapons/he_bounce-1.wav"); }
// plugin initiation public plugin_init() { register_plugin("CSNadeDrops","0.14","Avalanche"); console_print(0,"* CSNadeDrops 0.14 by Avalanche");
register_event("Damage","event_damage","b","2!0"); // damage event register_event("ResetHUD","event_resethud","b"); // reset HUD event
register_cvar("mp_nadedrops","1",FCVAR_PRINTABLEONLY); // cvar to disable/enable plugin register_cvar("mp_nadedropsounds","1",FCVAR_PRINTABLEONLY); // cvar to disable/enable nade drop sounds
// get the mod's name new modname[32]; get_modname(modname,31);
// if this isn't Counter-Strike if(!equal(modname,"cstrike")) { pause("ae"); // lock the plugin } } A: -
|