Showing preview only (2,032K chars total). Download the full file or copy to clipboard to get everything.
Repository: bmddota/barebones
Branch: source2
Commit: 873bcb971c12
Files: 400
Total size: 1.8 MB
Directory structure:
gitextract_xun1b86s/
├── .gitattributes
├── .gitignore
├── AnimationsChangeLog.md
├── AttachmentsChangeLog.md
├── ChangeLog.md
├── CollidersReadme.md
├── ContainersChangeLog.md
├── LICENSE
├── ModmakerChangeLog.md
├── NOTICE
├── NotificationsChangeLog.md
├── PathGraphChangeLog.md
├── PhysicsChangeLog.md
├── PhysicsReadme.md
├── PlayerTablesChangeLog.md
├── ProjectilesChangeLog.md
├── ProjectilesReadme.md
├── README.md
├── TimersChangeLog.md
├── WorldPanelsChangeLog.md
├── content/
│ └── dota_addons/
│ └── barebones/
│ ├── maps/
│ │ ├── playground.vmap
│ │ └── template_map.vmap
│ ├── materials/
│ │ ├── example/
│ │ │ ├── sand_path_example_color.tif
│ │ │ ├── sand_path_example_normal.tif
│ │ │ └── sand_path_example_refl.tif
│ │ ├── overviews/
│ │ │ ├── playground.tga
│ │ │ ├── playground.txt
│ │ │ ├── playground.vmat
│ │ │ ├── template_map.tga
│ │ │ ├── template_map.txt
│ │ │ └── template_map.vmat
│ │ └── particle/
│ │ ├── basic_glow.tga
│ │ ├── basic_glow.vtex
│ │ ├── basic_rope.psd
│ │ ├── basic_rope.vtex
│ │ ├── basic_rope_energy.tga
│ │ ├── basic_rope_energy.vtex
│ │ ├── basic_smoke.tga
│ │ ├── basic_smoke.vtex
│ │ ├── basic_trail.tga
│ │ └── basic_trail.vtex
│ ├── panorama/
│ │ ├── layout/
│ │ │ └── custom_game/
│ │ │ ├── barebones_attachments.xml
│ │ │ ├── barebones_notifications.xml
│ │ │ ├── barebones_worldpanels.xml
│ │ │ ├── containers/
│ │ │ │ ├── alt_container_example.xml
│ │ │ │ ├── container.xml
│ │ │ │ ├── container_base.xml
│ │ │ │ ├── dota_inventory.xml
│ │ │ │ ├── dota_inventory_context_menu.xml
│ │ │ │ ├── dota_inventory_item.xml
│ │ │ │ ├── inventory_context_menu.xml
│ │ │ │ └── inventory_item.xml
│ │ │ ├── custom_loading_screen.xml
│ │ │ ├── custom_ui_manifest.xml
│ │ │ ├── modmaker/
│ │ │ │ ├── modmaker.xml
│ │ │ │ ├── modmaker_api_category.xml
│ │ │ │ └── modmaker_api_property.xml
│ │ │ ├── selection.xml
│ │ │ └── worldpanels/
│ │ │ ├── arrow.xml
│ │ │ └── healthbar.xml
│ │ ├── scripts/
│ │ │ ├── barebones_attachments.js
│ │ │ ├── barebones_notifications.js
│ │ │ ├── barebones_worldpanels.js
│ │ │ ├── containers/
│ │ │ │ ├── container.js
│ │ │ │ ├── container_base.js
│ │ │ │ ├── container_events.js
│ │ │ │ ├── dota_inventory.js
│ │ │ │ ├── dota_inventory_context_menu.js
│ │ │ │ ├── dota_inventory_item.js
│ │ │ │ ├── inventory_context_menu.js
│ │ │ │ └── inventory_item.js
│ │ │ ├── modmaker/
│ │ │ │ ├── modmaker.js
│ │ │ │ ├── modmaker_api_category.js
│ │ │ │ └── modmaker_api_property.js
│ │ │ ├── playertables/
│ │ │ │ └── playertables_base.js
│ │ │ ├── selection/
│ │ │ │ ├── selection.js
│ │ │ │ └── selection_filter.js
│ │ │ └── worldpanels/
│ │ │ ├── arrow.js
│ │ │ └── healthbar.js
│ │ └── styles/
│ │ ├── barebones_attachments.css
│ │ ├── barebones_notifications.css
│ │ ├── containers/
│ │ │ ├── container.css
│ │ │ └── container_skins.css
│ │ ├── custom_loading_screen.css
│ │ ├── modmaker/
│ │ │ └── modmaker.css
│ │ └── worldpanels/
│ │ ├── arrow.css
│ │ └── healthbar.css
│ ├── particles/
│ │ ├── basic_ambient/
│ │ │ ├── basic_ambient.vpcf
│ │ │ └── basic_ambient_readme.txt
│ │ ├── basic_explosion/
│ │ │ ├── basic_explosion.vpcf
│ │ │ ├── basic_explosion_bits.vpcf
│ │ │ ├── basic_explosion_burst.vpcf
│ │ │ ├── basic_explosion_flash.vpcf
│ │ │ └── basic_explosion_readme.txt
│ │ ├── basic_projectile/
│ │ │ ├── basic_projectile.vpcf
│ │ │ ├── basic_projectile_explosion.vpcf
│ │ │ ├── basic_projectile_explosion_flash.vpcf
│ │ │ ├── basic_projectile_launch.vpcf
│ │ │ ├── basic_projectile_readme.txt
│ │ │ └── basic_projectile_trail.vpcf
│ │ ├── basic_rope/
│ │ │ ├── basic_rope.vpcf
│ │ │ └── basic_rope_readme.txt
│ │ ├── basic_trail/
│ │ │ └── basic_trail.vpcf
│ │ ├── frostivus_gameplay/
│ │ │ ├── damage_flash_b_frostivus.vpcf
│ │ │ ├── damage_flash_big_frostivus.vpcf
│ │ │ ├── damage_flash_c_frostivus.vpcf
│ │ │ ├── damage_flash_d_frostivus.vpcf
│ │ │ ├── drow_base_attack_explosion.vpcf
│ │ │ ├── drow_base_attack_explosion_flash.vpcf
│ │ │ ├── drow_base_attack_explosion_flash_b.vpcf
│ │ │ ├── drow_base_attack_launch.vpcf
│ │ │ ├── drow_base_attack_trail.vpcf
│ │ │ ├── drow_base_attack_trail_c.vpcf
│ │ │ ├── drow_frost_arrow_explosion.vpcf
│ │ │ ├── drow_frost_arrow_explosion_b.vpcf
│ │ │ ├── drow_frost_arrow_explosion_c.vpcf
│ │ │ ├── drow_frost_arrow_explosion_d.vpcf
│ │ │ ├── drow_frost_arrow_explosion_e.vpcf
│ │ │ ├── drow_frost_arrow_launch.vpcf
│ │ │ ├── drow_frost_arrow_launch_b.vpcf
│ │ │ ├── drow_frost_arrow_model.vpcf
│ │ │ ├── drow_ice_trail.vpcf
│ │ │ ├── drow_ice_trail_b.vpcf
│ │ │ ├── drow_ice_trail_c.vpcf
│ │ │ ├── drow_linear_arrow.vpcf
│ │ │ ├── drow_linear_frost_arrow.vpcf
│ │ │ ├── frostivus_death_creep.vpcf
│ │ │ ├── frostivus_hero_light.vpcf
│ │ │ ├── frostivus_hero_light_b.vpcf
│ │ │ ├── frostivus_last_hit_effect.vpcf
│ │ │ ├── frostivus_last_hit_effect_b.vpcf
│ │ │ ├── frostivus_leshrac_split_earth.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_b.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_c.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_d.vpcf
│ │ │ ├── frostivus_leshrac_split_flash.vpcf
│ │ │ ├── frostivus_leshrac_split_projected.vpcf
│ │ │ ├── frostivus_leshrac_split_projected_scortch.vpcf
│ │ │ ├── frostivus_leshrac_split_pulse.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_groundflash_lines.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_lights.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_sparkles.vpcf
│ │ │ ├── frostivus_lightbeam.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_ember.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_ember_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_c.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_d.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_e.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_f.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_light.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch_smoke.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_skull.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_sphere_glow.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_sphere_glow_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_d.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_detail.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_detail_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_e.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_f.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_g.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_h.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_i.vpcf
│ │ │ ├── frostivus_spirit_trail.vpcf
│ │ │ ├── frostivus_spirit_trail_b.vpcf
│ │ │ ├── frostivus_spirit_trail_big.vpcf
│ │ │ ├── frostivus_spirit_trail_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_a.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_f.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_g.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_h.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_i.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_j.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_c_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_d.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_e.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_endcap.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_f.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_g.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_h.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_i.vpcf
│ │ │ ├── frostivus_throne_wraith_king_explode.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirit_trail.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirit_trail_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirits.vpcf
│ │ │ ├── frostivus_wraithking_tombstone.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_ember.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_ember_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_c.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_d.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_e.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_f.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_light.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch_smoke.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_skull.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_sphere_glow.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_sphere_glow_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_d.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_detail.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_detail_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_e.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_f.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_g.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_h.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_i.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_warmup.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_warmup_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_explode_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_explode_c.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final_grid.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final_grid_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_glow_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_ice.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_ice_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_initial_explode.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_main.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_glow_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_smoke.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_smoke_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_halo.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_burst.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image_ember.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image_flash.vpcf
│ │ │ ├── holdout_omnislash_trail_glow.vpcf
│ │ │ ├── holdout_omnislash_trail_glow_b.vpcf
│ │ │ ├── legion_gladiators_rays.vpcf
│ │ │ ├── legion_gladiators_ring.vpcf
│ │ │ ├── legion_gladiators_ring_aura.vpcf
│ │ │ ├── legion_gladiators_ring_dust.vpcf
│ │ │ ├── legion_gladiators_ring_dust_detail.vpcf
│ │ │ ├── legion_gladiators_start_endcap.vpcf
│ │ │ ├── legion_gladiators_start_line.vpcf
│ │ │ ├── legion_gladiators_start_line_light.vpcf
│ │ │ ├── legion_gladiators_start_ring.vpcf
│ │ │ ├── legion_gladiators_start_ring_banner_light.vpcf
│ │ │ ├── legion_gladiators_start_ring_energy.vpcf
│ │ │ ├── legion_gladiators_start_ring_flags.vpcf
│ │ │ ├── legion_gladiators_start_ring_flash.vpcf
│ │ │ ├── legion_gladiators_start_ring_outer_rope.vpcf
│ │ │ ├── legion_gladiators_start_ring_rope.vpcf
│ │ │ ├── witch_buff.vpcf
│ │ │ ├── witch_buff_b.vpcf
│ │ │ ├── witch_buff_c.vpcf
│ │ │ ├── witch_buff_d.vpcf
│ │ │ ├── wraith_king_heal.vpcf
│ │ │ ├── wraith_king_heal_flash_b.vpcf
│ │ │ ├── wraith_king_heal_flash_glow.vpcf
│ │ │ ├── wraith_king_heal_rings.vpcf
│ │ │ ├── wraith_king_heal_twinkle.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_e.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_ember.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_ember_b.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion_c.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion_d.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_light.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_b.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_c.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_d.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_explode.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_explode_b.vpcf
│ │ │ ├── wraith_king_spirit_trail_c.vpcf
│ │ │ ├── wraith_king_spirits_2.vpcf
│ │ │ └── wraith_king_tombstone_tether.vpcf
│ │ ├── frostivus_herofx/
│ │ │ ├── drow_base_attack_explosion.vpcf
│ │ │ ├── drow_base_attack_explosion_flash.vpcf
│ │ │ ├── drow_base_attack_explosion_flash_b.vpcf
│ │ │ ├── drow_base_attack_launch.vpcf
│ │ │ ├── drow_base_attack_trail.vpcf
│ │ │ ├── drow_base_attack_trail_c.vpcf
│ │ │ ├── drow_linear_arrow.vpcf
│ │ │ ├── holdout_guardian_angel_wings.vpcf
│ │ │ ├── juggernaut_fs_bladeswipe_flash.vpcf
│ │ │ ├── juggernaut_fs_bladeswipe_rope.vpcf
│ │ │ ├── juggernaut_fs_omnislash_attack_blur_3.vpcf
│ │ │ ├── juggernaut_fs_omnislash_slashers.vpcf
│ │ │ ├── juggernaut_fs_omnislash_tgt.vpcf
│ │ │ ├── juggernaut_fsos_caster.vpcf
│ │ │ ├── juggernaut_fsos_caster_grndhit.vpcf
│ │ │ ├── juggernaut_fsos_caster_scortch.vpcf
│ │ │ ├── juggernaut_fsos_flash.vpcf
│ │ │ ├── juggernaut_fsos_flashbang.vpcf
│ │ │ ├── juggernaut_fsos_flashbang_glow2.vpcf
│ │ │ ├── juggernaut_fsos_flashbang_ray.vpcf
│ │ │ ├── juggernaut_omnislash_ascension.vpcf
│ │ │ ├── juggernaut_omnislash_ascension_sparkrays.vpcf
│ │ │ ├── juggernaut_omnislash_ascension_sparks.vpcf
│ │ │ ├── maiden_holdout_arcane_buff.vpcf
│ │ │ ├── maiden_holdout_arcane_buff_caster.vpcf
│ │ │ ├── maiden_holdout_arcane_buff_snow_c.vpcf
│ │ │ ├── queen_shadow_strike_core_linear.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_flare.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_glow.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_light.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_ring.vpcf
│ │ │ ├── queen_shadow_strike_explosion_flash_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_points_b_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_points_linear.vpcf
│ │ │ ├── queen_shadow_strike_glow_linear.vpcf
│ │ │ ├── queen_shadow_strike_linear.vpcf
│ │ │ ├── queen_shadow_strike_linear_glow_core.vpcf
│ │ │ ├── queen_shadow_strike_linear_parent.vpcf
│ │ │ ├── queen_shadow_strike_trail_c_linear.vpcf
│ │ │ └── queen_shadow_strike_trail_linear.vpcf
│ │ ├── material_change.vpcf
│ │ ├── test_particle/
│ │ │ ├── channel_field_1.vpcf
│ │ │ ├── channel_field_2.vpcf
│ │ │ ├── creature_spiked_carapace.vpcf
│ │ │ ├── creature_spiked_carapace_b.vpcf
│ │ │ ├── damage_immunity.vpcf
│ │ │ ├── damage_immunity_b.vpcf
│ │ │ ├── leshrac_splitearth_groundflash_lines.vpcf
│ │ │ ├── leshrac_splitearth_sparkles.vpcf
│ │ │ ├── ogre_melee_smash.vpcf
│ │ │ ├── ogre_melee_smash_c.vpcf
│ │ │ ├── ogre_melee_smash_flash.vpcf
│ │ │ ├── ogre_melee_smash_projected.vpcf
│ │ │ ├── ogre_melee_smash_pulse.vpcf
│ │ │ └── ogre_melee_smash_scorch.vpcf
│ │ └── test_shot.vpcf
│ └── soundevents/
│ └── game_sounds_custom.vsndevts
└── game/
└── dota_addons/
└── barebones/
├── addoninfo.txt
├── network_measurement.txt
├── panorama/
│ └── localization/
│ └── addon_english.txt
├── panorama_debugger.cfg
├── resource/
│ ├── addon_english.txt
│ ├── flash3/
│ │ └── custom_ui.txt
│ └── overviews/
│ ├── dota_pvp.txt
│ ├── playground.txt
│ └── template_map.txt
└── scripts/
├── addon_hud_textures.txt
├── attachments.txt
├── custom_net_tables.txt
├── npc/
│ ├── herolist.txt
│ ├── npc_abilities_custom.txt
│ ├── npc_abilities_override.txt
│ ├── npc_heroes_custom.txt
│ ├── npc_items_custom.txt
│ └── npc_units_custom.txt
├── shops.txt
└── vscripts/
├── addon_game_mode.lua
├── animation_example/
│ └── heroes/
│ ├── axe/
│ │ └── axe.lua
│ └── legion_commander/
│ └── legion_commander.lua
├── events.lua
├── examples/
│ ├── colliders.lua
│ ├── modifier_no_health.lua
│ ├── notificationsExample.lua
│ ├── playground.lua
│ ├── projectile.lua
│ └── worldpanelsExample.lua
├── gamemode.lua
├── internal/
│ ├── events.lua
│ ├── eventtest.lua
│ ├── gamemode.lua
│ └── util.lua
├── libraries/
│ ├── abilities/
│ │ ├── containers_lua_targeting.lua
│ │ ├── containers_lua_targeting_tree.lua
│ │ └── item_containers_lua_pack.lua
│ ├── animations.lua
│ ├── attachments.lua
│ ├── containers.lua
│ ├── modifiers/
│ │ ├── modifier_animation.lua
│ │ ├── modifier_animation_freeze.lua
│ │ ├── modifier_animation_translate.lua
│ │ ├── modifier_animation_translate_permanent.lua
│ │ └── modifier_shopkeeper.lua
│ ├── modmaker.lua
│ ├── notifications.lua
│ ├── pathgraph.lua
│ ├── physics.lua
│ ├── physics_old.lua
│ ├── playertables.lua
│ ├── projectiles.lua
│ ├── selection.lua
│ ├── timers.lua
│ └── worldpanels.lua
└── settings.lua
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
================================================
FILE: .gitignore
================================================
#################
## Eclipse
#################
*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
#################
## Visual Studio
#################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
*.pubxml
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#############
## Windows detritus
#############
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
#############
## Python
#############
*.py[co]
# Packages
*.egg
*.egg-info
dist/
build/
eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
#Translations
*.mo
#Mr Developer
.mr.developer.cfg
#############
# DOTA 2
#############
*.vpk
*.vpcf_c
*.vsnd_c
*.vsndevts_c
*.vmat_c
*.vtex_c
*.bin
*.vxml_c
*.vcss_c
*.vjs_c
================================================
FILE: AnimationsChangeLog.md
================================================
# animations.lua ChangeLog
### Version 1.00
- Updated version number to reflect Barebones 1.0 release
### Version 0.84
- Added FreezeAnimation function to allow for animations to be paused at any time
- Added UnfreezeAnimation function to allow animations to be unpaused at any time
### Version 0.83
- Fixed an issue where perfectly sequential animations would not play
- Added several missing translate activity modifiers
- Added AddAnimationTranslate and RemoveAnimationTranslate commands to allow for easily adding/removing permanent translates like "injured"/"haste", etc
### Version 0.80
- Added animations.lua library
================================================
FILE: AttachmentsChangeLog.md
================================================
# attachments.lua ChangeLog
### Version 1.00
- Ensured that created attachment props have unique entity names.
- Fixed a bug related to the "Particles" section of the attachment database breaking on AttachProp
- Made it so that you don't have to enter the addon name when doing "attachment_configure"
- Fixed GetCurrentAttachment not working in normal non-gui use
### Version 0.85
- Added the ability to attach multiple particles to a given prop.
### Version 0.84
- Added handling of Particle attachments to props via the attachments.txt database.
- Added Particle example to example attachments.txt database.
- Fixed the Attachments Configuration system being able to override extra keys placed in individual attachment definitions. Extra key/values will not stick through saves/loads.
- Added optional "Animation" key to attachment properties in the attachments.txt database which will spawn the prop in question and force it into the given animation string.
### Version 0.83
- Fixed debug spheres appearing when using AttachProp from in game.
- Fixed attachments.txt database scale not being used when scale is omitted from AttachProp call.
### Version 0.82
- Added the ability to press Enter in any TextEntry to submit changes in the Attachment Configuration GUI
- Added the ability to scale the value of the + and - buttons for coarse and fine refinement
- Added the ability to toggle on/off the Debug Spheres showing the attachment point and prop point
- Removed the dependency on an external lua_modifier by internalizing the modifier definition to attachments.lua
- Removed the stun particle effect when Freezing a unit
### Version 0.81
- Added the ability to set a prop to attach to "attach_origin" point, even if this attach string does not directly exist
- Removed extra "model" and "attach" properties from being saved to the attachment database
- Fixed up the model scale settings so that changing the scale of a model after attaching a prop will maintain prop proportions
- Added Attachments:GetAttachmentDatabase() function
- Adjusted the default scripts/attachments.txt database to contain correct values for a couple demonstration prop attaches
### Version 0.80
- Added attachments.lua library
================================================
FILE: ChangeLog.md
================================================
# Barebones ChangeLog
### Version 1.01c
- Added example "REMOVE" lines to npc_abilities_override.txt for the new 6.87 items.
### Version 1.01b
- [physics.lua] Fixed visual issue in physics.lua box drawing + CreateBox bug
### Version 1.01a
- [worldpanels.lua] Added "data" object which can be added in the world panel configuration table to send arbitrary primitive data to the created worldpanel in javascript, accessible as $.GetContextPanel().Data
- [worldpanels.lua] Fixed an issue with completely client-unknown entities immideately deleting their world panels on create.
### Version 1.01
- New Library: WorldPanels -- Containers allows for creating panorama layout panels that track the world position of an entity (or fixed world coordinate).
### Version 1.00
- New Library: Containers -- Containers allows for additional inventory/item containing objects and shops
- New Library: (by Noya): Selection API.
- New Library: PathGraph -- Constructs a full-edge graph of all "path_corner" objects.
- New Library: Modmaker -- Offers a searchable version of the lua server vscript API through the "modmaker_api" console command (in tools mode)
- Fixed HideWearables utility function.
- Fixed OnItemPickedUp to work if a non-hero unit picks up an item.
- Fixed a minor potential deficiency in the randomseed selection
- Removed the need to call internal Barebones functions from the implementation events.lua
- Re-enabled "barebones_spew" cvar to allow for adjusting the visibility of barebones debugging messages
- Added new dota items to the commented out removal lines in npc_abilities_override.txt
- Added several new settings to settings.lua.
- Added an "animation_example" folder containing a demonstration of lua-scripted animation adjustments for models.
- [attachments.lua] Ensured that created attachment props have unique entity names.
- [attachments.lua] Fixed a bug related to the "Particles" section of the attachment database breaking on AttachProp
- [attachments.lua] Made it so that you don't have to enter the addon name when doing "attachment_configure"
- [attachments.lua] Fixed GetCurrentAttachment not working in normal non-gui use
- [projectiles.lua] Added a bDestroyImmediate property to the projectile definition which determines whether the DestroyParticle call should perform an immediate destruction.
- [projectiles.lua] Fixed a bug with changing velocity of certain projectiles.
- [projectiles.lua] Fixed a bug with OnFinish on ground collision.
- [projectiles.lua] Fixed an issue where projectile:Destroy() did not halt the particle simulation.
- [projectiles.lua] Added projectile:GetCreationTime(), projectile:GetDistanceTraveled(), projectile:GetPosition(), projectile:GetVelocity()
- [projectiles.lua] Projectiles now reports its thinker as "projectiles_lua_thinker" if the Entity System warns of the projectiles simulation running too long in console.
- [physics.lua] Updated to a new order of operations within the simulation. If your existing code breaks, use physics_old.lua to maintain the old operation order.
- [physics.lua] Fixed an issue where unit:StopPhysicsSimulation() did not halt the physics simulation.
- [physics.lua] Calling Physics:Unit again now reinitializes the simulation in tools mode, but is ignored in live game mode.
- [physics.lua] Added a flat friction in addition to the percentage friction already existing.
- [physics.lua] Added static velocity setting/getting to manipulate individual force components separate from the combined force.
- [physics.lua] Added the ability to have a physics unit cut trees as it moves.
- [physics.lua] Added the ability for a unit to navigate according to the slope of the terrain itself for non-GNV navigation.
- [physics.lua] Physics now reports its thinker as "physics_lua_thinker" if the Entity System warns of the physics simulation running too long in console.
- [timers.lua] Added a shorthand for Timers:CreateTimer(...) as Timers(...)
- [timers.lua] Timers now continue to run after the game ends for post-game timing execution.
- [timers.lua] Timers library is now accessible as GameRules.Timers for instances where the Timers global is out of scope (triggers, etc)
- [timers.lua] Timers now allows a timer to successfully call Timers:RemoveTimer on itself from within the execution callback of the timer
- [timers.lua] Timers now reports its thinker as "timers_lua_thinker" if the Entity System warns of timers running too long in console.
### Version 0.95c
- Removed the RegisterConvar call from internal/gamemode.lua since Valve broke it and has yet to fix it.
### Version 0.95b
- [attachments.lua] Added the ability to attach multiple particles to a given prop.
### Version 0.95
- [notifications.lua] Changed the names of the panorama files from barebones_hud_base.* to barebones_notifications.*
- [projectiles.lua] Fixed 0-velocity projectiles producing a divide by 0 error
### Version 0.94d
- Added HideWearables and ShowWearables global utility functions.
- [attachments.lua] Added handling of Particle attachments to props via the attachments.txt database.
- [attachments.lua] Added Particle example to example attachments.txt database.
- [attachments.lua] Fixed the Attachments Configuration system being able to override extra keys placed in individual attachment definitions. Extra key/values will not stick through saves/loads.
- [attachments.lua] Added optional "Animation" key to attachment properties in the attachments.txt database which will spawn the prop in question and force it into the given animation string.
### Version 0.94c
- [attachments.lua] Fixed debug spheres appearing when using AttachProp from in game.
- [attachments.lua] Fixed attachments.txt database scale not being used when scale is omitted from AttachProp call.
### Version 0.94b
- [attachments.lua] Added the ability to press Enter in any TextEntry to submit changes in the Attachment Configuration GUI
- [attachments.lua] Added the ability to scale the value of the + and - buttons for coarse and fine refinement
- [attachments.lua] Added the ability to toggle on/off the Debug Spheres showing the attachment point and prop point
- [attachments.lua] Removed the dependency on an external lua_modifier by internalizing the modifier definition to attachments.lua
- [attachments.lua] Removed the stun particle effect when Freezing a unit
### Version 0.94a
- [attachments.lua] Added the ability to set a prop to attach to "attach_origin" point, even if this attach string does not directly exist
- [attachments.lua] Removed extra "model" and "attach" properties from being saved to the attachment database
- [attachments.lua] Fixed up the model scale settings so that changing the scale of a model after attaching a prop will maintain prop proportions
- [attachments.lua] Added Attachments:GetAttachmentDatabase() function
- [attachments.lua] Adjusted the default scripts/attachments.txt database to contain correct values for a couple demonstration prop attaches
### Version 0.94
- Fixed the issue introduced due to Valve removing PlayerResource:HaveAllPlayersJoined()
- Added attachments.lua library and associated panorama GUI for creating attachment profiles
- Added missing hero references to herolist.txt
- Added handling for 'player_chat' event and userID->Player Entity tracking to the events.lua and internal/events.lua files
- [timers.lua] Added the ability to call a function with a table context
- [timers.lua] Added the use of the lua 'xpcall' function to give full stack traces if a timer errors out during execution.
- [animations.lua] Added FreezeAnimation function to allow for animations to be paused at any time
- [animations.lua] Added UnfreezeAnimation function to allow animations to be unpaused at any time
### Version 0.93c
- Added ability/item inflictor entity retrieval to OnEntityHurt and OnEntityKilled in events.lua
### Version 0.93b
- [animations.lua] Fixed an issue where perfectly sequential animations would not play
- [animations.lua] Added several missing translate activity modifiers
- [animations.lua] Added AddAnimationTranslate and RemoveAnimationTranslate commands to allow for easily adding/removing permanent translates like "injured"/"haste", etc
### Version 0.93
- Added animations.lua library
- Added USE_UNSEEN_FOG_OF_WAR to settings.lua to allow for turning on unseen fog of war behavior
- Updated notifications subsystem to support deleting notifications on-demand
- Added additional guards to better handle 'script_reload' for timers.lua
- Added additional guards to better handle 'script_reload' for projectiles.lua
- Added additional guards to better handle 'script_reload' for physics.lua
### Version 0.92c
- Updated notifications subsystem to support DOTAItemImage panel type.
### Version 0.92b
- Updated notifications subsystem to apply hittest="false" to all generated panels
### Version 0.92
- Updated notifications.lua to support DOTAAbilityImage and Image panel types.
- Updated notifications.lua to use a table-based function call **NOTE: Older multi-parameter calls to notifications.lua WILL FAIL.**
- Updated examples/notificationsExample.lua to reflect the new calls and table argument system.
- Fixed a simulation-failure issue with tree-handling in projectiles.lua when bCutTrees is false.
- Added changelog links for each library to Readme.md
### Version 0.91b
- Added new property to projectiles.lua projectile tables, "fVisionTickTime" which controls how quickly the projectile vision updates while the projectile is in motion.
### Version 0.91
- Began version tracking of all libraries.
- Fixed an issue where default projectiles.lua projectiles would not take on the correct velocity-oriented orientation automatically.
- Fixed an issue with the parameters for certain notifications.lua functions not accepting the "continue" parameter
### Version 0.90
- Started tracking version updates
- Updated projectiles.lua to allow for better orientation handling
- Updated projectiles.lua with new properties for projectile vision-related
- Updated ProjectilesReadme.md with new property information
- Updated examples/projectile.lua with new properties
- Fixed projectiles.lua tree detection to work with Reborn.
================================================
FILE: CollidersReadme.md
================================================
# **BMD's Lua Unit Colliders Library**
--------------------------------
See [PhysicsReadme.md](https://github.com/bmddota/barebones/blob/source2/PhysicsReadme.md) for documentation and examples on using Physics/Motion controls.
#### **How to install:**
- Drop physics.lua in with your vscripts
- Add require( 'physics' ) somewhere in your lua instantiation path
#### **How to use:**
- The colliders system can operate on regular units and Physics-units (though can only operate on Physics-units in some noted cases)
- Colliders are constructed out of collider tables, of which several profiles are provided with this library (and more can be created)
- Colliders are one of 3 primary types, COLLIDER_SPHERE, COLLIDER_BOX, or COLLIDER_AABOX
- COLLIDER_SPHERE collides with units in a sphere around the cnter and can be attached to a unit (the collider center will follow its position).
- COLLIDER_BOX is a rectangular box collider which does not need to be aligned with the X/Y axes.
- COLLIDER_AABOX is a rectangular box collider which must be aligned with the X/Y axes. These are generally far cheaper than COLLIDER_BOX.
- Colliders can be expensive. Pay close attention to the .filter and .test properties of each collider in order to improve performance.
- The easiest way to jump in with colliders is to check out the Collider Profiles and Examples sections
**Colliders Library Functions**
=============================
#### **Physics:AddCollider([name,] collider)**
This function is used for creating a collider without a profile without being tied to any particular unit. The "name" parameter is optional, but must be unique if given. Collider follows the standard collider format as given in the Collider Format section. Returns the registered collider for additional modification/reference.
#### **Physics:ColliderFromProfile(profileName[, collider])**
This function is used to create a new collider from the given collider profile name. The profile name must match a registered profile. Returns a copy of the collider profile modified with the properties passed in for the 'collider' table if given.
#### **Physics:CreateColliderProfile(profileName, profile)**
This function is used to create and register a new collider profile for the given profile name. This registered collider profile can then be used to create new colliders using the profile collider table as a base.
#### **Physics:RemoveCollider(name)**
This function removes a collider by name from the Physics API so that it is no longer processed.
**PhysicsUnit Functions**
=============================
A unit which has been converted to a Physics Unit can have a collider attached to it and managed using the following functions:
#### **AddCollider([name,] collider)**
This function can be called to add a collider (in the correct Collider Format) to the unit. An optional name can be given, or a unique name will be used. The resulting collider will be returned for further adjustment/management.
#### **AddColliderFromProfile([name,] profile, [collider])**
This function can be called to add a collider from a registered collider profile to this unit. The profile must be provided, as can an optional name or collider properties table. The resulting collider will be returned for further adjustment/management.
#### **GetColliders()**
Returns a table of all colliders attached to this unit in {name=colliderTable} format.
#### **GetMass()**
Returns the mass of this unit for use in "momentum" collider calculations. The default mass is set to 100.
#### **RemoveCollider(name)**
This function can be called to remove a collider by name from this unit. The collider will also be removed from the Physics API.
#### **SetMass(mass)**
Sets the mass of this unit for use in "momentum" collider calculations.
**Collider Table Format**
=============================
Colliders are effectively a formatted lua table which is registered with the Physics API for processing and action. All collider tables have the following properties and functions, though individual colliders can have additional properties/functions in order to support their actions:
### **COLLIDER_SPHERE Type**
| Property | Description |
| :------------ | :-----|
| draw | Whether to DebugDraw the collider for visual confirmation. Additionally, a table can be provided with color and alpha properties. |
| filter | An optional table of entities which will be checked by the collider system. If left nil all entities within possible range will be checked.|
| name | The unique string used as a registration reference for this collider
| radius | The radius within which to detect and test entities for collision |
| skipFrames | The number of frames to skip between tests. Each frame is 33 milliseconds delay. Defaults to 0 (30 checks per second) |
| skipOffset | Advanced property used to space out colliders with skipFrames. Automatically set by Physics API. |
| type | COLLIDER_SPHERE, COLLIDER_BOX, or COLLIDER_AABOX |
| Functions | Parameters | Description |
| :------------ | :---------| :-----|
| action | colliderTable, colliderUnit, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called after the preaction has run. Actual unit motion processing is done here for built-in profiles. |
| filter | colliderTable | An optional function which should return a table of entities to check. If left nil all entities within possible range will be checked. |
| preaction | colliderTable, colliderUnit, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called before the action. Use this function to add a pre-motion action to built-in profiles. |
| postaction | colliderTable, colliderUnit, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called after the action. Use this function to add a post-motion action to built-in profiles. |
| test | colliderTable, colliderUnit, collidedUnit | Called when a unit is found within the collider range to test for matching the collider criteria. This function should return true if the collider should interact with the colliding unit, and false if not. |
### **COLLIDER_BOX/COLLIDER_AABOX Type**
| Property | Description |
| :------------ | :-----|
| box | The definition of the box used in BOX and AABOX type colliders. For AABOX this is a table of two vectors defining the x,y,z mins and maxs. For BOX this is a table of three vectors defining a diagonal triangle across the box. See Physics:CreateBox().|
| draw | Whether to DebugDraw the collider for visual confirmation. Additionally, a table can be provided with color and alpha properties. |
| filter | An optional table of entities which will be checked by the collider system. If left nil all entities within possible range will be checked.|
| name | The unique string used as a registration reference for this collider |
| recollideTime | The amount of gametime to prevent a recollision with this collider by any given unit. Generally 0. |
| skipFrames | The number of frames to skip between tests. Each frame is 33 milliseconds delay. Defaults to 0 (30 checks per second) |
| skipOffset | Advanced property used to space out colliders with skipFrames. Automatically set by Physics API. |
| type | COLLIDER_SPHERE, COLLIDER_BOX, or COLLIDER_AABOX |
| Functions | Parameters | Description |
| :------------ | :---------| :-----|
| action | colliderTable, boxDefinition, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called after the preaction has run. Actual unit motion processing is done here for built-in profiles. |
| filter | colliderTable | An optional function which should return a table of entities to check. If left nil all entities within possible range will be checked. |
| preaction | colliderTable, boxDefinition, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called before the action. Use this function to add a pre-motion action to built-in profiles. |
| postaction | colliderTable, boxDefinition, collidedUnit | Called when a unit has been found within the collider and has passed the filter and test. Called after the action. Use this function to add a post-motion action to built-in profiles. |
| test | colliderTable, boxDefinition, collidedUnit | Called when a unit is found within the collider range to test for matching the collider criteria. This function should return true if the collider should interact with the colliding unit, and false if not. |
**Built-in Collider Profiles**
=============================
## **COLLIDER_SPHERE**
### **blocker**
A blocker collider blocks out either the colliding unit or the collider-attached unit whenever a successful collision is found. Can affect non-Physics units.
| Property | Description |
| :------------ | :-----|
| buffer | Additional distance beyond the collider radius to block units out that collide with this collider. Defaults to 0.|
| findClearSpace | Whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| moveSelf | If set to true, this collider will move the attached unit instead of the colliding unit. Defaults to false.|
### **delete**
A delete collider deletes the colliding unit or the collider-attached unit whenever a successful collision is found. Can affect non-Physics units.
| Property | Description |
| :------------ | :-----|
| deleteSelf | If set to true, this collider will delete the attached unit instead of the colliding unit. Defaults to true.|
| removeCollider | When this collider successfully collides with a unit, immediately remove it so as to prevent further collisions. Defaults to true. |
### **gravity**
A gravity collider applies a force to any colliding unit attracting it towards the collider-attached unit with a given force and function.
| Property | Description |
| :------------ | :-----|
| force | The amount of force/velocity in hammer units per second to apply to a colliding unit within the full-effect radius of this collider. Default is 1000.|
| fullRadius | The radius to use as the full effect radius at which point full force is applied. Defaults to 0. Must be less than the radius. |
| linear | Whether this collider should use a linear gravity force falloff between the fullRadius and radius. If set to false, uses standard quadratic falloff. Default is false.|
| minRadius | The radius to use for when a colliding unit is too close to the attached unit and should receive 0 gravitational force. An "eye-of-the-storm" radius. Default is 0.|
### **repel**
A repel collider applies a force to any colliding unit repelling it away from the collider-attached unit with a given force and function.
| Property | Description |
| :------------ | :-----|
| force | The amount of force/velocity in hammer units per second to apply to a colliding unit within the full-effect radius of this collider. Default is 1000.|
| fullRadius | The radius to use as the full effect radius at which point full force is applied. Defaults to 0. Must be less than the radius. |
| linear | Whether this collider should use a linear repulsion force falloff between the fullRadius and radius. If set to false, uses standard quadratic falloff. Default is false. |
| minRadius | The radius to use for when a colliding unit is too close to the attached unit and should receive 0 repulsion force. An "eye-of-the-storm" radius. Default is 0.|
### **reflect**
A reflect collider applies a reflection force using the incident vector of collision with the collider sphere to redirect the velocity of the colliding unit. Additionally can act as a blocker.
| Property | Description |
| :------------ | :-----|
| block | Whether this collider should also act as a blocker for units. Defaults to true.|
| blockRadius | If blocking, the radius from the collider-attached unit from which to begin blocking units. Defaults to 100.|
| buffer | If blocking, the additional distance beyond the collider radius to block units out that collide with this collider. Defaults to 0.|
| findClearSpace | If blocking, whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| moveSelf | If blocking and set to true, this collider will move the attached unit instead of the colliding unit. Defaults to false.|
| multiplier | The scalar multiplier to apply to the incident vector velocity to create the reflecting force. Defaults to 1.0|
### **momentum**
A momentum collider applies a force to the colliding unit and collider-attached unit in accordance with their mass as set on their Physics Unit settings. The elasticity coefficient of the collision can be set. Additionally can act as a blocker.
| Property | Description |
| :------------ | :-----|
| block | Whether this collider should also act as a blocker for units. Defaults to true.|
| blockRadius | If blocking, the radius from the collider-attached unit from which to begin blocking units. Defaults to 100.|
| buffer | If blocking, the additional distance beyond the collider radius to block units out that collide with this collider. Defaults to 0.|
| elasticity | The elasticity of the collision mediated by this collider. A setting of 1 means a fully elastic collision, while a setting of 0 means a fully inelastic collision. If two momentum colliders collide, a setting of 0 will result in an elastic collision after both colliders process the collision. Defaults to 1.|
| findClearSpace | If blocking, whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| moveSelf | If blocking and set to true, this collider will move the attached unit instead of the colliding unit. Defaults to false.|
### **momentumFull**
A momentumFull collider applies a force to the colliding unit and collider-attached unit in accordance with their mass as set on their Physics Unit settings. MomentumFull differs from a standard momentum collider by ensuring that full force is always transferred regardless of the angle. The elasticity coefficient of the collision can be set. Additionally can act as a blocker.
| Property | Description |
| :------------ | :-----|
| block | Whether this collider should also act as a blocker for units. Defaults to true.|
| blockRadius | If blocking, the radius from the collider-attached unit from which to begin blocking units. Defaults to 100.|
| buffer | If blocking, the additional distance beyond the collider radius to block units out that collide with this collider. Defaults to 0.|
| elasticity | The elasticity of the collision mediated by this collider. A setting of 1 means a fully elastic collision, while a setting of 0 means a fully inelastic collision. If two momentum colliders collide, a setting of 0 will result in an elastic collision after both colliders process the collision. Defaults to 1.|
| findClearSpace | If blocking, whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| moveSelf | If blocking and set to true, this collider will move the attached unit instead of the colliding unit. Defaults to false.|
-----------------------------------
## **COLLIDER_AABOX / COLLIDER_BOX**
### **aaboxblocker** / **boxblocker**
A boxblocker collider blocks out the colliding unit whenever a successful collision is found. Can affect non-Physics units if 'slide' property is set to false.
| Property | Description |
| :------------ | :-----|
| buffer | The additional distance beyond the collider box definition to block units out that collide with this collider. Defaults to 0.|
| findClearSpace | Whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| slide | Whether the colliding Physics Unit should slide along the edge of the box with which it collides. Defaults to true.|
### **aaboxreflect** / **boxreflect**
A boxreflect collider blocks out the colliding unit whenever a successful collision is found.
| Property | Description |
| :------------ | :-----|
| block | Whether this collider should also act as a blocker for units. Defaults to true.|
| buffer | The additional distance beyond the collider box definition to block units out that collide with this collider. Defaults to 0.|
| findClearSpace | Whether to use FindClearSpaceForUnit to block the colliding unit out. Defaults to false. |
| multiplier | The scalar multiplier to apply to the incident vector velocity to create the reflecting force. Defaults to 1.0|
**Examples:**
=============================
See [examples/colliders.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/examples/colliders.lua) for collider examples as demonstrated in [my youtube video](https://www.youtube.com/watch?v=AxBxQIcEMI8).
================================================
FILE: ContainersChangeLog.md
================================================
# containers.lua ChangeLog
### Version 0.80
- Added containers.lua library
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: ModmakerChangeLog.md
================================================
# modmaker.lua ChangeLog
### Version 0.80
- Added modmaker.lua library
================================================
FILE: NOTICE
================================================
Copyright 2014 BMD
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: NotificationsChangeLog.md
================================================
# notifications.lua ChangeLog
### Version 1.00
- Updated version to reflect the Barebones 1.0 release
### Version 0.89
- Changed the names of the panorama files from barebones_hud_base.* to barebones_notifications.*
### Version 0.88
- Updated notifications subsystem to support deleting notifications on-demand
### Version 0.87
- Updated notifications subsystem to support DOTAItemImage panel type.
### Version 0.86
- Updated notifications subsystem to apply hittest="false" to all generated panels
### Version 0.85
- Updated notifications.lua to support DOTAAbilityImage and Image panel types.
- Updated notifications.lua to use a table-based function call **NOTE: Older multi-parameter calls to notifications.lua WILL FAIL.**
- Updated examples/notificationsExample.lua to reflect the new calls and table argument system.
### Version 0.80
- Added global NOTIFICATIONS_VERSION
- Started tracking version updates for notifications.lua
================================================
FILE: PathGraphChangeLog.md
================================================
# pathgraph.lua ChangeLog
### Version 0.80
- Added pathgraph.lua library
================================================
FILE: PhysicsChangeLog.md
================================================
# physics.lua ChangeLog
### Version 1.01
- Fixed visual issue in physics.lua box drawing + CreateBox bug
### Version 1.00
- Updated to a new order of operations within the simulation. If your existing code breaks, use physics_old.lua to maintain the old operation order.
- Fixed an issue where unit:StopPhysicsSimulation() did not halt the physics simulation.
- Calling Physics:Unit again now reinitializes the simulation in tools mode, but is ignored in live game mode.
- Added a flat friction in addition to the percentage friction already existing.
- Added static velocity setting/getting to manipulate individual force components separate from the combined force.
- Added the ability to have a physics unit cut trees as it moves.
- Added the ability for a unit to navigate according to the slope of the terrain itself for non-GNV navigation.
- Physics now reports its thinker as "physics_lua_thinker" if the Entity System warns of the physics simulation running too long in console.
### Version 0.91
- Added additional guards to better handle 'script_reload'
### Version 0.90
- Added global PHYSICS_VERSION
- Started tracking version updates for physics.lua
================================================
FILE: PhysicsReadme.md
================================================
# **BMD's Lua Unit Physics Library**
--------------------------------
See [CollidersReadme.md](https://github.com/bmddota/barebones/blob/source2/CollidersReadme.md) for documentation and examples on using Colliders.
#### **How to install:**
- Drop physics.lua in with your vscripts
- Add require( 'physics' ) somewhere in your lua instantiation path
#### **How to use:**
- To turn any dota unit into a Physics unit, run
Physics:Unit(unitEntity)
- This adds a bunch of new functions to the unit which allow for it to simulate physics
- All velocity/acceleration vectors are in hammer units per second or hammer units per second squared
**Physics Library Functions**
=============================
#### **Physics:Unit (unit)**
Makes a unit into a "physics" unit which can be manipulated using the PhysicsUnit functions
#### **Physics:GenerateAngleGrid()**
This function is used to generate and apply an angle grid (calculated GNV normal map) for the current map so as to yield better bounces for PHYSICS_NAV_BOUNCE and PHYSICS_NAV_SLIDE collisions.
#### **Physics:AngleGrid (anggrid, angoffsets)**
This function is an advanced means of setting a normal map for GridNav collisions so as to yield better bounces for PHYSICS_NAV_BOUNCE and PHYSICS_NAV_SLIDE collisions.
#### **IsPhysicsUnit (unit)**
This global function returns true if the unit in question has been converted to a "physics" unit.
**PhysicsUnit Functions:**
=============================
#### **AdaptiveNavGridLookahead (boolean)**
Whether this unit should use an adaptive navgrid lookahead system to more reliably detect GNV collisions at high speed
#### **AddPhysicsAcceleration (accelerationVector)**
Adds a new acceleration vector to the current internal acceleration vector.
#### **AddPhysicsVelocity (velocityVector)**
Adds a new velocity vector to the current internal velocity vector. This is effectively a force push on the unit.
#### **AddStaticVelocity (name, velocityVector)**
Adds a new velocity vector to the current internal static velocity vector of the given name.
#### **ClearStaticVelocity ()**
Clears all current static velocity vectors, effectively setting them to (0,0,0)
#### **CutTrees (boolean)**
Sets whether this unit should automatically cut trees when it collides with them or not. Default is false.
#### **FollowNavMesh (boolean)**
Whether this unit should respect the NavMesh when moving and exhibit NavCollisionType behavior when interacting with a NavGrid block
#### **GetAutoUnstuck ()**
Whether this unit will be returned to its last known good position in the event that it is determined to be stuck in unpathable terrain. Default is true.
#### **GetBounceMultiplier ()**
Returns the float representing the multiplier to apply to a unit's velocity's magnitude in the event that they bounce via PHYSICS_NAV_BOUNCE. Default is 1.0 (aka no velocity magnitude change)
#### **GetBoundOverride ()**
Returns the current boundary radius override for this unit, which will be used when blocking the unit out from navigation grid collisions so that it doesn't get stuck. Default is the larget value of "unit:GetPaddedCollisionRadius() + 1" or "math.max(unit:GetBoundingMaxs().x, unit:GetBoundingMaxs().y)"
#### **GetLastGoodPosition ()**
Returns the vector position which was the last known position that the unit was in that was unblocked/pathable.
#### **GetNavCollisionType ()**
Returns the current GridNav Collision Type (PHYSICS_NAV_NOTHING, PHYSICS_NAV_HALT, PHYSICS_NAV_SLIDE, PHYSICS_NAV_BOUNCE, or PHYSICS_NAV_GROUND)
#### **GetNavGridLookahead ()**
Returns the current number of Navigation Grid lookahead points. See SetNavGridLookahead for more details. Default is 1
#### **GetNavGroundAngle ()**
Returns the current terrain angle that will cause PHYSICS_NAV_GROUND based navigation to slide.
#### **GetPhysicsAcceleration ()**
Returns the current acceleration vector. Default is (0,0,0)
#### **GetPhysicsBoundingRadius ()**
Returns the current bounding radius used for navgrid collision. Default is the PaddedCollisionRadius of a unit.
#### **GetPhysicsFlatFriction ()**
Returns the current flat friction amount. Default is 0
#### **GetPhysicsFriction ()**
Returns the current friction multiplier and flat friction amount. Default is .05, 0
#### **GetPhysicsVelocity ()**
Returns the current velocity vector. Default is (0,0,0)
#### **GetPhysicsVelocityMax ()**
Returns the maximum velocity. Default is 0, representing an unlimited velocity
#### **GetRebounceFrames ()**
Returns the number of rebounce frames to wait between PHYSICS_NAV_BOUNCE collisions. Default is 2.
#### **GetStaticVelocity (name)**
Returns the current static velocity force for the given name.
#### **GetStuckTimeout ()**
Returns the number of frames necessary to determine if a unit is stuck in unpathable terrain and to activate AutoUnstuck
#### **GetSlideMultiplier ()**
Returns the slide multipler value. Default is 0.1
#### **GetTotalVelocity ()**
Returns the unit's total velocity (i.e. Physics velocity + slide velocity + standard right-click movement). This is nonfunctional while a unit is hibernating, and will return Vector(0,0,0) on the first frame that a Physics unit is created, but a correct value thereafter.
#### **GetVelocityClamp ()**
Returns the current velocity clamp in hammer units per second. Default is 20 hammer units per second
#### **Hibernate (boolean)**
Whether this unit should Hibernate when there is no sliding/acceleration/velocity. When hibernating the unit performs no physics calculation until new force/acceleration/sliding is applied. Additionally, OnPhysicsFrame will not be called if this unit is hibernating.Default is that a unit will hibernate.
#### **IsAdaptiveNavGridLookahead ()**
Returns whether this unit will use an adaptive navgrid lookahead system to more reliably detect GNV collisions at high speed
#### **IsCutTrees ()**
Returns whether this unit is currently set to automatically cut trees it collides with. Default is false
#### **IsFollowNavMesh ()**
Returns whether this unit will respect the navigation mesh when moving the unit around.
#### **IsHibernate ()**
Returns whether this unit should hibernate when there are no physics calculations to be performed
#### **IsInSimulation ()**
Returns whether this unit is currently in an active physics simulation or not.
#### **IsLockToGround ()**
Returns whether this unit will lock the unit to the ground while performing position calculations.
#### **IsPreventDI ()**
Returns whether this unit will be prevented from influencing the direction of the physics calculations.
#### **IsSlide ()**
Returns whether this unit is currently sliding
#### **OnBounce (function(unit, normal))**
Set the callback function to be executed when a PHYSICS_NAV_BOUNCE is occuring, but after the velocity rebound calculation has been performed and applied. The function passed in has two parameters given to it, the unit in question and the normal vector of the surface that the unit is bouncing off of.
#### **OnPreBounce (function(unit, normal))**
Set the callback function to be executed when a PHYSICS_NAV_BOUNCE is occuring, but before the velocity rebound calculation has been performed and applied. The function passed in has two parameters given to it, the unit in question and the normal vector of the surface that the unit is bouncing off of.
#### **OnHibernate (function(unit))**
Set the callback function (with one parameter, the unit in question) to be executed in the event that this unit begins hibernating.
#### **OnSlide (function(unit, normal))**
Set the callback function to be executed when a PHYSICS_NAV_SLIDE is occuring, but after the velocity direction nullification has been performed and applied. The function passed in has two parameters given to it, the unit in question and the normal vector of the surface that the unit is sliding off of.
#### **OnPreSlide (function(unit, normal))**
Set the callback function to be executed when a PHYSICS_NAV_SLIDE is occuring, but before the velocity direction nullification has been performed and applied. The function passed in has two parameters given to it, the unit in question and the normal vector of the surface that the unit is sliding off of.
#### **OnPhysicsFrame (function(unit))**
Set the callback function (with one parameter, the unit in question) to be executed every frame for this unit so long as it is not hibernating. You can use this function to do additional calculations/collision detection/velocity modification.
#### **PreventDI (boolean)**
Whether to prevent this unit from influencing the direction of the simulation. The default is false
#### **SetAutoUnstuck (boolean)**
Whether to return this unit to its last known good position in the event that the library determines them to be "stuck" for enough frames in an unpathable area. Default is true.
#### **SetBounceMultiplier (bounceMultipler)**
Sets the magnitude to adjust the velocity of a unit in the event of a PHYSICS_NAV_BOUNCE bounce. .5 would halve the total velocity of the unit, while 2.0 would double it on bounce. Default is 1.0.
#### **SetBoundOverride (bound)**
Sets the current boundary radius override for this unit, which will be used when blocking the unit out from navigation grid collisions so that it doesn't get stuck.
#### **SetGroundBehavior (groundBehavior)**
- PHYSICS_GROUND_NOTHING: The unit will be able to pass through terrain and will not change its z-coordinate in any way concerning terrain
- PHYSICS_GROUND_ABOVE: The unit will follow the ground so long as the ground is "above" the unit. If the unit is above the ground, it will not lock to the ground.
- PHYSICS_GROUND_LOCK: The unit will remain attached to the ground regardless of z-coordinate position/velocity/acceleration
#### **SetNavCollisionType (navCollisionType)**
Sets the behavior that the physics system will use when this unit collides with the GridNav mesh. Possibilities are PHYSICS_NAV_NOTHING, PHYSICS_NAV_HALT, PHYSICS_NAV_SLIDE, or PHYSICS_NAV_BOUNCE. Default is PHYSICS_NAV_SLIDE
- PHYSICS_NAV_NOTHING: The unit will continue normal velocity/position calculations, potentially bumping up against the nav mesh multiple times
- PHYSICS_NAV_HALT: The unit will halt its velocity immediately in all directions
- PHYSICS_NAV_SLIDE: The unit will halt its velocity in only the x or y direction depending on the collision direction with the GridNav
- PHYSICS_NAV_BOUNCE: The unit will bounce off of the GridNav mesh face it contacts with, continuing on in a different direction with the same velocity magnitude
- PHYSICS_NAV_GROUND: The unit will travel along the ground based on the slope of the terrain, ignoring the GNV entirely. If the slope of the terrain exceeds the slope limit set with SetNavGroundAngle, then the unit will slide down the terrain.
#### **SetNavGridLookahead (lookaheadPoints)**
Sets the number of navigation grid lookahead points to use when determining a navigation grid collision for PHYSICS_NAV_HALT/NOTHING/SLIDE/BOUCE. The physics system will lookahead to the 1..lookaheadPoints-1 / lookaheadPoints the distance to the next position in order to determine if the unit will pass into an unwalkable location during the next frame. Increasing this number allows for higher speed collisions with the navigation grid and helps to prevent units from slipping through the grid by using speed. Default is 1. Note: This adds a lot of calculations even at 3 or 4, so be careful with this value for performance reasons.
#### **SetNavGroundAngle (angle)**
Sets the current terrain angle that will cause PHYSICS_NAV_GROUND based navigation to slide.
#### **SetPhysicsAcceleration (accelerationVector)**
Sets the internal acceleration vector to the given vector, eliminating any existing acceleration
#### **SetPhysicsBoundingRadius (boundingRadius)**
Sets the internal bounding radius used for navgrid collision.
#### **SetPhysicsFlatFriction (flatFriction)**
Sets the flat friction amount. The default is 0.
#### **SetPhysicsFriction (frictionMultiplier[, flatFriction])**
Sets the friction multiplier and/or flat friction amount. The default is .05 and 0. Not providing flatFriction will keep the current value.
#### **SetPhysicsVelocity (velocityVector)**
Sets the internal velocity vector to the given vector, eliminating any existing velocity
#### **SetPhysicsVelocityMax (maxVelocity)**
Sets the maximum velocity that the unit will clamp to during the simulation. Default is 0, which in unlimited
#### **SetRebounceFrames (rebounceFrames)**
Sets the number of frames to wait between PHYSICS_NAV_BOUNCE gridnav collisions before allowing for another collision to take place. Default is 5 (aka 1/6 of a second)
#### **SetSlideMultiplier (slideMultiplier)**
Sets the slide multiplier. The default is 0.1
#### **SetStaticVelocity (name, velocityVector)**
Sets the internal static velocity vector to the given vector for this named static velocity vector, eliminating any existing static velocity for this named vector
#### **SetStuckTimeout (stuckFrames)**
Sets the number of frames to wait before determining that the player is "stuck" in an unpathable area before returning them via AutoUnstuck to their last known good position. The default is 3 frames (aka .1 seconds).
#### **SetVelocityClamp (clamp)**
Sets the velocity magnitude clamp for stopping physics calculations/hibernating. The default is 20 hammer units per second
#### **SkipSlide (frames)**
Sets the number of frames for which to skip the slide calculation for this unit. This is useful when you need to reposition a unit (respawn/blink/etc) but don'target want the Physics library slide calculation to add in a massive sliding velocity due to that teleport. In the same frame as the respawn/blink you should issue a unit:SkipSlide(2). Slide calculations will resume when all SkipSlide frames are counted out.
#### **Slide (boolean)**
Whether this unit should be sliding or not. Sliding units accelerate based on their direction of travel in addition to their normal movespeed motion.
#### **StartPhysicsSimulation ()**
Restart the physics simulation if it has been stopped by StopPhysicsSimulation
#### **StopPhysicsSimulation ()**
Stop the physics simulation from executing any more for this unit
**Examples:**
=============================
Give a unit sliding motion
-----------------------------
Physics:Unit(hero)
hero:Slide(true)
Push a unit to the left
-----------------------------
Physics:Unit(hero)
hero:AddPhysicsVelocity(Vector(-1000, 0, 0))
Start an accelerating "tractor beam" pulling one unit towards another without their influence
-----------------------------
Physics:Unit(target)
target:SetPhysicsVelocityMax(500)
target:PreventDI()
local direction = source:GetAbsOrigin() - target:GetAbsOrigin()
direction = direction:Normalized()
target:SetPhysicsAcceleration(direction * 50)
target:OnPhysicsFrame(function(unit)
-- Retarget acceleration vector
local distance = source:GetAbsOrigin() - target:GetAbsOrigin()
local direction = distance:Normalized()
target:SetPhysicsAcceleration(direction * 50)
-- Stop if reached the unit
if distance:Length() < 100 then
target:SetPhysicsAcceleration(Vector(0,0,0))
target:SetPhysicsVelocity(Vector(0,0,0))
target:OnPhysicsFrame(nil)
end
end)
================================================
FILE: PlayerTablesChangeLog.md
================================================
# playertables.lua ChangeLog
### Version 0.90
- Added playertables.lua library
================================================
FILE: ProjectilesChangeLog.md
================================================
# projectiles.lua ChangeLog
### Version 1.00
- Added a bDestroyImmediate property to the projectile definition which determines whether the DestroyParticle call should perform an immediate destruction.
- Fixed a bug with changing velocity of certain projectiles.
- Fixed a bug with OnFinish on ground collision.
- Fixed an issue where projectile:Destroy() did not halt the particle simulation.
- Added projectile:GetCreationTime(), projectile:GetDistanceTraveled(), projectile:GetPosition(), projectile:GetVelocity()
- Projectiles now reports its thinker as "projectiles_lua_thinker" if the Entity System warns of the projectiles simulation running too long in console.
### Version 0.84
- Fixed 0-velocity projectiles producing a divide by 0 error
### Version 0.83
- Added additional guards to better handle 'script_reload'
### Version 0.82
- Fixed a simulation-failure issue with tree-handling in when bCutTrees is false.
### Version 0.81
- Added new property to projectile tables, "fVisionTickTime" which controls how quickly the projectile vision updates while the projectile is in motion.
### Version 0.80
- Added global PROJECTILES_VERSION
- Started tracking version updates for projectiles.lua
================================================
FILE: ProjectilesReadme.md
================================================
# **BMD's Lua Advanced Projectiles Library**
--------------------------------
#### **How to install:**
- Drop projectiles.lua in with your vscripts
- Add require( 'projectiles' ) somewhere in your lua instantiation path
#### **How to use:**
- The projectiles library can be used to generate projectiles which are a combination of mathematical simulation and particle control.
- Projectiles.lua projectiles do not use a unit or entity as part of the projectile simulation, and as such are lighter weight than unit-based projectiles.
- Due to not using a unit, the projectile simulation can potentially get out of synch with the particle representation if there a large number of high-velocity changes. Because of this, a projectile which needs highly complex motion is better off implemented as a Physics:Unit().
- Projectiles.lua projectiles have more advanced capabilities than default LinearProjectiles, including the ability to dynamically change direction/speed, operate in 3 dimentions, bounce off of walls/ground, be tracked easily by instance, affect trees, etc.
**Projectiles Library Functions**
=============================
#### **Projectiles:CreateProjectile(projectile)**
This function is used to create ane release the projectile defined by the projectile table passed to the function. The function returns an updated reference to the projectile table on which the Proejctile Table Functions can be called. See the Projectiles Table Format section for more detail on what properties can be used with the projectile table.
#### **Projectiles:CalcSlope(pos, unit, dir)**
This function can be used to get the estimated slope of the ground in the given Vector direction 'dir' at the world point Vector 'pos'. The 'unit' parameter is used to specify what unit should be used with GetGroundPosition() in order to handle the ground collision sizing. This function can return odd values when used around sheer vertical edges.
#### **Projectiles:CalcNormal(pos, unit, scale)**
This function can be used to get the estimated normal Vector of the ground at the world point Vector 'pos'. The 'unit' parameter is used to specify what unit should be used with GetGroundPosition() in order to handle the ground collision sizing. This function can return odd values when used around sheer vertical edges.
**Projectile Table Functions**
=============================
A projectile table which has been fed to CreateProjectile will have the following functions:
#### **projectile:GetVelocity()**
This function can be called to get the current velocity vector of this projectile.
#### **projectile:Destroy()**
This function can be called to immediately destroy this projectile, triggering its OnFinish callback function if present.
#### **projectile:SetVelocity(newVel[, newPos])**
This function can be called to adjust the current velocity of the projectile, as well as the current simulated position of the unit (if specified). The projectile simulation and particle will only update if the projectile is within its nMaxChanges velocity change limit.
#### **projectile:GetCreationTime()**
This function reutnrs the creation time in GameTime of this projectile.
#### **projectile:GetDistanceTraveled()**
This function returns the total distance traveled by this projectile in hammer units per second. Only counts distance moved due to velocity and not by setting a new position with SetVelocity.
#### **projectile:GetPosition()**
This function returns the current world position of the projectile.
**Projectiles Table Format**
=============================
Projectiles are effectively a formatted lua table which is registered with the Projectiles API for processing and action. All projectiles tables can have the following properties and functions:
| Property | Default | Description |
| :------------ | :--------| :-----|
| bProvidesVision | false | If set to true, this projectile will provide vision around it as it travels. |
| bCutTrees | false | If set to true, this projectile will cut any trees that it comes in contact with. |
| bFlyingVision | true | If set to true and, this projectile will provide flying vision as it travels (if bProvidesVision is enabled) |
| bGroundLock | false | If set to true, the simulation will lock its height to the ground position + fGroundOffset. This setting is useful for simulating Dota-like LinearProjectiles that effectively operate in 2D. |
| bIgnoreSource | true | If set to true, this projectile will not affect source. |
| bMultipleHits | false | If set to true, this projectile can hit units multiple times after a timeout specified by fRehitDelay. |
| bRecreateOnChange | true | If set to true, the particle representing the projectile will be Destroyed and recreated whenever a velocity/position change is forced. If false, only the control points for the existing particle will be changed. |
| bTreeFullCollision | false | If set to true, this projectile will use the full collision radius of trees in determining tree collision, effectively hitting trees further out from the natural radius. |
| bZCheck | true | If set to true, this particle will check the height/z-coordinate in order to determine if there is a collision in 3D. If set to false, it will not care about z-coordinate and will use dota-like 2D collision. |
| ControlPoints | {} | A table of additional control points to set when creating/recreating the particle for this projectile. Use this to set additional particle properties. Ex: {[5]=Vector(2,0,0)} |
| ControlPointForwards | {} | A table of control points for which to set Forward orientations when creating/recreating the particle for this projectile. Ex: {[5]=unit:GetForwardVector()} |
| ControlPointOrientations | {} | A table of control points for which to set Orientations triplets when creating/recreating the particle for this projectile. Ex: {[5]={unit:GetForwardVector(), unit:GetForwardVector(), unit:GetForwardVector()}} |
| ControlPointEntityAttaches | {} | A table of Entity/ControlPoint attachments to set when creating/recreating the particle for this projectile. Ex: {[0]={unit = hero, pattach = PATTACH_ABSORIGIN_FOLLOW, attachPoint = "attach_attack1", -- nil origin = Vector(0,0,0)}} |
| draw | false | If set to true, will draw a DebugDrawSphere showing the simulation in space as it travels/changes for debugging. Can be also specified by a table like {color=Vector(200,0,0), alpha=5} for differntiation. |
| EffectName | <none> | The particle path+file to use for the projectile particle, or "" for no particle. |
| fChangeDelay | .1 | A minimum delay in GameTime to wait between velocity/position changes. |
| fDistance | 1000 | The maximum travel distance of this projectile at which point it will expire and call OnFinish if present. |
| fEndRadius | 100 | The projectile collision radius to scale to at the end of this projectiles distance/expiration time. |
| fExpireTime | 10.0 | The time in seconds of GameTime for this projectile to live. Will call OnFinish when the expiration time is reached if present. |
| fGroundOffset | 40 | The z-offset/height to use in Ground-based calculations or ground-locking |
| fRadiusStep | <computed> | If specified, the radius step is the amount of increase/decrease to happen to the radius every second |
| fRehitDelay | 1 | The multiple hit delay in seconds to use for each unit hit by this projectile (i.e. 1.0 means don't rehit the same unit unless struck again after 1.0 seconds from the previous strike) |
| fStartRadius | 100 | The projectile collision radius to start the projectile at |
| fVisionTickTime | .1 | The time in seconds between projectile vision updates while in flight. Rounds up to the nearest frame-boundary (.0333,.06666,.1, etc) |
| fVisionLingerDuration | .1 | The time in seconds that the vision should linger as the projectile moves. Defaults to the same value as fVisionTickTime. |
| GroundBehavior | PROJECTILES_DESTROY | The behavior that the particle should exhibit when colliding with the ground. PROJECTILES_NOTHING means to do nothing to the projectile. PROJECTILES_DESTROY means to destroy this projectile. PROJECTILES_BOUNCE means to bounce off the ground. PROJECTILES_FOLLOW means to follow the slope of the ground when colliding. |
| iPositionCP | 0 | The control point to use for the position of the particle. |
| iVelocityCP | 1 | The control point to use for the velocity of the particle. |
| iVisionRadius | 200 | The vision radius for this projectile if enabled. |
| iVisionTeamNumber | <Source unit's team> | The team for which to display this projectile's vision if enabled.|
| nChangeMax | 1 | The maximum number of velocity/position changes this particle can undergo before it stops allowing changing position/velocity. |
| Source | <none> | The source unit of this projectile |
| TreeBehavior | PROJECTILES_DESTROY | The behavior that the particle should exhibit when colliding with a tree. PROJECTILES_NOTHING means to do nothing to the projectile. PROJECTILES_DESTROY means to destroy this projectile.|
| UnitBehavior | PROJECTILES_DESTROY | The behavior that the particle should exhibit when colliding with a unit which passes the UnitTest function. PROJECTILES_NOTHING means to do nothing to the projectile. PROJECTILES_DESTROY means to destroy this projectile.|
| vSpawnOrigin | Vector(0,0,0) | The initial spawn world position of this projectile. Can be specified in a table form to fire from the attachment point of a unit. Ex: {unit=unitHandle, attach="attach_attack1"[, offset=Vector(0,0,80)]}|
| vVelocity | Vector(0,0,0) | The initial velocity of this projectile |
| WallBehavior | PROJECTILES_DESTROY | The behavior that the particle should exhibit when colliding with a wall created by terrain. PROJECTILES_NOTHING means to do nothing to the projectile. PROJECTILES_DESTROY means to destroy this projectile. PROJECTILES_BOUNCE means to bounce off the wall. |
| Functions | Parameters | Description |
| :------------ | :---------| :-----|
| OnFinish | projectileTable, position | This function is called when the projectile is destroyed or expires for any reason other than Destroy() being called manually. |
| OnGroundHit | projectileTable, groundPosition | This function is called whenever the projectile hits the ground. |
| OnTreeHit | projectileTable, treeEntity | This function is called whenever the projectile hits a tree. |
| OnUnitHit | projectileTable, unit | This function is called whenever the projectile hits a unit that passes the UnitTest function. |
| OnWallHit | projectileTable, wallPosition | This function is called whenever the projectile hits a wall. |
| UnitTest | projectileTable, unit | This function is called whenever the projectile comes in contact with a unit to test whether this unit should be hit by this projectile. This function should return true if the unit should be hit, or false if the unit shouldn't be hit. |
**Examples:**
=============================
See [examples/projectile.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/examples/projectile.lua) for a projectile example.
================================================
FILE: README.md
================================================
# Barebones Starter Mod Kit
### Version 1.01c
### [Change Log](https://github.com/bmddota/barebones/blob/source2/ChangeLog.md)
## Introduction
Barebones is meant to be a jumping off point for creating a mod with all (or nearly all) of the boilerplate taken care of for you.
Barebones sets up the necessary files to create a basic mod (from a scripting persective), allowing you to simply find the places to put your Lua logic in order for you mod to operate.
Barebones currently provides limited examples for performing different tasks, and limited examples for unit/ability/item creation.
Barebones divides scripts up into several sections: Core Files, Libraries, Examples and Internals.
## Installation
Barebones can be installed by downloading this git repository and ensuring that you merge the "content" and "game" folder from this repo with your own "content" and "game" folders. These should be located in your "<SteamLibraryDirectory>\SteamApps\common\dota 2 beta\" folder. **Be sure you don't use the "dota_ugc" folder!**
## Core Files
Core Files are the primary files which you should modify in order to get your basic game mode up and running. There are 4 major files:
#### settings.lua
This file contains many special settings/properties created for barebones that allows you to define the high-level behavior of your game mode.
You can define things like respawn times, number of teams on the map, rune spawn times, etc. Each property is commented to help you understand it.
#### gamemode.lua
This is the primary barebones gamemode script and should be used to assist in initializing your game mode.
This file contains helpful pseudo-event functions prepared for you for frequently needed initialization actions.
#### events.lua
This file contains a hooked version of almost every event that is currently known to fire in the DotA 2 Lua vscript code.
You can drop your event handler functions in there to have your game mode react to events.
#### addon_game_mode.lua
This is the entry-point to your game mode and should be used primarily to precache models/particles/sounds/etc.
## Libraries
I've included some helpful libraries with barebones that may prove useful in your game mode.
#### timers.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/TimersChangeLog.md)
This library allow for easily delayed/timed actions without the messiness of thinkers and dealing with pauses.
#### physics.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/PhysicsChangeLog.md)
This library can be used for advancted physics/motion/collision of units.
See [PhysicsReadme.md](https://github.com/bmddota/barebones/blob/source2/PhysicsReadme.md) and [CollidersReadme.md](https://github.com/bmddota/barebones/blob/source2/CollidersReadme.md) for more information.
#### projectiles.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/ProjectilesChangeLog.md)
This library can be used for advanced 3D projectile systems.
See [ProjectilesReadme.md](https://github.com/bmddota/barebones/blob/source2/ProjectilesReadme.md) for more information.
#### notifications.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/NotificationsChangeLog.md)
This library can be used to send panorama notifications to individuals/teams/everyone in your game.
See [libraries/notifications.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/notifications.lua) for usage details and examples.
#### animations.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/AnimationsChangeLog.md)
This library can be used to start animations with customized animation rates, activities, and translations.
See [libraries/animations.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/animations.lua) for usage details and examples.
#### attachments.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/AttachmentsChangeLog.md)
This library can be used to set up and put in place 'Frankenstein' attachments for attaching props to units.
See [libraries/attachments.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/attachments.lua) for usage details and examples.
#### playertables.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/PlayerTablesChangeLog.md)
This library sets up tables that are shared between server (lua) and client (javascript) between specific (but changeable) clients. Similar to nettables.
See [libraries/playertables.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/playertables.lua) for usage details and examples.
#### containers.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/ContainersChangeLog.md)
This library allows for additional inventory/item containing objects and shops to be used in your game mode.
See [libraries/containers.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/containers.lua) for usage details.
See [examples/playground.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/examples/playground.lua) for detailed examples.
#### worldpanels.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/WorldPanelsChangeLog.md)
This library allows for creating panorama layout panels that track the world position of an entity (or fixed world coordinate).
See [libraries/worldpanels.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/worldpanels.lua) for usage details and examples.
#### selection.lua [By Noya](https://github.com/MNoya)
This library allows for querying and managing the selection status of players from the server-side lua script. It also allows for automatic redirection and selection event handling.
See [libraries/selection.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/selection.lua) for usage details and examples.
#### pathgraph.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/PathGraphChangeLog.md)
This library constructs a full-edge graph of all "path_corner" objects, allowing for the use of the path links via lua script.
See [libraries/pathgraph.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/pathgraph.lua) for usage details and examples.
#### modmaker.lua [Change Log](https://github.com/bmddota/barebones/blob/source2/ModmakerChangeLog.md)
This library offers a searchable version of the lua server vscript API through the "modmaker_api" console command (in tools mode)
See [libraries/modmaker.lua](https://github.com/bmddota/barebones/blob/source2/game/dota_addons/barebones/scripts/vscripts/libraries/modmaker.lua) for usage details and examples.
## Internals
Barebones uses a few internal lua files in order to put together and handle the properties and pseudo-events systems. You will likely not have to adjust these files at all.
These files are found in the internal directory.
## Debugging
Barebones now only prints out (spams) debugging information when told to by setting the BAREBONES_DEBUG_SPEW value in gamemode.lua to true.
Previously there was a 'barebones_spew' cvar that could be used to change the debug printing state at any time from the console, but Valve broke RegisterConvar for some reason, so this has been disabled.
## Additional Information
- Barebones also comes with a sample loading screen implementation in panorama which you can view and edit via the content panorama directory.
- You can change the name of the multiteams used at the Game Setup screen by editing the game/barebones/panorama/localization/addon_english.txt file.
- You can adjust the number of players allowed on each of your maps by editing addoninfo.txt.
If you have any questions or concerns, leave an issue or mail me (bmddota@gmail.com).
================================================
FILE: TimersChangeLog.md
================================================
# timers.lua ChangeLog
### Version 1.05
- Added a shorthand for Timers:CreateTimer(...) as Timers(...)
- Timers now continue to run after the game ends for post-game timing execution.
- Timers library is now accessible as GameRules.Timers for instances where the Timers global is out of scope (triggers, etc)
- Timers now allows a timer to successfully call Timers:RemoveTimer on itself from within the execution callback of the timer
- Timers now reports its thinker as "timers_lua_thinker" if the Entity System warns of timers running too long in console.
### Version 1.03
- Added the ability to call a function with a table context
- Added the use of the lua 'xpcall' function to give full stack traces if a timer errors out during execution.
### Version 1.01
- Added additional guards to better handle 'script_reload'
### Version 1.00
- Added global TIMERS_VERSION
- Started tracking version updates for timers.lua
================================================
FILE: WorldPanelsChangeLog.md
================================================
# worldpanels.lua ChangeLog
### Version 0.81
- Added "data" object which can be added in the world panel configuration table to send arbitrary primitive data to the created worldpanel in javascript, accessible as $.GetContextPanel().Data
- Fixed an issue with completely client-unknown entities immideately deleting their world panels on create.
### Version 0.80
- Added worldpanels.lua library
================================================
FILE: content/dota_addons/barebones/materials/overviews/playground.txt
================================================
"settings"
{
"clampu" "1"
"clampv" "1"
"nocompress" "1"
"nomip" "1"
}
================================================
FILE: content/dota_addons/barebones/materials/overviews/playground.vmat
================================================
"Layer0"
{
"Shader" "ui.vfx"
"F_STENCIL_MASKING" "1"
"F_TRANSLUCENT" "0"
"Texture" "materials/overviews/playground.tga"
}
================================================
FILE: content/dota_addons/barebones/materials/overviews/template_map.txt
================================================
"settings"
{
"clampu" "1"
"clampv" "1"
"nocompress" "1"
"nomip" "1"
}
================================================
FILE: content/dota_addons/barebones/materials/overviews/template_map.vmat
================================================
"Layer0"
{
"Shader" "ui.vfx"
"F_STENCIL_MASKING" "1"
"F_TRANSLUCENT" "0"
"Texture" "materials/overviews/template_map.tga"
}
================================================
FILE: content/dota_addons/barebones/materials/particle/basic_glow.vtex
================================================
<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->
"CDmeVtex"
{
"m_inputTextureArray" "element_array"
[
"CDmeInputTexture"
{
"m_name" "string" "0"
"m_fileName" "string" "materials/particle/basic_glow.tga"
"m_colorSpace" "string" "srgb"
"m_typeString" "string" "2D"
}
]
"m_outputTypeString" "string" "2D"
"m_outputFormat" "string" "DXT5"
"m_textureOutputChannelArray" "element_array"
[
"CDmeTextureOutputChannel"
{
"m_inputTextureArray" "string_array"
[
"0"
]
"m_srcChannels" "string" "rgba"
"m_dstChannels" "string" "rgba"
"m_mipAlgorithm" "CDmeImageProcessor"
{
"m_algorithm" "string" ""
"m_stringArg" "string" ""
"m_vFloat4Arg" "vector4" "0 0 0 0"
}
"m_outputColorSpace" "string" "srgb"
}
]
}
================================================
FILE: content/dota_addons/barebones/materials/particle/basic_rope.vtex
================================================
<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->
"CDmeVtex"
{
"m_inputTextureArray" "element_array"
[
"CDmeInputTexture"
{
"m_name" "string" "0"
"m_fileName" "string" "materials/particle/basic_rope.psd"
"m_colorSpace" "string" "srgb"
"m_typeString" "string" "2D"
}
]
"m_outputTypeString" "string" "2D"
"m_outputFormat" "string" "DXT5"
"m_textureOutputChannelArray" "element_array"
[
"CDmeTextureOutputChannel"
{
"m_inputTextureArray" "string_array"
[
"0"
]
"m_srcChannels" "string" "rgba"
"m_dstChannels" "string" "rgba"
"m_mipAlgorithm" "CDmeImageProcessor"
{
"m_algorithm" "string" ""
"m_stringArg" "string" ""
"m_vFloat4Arg" "vector4" "0 0 0 0"
}
"m_outputColorSpace" "string" "srgb"
}
]
}
================================================
FILE: content/dota_addons/barebones/materials/particle/basic_rope_energy.vtex
================================================
<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->
"CDmeVtex"
{
"m_inputTextureArray" "element_array"
[
"CDmeInputTexture"
{
"m_name" "string" "0"
"m_fileName" "string" "materials/particle/basic_rope_energy.tga"
"m_colorSpace" "string" "srgb"
"m_typeString" "string" "2D"
}
]
"m_outputTypeString" "string" "2D"
"m_outputFormat" "string" "DXT5"
"m_textureOutputChannelArray" "element_array"
[
"CDmeTextureOutputChannel"
{
"m_inputTextureArray" "string_array"
[
"0"
]
"m_srcChannels" "string" "rgba"
"m_dstChannels" "string" "rgba"
"m_mipAlgorithm" "CDmeImageProcessor"
{
"m_algorithm" "string" ""
"m_stringArg" "string" ""
"m_vFloat4Arg" "vector4" "0 0 0 0"
}
"m_outputColorSpace" "string" "srgb"
}
]
}
================================================
FILE: content/dota_addons/barebones/materials/particle/basic_smoke.vtex
================================================
<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->
"CDmeVtex"
{
"m_inputTextureArray" "element_array"
[
"CDmeInputTexture"
{
"m_name" "string" "0"
"m_fileName" "string" "materials/particle/basic_smoke.tga"
"m_colorSpace" "string" "srgb"
"m_typeString" "string" "2D"
}
]
"m_outputTypeString" "string" "2D"
"m_outputFormat" "string" "DXT5"
"m_textureOutputChannelArray" "element_array"
[
"CDmeTextureOutputChannel"
{
"m_inputTextureArray" "string_array"
[
"0"
]
"m_srcChannels" "string" "rgba"
"m_dstChannels" "string" "rgba"
"m_mipAlgorithm" "CDmeImageProcessor"
{
"m_algorithm" "string" ""
"m_stringArg" "string" ""
"m_vFloat4Arg" "vector4" "0 0 0 0"
}
"m_outputColorSpace" "string" "srgb"
}
]
}
================================================
FILE: content/dota_addons/barebones/materials/particle/basic_trail.vtex
================================================
<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->
"CDmeVtex"
{
"m_inputTextureArray" "element_array"
[
"CDmeInputTexture"
{
"m_name" "string" "0"
"m_fileName" "string" "materials/particle/basic_trail.tga"
"m_colorSpace" "string" "srgb"
"m_typeString" "string" "2D"
}
]
"m_outputTypeString" "string" "2D"
"m_outputFormat" "string" "DXT5"
"m_textureOutputChannelArray" "element_array"
[
"CDmeTextureOutputChannel"
{
"m_inputTextureArray" "string_array"
[
"0"
]
"m_srcChannels" "string" "rgba"
"m_dstChannels" "string" "rgba"
"m_mipAlgorithm" "CDmeImageProcessor"
{
"m_algorithm" "string" ""
"m_stringArg" "string" ""
"m_vFloat4Arg" "vector4" "0 0 0 0"
}
"m_outputColorSpace" "string" "srgb"
}
]
}
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/barebones_attachments.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="s2r://panorama/styles/hero_splash.vcss_c" />
<include src="s2r://panorama/styles/popups/settings_slider.vcss_c" />
<include src="file://{resources}/styles/barebones_attachments.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/barebones_attachments.js" />
</scripts>
<Panel hittest="false" class="AttachmentsBase">
<Panel id="CosmeticsPanel" style="visibility:collapse;">
<Panel id="CosmeticsHeader" draggable="true">
<Button class="CloseButton" id="CloseButton" onactivate="CloseCosmetics()"/>
<Label text="Hide Cosmetics"/>
</Panel>
<Panel id="CosmeticsBody">
</Panel>
</Panel>
<Panel hittest="true" id="AttachmentsPanel" style="visibility:collapse;">
<Panel hittest="true" id="AttachmentsHeader" draggable="true" >
<Label text="Attachments Configuration"/>
</Panel>
<Panel hittest="false" id="AttachmentsBody">
<Panel class="ButtonRow">
<ToggleButton class="CheckBox" checked="checked" style="align: center center; margin-left:10px;" id="AttachCheckbox" text="Attach?" onactivate="AttachCheckbox();" />
<Button id="Freeze" class="SplashButton SButton" onactivate="Freeze()">
<Label text="Freeze"/>
</Button>
<Button id="HideCosmetics" class="SplashButton SButton" style="width:150px;" onactivate="HideCosmetics()">
<Label text="Hide Cosmetics"/>
</Button>
</Panel>
<Panel class="ButtonRow">
<ToggleButton class="CheckBox" checked="checked" style="align: center center; margin-right:20px;" id="SphereCheckbox" text="Show Spheres?" onactivate="SphereCheckbox();" />
<Label style="align: center center; margin-right:5px;" text="+- Scale:"/>
<Panel style="width:150px; align:center center;">
<DropDown id="PlusMinusScale" style="align:center center;" oninputsubmit="PlusMinusScale()">
</DropDown>
</Panel>
</Panel>
<Panel class="ButtonRow" style='visibility:collapse;'>
<ToggleButton class="CheckBox" checked="checked" style="align: center center; margin-left:5px;" id="MouseAngleCheckbox" text="Mouse angles?" onactivate="MouseControlAngles();" />
<ToggleButton class="CheckBox" checked="checked" style="align: center center; margin-right:5px;" id="MouseOffsetCheckbox" text="Mouse offsets?" onactivate="MouseControlOffsets();" />
<Label style="align: center center; font-size: 14px; margin-right:5px;" text="Updates per second:"/>
<DropDown id="MouseUpdateScale" style="align:center center; width: 80px; margin-right:5px;" oninputsubmit="MouseUpdateScale()"> </DropDown>
<Panel class="InfoIcon" tabindex="auto" onmouseover="ShowMouseHelpTooltip()"
onmouseout="HideMouseHelpTooltip()"/>
</Panel>
<Label class="LineLabel" text="Attach Point"/>
<TextEntry id="Attach" class="LineEntry" tabindex="auto" ontabbackward="SetInputFocus(Roll)" placeholder="attach_something" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Label class="LineLabel" text="Model"/>
<TextEntry id="Model" class="LineEntry" tabindex="auto" ontabforward="SetInputFocus(Scale)" placeholder="path/to/model.vmdl" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="ThreeEntry" style="margin-top:-10px;">
<Panel class="LabelEntry">
<Label text="Scale"/>
<Panel style="flow-children:right;">
<TextEntry id="Scale" class="NumEntry" ontabbackward="SetInputFocus(Model)" ontabforward="SetInputFocus(XPos)" maxchars="16" placeholder="1.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#Scale', 0.1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#Scale', -0.1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
<Button id="Top" class="SplashButton CameraButton" style="width:50px;" onactivate="TopCamera()">
<Label text="Top"/>
</Button>
<Button id="SideX" class="SplashButton CameraButton" style="width:50px;" onactivate="SideXCamera()">
<Label text="SideX"/>
</Button>
<Button id="SideY" class="SplashButton CameraButton" style="width:50px;" onactivate="SideYCamera()">
<Label text="SideY"/>
</Button>
<Button id="Normal" class="SplashButton CameraButton" style="width:80px;" onactivate="NormalCamera()">
<Label text="Normal "/>
</Button>
</Panel>
<Panel class="ThreeEntry">
<Panel class="LabelEntry">
<Label text="X"/>
<Panel style="flow-children:right;">
<TextEntry id="XPos" class="NumEntry" ontabbackward="SetInputFocus(Scale)" ontabforward="SetInputFocus(YPos)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#XPos', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#XPos', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
<Panel class="LabelEntry">
<Label text="Y"/>
<Panel style="flow-children:right;">
<TextEntry id="YPos" class="NumEntry" ontabbackward="SetInputFocus(XPos)" ontabforward="SetInputFocus(ZPos)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#YPos', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#YPos', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
<Panel class="LabelEntry">
<Label text="Z"/>
<Panel style="flow-children:right;">
<TextEntry id="ZPos" class="NumEntry" ontabbackward="SetInputFocus(YPos)" ontabforward="SetInputFocus(Pitch)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#ZPos', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#ZPos', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
</Panel>
<Panel class="ThreeEntry">
<Panel class="LabelEntry">
<Label text="Pitch"/>
<Panel style="flow-children:right;">
<TextEntry id="Pitch" class="NumEntry" ontabbackward="SetInputFocus(ZPos)" ontabforward="SetInputFocus(Yaw)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#Pitch', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#Pitch', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
<Panel class="LabelEntry">
<Label text="Yaw"/>
<Panel style="flow-children:right;">
<TextEntry id="Yaw" class="NumEntry" ontabbackward="SetInputFocus(Pitch)" ontabforward="SetInputFocus(Roll)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#Yaw', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#Yaw', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
<Panel class="LabelEntry">
<Label text="Roll"/>
<Panel style="flow-children:right;">
<TextEntry id="Roll" class="NumEntry" ontabbackward="SetInputFocus(Yaw)" ontabforward="SetInputFocus(Attach)" maxchars="16" placeholder="0.0" onblur="UpdateAttachment();" oninputsubmit="UpdateAttachment()"/>
<Panel class="PlusMinus">
<Button class="SplashButton Plus" onactivate="ValueChange('#Roll', 1);">
<Label text="+"/>
</Button>
<Button class="SplashButton Minus" onactivate="ValueChange('#Roll', -1);">
<Label text="-"/>
</Button>
</Panel>
</Panel>
</Panel>
</Panel>
<Panel class="ButtonRow">
<Button id="Load" class="SplashButton SButton" onactivate="Load()">
<Label text="Load"/>
</Button>
<Button id="Hide" class="SplashButton SButton" onactivate="Hide()">
<Label text="Hide"/>
</Button>
<Button id="Save" class="SplashButton SButton" onactivate="Save()">
<Label text="Save"/>
</Button>
</Panel>
</Panel>
<Panel hittest="true" id="AttachmentsFooter">
<Label text=""/>
</Panel>
</Panel>
<Panel hittest="true" class="PopupPanel" style="visibility:collapse;">
<Label id="PopupLabel" class="PopupTitle" text="text here"/>
<Button id="Button0" class="PlayButton">
<Label text="BUTTON2"/>
<!-- class="PopupButton" -->
</Button>
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/barebones_notifications.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/barebones_notifications.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/barebones_notifications.js" />
</scripts>
<Panel hittest="false" class="BarebonesBaseHud">
<Panel hittest="false" class="BarebonesTopNotifications">
<Panel hittest="false" id="TopNotifications">
</Panel>
</Panel>
<Panel hittest="false" class="BarebonesBottomNotifications">
<Panel hittest="false" id="BottomNotifications">
</Panel>
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/barebones_worldpanels.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
</styles>
<scripts>
<include src="file://{resources}/scripts/barebones_worldpanels.js" />
</scripts>
<Panel hittest="false" style="width:100%; height:100%; z-index:1000;">
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/alt_container_example.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/container.js" />
</scripts>
<Panel draggable="true" class="Outer">
<Panel id="Header">
<Label hittest="false" id="HeaderLabel" text="Container Header"/>
<Button class="CloseButton" draggable="true" id="CloseButton" onactivate="CloseClicked()"/>
</Panel>
<Panel style="flow-children:right;">
<Panel style="height:95%; flow-children:down; background-color:#000000ee;">
<Label text="Helm" style="font-weight:bold; height:fill-parent-flow(1.0); horizontal-align:right; padding:15px 0px 0px 15px;" />
<Label text="Chest" style="font-weight:bold; height:fill-parent-flow(1.0); horizontal-align:right; padding:15px 0px 0px 15px;"/>
<Label text="Feet" style="font-weight:bold; height:fill-parent-flow(1.0); horizontal-align:right; padding:15px 0px 0px 15px;"/>
</Panel>
<Panel id="Inner" draggable="true">
</Panel>
</Panel>
<Panel id="Footer">
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/container.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/container.js" />
</scripts>
<Panel draggable="true" class="Outer">
<Panel id="Header">
<Label hittest="false" id="HeaderLabel" text="Container Header"/>
<Button class="CloseButton" draggable="true" id="CloseButton" onactivate="CloseClicked()"/>
</Panel>
<Panel id="Inner" draggable="true">
</Panel>
<Panel id="Footer">
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/container_base.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
<include src="s2r://panorama/styles/hero_splash.vcss_c" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/container_base.js" />
<include src="file://{resources}/scripts/containers/container_events.js" />
<include src="file://{resources}/scripts/containers/dota_inventory.js" />
</scripts>
<Panel hittest="false" class="ContainersBase">
<Panel hittest="false" style="width:100%; height:100%;" id="PanoramaInventory">
<Panel id="stash_row" />
<Panel id="inventory_items">
<Panel id="inventory_row_1" />
<Panel id="inventory_row_2" />
</Panel>
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/dota_inventory.js" />
</scripts>
<Panel class="InventoryOverlayRoot" hittest="false">
<Panel id="stash_row" />
<Panel id="inventory_items">
<Panel id="inventory_row_1" />
<Panel id="inventory_row_2" />
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory_context_menu.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/dota_inventory_context_menu.js" />
</scripts>
<Panel class="ItemMenu">
<Button class="ItemMenuButton" id="ShowInShop" onmouseactivate="OnShowInShop()">
<Label text="Show In Shop" />
</Button>
<Button class="ItemMenuButton" id="Sell" onactivate="OnSell()">
<Label text="Sell" />
</Button>
<Button class="ItemMenuButton" id="Disassemble" onactivate="OnDisassemble()">
<Label text="Disassemble" />
</Button>
<Button class="ItemMenuButton" id="DropFromStash" onactivate="OnDropFromStash()">
<Label text="Drop From Stash" />
</Button>
<Button class="ItemMenuButton" id="Alert" onactivate="OnAlert()">
<Label text="Alert" />
</Button>
<Button class="ItemMenuButton" id="MoveToStash" onactivate="OnMoveToStash()">
<Label text="Move To Stash" />
</Button>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory_item.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/dota_inventory_item.js" />
</scripts>
<Panel class="ItemPanel" draggable="true">
<Button id="ItemButton"
onmouseover="ItemShowTooltip()"
onmouseout="ItemHideTooltip()"
onactivate="ActivateItem()"
ondblclick="DoubleClickItem()"
oncontextmenu="RightClickItem()"
>
<DOTAItemImage hittest="false" id="ItemImage" />
<Panel hittest="false" id="Cooldown">
<Panel hittest="false" id="CooldownOverlay" />
<Label hittest="false" id="CooldownTimer" />
</Panel>
<Label hittest="false" class="" id="Stock"/>
<Label hittest="false" class="Charges" id="ChargeCount" />
<Label hittest="false" class="Charges" id="AltChargeCount" />
<Label hittest="false" class="" id="ManaCost"/>
<Label hittest="false" class="" id="Price"/>
<Panel hittest="false" id="DropTargetHighlight" />
</Button>
<Panel hittest="false" id="Hotkey">
<Panel hittest="false" id="HotkeyBlock" />
<Label hittest="false" id="HotkeyText" />
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/inventory_context_menu.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/inventory_context_menu.js" />
</scripts>
<Panel class="ItemMenu">
<Button class="ItemMenuButton" id="ShowInShop" onmouseactivate="OnShowInShop()">
<Label text="Show In Shop" />
</Button>
<Button class="ItemMenuButton" id="Sell" onactivate="OnSell()">
<Label text="Sell" />
</Button>
<Button class="ItemMenuButton" id="Disassemble" onactivate="OnDisassemble()">
<Label text="Disassemble" />
</Button>
<Button class="ItemMenuButton" id="DropFromStash" onactivate="OnDropFromStash()">
<Label text="Drop From Stash" />
</Button>
<Button class="ItemMenuButton" id="Alert" onactivate="OnAlert()">
<Label text="Alert" />
</Button>
<Button class="ItemMenuButton" id="MoveToStash" onactivate="OnMoveToStash()">
<Label text="Move To Stash" />
</Button>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/containers/inventory_item.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/containers/container.css" />
<include src="file://{resources}/styles/containers/container_skins.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/containers/inventory_item.js" />
</scripts>
<Panel class="ItemPanel" draggable="true">
<Button id="ItemButton"
onmouseover="OnMouseOver()"
onmouseout="OnMouseOut()"
onactivate="ActivateItem()"
ondblclick="DoubleClickItem()"
oncontextmenu="RightClickItem()"
>
<DOTAItemImage hittest="false" id="ItemImage" />
<Panel hittest="false" id="Cooldown">
<Panel hittest="false" id="CooldownOverlay" />
<Label hittest="false" id="CooldownTimer" />
</Panel>
<Label hittest="false" class="" id="Stock"/>
<Label hittest="false" class="Charges" id="ChargeCount" />
<Label hittest="false" class="Charges" id="AltChargeCount" />
<Label hittest="false" class="" id="ManaCost"/>
<Label hittest="false" class="" id="Price"/>
<Panel hittest="false" id="DropTargetHighlight" />
</Button>
<Panel hittest="false" id="Hotkey">
<Label hittest="false" id="HotkeyText" />
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/custom_loading_screen.xml
================================================
<root>
<styles>
<include src="file://{resources}/styles/custom_loading_screen.css" />
</styles>
<Panel class="AddonLoadingRoot">
<Panel id="CustomBg" >
<Image id="gamemode" class="SeqImg" src="file://{images}/custom_game/loading_screen/gamemode.png" />
</Panel>
<Panel id="TitlePanel">
<!--Label id="AddonTitle" text="#addon_game_name" style="" /-->
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/custom_ui_manifest.xml
================================================
<root>
<scripts>
<include src="file://{resources}/scripts/playertables/playertables_base.js" />
</scripts>
<script>
// Uncomment any of the following lines in order to disable that portion of the default UI
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_TOP_TIMEOFDAY, false ); //Time of day (clock).
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_TOP_HEROES, false ); //Heroes and team score at the top of the HUD.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_FLYOUT_SCOREBOARD, false ); //Lefthand flyout scoreboard.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_ACTION_PANEL, false ); //Hero actions UI.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_ACTION_MINIMAP, false ); //Minimap.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_PANEL, false ); //Entire Inventory UI
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_SHOP, false ); //Shop portion of the Inventory.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_ITEMS, false ); //Player items.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_QUICKBUY, false ); //Quickbuy.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_COURIER, false ); //Courier controls.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_PROTECT, false ); //Glyph.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_GOLD, false ); //Gold display.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_SHOP_SUGGESTEDITEMS, false ); //Suggested items shop panel.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_HERO_SELECTION_TEAMS, false ); //Hero selection Radiant and Dire player lists.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_HERO_SELECTION_GAME_NAME, false ); //Hero selection game mode name display.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_HERO_SELECTION_CLOCK, false ); //Hero selection clock.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_TOP_MENU_BUTTONS, false ); //Top-left menu buttons in the HUD.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_ENDGAME, false ); //Endgame scoreboard.
//GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_TOP_BAR_BACKGROUND, false ); //Top-left menu buttons in the HUD.
// These lines set up the panorama colors used by each team (for game select/setup, etc)
GameUI.CustomUIConfig().team_colors = {}
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_GOODGUYS] = "#3dd296;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_BADGUYS ] = "#F3C909;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_1] = "#c54da8;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_2] = "#FF6C00;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_3] = "#3455FF;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_4] = "#65d413;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_5] = "#815336;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_6] = "#1bc0d8;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_7] = "#c7e40d;";
GameUI.CustomUIConfig().team_colors[DOTATeam_t.DOTA_TEAM_CUSTOM_8] = "#8c2af4;";
</script>
<Panel>
<!-- CustomUIElements go here.-->
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/barebones_notifications.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/barebones_attachments.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/barebones_worldpanels.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/containers/container_base.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/modmaker/modmaker.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/selection.xml" />
<!-- From Overthrow.
<CustomUIElement type="HudTopBar" layoutfile="file://{resources}/layout/custom_game/multiteam_top_scoreboard.xml" />
<CustomUIElement type="Hud" layoutfile="file://{resources}/layout/custom_game/overthrow_item_notification.xml" />
<CustomUIElement type="GameSetup" layoutfile="file://{resources}/layout/custom_game/team_select.xml" />
<CustomUIElement type="FlyoutScoreboard" layoutfile="file://{resources}/layout/custom_game/multiteam_flyout_scoreboard.xml" />
<CustomUIElement type="HeroSelection" layoutfile="file://{resources}/layout/custom_game/multiteam_hero_select_overlay.xml" />
<CustomUIElement type="EndScreen" layoutfile="file://{resources}/layout/custom_game/multiteam_end_screen.xml" />
<CustomUIElement type="GameInfo" layoutfile="file://{resources}/layout/custom_game/overthrow_game_info.xml" />
-->
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/modmaker/modmaker.css" />
<include src="s2r://panorama/styles/hero_splash.vcss_c" />
</styles>
<scripts>
<include src="file://{resources}/scripts/modmaker/modmaker.js" />
</scripts>
<Panel hittest="false" class="ModmakerBase">
<Panel hittest="true" id="APIWindow">
<Panel hittest="true" id="TitleSearch">
<Label text="Lua API" id="Title"/>
<TextEntry placeholder="Search API..." id="Search" oninputsubmit="SearchAPI()"/>
<Button class="SplashButton" id="SearchButton" onactivate="SearchAPI()">
<Label text="Search"/>
</Button>
<Button class="CloseButton" id="CloseButton" style="align: right top;" onactivate="CloseClicked()"/>
</Panel>
<Panel hittest="true" id="API"/>
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker_api_category.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/modmaker/modmaker.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/modmaker/modmaker_api_category.js" />
</scripts>
<Panel hittest="false" class="CategoryRoot">
<Panel hittest="true" class="CategoryBase" onactivate="Clicked()">
<Panel hittest="false" class="Category">
<Label text="+" id="PlusMinus"/>
<Label text="Category" id="CategoryName"/>
</Panel>
</Panel>
<Panel hittest="false" id="Properties"/>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker_api_property.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/modmaker/modmaker.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/modmaker/modmaker_api_property.js" />
</scripts>
<Panel hittest="false" class="Property">
<Panel hittest="false" class="PropNameLink">
<Label text="" id="PropertyName"/>
<Button id="Github" class="Github" onactivate="OpenGitHub()">
<Label text="Search Github"/>
</Button>
</Panel>
<Label text="" id="PropertyFunction" onactivate="FuncClicked()"/>
<Label text="" id="PropertyDescription"/>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/selection.xml
================================================
<root>
<scripts>
<include src="file://{resources}/scripts/selection/selection.js" />
<include src="file://{resources}/scripts/selection/selection_filter.js" />
</scripts>
<Panel></Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/worldpanels/arrow.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/worldpanels/arrow.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/worldpanels/arrow.js" />
</scripts>
<Panel hittest="false" class="ArrowPanel">
<Image id="arrow" src="s2r://materials/particle/arrow_down.vtex" />
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/layout/custom_game/worldpanels/healthbar.xml
================================================
<root>
<styles>
<include src="s2r://panorama/styles/dotastyles.vcss_c" />
<include src="file://{resources}/styles/worldpanels/healthbar.css" />
</styles>
<scripts>
<include src="file://{resources}/scripts/worldpanels/healthbar.js" />
</scripts>
<Panel hittest="false" class="HealthBar">
<Panel class="Bubble">
<Panel id="HP1" class="HP"/>
</Panel>
<Panel class="Bubble">
<Panel id="HP2" class="HP"/>
</Panel>
<Panel class="Bubble">
<Panel id="HP3" class="HP"/>
</Panel>
<Panel class="Bubble">
<Panel id="HP4" class="HP"/>
</Panel>
<Panel class="Bubble">
<Panel id="HP5" class="HP"/>
</Panel>
</Panel>
</root>
================================================
FILE: content/dota_addons/barebones/panorama/scripts/barebones_attachments.js
================================================
var lastUnit = null;
var activated = false;
var showing = false;
var pmscale = 1;
function OnDragStart( panelId, dragCallbacks )
{
var panel = $('#' + panelId);
var toDragId = panel.toDragId;
//$.Msg('OnDragStart -- ', toDragId, ' -- ', panelId, ' -- ', dragCallbacks);
// hook up the display panel, and specify the panel offset from the cursor
/*$.Msg('#' + panelId);
var p = $('#' + panelId);
$.Msg(p);
$.Msg($.GetContextPanel());
if (panel === null && $('#' + panelId))
panel = $('#' + panelId); */
panel = $('#' + toDragId);
dragCallbacks.displayPanel = panel;//panel;
var cursor = GameUI.GetCursorPosition();
dragCallbacks.offsetX = cursor[0] - panel.actualxoffset;//250;
dragCallbacks.offsetY = cursor[1] - panel.actualyoffset;//20;
dragCallbacks.removePositionBeforeDrop = false;
return false;
}
function OnDragEnd( panelId, draggedPanel )
{
//$.Msg('OnDragEnd -- ', panelId, ' -- ', draggedPanel);
draggedPanel.SetParent($.GetContextPanel());
return false;
}
function ValueChange(panel, amount)
{
//$.Msg(panel)
var panel = $(panel);
var defText = panel.GetChild(0);
if (defText !== null && defText !== undefined){
defText = defText.text;
defText = parseFloat(defText);
}
else{
defText = 0.0;
}
var text = panel.text;
if (text === "")
text = defText;
else
text = parseFloat(text);
if (text === NaN)
text = defText;
text += amount * pmscale;
if (panel.id == "Scale")
panel.text = text.toFixed(2);
else
panel.text = text.toFixed(1);
UpdateAttachment();
}
function GetAttachmentTable()
{
var table = {};
table['model'] = $('#Model').text;
table['attach'] =$('#Attach').text;
table['scale'] = parseFloat($('#Scale').text) || 1.0;
table['pitch'] = parseFloat($('#Pitch').text) || 0.0;
table['yaw'] = parseFloat($('#Yaw').text) || 0.0;
table['roll'] = parseFloat($('#Roll').text) || 0.0;
table['XPos'] = parseFloat($('#XPos').text) || 0.0;
table['YPos'] = parseFloat($('#YPos').text) || 0.0;
table['ZPos'] = parseFloat($('#ZPos').text) || 0.0;
return table;
}
function UpdateAttachment(a)
{
//$.Msg("UpdateAttachment ");
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_UpdateAttach", {index: lastUnit, properties:table} );
}
function Freeze()
{
//$.Msg("Freeze");
var panel = $('#Freeze');
var label = panel.GetChild(0);
var text = label.text;
if (text === "Freeze")
{
label.text = "Unfreeze";
label.style.color = "#ffaaaa";
GameEvents.SendCustomGameEventToServer( "Attachment_Freeze", {index: lastUnit, freeze:true} );
}
else
{
label.text = "Freeze";
label.style.color = "#aaaaff";
GameEvents.SendCustomGameEventToServer( "Attachment_Freeze", {index: lastUnit, freeze:false} )
}
}
function Save()
{
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_SaveAttach", {index: lastUnit, properties:table} )
}
function Load()
{
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_LoadAttach", {index: lastUnit, properties:table} )
}
function Hide()
{
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_HideAttach", {index: lastUnit, properties:table} )
}
function AttachCheckbox()
{
var panel = $('#AttachCheckbox');
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_DoAttach", {index: lastUnit, properties:table, doAttach: panel.checked} )
}
function SphereCheckbox()
{
var panel = $('#SphereCheckbox');
var table = GetAttachmentTable();
GameEvents.SendCustomGameEventToServer( "Attachment_DoSphere", {index: lastUnit, properties:table, doSphere: panel.checked} )
}
function HideCosmetics()
{
var panel = $('#CosmeticsPanel');
if (panel.visible)
panel.visible = false;
else
panel.visible = true;
}
function CloseCosmetics()
{
var panel = $('#CosmeticsPanel');
panel.visible = false;
}
function TopCamera()
{
GameUI.SetCameraPitchMax( 90 );
GameUI.SetCameraPitchMin( 90 );
GameUI.SetCameraYaw( 0 );
}
function SideXCamera()
{
GameUI.SetCameraPitchMax( 1 );
GameUI.SetCameraPitchMin( 1 );
GameUI.SetCameraYaw( 0 );
}
function SideYCamera()
{
GameUI.SetCameraPitchMax( 1 );
GameUI.SetCameraPitchMin( 1 );
GameUI.SetCameraYaw( 90 );
}
function NormalCamera()
{
GameUI.SetCameraPitchMax( 60 );
GameUI.SetCameraPitchMin( 38 );
GameUI.SetCameraYaw( 0 );
}
function SelectUnitUpdated()
{
//$.Msg('SelectUnitUpdated ', lastUnit, ' -- ', Players.GetLocalPlayerPortraitUnit());
var newUnit = Players.GetLocalPlayerPortraitUnit();
if (newUnit !== lastUnit)
{
$.Msg("new");
GameEvents.SendCustomGameEventToServer( "Attachment_UpdateUnit", {index: newUnit} );
}
lastUnit = newUnit;
}
function PlusMinusScale()
{
$.Msg("PlusMinusScale");
var dropdown = $("#PlusMinusScale");
pmscale = parseFloat(dropdown.GetSelected().text);
}
function CosmeticListUpdated(msg)
{
//$.Msg("CosmeticListUpdated ", msg);
// Remove old children
var panel = $('#CosmeticsBody');
for (i=0;i<panel.GetChildCount(); i++){
var lastPanel = panel.GetChild(i);
lastPanel.DeleteAsync(0);
}
for (var key in msg){
var row = $.CreatePanel('Panel', panel, '');
row.AddClass('CosmeticRow');
var label = $.CreatePanel('Label', row, '');
label.AddClass('CosmeticLabel');
label.text = msg[key];
var button = $.CreatePanel('Button', row, '');
button.AddClass('CosmeticButton');
button.AddClass('SplashButton');
button.SetPanelEvent('onactivate', (function(model){
return function(){
GameEvents.SendCustomGameEventToServer( "Attachment_HideCosmetic", {index: lastUnit, model: model} );
};
})(msg[key]));
var buttonLabel = $.CreatePanel('Label', button, '');
buttonLabel.text = "Toggle";
}
}
function UpdateFields(msg)
{
//$.Msg("UpdateFields ", msg);
$('#Model').text = msg['model'] || "";
$('#Attach').text = msg['attach'] || "";
$('#Scale').text = msg['scale'].toFixed(2);
$('#Pitch').text = msg['pitch'].toFixed(1);//table['pitch'] = parseFloat($('#Pitch').text) || 0.0;
$('#Yaw').text = msg['yaw'].toFixed(1);//table['yaw'] = parseFloat($('#Yaw').text) || 0.0;
$('#Roll').text = msg['roll'].toFixed(1);//table['roll'] = parseFloat($('#Roll').text) || 0.0;
$('#XPos').text = msg['XPos'].toFixed(1);//table['XPos'] = parseFloat($('#XPos').text) || 0.0;
$('#YPos').text = msg['YPos'].toFixed(1);//table['YPos'] = parseFloat($('#YPos').text) || 0.0;
$('#ZPos').text = msg['ZPos'].toFixed(1);//table['ZPos'] = parseFloat($('#ZPos').text) || 0.0;
UpdateAttachment();
}
function ActivateAttachmentConfiguration(msg)
{
if (showing){
$("#AttachmentsPanel").visible = false;
$("#CosmeticsPanel").visible = false;
showing = false;
}
else{
if (!activated){
GameEvents.Subscribe( "dota_player_update_selected_unit", SelectUnitUpdated );
GameEvents.Subscribe( "attachment_cosmetic_list", CosmeticListUpdated );
GameEvents.Subscribe( "attachment_update_fields", UpdateFields );
//GameUI.SetMouseCallback(HandleMouseEvent);
activated = true;
}
lastUnit = Players.GetLocalPlayerPortraitUnit();
$("#PlusMinusScale").SetSelected($("#DD2"));
if (lastUnit){
GameEvents.SendCustomGameEventToServer( "Attachment_UpdateUnit", {index: lastUnit} );
}
$("#AttachmentsPanel").visible = true;
showing = true;
}
}
var IsMouseControlledAngles = false;
var IsMouseControlledOffsets = false;
var lastMousePos;
var mouseUpdateInterval = 2.0;
function MouseControlAngles()
{
if(IsMouseControlledAngles == false) {
IsMouseControlledAngles = true;
MouseControlAnglesLoop();
}
else {
IsMouseControlledAngles = false;
}
}
function MouseControlOffsets()
{
if(IsMouseControlledOffsets == false) {
IsMouseControlledOffsets = true;
MouseControlOffsetsLoop();
}
else {
IsMouseControlledOffsets = false;
}
}
function MouseControlAnglesLoop()
{
var mousePos = GameUI.GetCursorPosition();
var difX = lastMousePos[0] - mousePos[0];
var difY = lastMousePos[1] - mousePos[1];
if(GameUI.IsMouseDown(0) == false) {
var yaw = MouseCalc($('#Yaw'), difX, pmscale/8);
var pitch = MouseCalc($('#Pitch'), difY, pmscale/8);
var roll = MouseCalc($("#Roll"), g_MouseYaw, pmscale*10);
$("#Yaw").text = yaw;
$("#Pitch").text = pitch;
$("#Roll").text = roll;
UpdateAttachment();
}
g_MouseYaw = 0;
lastMousePos = mousePos;
if(IsMouseControlledAngles == true) {
$.Schedule(1.0/mouseUpdateInterval, MouseControlAnglesLoop);
}
}
function MouseCalc(panel, dif, scale)
{
var num = parseFloat(panel.text);
if(isNaN(num)) {
panel.text = num.toString();
num = 0;
}
var angle = num + (scale * dif);
angle = Math.round(angle * 100) / 100;
return angle.toString();
}
function MouseControlOffsetsLoop()
{
var mousePos = GameUI.GetCursorPosition();
var difX = mousePos[0] - lastMousePos[0];
var difY = lastMousePos[1] - mousePos[1];
if(GameUI.IsMouseDown(0) == false) {
var x = MouseCalc($('#XPos'), difX, pmscale/8);
var y = MouseCalc($('#YPos'), difY, pmscale/8);
var z = MouseCalc($("#ZPos"), g_MouseYaw, pmscale*10);
$('#XPos').text = x.toString();
$('#YPos').text = y.toString();
$('#ZPos').text = z.toString();
if(IsMouseControlledAngles == false)
{
UpdateAttachment();
}
}
if(IsMouseControlledAngles == false) {
lastMousePos = mousePos;
g_MouseYaw = 0;
}
if(IsMouseControlledOffsets == true)
{
$.Schedule(1.0/mouseUpdateInterval, MouseControlOffsetsLoop);
}
}
function MouseUpdateScale()
{
var dropdown = $("#MouseUpdateScale");
mouseUpdateInterval = parseFloat(dropdown.GetSelected().text);
}
function ShowMouseHelpTooltip()
{
$.DispatchEvent("DOTAShowTextTooltip", "Holding the left mouse button down disables updating. Scale affects the rate at which items are oriented or moved. Vertical mouse movement affects the Y offset and pitch. Horizontal mouse movement affects the X offset and yaw. Mouse wheel movement affects the Z offset and roll.");
}
function HideMouseHelpTooltip()
{
$.DispatchEvent("DOTAHideTextTooltip");
}
var g_MouseYaw = 0;
function HandleMouseEvent(eventName, arg)
{
if ( eventName === "wheeled" ) {
g_MouseYaw += arg * pmscale;
if(IsMouseControlledAngles == true || IsMouseControlledOffsets == true) {
return true;
}
}
return false;
}
(function()
{
lastMousePos = GameUI.GetCursorPosition();
var panel = $("#AttachmentsPanel");
$("#AttachmentsHeader").toDragId = "AttachmentsPanel";
$("#CosmeticsHeader").toDragId = "CosmeticsPanel";
$("#AttachCheckbox").checked = true;
$("#SphereCheckbox").checked = true;
GameEvents.Subscribe( "activate_attachment_configuration", ActivateAttachmentConfiguration );
//$.Msg(panel.firstLoadDone);
if (panel.firstLoadDone)
return;
panel.firstLoadDone = true;
var options = [.1,.5,1,5,10,25];
var dropdown = $("#PlusMinusScale");
for (var i=0; i<options.length; i++){
var label = $.CreatePanel('Label', dropdown, 'DD' + i);
label.text = options[i];
dropdown.AddOption(label);
}
dropdown.SetSelected("DD2");
options = [2, 5, 10, 15, 20, 25, 30];
dropdown = $("#MouseUpdateScale");
for (var i=0; i<options.length; i++){
var label = $.CreatePanel('Label', dropdown, 'mDD' + i);
label.text = Math.ceil(options[i] * 100) / 100;
dropdown.AddOption(label);
}
dropdown.SetSelected("mDD3");
$.RegisterEventHandler( 'DragStart', $('#AttachmentsHeader'), OnDragStart );
$.RegisterEventHandler( 'DragEnd', $('#AttachmentsHeader'), OnDragEnd );
$.RegisterEventHandler( 'DragStart', $('#CosmeticsHeader'), OnDragStart );
$.RegisterEventHandler( 'DragEnd', $('#CosmeticsHeader'), OnDragEnd );
})();
================================================
FILE: content/dota_addons/barebones/panorama/scripts/barebones_notifications.js
================================================
function TopNotification( msg ) {
AddNotification(msg, $('#TopNotifications'));
}
function BottomNotification(msg) {
AddNotification(msg, $('#BottomNotifications'));
}
function TopRemoveNotification(msg){
RemoveNotification(msg, $('#TopNotifications'));
}
function BottomRemoveNotification(msg){
RemoveNotification(msg, $('#BottomNotifications'));
}
function RemoveNotification(msg, panel){
var count = msg.count;
if (count > 0 && panel.GetChildCount() > 0){
var start = panel.GetChildCount() - count;
if (start < 0)
start = 0;
for (i=start;i<panel.GetChildCount(); i++){
var lastPanel = panel.GetChild(i);
//lastPanel.SetAttributeInt("deleted", 1);
lastPanel.deleted = true;
lastPanel.DeleteAsync(0);
}
}
}
function AddNotification(msg, panel) {
var newNotification = true;
var lastNotification = panel.GetChild(panel.GetChildCount() - 1)
//$.Msg(msg)
msg.continue = msg.continue || false;
//msg.continue = true;
if (lastNotification != null && msg.continue)
newNotification = false;
if (newNotification){
lastNotification = $.CreatePanel('Panel', panel, '');
lastNotification.AddClass('NotificationLine')
lastNotification.hittest = false;
}
var notification = null;
if (msg.hero != null)
notification = $.CreatePanel('DOTAHeroImage', lastNotification, '');
else if (msg.image != null)
notification = $.CreatePanel('Image', lastNotification, '');
else if (msg.ability != null)
notification = $.CreatePanel('DOTAAbilityImage', lastNotification, '');
else if (msg.item != null)
notification = $.CreatePanel('DOTAItemImage', lastNotification, '');
else
notification = $.CreatePanel('Label', lastNotification, '');
if (typeof(msg.duration) != "number"){
//$.Msg("[Notifications] Notification Duration is not a number!");
msg.duration = 3
}
if (newNotification){
$.Schedule(msg.duration, function(){
//$.Msg('callback')
if (lastNotification.deleted)
return;
lastNotification.DeleteAsync(0);
});
}
if (msg.hero != null){
notification.heroimagestyle = msg.imagestyle || "icon";
notification.heroname = msg.hero
notification.hittest = false;
} else if (msg.image != null){
notification.SetImage(msg.image);
notification.hittest = false;
} else if (msg.ability != null){
notification.abilityname = msg.ability
notification.hittest = false;
} else if (msg.item != null){
notification.itemname = msg.item
notification.hittest = false;
} else{
notification.html = true;
var text = msg.text || "No Text provided";
notification.text = $.Localize(text)
notification.hittest = false;
notification.AddClass('TitleText');
}
if (msg.class)
notification.AddClass(msg.class);
else
notification.AddClass('NotificationMessage');
if (msg.style){
for (var key in msg.style){
var value = msg.style[key]
notification.style[key] = value;
}
}
}
(function () {
GameEvents.Subscribe( "top_notification", TopNotification );
GameEvents.Subscribe( "bottom_notification", BottomNotification );
GameEvents.Subscribe( "top_remove_notification", TopRemoveNotification );
GameEvents.Subscribe( "bottom_remove_notification", BottomRemoveNotification );
})();
================================================
FILE: content/dota_addons/barebones/panorama/scripts/barebones_worldpanels.js
================================================
var PlayerTables = GameUI.CustomUIConfig().PlayerTables;
var subscription = null;
const HA_CENTER = 0;
const HA_LEFT = 1;
const HA_RIGHT = 2;
const VA_BOTTOM = 0;
const VA_CENTER = 1;
const VA_TOP = 2;
$.Msg("barebones_worldpanels.js");
var panels = {};
var entities = [];
//{panel, position, entity, offsetX, offsetY, hAlign, vAlign, entityHeight, edge}
// panel deletion call?
// Delete call to server for cleanup
function WorldPanelChange(id, changes, dels)
{
//$.Msg("change ", id, ' -- ', changes, ' -- ', dels);
for (var k in changes){
var wp = panels[k];
if (!wp){
wp = {};
panels[k] = wp;
}
if (changes[k].layout !== wp.layout){
if (wp.panel)
wp.panel.DeleteAsync(0);
wp.panel = $.CreatePanel( "Panel", $.GetContextPanel(), "" );
wp.panel.BLoadLayout(changes[k].layout, false, false);
wp.panel.WorldPanel = wp;
wp.panel.OnEdge = false;
wp.panel.OffScreen = false;
wp.panel.Data = wp.data;
wp.panel.DeleteWorldPanel = function(pan){
return function(){
pan.DeleteAsync(0);
delete panels[k];
}
}(wp.panel);
}
for (j in changes[k]){
if (j == "position"){
wp[j] = changes[k][j].split(' ');
wp[j] = [parseFloat(wp[j][0]), parseFloat(wp[j][1]), parseFloat(wp[j][2])]
}
else if (j == "data"){
wp.panel.Data = changes[k][j];
wp[j] = changes[k][j];
}
else
wp[j] = changes[k][j];
}
//wp.dirty = true;
wp.offsetX = wp.offsetX || 0;
wp.offsetY = wp.offsetY || 0;
wp.entityHeight = wp.entityHeight || 0;
wp.hAlign = wp.hAlign || HA_CENTER;
wp.vAlign = wp.vAlign || VA_BOTTOM;
wp.edge = wp.edge || -1;
wp.seen = wp.entity ? Entities.IsValidEntity(wp.entity) : null;
}
for (var k in dels){
panels[k].panel.DeleteAsync(0);
delete panels[k];
}
}
function PositionPanels()
{
//$.Msg(Object.keys(panels).length);
for (var k in panels){
var wp = panels[k];
var pos = wp.position;
if (!pos){
if (!Entities.IsValidEntity(wp.entity)){
if (wp.seen){
panels[k].panel.DeleteAsync(0);
delete panels[k];
continue;
}
else{
continue;
}
}
wp.seen = true;
pos = Entities.GetAbsOrigin(wp.entity);
if (entities.indexOf(wp.entity) === -1){
wp.panel.visible = false;
continue;
}
wp.panel.visible = true;
pos[2] += wp.entityHeight || 0;
}
var wx = Game.WorldToScreenX(pos[0], pos[1], pos[2]);
var wy = Game.WorldToScreenY(pos[0], pos[1], pos[2]);
var sw = GameUI.CustomUIConfig().screenwidth;
var sh = GameUI.CustomUIConfig().screenheight;
var scale = 1080 / sh;
var x = scale * wx + wp.offsetX;
wx = wx + wp.offsetX
var y = scale * wy + wp.offsetY;
wy = wy + wp.offsetY
var pw = wp.panel.actuallayoutwidth;
var ph = wp.panel.actuallayoutheight;
switch(wp.hAlign){
case HA_LEFT:
break;
case HA_RIGHT:
x-= pw;
break;
case HA_CENTER:
default:
x-= pw/2;
break;
};
switch(wp.vAlign){
case VA_TOP:
break;
case VA_CENTER:
y-= ph/2;
break;
case VA_BOTTOM:
default:
y-= ph;
break;
};
if (wp.edge !== -1){
var padx = sw * wp.edge / 100;
var pady = sh * wp.edge / 100;
var oldx = x;
var oldy = y;
x = Math.max(padx,Math.min((sw-pw-padx)*scale, x));
y = Math.max(pady,Math.min((sh-ph-pady)*scale, y));
//$.Msg(oldx, ' -- ', oldy, ' ', wx, ' -- ', wy, ' ', x, ' -- ', y)
if (x !== oldx || y !== oldy){
wp.panel.OnEdge = true;
var center = Game.ScreenXYToWorld(sw/2, sh/2)
var center2 = GameUI.GetScreenWorldPosition(sw/2, sh/2 + 1)
if (center && center2){
var diff = [center2[0]-center[0], center2[1]-center[1]]
var diff2 = [pos[0]-center[0], pos[1]-center[1]]
var ang = Math.atan2(diff2[1], diff2[0]) - Math.atan2(diff[1], diff[0]) - Math.PI/2
x = Math.cos(ang)
y = -1*Math.sin(ang)
var xscale = ((sw-2*padx)/2 / x)
var yscale = ((sh-2*pady)/2 / y)
var minscale = Math.min(Math.abs(xscale), Math.abs(yscale));
x = x * minscale + sw/2
y = y * minscale + sh/2
x = x - pw * (x/(sw-pw));
y = y - ph * (y/(sh-ph));
x *= scale;
y *= scale;
x = x.toFixed(1)
y = y.toFixed(1)
}
else{
x = NaN;
y = NaN;
}
}
else
wp.panel.OnEdge = false;
}
else{
if (x < pw || x > sw || y < ph || y > sh)
wp.panel.OffScreen = true;
else
wp.panel.OffScreen = false;
}
if (!isFinite(x) || isNaN(x) || !isFinite(y) || isNaN(y))
{
x = -1000;
y = -1000;
wp.panel.visible = false;
}
else
{
wp.panel.visible = true;
}
wp.panel.style.position = x + "px " + y + "px 0px;";
//$.Msg(k, ' -- ', pw, ' -- ', ph);
//var x = scale * Math.min(sw - panel.desiredlayoutwidth,Math.max(0, wx - panel.desiredlayoutwidth/2));
//var y = scale * Math.min(sh - panel.desiredlayoutheight,Math.max(0, wy - panel.desiredlayoutheight - 50));
}
$.Schedule(1/200, PositionPanels);
}
function ScreenHeightWidth()
{
var panel = $.GetContextPanel();
GameUI.CustomUIConfig().screenwidth = panel.actuallayoutwidth;
GameUI.CustomUIConfig().screenheight = panel.actuallayoutheight;
$.Schedule(1/2, ScreenHeightWidth);
}
function UpdateEntities()
{
if (Object.keys(panels).length > 0)
entities = Entities.GetAllEntities();
$.Schedule(1/10, UpdateEntities);
}
(function()
{
var pt = "worldpanels_" + Game.GetLocalPlayerID()
ScreenHeightWidth();
PositionPanels();
UpdateEntities();
entities = Entities.GetAllEntities();
if ($.GetContextPanel().subscription !== undefined){
PlayerTables.UnsubscribeNetTableListener($.GetContextPanel().subscription);
}
subscription = PlayerTables.SubscribeNetTableListener(pt, WorldPanelChange);
var tab = PlayerTables.GetAllTableValues(pt);
for (var k in tab){
var change = {};
change[k] = tab[k];
WorldPanelChange(pt, change, {});
}
$.GetContextPanel().subscription = subscription;
})();
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/container.js
================================================
"use strict";
var Containers = GameUI.CustomUIConfig().Containers;
var PlayerTables = GameUI.CustomUIConfig().PlayerTables;
var contID = -1;
var idString = "";
var subscription = -1;
var isShop = false;
var positionString = null;
var oldSkins = {};
function GetID()
{
return contID;
}
function GetIDString()
{
return idString;
}
function ContainerChange(tableName, changes, del)
{
var panel = $.GetContextPanel();
//$.Msg('ContainerChange -- ', tableName, ' -- ', changes, ' -- ', del);
if (!changes)
return;
if ("headerText" in del)
SetHeaderText("");
if ("buttons" in del)
SetButtons({});
if ("OnCloseClicked" in del)
$("#CloseButton").visible = true;
if ("position" in del)
positionString = null;
if ("skins" in changes)
SetSkins(changes["skins"]);
if ("headerText" in changes)
SetHeaderText(changes["headerText"]);
if ("layout" in changes)
SetLayout(changes["layout"]);
if ("buttons" in changes)
SetButtons(changes["buttons"]);
if ("draggable" in changes)
panel.SetDraggable(changes["draggable"] !== 0);
if ("position" in changes)
SetPosition(changes["position"]);
if ("shop" in changes)
isShop = changes["shop"] == 1;
if ("OnCloseClicked" in changes)
$("#CloseButton").visible = changes["OnCloseClicked"] !== 0;
}
function SetSkins(skins)
{
var panel = $.GetContextPanel();
for (var key in skins){
//$.Msg("skin: ", key);
panel.SetHasClass(key, true);
delete oldSkins[key];
}
for (var key in oldSkins){
//$.Msg("oldskin: ", key);
panel.SetHasClass(key, false);
}
oldSkins = skins;
}
function SetHeaderText(text)
{
var label = $("#HeaderLabel");
label.text = $.Localize(text);
}
function SetLayout(layout)
{
var inner = $("#Inner");
inner.RemoveAndDeleteChildren();
var slot = 1;
for (var key in layout){
var row = $.CreatePanel( "Panel", inner, "row" + key);
row.AddClass('ItemRow');
//var queryUnit = Players.GetLocalPlayerPortraitUnit();
//var item = Entities.GetItemInSlot( queryUnit, i );
for (var j=0; j<layout[key]; j++){
var child = $.CreatePanel( "Panel", row, "slot" + slot);
child.BLoadLayout("file://{resources}/layout/custom_game/containers/inventory_item.xml", false, false);
child.SetItem( -1, contID, slot, $.GetContextPanel() );
slot++;
}
}
}
function ButtonPress(number, name)
{
//$.Msg('ButtonPress', ' -- ', number);
var jsAction = PlayerTables.GetTableValue(idString, "OnButtonPressedJS");
var action = PlayerTables.GetTableValue(idString, "OnButtonPressed");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:contID, containerPanel:$.GetContextPanel(), buttonID:number, buttonName:name});
}catch(err){
$.Msg("[container.js] OnButtonPressed callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
if (action !== 0){
GameEvents.SendCustomGameEventToServer( "Containers_OnButtonPressed", {unit:unit, contID:contID, button:parseInt(number)} );
return;
}
}
function SetButtons(buttons)
{
var footer = $("#Footer");
footer.RemoveAndDeleteChildren();
for (var number in buttons){
var button = $.CreatePanel( "Button", footer, "Button" + number);
button.SetDraggable(true);
button.AddClass("ButtonBevel");
button.SetPanelEvent("onactivate", (function(num, buttonName){
return function(){ ButtonPress(num, buttonName); };
})(number, buttons[number]));
var label = $.CreatePanel( "Label", button, "");
label.text = $.Localize(buttons[number]);
$.RegisterEventHandler( 'DragStart', button, NullDragStart );
$.RegisterEventHandler( 'DragEnd', button, NullDragEnd );
}
}
function SetPosition(pos)
{
var panel = $.GetContextPanel();
var percMatch = /([^%]+)%\s+([^%]+)%/g.exec(pos);
if (pos == "mouse"){
positionString = "mouse";
var cursor = GameUI.GetCursorPosition();
//$.Msg(panel.contentwidth, " -- ", panel.contentheight);
//$.Msg(panel.actuallayoutwidth, " -- ", panel.actuallayoutheight);
//$.Msg(panel.desiredlayoutwidth, " -- ", panel.desiredlayoutheight);
var x = cursor[0] - panel.desiredlayoutwidth/2;
var y = cursor[1] - 25;
panel.style.position = x + "px " + y + "px 0px;";
}
else if (pos == "entity"){
positionString = "entity";
var ent = PlayerTables.GetTableValue(idString, "entity");
if (ent != undefined){
var origin = Entities.GetAbsOrigin(ent)
var wx = Game.WorldToScreenX(origin[0], origin[1], origin[2]);
var wy = Game.WorldToScreenY(origin[0], origin[1], origin[2]);
var sw = GameUI.CustomUIConfig().screenwidth;
var sh = GameUI.CustomUIConfig().screenheight
var scale = 1080 / sh;
var x = scale * Math.min(sw - panel.desiredlayoutwidth,Math.max(0, wx - panel.desiredlayoutwidth/2));
var y = scale * Math.min(sh - panel.desiredlayoutheight,Math.max(0, wy - panel.desiredlayoutheight - 50));
panel.style.position = x + "px " + y + "px 0px;";
}
else
{
panel.style.position = "0px 0px 0px;";
}
}
else if (percMatch){
var sw = GameUI.CustomUIConfig().screenwidth;
var sh = GameUI.CustomUIConfig().screenheight
var scale = 1080 / sh;
var x = Number(percMatch[1]);
var y = Number(percMatch[2]);;
if (isNaN(x) || isNaN(y)){
panel.style.position = "0px 0px 0px;";
}
else{
x = x*sw/100*scale
y = y*sh/100*scale
panel.style.position = x + "px " + y + "px 0px;";
}
}
else {
panel.style.position = pos;
positionString = null;
}
}
function NewContainer(id)
{
var panel = $.GetContextPanel();
contID = id;
idString = "cont_" + id;
subscription = PlayerTables.SubscribeNetTableListener(idString, ContainerChange);
var pt = PlayerTables.GetAllTableValues(idString);
//$.Msg(pt);
//$.Msg("container panel created ", panel.id);
SetSkins(pt.skins);
SetHeaderText(pt.headerText);
SetLayout(pt.layout);
SetButtons(pt.buttons);
panel.SetDraggable(pt.draggable !== 0);
isShop = pt.shop === 1;
if (pt.OnCloseClicked === 0 && $("#CloseButton"))
$("#CloseButton").visible = false;
var count = 0;
var f = null;
if (pt.position === "mouse" || pt.position === "entity"){
panel.style.position = "-1000px -1000px 0px;"
f = function(){
count++;
if (panel.desiredlayoutheight === 0){
$.Schedule(1/30, f);
return;
}
SetPosition(pt.position);
};
$.Schedule(1/30, f);
}
else{
SetPosition(pt.position);
}
}
function OpenContainer()
{
var panel = $.GetContextPanel();
if (!panel.visible && positionString){
SetPosition(positionString);
}
panel.visible = true;
}
function CloseContainer()
{
var panel = $.GetContextPanel();
panel.visible = false;
}
function DeleteContainer()
{
var panel = $.GetContextPanel();
PlayerTables.UnsubscribeNetTableListener(subscription);
if (panel){
panel.deleted = true;
CloseContainer();
}
}
function IsShop()
{
return isShop;
}
function CloseClicked()
{
//$.Msg("CloseClicked");
var jsAction = PlayerTables.GetTableValue(idString, "OnCloseClickedJS");
var action = PlayerTables.GetTableValue(idString, "OnCloseClicked");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:contID, containerPanel:$.GetContextPanel()});
}catch(err){
$.Msg("[container.js] OnButtonPressed callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
if (action !== 0){
GameEvents.SendCustomGameEventToServer( "Containers_OnCloseClicked", {unit:unit, contID:contID} );
return;
}
}
function OnDragStart( panelId, dragCallbacks )
{
//$.Msg('OnDragStart -- ', panelId)
var panel = $('#' + panelId);
dragCallbacks.displayPanel = panel;//panel;
var cursor = GameUI.GetCursorPosition();
dragCallbacks.offsetX = cursor[0] - panel.actualxoffset;//250;
dragCallbacks.offsetY = cursor[1] - panel.actualyoffset;//20;
dragCallbacks.removePositionBeforeDrop = false;
return false;
}
function OnDragEnd( panelId, draggedPanel )
{
//$.Msg('OnDragEnd -- ', panelId, ' -- ', draggedPanel);
draggedPanel.SetParent(draggedPanel.dragParent);
return false;
}
function NullDragStart( panelId, dragCallbacks)
{
return true;
}
function NullDragEnd( panelId, draggedPanel)
{
return true;
}
(function(){
//$.DispatchEvent("DOTAShowTitleTextTooltipStyled", $.GetContextPanel(), "Title asdf", "asdfasdf asdf asdf asdf asdf few fwef wef we", "StlyeClass")
//TestFunction();
//TestFunctionTwo();
var panel = $.GetContextPanel();
var inner = $("#Inner");
var close = $("#CloseButton");
panel.NewContainer = NewContainer;
panel.OpenContainer = OpenContainer;
panel.CloseContainer = CloseContainer;
panel.DeleteContainer = DeleteContainer;
panel.GetID = GetID;
panel.GetIDString = GetIDString;
panel.IsShop = IsShop;
if (panel.initialized){
//containers = panel.containers;
return;
}
panel.initialized = true;
panel.dragParent = panel.GetParent();
$.RegisterEventHandler( 'DragStart', panel, OnDragStart );
$.RegisterEventHandler( 'DragEnd', panel, OnDragEnd );
$.RegisterEventHandler( 'DragStart', inner, NullDragStart );
$.RegisterEventHandler( 'DragEnd', inner, NullDragEnd );
$.RegisterEventHandler( 'DragStart', close, NullDragStart );
$.RegisterEventHandler( 'DragEnd', close, NullDragEnd );
})()
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/container_base.js
================================================
"use strict";
var PlayerTables = GameUI.CustomUIConfig().PlayerTables;
var containers = {};
var eventHandlers = {};
var lastUnit = null;
/*var fun = function(tableName, changes, delete)
{
$.Msg("fun callback -- ", tableName, " -- " , changes);
};*/
$.Msg("[containers_base.js] Loaded");
function DisableFocus(panel)
{
panel.SetDisableFocusOnMouseDown(true);
//panel.SetAcceptsFocus(false);
for (var i=0; i<panel.GetChildCount(); i++){
DisableFocus(panel.GetChild(i));
}
}
function OpenContainer(msg)
{
//$.Msg("OpenContainer -- ", msg);
var panel = $.GetContextPanel();
var id = msg.id;
var containerPanel = containers[id];
if (!containerPanel){
var idString = "cont_" + id;
var layoutFile = PlayerTables.GetTableValue(idString, "layoutFile") || "file://{resources}/layout/custom_game/containers/container.xml";
containerPanel = $.CreatePanel( "Panel", panel, "" );
containerPanel.BLoadLayout(layoutFile, false, false);
containers[id] = containerPanel;
containerPanel.NewContainer(id);
DisableFocus(panel);
}
else{
containerPanel.OpenContainer();
}
}
function CloseContainer(msg)
{
//$.Msg("CloseContainer -- ", msg);
var id = msg.id;
var containerPanel = containers[id];
if (containerPanel){
containerPanel.CloseContainer();
}
else{
$.Msg("[container_base.js] Close container for id '" + id + "' unable to find existing container.");
}
}
function DeleteContainer(msg)
{
//$.Msg("DeleteContainer -- ", msg);
var id = msg.id;
var containerPanel = containers[id];
if (containerPanel){
containerPanel.DeleteContainer();
containerPanel.DeleteAsync(1);
delete containers[id];
}
else{
//$.Msg("[container_base.js] Delete container for id '" + id + "' unable to find existing container.")
}
}
function ExecuteProxy(msg)
{
//$.Msg("ExecuteProxy");
var localHeroIndex = Players.GetPlayerHeroEntityIndex( Players.GetLocalPlayer());
var abil = Entities.GetAbilityByName( localHeroIndex , "containers_lua_targeting" );
if (abil === -1)
abil = Entities.GetAbilityByName( localHeroIndex , "containers_lua_targeting_tree" );
if (abil !== -1){
Abilities.ExecuteAbility( abil, localHeroIndex, false );
var fun = function(){
var behaviors = GameUI.GetClickBehaviors();
if (behaviors != CLICK_BEHAVIORS.DOTA_CLICK_BEHAVIOR_CAST){
GameEvents.SendCustomGameEventToServer( "Containers_HideProxy", {abilID:abil} );
return;
}
$.Schedule(1/60, fun);
};
$.Schedule(1/60, fun);
}
else{
$.Msg("'containers_lua_targeting' ability not found.");
}
}
var EntityShops = {};
var lastSel = null;
function CheckShop()
{
var sel = Players.GetLocalPlayerPortraitUnit();
if (sel !== lastSel){
GameEvents.SendCustomGameEventToServer( "Containers_Select", {entity:sel} );
lastSel = sel;
//$.Msg("CheckShop ", sel, ' -- ', lastSel);
}
if (sel >= 1 && (Entities.IsCreepHero(sel) || Entities.IsRealHero(sel))) {
var shop = 0;
shop += Entities.IsInRangeOfShop( sel, 0, true) ? 1 : 0;
shop += Entities.IsInRangeOfShop( sel, 1, true) ? 2 : 0;
shop += Entities.IsInRangeOfShop( sel, 2, true) ? 4 : 0;
var oldShop = EntityShops[sel];
if (oldShop !== shop){
GameEvents.SendCustomGameEventToServer( "Containers_EntityShopRange", {unit:sel, shop:shop} );
}
EntityShops[sel] = shop;
}
}
function CheckShopSchedule()
{
CheckShop();
$.Schedule(1/10, CheckShopSchedule);
}
function CheckCouriers()
{
var cours = Entities.GetAllEntitiesByClassname("npc_dota_courier");
var info = Game.GetLocalPlayerInfo();
for (var i=0; i<cours.length; i++){
var cour = cours[i];
if (info.player_team_id == Entities.GetTeamNumber(cour)){
var shop = 0;
shop += Entities.IsInRangeOfShop( cour, 0, true) ? 1 : 0;
shop += Entities.IsInRangeOfShop( cour, 1, true) ? 2 : 0;
shop += Entities.IsInRangeOfShop( cour, 2, true) ? 4 : 0;
var oldShop = EntityShops[cour];
if (oldShop !== shop){
GameEvents.SendCustomGameEventToServer( "Containers_EntityShopRange", {unit:cour, shop:shop} );
}
EntityShops[cour] = shop;
}
}
$.Schedule(1/10, CheckCouriers);
}
function CreateErrorMessage(msg)
{
var reason = msg.reason || 80;
if (msg.message){
GameEvents.SendEventClientSide("dota_hud_error_message", {"splitscreenplayer":0,"reason":reason ,"message":msg.message} );
}
else{
GameEvents.SendEventClientSide("dota_hud_error_message", {"splitscreenplayer":0,"reason":reason} );
}
}
function EmitClientSound(msg)
{
if (msg.sound){
Game.EmitSound(msg.sound);
}
}
function UsePanoramaInventory(msg)
{
var use = msg.use;
var panInv = $("#PanoramaInventory");
if (use === 0){
panInv.visible = false;
GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_ITEMS, true );
}
else{
panInv.visible = true;
GameUI.SetDefaultUIEnabled( DotaDefaultUIElement_t.DOTA_DEFAULT_UI_INVENTORY_ITEMS, false );
}
}
function ScreenHeightWidth()
{
var panel = $.GetContextPanel();
GameUI.CustomUIConfig().screenwidth = panel.actuallayoutwidth;
GameUI.CustomUIConfig().screenheight = panel.actuallayoutheight;
$.Schedule(1/4, ScreenHeightWidth);
}
function RegisterEventHandler(name, func)
{
eventHandlers[name] = func;
}
(function(){
var panel = $.GetContextPanel();
ScreenHeightWidth();
//containerPanel = $.CreatePanel( "Panel", panel, "" );
//containerPanel.BLoadLayout("file://{resources}/layout/custom_game/containers/container.xml", false, false);
GameEvents.Subscribe( "cont_open_container", OpenContainer);
GameEvents.Subscribe( "cont_close_container", CloseContainer);
GameEvents.Subscribe( "cont_delete_container", DeleteContainer);
GameEvents.Subscribe( "cont_execute_proxy", ExecuteProxy);
GameEvents.Subscribe( "cont_create_error_message", CreateErrorMessage);
GameEvents.Subscribe( "cont_emit_client_sound", EmitClientSound);
GameEvents.Subscribe( "cont_use_panorama_inventory", UsePanoramaInventory);
GameEvents.Subscribe( "dota_player_update_selected_unit", CheckShop );
GameEvents.Subscribe( "dota_player_update_query_unit", CheckShop );
var use = CustomNetTables.GetTableValue( "containers_lua", "use_panorama_inventory" );
if (use)
UsePanoramaInventory({use:use.value});
else
UsePanoramaInventory({use:false});
CheckShopSchedule();
CheckCouriers();
//$.Msg("container_base: ", panel);
if (panel.initialized){
containers = panel.containers || {};
for (var key in containers){
containers[key].DeleteContainer();
//containers[keys[key]].DeleteAsync(1);
delete containers[key];
}
return;
}
GameUI.CustomUIConfig().Containers = {}
GameUI.CustomUIConfig().Containers.containers = containers;
GameUI.CustomUIConfig().Containers.eventHandlers = eventHandlers;
GameUI.CustomUIConfig().Containers.RegisterEventHandler = RegisterEventHandler;
panel.containers = containers;
panel.initialized = true;
})()
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/container_events.js
================================================
var Containers = GameUI.CustomUIConfig().Containers;
// Events can be registered in any javascript file you have through GameUI.CustomUIConfig().Containers
// Events should return true to allow for any additional built-in effects to occur
// This includes sending an event to the server and triggering server/lua actions
Containers.RegisterEventHandler("ExampleLeftClick", function(evt){
$.Msg("ExampleLeftClick CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel"]
return true;
});
Containers.RegisterEventHandler("ExampleRightClick", function(evt){
$.Msg("RIGHT CLICK CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel"]
return true;
});
Containers.RegisterEventHandler("ExampleDoubleClick", function(evt){
$.Msg("ExampleDoubleClick CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel","leftClick"]
return true;
});
Containers.RegisterEventHandler("ExampleMouseOver", function(evt){
$.Msg("ExampleMouseOver CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel"]
return false;
});
Containers.RegisterEventHandler("ExampleMouseOut", function(evt){
$.Msg("ExampleMouseOut CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel"]
return true;
});
Containers.RegisterEventHandler("ExampleCloseClicked", function(evt){
$.Msg("ExampleCloseClicked CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","containerPanel"]
return true;
});
Containers.RegisterEventHandler("ExampleButtonPressed", function(evt){
$.Msg("ExampleButtonPressed CALLBACK ACTION in JS");
$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","containerPanel","itemPanel","buttonID","buttonName"]
return true;
});
Containers.RegisterEventHandler("DefaultContextMenu", function(evt){
//$.Msg(Object.keys(evt)); //[ PanoramaScript ]: ["unit","containerID","itemID","slot","containerPanel","itemPanel"]
var m_Item = evt.itemID;
$.DispatchEvent( "DOTAHideAbilityTooltip", evt.itemPanel );
var bControllable = Entities.IsControllableByPlayer( evt.unit, Game.GetLocalPlayerID() );
var bSellable = Items.IsSellable( m_Item ) && Items.CanBeSoldByLocalPlayer( m_Item );
var bDisassemble = Items.IsDisassemblable( m_Item ) && bControllable;
var bAlertable = Items.IsAlertableItem( m_Item );
var bShowInShop = Items.IsPurchasable( m_Item );
if (!bSellable && !bDisassemble && !bShowInShop && !bAlertable && !bMoveToStash )
{
return true;
}
var contextMenu = $.CreatePanel( "ContextMenuScript", evt.itemPanel, "" );
contextMenu.AddClass( "ContextMenu_NoArrow" );
contextMenu.AddClass( "ContextMenu_NoBorder" );
contextMenu.GetContentsPanel().Item = m_Item;
contextMenu.GetContentsPanel().SetHasClass( "bSellable", bSellable );
contextMenu.GetContentsPanel().SetHasClass( "bDisassemble", bDisassemble );
contextMenu.GetContentsPanel().SetHasClass( "bShowInShop", bShowInShop );
contextMenu.GetContentsPanel().SetHasClass( "bAlertable", bAlertable );
contextMenu.GetContentsPanel().SetHasClass( "bMoveToStash", false ); // TODO
contextMenu.GetContentsPanel().BLoadLayout( "file://{resources}/layout/custom_game/containers/inventory_context_menu.xml", false, false );
return true;
});
Containers.RegisterEventHandler("SpecialContextMenu", function(evt){
$.DispatchEvent( "DOTAHideAbilityTooltip", evt.itemPanel );
var noMenu = ["item_blade_mail", "item_chainmail", "item_helm_of_iron_will", "item_veil_of_discord",
"item_boots", "item_phase_boots"]
var m_Item = evt.itemID;
var bControllable = Entities.IsControllableByPlayer( evt.unit, Game.GetLocalPlayerID() );
var bSellable = Items.IsSellable( m_Item ) && Items.CanBeSoldByLocalPlayer( m_Item );
var bDisassemble = Items.IsDisassemblable( m_Item ) && bControllable;
var bAlertable = Items.IsAlertableItem( m_Item );
var bShowInShop = Items.IsPurchasable( m_Item );
var name = Abilities.GetAbilityName(m_Item);
if (noMenu.indexOf(name) >= 0 || (!bSellable && !bDisassemble && !bShowInShop && !bAlertable && !bMoveToStash ))
{
return true;
}
var contextMenu = $.CreatePanel( "ContextMenuScript", evt.itemPanel, "" );
contextMenu.AddClass( "ContextMenu_NoArrow" );
contextMenu.AddClass( "ContextMenu_NoBorder" );
contextMenu.GetContentsPanel().Item = m_Item;
contextMenu.GetContentsPanel().Slot = evt.slot;
contextMenu.GetContentsPanel().Container = evt.containerID;
contextMenu.GetContentsPanel().SetHasClass( "bSellable", bSellable );
contextMenu.GetContentsPanel().SetHasClass( "bDisassemble", bDisassemble );
contextMenu.GetContentsPanel().SetHasClass( "bShowInShop", bShowInShop );
contextMenu.GetContentsPanel().SetHasClass( "bAlertable", bAlertable );
contextMenu.GetContentsPanel().SetHasClass( "bMoveToStash", false ); // TODO
contextMenu.GetContentsPanel().BLoadLayout( "file://{resources}/layout/custom_game/containers/inventory_context_menu.xml", false, false );
return true;
});
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory.js
================================================
"use strict";
var m_InventoryPanels = []
// Currently hardcoded: first 6 are inventory, next 6 are stash items
var DOTA_ITEM_STASH_MIN = 6;
var DOTA_ITEM_STASH_MAX = 12;
function SetPosition()
{
var panel = $.GetContextPanel()
var sw = panel.actuallayoutwidth;
var sh = panel.actuallayoutheight;
var flipped = Game.IsHUDFlipped();
var prop = flipped ? "margin-left" : "margin-right";
var stashPanel = $( "#stash_row" );
var invPanel = $( "#inventory_items" );
stashPanel.SetHasClass("Flipped", flipped);
invPanel.SetHasClass("Flipped", flipped);
/*if (flipped){
stashPanel.style.marginRight = "0px";
invPanel.style.marginRight = "0px";
}
else{
stashPanel.style.marginLef t = "0px";
invPanel.style.marginLeft = "0px";
}
invPanel[prop] = "235px";*/
$.Schedule(2, SetPosition);
}
function UpdateInventory()
{
var queryUnit = Players.GetLocalPlayerPortraitUnit();
for ( var i = 0; i < DOTA_ITEM_STASH_MAX; ++i )
{
var inventoryPanel = m_InventoryPanels[i]
var item = Entities.GetItemInSlot( queryUnit, i );
inventoryPanel.SetItem( queryUnit, item );
}
}
function CreateInventoryPanels()
{
var stashPanel = $( "#stash_row" );
var firstRowPanel = $( "#inventory_row_1" );
var secondRowPanel = $( "#inventory_row_2" );
if ( !stashPanel || !firstRowPanel || !secondRowPanel )
return;
stashPanel.RemoveAndDeleteChildren();
firstRowPanel.RemoveAndDeleteChildren();
secondRowPanel.RemoveAndDeleteChildren();
m_InventoryPanels = [];
for ( var i = 0; i < DOTA_ITEM_STASH_MAX; ++i )
{
var parentPanel = firstRowPanel;
if ( i >= DOTA_ITEM_STASH_MIN )
{
parentPanel = stashPanel;
}
else if ( i > 2 )
{
parentPanel = secondRowPanel;
}
var inventoryPanel = $.CreatePanel( "Panel", parentPanel, "" );
inventoryPanel.BLoadLayout( "file://{resources}/layout/custom_game/containers/dota_inventory_item.xml", false, false );
inventoryPanel.SetItemSlot( i );
m_InventoryPanels.push( inventoryPanel );
}
}
(function()
{
CreateInventoryPanels();
UpdateInventory();
SetPosition();
GameEvents.Subscribe( "dota_inventory_changed", UpdateInventory );
GameEvents.Subscribe( "dota_inventory_item_changed", UpdateInventory );
GameEvents.Subscribe( "m_event_dota_inventory_changed_query_unit", UpdateInventory );
GameEvents.Subscribe( "m_event_keybind_changed", UpdateInventory );
GameEvents.Subscribe( "dota_player_update_selected_unit", UpdateInventory );
GameEvents.Subscribe( "dota_player_update_query_unit", UpdateInventory );
})();
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_context_menu.js
================================================
"use strict";
function DismissMenu()
{
$.DispatchEvent( "DismissAllContextMenus" )
}
function OnSell()
{
Items.LocalPlayerSellItem( $.GetContextPanel().Item );
DismissMenu();
}
function OnDisassemble()
{
Items.LocalPlayerDisassembleItem( $.GetContextPanel().Item );
DismissMenu();
}
function OnShowInShop()
{
var itemName = Abilities.GetAbilityName( $.GetContextPanel().Item );
var itemClickedEvent = {
"link": ( "dota.item." + itemName ),
"shop": 0,
"recipe": 0
};
GameEvents.SendEventClientSide( "dota_link_clicked", itemClickedEvent );
DismissMenu();
}
function OnDropFromStash()
{
Items.LocalPlayerDropItemFromStash( $.GetContextPanel().Item );
DismissMenu();
}
function OnMoveToStash()
{
Items.LocalPlayerMoveItemToStash( $.GetContextPanel().Item );
DismissMenu();
}
function OnAlert()
{
Items.LocalPlayerItemAlertAllies( $.GetContextPanel().Item );
DismissMenu();
}
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_item.js
================================================
"use strict";
var m_Item = -1;
var m_ItemSlot = -1;
var m_QueryUnit = -1;
function UpdateItem()
{
var panel = $.GetContextPanel();
var itemName = Abilities.GetAbilityName( m_Item );
var hotkey = Abilities.GetKeybind( m_Item, m_QueryUnit );
var isPassive = Abilities.IsPassive( m_Item );
var chargeCount = 0;
var hasCharges = false;
var altChargeCount = 0;
var hasAltCharges = false;
if (IsInStash()){
panel = panel.GetParent();
}else{
panel = panel.GetParent().GetParent();
}
if (m_ItemSlot === 6 && panel.id === "stash_row"){
var show = false;
for (var i=6; i<12; i++){
if (Entities.GetItemInSlot( m_QueryUnit, i ) !== -1){
show = true;
break;
}
}
panel.visible = show;
}
if (!panel.visible){
$.Schedule( 0.1, UpdateItem );
return;
}
if ( Items.ShowSecondaryCharges( m_Item ) )
{
// Ward stacks display charges differently depending on their toggle state
hasCharges = true;
hasAltCharges = true;
if ( Abilities.GetToggleState( m_Item ) )
{
chargeCount = Items.GetCurrentCharges( m_Item );
altChargeCount = Items.GetSecondaryCharges( m_Item );
}
else
{
altChargeCount = Items.GetCurrentCharges( m_Item );
chargeCount = Items.GetSecondaryCharges( m_Item );
}
}
else if ( Items.ShouldDisplayCharges( m_Item ) )
{
hasCharges = true;
chargeCount = Items.GetCurrentCharges( m_Item );
}
$.GetContextPanel().SetHasClass( "no_item", (m_Item == -1) );
$.GetContextPanel().SetHasClass( "show_charges", hasCharges );
$.GetContextPanel().SetHasClass( "show_alt_charges", hasAltCharges );
$.GetContextPanel().SetHasClass( "is_passive", isPassive );
$.GetContextPanel().SetHasClass( "low_mana", ((m_QueryUnit !== -1) && Abilities.GetManaCost( m_Item ) > Entities.GetMana(m_QueryUnit)));
//$.GetContextPanel().SetHasClass( "is_active", (Abilities.GetLocalPlayerActiveAbility() == m_Item));
$( "#HotkeyText" ).text = hotkey;
$( "#ItemImage" ).itemname = itemName;
$( "#ItemImage" ).contextEntityIndex = m_Item;
$( "#ChargeCount" ).text = chargeCount;
$( "#AltChargeCount" ).text = altChargeCount;
if ( m_Item == -1 || Abilities.IsCooldownReady( m_Item ) )
{
$.GetContextPanel().SetHasClass( "cooldown_ready", true );
$.GetContextPanel().SetHasClass( "in_cooldown", false );
}
else
{
$.GetContextPanel().SetHasClass( "cooldown_ready", false );
$.GetContextPanel().SetHasClass( "in_cooldown", true );
var cooldownLength = Abilities.GetCooldownLength( m_Item );
var cooldownRemaining = Abilities.GetCooldownTimeRemaining( m_Item );
var cooldownPercent = Math.ceil( 100 * cooldownRemaining / cooldownLength );
$( "#CooldownTimer" ).text = Math.ceil( cooldownRemaining );
$( "#CooldownOverlay" ).style.width = cooldownPercent+"%";
}
$.Schedule( 0.1, UpdateItem );
}
function ItemShowTooltip()
{
if ( m_Item == -1 )
return;
var itemName = Abilities.GetAbilityName( m_Item );
$.DispatchEvent( "DOTAShowAbilityTooltipForEntityIndex", $.GetContextPanel(), itemName, m_QueryUnit );
}
function ItemHideTooltip()
{
$.DispatchEvent( "DOTAHideAbilityTooltip", $.GetContextPanel() );
}
var lastClick = 1; // 1 right, 0 left
function ActivateItem()
{
lastClick = 0;
if ( m_Item == -1 )
return;
// Items are abilities - just execute the ability
Abilities.ExecuteAbility( m_Item, m_QueryUnit, false );
}
function DoubleClickItem()
{
if (lastClick === 0)
ActivateItem();
}
var DOTA_ITEM_STASH_MIN = 6;
function IsInStash()
{
return ( m_ItemSlot >= DOTA_ITEM_STASH_MIN );
}
function RightClickItem()
{
lastClick = 1;
ItemHideTooltip();
var bSlotInStash = IsInStash();
var bControllable = Entities.IsControllableByPlayer( m_QueryUnit, Game.GetLocalPlayerID() );
var bSellable = Items.IsSellable( m_Item ) && Items.CanBeSoldByLocalPlayer( m_Item );
var bDisassemble = Items.IsDisassemblable( m_Item ) && bControllable && !bSlotInStash;
var bAlertable = Items.IsAlertableItem( m_Item );
var bShowInShop = Items.IsPurchasable( m_Item );
var bDropFromStash = bSlotInStash && bControllable;
var bMoveToStash = Entities.IsInRangeOfShop(m_QueryUnit, 0, true);
if ( !bSellable && !bDisassemble && !bShowInShop && !bDropFromStash && !bAlertable && !bMoveToStash )
{
// don't show a menu if there's nothing to do
return;
}
var contextMenu = $.CreatePanel( "ContextMenuScript", $.GetContextPanel(), "" );
contextMenu.AddClass( "ContextMenu_NoArrow" );
contextMenu.AddClass( "ContextMenu_NoBorder" );
contextMenu.GetContentsPanel().Item = m_Item;
contextMenu.GetContentsPanel().SetHasClass( "bSellable", bSellable );
contextMenu.GetContentsPanel().SetHasClass( "bDisassemble", bDisassemble );
contextMenu.GetContentsPanel().SetHasClass( "bShowInShop", bShowInShop );
contextMenu.GetContentsPanel().SetHasClass( "bDropFromStash", bDropFromStash );
contextMenu.GetContentsPanel().SetHasClass( "bAlertable", bAlertable );
contextMenu.GetContentsPanel().SetHasClass( "bMoveToStash", bMoveToStash ); // TODO
contextMenu.GetContentsPanel().BLoadLayout( "file://{resources}/layout/custom_game/containers/dota_inventory_context_menu.xml", false, false );
}
function OnDragEnter( a, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
// only care about dragged items other than us
if ( draggedItem === null || draggedItem == m_Item )
return true;
// highlight this panel as a drop target
$.GetContextPanel().AddClass( "potential_drop_target" );
return true;
}
function OnDragDrop( panelId, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
// only care about dragged items other than us
if ( draggedItem === null )
return true;
var dropTarget = $.GetContextPanel();
$.GetContextPanel().RemoveClass( "potential_drop_target" );
// executing a slot swap - don't drop on the world
draggedPanel.m_DragCompleted = true;
// item dropped on itself? don't acutally do the swap (but consider the drag completed)
if ( draggedItem == m_Item )
return true;
var fromCont = draggedPanel.m_contID;
if (fromCont == -1){
// create the order
var moveItemOrder =
{
OrderType: dotaunitorder_t.DOTA_UNIT_ORDER_MOVE_ITEM,
TargetIndex: m_ItemSlot,
AbilityIndex: draggedItem
};
Game.PrepareUnitOrders( moveItemOrder );
}
else{
GameEvents.SendCustomGameEventToServer( "Containers_OnDragFrom", {unit:Players.GetLocalPlayerPortraitUnit(), contID:fromCont, itemID:draggedItem,
fromSlot:draggedPanel.m_OriginalPanel.GetSlot(), toContID:-1, toSlot:m_ItemSlot} );
}
return true;
}
function OnDragLeave( panelId, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
if ( draggedItem === null || draggedItem == m_Item )
return false;
// un-highlight this panel
$.GetContextPanel().RemoveClass( "potential_drop_target" );
return true;
}
function OnDragStart( panelId, dragCallbacks )
{
if ( m_Item == -1 )
{
return true;
}
var itemName = Abilities.GetAbilityName( m_Item );
ItemHideTooltip(); // tooltip gets in the way
// create a temp panel that will be dragged around
var displayPanel = $.CreatePanel( "DOTAItemImage", $.GetContextPanel(), "dragImage" );
displayPanel.itemname = itemName;
displayPanel.contextEntityIndex = m_Item;
displayPanel.m_DragItem = m_Item;
displayPanel.m_contID = -1;
displayPanel.m_DragCompleted = false; // whether the drag was successful
displayPanel.m_OriginalPanel = $.GetContextPanel();
displayPanel.m_QueryUnit = m_QueryUnit;
// hook up the display panel, and specify the panel offset from the cursor
dragCallbacks.displayPanel = displayPanel;
dragCallbacks.offsetX = 0;
dragCallbacks.offsetY = 0;
// grey out the source panel while dragging
$.GetContextPanel().AddClass( "dragging_from" );
return true;
}
function OnDragEnd( panelId, draggedPanel )
{
if (!IsInStash() && !draggedPanel.m_DragCompleted){
var position = GameUI.GetScreenWorldPosition( GameUI.GetCursorPosition() );
var mouseEntities = GameUI.FindScreenEntities( GameUI.GetCursorPosition() );
var entity = null;
if (mouseEntities.length !== 0){
for ( var e of mouseEntities )
{
if ( e.accurateCollision ){
entity = e.entityIndex;
break;
}
}
}
GameEvents.SendCustomGameEventToServer( "Containers_OnDragWorld", {unit:Players.GetLocalPlayerPortraitUnit(), contID:-1, itemID:m_Item, slot:m_ItemSlot, position:position, entity:entity} );
}
// if the drag didn't already complete, then try dropping in the world
//Game.DropItemAtCursor( m_QueryUnit, m_Item );
// kill the display panel
draggedPanel.DeleteAsync( 0 );
// restore our look
$.GetContextPanel().RemoveClass( "dragging_from" );
return true;
}
function SetItemSlot( itemSlot )
{
m_ItemSlot = itemSlot;
}
function SetItem( queryUnit, iItem )
{
m_Item = iItem;
m_QueryUnit = queryUnit;
}
function GetSlot()
{
return m_ItemSlot;
}
(function()
{
$.GetContextPanel().SetItem = SetItem;
$.GetContextPanel().SetItemSlot = SetItemSlot;
$.GetContextPanel().GetSlot = GetSlot;
// Drag and drop handlers ( also requires 'draggable="true"' in your XML, or calling panel.SetDraggable(true) )
$.RegisterEventHandler( 'DragEnter', $.GetContextPanel(), OnDragEnter );
$.RegisterEventHandler( 'DragDrop', $.GetContextPanel(), OnDragDrop );
$.RegisterEventHandler( 'DragLeave', $.GetContextPanel(), OnDragLeave );
$.RegisterEventHandler( 'DragStart', $.GetContextPanel(), OnDragStart );
$.RegisterEventHandler( 'DragEnd', $.GetContextPanel(), OnDragEnd );
UpdateItem(); // initial update of dynamic state
})();
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/inventory_context_menu.js
================================================
"use strict";
function DismissMenu()
{
$.DispatchEvent( "DismissAllContextMenus" )
}
function OnSell()
{
Items.LocalPlayerSellItem( $.GetContextPanel().Item );
GameEvents.SendCustomGameEventToServer( "Containers_OnSell", {unit:Players.GetLocalPlayerPortraitUnit(),
contID:$.GetContextPanel().Container,
itemID:$.GetContextPanel().Item,
slot:$.GetContextPanel().Slot
});
DismissMenu();
}
function OnDisassemble()
{
Items.LocalPlayerDisassembleItem( $.GetContextPanel().Item );
DismissMenu();
}
function OnShowInShop()
{
var itemName = Abilities.GetAbilityName( $.GetContextPanel().Item );
var itemClickedEvent = {
"link": ( "dota.item." + itemName ),
"shop": 0,
"recipe": 0
};
GameEvents.SendEventClientSide( "dota_link_clicked", itemClickedEvent );
DismissMenu();
}
function OnDropFromStash()
{
Items.LocalPlayerDropItemFromStash( $.GetContextPanel().Item );
DismissMenu();
}
function OnMoveToStash()
{
Items.LocalPlayerMoveItemToStash( $.GetContextPanel().Item );
DismissMenu();
}
function OnAlert()
{
Items.LocalPlayerItemAlertAllies( $.GetContextPanel().Item );
DismissMenu();
}
================================================
FILE: content/dota_addons/barebones/panorama/scripts/containers/inventory_item.js
================================================
"use strict";
var Containers = GameUI.CustomUIConfig().Containers;
var PlayerTables = GameUI.CustomUIConfig().PlayerTables;
var m_Item = -1;
var m_ItemSlot = -1;
var m_contID = -1;
var m_contString = "";
var m_slot = -1;
var m_QueryUnit = -1;
var m_Container = null;
var started = false;
function UpdateItem()
{
m_Item = -1;
if (m_contString !== ""){
m_Item = PlayerTables.GetTableValue(m_contString, "slot" + m_slot) || -1;
m_QueryUnit = PlayerTables.GetTableValue(m_contString, "entity") || -1;
var sel = Players.GetPlayerHeroEntityIndex( Players.GetLocalPlayer() );
if (!Entities.IsInventoryEnabled(m_QueryUnit) || !Entities.IsControllableByAnyPlayer(m_QueryUnit) ||
(Entities.GetTeamNumber(m_QueryUnit) != Entities.GetTeamNumber(sel))){
m_QueryUnit = -1;
}
}
if (m_Container === null || m_Container.deleted){
return;
}
if (m_Container && !m_Container.visible){
$.Schedule( 0.1, UpdateItem );
return;
}
var itemName = Abilities.GetAbilityName( m_Item );
if (itemName == ""){
m_Item = -1;
}
var hotkey = Abilities.GetKeybind( m_Item, m_QueryUnit );
var isPassive = Abilities.IsPassive( m_Item );
var chargeCount = 0;
var hasCharges = false;
var altChargeCount = 0;
var hasAltCharges = false;
if ( Items.ShowSecondaryCharges( m_Item ) )
{
// Ward stacks display charges differently depending on their toggle state
hasCharges = true;
hasAltCharges = true;
if ( Abilities.GetToggleState( m_Item ) )
{
chargeCount = Items.GetCurrentCharges( m_Item );
altChargeCount = Items.GetSecondaryCharges( m_Item );
}
else
{
altChargeCount = Items.GetCurrentCharges( m_Item );
chargeCount = Items.GetSecondaryCharges( m_Item );
}
}
else if ( Items.ShouldDisplayCharges( m_Item ) )
{
hasCharges = true;
chargeCount = Items.GetCurrentCharges( m_Item );
}
var isShop = m_Container && m_Container.IsShop();
var stock = -1;
var price = -1;
if (isShop && m_Item !== -1){
stock = PlayerTables.GetTableValue(m_contString, "stock" + m_Item);
if (stock === null)
stock = -1;
price = PlayerTables.GetTableValue(m_contString, "price" + m_Item) || Items.GetCost(m_Item);
}
var gold = Players.GetGold(Players.GetLocalPlayer());
$.GetContextPanel().SetHasClass( "show_stock", stock >= 0 );
$.GetContextPanel().SetHasClass( "out_of_stock", stock === 0 );
$.GetContextPanel().SetHasClass( "show_price", price >= 0 );
$.GetContextPanel().SetHasClass( "high_price", gold < price );
$.GetContextPanel().SetHasClass( "no_item", (m_Item == -1) );
$.GetContextPanel().SetHasClass( "show_charges", hasCharges );
$.GetContextPanel().SetHasClass( "show_alt_charges", hasAltCharges );
$.GetContextPanel().SetHasClass( "is_passive", isPassive );
//$.GetContextPanel().SetHasClass( "no_mana_cost", (Abilities.GetManaCost( m_Item ) <= 0));
//$.Msg(m_QueryUnit, " -- ", m_Item, " -- ", Abilities.GetManaCost( m_Item ), " -- ", Entities.GetMana(m_QueryUnit));
$.GetContextPanel().SetHasClass( "low_mana", ((m_QueryUnit !== -1) && Abilities.GetManaCost( m_Item ) > Entities.GetMana(m_QueryUnit)));
if (m_Container)
$.GetContextPanel().SetHasClass( "is_active", (Abilities.GetLocalPlayerActiveAbility() == m_Item));
$( "#HotkeyText" ).text = hotkey;
$( "#ItemImage" ).itemname = itemName;
$( "#ItemImage" ).contextEntityIndex = m_Item;
$( "#ChargeCount" ).text = chargeCount;
$( "#AltChargeCount" ).text = altChargeCount;
$( "#Price" ).text = price;
$( "#Stock" ).text = "x" + stock;
var manaCost = Abilities.GetManaCost( m_Item );
if (m_Container)
$( "#ManaCost" ).text = Abilities.GetManaCost( m_Item );
if ( m_QueryUnit == -1 || m_Item == -1 || Items.GetPurchaser( m_Item ) == -1 || Abilities.IsCooldownReady( m_Item ) )
{
$.GetContextPanel().SetHasClass( "cooldown_ready", true );
$.GetContextPanel().SetHasClass( "in_cooldown", false );
}
else
{
$.GetContextPanel().SetHasClass( "cooldown_ready", false );
$.GetContextPanel().SetHasClass( "in_cooldown", true );
var cooldownLength = Abilities.GetCooldownLength( m_Item );
var cooldownRemaining = Abilities.GetCooldownTimeRemaining( m_Item );
var cooldownPercent = Math.ceil( 100 * cooldownRemaining / cooldownLength );
$( "#CooldownTimer" ).text = Math.ceil( cooldownRemaining );
$( "#CooldownOverlay" ).style.width = cooldownPercent+"%";
}
$.Schedule( 0.1, UpdateItem );
}
function ItemShowTooltip()
{
if ( m_Item == -1 )
return;
var itemName = Abilities.GetAbilityName( m_Item );
$.DispatchEvent( "DOTAShowAbilityTooltipForEntityIndex", $.GetContextPanel(), itemName, m_QueryUnit );
}
function ItemHideTooltip()
{
$.DispatchEvent( "DOTAHideAbilityTooltip", $.GetContextPanel() );
}
function OnMouseOut()
{
var jsAction = PlayerTables.GetTableValue(m_contString, "OnMouseOutJS");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:m_contID, itemID:m_Item, slot:m_slot, containerPanel:m_Container, itemPanel:$.GetContextPanel()});
}catch(err){
$.Msg("[inventory_item.js] OnMouseOut callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
ItemHideTooltip();
}
function OnMouseOver()
{
var jsAction = PlayerTables.GetTableValue(m_contString, "OnMouseOverJS");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:m_contID, itemID:m_Item, slot:m_slot, containerPanel:m_Container, itemPanel:$.GetContextPanel()});
}catch(err){
$.Msg("[inventory_item.js] OnMouseOver callback error for '", jsAction, ": ", err.stack);
}
if (!ret)
return;
}
ItemShowTooltip();
}
var lastClick = 1; // 1 right, 0 left
function ActivateItem(bypass)
{
lastClick = 0;
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
if (!bypass){
var jsAction = PlayerTables.GetTableValue(m_contString, "OnLeftClickJS");
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:m_contID, itemID:m_Item, slot:m_slot, containerPanel:m_Container, itemPanel:$.GetContextPanel()});
}catch(err){
$.Msg("[inventory_item.js] OnLeftClick callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
}
if ( m_Item == -1 )
return;
var action = PlayerTables.GetTableValue(m_contString, "OnLeftClick");
if (action !== 0){
GameEvents.SendCustomGameEventToServer( "Containers_OnLeftClick", {unit:unit, contID:m_contID, itemID:m_Item, slot:m_slot} );
return;
}
//Abilities.ExecuteAbility( m_Item, m_QueryUnit, false );
}
function DoubleClickItem()
{
var jsAction = PlayerTables.GetTableValue(m_contString, "OnDoubleClickJS");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:m_contID, itemID:m_Item, slot:m_slot, containerPanel:m_Container, itemPanel:$.GetContextPanel(), leftClick:lastClick === 0});
}catch(err){
$.Msg("[inventory_item.js] OnDoubleClick callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
if (lastClick === 0)
ActivateItem(true);
}
var DOTA_ITEM_STASH_MIN = 6;
function IsInStash()
{
return ( m_ItemSlot >= DOTA_ITEM_STASH_MIN );
}
function RightClickItem()
{
lastClick = 1;
var jsAction = PlayerTables.GetTableValue(m_contString, "OnRightClickJS");
var action = PlayerTables.GetTableValue(m_contString, "OnRightClick");
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var handler = Containers.eventHandlers[jsAction]
if (handler){
var ret = false;
try{
ret = handler({unit:unit, containerID:m_contID, itemID:m_Item, slot:m_slot, containerPanel:m_Container, itemPanel:$.GetContextPanel()});
}catch(err){
$.Msg("[inventory_item.js] RightClick callback error for '", jsAction, "': ", err.stack);
}
if (!ret)
return;
}
if (action === 1){
GameEvents.SendCustomGameEventToServer( "Containers_OnRightClick", {unit:unit, contID:m_contID, itemID:m_Item, slot:m_slot} );
return;
}
}
function OnDragEnter( a, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
// only care about dragged items other than us
if ( draggedItem === null || draggedItem == m_Item )
return true;
// highlight this panel as a drop target
$.GetContextPanel().AddClass( "potential_drop_target" );
return true;
}
function OnDragDrop( panelId, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
// only care about dragged items other than us
if ( draggedItem === null )
return true;
var dropTarget = $.GetContextPanel();
$.GetContextPanel().RemoveClass( "potential_drop_target" );
// executing a slot swap - don't drop on the world
draggedPanel.m_DragCompleted = true;
// item dropped on itself? don't acutally do the swap (but consider the drag completed)
if ( draggedItem == m_Item )
return true;
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
var action = PlayerTables.GetTableValue(m_contString, "OnDragTo");
if (action !== 0){
GameEvents.SendCustomGameEventToServer( "Containers_OnDragFrom", {unit:unit, contID:draggedPanel.m_contID, itemID:draggedItem,
fromSlot:draggedPanel.m_OriginalPanel.GetSlot(), toContID:m_contID, toSlot:m_slot} );
}
/*if (m_Container || container)
{
if (m_Container && container)
{
draggedPanel.m_OriginalPanel.SetItem(m_QueryUnit, m_Item, container);
SetItem(draggedPanel.m_QueryUnit, draggedItem, m_Container);
}
}
else
{
// create the order
var moveItemOrder =
{
OrderType: dotaunitorder_t.DOTA_UNIT_ORDER_MOVE_ITEM,
TargetIndex: m_ItemSlot,
AbilityIndex: draggedItem
};
Game.PrepareUnitOrders( moveItemOrder );
}*/
return true;
}
function OnDragLeave( panelId, draggedPanel )
{
var draggedItem = draggedPanel.m_DragItem;
if ( draggedItem === null || draggedItem == m_Item )
return false;
// un-highlight this panel
$.GetContextPanel().RemoveClass( "potential_drop_target" );
return true;
}
function OnDragStart( panelId, dragCallbacks )
{
if ( m_Item == -1 )
{
return true;
}
var action = PlayerTables.GetTableValue(m_contString, "OnDragDrop");
var action2 = PlayerTables.GetTableValue(m_contString, "OnDragWorld");
if (action === 0 && action2 === 0){
return true;
}
var itemName = Abilities.GetAbilityName( m_Item );
ItemHideTooltip(); // tooltip gets in the way
// create a temp panel that will be dragged around
var displayPanel = $.CreatePanel( "DOTAItemImage", $.GetContextPanel(), "dragImage" );
displayPanel.itemname = itemName;
displayPanel.contextEntityIndex = m_Item;
displayPanel.m_DragItem = m_Item;
displayPanel.m_contID = m_contID;
displayPanel.m_DragCompleted = false; // whether the drag was successful
displayPanel.m_OriginalPanel = $.GetContextPanel();
displayPanel.m_QueryUnit = m_QueryUnit;
// hook up the display panel, and specify the panel offset from the cursor
dragCallbacks.displayPanel = displayPanel;
dragCallbacks.offsetX = 0;
dragCallbacks.offsetY = 0;
// grey out the source panel while dragging
$.GetContextPanel().AddClass( "dragging_from" );
return true;
}
function OnDragEnd( panelId, draggedPanel )
{
var action = PlayerTables.GetTableValue(m_contString, "OnDragWorld");
if (!draggedPanel.m_DragCompleted && action === 1){
var position = GameUI.GetScreenWorldPosition( GameUI.GetCursorPosition() );
var mouseEntities = GameUI.FindScreenEntities( GameUI.GetCursorPosition() );
var entity = null;
var pid = Game.GetLocalPlayerID();
var unit = Players.GetLocalPlayerPortraitUnit()
unit = Entities.IsControllableByPlayer( unit, pid ) ? unit : Players.GetPlayerHeroEntityIndex(pid);
if (mouseEntities.length !== 0){
for ( var e of mouseEntities )
{
if ( e.accurateCollision ){
entity = e.entityIndex;
break;
}
}
}
GameEvents.SendCustomGameEventToServer( "Containers_OnDragWorld", {unit:unit, contID:m_contID, itemID:m_Item, slot:m_slot, position:position, entity:entity} );
}
// if the drag didn't already complete, then try dropping in the world
//Game.DropItemAtCursor( m_QueryUnit, m_Item );
// kill the display panel
draggedPanel.DeleteAsync( 0 );
// restore our look
$.GetConte
gitextract_xun1b86s/
├── .gitattributes
├── .gitignore
├── AnimationsChangeLog.md
├── AttachmentsChangeLog.md
├── ChangeLog.md
├── CollidersReadme.md
├── ContainersChangeLog.md
├── LICENSE
├── ModmakerChangeLog.md
├── NOTICE
├── NotificationsChangeLog.md
├── PathGraphChangeLog.md
├── PhysicsChangeLog.md
├── PhysicsReadme.md
├── PlayerTablesChangeLog.md
├── ProjectilesChangeLog.md
├── ProjectilesReadme.md
├── README.md
├── TimersChangeLog.md
├── WorldPanelsChangeLog.md
├── content/
│ └── dota_addons/
│ └── barebones/
│ ├── maps/
│ │ ├── playground.vmap
│ │ └── template_map.vmap
│ ├── materials/
│ │ ├── example/
│ │ │ ├── sand_path_example_color.tif
│ │ │ ├── sand_path_example_normal.tif
│ │ │ └── sand_path_example_refl.tif
│ │ ├── overviews/
│ │ │ ├── playground.tga
│ │ │ ├── playground.txt
│ │ │ ├── playground.vmat
│ │ │ ├── template_map.tga
│ │ │ ├── template_map.txt
│ │ │ └── template_map.vmat
│ │ └── particle/
│ │ ├── basic_glow.tga
│ │ ├── basic_glow.vtex
│ │ ├── basic_rope.psd
│ │ ├── basic_rope.vtex
│ │ ├── basic_rope_energy.tga
│ │ ├── basic_rope_energy.vtex
│ │ ├── basic_smoke.tga
│ │ ├── basic_smoke.vtex
│ │ ├── basic_trail.tga
│ │ └── basic_trail.vtex
│ ├── panorama/
│ │ ├── layout/
│ │ │ └── custom_game/
│ │ │ ├── barebones_attachments.xml
│ │ │ ├── barebones_notifications.xml
│ │ │ ├── barebones_worldpanels.xml
│ │ │ ├── containers/
│ │ │ │ ├── alt_container_example.xml
│ │ │ │ ├── container.xml
│ │ │ │ ├── container_base.xml
│ │ │ │ ├── dota_inventory.xml
│ │ │ │ ├── dota_inventory_context_menu.xml
│ │ │ │ ├── dota_inventory_item.xml
│ │ │ │ ├── inventory_context_menu.xml
│ │ │ │ └── inventory_item.xml
│ │ │ ├── custom_loading_screen.xml
│ │ │ ├── custom_ui_manifest.xml
│ │ │ ├── modmaker/
│ │ │ │ ├── modmaker.xml
│ │ │ │ ├── modmaker_api_category.xml
│ │ │ │ └── modmaker_api_property.xml
│ │ │ ├── selection.xml
│ │ │ └── worldpanels/
│ │ │ ├── arrow.xml
│ │ │ └── healthbar.xml
│ │ ├── scripts/
│ │ │ ├── barebones_attachments.js
│ │ │ ├── barebones_notifications.js
│ │ │ ├── barebones_worldpanels.js
│ │ │ ├── containers/
│ │ │ │ ├── container.js
│ │ │ │ ├── container_base.js
│ │ │ │ ├── container_events.js
│ │ │ │ ├── dota_inventory.js
│ │ │ │ ├── dota_inventory_context_menu.js
│ │ │ │ ├── dota_inventory_item.js
│ │ │ │ ├── inventory_context_menu.js
│ │ │ │ └── inventory_item.js
│ │ │ ├── modmaker/
│ │ │ │ ├── modmaker.js
│ │ │ │ ├── modmaker_api_category.js
│ │ │ │ └── modmaker_api_property.js
│ │ │ ├── playertables/
│ │ │ │ └── playertables_base.js
│ │ │ ├── selection/
│ │ │ │ ├── selection.js
│ │ │ │ └── selection_filter.js
│ │ │ └── worldpanels/
│ │ │ ├── arrow.js
│ │ │ └── healthbar.js
│ │ └── styles/
│ │ ├── barebones_attachments.css
│ │ ├── barebones_notifications.css
│ │ ├── containers/
│ │ │ ├── container.css
│ │ │ └── container_skins.css
│ │ ├── custom_loading_screen.css
│ │ ├── modmaker/
│ │ │ └── modmaker.css
│ │ └── worldpanels/
│ │ ├── arrow.css
│ │ └── healthbar.css
│ ├── particles/
│ │ ├── basic_ambient/
│ │ │ ├── basic_ambient.vpcf
│ │ │ └── basic_ambient_readme.txt
│ │ ├── basic_explosion/
│ │ │ ├── basic_explosion.vpcf
│ │ │ ├── basic_explosion_bits.vpcf
│ │ │ ├── basic_explosion_burst.vpcf
│ │ │ ├── basic_explosion_flash.vpcf
│ │ │ └── basic_explosion_readme.txt
│ │ ├── basic_projectile/
│ │ │ ├── basic_projectile.vpcf
│ │ │ ├── basic_projectile_explosion.vpcf
│ │ │ ├── basic_projectile_explosion_flash.vpcf
│ │ │ ├── basic_projectile_launch.vpcf
│ │ │ ├── basic_projectile_readme.txt
│ │ │ └── basic_projectile_trail.vpcf
│ │ ├── basic_rope/
│ │ │ ├── basic_rope.vpcf
│ │ │ └── basic_rope_readme.txt
│ │ ├── basic_trail/
│ │ │ └── basic_trail.vpcf
│ │ ├── frostivus_gameplay/
│ │ │ ├── damage_flash_b_frostivus.vpcf
│ │ │ ├── damage_flash_big_frostivus.vpcf
│ │ │ ├── damage_flash_c_frostivus.vpcf
│ │ │ ├── damage_flash_d_frostivus.vpcf
│ │ │ ├── drow_base_attack_explosion.vpcf
│ │ │ ├── drow_base_attack_explosion_flash.vpcf
│ │ │ ├── drow_base_attack_explosion_flash_b.vpcf
│ │ │ ├── drow_base_attack_launch.vpcf
│ │ │ ├── drow_base_attack_trail.vpcf
│ │ │ ├── drow_base_attack_trail_c.vpcf
│ │ │ ├── drow_frost_arrow_explosion.vpcf
│ │ │ ├── drow_frost_arrow_explosion_b.vpcf
│ │ │ ├── drow_frost_arrow_explosion_c.vpcf
│ │ │ ├── drow_frost_arrow_explosion_d.vpcf
│ │ │ ├── drow_frost_arrow_explosion_e.vpcf
│ │ │ ├── drow_frost_arrow_launch.vpcf
│ │ │ ├── drow_frost_arrow_launch_b.vpcf
│ │ │ ├── drow_frost_arrow_model.vpcf
│ │ │ ├── drow_ice_trail.vpcf
│ │ │ ├── drow_ice_trail_b.vpcf
│ │ │ ├── drow_ice_trail_c.vpcf
│ │ │ ├── drow_linear_arrow.vpcf
│ │ │ ├── drow_linear_frost_arrow.vpcf
│ │ │ ├── frostivus_death_creep.vpcf
│ │ │ ├── frostivus_hero_light.vpcf
│ │ │ ├── frostivus_hero_light_b.vpcf
│ │ │ ├── frostivus_last_hit_effect.vpcf
│ │ │ ├── frostivus_last_hit_effect_b.vpcf
│ │ │ ├── frostivus_leshrac_split_earth.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_b.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_c.vpcf
│ │ │ ├── frostivus_leshrac_split_earth_d.vpcf
│ │ │ ├── frostivus_leshrac_split_flash.vpcf
│ │ │ ├── frostivus_leshrac_split_projected.vpcf
│ │ │ ├── frostivus_leshrac_split_projected_scortch.vpcf
│ │ │ ├── frostivus_leshrac_split_pulse.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_groundflash_lines.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_lights.vpcf
│ │ │ ├── frostivus_leshrac_splitearth_sparkles.vpcf
│ │ │ ├── frostivus_lightbeam.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_ember.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_ember_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_c.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_d.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_e.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_f.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_explosion_light.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_launch_smoke.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_skull.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_sphere_glow.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_sphere_glow_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_d.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_detail.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_detail_b.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_e.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_f.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_g.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_h.vpcf
│ │ │ ├── frostivus_skeletonking_hellfireblast_trail_i.vpcf
│ │ │ ├── frostivus_spirit_trail.vpcf
│ │ │ ├── frostivus_spirit_trail_b.vpcf
│ │ │ ├── frostivus_spirit_trail_big.vpcf
│ │ │ ├── frostivus_spirit_trail_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_a.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_f.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_g.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_h.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_i.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_beams_j.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_c.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_c_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_d.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_e.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_endcap.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_f.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_g.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_h.vpcf
│ │ │ ├── frostivus_throne_wraith_king_ambient_i.vpcf
│ │ │ ├── frostivus_throne_wraith_king_explode.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirit_trail.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirit_trail_b.vpcf
│ │ │ ├── frostivus_throne_wraith_king_spirits.vpcf
│ │ │ ├── frostivus_wraithking_tombstone.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_ember.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_ember_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_c.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_d.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_e.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_f.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_explosion_light.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_launch_smoke.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_skull.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_sphere_glow.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_sphere_glow_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_d.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_detail.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_detail_b.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_e.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_f.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_g.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_h.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_trail_i.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_warmup.vpcf
│ │ │ ├── frostivus_wraithking_tombstone_warmup_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_explode_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_explode_c.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final_grid.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_final_grid_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_glow_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_ice.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_ice_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_initial_explode.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_main.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_glow_b.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_smoke.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_final_smoke_glow.vpcf
│ │ │ ├── holdout_ancient_apparition_ice_blast_sphere_halo.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_burst.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image_ember.vpcf
│ │ │ ├── holdout_juggernaut_omnislash_image_flash.vpcf
│ │ │ ├── holdout_omnislash_trail_glow.vpcf
│ │ │ ├── holdout_omnislash_trail_glow_b.vpcf
│ │ │ ├── legion_gladiators_rays.vpcf
│ │ │ ├── legion_gladiators_ring.vpcf
│ │ │ ├── legion_gladiators_ring_aura.vpcf
│ │ │ ├── legion_gladiators_ring_dust.vpcf
│ │ │ ├── legion_gladiators_ring_dust_detail.vpcf
│ │ │ ├── legion_gladiators_start_endcap.vpcf
│ │ │ ├── legion_gladiators_start_line.vpcf
│ │ │ ├── legion_gladiators_start_line_light.vpcf
│ │ │ ├── legion_gladiators_start_ring.vpcf
│ │ │ ├── legion_gladiators_start_ring_banner_light.vpcf
│ │ │ ├── legion_gladiators_start_ring_energy.vpcf
│ │ │ ├── legion_gladiators_start_ring_flags.vpcf
│ │ │ ├── legion_gladiators_start_ring_flash.vpcf
│ │ │ ├── legion_gladiators_start_ring_outer_rope.vpcf
│ │ │ ├── legion_gladiators_start_ring_rope.vpcf
│ │ │ ├── witch_buff.vpcf
│ │ │ ├── witch_buff_b.vpcf
│ │ │ ├── witch_buff_c.vpcf
│ │ │ ├── witch_buff_d.vpcf
│ │ │ ├── wraith_king_heal.vpcf
│ │ │ ├── wraith_king_heal_flash_b.vpcf
│ │ │ ├── wraith_king_heal_flash_glow.vpcf
│ │ │ ├── wraith_king_heal_rings.vpcf
│ │ │ ├── wraith_king_heal_twinkle.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_e.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_ember.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_ember_b.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion_c.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_explosion_d.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_light.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_b.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_c.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_d.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_explode.vpcf
│ │ │ ├── wraith_king_hellfire_eruption_tell_explode_b.vpcf
│ │ │ ├── wraith_king_spirit_trail_c.vpcf
│ │ │ ├── wraith_king_spirits_2.vpcf
│ │ │ └── wraith_king_tombstone_tether.vpcf
│ │ ├── frostivus_herofx/
│ │ │ ├── drow_base_attack_explosion.vpcf
│ │ │ ├── drow_base_attack_explosion_flash.vpcf
│ │ │ ├── drow_base_attack_explosion_flash_b.vpcf
│ │ │ ├── drow_base_attack_launch.vpcf
│ │ │ ├── drow_base_attack_trail.vpcf
│ │ │ ├── drow_base_attack_trail_c.vpcf
│ │ │ ├── drow_linear_arrow.vpcf
│ │ │ ├── holdout_guardian_angel_wings.vpcf
│ │ │ ├── juggernaut_fs_bladeswipe_flash.vpcf
│ │ │ ├── juggernaut_fs_bladeswipe_rope.vpcf
│ │ │ ├── juggernaut_fs_omnislash_attack_blur_3.vpcf
│ │ │ ├── juggernaut_fs_omnislash_slashers.vpcf
│ │ │ ├── juggernaut_fs_omnislash_tgt.vpcf
│ │ │ ├── juggernaut_fsos_caster.vpcf
│ │ │ ├── juggernaut_fsos_caster_grndhit.vpcf
│ │ │ ├── juggernaut_fsos_caster_scortch.vpcf
│ │ │ ├── juggernaut_fsos_flash.vpcf
│ │ │ ├── juggernaut_fsos_flashbang.vpcf
│ │ │ ├── juggernaut_fsos_flashbang_glow2.vpcf
│ │ │ ├── juggernaut_fsos_flashbang_ray.vpcf
│ │ │ ├── juggernaut_omnislash_ascension.vpcf
│ │ │ ├── juggernaut_omnislash_ascension_sparkrays.vpcf
│ │ │ ├── juggernaut_omnislash_ascension_sparks.vpcf
│ │ │ ├── maiden_holdout_arcane_buff.vpcf
│ │ │ ├── maiden_holdout_arcane_buff_caster.vpcf
│ │ │ ├── maiden_holdout_arcane_buff_snow_c.vpcf
│ │ │ ├── queen_shadow_strike_core_linear.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_flare.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_glow.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_light.vpcf
│ │ │ ├── queen_shadow_strike_core_linear_ring.vpcf
│ │ │ ├── queen_shadow_strike_explosion_flash_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_points_b_linear.vpcf
│ │ │ ├── queen_shadow_strike_explosion_points_linear.vpcf
│ │ │ ├── queen_shadow_strike_glow_linear.vpcf
│ │ │ ├── queen_shadow_strike_linear.vpcf
│ │ │ ├── queen_shadow_strike_linear_glow_core.vpcf
│ │ │ ├── queen_shadow_strike_linear_parent.vpcf
│ │ │ ├── queen_shadow_strike_trail_c_linear.vpcf
│ │ │ └── queen_shadow_strike_trail_linear.vpcf
│ │ ├── material_change.vpcf
│ │ ├── test_particle/
│ │ │ ├── channel_field_1.vpcf
│ │ │ ├── channel_field_2.vpcf
│ │ │ ├── creature_spiked_carapace.vpcf
│ │ │ ├── creature_spiked_carapace_b.vpcf
│ │ │ ├── damage_immunity.vpcf
│ │ │ ├── damage_immunity_b.vpcf
│ │ │ ├── leshrac_splitearth_groundflash_lines.vpcf
│ │ │ ├── leshrac_splitearth_sparkles.vpcf
│ │ │ ├── ogre_melee_smash.vpcf
│ │ │ ├── ogre_melee_smash_c.vpcf
│ │ │ ├── ogre_melee_smash_flash.vpcf
│ │ │ ├── ogre_melee_smash_projected.vpcf
│ │ │ ├── ogre_melee_smash_pulse.vpcf
│ │ │ └── ogre_melee_smash_scorch.vpcf
│ │ └── test_shot.vpcf
│ └── soundevents/
│ └── game_sounds_custom.vsndevts
└── game/
└── dota_addons/
└── barebones/
├── addoninfo.txt
├── network_measurement.txt
├── panorama/
│ └── localization/
│ └── addon_english.txt
├── panorama_debugger.cfg
├── resource/
│ ├── addon_english.txt
│ ├── flash3/
│ │ └── custom_ui.txt
│ └── overviews/
│ ├── dota_pvp.txt
│ ├── playground.txt
│ └── template_map.txt
└── scripts/
├── addon_hud_textures.txt
├── attachments.txt
├── custom_net_tables.txt
├── npc/
│ ├── herolist.txt
│ ├── npc_abilities_custom.txt
│ ├── npc_abilities_override.txt
│ ├── npc_heroes_custom.txt
│ ├── npc_items_custom.txt
│ └── npc_units_custom.txt
├── shops.txt
└── vscripts/
├── addon_game_mode.lua
├── animation_example/
│ └── heroes/
│ ├── axe/
│ │ └── axe.lua
│ └── legion_commander/
│ └── legion_commander.lua
├── events.lua
├── examples/
│ ├── colliders.lua
│ ├── modifier_no_health.lua
│ ├── notificationsExample.lua
│ ├── playground.lua
│ ├── projectile.lua
│ └── worldpanelsExample.lua
├── gamemode.lua
├── internal/
│ ├── events.lua
│ ├── eventtest.lua
│ ├── gamemode.lua
│ └── util.lua
├── libraries/
│ ├── abilities/
│ │ ├── containers_lua_targeting.lua
│ │ ├── containers_lua_targeting_tree.lua
│ │ └── item_containers_lua_pack.lua
│ ├── animations.lua
│ ├── attachments.lua
│ ├── containers.lua
│ ├── modifiers/
│ │ ├── modifier_animation.lua
│ │ ├── modifier_animation_freeze.lua
│ │ ├── modifier_animation_translate.lua
│ │ ├── modifier_animation_translate_permanent.lua
│ │ └── modifier_shopkeeper.lua
│ ├── modmaker.lua
│ ├── notifications.lua
│ ├── pathgraph.lua
│ ├── physics.lua
│ ├── physics_old.lua
│ ├── playertables.lua
│ ├── projectiles.lua
│ ├── selection.lua
│ ├── timers.lua
│ └── worldpanels.lua
└── settings.lua
SYMBOL INDEX (170 symbols across 18 files)
FILE: content/dota_addons/barebones/panorama/scripts/barebones_attachments.js
function OnDragStart (line 6) | function OnDragStart( panelId, dragCallbacks )
function OnDragEnd (line 33) | function OnDragEnd( panelId, draggedPanel )
function ValueChange (line 40) | function ValueChange(panel, amount)
function GetAttachmentTable (line 71) | function GetAttachmentTable()
function UpdateAttachment (line 87) | function UpdateAttachment(a)
function Freeze (line 96) | function Freeze()
function Save (line 117) | function Save()
function Load (line 123) | function Load()
function Hide (line 129) | function Hide()
function AttachCheckbox (line 135) | function AttachCheckbox()
function SphereCheckbox (line 142) | function SphereCheckbox()
function HideCosmetics (line 149) | function HideCosmetics()
function CloseCosmetics (line 158) | function CloseCosmetics()
function TopCamera (line 164) | function TopCamera()
function SideXCamera (line 171) | function SideXCamera()
function SideYCamera (line 178) | function SideYCamera()
function NormalCamera (line 185) | function NormalCamera()
function SelectUnitUpdated (line 192) | function SelectUnitUpdated()
function PlusMinusScale (line 207) | function PlusMinusScale()
function CosmeticListUpdated (line 214) | function CosmeticListUpdated(msg)
function UpdateFields (line 248) | function UpdateFields(msg)
function ActivateAttachmentConfiguration (line 265) | function ActivateAttachmentConfiguration(msg)
function MouseControlAngles (line 298) | function MouseControlAngles()
function MouseControlOffsets (line 309) | function MouseControlOffsets()
function MouseControlAnglesLoop (line 320) | function MouseControlAnglesLoop()
function MouseCalc (line 344) | function MouseCalc(panel, dif, scale)
function MouseControlOffsetsLoop (line 356) | function MouseControlOffsetsLoop()
function MouseUpdateScale (line 387) | function MouseUpdateScale()
function ShowMouseHelpTooltip (line 393) | function ShowMouseHelpTooltip()
function HideMouseHelpTooltip (line 398) | function HideMouseHelpTooltip()
function HandleMouseEvent (line 405) | function HandleMouseEvent(eventName, arg)
FILE: content/dota_addons/barebones/panorama/scripts/barebones_notifications.js
function TopNotification (line 1) | function TopNotification( msg ) {
function BottomNotification (line 5) | function BottomNotification(msg) {
function TopRemoveNotification (line 9) | function TopRemoveNotification(msg){
function BottomRemoveNotification (line 13) | function BottomRemoveNotification(msg){
function RemoveNotification (line 18) | function RemoveNotification(msg, panel){
function AddNotification (line 34) | function AddNotification(msg, panel) {
FILE: content/dota_addons/barebones/panorama/scripts/barebones_worldpanels.js
constant HA_CENTER (line 4) | const HA_CENTER = 0;
constant HA_LEFT (line 5) | const HA_LEFT = 1;
constant HA_RIGHT (line 6) | const HA_RIGHT = 2;
constant VA_BOTTOM (line 7) | const VA_BOTTOM = 0;
constant VA_CENTER (line 8) | const VA_CENTER = 1;
constant VA_TOP (line 9) | const VA_TOP = 2;
function WorldPanelChange (line 20) | function WorldPanelChange(id, changes, dels)
function PositionPanels (line 79) | function PositionPanels()
function ScreenHeightWidth (line 226) | function ScreenHeightWidth()
function UpdateEntities (line 236) | function UpdateEntities()
FILE: content/dota_addons/barebones/panorama/scripts/containers/container.js
function GetID (line 14) | function GetID()
function GetIDString (line 19) | function GetIDString()
function ContainerChange (line 24) | function ContainerChange(tableName, changes, del)
function SetSkins (line 70) | function SetSkins(skins)
function SetHeaderText (line 88) | function SetHeaderText(text)
function SetLayout (line 94) | function SetLayout(layout)
function ButtonPress (line 118) | function ButtonPress(number, name)
function SetButtons (line 148) | function SetButtons(buttons)
function SetPosition (line 169) | function SetPosition(pos)
function NewContainer (line 229) | function NewContainer(id)
function OpenContainer (line 275) | function OpenContainer()
function CloseContainer (line 286) | function CloseContainer()
function DeleteContainer (line 292) | function DeleteContainer()
function IsShop (line 303) | function IsShop()
function CloseClicked (line 308) | function CloseClicked()
function OnDragStart (line 342) | function OnDragStart( panelId, dragCallbacks )
function OnDragEnd (line 357) | function OnDragEnd( panelId, draggedPanel )
function NullDragStart (line 364) | function NullDragStart( panelId, dragCallbacks)
function NullDragEnd (line 369) | function NullDragEnd( panelId, draggedPanel)
FILE: content/dota_addons/barebones/panorama/scripts/containers/container_base.js
function DisableFocus (line 15) | function DisableFocus(panel)
function OpenContainer (line 25) | function OpenContainer(msg)
function CloseContainer (line 52) | function CloseContainer(msg)
function DeleteContainer (line 66) | function DeleteContainer(msg)
function ExecuteProxy (line 82) | function ExecuteProxy(msg)
function CheckShop (line 112) | function CheckShop()
function CheckShopSchedule (line 136) | function CheckShopSchedule()
function CheckCouriers (line 142) | function CheckCouriers()
function CreateErrorMessage (line 168) | function CreateErrorMessage(msg)
function EmitClientSound (line 179) | function EmitClientSound(msg)
function UsePanoramaInventory (line 186) | function UsePanoramaInventory(msg)
function ScreenHeightWidth (line 200) | function ScreenHeightWidth()
function RegisterEventHandler (line 210) | function RegisterEventHandler(name, func)
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory.js
function SetPosition (line 11) | function SetPosition()
function UpdateInventory (line 38) | function UpdateInventory()
function CreateInventoryPanels (line 49) | function CreateInventoryPanels()
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_context_menu.js
function DismissMenu (line 3) | function DismissMenu()
function OnSell (line 8) | function OnSell()
function OnDisassemble (line 14) | function OnDisassemble()
function OnShowInShop (line 20) | function OnShowInShop()
function OnDropFromStash (line 33) | function OnDropFromStash()
function OnMoveToStash (line 39) | function OnMoveToStash()
function OnAlert (line 45) | function OnAlert()
FILE: content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_item.js
function UpdateItem (line 7) | function UpdateItem()
function ItemShowTooltip (line 96) | function ItemShowTooltip()
function ItemHideTooltip (line 105) | function ItemHideTooltip()
function ActivateItem (line 112) | function ActivateItem()
function DoubleClickItem (line 122) | function DoubleClickItem()
function IsInStash (line 130) | function IsInStash()
function RightClickItem (line 135) | function RightClickItem()
function OnDragEnter (line 168) | function OnDragEnter( a, draggedPanel )
function OnDragDrop (line 181) | function OnDragDrop( panelId, draggedPanel )
function OnDragLeave (line 219) | function OnDragLeave( panelId, draggedPanel )
function OnDragStart (line 230) | function OnDragStart( panelId, dragCallbacks )
function OnDragEnd (line 261) | function OnDragEnd( panelId, draggedPanel )
function SetItemSlot (line 292) | function SetItemSlot( itemSlot )
function SetItem (line 297) | function SetItem( queryUnit, iItem )
function GetSlot (line 303) | function GetSlot()
FILE: content/dota_addons/barebones/panorama/scripts/containers/inventory_context_menu.js
function DismissMenu (line 3) | function DismissMenu()
function OnSell (line 8) | function OnSell()
function OnDisassemble (line 21) | function OnDisassemble()
function OnShowInShop (line 27) | function OnShowInShop()
function OnDropFromStash (line 40) | function OnDropFromStash()
function OnMoveToStash (line 46) | function OnMoveToStash()
function OnAlert (line 52) | function OnAlert()
FILE: content/dota_addons/barebones/panorama/scripts/containers/inventory_item.js
function UpdateItem (line 15) | function UpdateItem()
function ItemShowTooltip (line 133) | function ItemShowTooltip()
function ItemHideTooltip (line 142) | function ItemHideTooltip()
function OnMouseOut (line 147) | function OnMouseOut()
function OnMouseOver (line 171) | function OnMouseOver()
function ActivateItem (line 197) | function ActivateItem(bypass)
function DoubleClickItem (line 237) | function DoubleClickItem()
function IsInStash (line 264) | function IsInStash()
function RightClickItem (line 269) | function RightClickItem()
function OnDragEnter (line 298) | function OnDragEnter( a, draggedPanel )
function OnDragDrop (line 311) | function OnDragDrop( panelId, draggedPanel )
function OnDragLeave (line 363) | function OnDragLeave( panelId, draggedPanel )
function OnDragStart (line 374) | function OnDragStart( panelId, dragCallbacks )
function OnDragEnd (line 411) | function OnDragEnd( panelId, draggedPanel )
function SetItemSlot (line 448) | function SetItemSlot( itemSlot )
function SetItem (line 453) | function SetItem( queryUnit, contID, slot, container )
function GetSlot (line 469) | function GetSlot()
FILE: content/dota_addons/barebones/panorama/scripts/modmaker/modmaker.js
function DumpObjectIndented (line 7) | function DumpObjectIndented(obj, indent)
function LuaAPI (line 44) | function LuaAPI(msg)
function SearchAPI (line 84) | function SearchAPI()
function SendFile (line 97) | function SendFile(msg)
function CloseClicked (line 181) | function CloseClicked()
FILE: content/dota_addons/barebones/panorama/scripts/modmaker/modmaker_api_category.js
function Show (line 10) | function Show()
function Hide (line 32) | function Hide()
function Clicked (line 39) | function Clicked()
function Filter (line 47) | function Filter(search, clear)
function New (line 89) | function New(n, t, p)
FILE: content/dota_addons/barebones/panorama/scripts/modmaker/modmaker_api_property.js
function Show (line 4) | function Show()
function Hide (line 9) | function Hide()
function OpenGitHub (line 14) | function OpenGitHub()
function FuncClicked (line 21) | function FuncClicked()
function New (line 45) | function New(n, p)
FILE: content/dota_addons/barebones/panorama/scripts/playertables/playertables_base.js
function isEquivalent (line 75) | function isEquivalent(a, b) {
function ProcessTable (line 94) | function ProcessTable(newTable, oldTable, changes, dels)
function SendPID (line 123) | function SendPID()
function TableFullUpdate (line 138) | function TableFullUpdate(msg)
function UpdateTable (line 172) | function UpdateTable(msg)
function DeleteTableKeys (line 204) | function DeleteTableKeys(msg)
FILE: content/dota_addons/barebones/panorama/scripts/selection/selection.js
function Selection_New (line 6) | function Selection_New(msg)
function Selection_Add (line 20) | function Selection_Add(msg)
function Selection_Remove (line 31) | function Selection_Remove(msg)
function Selection_Reset (line 58) | function Selection_Reset(msg)
function OnUpdateSelectedUnit (line 67) | function OnUpdateSelectedUnit()
function SendSelectedEntities (line 82) | function SendSelectedEntities() {
function GetSelectedEntities (line 87) | function GetSelectedEntities() {
function GetSelectionOverride (line 92) | function GetSelectionOverride(entityIndex) {
function OnUpdateQueryUnit (line 97) | function OnUpdateQueryUnit()
FILE: content/dota_addons/barebones/panorama/scripts/selection/selection_filter.js
function SelectionFilter (line 8) | function SelectionFilter( entityList ) {
function DeselectBuildings (line 49) | function DeselectBuildings() {
function FirstNonBuildingEntityFromSelection (line 65) | function FirstNonBuildingEntityFromSelection( entityList ){
function GetFirstUnitFromSelectionSkipUnit (line 74) | function GetFirstUnitFromSelectionSkipUnit ( entityList, entIndex ) {
function IsMixedBuildingSelectionGroup (line 84) | function IsMixedBuildingSelectionGroup ( entityList ) {
function SelectOnlyBuildings (line 98) | function SelectOnlyBuildings() {
function FirstBuildingEntityFromSelection (line 114) | function FirstBuildingEntityFromSelection( entityList ){
function IsCustomBuilding (line 123) | function IsCustomBuilding( entityIndex ){
function IsMechanical (line 129) | function IsMechanical( entityIndex ) {
function IsCityCenter (line 134) | function IsCityCenter( entityIndex ){
FILE: content/dota_addons/barebones/panorama/scripts/worldpanels/arrow.js
function ArrowCheck (line 3) | function ArrowCheck()
FILE: content/dota_addons/barebones/panorama/scripts/worldpanels/healthbar.js
function HealthCheck (line 24) | function HealthCheck()
Condensed preview — 400 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,110K chars).
[
{
"path": ".gitattributes",
"chars": 483,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs diff=csharp\n*.sln"
},
{
"path": ".gitignore",
"chars": 2769,
"preview": "#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nloc"
},
{
"path": "AnimationsChangeLog.md",
"chars": 627,
"preview": "# animations.lua ChangeLog\n\n### Version 1.00\n- Updated version number to reflect Barebones 1.0 release\n\n### Version 0.84"
},
{
"path": "AttachmentsChangeLog.md",
"chars": 2219,
"preview": "# attachments.lua ChangeLog\n\n### Version 1.00\n- Ensured that created attachment props have unique entity names.\n- Fixed "
},
{
"path": "ChangeLog.md",
"chars": 10199,
"preview": "# Barebones ChangeLog\n\n### Version 1.01c\n- Added example \"REMOVE\" lines to npc_abilities_override.txt for the new 6.87 i"
},
{
"path": "CollidersReadme.md",
"chars": 17266,
"preview": "# **BMD's Lua Unit Colliders Library**\n--------------------------------\nSee [PhysicsReadme.md](https://github.com/bmddot"
},
{
"path": "ContainersChangeLog.md",
"chars": 75,
"preview": "# containers.lua ChangeLog\n\n### Version 0.80\n- Added containers.lua library"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "ModmakerChangeLog.md",
"chars": 71,
"preview": "# modmaker.lua ChangeLog\n\n### Version 0.80\n- Added modmaker.lua library"
},
{
"path": "NOTICE",
"chars": 543,
"preview": "Copyright 2014 BMD\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in "
},
{
"path": "NotificationsChangeLog.md",
"chars": 941,
"preview": "# notifications.lua ChangeLog\n\n### Version 1.00\n- Updated version to reflect the Barebones 1.0 release\n\n### Version 0.89"
},
{
"path": "PathGraphChangeLog.md",
"chars": 73,
"preview": "# pathgraph.lua ChangeLog\n\n### Version 0.80\n- Added pathgraph.lua library"
},
{
"path": "PhysicsChangeLog.md",
"chars": 1167,
"preview": "# physics.lua ChangeLog\n\n### Version 1.01\n- Fixed visual issue in physics.lua box drawing + CreateBox bug\n\n### Version 1"
},
{
"path": "PhysicsReadme.md",
"chars": 15594,
"preview": "# **BMD's Lua Unit Physics Library**\n--------------------------------\nSee [CollidersReadme.md](https://github.com/bmddot"
},
{
"path": "PlayerTablesChangeLog.md",
"chars": 79,
"preview": "# playertables.lua ChangeLog\n\n### Version 0.90\n- Added playertables.lua library"
},
{
"path": "ProjectilesChangeLog.md",
"chars": 1206,
"preview": "# projectiles.lua ChangeLog\n\n### Version 1.00\n- Added a bDestroyImmediate property to the projectile definition which de"
},
{
"path": "ProjectilesReadme.md",
"chars": 11202,
"preview": "# **BMD's Lua Advanced Projectiles Library**\n--------------------------------\n\n#### **How to install:**\n- Drop projectil"
},
{
"path": "README.md",
"chars": 8119,
"preview": "# Barebones Starter Mod Kit\n\n### Version 1.01c\n### [Change Log](https://github.com/bmddota/barebones/blob/source2/Change"
},
{
"path": "TimersChangeLog.md",
"chars": 923,
"preview": "# timers.lua ChangeLog\n\n### Version 1.05\n- Added a shorthand for Timers:CreateTimer(...) as Timers(...)\n- Timers now con"
},
{
"path": "WorldPanelsChangeLog.md",
"chars": 396,
"preview": "# worldpanels.lua ChangeLog\n\n### Version 0.81\n- Added \"data\" object which can be added in the world panel configuration "
},
{
"path": "content/dota_addons/barebones/materials/overviews/playground.txt",
"chars": 75,
"preview": "\"settings\"\n{\n\t\"clampu\" \"1\"\n\t\"clampv\" \"1\"\n\t\"nocompress\" \"1\"\n\t\"nomip\" \"1\"\n\n}\n"
},
{
"path": "content/dota_addons/barebones/materials/overviews/playground.vmat",
"chars": 126,
"preview": "\"Layer0\"\n{\n\t\"Shader\"\t\"ui.vfx\"\n\t\"F_STENCIL_MASKING\"\t\"1\"\n\t\"F_TRANSLUCENT\"\t\"0\"\n\t\"Texture\"\t\"materials/overviews/playground.t"
},
{
"path": "content/dota_addons/barebones/materials/overviews/template_map.txt",
"chars": 75,
"preview": "\"settings\"\n{\n\t\"clampu\" \"1\"\n\t\"clampv\" \"1\"\n\t\"nocompress\" \"1\"\n\t\"nomip\" \"1\"\n\n}\n"
},
{
"path": "content/dota_addons/barebones/materials/overviews/template_map.vmat",
"chars": 128,
"preview": "\"Layer0\"\n{\n\t\"Shader\"\t\"ui.vfx\"\n\t\"F_STENCIL_MASKING\"\t\"1\"\n\t\"F_TRANSLUCENT\"\t\"0\"\n\t\"Texture\"\t\"materials/overviews/template_map"
},
{
"path": "content/dota_addons/barebones/materials/particle/basic_glow.vtex",
"chars": 778,
"preview": "<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->\n\"CDmeVtex\"\n{\n\t\"m_inputTextureArray\" \"element_array\" \n\t[\n\t\t\"CDmeIn"
},
{
"path": "content/dota_addons/barebones/materials/particle/basic_rope.vtex",
"chars": 778,
"preview": "<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->\n\"CDmeVtex\"\n{\n\t\"m_inputTextureArray\" \"element_array\" \n\t[\n\t\t\"CDmeIn"
},
{
"path": "content/dota_addons/barebones/materials/particle/basic_rope_energy.vtex",
"chars": 785,
"preview": "<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->\n\"CDmeVtex\"\n{\n\t\"m_inputTextureArray\" \"element_array\" \n\t[\n\t\t\"CDmeIn"
},
{
"path": "content/dota_addons/barebones/materials/particle/basic_smoke.vtex",
"chars": 779,
"preview": "<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->\n\"CDmeVtex\"\n{\n\t\"m_inputTextureArray\" \"element_array\" \n\t[\n\t\t\"CDmeIn"
},
{
"path": "content/dota_addons/barebones/materials/particle/basic_trail.vtex",
"chars": 779,
"preview": "<!-- dmx encoding keyvalues2_noids 1 format vtex 1 -->\n\"CDmeVtex\"\n{\n\t\"m_inputTextureArray\" \"element_array\" \n\t[\n\t\t\"CDmeIn"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/barebones_attachments.xml",
"chars": 10458,
"preview": "<root> \n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"s2r://panorama/styles"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/barebones_notifications.xml",
"chars": 631,
"preview": "<root> \n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/st"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/barebones_worldpanels.xml",
"chars": 286,
"preview": "<root> \n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n </styles>\n <scripts>\n <include sr"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/alt_container_example.xml",
"chars": 1274,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/container.xml",
"chars": 709,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/container_base.xml",
"chars": 899,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory.xml",
"chars": 491,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory_context_menu.xml",
"chars": 1112,
"preview": "<root>\n\t<styles>\n\t\t<include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n\t\t<include src=\"file://{resources}/styles/c"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/dota_inventory_item.xml",
"chars": 1295,
"preview": "<root>\n\t<styles>\n\t\t<include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n\t\t<include src=\"file://{resources}/styles/c"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/inventory_context_menu.xml",
"chars": 1107,
"preview": "<root>\n\t<styles>\n\t\t<include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n\t\t<include src=\"file://{resources}/styles/c"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/containers/inventory_item.xml",
"chars": 1235,
"preview": "<root>\n\t<styles>\n\t\t<include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n\t\t<include src=\"file://{resources}/styles/c"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/custom_loading_screen.xml",
"chars": 418,
"preview": "<root> \n <styles>\n <include src=\"file://{resources}/styles/custom_loading_screen.css\" />\n </styles>\n <Panel class="
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/custom_ui_manifest.xml",
"chars": 5408,
"preview": "<root> \n <scripts>\n <include src=\"file://{resources}/scripts/playertables/playertables_base.js\" />\n </scripts>\n <s"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker.xml",
"chars": 920,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker_api_category.xml",
"chars": 621,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/modmaker/modmaker_api_property.xml",
"chars": 677,
"preview": "<root>\n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/sty"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/selection.xml",
"chars": 223,
"preview": "<root> \n <scripts>\n <include src=\"file://{resources}/scripts/selection/selection.js\" />\n <include src=\""
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/worldpanels/arrow.xml",
"chars": 395,
"preview": "<root> \n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/st"
},
{
"path": "content/dota_addons/barebones/panorama/layout/custom_game/worldpanels/healthbar.xml",
"chars": 705,
"preview": "<root> \n <styles>\n <include src=\"s2r://panorama/styles/dotastyles.vcss_c\" />\n <include src=\"file://{resources}/st"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/barebones_attachments.js",
"chars": 11987,
"preview": "var lastUnit = null;\nvar activated = false;\nvar showing = false;\nvar pmscale = 1;\n\nfunction OnDragStart( panelId, dragCa"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/barebones_notifications.js",
"chars": 3338,
"preview": "function TopNotification( msg ) {\n AddNotification(msg, $('#TopNotifications'));\n}\n\nfunction BottomNotification(msg) {\n"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/barebones_worldpanels.js",
"chars": 6494,
"preview": "var PlayerTables = GameUI.CustomUIConfig().PlayerTables;\nvar subscription = null; \n\nconst HA_CENTER = 0;\nconst HA_LEFT "
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/container.js",
"chars": 10032,
"preview": "\"use strict\";\n\nvar Containers = GameUI.CustomUIConfig().Containers;\nvar PlayerTables = GameUI.CustomUIConfig().PlayerTab"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/container_base.js",
"chars": 7076,
"preview": "\"use strict\";\n\nvar PlayerTables = GameUI.CustomUIConfig().PlayerTables;\nvar containers = {};\nvar eventHandlers = {};\nvar"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/container_events.js",
"chars": 5617,
"preview": "var Containers = GameUI.CustomUIConfig().Containers;\n\n// Events can be registered in any javascript file you have throug"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/dota_inventory.js",
"chars": 2601,
"preview": "\"use strict\";\n\nvar m_InventoryPanels = []\n\n// Currently hardcoded: first 6 are inventory, next 6 are stash items\nvar DOT"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_context_menu.js",
"chars": 903,
"preview": "\"use strict\";\n\nfunction DismissMenu()\n{\n\t$.DispatchEvent( \"DismissAllContextMenus\" )\n}\n\nfunction OnSell()\n{\n\tItems.Local"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/dota_inventory_item.js",
"chars": 9454,
"preview": "\"use strict\";\n\nvar m_Item = -1;\nvar m_ItemSlot = -1;\nvar m_QueryUnit = -1;\n\nfunction UpdateItem()\n{\n\tvar panel = $.GetCo"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/inventory_context_menu.js",
"chars": 1126,
"preview": "\"use strict\";\n\nfunction DismissMenu()\n{\n\t$.DispatchEvent( \"DismissAllContextMenus\" )\n}\n\nfunction OnSell()\n{\n\tItems.Local"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/containers/inventory_item.js",
"chars": 14248,
"preview": "\"use strict\";\n\nvar Containers = GameUI.CustomUIConfig().Containers;\nvar PlayerTables = GameUI.CustomUIConfig().PlayerTab"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/modmaker/modmaker.js",
"chars": 4997,
"preview": "var files = {}\nvar lua = null;\nvar luaCategories = null;\nvar properties = {}\nvar categoryPanels = {}\n\nfunction DumpObjec"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/modmaker/modmaker_api_category.js",
"chars": 1963,
"preview": "var loaded = false;\nvar name = null;\nvar cat = null;\nvar properties = null;\n\nvar propertyPanels = {}\n\nvar showing = fals"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/modmaker/modmaker_api_property.js",
"chars": 1438,
"preview": "var name = null;\nvar prop = null;\n\nfunction Show()\n{\n $.GetContextPanel().visible = true;\n}\n\nfunction Hide()\n{\n $.GetC"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/playertables/playertables_base.js",
"chars": 4930,
"preview": "var reload = true;\n\nvar count = 0;\nvar PT = {\n listeners: {},\n tableListeners: {},\n nextListener: 0,\n tables: {},\n "
},
{
"path": "content/dota_addons/barebones/panorama/scripts/selection/selection.js",
"chars": 3209,
"preview": "\"use strict\";\n\nvar skip = false\n\n// Recieves a list of entities to replace the current selection\nfunction Selection_New("
},
{
"path": "content/dota_addons/barebones/panorama/scripts/selection/selection_filter.js",
"chars": 4557,
"preview": "// Defines scripts to set selection redirects\n\nvar DESELECT_BUILDINGS = false; // Get only the units when units&building"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/worldpanels/arrow.js",
"chars": 716,
"preview": "$.Msg(\"arrow\");\n\nfunction ArrowCheck()\n{\n var wp = $.GetContextPanel().WorldPanel\n var onEdge = $.GetContextPanel().On"
},
{
"path": "content/dota_addons/barebones/panorama/scripts/worldpanels/healthbar.js",
"chars": 2377,
"preview": "$.Msg(\"healthbar\");\n\nvar teamColors = GameUI.CustomUIConfig().team_colors;\n\nif (!teamColors) {\n GameUI.CustomUIConfig()"
},
{
"path": "content/dota_addons/barebones/panorama/styles/barebones_attachments.css",
"chars": 3194,
"preview": ".ButtonRow\n{\n flow-children:right;\n align:center bottom;\n margin-top:10px;\n}\n\n.LineEntry\n{\n align:center center;\n v"
},
{
"path": "content/dota_addons/barebones/panorama/styles/barebones_notifications.css",
"chars": 1310,
"preview": ".BarebonesBaseHud\n{\n width: 100%;\n height: 100%;\n}\n\n.BarebonesTopNotifications\n{\n width: 100%;\n height: 100%"
},
{
"path": "content/dota_addons/barebones/panorama/styles/containers/container.css",
"chars": 7341,
"preview": ".ContainersBase\n{\n width:100%;\n height:100%;\n}\n\n.Outer\n{\n flow-children: down;\n border: 1px solid #555555;\n backgro"
},
{
"path": "content/dota_addons/barebones/panorama/styles/containers/container_skins.css",
"chars": 1646,
"preview": ".Hourglass.Outer\n{\n background-color: #ADD8E622;\n}\n\n.Hourglass #Header\n{\n background-color: #55222288;\n}\n\n.Hourglass #"
},
{
"path": "content/dota_addons/barebones/panorama/styles/custom_loading_screen.css",
"chars": 1171,
"preview": "@define TotalLength: 40s;\n@define TimingFunc: linear;\n@define IterationCount: 1;\n@define AnimationDelay: 0s;\n\n.AddonLoad"
},
{
"path": "content/dota_addons/barebones/panorama/styles/modmaker/modmaker.css",
"chars": 3224,
"preview": ".ModmakerBase\n{\n width:100%;\n height:100%;\n}\n\n#APIWindow\n{\n align: center center;\n min-width:800px;\n min-height:800"
},
{
"path": "content/dota_addons/barebones/panorama/styles/worldpanels/arrow.css",
"chars": 428,
"preview": ".ArrowPanel\n{\n wash-color: gold;\n animation-name: oscillate;\n //animation-delay: 0s;\n animation-duration: 1s;\n anim"
},
{
"path": "content/dota_addons/barebones/panorama/styles/worldpanels/healthbar.css",
"chars": 429,
"preview": ".HealthBar\n{\n background-color: #000000;\n padding:2px;\n border-radius: 5px;\n flow-children:right;\n border: 1px soli"
},
{
"path": "content/dota_addons/barebones/particles/basic_ambient/basic_ambient.vpcf",
"chars": 20160,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_ambient/basic_ambient_readme.txt",
"chars": 945,
"preview": "basic_ambient is a barebones starting point for effects that emit continuously over time and never stop playing on their"
},
{
"path": "content/dota_addons/barebones/particles/basic_explosion/basic_explosion.vpcf",
"chars": 3058,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_explosion/basic_explosion_bits.vpcf",
"chars": 14158,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_explosion/basic_explosion_burst.vpcf",
"chars": 18344,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_explosion/basic_explosion_flash.vpcf",
"chars": 12665,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_explosion/basic_explosion_readme.txt",
"chars": 1333,
"preview": "basic_explosion should serve as a good starting point for effects that emit instantaneously and disappear after a short "
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile.vpcf",
"chars": 10294,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile_explosion.vpcf",
"chars": 14621,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile_explosion_flash.vpcf",
"chars": 13518,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile_launch.vpcf",
"chars": 16562,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile_readme.txt",
"chars": 2849,
"preview": "This basic_projectile effect is a good starting point for any custom effects that are treated as \"projectiles\" in the en"
},
{
"path": "content/dota_addons/barebones/particles/basic_projectile/basic_projectile_trail.vpcf",
"chars": 17370,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_rope/basic_rope.vpcf",
"chars": 12806,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/basic_rope/basic_rope_readme.txt",
"chars": 1966,
"preview": "basic_rope demonstrates a single non-decaying static rope effect whose texture scrolls rapidly to suggest turbulent ener"
},
{
"path": "content/dota_addons/barebones/particles/basic_trail/basic_trail.vpcf",
"chars": 13166,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/damage_flash_b_frostivus.vpcf",
"chars": 2423,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/damage_flash_big_frostivus.vpcf",
"chars": 4350,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/damage_flash_c_frostivus.vpcf",
"chars": 2844,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/damage_flash_d_frostivus.vpcf",
"chars": 2431,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_explosion.vpcf",
"chars": 2832,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_explosion_flash.vpcf",
"chars": 2587,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_explosion_flash_b.vpcf",
"chars": 2319,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_launch.vpcf",
"chars": 2697,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_trail.vpcf",
"chars": 3125,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_base_attack_trail_c.vpcf",
"chars": 4027,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_explosion.vpcf",
"chars": 3253,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_explosion_b.vpcf",
"chars": 3283,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_explosion_c.vpcf",
"chars": 3829,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_explosion_d.vpcf",
"chars": 4254,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_explosion_e.vpcf",
"chars": 4358,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_launch.vpcf",
"chars": 3876,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_launch_b.vpcf",
"chars": 3091,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_frost_arrow_model.vpcf",
"chars": 2636,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_ice_trail.vpcf",
"chars": 3963,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_ice_trail_b.vpcf",
"chars": 3022,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_ice_trail_c.vpcf",
"chars": 3474,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_linear_arrow.vpcf",
"chars": 3510,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/drow_linear_frost_arrow.vpcf",
"chars": 3743,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_death_creep.vpcf",
"chars": 3380,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_hero_light.vpcf",
"chars": 2595,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_hero_light_b.vpcf",
"chars": 2457,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_last_hit_effect.vpcf",
"chars": 3614,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_last_hit_effect_b.vpcf",
"chars": 3449,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_earth.vpcf",
"chars": 3037,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_earth_b.vpcf",
"chars": 2930,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_earth_c.vpcf",
"chars": 3950,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_earth_d.vpcf",
"chars": 5873,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_flash.vpcf",
"chars": 4039,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_projected.vpcf",
"chars": 4010,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_projected_scortch.vpcf",
"chars": 3727,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_split_pulse.vpcf",
"chars": 4131,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_splitearth_groundflash_lines.vpcf",
"chars": 3965,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_splitearth_lights.vpcf",
"chars": 2330,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_leshrac_splitearth_sparkles.vpcf",
"chars": 3369,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_lightbeam.vpcf",
"chars": 3397,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast.vpcf",
"chars": 18982,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_ember.vpcf",
"chars": 3987,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_ember_b.vpcf",
"chars": 3670,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion.vpcf",
"chars": 3679,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_b.vpcf",
"chars": 2859,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_c.vpcf",
"chars": 2427,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_d.vpcf",
"chars": 2972,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_e.vpcf",
"chars": 2510,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_f.vpcf",
"chars": 3066,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_explosion_light.vpcf",
"chars": 2496,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_launch.vpcf",
"chars": 3305,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_launch_b.vpcf",
"chars": 2397,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_launch_smoke.vpcf",
"chars": 4223,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_skull.vpcf",
"chars": 2572,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_sphere_glow.vpcf",
"chars": 2489,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_sphere_glow_b.vpcf",
"chars": 2335,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_b.vpcf",
"chars": 4756,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_d.vpcf",
"chars": 2722,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_detail.vpcf",
"chars": 4585,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_detail_b.vpcf",
"chars": 4605,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_e.vpcf",
"chars": 2969,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_f.vpcf",
"chars": 4499,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_g.vpcf",
"chars": 4360,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_h.vpcf",
"chars": 3623,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_skeletonking_hellfireblast_trail_i.vpcf",
"chars": 3381,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_spirit_trail.vpcf",
"chars": 4741,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_spirit_trail_b.vpcf",
"chars": 3786,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_spirit_trail_big.vpcf",
"chars": 4833,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_spirit_trail_c.vpcf",
"chars": 3128,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient.vpcf",
"chars": 8397,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_b.vpcf",
"chars": 4967,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_a.vpcf",
"chars": 3211,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_b.vpcf",
"chars": 3535,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_c.vpcf",
"chars": 3254,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_f.vpcf",
"chars": 3628,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_g.vpcf",
"chars": 3626,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_h.vpcf",
"chars": 3246,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_i.vpcf",
"chars": 2447,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_beams_j.vpcf",
"chars": 2130,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_c.vpcf",
"chars": 4178,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_c_b.vpcf",
"chars": 3993,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_d.vpcf",
"chars": 4020,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_e.vpcf",
"chars": 3889,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_endcap.vpcf",
"chars": 3419,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_f.vpcf",
"chars": 3190,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_g.vpcf",
"chars": 3715,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_h.vpcf",
"chars": 3263,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_ambient_i.vpcf",
"chars": 3473,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_explode.vpcf",
"chars": 765,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_spirit_trail.vpcf",
"chars": 2792,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_spirit_trail_b.vpcf",
"chars": 2297,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_throne_wraith_king_spirits.vpcf",
"chars": 9166,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone.vpcf",
"chars": 4792,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_ember.vpcf",
"chars": 3987,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_ember_b.vpcf",
"chars": 3670,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion.vpcf",
"chars": 3631,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_b.vpcf",
"chars": 2859,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_c.vpcf",
"chars": 2427,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_d.vpcf",
"chars": 2972,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_e.vpcf",
"chars": 2510,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_f.vpcf",
"chars": 3066,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_explosion_light.vpcf",
"chars": 2496,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_launch.vpcf",
"chars": 3293,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_launch_b.vpcf",
"chars": 2397,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_launch_smoke.vpcf",
"chars": 4223,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_skull.vpcf",
"chars": 2572,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_sphere_glow.vpcf",
"chars": 2489,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_sphere_glow_b.vpcf",
"chars": 2335,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
},
{
"path": "content/dota_addons/barebones/particles/frostivus_gameplay/frostivus_wraithking_tombstone_trail_b.vpcf",
"chars": 4795,
"preview": "<!-- schema text {7e125a45-3d83-4043-b292-9e24f8ef27b4} generic {198980d8-3a93-4919-b4c6-dd1fb07a3a4b} -->\nCParticleSyst"
}
]
// ... and 200 more files (download for full content)
About this extraction
This page contains the full source code of the bmddota/barebones GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 400 files (1.8 MB), approximately 621.7k tokens, and a symbol index with 170 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.