#include maps\_utility; #include maps\_createfx; #include common_scripts\utility; menu ( name ) { return level.create_fx_menu == name; } setmenu ( name ) { level.create_fx_menu = name; } create_fx_menu() { if ( button_is_clicked( "escape", "x" ) ) { exit_menu(); return; } if (menu("creation")) { if (button_is_clicked("1")) { setmenu("create_oneshot"); draw_effects_list(); return; } if (button_is_clicked("2")) { setmenu("create_loopfx"); draw_effects_list(); return; } if (button_is_clicked("3")) { setmenu("create_loopsound"); ent = createLoopSound(); finish_creating_entity( ent ); return; } if (button_is_clicked("4")) { setmenu("create_exploder"); ent = createNewExploder(); finish_creating_entity( ent ); return; } } else if (menu("create_oneshot") || menu("create_loopfx") || menu("change_fxid")) { if (button_is_clicked("rightarrow")) { increment_list_offset(); draw_effects_list(); } menu_fx_creation(); } else if (menu("none")) { if (button_is_clicked("rightarrow")) { increment_list_offset(); } menu_change_selected_fx(); if ( entities_are_selected() ) { display_fx_info( get_last_selected_entity() ); if ( button_is_clicked( "a" ) ) { clear_settable_fx(); setMenu( "add_options" ); } } } else if ( menu( "add_options" ) ) { if ( !entities_are_selected() ) { clear_fx_hudElements(); setMenu("none"); return; } display_fx_add_options( get_last_selected_entity() ); if (button_is_clicked("rightarrow")) { increment_list_offset(); } } else if ( menu( "change_type" ) ) { if ( !entities_are_selected() ) { clear_fx_hudElements(); setMenu("none"); return; } else { menu_fx_type(); } } } exit_menu() { clear_fx_hudElements(); clear_entity_selection(); update_selected_entities(); setmenu("none"); } get_last_selected_entity() { return level.selected_fx_ents[level.selected_fx_ents.size-1]; } menu_fx_creation() { count = 0; picked_fx = undefined; keys = get_level_ambient_fx(); for ( i=level.effect_list_offset; i level.effect_list_offset_max ) { break; } } if ( !isdefined( picked_fx ) ) { return; } if ( menu("change_fxid") ) { apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); level.effect_list_offset = 0; clear_fx_hudElements(); setMenu("none"); return; } ent = undefined; if (menu("create_loopfx")) { ent = createLoopEffect( picked_fx ); } if (menu("create_oneshot")) { ent = createOneshotEffect( picked_fx ); } finish_creating_entity( ent ); } finish_creating_entity( ent ) { ent.v["angles"] = vectortoangles( ( ent.v["origin"] + (0,0,100) ) - ent.v["origin"] ); assert( isdefined( ent ) ); ent post_entity_creation_function(); clear_entity_selection(); select_last_entity(); move_selection_to_cursor( ); update_selected_entities(); setMenu("none"); } change_effect_to_oneshot( ent ) { if ( ent.v["type"] == "exploder" ) { ent.v[ "exploder" ] = undefined; ent.v[ "exploder_type" ] = undefined; ent.v[ "soundalias" ] = undefined; } if ( ent.v["delay"] == 0 ) { ent.v["delay"] = -15; } ent.v[ "type" ] = "oneshotfx"; } change_effect_to_loop( ent ) { if ( ent.v["type"] == "exploder" ) { ent.v[ "exploder" ] = undefined; ent.v[ "exploder_type" ] = undefined; ent.v[ "soundalias" ] = undefined; } if ( ent.v["delay"] <= 0 ) { ent.v["delay"] = 1; } ent.v[ "type" ] = "loopfx"; } change_effect_to_exploder( ent ) { ent.v[ "type" ] = "exploder"; ent.v[ "soundalias" ] = "nil"; if ( ent.v["delay"] < 0 ) { ent.v["delay"] = 0; } ent.v[ "exploder" ] = 1; ent.v[ "exploder_type" ] = "normal"; } change_ent_type( newtype ) { if ( newtype == "oneshotfx" ) { for (i=0; i < level.selected_fx_ents.size; i++) { change_effect_to_oneshot( level.selected_fx_ents[i] ); } } else if ( newtype == "loopfx" ) { for (i=0; i < level.selected_fx_ents.size; i++) { change_effect_to_loop( level.selected_fx_ents[i] ); } } else if ( newtype == "exploder" ) { for (i=0; i < level.selected_fx_ents.size; i++) { change_effect_to_exploder( level.selected_fx_ents[i] ); } } } menu_init() { level.createFX_options = []; addOption("string", "type", "Type", "oneshotfx", "fx"); addOption("string", "fxid", "Name", "nil", "fx"); addOption("float", "delay", "Repeat rate/start delay", 0.5, "fx"); addOption("int", "repeat", "Number of times to repeat", 5, "exploder"); addOption("float", "delay_min", "Minimum time between repeats", 1, "exploder"); addOption("float", "delay_max", "Maximum time between repeats", 2, "exploder"); addOption("float", "fire_range", "Fire damage range", 0, "fx"); addOption( "string", "firefx", "2nd FX id", "nil", "exploder" ); addOption("float", "firefxdelay", "2nd FX id repeat rate", 0.5, "exploder"); addOption("float", "firefxtimeout", "2nd FX timeout", 5, "exploder"); addOption("string", "firefxsound", "2nd FX soundalias", "nil", "exploder"); addOption("string", "ender", "Level notify for ending 2nd FX", "nil", "exploder"); addOption("string", "rumble", "Rumble", "nil", "exploder"); addOption("float", "damage", "Radius damage", 150, "exploder"); addOption("float", "damage_radius", "Radius of radius damage", 250, "exploder"); addOption("int", "exploder", "Exploder", 1, "exploder"); addOption("string", "earthquake", "Earthquake", "nil", "exploder"); addOption("string", "soundalias", "Soundalias", "nil", "all"); addOption( "int", "stoppable", "Can be stopped from script", "1", "all" ); level.effect_list_offset = 0; level.effect_list_offset_max = 9; level.createfxMasks = []; level.createfxMasks["all"] = []; level.createfxMasks["all"]["exploder"] = true; level.createfxMasks["all"]["oneshotfx"] = true; level.createfxMasks["all"]["loopfx"] = true; level.createfxMasks["all"]["soundfx"] = true; level.createfxMasks["fx"] = []; level.createfxMasks["fx"]["exploder"] = true; level.createfxMasks["fx"]["oneshotfx"] = true; level.createfxMasks["fx"]["loopfx"] = true; level.createfxMasks["exploder"] = []; level.createfxMasks["exploder"]["exploder"] = true; level.createfxMasks["loopfx"] = []; level.createfxMasks["loopfx"]["loopfx"] = true; level.createfxMasks["oneshotfx"] = []; level.createfxMasks["oneshotfx"]["oneshotfx"] = true; level.createfxMasks["soundfx"] = []; level.createfxMasks["soundfx"]["soundalias"] = true; } get_last_selected_ent() { return level.selected_fx_ents[level.selected_fx_ents.size-1]; } entities_are_selected() { return level.selected_fx_ents.size > 0; } menu_change_selected_fx() { if (!level.selected_fx_ents.size) { return; } count = 0; drawnCount = 0; ent = get_last_selected_ent(); for ( i=0; i level.effect_list_offset_max) { more = true; break; } } } prepare_option_for_change( option, drawnCount ) { if ( option["name"] == "fxid" ) { setMenu( "change_fxid" ); draw_effects_list(); return; } if ( option["name"] == "type" ) { setMenu( "change_type" ); return; } createfx_centerprint( "To change " + option["description"] + " on selected entities, type /fx newvalue"); level.createfx_inputlocked = true; set_option_index(option["name"]); setdvar("fx", "nil"); level.createFxHudElements[ drawnCount+3 ][0].color = (1,1,0); } menu_fx_option_set() { if (GetDvar( #"fx") == "nil") { return; } option = get_selected_option(); setting = undefined; if (option["type"] == "string") { setting = GetDvar( #"fx"); } if (option["type"] == "int") { setting = GetDvarInt( #"fx"); } if (option["type"] == "float") { setting = GetDvarFloat( #"fx"); } apply_option_to_selected_fx( option, setting ); } menu_fx_type() { clear_fx_hudElements(); set_fx_hudElement("Change effect type to:"); set_fx_hudElement(" (1) Oneshot"); set_fx_hudElement(" (2) Looped"); set_fx_hudElement(" (3) Exploder"); set_fx_hudElement("(x) Exit >"); if (button_is_clicked("1") && (!button_is_held("f")) ) { change_ent_type( "oneshotfx" ); setmenu( "none" ); } else if (button_is_clicked("2") && (!button_is_held("f")) ) { change_ent_type( "loopfx" ); setmenu( "none" ); } else if (button_is_clicked("3") && (!button_is_held("f")) ) { change_ent_type( "exploder" ); setmenu( "none" ); } if ( menu( "none" ) ) { update_selected_entities(); } } apply_option_to_selected_fx( option, setting ) { for ( i=0; i level.effect_list_offset_max) { more = true; break; } } if ( count > level.effect_list_offset_max ) { set_fx_hudElement( "(->) Next Page >"); } set_fx_hudElement( "(a) Add >"); set_fx_hudElement( "(x) Exit >"); } else { count = 0; more = false; for ( i=0; i level.createFx_hudElements ) { break; } } } } display_fx_add_options( ent ) { assert(menu("add_options")); assert(entities_are_selected()); clear_fx_hudElements(); set_fx_hudElement("Name: " + ent.v["fxid"]); set_fx_hudElement("Origin: " + ent.v["origin"]); set_fx_hudElement("Distance: " + get_distance_from_ent( ent )); set_fx_hudElement("Angles: " + ent.v["angles"]); count = 0; drawnCount = 0; more = false; if ( level.effect_list_offset >= level.createFX_options.size ) { level.effect_list_offset = 0; } for ( i=0; i < level.createFX_options.size; i++ ) { option = level.createFX_options[ i ]; if ( isdefined( ent.v[ option["name"] ] ) ) { continue; } if ( !mask ( option["mask"], ent.v["type"] ) ) { continue; } count++; if ( count < level.effect_list_offset ) { continue; } if (drawnCount >= level.effect_list_offset_max) { continue; } drawnCount++; button_to_check = drawnCount; if ( button_to_check == 10 ) { button_to_check = 0; } if ( button_is_clicked( button_to_check + "" ) && (!button_is_held("f")) ) { add_option_to_selected_entities( option ); menuNone(); return; } set_fx_hudElement( button_to_check + ". " + option["description"] ); } if ( count > level.effect_list_offset_max ) { set_fx_hudElement( "(->) Next Page >"); } set_fx_hudElement( "(x) Exit >"); } add_option_to_selected_entities( option ) { setting = undefined; for ( i=0; i= keys.size) { level.effect_list_offset = 0; } for ( i=level.effect_list_offset; i= level.effect_list_offset_max) { more = true; break; } } if (keys.size > level.effect_list_offset_max) { set_fx_hudElement( "(->) Next Page >"); } } increment_list_offset() { level.effect_list_offset += level.effect_list_offset_max; } decrement_list_offset() { level.effect_list_offset += level.effect_list_offset_max; } get_level_ambient_fx() { if ( !isdefined( level._effect_keys ) ) { keys = getarraykeys(level._effect); level._effect_keys = []; k = 0; for (i=0; i < keys.size; i++) { if ( isSubStr(keys[i],"fx_") ) { level._effect_keys[k] = keys[i]; k++; } } if ( level._effect_keys.size == 0 ) { level._effect_keys = keys; } } return level._effect_keys; } get_distance_from_ent( ent ) { players = get_players(); return distance(players[0].origin, ent.v["origin"]); }