diff --git a/addons/sourcemod/configs/store/items.txt b/addons/sourcemod/configs/store/items.txt new file mode 100644 index 0000000..56b7d41 --- /dev/null +++ b/addons/sourcemod/configs/store/items.txt @@ -0,0 +1,6122 @@ +"Store" +{ + + "Pets" + { + "Chicken" + { + "model" "models/chicken/chicken.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Chicken Zombie" + { + "model" "models/chicken/chicken_zombie.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Crow" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "crow_running" + "price" "100" + "type" "pet" + } + + "Crow Flying" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "crow_flying" + "price" "100" + "type" "pet" + } + + "Pigeon" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "pigeon_running" + "price" "100" + "type" "pet" + } + + "Pigeon Flying" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "pigeon_flying" + "price" "100" + "type" "pet" + } + + "Seagull" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "seagull_running" + "price" "100" + "type" "pet" + } + + "Seagull Flying" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly" + "run" "Fly" + "unique_id" "seagull_flying" + "price" "100" + "type" "pet" + } + } + + + "Tracers" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "tracer" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "tracer" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "tracer" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "tracer" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "tracer" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "tracer" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "tracer" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "tracer" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "tracer" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "tracer" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "tracer" + } + } + + "Laser Sight" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "lasersight" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "lasersight" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "lasersight" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "lasersight" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "lasersight" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "lasersight" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "lasersight" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "lasersight" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "lasersight" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "lasersight" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "lasersight" + } + } + + "Accessories" + { + "Hats" + { + "Spartan Helmet" + { + "model" "models/spartahelm/spartahelm.mdl" + "position" "0.0 -2.2 -68.4" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Ironman" + { + "model" "models/fo3_ironman_mask.mdl" + "position" "1.0 -4.6 -2.0" + "angles" "0.0 -90.0 -20.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "V Mask" + { + "model" "models/v/mask.mdl" + "position" "0.0 -5.2 -65.2" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Pika Hat" + { + "model" "models/pikahat/pikahat.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Mudkip Hat" + { + "model" "models/mudhatk/mudhatk.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Super Saiyan" + { + "model" "models/anime_patron/animepatr.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Sentry" + { + "model" "models/sentry_hat/sentryha.mdl" + "position" "0.0 -1.7 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Pedo Bear" + { + "model" "models/pedobear/pedobearf.mdl" + "position" "0.0 -1.7 -70.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Antlers" + { + "model" "models/sam/antlers.mdl" + "position" "0.0 0.0 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Car Tire" + { + "model" "models/props_vehicles/tire001c_car.mdl" + "position" "0.0 -10.0 0.0" + "angles" "90.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "position" "0.0 0.0 5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Traffic Cone" + { + "model" "models/props_junk/trafficcone001a.mdl" + "position" "0.0 -1.0 20.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Metal Bucket" + { + "model" "models/props_junk/metalbucket01a.mdl" + "position" "0.0 0.0 -8.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Terracotta" + { + "model" "models/props_junk/terracotta01.mdl" + "position" "0.0 3.0 -10.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Baseball Cap" + { + "model" "models/props/cs_office/snowman_hat.mdl" + "position" "0.0 0.0 7.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Coffee Mug" + { + "model" "models/props/cs_office/coffee_mug.mdl" + "position" "0.0 0.0 9.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "I <3 Turtles" + { + "model" "models/props/de_tides/vending_hat.mdl" + "position" "1.8 0.0 4.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Astronaut helmet" + { + "model" "models/astronauthelmet/astronauthelmet.mdl" + "position" "0.0 0.0 -5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Viking helmet" + { + "model" "models/vikinghelmet/vikinghelmet.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Fedora" + { + "model" "models/gmod_tower/fedorahat.mdl" + "position" "0.0 -1.5 8.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "KFC Bucket" + { + "model" "models/gmod_tower/kfcbucket.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Cake Hat" + { + "model" "models/cakehat/cakehat.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Santa Hat" + { + "model" "models/santahat/santahat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Dunce Hat" + { + "model" "models/duncehat/duncehat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Sombrero" + { + "model" "models/gmod_tower/sombrero.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Cat Ears" + { + "model" "models/gmod_tower/catears.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Afro" + { + "model" "models/gmod_tower/afro.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Andross Mask" + { + "model" "models/gmod_tower/androssmask.mdl" + "position" "0.0 2.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Drink Cap" + { + "model" "models/gmod_tower/drinkcap.mdl" + "position" "0.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Headcrab Hat" + { + "model" "models/gmod_tower/headcrabhat.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Majorasmask" + { + "model" "models/gmod_tower/majorasmask.mdl" + "position" "0.0 0.5 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Toromask" + { + "model" "models/gmod_tower/toromask.mdl" + "position" "0.0 -1.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Top Hat" + { + "model" "models/gmod_tower/tophat.mdl" + "position" "0.0 -1.7 4.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Witch Hat" + { + "model" "models/gmod_tower/witchhat.mdl" + "position" "0.0 0.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Toeto Hat" + { + "model" "models/gmod_tower/toetohat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Party Hat" + { + "model" "models/gmod_tower/partyhat.mdl" + "position" "1.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Seuss Hat" + { + "model" "models/gmod_tower/seusshat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Link Hat" + { + "model" "models/gmod_tower/linkhat.mdl" + "position" "0.0 -5.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + + "Midna Hat" + { + "model" "models/gmod_tower/midnahat.mdl" + "position" "0.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "0" + } + } + + "Masks" + { + "Porcelain Doll" + { + "model" "models/player/holiday/facemasks/porcelain_doll.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Zombie Fortune" + { + "model" "models/player/holiday/facemasks/facemask_zombie_fortune_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Wolf" + { + "model" "models/player/holiday/facemasks/facemask_wolf.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Tiki" + { + "model" "models/player/holiday/facemasks/facemask_tiki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Spy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_spy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Soldier" + { + "model" "models/player/holiday/facemasks/facemask_tf2_soldier_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sniper" + { + "model" "models/player/holiday/facemasks/facemask_tf2_sniper_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Scout" + { + "model" "models/player/holiday/facemasks/facemask_tf2_scout_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pyro" + { + "model" "models/player/holiday/facemasks/facemask_tf2_pyro_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Medic" + { + "model" "models/player/holiday/facemasks/facemask_tf2_medic_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Heavy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_heavy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Engineer" + { + "model" "models/player/holiday/facemasks/facemask_tf2_engi_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Demoman" + { + "model" "models/player/holiday/facemasks/facemask_tf2_demo_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull" + { + "model" "models/player/holiday/facemasks/facemask_skull.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_skull_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep" + { + "model" "models/player/holiday/facemasks/facemask_sheep_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Bloody)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_bloody.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Samurai" + { + "model" "models/player/holiday/facemasks/facemask_samurai.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pumpkin" + { + "model" "models/player/holiday/facemasks/facemask_pumpkin.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Porcelain Doll Kabuki" + { + "model" "models/player/holiday/facemasks/facemask_porcelain_doll_kabuki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Hoxton" + { + "model" "models/player/holiday/facemasks/facemask_hoxton.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Devil" + { + "model" "models/player/holiday/facemasks/facemask_devil_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Dallas" + { + "model" "models/player/holiday/facemasks/facemask_dallas.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chicken" + { + "model" "models/player/holiday/facemasks/facemask_chicken.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chains" + { + "model" "models/player/holiday/facemasks/facemask_chains.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Boar" + { + "model" "models/player/holiday/facemasks/facemask_boar.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Anaglyph" + { + "model" "models/player/holiday/facemasks/facemask_anaglyph.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Evil Clown" + { + "model" "models/player/holiday/facemasks/evil_clown.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + } + + "Glasses" + { + "3D Glasses" + { + "model" "models/gmod_tower/3dglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "1" + } + + "Aviators" + { + "model" "models/gmod_tower/aviators.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "1" + } + + "Star Glasses" + { + "model" "models/gmod_tower/starglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "1" + } + + "Kliener Glasses" + { + "model" "models/gmod_tower/klienerglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "slot" "1" + } + } + } + + "Player Skins" + { + "Terrorists" + { + "Duke Nukem" + { + "model" "models/player/kuristaja/duke4eva/duke/duke.mdl" + "team" "2" + "price" "120" + "type" "playerskin" + } + } + + "Counter-Terrorists" + { + "Nick" + { + "model" "models/player/techknow/nick/nick.mdl" + "team" "3" + "price" "120" + "type" "playerskin" + } + } + } + + "Trails" + { + "8Bit Mushroom" + { + "material" "materials/sprites/store/trails/8bitmushroom.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "8Bit Pow" + { + "material" "materials/sprites/store/trails/8bitpow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce" + { + "material" "materials/sprites/store/trails/airforce.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce 2" + { + "material" "materials/sprites/store/trails/airforce2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Apple" + { + "material" "materials/sprites/store/trails/apple.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrow Rainbow" + { + "material" "materials/sprites/store/trails/arrowrainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrows" + { + "material" "materials/sprites/store/trails/arrows.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Assasin" + { + "material" "materials/sprites/store/trails/assasin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome" + { + "material" "materials/sprites/store/trails/awesome.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Sad" + { + "material" "materials/sprites/store/trails/awesome_sad.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Face" + { + "material" "materials/sprites/store/trails/awesomeface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Babyand" + { + "material" "materials/sprites/store/trails/babyand.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Banknote" + { + "material" "materials/sprites/store/trails/banknote.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Barcalona" + { + "material" "materials/sprites/store/trails/barcalona.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Batman" + { + "material" "materials/sprites/store/trails/batman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Battlefield" + { + "material" "materials/sprites/store/trails/battlefield.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Beer Mug" + { + "material" "materials/sprites/store/trails/beermug.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Biohazard" + { + "material" "materials/sprites/store/trails/biohazard.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blade" + { + "material" "materials/sprites/store/trails/blade.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blue Lightning" + { + "material" "materials/sprites/store/trails/bluelightning.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "BMW Logo" + { + "material" "materials/sprites/store/trails/bmwlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bom Bomb" + { + "material" "materials/sprites/store/trails/bombomb.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Boo" + { + "material" "materials/sprites/store/trails/boo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullet Bill" + { + "material" "materials/sprites/store/trails/bulletbill.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullets" + { + "material" "materials/sprites/store/trails/bullets.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Canada Flag" + { + "material" "materials/sprites/store/trails/canadaflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Candies" + { + "material" "materials/sprites/store/trails/candies.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ccole" + { + "material" "materials/sprites/store/trails/ccole.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cereal-guy" + { + "material" "materials/sprites/store/trails/cereal-guy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Challenge" + { + "material" "materials/sprites/store/trails/challenge.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Chopped Pyro" + { + "material" "materials/sprites/store/trails/chopped_pyro.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Chris Light" + { + "material" "materials/sprites/store/trails/chrislight.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Christ Lights" + { + "material" "materials/sprites/store/trails/christlights.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Coca-Cola" + { + "material" "materials/sprites/store/trails/cocacola.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Coca-Cola 2" + { + "material" "materials/sprites/store/trails/cocacola2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Color Bolt" + { + "material" "materials/sprites/store/trails/colorbolt.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cookies" + { + "material" "materials/sprites/store/trails/cookies.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cracked Beam" + { + "material" "materials/sprites/store/trails/crackedbeam.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Creed" + { + "material" "materials/sprites/store/trails/creed.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Creeper" + { + "material" "materials/sprites/store/trails/creeper.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Crown" + { + "material" "materials/sprites/store/trails/crown.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Damnim Good" + { + "material" "materials/sprites/store/trails/damnimgood.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Danish Flag" + { + "material" "materials/sprites/store/trails/danishflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dark Knight" + { + "material" "materials/sprites/store/trails/darkknight.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5" + { + "material" "materials/sprites/store/trails/deadmau5.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 2" + { + "material" "materials/sprites/store/trails/deadmau52.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 3" + { + "material" "materials/sprites/store/trails/deadmau53.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 4" + { + "material" "materials/sprites/store/trails/deadmau54.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dead Pool" + { + "material" "materials/sprites/store/trails/deadpool.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dirt" + { + "material" "materials/sprites/store/trails/dirt.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Dragon" + { + "material" "materials/sprites/store/trails/disorderdragonv2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Logo" + { + "material" "materials/sprites/store/trails/disorderlogo2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Text" + { + "material" "materials/sprites/store/trails/disordertext10.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "DNA 2" + { + "material" "materials/sprites/store/trails/dna2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dollars" + { + "material" "materials/sprites/store/trails/dollars.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Donuts" + { + "material" "materials/sprites/store/trails/donuts.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Double Rainbow" + { + "material" "materials/sprites/store/trails/doublerainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dragon" + { + "material" "materials/sprites/store/trails/dragon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dragon Disorder" + { + "material" "materials/sprites/store/trails/dragondisorder.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "EA Fifa" + { + "material" "materials/sprites/store/trails/eafifa.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "EA Logo" + { + "material" "materials/sprites/store/trails/ealogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Earth" + { + "material" "materials/sprites/store/trails/earth.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Energy" + { + "material" "materials/sprites/store/trails/energy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Energyball" + { + "material" "materials/sprites/store/trails/energyball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Epicsax" + { + "material" "materials/sprites/store/trails/epicsax.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Facebook Icon" + { + "material" "materials/sprites/store/trails/facebookicon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fap Face" + { + "material" "materials/sprites/store/trails/fapface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Faxekondi" + { + "material" "materials/sprites/store/trails/faxekondi.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ferrari" + { + "material" "materials/sprites/store/trails/ferrari.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fire" + { + "material" "materials/sprites/store/trails/fire.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fire 2" + { + "material" "materials/sprites/store/trails/fire1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Firefox" + { + "material" "materials/sprites/store/trails/firefox.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fireman" + { + "material" "materials/sprites/store/trails/fireman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Footprint" + { + "material" "materials/sprites/store/trails/footprint.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Forever Alone" + { + "material" "materials/sprites/store/trails/foreveralone.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuu 1" + { + "material" "materials/sprites/store/trails/fuu1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuu 2" + { + "material" "materials/sprites/store/trails/fuu2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuck Yeah" + { + "material" "materials/sprites/store/trails/fyeah.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "German Flag" + { + "material" "materials/sprites/store/trails/germanflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Google Chrome" + { + "material" "materials/sprites/store/trails/googlechrome.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Goomba" + { + "material" "materials/sprites/store/trails/goomba.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Grenade" + { + "material" "materials/sprites/store/trails/grenade.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Gummybears" + { + "material" "materials/sprites/store/trails/gummybears.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Gusta" + { + "material" "materials/sprites/store/trails/gusta.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Half-Life" + { + "material" "materials/sprites/store/trails/halflife.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Handgun" + { + "material" "materials/sprites/store/trails/handgun.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Headshot" + { + "material" "materials/sprites/store/trails/headshot.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Heart" + { + "material" "materials/sprites/store/trails/heart.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hello Kitty" + { + "material" "materials/sprites/store/trails/hellokitty.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hex" + { + "material" "materials/sprites/store/trails/hex.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hypnotic" + { + "material" "materials/sprites/store/trails/hypnotic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hypnotoad" + { + "material" "materials/sprites/store/trails/hypnotoad.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ice" + { + "material" "materials/sprites/store/trails/ice.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ice 2" + { + "material" "materials/sprites/store/trails/ice1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Icloud" + { + "material" "materials/sprites/store/trails/icloud.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Invisible Bike" + { + "material" "materials/sprites/store/trails/invisible_bike.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Jackass" + { + "material" "materials/sprites/store/trails/jackass.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Jester" + { + "material" "materials/sprites/store/trails/jester.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kaleido Scope" + { + "material" "materials/sprites/store/trails/kaleidoscope.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kingdom Hearts" + { + "material" "materials/sprites/store/trails/kingdomhearts.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kirby" + { + "material" "materials/sprites/store/trails/kirby.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Latvia" + { + "material" "materials/sprites/store/trails/latvia.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves" + { + "material" "materials/sprites/store/trails/leaves.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 2" + { + "material" "materials/sprites/store/trails/leaves1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 3" + { + "material" "materials/sprites/store/trails/leaves2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 4" + { + "material" "materials/sprites/store/trails/leaves21.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightning 2" + { + "material" "materials/sprites/store/trails/lightning2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightning 3" + { + "material" "materials/sprites/store/trails/lightning3.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightspeed" + { + "material" "materials/sprites/store/trails/lightspeed.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightwave" + { + "material" "materials/sprites/store/trails/lightwave.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "LOL" + { + "material" "materials/sprites/store/trails/lol.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "LOL Guy" + { + "material" "materials/sprites/store/trails/lolguy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mario" + { + "material" "materials/sprites/store/trails/mario.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Masterchief" + { + "material" "materials/sprites/store/trails/masterchief.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + + "Mcdonalds" + { + "material" "materials/sprites/store/trails/mcdonald.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Medic" + { + "material" "materials/sprites/store/trails/medic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metallic" + { + "material" "materials/sprites/store/trails/metallic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metal Skull" + { + "material" "materials/sprites/store/trails/metalskull.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metroid" + { + "material" "materials/sprites/store/trails/metroid.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Micky Mouse" + { + "material" "materials/sprites/store/trails/mickymouse.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Minecraft" + { + "material" "materials/sprites/store/trails/minecraft.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Moneybag" + { + "material" "materials/sprites/store/trails/moneybag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "mtvlogo" + { + "material" "materials/sprites/store/trails/mtvlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mudkip" + { + "material" "materials/sprites/store/trails/mudkip.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mushroom" + { + "material" "materials/sprites/store/trails/mushroom.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mushroom 2" + { + "material" "materials/sprites/store/trails/mushroom2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Nevergup" + { + "material" "materials/sprites/store/trails/nevergup.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Nyan" + { + "material" "materials/sprites/store/trails/nyan.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ocarina" + { + "material" "materials/sprites/store/trails/ocarina.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Okami" + { + "material" "materials/sprites/store/trails/okami.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Okay Guy" + { + "material" "materials/sprites/store/trails/okayguy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Oops" + { + "material" "materials/sprites/store/trails/oops.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Orly" + { + "material" "materials/sprites/store/trails/orly.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pacman" + { + "material" "materials/sprites/store/trails/pacman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Paint Splatter" + { + "material" "materials/sprites/store/trails/paintsplatter.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Panda" + { + "material" "materials/sprites/store/trails/panda.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Paw Print" + { + "material" "materials/sprites/store/trails/pawprint.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Peace" + { + "material" "materials/sprites/store/trails/peace.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pedobear" + { + "material" "materials/sprites/store/trails/pedobear.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pfffft" + { + "material" "materials/sprites/store/trails/pfffft.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pika" + { + "material" "materials/sprites/store/trails/pika.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pikmin" + { + "material" "materials/sprites/store/trails/pikmin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pinkie" + { + "material" "materials/sprites/store/trails/pinkie.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pink Ribbon" + { + "material" "materials/sprites/store/trails/pinkribbon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Playboy" + { + "material" "materials/sprites/store/trails/playboy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Plur" + { + "material" "materials/sprites/store/trails/plur.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pokeball" + { + "material" "materials/sprites/store/trails/pokeball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pokemon" + { + "material" "materials/sprites/store/trails/pokemon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Poker" + { + "material" "materials/sprites/store/trails/poker.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Police" + { + "material" "materials/sprites/store/trails/police.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Potleaf" + { + "material" "materials/sprites/store/trails/potleaf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pretzel" + { + "material" "materials/sprites/store/trails/pretzel.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Problems Face" + { + "material" "materials/sprites/store/trails/problems_face.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Psychball" + { + "material" "materials/sprites/store/trails/psychball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Psych Triangle" + { + "material" "materials/sprites/store/trails/psychtriangle.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pumpkin" + { + "material" "materials/sprites/store/trails/pumpkin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Purple Lightning" + { + "material" "materials/sprites/store/trails/purplelightning.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Puttegris" + { + "material" "materials/sprites/store/trails/puttegris.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "pwned" + { + "material" "materials/sprites/store/trails/pwned.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Quake" + { + "material" "materials/sprites/store/trails/quake.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Question" + { + "material" "materials/sprites/store/trails/question.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Raf" + { + "material" "materials/sprites/store/trails/raf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rain" + { + "material" "materials/sprites/store/trails/rain.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Dash" + { + "material" "materials/sprites/store/trails/rainbow-dash.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow" + { + "material" "materials/sprites/store/trails/rainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Cobra 2" + { + "material" "materials/sprites/store/trails/rainbowcobra2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Cry" + { + "material" "materials/sprites/store/trails/rainbowcry.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Real Madrid" + { + "material" "materials/sprites/store/trails/realmadrid.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Reaper" + { + "material" "materials/sprites/store/trails/reaper.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Retro Egg" + { + "material" "materials/sprites/store/trails/retroegg.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Retro Flower" + { + "material" "materials/sprites/store/trails/retroflower.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sep Rainbow" + { + "material" "materials/sprites/store/trails/seprainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sharingan" + { + "material" "materials/sprites/store/trails/sharingan.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Shell" + { + "material" "materials/sprites/store/trails/shell.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Shroom5" + { + "material" "materials/sprites/store/trails/shroom5.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skull" + { + "material" "materials/sprites/store/trails/skull.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skulln Bones" + { + "material" "materials/sprites/store/trails/skullnbones.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skype Logo" + { + "material" "materials/sprites/store/trails/skypelogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Slow Poke" + { + "material" "materials/sprites/store/trails/slowpoke.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Smirnoff" + { + "material" "materials/sprites/store/trails/smirnoff.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Smugleaf" + { + "material" "materials/sprites/store/trails/smugleaf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Snowman" + { + "material" "materials/sprites/store/trails/snowman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sony Logo" + { + "material" "materials/sprites/store/trails/sonylogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "SOS" + { + "material" "materials/sprites/store/trails/sos.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spider" + { + "material" "materials/sprites/store/trails/spider.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spongebob" + { + "material" "materials/sprites/store/trails/spongebob.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spotify" + { + "material" "materials/sprites/store/trails/spotify.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "SRS Face" + { + "material" "materials/sprites/store/trails/srsface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Star" + { + "material" "materials/sprites/store/trails/star.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Superman Logo" + { + "material" "materials/sprites/store/trails/supermanlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Swirly" + { + "material" "materials/sprites/store/trails/swirly.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Taco" + { + "material" "materials/sprites/store/trails/taco.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Test 1000" + { + "material" "materials/sprites/store/trails/test1000.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Timebomb" + { + "material" "materials/sprites/store/trails/timebomb.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Tmi Shit" + { + "material" "materials/sprites/store/trails/tmishit.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "triforce" + { + "material" "materials/sprites/store/trails/triforce.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "trippy" + { + "material" "materials/sprites/store/trails/trippy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Troll Face" + { + "material" "materials/sprites/store/trails/trollface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Tux" + { + "material" "materials/sprites/store/trails/tux.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Twitter" + { + "material" "materials/sprites/store/trails/twitter.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "UK Flag" + { + "material" "materials/sprites/store/trails/ukflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ultra" + { + "material" "materials/sprites/store/trails/ultra.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Umbrella Corperation" + { + "material" "materials/sprites/store/trails/umbrellacorp.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Up Arrow" + { + "material" "materials/sprites/store/trails/uparrow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "US Flag" + { + "material" "materials/sprites/store/trails/usflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "War Heads" + { + "material" "materials/sprites/store/trails/warheads.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Warrior" + { + "material" "materials/sprites/store/trails/warrior.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Water 2" + { + "material" "materials/sprites/store/trails/water2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wheel" + { + "material" "materials/sprites/store/trails/wheel.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Windows" + { + "material" "materials/sprites/store/trails/windows.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wings" + { + "material" "materials/sprites/store/trails/wings.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wolf" + { + "material" "materials/sprites/store/trails/wolf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wonder Woman" + { + "material" "materials/sprites/store/trails/wonder_woman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Words" + { + "material" "materials/sprites/store/trails/words.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Medic 2" + { + "material" "materials/sprites/store/trails/x_medic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Xbox Logo" + { + "material" "materials/sprites/store/trails/xboxlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Y U NO Guy" + { + "material" "materials/sprites/store/trails/y-u-no-guy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ying-Yang" + { + "material" "materials/sprites/store/trails/yingyang.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ying-Yang 2" + { + "material" "materials/sprites/store/trails/yingyang2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Yukari" + { + "material" "materials/sprites/store/trails/yukari.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + } + + "Grenade Trails" + { + "Thin Beam" + { + "material" "materials/sprites/combineball_trail_black_1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Squiggly Beam" + { + "material" "materials/sprites/hydragutbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Medium Beam" + { + "material" "materials/sprites/orangelight1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Large Beam" + { + "material" "materials/sprites/spotlight.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Red Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 0 255" + "unique_id" "grenadetrail_laserbeam_red" + } + + "Blue Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "0 0 255 255" + "unique_id" "grenadetrail_laserbeam_blue" + } + } + + "Grenade Skins" + { + "HE Grenade" + { + "Orange" + { + "model" "models/props/cs_italy/orange.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + + "Tortoise" + { + "model" "models/props/de_tides/vending_turtle.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + } + + "Flashbang" + { + "Banana" + { + "model" "models/props/cs_italy/bananna.mdl" + "grenade" "flashbang" + "price" "60" + "type" "grenadeskin" + } + } + + "Smokegrenade" + { + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "grenade" "smokegrenade" + "price" "60" + "type" "grenadeskin" + } + } + } + + "Weapon Colors" + { + "Antique White" + { + "color" "205 192 176 255" + "price" "60" + "type" "weaponcolor" + } + "Alice Blue" + { + "color" "240 248 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue" + { + "color" "0 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue Violet" + { + "color" "138 43 226 255" + "price" "60" + "type" "weaponcolor" + } + "Corn Silk" + { + "color" "255 248 220 255" + "price" "60" + "type" "weaponcolor" + } + "Cyan" + { + "color" "0 255 255 255" + "price" "60" + "type" "weaponcolor" + } + "Dark Khaki" + { + "color" "189 183 107 255" + "price" "60" + "type" "weaponcolor" + } + "Dim Grey" + { + "color" "105 105 105 255" + "price" "60" + "type" "weaponcolor" + } + "Fire Brick" + { + "color" "178 34 34 255" + "price" "60" + "type" "weaponcolor" + } + "Fuschia" + { + "color" "255 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Gray" + { + "color" "240 240 240 255" + "price" "60" + "type" "weaponcolor" + } + "Green" + { + "color" "0 255 0 255" + "price" "60" + "type" "weaponcolor" + } + "Hunter Green" + { + "color" "35 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Lawn Green" + { + "color" "124 1202 0 255" + "price" "60" + "type" "weaponcolor" + } + "Navajo White" + { + "color" "255 222 173 255" + "price" "60" + "type" "weaponcolor" + } + "Olive" + { + "color" "128 128 0 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Brown" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Drab" + { + "color" "607 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Orange" + { + "color" "255 77 0 255" + "price" "60" + "type" "weaponcolor" + } + "Orchid" + { + "color" "218 112 214 255" + "price" "60" + "type" "weaponcolor" + } + "Pale Turquoise" + { + "color" "175 238 238 255" + "price" "60" + "type" "weaponcolor" + } + "Purple" + { + "color" "128 0 128 255" + "price" "60" + "type" "weaponcolor" + } + "Pink" + { + "color" "255 103 103 255" + "price" "60" + "type" "weaponcolor" + } + "Plum" + { + "color" "221 160 221 255" + "price" "60" + "type" "weaponcolor" + } + "Red" + { + "color" "255 0 0 255" + "price" "60" + "type" "weaponcolor" + } + "Sea Blue" + { + "color" "43 176 205 255" + "price" "60" + "type" "weaponcolor" + } + "Sandy Brown" + { + "color" "244 164 96 255" + "price" "60" + "type" "weaponcolor" + } + "Sienna" + { + "color" "180 82 45 255" + "price" "60" + "type" "weaponcolor" + } + "Silver" + { + "color" "192 192 192 255" + "price" "60" + "type" "weaponcolor" + } + "Scarlet" + { + "color" "140 23 23 255" + "price" "60" + "type" "weaponcolor" + } + "Seal Green" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Steel Blue" + { + "color" "35 107 142 255" + "price" "60" + "type" "weaponcolor" + } + "Teal" + { + "color" "0 128 128 255" + "price" "60" + "type" "weaponcolor" + } + "Turquoise" + { + "color" "64 224 208 255" + "price" "60" + "type" "weaponcolor" + } + "Violet" + { + "color" "148 0 211 255" + "price" "60" + "type" "weaponcolor" + } + "Yellow" + { + "color" "255 255 0 255" + "price" "60" + "type" "weaponcolor" + } + } + + "Chat stuff" + { + "Name Tags" + { + "Newbie" + { + "tag" "{lightblue}[Newbie]{teamcolor} " + "price" "60" + "type" "nametag" + } + "Wannabe" + { + "tag" "{red}[Wannabe]{teamcolor} " + "price" "90" + "type" "nametag" + } + "Ex-Con" + { + "tag" "{black}[Ex-Con]{teamcolor} " + "price" "120" + "type" "nametag" + } + "Officer" + { + "tag" "{lightblue}[Officer]{teamcolor} " + "price" "120" + "type" "nametag" + } + "S.W.A.T" + { + "tag" "{blue}[S.W.A.T]{teamcolor} " + "price" "120" + "type" "nametag" + } + "420" + { + "tag" "{green}[420]{teamcolor} " + "price" "180" + "type" "nametag" + } + "Equinox" + { + "tag" "{pink}[Equinox]{teamcolor} " + "price" "300" + "type" "nametag" + } + } + + "Name Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "60" + "type" "namecolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "60" + "type" "namecolor" + } + + "Green" + { + "color" "{green}" + "price" "60" + "type" "namecolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "60" + "type" "namecolor" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "60" + "type" "namecolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "60" + "type" "namecolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "60" + "type" "namecolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + } + + "Message Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "120" + "type" "msgcolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "120" + "type" "msgcolor" + } + + "Green" + { + "color" "{green}" + "price" "120" + "type" "msgcolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "120" + "type" "msgcolor" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "120" + "type" "msgcolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "120" + "type" "msgcolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "120" + "type" "msgcolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + } + } + + "Miscellaneous" + { + "Bunnyhop" + { + "price" "500" + "type" "bunnyhop" + } + + "Jetpack" + { + "price" "500" + "type" "jetpack" + } + + "Paintball" + { + "price" "500" + "type" "paintball" + "Decals" + { + "cyan" + { + "material" "paintball/pb_cyan.vmt" + } + "green" + { + "material" "paintball/pb_green.vmt" + } + "pink" + { + "material" "paintball/pb_pink.vmt" + } + "orange" + { + "material" "paintball/pb_orange.vmt" + } + "yellow" + { + "material" "paintball/pb_yellow.vmt" + } + } + } + } + + "Unusual Effects" + { + "Flying Bits" + { + "unusual_id" "2" + "price" "180" + "type" "tfunusual" + } + + "Nemesis Burst" + { + "unusual_id" "3" + "price" "180" + "type" "tfunusual" + } + + "Community Sparkle" + { + "unusual_id" "4" + "price" "180" + "type" "tfunusual" + } + + "Holy Glow" + { + "unusual_id" "5" + "price" "180" + "type" "tfunusual" + } + + "Green Confetti" + { + "unusual_id" "6" + "price" "180" + "type" "tfunusual" + } + + "Purple Confetti" + { + "unusual_id" "7" + "price" "180" + "type" "tfunusual" + } + + "Haunted Ghosts" + { + "unusual_id" "8" + "price" "200" + "type" "tfunusual" + } + + "Green Energy" + { + "unusual_id" "9" + "price" "200" + "type" "tfunusual" + } + + "Purple Energy" + { + "unusual_id" "10" + "price" "200" + "type" "tfunusual" + } + + "Circling TF Logo" + { + "unusual_id" "11" + "price" "200" + "type" "tfunusual" + } + + "Massed Flies" + { + "unusual_id" "12" + "price" "200" + "type" "tfunusual" + } + + "Burning Flames" + { + "unusual_id" "13" + "price" "200" + "type" "tfunusual" + } + + "Scorching Flames" + { + "unusual_id" "14" + "price" "280" + "type" "tfunusual" + } + + "Searing Plasma" + { + "unusual_id" "15" + "price" "280" + "type" "tfunusual" + } + + "Vivid Plasma" + { + "unusual_id" "16" + "price" "280" + "type" "tfunusual" + } + + "Sunbeams" + { + "unusual_id" "17" + "price" "280" + "type" "tfunusual" + } + + "Circling Peace Sign" + { + "unusual_id" "18" + "price" "280" + "type" "tfunusual" + } + + "Circling Heart" + { + "unusual_id" "19" + "price" "280" + "type" "tfunusual" + } + + "Map Stamps" + { + "unusual_id" "20" + "price" "280" + "type" "tfunusual" + } + + "Genteel Smoke" + { + "unusual_id" "28" + "price" "360" + "type" "tfunusual" + } + + "Stormy Storm" + { + "unusual_id" "29" + "price" "360" + "type" "tfunusual" + } + + "Blizzardy Storm" + { + "unusual_id" "30" + "price" "360" + "type" "tfunusual" + } + + "Nuts n' Bolts" + { + "unusual_id" "31" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Planets" + { + "unusual_id" "32" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Fire" + { + "unusual_id" "33" + "price" "360" + "type" "tfunusual" + } + + "Bubbling" + { + "unusual_id" "34" + "price" "360" + "type" "tfunusual" + } + + "Smoking" + { + "unusual_id" "35" + "price" "360" + "type" "tfunusual" + } + + "Steaming" + { + "unusual_id" "36" + "price" "360" + "type" "tfunusual" + } + + "Flaming Lantern" + { + "unusual_id" "37" + "price" "360" + "type" "tfunusual" + } + + "Cloudy Moon" + { + "unusual_id" "38" + "price" "360" + "type" "tfunusual" + } + + "Cauldron Bubbles" + { + "unusual_id" "39" + "price" "360" + "type" "tfunusual" + } + + "Eerie Orbiting Fire" + { + "unusual_id" "40" + "price" "440" + "type" "tfunusual" + } + + "Knifestorm" + { + "unusual_id" "43" + "price" "440" + "type" "tfunusual" + } + + "Misty Skull" + { + "unusual_id" "44" + "price" "440" + "type" "tfunusual" + } + + "Harvest Moon" + { + "unusual_id" "45" + "price" "440" + "type" "tfunusual" + } + + "It's A Secret To Everybody" + { + "unusual_id" "46" + "price" "440" + "type" "tfunusual" + } + + "Stormy 13th Hour" + { + "unusual_id" "47" + "price" "440" + "type" "tfunusual" + } + + "Attrib_Particle55" + { + "unusual_id" "55" + "price" "440" + "type" "tfunusual" + } + + "Kill-a-Watt" + { + "unusual_id" "56" + "price" "440" + "type" "tfunusual" + } + + "Terror-Watt" + { + "unusual_id" "57" + "price" "440" + "type" "tfunusual" + } + + "Cloud 9" + { + "unusual_id" "58" + "price" "440" + "type" "tfunusual" + } + + "Aces High" + { + "unusual_id" "59" + "price" "440" + "type" "tfunusual" + } + + "Dead Presidents" + { + "unusual_id" "180" + "type" "tfunusual" + "price" "440" + "type" "tfunusual" + } + + "Miami Nights" + { + "unusual_id" "61" + "price" "180" + "type" "tfunusual" + } + + "Disco Beat Down" + { + "unusual_id" "62" + "price" "520" + "type" "tfunusual" + } + + "Phosphorous" + { + "unusual_id" "63" + "price" "520" + "type" "tfunusual" + } + + "Sulphurous" + { + "unusual_id" "64" + "price" "520" + "type" "tfunusual" + } + + "Memory Leak" + { + "unusual_id" "65" + "price" "520" + "type" "tfunusual" + } + + "Overclocked" + { + "unusual_id" "66" + "price" "520" + "type" "tfunusual" + } + + "Electrostatic" + { + "unusual_id" "67" + "price" "520" + "type" "tfunusual" + } + + "Power Surge" + { + "unusual_id" "68" + "price" "520" + "type" "tfunusual" + } + + "Anti-Freeze" + { + "unusual_id" "69" + "price" "520" + "type" "tfunusual" + } + + "Time Warp" + { + "unusual_id" "70" + "price" "520" + "type" "tfunusual" + } + + "Green Black Hole" + { + "unusual_id" "71" + "price" "520" + "type" "tfunusual" + } + + "Roboactive" + { + "unusual_id" "72" + "price" "520" + "type" "tfunusual" + } + + "Arcana" + { + "unusual_id" "73" + "price" "520" + "type" "tfunusual" + } + + "Spellbound" + { + "unusual_id" "74" + "price" "600" + "type" "tfunusual" + } + + "Chiroptera Venenata" + { + "unusual_id" "75" + "price" "600" + "type" "tfunusual" + } + + "Poisoned Shadows" + { + "unusual_id" "76" + "price" "600" + "type" "tfunusual" + } + + "Something Burning This Way Comes" + { + "unusual_id" "77" + "price" "600" + "type" "tfunusual" + } + + "Hellfire" + { + "unusual_id" "78" + "price" "600" + "type" "tfunusual" + } + + "Darkblaze" + { + "unusual_id" "79" + "price" "600" + "type" "tfunusual" + } + + "Demonflame" + { + "unusual_id" "80" + "price" "600" + "type" "tfunusual" + } + + "Showstopper" + { + "unusual_id" "3002" + "price" "600" + "type" "tfunusual" + } + + "Holy Grail" + { + "unusual_id" "3003" + "price" "600" + "type" "tfunusual" + } + "Fountain of Delight" + { + "unusual_id" "3005" + "price" "600" + "type" "tfunusual" + } + + "Screaming Tiger" + { + "unusual_id" "3006" + "price" "600" + "type" "tfunusual" + } + + "Skill Gotten Gains" + { + "unusual_id" "3007" + "price" "600" + "type" "tfunusual" + } + + "Midnight Whirlwind" + { + "unusual_id" "3008" + "price" "600" + "type" "tfunusual" + } + + "Silver Cyclone" + { + "unusual_id" "3009" + "price" "600" + "type" "tfunusual" + } + + "Mega Strike" + { + "unusual_id" "3010" + "price" "600" + "type" "tfunusual" + } + } + + "Paint Cans" + { + "A Color Similar to Slate" + { + "color" "47 79 79" + "price" "60" + "type" "tyhatdye" + } + + "A Deep Commitment to Purple" + { + "color" "125 64 113" + "price" "60" + "type" "tyhatdye" + } + + "A Distinctive Lack of Hue" + { + "color" "20 20 20" + "price" "60" + "type" "tyhatdye" + } + + "A Mann's Mint" + { + "color" "188 221 179" + "price" "60" + "type" "tyhatdye" + } + + "After Eight" + { + "color" "45 45 36" + "price" "60" + "type" "tyhatdye" + } + + "Aged Moustache Grey" + { + "color" "126 126 126" + "price" "60" + "type" "tyhatdye" + } + + "An Extraordinary Abundance of Tinge" + { + "color" "230 230 230" + "price" "60" + "type" "tyhatdye" + } + + "Australium Gold" + { + "color" "231 181 59" + "price" "60" + "type" "tyhatdye" + } + + "Color No. 216-190-216 " + { + "color" "216 190 216" + "price" "60" + "type" "tyhatdye" + } + + "Dark Salmon Injustice" + { + "color" "233 150 122" + "price" "60" + "type" "tyhatdye" + } + + "Drably Olive" + { + "color" "128 128 0" + "price" "60" + "type" "tyhatdye" + } + + "Indubitably Green" + { + "color" "114 158 66" + "price" "60" + "type" "tyhatdye" + } + + "Mann Co. Orange" + { + "color" "207 115 54" + "price" "60" + "type" "tyhatdye" + } + + "Muskelmannbraun" + { + "color" "165 117 69" + "price" "60" + "type" "tyhatdye" + } + + "Noble Hatter's Violet" + { + "color" "81 56 74" + "price" "60" + "type" "tyhatdye" + } + + "Peculiarly Drab Tincture" + { + "color" "197 175 145" + "price" "60" + "type" "tyhatdye" + } + "Pink as Hell" + { + "color" "255 105 180" + "price" "60" + "type" "tyhatdye" + } + + "Radigan Conagher Brown" + { + "color" "105 77 58" + "price" "60" + "type" "tyhatdye" + } + + "The Bitter Taste of Defeat and Lime" + { + "color" "50 205 50" + "price" "60" + "type" "tyhatdye" + } + + "The Color of a Gentlemann's Business Pants" + { + "color" "240 230 140" + "price" "60" + "type" "tyhatdye" + } + + "Ye Olde Rustic Colour" + { + "color" "124 108 87" + "price" "60" + "type" "tyhatdye" + } + + "Zepheniah's Greed" + { + "color" "66 79 59" + "price" "60" + "type" "tyhatdye" + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/configs/store/items_few_trails.txt b/addons/sourcemod/configs/store/items_few_trails.txt new file mode 100644 index 0000000..d74e1b8 --- /dev/null +++ b/addons/sourcemod/configs/store/items_few_trails.txt @@ -0,0 +1,8755 @@ +"Store" +{ + + "Weapon Skins" + { + "M4A1-S Hyper Beast" + { + "paint" "430" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Mag7 RedHot" + { + "paint" "431" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Negev Glory" + { + "paint" "432" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Mac10 NeonRider" + { + "paint" "433" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Sawedoff Origami" + { + "paint" "434" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "CZ75 Precision" + { + "paint" "435" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "UMP45 RACER" + { + "paint" "436" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Famas Jinn " + { + "paint" "429" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Galil Eco" + { + "paint" "428" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Five Seven Banana" + { + "paint" "427" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "P250 Contour" + { + "paint" "426" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "AWP Twine" + { + "paint" "424" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "MP9 Ultra Modern" + { + "paint" "423" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Ak47 Maestry" + { + "paint" "422" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Abyss" + { + + "paint" "361" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Acid Fade" + { + + "paint" "253" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Afterimage" + { + + "paint" "154" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Amber Fade" + { + + "paint" "246" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Gunmetal" + { + + "paint" "210" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Navy" + { + + "paint" "28" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Navy (2)" + { + + "paint" "197" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Antique (Nova)" + { + + "paint" "286" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Antique (PP-Bizon)" + { + + "paint" "306" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Arctic Camo" + { + + "paint" "6" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Mesh" + { + + "paint" "242" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Recon" + { + + "paint" "245" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Sheen" + { + + "paint" "298" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ash Wood" + { + + "paint" "234" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (AWP)" + { + + "paint" "279" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (M4A4)" + { + + "paint" "255" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (P90)" + { + + "paint" "359" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Atomic Alloy" + { + + "paint" "301" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Azure Zebra" + { + + "paint" "229" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Basilisk" + { + + "paint" "383" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bengal Tiger" + { + + "paint" "9" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Black Laminate" + { + + "paint" "172" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Black Limba" + { + + "paint" "190" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blaze" + { + + "paint" "37" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blaze Orange" + { + + "paint" "166" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blind Spot" + { + + "paint" "228" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blizzard Marbelized" + { + + "paint" "75" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blood In The Water" + { + + "paint" "222" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blood Tiger" + { + + "paint" "217" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bloomstick" + { + + "paint" "62" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Fissure" + { + + "paint" "278" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Laminate" + { + + "paint" "226" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Steel" + { + + "paint" "42" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Spruce" + { + + "paint" "96" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Streak" + { + + "paint" "13" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Titanium" + { + + "paint" "216" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Mask" + { + + "paint" "27" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Machine" + { + + "paint" "370" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Pile" + { + + "paint" "193" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "BOOM" + { + + "paint" "174" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Boreal Forest" + { + + "paint" "77" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Brass" + { + + "paint" "159" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bratatat" + { + + "paint" "317" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Briar" + { + + "paint" "330" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bright Water" + { + + "paint" "189" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bulldozer" + { + + "paint" "39" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bullet Rain" + { + + "paint" "155" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Business Class" + { + + "paint" "364" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caged Steel" + { + + "paint" "299" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caiman" + { + + "paint" "339" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "CaliCamo" + { + + "paint" "240" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Candy Apple" + { + + "paint" "3" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caramel" + { + + "paint" "93" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Carbon Fiber" + { + + "paint" "70" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cardiac" + { + + "paint" "391" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cartel (AK-47)" + { + + "paint" "394" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cartel (P250)" + { + + "paint" "388" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Case Hardened" + { + + "paint" "44" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Catacombs" + { + + "paint" "399" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cerberus" + { + + "paint" "379" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chainmail" + { + + "paint" "327" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chalice" + { + + "paint" "325" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chameleon" + { + + "paint" "280" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chatterbox" + { + + "paint" "398" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chemical Green" + { + + "paint" "376" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Coach Class" + { + + "paint" "346" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Disruption" + { + + "paint" "231" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Halftone" + { + + "paint" "267" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Quartz" + { + + "paint" "249" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cold Blooded" + { + + "paint" "67" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Colony" + { + + "paint" "47" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Commuter" + { + + "paint" "343" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Condemned" + { + + "paint" "110" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Conspiracy" + { + + "paint" "351" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contamination" + { + + "paint" "373" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contractor" + { + + "paint" "46" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contrast Spray" + { + + "paint" "22" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corporal" + { + + "paint" "281" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corticera (AWP)" + { + + "paint" "184" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corticera (P2000)" + { + + "paint" "181" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper" + { + + "paint" "41" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper Galaxy" + { + + "paint" "274" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper Head" + { + + "paint" "10" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Crimson Web" + { + + "paint" "12" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Crimson Web (2)" + { + + "paint" "232" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Curse" + { + + "paint" "310" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyanospatter" + { + + "paint" "92" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyrex (M4A1-S" + { + + "paint" "360" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyrex (SCAR-20)" + { + + "paint" "312" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (1)" + + + { + + "paint" "410" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (2)" + { + + "paint" "411" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (3)" + { + + "paint" "247" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dark Age" + { + + "paint" "329" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dark Water" + { + + "paint" "60" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dart" + { + + "paint" "386" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Deadly Poison" + { + + "paint" "403" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Death By Kitty" + { + + "paint" "156" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Death Rattle" + { + + "paint" "293" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Delusion" + { + + "paint" "392" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Demeter" + { + + "paint" "195" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Demolition" + { + + "paint" "153" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Detour" + { + + "paint" "319" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert Storm" + { + + "paint" "8" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert-Strike (M4A4)" + { + + "paint" "336" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert-Strike (Negev)" + { + + "paint" "355" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert Warfare" + { + + "paint" "311" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doomkitty" + { + + "paint" "178" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 1)" + { + + "paint" "418" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 2)" + { + + "paint" "419" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 3)" + { + + "paint" "420" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 4)" + { + + "paint" "421" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Black Pearl)" + { + + "paint" "417" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Ruby)" + { + + "paint" "415" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Sapphire)" + { + + "paint" "416" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon King" + { + + "paint" "400" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon Lore" + { + + "paint" "344" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon Tattoo" + { + + "paint" "48" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dry Season" + { + + "paint" "199" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Electric Hive" + { + + "paint" "227" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald" + { + + "paint" "196" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald Dragon" + { + + "paint" "182" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald Pinstripe" + { + + "paint" "300" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Facets" + { + + "paint" "207" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fade" + { + + "paint" "38" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Faded Zebra" + { + + "paint" "176" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fallout Warning (1)" + { + + "paint" "169" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fallout Warning (2)" + { + + "paint" "378" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fire Elemental" + { + + "paint" "389" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fire Serpent" + { + + "paint" "180" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Firestarter" + { + + "paint" "385" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "First Class (AK-47)" + { + + "paint" "341" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "First Class (Sawed-Off)" + { + + "paint" "345" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest DDPAT" + { + + "paint" "5" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest Leaves" + { + + "paint" "25" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest Night" + { + + "paint" "78" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fowl Play" + { + + "paint" "352" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Franklin" + { + + "paint" "295" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Full Stop" + { + + "paint" "250" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Gator Mesh" + { + + "paint" "243" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ghost Camo" + { + + "paint" "225" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Glacier Mesh" + { + + "paint" "111" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Golden Koi" + { + + "paint" "185" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Granite Marbelized" + { + + "paint" "21" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graphite (1)" + { + + "paint" "214" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graphite (2)" + { + + "paint" "212" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grassland" + { + + "paint" "95" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grassland Leaves" + { + + "paint" "104" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graven" + { + + "paint" "188" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Green Apple" + { + + "paint" "294" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Green Plaid" + { + + "paint" "366" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Griffin" + { + + "paint" "384" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grinder" + { + + "paint" "381" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grotto" + { + + "paint" "406" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Groundwater (1)" + { + + "paint" "2" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Groundwater (2)" + { + + "paint" "209" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Guardian (1)" + { + + "paint" "257" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Guardian (2)" + { + + "paint" "290" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Gun Smoke" + { + + "paint" "15" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hand Cannon" + { + + "paint" "328" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hazard (1)" + { + + "paint" "101" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hazard (2)" + { + + "paint" "198" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heat" + { + + "paint" "284" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heaven Guard (MAG-7)" + { + + "paint" "291" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heaven Guard (XM1014)" + { + + "paint" "314" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heirloom" + { + + "paint" "273" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hemoglobin" + { + + "paint" "220" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hexane" + { + + "paint" "218" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Highwayman" + { + + "paint" "390" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hive" + { + + "paint" "219" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hot Rod" + { + + "paint" "33" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hot Shot" + { + + "paint" "377" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Howl" + { + + "paint" "309" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hunting Blind" + { + + "paint" "241" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hypnotic" + { + + "paint" "61" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Indigo" + { + + "paint" "333" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Irradiated Alert" + { + + "paint" "171" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Isaac" + { + + "paint" "303" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ivory" + { + + "paint" "357" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jaguar" + { + + "paint" "316" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jet Set" + { + + "paint" "340" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle (1)" + { + + "paint" "151" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle (2)" + { + + "paint" "205" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Dashed" + { + + "paint" "147" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle DDPAT" + { + + "paint" "202" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Spray" + { + + "paint" "122" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Tiger" + { + + "paint" "16" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Kami (1)" + { + + "paint" "265" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Kami (2)" + { + + "paint" "308" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Knight" + { + + "paint" "326" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Koi" + { + + "paint" "356" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "The Kraken" + { + + "paint" "256" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Labyrinth" + { + + "paint" "362" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Leather" + { + + "paint" "342" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Lichen Dashed" + { + + "paint" "26" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Lightning Strike" + { + + "paint" "51" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Magma" + { + + "paint" "266" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Malachite" + { + + "paint" "402" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Man-O'-War" + { + + "paint" "395" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Marble Fade" + { + + "paint" "413" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Marina" + { + + "paint" "261" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Master Piece" + { + + "paint" "321" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mayan Dreams" + { + + "paint" "200" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mehndi" + { + + "paint" "258" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Memento" + { + + "paint" "177" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Metallic DDPAT" + { + + "paint" "34" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Meteorite" + { + + "paint" "296" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Modern Hunter" + { + + "paint" "164" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Module" + { + + "paint" "335" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mosaico" + { + + "paint" "204" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mudder" + { + + "paint" "90" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Muertos" + { + + "paint" "404" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Murky" + { + + "paint" "382" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Naga" + { + + "paint" "397" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Night" + { + + "paint" "40" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Night Ops" + { + + "paint" "236" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nightshade" + { + + "paint" "223" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nitro (CZ-75)" + { + + "paint" "322" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nitro (M4A1-S)" + { + + "paint" "254" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Garden" + { + + "paint" "372" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Threat (1)" + { + + "paint" "168" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Threat (2)" + { + + "paint" "179" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Waste" + { + + "paint" "369" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ocean Foam (MP7)" + { + + "paint" "211" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ocean Foam (P2000)" + { + + "paint" "213" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Olive Plaid" + { + + "paint" "365" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orange DDPAT" + { + + "paint" "83" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orange Peel" + { + + "paint" "141" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orion" + { + + "paint" "313" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Osiris" + { + + "paint" "349" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ossified" + { + + "paint" "36" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Overgrowth" + { + + "paint" "183" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Palm (1)" + { + + "paint" "157" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Palm (2)" + { + + "paint" "201" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Panther" + { + + "paint" "276" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pilot" + { + + "paint" "347" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pink DDPAT" + { + + "paint" "84" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pit Viper" + { + + "paint" "251" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Poison Dart" + { + + "paint" "315" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Polar Camo" + { + + "paint" "74" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Polar Mesh" + { + + "paint" "107" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Predator" + { + + "paint" "170" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (FAMAS)" + { + + "paint" "260" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (P2000)" + { + + "paint" "338" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (SG553)" + { + + "paint" "287" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Quicksilver" + { + + "paint" "407" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + + + "Radiation Hazard (1)" + { + + "paint" "167" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Radiation Hazard (2)" + { + + "paint" "375" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Reactor" + { + + "paint" "367" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Redline (AK-47)" + { + + "paint" "282" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + + + "Redline (AWP)" + { + + "paint" "259" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Laminate" + { + + "paint" "14" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Leather" + { + + "paint" "348" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Fragcam" + { + + "paint" "275" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Python" + { + + "paint" "320" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Quartz" + { + + "paint" "248" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Retribution" + { + + "paint" "307" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rising Skull" + { + + "paint" "263" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Road Rash" + { + + "paint" "318" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rose Iron" + { + + "paint" "262" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Royal Blue" + { + + "paint" "332" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (1)" + { + + "paint" "323" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (2)" + { + + "paint" "203" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (3)" + { + + "paint" "414" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Safari Mesh" + { + + "paint" "72" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sage Spray" + { + + "paint" "119" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sandstorm (1)" + { + + "paint" "264" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sandstorm (2)" + { + + "paint" "289" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dashed" + { + + "paint" "148" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dune (1)" + { + + "paint" "99" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dune (2)" + { + + "paint" "208" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Mesh" + { + + "paint" "116" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Spray" + { + + "paint" "124" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Scorched" + { + + "paint" "175" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Scorpion" + { + + "paint" "71" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sergeant" + { + + "paint" "288" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Serenity" + { + + "paint" "405" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Serum" + { + + "paint" "221" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Setting Sun" + { + + "paint" "368" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Shattered" + { + + "paint" "192" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Silver" + { + + "paint" "32" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + + + } + + "Silver Quartz" + { + + "paint" "252" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Skulls" + { + + "paint" "11" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Slashed" + { + + "paint" "304" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Slaughter" + { + + "paint" "59" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Snake Camo" + { + + "paint" "30" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Spitfire" + { + + "paint" "194" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Splash" + { + + "paint" "162" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Splash Jam" + { + + "paint" "165" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Stained" + { + + "paint" "43" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Stainless" + { + + "paint" "277" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Steel Disruption" + { + + "paint" "230" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Storm" + { + + "paint" "100" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Styx" + { + + "paint" "371" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Supernova" + { + + "paint" "358" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "System Lock" + { + + "paint" "401" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tatter" + { + + "paint" "337" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Teardown" + { + + "paint" "244" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tempest" + { + + "paint" "191" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Terrain" + { + + "paint" "285" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "The Fuschia Is Now" + { + + "paint" "269" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tiger Tooth" + { + + "paint" "409" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tigris" + { + + "paint" "350" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Titanium Bit" + { + + "paint" "272" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tornado" + { + + "paint" "206" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Torque" + { + + "paint" "305" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Toxic" + { + + "paint" "374" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tranquility" + { + + "paint" "393" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Traveler" + { + + "paint" "363" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tread Plate" + { + + "paint" "268" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Trigon" + { + + "paint" "283" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tropical Storm" + { + + "paint" "233" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tuxedo" + { + + "paint" "297" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Twist" + { + + "paint" "334" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ultraviolet" + { + + "paint" "98" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Undertow" + { + + "paint" "271" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Dashed" + { + + "paint" "149" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban DDPAT" + { + + "paint" "17" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Hazard (1)" + { + + "paint" "387" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Hazard (2)" + { + + "paint" "354" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Masked" + { + + "paint" "143" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Perforated" + { + + "paint" "135" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Rubble" + { + + "paint" "237" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Shock" + { + + "paint" "396" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "VariCamo" + { + + "paint" "235" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "VariCamo Blue" + { + + "paint" "238" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Victoria" + { + + "paint" "270" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Walnut" + { + + "paint" "158" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wasteland Rebel" + { + + "paint" "380" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Water Elemental" + { + + "paint" "353" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Water Sigil" + { + + "paint" "224" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wave Spray" + { + + "paint" "186" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Waves Perforated" + { + + "paint" "136" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Whiteout" + { + + "paint" "102" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wings" + { + + "paint" "73" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Winter Forest" + { + + "paint" "76" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Virus" + { + + "paint" "20" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Vulcan" + { + + "paint" "302" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "X-RAY" + { + + "paint" "215" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Zirka" + { + + "paint" "187" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + } + + "Pets" + { + "Chicken" + { + "model" "models/chicken/chicken.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Chicken Zombie" + { + "model" "models/chicken/chicken_zombie.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Crow" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "crow_running" + "price" "100" + "type" "pet" + } + + "Crow Flying" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "crow_flying" + "price" "100" + "type" "pet" + } + + "Pigeon" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "pigeon_running" + "price" "100" + "type" "pet" + } + + "Pigeon Flying" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "pigeon_flying" + "price" "100" + "type" "pet" + } + + "Seagull" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "seagull_running" + "price" "100" + "type" "pet" + } + + "Seagull Flying" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly" + "run" "Fly" + "unique_id" "seagull_flying" + "price" "100" + "type" "pet" + } + } + + "Knives" + { + "Bayonet" + { + "entity" "weapon_bayonet" + "defindex" "500" + "type" "knife" + "price" "100" + } + + "Gut" + { + "entity" "weapon_knife_gut" + "defindex" "506" + "type" "knife" + "price" "100" + } + + "Flip" + { + "entity" "weapon_knife_flip" + "defindex" "505" + "type" "knife" + "price" "100" + } + + "M9 Bayonet" + { + "entity" "weapon_knife_m9_bayonet" + "defindex" "508" + "type" "knife" + "price" "100" + } + + "Karambit" + { + "entity" "weapon_knife_karambit" + "defindex" "507" + "type" "knife" + "price" "100" + } + + "Golden" + { + "entity" "weapon_knifegg" + "type" "knife" + "price" "100" + } + + "Tactical" + { + "entity" "weapon_knife_tactical" + "defindex" "509" + "type" "knife" + "price" "100" + } + + "Butterfly" + { + "entity" "weapon_knife_butterfly" + "defindex" "515" + "type" "knife" + "price" "100" + } + + "Falchion" + { + "entity" "weapon_knife_falchion" + "defindex" "512" + "type" "knife" + "price" "100" + } + } + + "Tracers" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "tracer" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "tracer" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "tracer" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "tracer" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "tracer" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "tracer" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "tracer" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "tracer" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "tracer" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "tracer" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "tracer" + } + } + + "Laser Sight" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "lasersight" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "lasersight" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "lasersight" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "lasersight" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "lasersight" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "lasersight" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "lasersight" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "lasersight" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "lasersight" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "lasersight" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "lasersight" + } + } + + "Accessories" + { + "Hats" + { + "Spartan Helmet" + { + "model" "models/spartahelm/spartahelm.mdl" + "position" "0.0 -2.2 -68.4" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Ironman" + { + "model" "models/fo3_ironman_mask.mdl" + "position" "1.0 -4.6 -2.0" + "angles" "0.0 -90.0 -20.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "V Mask" + { + "model" "models/v/mask.mdl" + "position" "0.0 -5.2 -65.2" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Pika Hat" + { + "model" "models/pikahat/pikahat.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Mudkip Hat" + { + "model" "models/mudhatk/mudhatk.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Super Saiyan" + { + "model" "models/anime_patron/animepatr.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Sentry" + { + "model" "models/sentry_hat/sentryha.mdl" + "position" "0.0 -1.7 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Pedo Bear" + { + "model" "models/pedobear/pedobearf.mdl" + "position" "0.0 -1.7 -70.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Antlers" + { + "model" "models/sam/antlers.mdl" + "position" "0.0 0.0 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Car Tire" + { + "model" "models/props_vehicles/tire001c_car.mdl" + "position" "0.0 -10.0 0.0" + "angles" "90.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "position" "0.0 0.0 5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Traffic Cone" + { + "model" "models/props_junk/trafficcone001a.mdl" + "position" "0.0 -1.0 20.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Metal Bucket" + { + "model" "models/props_junk/metalbucket01a.mdl" + "position" "0.0 0.0 -8.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Terracotta" + { + "model" "models/props_junk/terracotta01.mdl" + "position" "0.0 3.0 -10.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Baseball Cap" + { + "model" "models/props/cs_office/snowman_hat.mdl" + "position" "0.0 0.0 7.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Coffee Mug" + { + "model" "models/props/cs_office/coffee_mug.mdl" + "position" "0.0 0.0 9.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "I <3 Turtles" + { + "model" "models/props/de_tides/vending_hat.mdl" + "position" "1.8 0.0 4.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Astronaut helmet" + { + "model" "models/astronauthelmet/astronauthelmet.mdl" + "position" "0.0 0.0 -5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Viking helmet" + { + "model" "models/vikinghelmet/vikinghelmet.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Fedora" + { + "model" "models/gmod_tower/fedorahat.mdl" + "position" "0.0 -1.5 8.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "KFC Bucket" + { + "model" "models/gmod_tower/kfcbucket.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Cake Hat" + { + "model" "models/cakehat/cakehat.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Santa Hat" + { + "model" "models/santahat/santahat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Dunce Hat" + { + "model" "models/duncehat/duncehat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Sombrero" + { + "model" "models/gmod_tower/sombrero.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Cat Ears" + { + "model" "models/gmod_tower/catears.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Afro" + { + "model" "models/gmod_tower/afro.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Andross Mask" + { + "model" "models/gmod_tower/androssmask.mdl" + "position" "0.0 2.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Drink Cap" + { + "model" "models/gmod_tower/drinkcap.mdl" + "position" "0.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Headcrab Hat" + { + "model" "models/gmod_tower/headcrabhat.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Majorasmask" + { + "model" "models/gmod_tower/majorasmask.mdl" + "position" "0.0 0.5 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Toromask" + { + "model" "models/gmod_tower/toromask.mdl" + "position" "0.0 -1.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Top Hat" + { + "model" "models/gmod_tower/tophat.mdl" + "position" "0.0 -1.7 4.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Witch Hat" + { + "model" "models/gmod_tower/witchhat.mdl" + "position" "0.0 0.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Toeto Hat" + { + "model" "models/gmod_tower/toetohat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Party Hat" + { + "model" "models/gmod_tower/partyhat.mdl" + "position" "1.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Seuss Hat" + { + "model" "models/gmod_tower/seusshat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Link Hat" + { + "model" "models/gmod_tower/linkhat.mdl" + "position" "0.0 -5.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Midna Hat" + { + "model" "models/gmod_tower/midnahat.mdl" + "position" "0.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Seuss Hat " + { + "model" "models/store/hats/seusshat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Andross Mask " + { + "model" "models/store/hats/androssmask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Afro " + { + "model" "models/store/hats/afro.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Fedora " + { + "model" "models/store/hats/fedorahat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "KFC Bucket " + { + "model" "models/store/hats/kfcbucket.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Asian Hat " + { + "model" "models/store/hats/asian_hat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Colonial Tricorn " + { + "model" "models/store/hats/colonial_tricorn_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Deku Scrub Mask " + { + "model" "models/store/hats/deku_scrub_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Goron Mask " + { + "model" "models/store/hats/goron_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Gumby Mask " + { + "model" "models/store/hats/gumby_mask_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Links Hat " + { + "model" "models/store/hats/links_hat_v4.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Uncle Sam " + { + "model" "models/store/hats/uncle_sam_hat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Daft Punk " + { + "model" "models/store/hats/daft_punk_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Zora Mask " + { + "model" "models/store/hats/zora_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Witch Hat " + { + "model" "models/store/hats/witchhat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + } + + "Masks" + { + "Porcelain Doll" + { + "model" "models/player/holiday/facemasks/porcelain_doll.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Zombie Fortune" + { + "model" "models/player/holiday/facemasks/facemask_zombie_fortune_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Wolf" + { + "model" "models/player/holiday/facemasks/facemask_wolf.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Tiki" + { + "model" "models/player/holiday/facemasks/facemask_tiki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Spy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_spy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Soldier" + { + "model" "models/player/holiday/facemasks/facemask_tf2_soldier_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sniper" + { + "model" "models/player/holiday/facemasks/facemask_tf2_sniper_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Scout" + { + "model" "models/player/holiday/facemasks/facemask_tf2_scout_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pyro" + { + "model" "models/player/holiday/facemasks/facemask_tf2_pyro_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Medic" + { + "model" "models/player/holiday/facemasks/facemask_tf2_medic_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Heavy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_heavy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Engineer" + { + "model" "models/player/holiday/facemasks/facemask_tf2_engi_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Demoman" + { + "model" "models/player/holiday/facemasks/facemask_tf2_demo_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull" + { + "model" "models/player/holiday/facemasks/facemask_skull.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_skull_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep" + { + "model" "models/player/holiday/facemasks/facemask_sheep_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Bloody)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_bloody.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Samurai" + { + "model" "models/player/holiday/facemasks/facemask_samurai.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pumpkin" + { + "model" "models/player/holiday/facemasks/facemask_pumpkin.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Porcelain Doll Kabuki" + { + "model" "models/player/holiday/facemasks/facemask_porcelain_doll_kabuki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Hoxton" + { + "model" "models/player/holiday/facemasks/facemask_hoxton.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Devil" + { + "model" "models/player/holiday/facemasks/facemask_devil_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Dallas" + { + "model" "models/player/holiday/facemasks/facemask_dallas.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chicken" + { + "model" "models/player/holiday/facemasks/facemask_chicken.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chains" + { + "model" "models/player/holiday/facemasks/facemask_chains.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Boar" + { + "model" "models/player/holiday/facemasks/facemask_boar.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Anaglyph" + { + "model" "models/player/holiday/facemasks/facemask_anaglyph.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Evil Clown" + { + "model" "models/player/holiday/facemasks/evil_clown.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + } + + "Glasses" + { + "3D Glasses" + { + "model" "models/gmod_tower/3dglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "3D Glasses " + { + "model" "models/store/hats/3dglasses.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + + "Aviators" + { + "model" "models/gmod_tower/aviators.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Star Glasses" + { + "model" "models/gmod_tower/starglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Kliener Glasses" + { + "model" "models/gmod_tower/klienerglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Star Glasses " + { + "model" "models/store/hats/starglasses.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + } + + "Shields" + { + "Hylian Shield" + { + "model" "models/store/hats/hylian_shield.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "2" + + "Attributes" + { + "health" "20" + } + } + } + } + + "Player Skins" + { + "Terrorists" + { + "Duke Nukem" + { + "model" "models/player/kuristaja/duke4eva/duke/duke.mdl" + "team" "2" + "price" "120" + "type" "playerskin" + } + } + + "Counter-Terrorists" + { + "Nick" + { + "model" "models/player/techknow/nick/nick.mdl" + "team" "3" + "price" "120" + "type" "playerskin" + } + } + } + + "Trails" + { + "8Bit Mushroom" + { + "material" "materials/sprites/store/trails/8bitmushroom.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "8Bit Pow" + { + "material" "materials/sprites/store/trails/8bitpow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce" + { + "material" "materials/sprites/store/trails/airforce.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce 2" + { + "material" "materials/sprites/store/trails/airforce2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Apple" + { + "material" "materials/sprites/store/trails/apple.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrow Rainbow" + { + "material" "materials/sprites/store/trails/arrowrainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrows" + { + "material" "materials/sprites/store/trails/arrows.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Assasin" + { + "material" "materials/sprites/store/trails/assasin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome" + { + "material" "materials/sprites/store/trails/awesome.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Sad" + { + "material" "materials/sprites/store/trails/awesome_sad.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Face" + { + "material" "materials/sprites/store/trails/awesomeface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Babyand" + { + "material" "materials/sprites/store/trails/babyand.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Banknote" + { + "material" "materials/sprites/store/trails/banknote.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Barcalona" + { + "material" "materials/sprites/store/trails/barcalona.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Batman" + { + "material" "materials/sprites/store/trails/batman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Battlefield" + { + "material" "materials/sprites/store/trails/battlefield.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Beer Mug" + { + "material" "materials/sprites/store/trails/beermug.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Biohazard" + { + "material" "materials/sprites/store/trails/biohazard.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blade" + { + "material" "materials/sprites/store/trails/blade.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blue Lightning" + { + "material" "materials/sprites/store/trails/bluelightning.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "BMW Logo" + { + "material" "materials/sprites/store/trails/bmwlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bom Bomb" + { + "material" "materials/sprites/store/trails/bombomb.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Boo" + { + "material" "materials/sprites/store/trails/boo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullet Bill" + { + "material" "materials/sprites/store/trails/bulletbill.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullets" + { + "material" "materials/sprites/store/trails/bullets.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Canada Flag" + { + "material" "materials/sprites/store/trails/canadaflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Candies" + { + "material" "materials/sprites/store/trails/candies.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ccole" + { + "material" "materials/sprites/store/trails/ccole.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + } + + "Grenade Trails" + { + "Thin Beam" + { + "material" "materials/sprites/combineball_trail_black_1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Squiggly Beam" + { + "material" "materials/sprites/hydragutbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Medium Beam" + { + "material" "materials/sprites/orangelight1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Large Beam" + { + "material" "materials/sprites/spotlight.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Red Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 0 255" + "unique_id" "grenadetrail_laserbeam_red" + } + + "Blue Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "0 0 255 255" + "unique_id" "grenadetrail_laserbeam_blue" + } + } + + "Grenade Skins" + { + "HE Grenade" + { + "Orange" + { + "model" "models/props/cs_italy/orange.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + + "Tortoise" + { + "model" "models/props/de_tides/vending_turtle.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + } + + "Flashbang" + { + "Banana" + { + "model" "models/props/cs_italy/bananna.mdl" + "grenade" "flashbang" + "price" "60" + "type" "grenadeskin" + } + } + + "Smokegrenade" + { + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "grenade" "smokegrenade" + "price" "60" + "type" "grenadeskin" + } + } + } + + "Weapon Colors" + { + "Antique White" + { + "color" "205 192 176 255" + "price" "60" + "type" "weaponcolor" + } + "Alice Blue" + { + "color" "240 248 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue" + { + "color" "0 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue Violet" + { + "color" "138 43 226 255" + "price" "60" + "type" "weaponcolor" + } + "Corn Silk" + { + "color" "255 248 220 255" + "price" "60" + "type" "weaponcolor" + } + "Cyan" + { + "color" "0 255 255 255" + "price" "60" + "type" "weaponcolor" + } + "Dark Khaki" + { + "color" "189 183 107 255" + "price" "60" + "type" "weaponcolor" + } + "Dim Grey" + { + "color" "105 105 105 255" + "price" "60" + "type" "weaponcolor" + } + "Fire Brick" + { + "color" "178 34 34 255" + "price" "60" + "type" "weaponcolor" + } + "Fuschia" + { + "color" "255 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Gray" + { + "color" "240 240 240 255" + "price" "60" + "type" "weaponcolor" + } + "Green" + { + "color" "0 255 0 255" + "price" "60" + "type" "weaponcolor" + } + "Hunter Green" + { + "color" "35 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Lawn Green" + { + "color" "124 1202 0 255" + "price" "60" + "type" "weaponcolor" + } + "Navajo White" + { + "color" "255 222 173 255" + "price" "60" + "type" "weaponcolor" + } + "Olive" + { + "color" "128 128 0 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Brown" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Drab" + { + "color" "607 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Orange" + { + "color" "255 77 0 255" + "price" "60" + "type" "weaponcolor" + } + "Orchid" + { + "color" "218 112 214 255" + "price" "60" + "type" "weaponcolor" + } + "Pale Turquoise" + { + "color" "175 238 238 255" + "price" "60" + "type" "weaponcolor" + } + "Purple" + { + "color" "128 0 128 255" + "price" "60" + "type" "weaponcolor" + } + "Pink" + { + "color" "255 103 103 255" + "price" "60" + "type" "weaponcolor" + } + "Plum" + { + "color" "221 160 221 255" + "price" "60" + "type" "weaponcolor" + } + "Red" + { + "color" "255 0 0 255" + "price" "60" + "type" "weaponcolor" + } + "Sea Blue" + { + "color" "43 176 205 255" + "price" "60" + "type" "weaponcolor" + } + "Sandy Brown" + { + "color" "244 164 96 255" + "price" "60" + "type" "weaponcolor" + } + "Sienna" + { + "color" "180 82 45 255" + "price" "60" + "type" "weaponcolor" + } + "Silver" + { + "color" "192 192 192 255" + "price" "60" + "type" "weaponcolor" + } + "Scarlet" + { + "color" "140 23 23 255" + "price" "60" + "type" "weaponcolor" + } + "Seal Green" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Steel Blue" + { + "color" "35 107 142 255" + "price" "60" + "type" "weaponcolor" + } + "Teal" + { + "color" "0 128 128 255" + "price" "60" + "type" "weaponcolor" + } + "Turquoise" + { + "color" "64 224 208 255" + "price" "60" + "type" "weaponcolor" + } + "Violet" + { + "color" "148 0 211 255" + "price" "60" + "type" "weaponcolor" + } + "Yellow" + { + "color" "255 255 0 255" + "price" "60" + "type" "weaponcolor" + } + } + + "Chat stuff" + { + "Name Tags" + { + "Newbie" + { + "tag" "{lightblue}[Newbie]{teamcolor} " + "price" "60" + "type" "nametag" + } + "Wannabe" + { + "tag" "{red}[Wannabe]{teamcolor} " + "price" "90" + "type" "nametag" + } + "Ex-Con" + { + "tag" "{black}[Ex-Con]{teamcolor} " + "price" "120" + "type" "nametag" + } + "Officer" + { + "tag" "{lightblue}[Officer]{teamcolor} " + "price" "120" + "type" "nametag" + } + "S.W.A.T" + { + "tag" "{blue}[S.W.A.T]{teamcolor} " + "price" "120" + "type" "nametag" + } + "420" + { + "tag" "{green}[420]{teamcolor} " + "price" "180" + "type" "nametag" + } + "Equinox" + { + "tag" "{pink}[Equinox]{teamcolor} " + "price" "300" + "type" "nametag" + } + } + + "Name Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "60" + "type" "namecolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "60" + "type" "namecolor" + } + + "Green" + { + "color" "{green}" + "price" "60" + "type" "namecolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "60" + "type" "namecolor" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "60" + "type" "namecolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "60" + "type" "namecolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "60" + "type" "namecolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + } + + "Message Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "120" + "type" "msgcolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "120" + "type" "msgcolor" + } + + "Green" + { + "color" "{green}" + "price" "120" + "type" "msgcolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "120" + "type" "msgcolor" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "120" + "type" "msgcolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "120" + "type" "msgcolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "120" + "type" "msgcolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + } + } + + "Miscellaneous" + { + "Bunnyhop" + { + "price" "500" + "type" "bunnyhop" + } + + "Jetpack" + { + "price" "500" + "type" "jetpack" + } + + "Paintball" + { + "price" "500" + "type" "paintball" + "Decals" + { + "cyan" + { + "material" "paintball/pb_cyan.vmt" + } + "green" + { + "material" "paintball/pb_green.vmt" + } + "pink" + { + "material" "paintball/pb_pink.vmt" + } + "orange" + { + "material" "paintball/pb_orange.vmt" + } + "yellow" + { + "material" "paintball/pb_yellow.vmt" + } + } + } + } + + "Unusual Effects" + { + "Flying Bits" + { + "unusual_id" "2" + "price" "180" + "type" "tfunusual" + } + + "Nemesis Burst" + { + "unusual_id" "3" + "price" "180" + "type" "tfunusual" + } + + "Community Sparkle" + { + "unusual_id" "4" + "price" "180" + "type" "tfunusual" + } + + "Holy Glow" + { + "unusual_id" "5" + "price" "180" + "type" "tfunusual" + } + + "Green Confetti" + { + "unusual_id" "6" + "price" "180" + "type" "tfunusual" + } + + "Purple Confetti" + { + "unusual_id" "7" + "price" "180" + "type" "tfunusual" + } + + "Haunted Ghosts" + { + "unusual_id" "8" + "price" "200" + "type" "tfunusual" + } + + "Green Energy" + { + "unusual_id" "9" + "price" "200" + "type" "tfunusual" + } + + "Purple Energy" + { + "unusual_id" "10" + "price" "200" + "type" "tfunusual" + } + + "Circling TF Logo" + { + "unusual_id" "11" + "price" "200" + "type" "tfunusual" + } + + "Massed Flies" + { + "unusual_id" "12" + "price" "200" + "type" "tfunusual" + } + + "Burning Flames" + { + "unusual_id" "13" + "price" "200" + "type" "tfunusual" + } + + "Scorching Flames" + { + "unusual_id" "14" + "price" "280" + "type" "tfunusual" + } + + "Searing Plasma" + { + "unusual_id" "15" + "price" "280" + "type" "tfunusual" + } + + "Vivid Plasma" + { + "unusual_id" "16" + "price" "280" + "type" "tfunusual" + } + + "Sunbeams" + { + "unusual_id" "17" + "price" "280" + "type" "tfunusual" + } + + "Circling Peace Sign" + { + "unusual_id" "18" + "price" "280" + "type" "tfunusual" + } + + "Circling Heart" + { + "unusual_id" "19" + "price" "280" + "type" "tfunusual" + } + + "Map Stamps" + { + "unusual_id" "20" + "price" "280" + "type" "tfunusual" + } + + "Genteel Smoke" + { + "unusual_id" "28" + "price" "360" + "type" "tfunusual" + } + + "Stormy Storm" + { + "unusual_id" "29" + "price" "360" + "type" "tfunusual" + } + + "Blizzardy Storm" + { + "unusual_id" "30" + "price" "360" + "type" "tfunusual" + } + + "Nuts n' Bolts" + { + "unusual_id" "31" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Planets" + { + "unusual_id" "32" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Fire" + { + "unusual_id" "33" + "price" "360" + "type" "tfunusual" + } + + "Bubbling" + { + "unusual_id" "34" + "price" "360" + "type" "tfunusual" + } + + "Smoking" + { + "unusual_id" "35" + "price" "360" + "type" "tfunusual" + } + + "Steaming" + { + "unusual_id" "36" + "price" "360" + "type" "tfunusual" + } + + "Flaming Lantern" + { + "unusual_id" "37" + "price" "360" + "type" "tfunusual" + } + + "Cloudy Moon" + { + "unusual_id" "38" + "price" "360" + "type" "tfunusual" + } + + "Cauldron Bubbles" + { + "unusual_id" "39" + "price" "360" + "type" "tfunusual" + } + + "Eerie Orbiting Fire" + { + "unusual_id" "40" + "price" "440" + "type" "tfunusual" + } + + "Knifestorm" + { + "unusual_id" "43" + "price" "440" + "type" "tfunusual" + } + + "Misty Skull" + { + "unusual_id" "44" + "price" "440" + "type" "tfunusual" + } + + "Harvest Moon" + { + "unusual_id" "45" + "price" "440" + "type" "tfunusual" + } + + "It's A Secret To Everybody" + { + "unusual_id" "46" + "price" "440" + "type" "tfunusual" + } + + "Stormy 13th Hour" + { + "unusual_id" "47" + "price" "440" + "type" "tfunusual" + } + + "Attrib_Particle55" + { + "unusual_id" "55" + "price" "440" + "type" "tfunusual" + } + + "Kill-a-Watt" + { + "unusual_id" "56" + "price" "440" + "type" "tfunusual" + } + + "Terror-Watt" + { + "unusual_id" "57" + "price" "440" + "type" "tfunusual" + } + + "Cloud 9" + { + "unusual_id" "58" + "price" "440" + "type" "tfunusual" + } + + "Aces High" + { + "unusual_id" "59" + "price" "440" + "type" "tfunusual" + } + + "Dead Presidents" + { + "unusual_id" "180" + "type" "tfunusual" + "price" "440" + "type" "tfunusual" + } + + "Miami Nights" + { + "unusual_id" "61" + "price" "180" + "type" "tfunusual" + } + + "Disco Beat Down" + { + "unusual_id" "62" + "price" "520" + "type" "tfunusual" + } + + "Phosphorous" + { + "unusual_id" "63" + "price" "520" + "type" "tfunusual" + } + + "Sulphurous" + { + "unusual_id" "64" + "price" "520" + "type" "tfunusual" + } + + "Memory Leak" + { + "unusual_id" "65" + "price" "520" + "type" "tfunusual" + } + + "Overclocked" + { + "unusual_id" "66" + "price" "520" + "type" "tfunusual" + } + + "Electrostatic" + { + "unusual_id" "67" + "price" "520" + "type" "tfunusual" + } + + "Power Surge" + { + "unusual_id" "68" + "price" "520" + "type" "tfunusual" + } + + "Anti-Freeze" + { + "unusual_id" "69" + "price" "520" + "type" "tfunusual" + } + + "Time Warp" + { + "unusual_id" "70" + "price" "520" + "type" "tfunusual" + } + + "Green Black Hole" + { + "unusual_id" "71" + "price" "520" + "type" "tfunusual" + } + + "Roboactive" + { + "unusual_id" "72" + "price" "520" + "type" "tfunusual" + } + + "Arcana" + { + "unusual_id" "73" + "price" "520" + "type" "tfunusual" + } + + "Spellbound" + { + "unusual_id" "74" + "price" "600" + "type" "tfunusual" + } + + "Chiroptera Venenata" + { + "unusual_id" "75" + "price" "600" + "type" "tfunusual" + } + + "Poisoned Shadows" + { + "unusual_id" "76" + "price" "600" + "type" "tfunusual" + } + + "Something Burning This Way Comes" + { + "unusual_id" "77" + "price" "600" + "type" "tfunusual" + } + + "Hellfire" + { + "unusual_id" "78" + "price" "600" + "type" "tfunusual" + } + + "Darkblaze" + { + "unusual_id" "79" + "price" "600" + "type" "tfunusual" + } + + "Demonflame" + { + "unusual_id" "80" + "price" "600" + "type" "tfunusual" + } + + "Showstopper" + { + "unusual_id" "3002" + "price" "600" + "type" "tfunusual" + } + + "Holy Grail" + { + "unusual_id" "3003" + "price" "600" + "type" "tfunusual" + } + "Fountain of Delight" + { + "unusual_id" "3005" + "price" "600" + "type" "tfunusual" + } + + "Screaming Tiger" + { + "unusual_id" "3006" + "price" "600" + "type" "tfunusual" + } + + "Skill Gotten Gains" + { + "unusual_id" "3007" + "price" "600" + "type" "tfunusual" + } + + "Midnight Whirlwind" + { + "unusual_id" "3008" + "price" "600" + "type" "tfunusual" + } + + "Silver Cyclone" + { + "unusual_id" "3009" + "price" "600" + "type" "tfunusual" + } + + "Mega Strike" + { + "unusual_id" "3010" + "price" "600" + "type" "tfunusual" + } + } + + "Paint Cans" + { + "A Color Similar to Slate" + { + "color" "47 79 79" + "price" "60" + "type" "tyhatdye" + } + + "A Deep Commitment to Purple" + { + "color" "125 64 113" + "price" "60" + "type" "tyhatdye" + } + + "A Distinctive Lack of Hue" + { + "color" "20 20 20" + "price" "60" + "type" "tyhatdye" + } + + "A Mann's Mint" + { + "color" "188 221 179" + "price" "60" + "type" "tyhatdye" + } + + "After Eight" + { + "color" "45 45 36" + "price" "60" + "type" "tyhatdye" + } + + "Aged Moustache Grey" + { + "color" "126 126 126" + "price" "60" + "type" "tyhatdye" + } + + "An Extraordinary Abundance of Tinge" + { + "color" "230 230 230" + "price" "60" + "type" "tyhatdye" + } + + "Australium Gold" + { + "color" "231 181 59" + "price" "60" + "type" "tyhatdye" + } + + "Color No. 216-190-216 " + { + "color" "216 190 216" + "price" "60" + "type" "tyhatdye" + } + + "Dark Salmon Injustice" + { + "color" "233 150 122" + "price" "60" + "type" "tyhatdye" + } + + "Drably Olive" + { + "color" "128 128 0" + "price" "60" + "type" "tyhatdye" + } + + "Indubitably Green" + { + "color" "114 158 66" + "price" "60" + "type" "tyhatdye" + } + + "Mann Co. Orange" + { + "color" "207 115 54" + "price" "60" + "type" "tyhatdye" + } + + "Muskelmannbraun" + { + "color" "165 117 69" + "price" "60" + "type" "tyhatdye" + } + + "Noble Hatter's Violet" + { + "color" "81 56 74" + "price" "60" + "type" "tyhatdye" + } + + "Peculiarly Drab Tincture" + { + "color" "197 175 145" + "price" "60" + "type" "tyhatdye" + } + "Pink as Hell" + { + "color" "255 105 180" + "price" "60" + "type" "tyhatdye" + } + + "Radigan Conagher Brown" + { + "color" "105 77 58" + "price" "60" + "type" "tyhatdye" + } + + "The Bitter Taste of Defeat and Lime" + { + "color" "50 205 50" + "price" "60" + "type" "tyhatdye" + } + + "The Color of a Gentlemann's Business Pants" + { + "color" "240 230 140" + "price" "60" + "type" "tyhatdye" + } + + "Ye Olde Rustic Colour" + { + "color" "124 108 87" + "price" "60" + "type" "tyhatdye" + } + + "Zepheniah's Greed" + { + "color" "66 79 59" + "price" "60" + "type" "tyhatdye" + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/configs/store/items_weapons.txt b/addons/sourcemod/configs/store/items_weapons.txt new file mode 100644 index 0000000..d170ec4 --- /dev/null +++ b/addons/sourcemod/configs/store/items_weapons.txt @@ -0,0 +1,10292 @@ +"Store" +{ + + "Weapon Skins" + { + "M4A1-S Hyper Beast" + { + "paint" "430" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Mag7 RedHot" + { + "paint" "431" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Negev Glory" + { + "paint" "432" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Mac10 NeonRider" + { + "paint" "433" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Sawedoff Origami" + { + "paint" "434" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "CZ75 Precision" + { + "paint" "435" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "UMP45 RACER" + { + "paint" "436" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Famas Jinn " + { + "paint" "429" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Galil Eco" + { + "paint" "428" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Five Seven Banana" + { + "paint" "427" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "P250 Contour" + { + "paint" "426" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "AWP Twine" + { + "paint" "424" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "MP9 Ultra Modern" + { + "paint" "423" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Ak47 Maestry" + { + "paint" "422" + "wear" "0.01" + "stattrak" "1" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + "Abyss" + { + + "paint" "361" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Acid Fade" + { + + "paint" "253" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Afterimage" + { + + "paint" "154" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Amber Fade" + { + + "paint" "246" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Gunmetal" + { + + "paint" "210" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Navy" + { + + "paint" "28" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Anodized Navy (2)" + { + + "paint" "197" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Antique (Nova)" + { + + "paint" "286" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Antique (PP-Bizon)" + { + + "paint" "306" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Arctic Camo" + { + + "paint" "6" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Mesh" + { + + "paint" "242" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Recon" + { + + "paint" "245" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Army Sheen" + { + + "paint" "298" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ash Wood" + { + + "paint" "234" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (AWP)" + { + + "paint" "279" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (M4A4)" + { + + "paint" "255" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Asiimov (P90)" + { + + "paint" "359" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Atomic Alloy" + { + + "paint" "301" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Azure Zebra" + { + + "paint" "229" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Basilisk" + { + + "paint" "383" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bengal Tiger" + { + + "paint" "9" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Black Laminate" + { + + "paint" "172" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Black Limba" + { + + "paint" "190" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blaze" + { + + "paint" "37" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blaze Orange" + { + + "paint" "166" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blind Spot" + { + + "paint" "228" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blizzard Marbelized" + { + + "paint" "75" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blood In The Water" + { + + "paint" "222" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blood Tiger" + { + + "paint" "217" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bloomstick" + { + + "paint" "62" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Fissure" + { + + "paint" "278" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Laminate" + { + + "paint" "226" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Steel" + { + + "paint" "42" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Spruce" + { + + "paint" "96" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Streak" + { + + "paint" "13" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Blue Titanium" + { + + "paint" "216" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Mask" + { + + "paint" "27" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Machine" + { + + "paint" "370" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bone Pile" + { + + "paint" "193" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "BOOM" + { + + "paint" "174" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Boreal Forest" + { + + "paint" "77" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Brass" + { + + "paint" "159" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bratatat" + { + + "paint" "317" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Briar" + { + + "paint" "330" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bright Water" + { + + "paint" "189" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bulldozer" + { + + "paint" "39" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Bullet Rain" + { + + "paint" "155" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Business Class" + { + + "paint" "364" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caged Steel" + { + + "paint" "299" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caiman" + { + + "paint" "339" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "CaliCamo" + { + + "paint" "240" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Candy Apple" + { + + "paint" "3" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Caramel" + { + + "paint" "93" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Carbon Fiber" + { + + "paint" "70" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cardiac" + { + + "paint" "391" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cartel (AK-47)" + { + + "paint" "394" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cartel (P250)" + { + + "paint" "388" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Case Hardened" + { + + "paint" "44" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Catacombs" + { + + "paint" "399" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cerberus" + { + + "paint" "379" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chainmail" + { + + "paint" "327" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chalice" + { + + "paint" "325" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chameleon" + { + + "paint" "280" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chatterbox" + { + + "paint" "398" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Chemical Green" + { + + "paint" "376" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Coach Class" + { + + "paint" "346" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Disruption" + { + + "paint" "231" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Halftone" + { + + "paint" "267" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cobalt Quartz" + { + + "paint" "249" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cold Blooded" + { + + "paint" "67" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Colony" + { + + "paint" "47" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Commuter" + { + + "paint" "343" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Condemned" + { + + "paint" "110" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Conspiracy" + { + + "paint" "351" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contamination" + { + + "paint" "373" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contractor" + { + + "paint" "46" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Contrast Spray" + { + + "paint" "22" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corporal" + { + + "paint" "281" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corticera (AWP)" + { + + "paint" "184" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Corticera (P2000)" + { + + "paint" "181" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper" + { + + "paint" "41" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper Galaxy" + { + + "paint" "274" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Copper Head" + { + + "paint" "10" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Crimson Web" + { + + "paint" "12" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Crimson Web (2)" + { + + "paint" "232" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Curse" + { + + "paint" "310" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyanospatter" + { + + "paint" "92" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyrex (M4A1-S" + { + + "paint" "360" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Cyrex (SCAR-20)" + { + + "paint" "312" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (1)" + + + { + + "paint" "410" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (2)" + { + + "paint" "411" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Damascus Steel (3)" + { + + "paint" "247" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dark Age" + { + + "paint" "329" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dark Water" + { + + "paint" "60" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dart" + { + + "paint" "386" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Deadly Poison" + { + + "paint" "403" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Death By Kitty" + { + + "paint" "156" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Death Rattle" + { + + "paint" "293" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Delusion" + { + + "paint" "392" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Demeter" + { + + "paint" "195" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Demolition" + { + + "paint" "153" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Detour" + { + + "paint" "319" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert Storm" + { + + "paint" "8" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert-Strike (M4A4)" + { + + "paint" "336" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert-Strike (Negev)" + { + + "paint" "355" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Desert Warfare" + { + + "paint" "311" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doomkitty" + { + + "paint" "178" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 1)" + { + + "paint" "418" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 2)" + { + + "paint" "419" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 3)" + { + + "paint" "420" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Phase 4)" + { + + "paint" "421" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Black Pearl)" + { + + "paint" "417" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Ruby)" + { + + "paint" "415" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Doppler (Sapphire)" + { + + "paint" "416" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon King" + { + + "paint" "400" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon Lore" + { + + "paint" "344" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dragon Tattoo" + { + + "paint" "48" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Dry Season" + { + + "paint" "199" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Electric Hive" + { + + "paint" "227" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald" + { + + "paint" "196" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald Dragon" + { + + "paint" "182" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Emerald Pinstripe" + { + + "paint" "300" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Facets" + { + + "paint" "207" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fade" + { + + "paint" "38" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Faded Zebra" + { + + "paint" "176" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fallout Warning (1)" + { + + "paint" "169" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fallout Warning (2)" + { + + "paint" "378" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fire Elemental" + { + + "paint" "389" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fire Serpent" + { + + "paint" "180" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Firestarter" + { + + "paint" "385" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "First Class (AK-47)" + { + + "paint" "341" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "First Class (Sawed-Off)" + { + + "paint" "345" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest DDPAT" + { + + "paint" "5" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest Leaves" + { + + "paint" "25" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Forest Night" + { + + "paint" "78" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Fowl Play" + { + + "paint" "352" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Franklin" + { + + "paint" "295" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Full Stop" + { + + "paint" "250" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Gator Mesh" + { + + "paint" "243" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ghost Camo" + { + + "paint" "225" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Glacier Mesh" + { + + "paint" "111" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Golden Koi" + { + + "paint" "185" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Granite Marbelized" + { + + "paint" "21" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graphite (1)" + { + + "paint" "214" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graphite (2)" + { + + "paint" "212" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grassland" + { + + "paint" "95" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grassland Leaves" + { + + "paint" "104" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Graven" + { + + "paint" "188" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Green Apple" + { + + "paint" "294" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Green Plaid" + { + + "paint" "366" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Griffin" + { + + "paint" "384" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grinder" + { + + "paint" "381" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Grotto" + { + + "paint" "406" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Groundwater (1)" + { + + "paint" "2" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Groundwater (2)" + { + + "paint" "209" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Guardian (1)" + { + + "paint" "257" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Guardian (2)" + { + + "paint" "290" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Gun Smoke" + { + + "paint" "15" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hand Cannon" + { + + "paint" "328" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hazard (1)" + { + + "paint" "101" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hazard (2)" + { + + "paint" "198" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heat" + { + + "paint" "284" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heaven Guard (MAG-7)" + { + + "paint" "291" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heaven Guard (XM1014)" + { + + "paint" "314" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Heirloom" + { + + "paint" "273" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hemoglobin" + { + + "paint" "220" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hexane" + { + + "paint" "218" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Highwayman" + { + + "paint" "390" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hive" + { + + "paint" "219" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hot Rod" + { + + "paint" "33" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hot Shot" + { + + "paint" "377" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Howl" + { + + "paint" "309" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hunting Blind" + { + + "paint" "241" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Hypnotic" + { + + "paint" "61" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Indigo" + { + + "paint" "333" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Irradiated Alert" + { + + "paint" "171" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Isaac" + { + + "paint" "303" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ivory" + { + + "paint" "357" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jaguar" + { + + "paint" "316" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jet Set" + { + + "paint" "340" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle (1)" + { + + "paint" "151" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle (2)" + { + + "paint" "205" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Dashed" + { + + "paint" "147" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle DDPAT" + { + + "paint" "202" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Spray" + { + + "paint" "122" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Jungle Tiger" + { + + "paint" "16" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Kami (1)" + { + + "paint" "265" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Kami (2)" + { + + "paint" "308" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Knight" + { + + "paint" "326" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Koi" + { + + "paint" "356" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "The Kraken" + { + + "paint" "256" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Labyrinth" + { + + "paint" "362" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Leather" + { + + "paint" "342" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Lichen Dashed" + { + + "paint" "26" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Lightning Strike" + { + + "paint" "51" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Magma" + { + + "paint" "266" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Malachite" + { + + "paint" "402" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Man-O'-War" + { + + "paint" "395" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Marble Fade" + { + + "paint" "413" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Marina" + { + + "paint" "261" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Master Piece" + { + + "paint" "321" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mayan Dreams" + { + + "paint" "200" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mehndi" + { + + "paint" "258" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Memento" + { + + "paint" "177" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Metallic DDPAT" + { + + "paint" "34" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Meteorite" + { + + "paint" "296" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Modern Hunter" + { + + "paint" "164" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Module" + { + + "paint" "335" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mosaico" + { + + "paint" "204" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Mudder" + { + + "paint" "90" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Muertos" + { + + "paint" "404" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Murky" + { + + "paint" "382" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Naga" + { + + "paint" "397" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Night" + { + + "paint" "40" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Night Ops" + { + + "paint" "236" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nightshade" + { + + "paint" "223" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nitro (CZ-75)" + { + + "paint" "322" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nitro (M4A1-S)" + { + + "paint" "254" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Garden" + { + + "paint" "372" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Threat (1)" + { + + "paint" "168" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Threat (2)" + { + + "paint" "179" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Nuclear Waste" + { + + "paint" "369" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ocean Foam (MP7)" + { + + "paint" "211" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ocean Foam (P2000)" + { + + "paint" "213" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Olive Plaid" + { + + "paint" "365" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orange DDPAT" + { + + "paint" "83" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orange Peel" + { + + "paint" "141" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Orion" + { + + "paint" "313" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Osiris" + { + + "paint" "349" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ossified" + { + + "paint" "36" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Overgrowth" + { + + "paint" "183" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Palm (1)" + { + + "paint" "157" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Palm (2)" + { + + "paint" "201" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Panther" + { + + "paint" "276" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pilot" + { + + "paint" "347" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pink DDPAT" + { + + "paint" "84" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pit Viper" + { + + "paint" "251" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Poison Dart" + { + + "paint" "315" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Polar Camo" + { + + "paint" "74" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Polar Mesh" + { + + "paint" "107" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Predator" + { + + "paint" "170" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (FAMAS)" + { + + "paint" "260" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (P2000)" + { + + "paint" "338" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Pulse (SG553)" + { + + "paint" "287" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Quicksilver" + { + + "paint" "407" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + + + "Radiation Hazard (1)" + { + + "paint" "167" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Radiation Hazard (2)" + { + + "paint" "375" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Reactor" + { + + "paint" "367" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Redline (AK-47)" + { + + "paint" "282" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + + + "Redline (AWP)" + { + + "paint" "259" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Laminate" + { + + "paint" "14" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Leather" + { + + "paint" "348" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Fragcam" + { + + "paint" "275" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Python" + { + + "paint" "320" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Red Quartz" + { + + "paint" "248" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Retribution" + { + + "paint" "307" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rising Skull" + { + + "paint" "263" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Road Rash" + { + + "paint" "318" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rose Iron" + { + + "paint" "262" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Royal Blue" + { + + "paint" "332" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (1)" + { + + "paint" "323" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (2)" + { + + "paint" "203" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Rust Coat (3)" + { + + "paint" "414" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Safari Mesh" + { + + "paint" "72" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sage Spray" + { + + "paint" "119" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sandstorm (1)" + { + + "paint" "264" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sandstorm (2)" + { + + "paint" "289" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dashed" + { + + "paint" "148" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dune (1)" + { + + "paint" "99" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Dune (2)" + { + + "paint" "208" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Mesh" + { + + "paint" "116" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sand Spray" + { + + "paint" "124" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Scorched" + { + + "paint" "175" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Scorpion" + { + + "paint" "71" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Sergeant" + { + + "paint" "288" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Serenity" + { + + "paint" "405" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Serum" + { + + "paint" "221" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Setting Sun" + { + + "paint" "368" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Shattered" + { + + "paint" "192" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Silver" + { + + "paint" "32" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + + + } + + "Silver Quartz" + { + + "paint" "252" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Skulls" + { + + "paint" "11" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Slashed" + { + + "paint" "304" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Slaughter" + { + + "paint" "59" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Snake Camo" + { + + "paint" "30" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Spitfire" + { + + "paint" "194" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Splash" + { + + "paint" "162" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Splash Jam" + { + + "paint" "165" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Stained" + { + + "paint" "43" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Stainless" + { + + "paint" "277" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Steel Disruption" + { + + "paint" "230" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Storm" + { + + "paint" "100" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Styx" + { + + "paint" "371" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Supernova" + { + + "paint" "358" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "System Lock" + { + + "paint" "401" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tatter" + { + + "paint" "337" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Teardown" + { + + "paint" "244" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tempest" + { + + "paint" "191" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Terrain" + { + + "paint" "285" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "The Fuschia Is Now" + { + + "paint" "269" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tiger Tooth" + { + + "paint" "409" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tigris" + { + + "paint" "350" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Titanium Bit" + { + + "paint" "272" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tornado" + { + + "paint" "206" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Torque" + { + + "paint" "305" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Toxic" + { + + "paint" "374" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tranquility" + { + + "paint" "393" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Traveler" + { + + "paint" "363" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tread Plate" + { + + "paint" "268" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Trigon" + { + + "paint" "283" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tropical Storm" + { + + "paint" "233" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Tuxedo" + { + + "paint" "297" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Twist" + { + + "paint" "334" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Ultraviolet" + { + + "paint" "98" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Undertow" + { + + "paint" "271" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Dashed" + { + + "paint" "149" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban DDPAT" + { + + "paint" "17" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Hazard (1)" + { + + "paint" "387" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Hazard (2)" + { + + "paint" "354" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Masked" + { + + "paint" "143" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Perforated" + { + + "paint" "135" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Rubble" + { + + "paint" "237" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Urban Shock" + { + + "paint" "396" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "VariCamo" + { + + "paint" "235" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "VariCamo Blue" + { + + "paint" "238" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Victoria" + { + + "paint" "270" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Walnut" + { + + "paint" "158" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wasteland Rebel" + { + + "paint" "380" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Water Elemental" + { + + "paint" "353" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Water Sigil" + { + + "paint" "224" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wave Spray" + { + + "paint" "186" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Waves Perforated" + { + + "paint" "136" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Whiteout" + { + + "paint" "102" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Wings" + { + + "paint" "73" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Winter Forest" + { + + "paint" "76" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Virus" + { + + "paint" "20" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Vulcan" + { + + "paint" "302" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "X-RAY" + { + + "paint" "215" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + + "Zirka" + { + + "paint" "187" + "wear" "0.01" + "stattrak" "2015" + "quality" "3" + "type" "weaponskin" + "price" "100" + } + } + + "Pets" + { + "Chicken" + { + "model" "models/chicken/chicken.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Chicken Zombie" + { + "model" "models/chicken/chicken_zombie.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "idle01" + "run" "run01" + "price" "100" + "type" "pet" + } + + "Crow" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "crow_running" + "price" "100" + "type" "pet" + } + + "Crow Flying" + { + "model" "models/crow.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "crow_flying" + "price" "100" + "type" "pet" + } + + "Pigeon" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "pigeon_running" + "price" "100" + "type" "pet" + } + + "Pigeon Flying" + { + "model" "models/pigeon.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly01" + "run" "Fly01" + "unique_id" "pigeon_flying" + "price" "100" + "type" "pet" + } + + "Seagull" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "idle" "Idle01" + "run" "Run" + "unique_id" "seagull_running" + "price" "100" + "type" "pet" + } + + "Seagull Flying" + { + "model" "models/seagull.mdl" + "position" "50.0 0.0 70.0" + "angles" "0.0 0.0 0.0" + "idle" "Fly" + "run" "Fly" + "unique_id" "seagull_flying" + "price" "100" + "type" "pet" + } + } + + "Knives" + { + "Bayonet" + { + "entity" "weapon_bayonet" + "defindex" "500" + "type" "knife" + "price" "100" + } + + "Gut" + { + "entity" "weapon_knife_gut" + "defindex" "506" + "type" "knife" + "price" "100" + } + + "Flip" + { + "entity" "weapon_knife_flip" + "defindex" "505" + "type" "knife" + "price" "100" + } + + "M9 Bayonet" + { + "entity" "weapon_knife_m9_bayonet" + "defindex" "508" + "type" "knife" + "price" "100" + } + + "Karambit" + { + "entity" "weapon_knife_karambit" + "defindex" "507" + "type" "knife" + "price" "100" + } + + "Golden" + { + "entity" "weapon_knifegg" + "type" "knife" + "price" "100" + } + + "Tactical" + { + "entity" "weapon_knife_tactical" + "defindex" "509" + "type" "knife" + "price" "100" + } + + "Butterfly" + { + "entity" "weapon_knife_butterfly" + "defindex" "515" + "type" "knife" + "price" "100" + } + + "Falchion" + { + "entity" "weapon_knife_falchion" + "defindex" "512" + "type" "knife" + "price" "100" + } + } + + "Tracers" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "tracer" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "tracer" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "tracer" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "tracer" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "tracer" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "tracer" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "tracer" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "tracer" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "tracer" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "tracer" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "tracer" + } + } + + "Laser Sight" + { + "Blue" + { + "color" "0 0 125" + "price" "120" + "type" "lasersight" + } + "Blue Violet" + { + "color" "138 43 226" + "price" "120" + "type" "lasersight" + } + "Cyan" + { + "color" "0 255 125" + "price" "120" + "type" "lasersight" + } + "Fire Brick" + { + "color" "178 34 34" + "price" "120" + "type" "lasersight" + } + "Fuschia" + { + "color" "125 0 125" + "price" "120" + "type" "lasersight" + } + "Gray" + { + "color" "240 240 240" + "price" "120" + "type" "lasersight" + } + "Green" + { + "color" "0 125 0" + "price" "120" + "type" "lasersight" + } + "Hunter Green" + { + "color" "35 142 35" + "price" "120" + "type" "lasersight" + } + "Lawn Green" + { + "color" "124 122 0" + "price" "120" + "type" "lasersight" + } + "Olive Brown" + { + "color" "128 125 165" + "price" "120" + "type" "lasersight" + } + + "Orange" + { + "color" "125 77 0" + "price" "120" + "type" "lasersight" + } + } + + "Accessories" + { + "Hats" + { + "Spartan Helmet" + { + "model" "models/spartahelm/spartahelm.mdl" + "position" "0.0 -2.2 -68.4" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Ironman" + { + "model" "models/fo3_ironman_mask.mdl" + "position" "1.0 -4.6 -2.0" + "angles" "0.0 -90.0 -20.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "V Mask" + { + "model" "models/v/mask.mdl" + "position" "0.0 -5.2 -65.2" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Pika Hat" + { + "model" "models/pikahat/pikahat.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Mudkip Hat" + { + "model" "models/mudhatk/mudhatk.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Super Saiyan" + { + "model" "models/anime_patron/animepatr.mdl" + "position" "0.0 -2.2 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Sentry" + { + "model" "models/sentry_hat/sentryha.mdl" + "position" "0.0 -1.7 -68.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Pedo Bear" + { + "model" "models/pedobear/pedobearf.mdl" + "position" "0.0 -1.7 -70.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Antlers" + { + "model" "models/sam/antlers.mdl" + "position" "0.0 0.0 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Car Tire" + { + "model" "models/props_vehicles/tire001c_car.mdl" + "position" "0.0 -10.0 0.0" + "angles" "90.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "position" "0.0 0.0 5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Traffic Cone" + { + "model" "models/props_junk/trafficcone001a.mdl" + "position" "0.0 -1.0 20.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Metal Bucket" + { + "model" "models/props_junk/metalbucket01a.mdl" + "position" "0.0 0.0 -8.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Terracotta" + { + "model" "models/props_junk/terracotta01.mdl" + "position" "0.0 3.0 -10.0" + "angles" "180.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Baseball Cap" + { + "model" "models/props/cs_office/snowman_hat.mdl" + "position" "0.0 0.0 7.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Coffee Mug" + { + "model" "models/props/cs_office/coffee_mug.mdl" + "position" "0.0 0.0 9.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "I <3 Turtles" + { + "model" "models/props/de_tides/vending_hat.mdl" + "position" "1.8 0.0 4.0" + "angles" "0.0 -90.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Astronaut helmet" + { + "model" "models/astronauthelmet/astronauthelmet.mdl" + "position" "0.0 0.0 -5.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Viking helmet" + { + "model" "models/vikinghelmet/vikinghelmet.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Fedora" + { + "model" "models/gmod_tower/fedorahat.mdl" + "position" "0.0 -1.5 8.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "KFC Bucket" + { + "model" "models/gmod_tower/kfcbucket.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Cake Hat" + { + "model" "models/cakehat/cakehat.mdl" + "position" "0.0 -1.0 3.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Santa Hat" + { + "model" "models/santahat/santahat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Dunce Hat" + { + "model" "models/duncehat/duncehat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Sombrero" + { + "model" "models/gmod_tower/sombrero.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Cat Ears" + { + "model" "models/gmod_tower/catears.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Afro" + { + "model" "models/gmod_tower/afro.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Andross Mask" + { + "model" "models/gmod_tower/androssmask.mdl" + "position" "0.0 2.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Drink Cap" + { + "model" "models/gmod_tower/drinkcap.mdl" + "position" "0.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Headcrab Hat" + { + "model" "models/gmod_tower/headcrabhat.mdl" + "position" "0.0 -3.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Majorasmask" + { + "model" "models/gmod_tower/majorasmask.mdl" + "position" "0.0 0.5 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Toromask" + { + "model" "models/gmod_tower/toromask.mdl" + "position" "0.0 -1.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Top Hat" + { + "model" "models/gmod_tower/tophat.mdl" + "position" "0.0 -1.7 4.5" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Witch Hat" + { + "model" "models/gmod_tower/witchhat.mdl" + "position" "0.0 0.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Toeto Hat" + { + "model" "models/gmod_tower/toetohat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Party Hat" + { + "model" "models/gmod_tower/partyhat.mdl" + "position" "1.0 -1.0 7.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Seuss Hat" + { + "model" "models/gmod_tower/seusshat.mdl" + "position" "0.0 -1.0 6.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Link Hat" + { + "model" "models/gmod_tower/linkhat.mdl" + "position" "0.0 -5.0 4.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Midna Hat" + { + "model" "models/gmod_tower/midnahat.mdl" + "position" "0.0 0.0 0.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "0" + } + + "Seuss Hat " + { + "model" "models/store/hats/seusshat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Andross Mask " + { + "model" "models/store/hats/androssmask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Afro " + { + "model" "models/store/hats/afro.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Fedora " + { + "model" "models/store/hats/fedorahat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "KFC Bucket " + { + "model" "models/store/hats/kfcbucket.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Asian Hat " + { + "model" "models/store/hats/asian_hat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Colonial Tricorn " + { + "model" "models/store/hats/colonial_tricorn_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Deku Scrub Mask " + { + "model" "models/store/hats/deku_scrub_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Goron Mask " + { + "model" "models/store/hats/goron_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Gumby Mask " + { + "model" "models/store/hats/gumby_mask_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Links Hat " + { + "model" "models/store/hats/links_hat_v4.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Uncle Sam " + { + "model" "models/store/hats/uncle_sam_hat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Daft Punk " + { + "model" "models/store/hats/daft_punk_v1.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Zora Mask " + { + "model" "models/store/hats/zora_mask.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "0" + } + + "Witch Hat " + { + "model" "models/store/hats/witchhat.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + } + + "Masks" + { + "Porcelain Doll" + { + "model" "models/player/holiday/facemasks/porcelain_doll.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Zombie Fortune" + { + "model" "models/player/holiday/facemasks/facemask_zombie_fortune_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Wolf" + { + "model" "models/player/holiday/facemasks/facemask_wolf.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Tiki" + { + "model" "models/player/holiday/facemasks/facemask_tiki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Spy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_spy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + + "Soldier" + { + "model" "models/player/holiday/facemasks/facemask_tf2_soldier_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sniper" + { + "model" "models/player/holiday/facemasks/facemask_tf2_sniper_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Scout" + { + "model" "models/player/holiday/facemasks/facemask_tf2_scout_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pyro" + { + "model" "models/player/holiday/facemasks/facemask_tf2_pyro_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Medic" + { + "model" "models/player/holiday/facemasks/facemask_tf2_medic_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Heavy" + { + "model" "models/player/holiday/facemasks/facemask_tf2_heavy_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Engineer" + { + "model" "models/player/holiday/facemasks/facemask_tf2_engi_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Demoman" + { + "model" "models/player/holiday/facemasks/facemask_tf2_demo_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull" + { + "model" "models/player/holiday/facemasks/facemask_skull.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Skull (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_skull_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep" + { + "model" "models/player/holiday/facemasks/facemask_sheep_model.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_gold.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Sheep (Bloody)" + { + "model" "models/player/holiday/facemasks/facemask_sheep_bloody.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Samurai" + { + "model" "models/player/holiday/facemasks/facemask_samurai.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Pumpkin" + { + "model" "models/player/holiday/facemasks/facemask_pumpkin.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Porcelain Doll Kabuki" + { + "model" "models/player/holiday/facemasks/facemask_porcelain_doll_kabuki.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Hoxton" + { + "model" "models/player/holiday/facemasks/facemask_hoxton.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Devil" + { + "model" "models/player/holiday/facemasks/facemask_devil_plastic.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Dallas" + { + "model" "models/player/holiday/facemasks/facemask_dallas.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chicken" + { + "model" "models/player/holiday/facemasks/facemask_chicken.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Chains" + { + "model" "models/player/holiday/facemasks/facemask_chains.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Bunny (Gold)" + { + "model" "models/player/holiday/facemasks/facemask_bunny.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Boar" + { + "model" "models/player/holiday/facemasks/facemask_boar.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Anaglyph" + { + "model" "models/player/holiday/facemasks/facemask_anaglyph.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + + "Evil Clown" + { + "model" "models/player/holiday/facemasks/evil_clown.mdl" + "attachment" "facemask" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "3" + } + } + + "Glasses" + { + "3D Glasses" + { + "model" "models/gmod_tower/3dglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "3D Glasses " + { + "model" "models/store/hats/3dglasses.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + + "Aviators" + { + "model" "models/gmod_tower/aviators.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Star Glasses" + { + "model" "models/gmod_tower/starglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Kliener Glasses" + { + "model" "models/gmod_tower/klienerglasses.mdl" + "position" "0.0 0.5 2.0" + "angles" "0.0 0.0 0.0" + "price" "120" + "type" "hat" + "games" "cstrike" + "slot" "1" + } + + "Star Glasses " + { + "model" "models/store/hats/starglasses.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "1" + } + } + + "Shields" + { + "Hylian Shield" + { + "model" "models/store/hats/hylian_shield.mdl" + "bonemerge" "1" + "price" "120" + "type" "hat" + "games" "csgo" + "slot" "2" + + "Attributes" + { + "health" "20" + } + } + } + } + + "Player Skins" + { + "Terrorists" + { + "Duke Nukem" + { + "model" "models/player/kuristaja/duke4eva/duke/duke.mdl" + "team" "2" + "price" "120" + "type" "playerskin" + } + } + + "Counter-Terrorists" + { + "Nick" + { + "model" "models/player/techknow/nick/nick.mdl" + "team" "3" + "price" "120" + "type" "playerskin" + } + } + } + + "Trails" + { + "8Bit Mushroom" + { + "material" "materials/sprites/store/trails/8bitmushroom.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "8Bit Pow" + { + "material" "materials/sprites/store/trails/8bitpow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce" + { + "material" "materials/sprites/store/trails/airforce.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Airforce 2" + { + "material" "materials/sprites/store/trails/airforce2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Apple" + { + "material" "materials/sprites/store/trails/apple.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrow Rainbow" + { + "material" "materials/sprites/store/trails/arrowrainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Arrows" + { + "material" "materials/sprites/store/trails/arrows.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Assasin" + { + "material" "materials/sprites/store/trails/assasin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome" + { + "material" "materials/sprites/store/trails/awesome.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Sad" + { + "material" "materials/sprites/store/trails/awesome_sad.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Awesome Face" + { + "material" "materials/sprites/store/trails/awesomeface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Babyand" + { + "material" "materials/sprites/store/trails/babyand.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Banknote" + { + "material" "materials/sprites/store/trails/banknote.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Barcalona" + { + "material" "materials/sprites/store/trails/barcalona.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Batman" + { + "material" "materials/sprites/store/trails/batman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Battlefield" + { + "material" "materials/sprites/store/trails/battlefield.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Beer Mug" + { + "material" "materials/sprites/store/trails/beermug.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Biohazard" + { + "material" "materials/sprites/store/trails/biohazard.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blade" + { + "material" "materials/sprites/store/trails/blade.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Blue Lightning" + { + "material" "materials/sprites/store/trails/bluelightning.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "BMW Logo" + { + "material" "materials/sprites/store/trails/bmwlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bom Bomb" + { + "material" "materials/sprites/store/trails/bombomb.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Boo" + { + "material" "materials/sprites/store/trails/boo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullet Bill" + { + "material" "materials/sprites/store/trails/bulletbill.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Bullets" + { + "material" "materials/sprites/store/trails/bullets.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Canada Flag" + { + "material" "materials/sprites/store/trails/canadaflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Candies" + { + "material" "materials/sprites/store/trails/candies.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ccole" + { + "material" "materials/sprites/store/trails/ccole.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cereal-guy" + { + "material" "materials/sprites/store/trails/cereal-guy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Challenge" + { + "material" "materials/sprites/store/trails/challenge.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Chopped Pyro" + { + "material" "materials/sprites/store/trails/chopped_pyro.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Chris Light" + { + "material" "materials/sprites/store/trails/chrislight.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Christ Lights" + { + "material" "materials/sprites/store/trails/christlights.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Coca-Cola" + { + "material" "materials/sprites/store/trails/cocacola.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Coca-Cola 2" + { + "material" "materials/sprites/store/trails/cocacola2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Color Bolt" + { + "material" "materials/sprites/store/trails/colorbolt.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cookies" + { + "material" "materials/sprites/store/trails/cookies.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Cracked Beam" + { + "material" "materials/sprites/store/trails/crackedbeam.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Creed" + { + "material" "materials/sprites/store/trails/creed.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Creeper" + { + "material" "materials/sprites/store/trails/creeper.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Crown" + { + "material" "materials/sprites/store/trails/crown.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Damnim Good" + { + "material" "materials/sprites/store/trails/damnimgood.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Danish Flag" + { + "material" "materials/sprites/store/trails/danishflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dark Knight" + { + "material" "materials/sprites/store/trails/darkknight.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5" + { + "material" "materials/sprites/store/trails/deadmau5.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 2" + { + "material" "materials/sprites/store/trails/deadmau52.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 3" + { + "material" "materials/sprites/store/trails/deadmau53.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Deadmau5 4" + { + "material" "materials/sprites/store/trails/deadmau54.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dead Pool" + { + "material" "materials/sprites/store/trails/deadpool.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dirt" + { + "material" "materials/sprites/store/trails/dirt.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Dragon" + { + "material" "materials/sprites/store/trails/disorderdragonv2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Logo" + { + "material" "materials/sprites/store/trails/disorderlogo2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Disorder Text" + { + "material" "materials/sprites/store/trails/disordertext10.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "DNA 2" + { + "material" "materials/sprites/store/trails/dna2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dollars" + { + "material" "materials/sprites/store/trails/dollars.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Donuts" + { + "material" "materials/sprites/store/trails/donuts.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Double Rainbow" + { + "material" "materials/sprites/store/trails/doublerainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dragon" + { + "material" "materials/sprites/store/trails/dragon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Dragon Disorder" + { + "material" "materials/sprites/store/trails/dragondisorder.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "EA Fifa" + { + "material" "materials/sprites/store/trails/eafifa.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "EA Logo" + { + "material" "materials/sprites/store/trails/ealogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Earth" + { + "material" "materials/sprites/store/trails/earth.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Energy" + { + "material" "materials/sprites/store/trails/energy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Energyball" + { + "material" "materials/sprites/store/trails/energyball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Epicsax" + { + "material" "materials/sprites/store/trails/epicsax.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Facebook Icon" + { + "material" "materials/sprites/store/trails/facebookicon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fap Face" + { + "material" "materials/sprites/store/trails/fapface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Faxekondi" + { + "material" "materials/sprites/store/trails/faxekondi.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ferrari" + { + "material" "materials/sprites/store/trails/ferrari.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fire" + { + "material" "materials/sprites/store/trails/fire.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fire 2" + { + "material" "materials/sprites/store/trails/fire1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Firefox" + { + "material" "materials/sprites/store/trails/firefox.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fireman" + { + "material" "materials/sprites/store/trails/fireman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Footprint" + { + "material" "materials/sprites/store/trails/footprint.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Forever Alone" + { + "material" "materials/sprites/store/trails/foreveralone.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuu 1" + { + "material" "materials/sprites/store/trails/fuu1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuu 2" + { + "material" "materials/sprites/store/trails/fuu2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Fuck Yeah" + { + "material" "materials/sprites/store/trails/fyeah.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "German Flag" + { + "material" "materials/sprites/store/trails/germanflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Google Chrome" + { + "material" "materials/sprites/store/trails/googlechrome.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Goomba" + { + "material" "materials/sprites/store/trails/goomba.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Grenade" + { + "material" "materials/sprites/store/trails/grenade.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Gummybears" + { + "material" "materials/sprites/store/trails/gummybears.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Gusta" + { + "material" "materials/sprites/store/trails/gusta.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Half-Life" + { + "material" "materials/sprites/store/trails/halflife.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Handgun" + { + "material" "materials/sprites/store/trails/handgun.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Headshot" + { + "material" "materials/sprites/store/trails/headshot.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Heart" + { + "material" "materials/sprites/store/trails/heart.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hello Kitty" + { + "material" "materials/sprites/store/trails/hellokitty.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hex" + { + "material" "materials/sprites/store/trails/hex.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hypnotic" + { + "material" "materials/sprites/store/trails/hypnotic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Hypnotoad" + { + "material" "materials/sprites/store/trails/hypnotoad.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ice" + { + "material" "materials/sprites/store/trails/ice.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ice 2" + { + "material" "materials/sprites/store/trails/ice1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Icloud" + { + "material" "materials/sprites/store/trails/icloud.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Invisible Bike" + { + "material" "materials/sprites/store/trails/invisible_bike.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Jackass" + { + "material" "materials/sprites/store/trails/jackass.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Jester" + { + "material" "materials/sprites/store/trails/jester.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kaleido Scope" + { + "material" "materials/sprites/store/trails/kaleidoscope.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kingdom Hearts" + { + "material" "materials/sprites/store/trails/kingdomhearts.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Kirby" + { + "material" "materials/sprites/store/trails/kirby.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Latvia" + { + "material" "materials/sprites/store/trails/latvia.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves" + { + "material" "materials/sprites/store/trails/leaves.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 2" + { + "material" "materials/sprites/store/trails/leaves1.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 3" + { + "material" "materials/sprites/store/trails/leaves2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Leaves 4" + { + "material" "materials/sprites/store/trails/leaves21.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightning 2" + { + "material" "materials/sprites/store/trails/lightning2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightning 3" + { + "material" "materials/sprites/store/trails/lightning3.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightspeed" + { + "material" "materials/sprites/store/trails/lightspeed.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Lightwave" + { + "material" "materials/sprites/store/trails/lightwave.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "LOL" + { + "material" "materials/sprites/store/trails/lol.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "LOL Guy" + { + "material" "materials/sprites/store/trails/lolguy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mario" + { + "material" "materials/sprites/store/trails/mario.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Masterchief" + { + "material" "materials/sprites/store/trails/masterchief.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + + "Mcdonalds" + { + "material" "materials/sprites/store/trails/mcdonald.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Medic" + { + "material" "materials/sprites/store/trails/medic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metallic" + { + "material" "materials/sprites/store/trails/metallic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metal Skull" + { + "material" "materials/sprites/store/trails/metalskull.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Metroid" + { + "material" "materials/sprites/store/trails/metroid.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Micky Mouse" + { + "material" "materials/sprites/store/trails/mickymouse.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Minecraft" + { + "material" "materials/sprites/store/trails/minecraft.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Moneybag" + { + "material" "materials/sprites/store/trails/moneybag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "mtvlogo" + { + "material" "materials/sprites/store/trails/mtvlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mudkip" + { + "material" "materials/sprites/store/trails/mudkip.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mushroom" + { + "material" "materials/sprites/store/trails/mushroom.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Mushroom 2" + { + "material" "materials/sprites/store/trails/mushroom2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Nevergup" + { + "material" "materials/sprites/store/trails/nevergup.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Nyan" + { + "material" "materials/sprites/store/trails/nyan.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ocarina" + { + "material" "materials/sprites/store/trails/ocarina.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Okami" + { + "material" "materials/sprites/store/trails/okami.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Okay Guy" + { + "material" "materials/sprites/store/trails/okayguy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Oops" + { + "material" "materials/sprites/store/trails/oops.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Orly" + { + "material" "materials/sprites/store/trails/orly.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pacman" + { + "material" "materials/sprites/store/trails/pacman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Paint Splatter" + { + "material" "materials/sprites/store/trails/paintsplatter.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Panda" + { + "material" "materials/sprites/store/trails/panda.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Paw Print" + { + "material" "materials/sprites/store/trails/pawprint.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Peace" + { + "material" "materials/sprites/store/trails/peace.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pedobear" + { + "material" "materials/sprites/store/trails/pedobear.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pfffft" + { + "material" "materials/sprites/store/trails/pfffft.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pika" + { + "material" "materials/sprites/store/trails/pika.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pikmin" + { + "material" "materials/sprites/store/trails/pikmin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pinkie" + { + "material" "materials/sprites/store/trails/pinkie.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pink Ribbon" + { + "material" "materials/sprites/store/trails/pinkribbon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Playboy" + { + "material" "materials/sprites/store/trails/playboy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Plur" + { + "material" "materials/sprites/store/trails/plur.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pokeball" + { + "material" "materials/sprites/store/trails/pokeball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pokemon" + { + "material" "materials/sprites/store/trails/pokemon.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Poker" + { + "material" "materials/sprites/store/trails/poker.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Police" + { + "material" "materials/sprites/store/trails/police.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Potleaf" + { + "material" "materials/sprites/store/trails/potleaf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pretzel" + { + "material" "materials/sprites/store/trails/pretzel.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Problems Face" + { + "material" "materials/sprites/store/trails/problems_face.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Psychball" + { + "material" "materials/sprites/store/trails/psychball.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Psych Triangle" + { + "material" "materials/sprites/store/trails/psychtriangle.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Pumpkin" + { + "material" "materials/sprites/store/trails/pumpkin.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Purple Lightning" + { + "material" "materials/sprites/store/trails/purplelightning.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Puttegris" + { + "material" "materials/sprites/store/trails/puttegris.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "pwned" + { + "material" "materials/sprites/store/trails/pwned.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Quake" + { + "material" "materials/sprites/store/trails/quake.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Question" + { + "material" "materials/sprites/store/trails/question.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Raf" + { + "material" "materials/sprites/store/trails/raf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rain" + { + "material" "materials/sprites/store/trails/rain.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Dash" + { + "material" "materials/sprites/store/trails/rainbow-dash.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow" + { + "material" "materials/sprites/store/trails/rainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Cobra 2" + { + "material" "materials/sprites/store/trails/rainbowcobra2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Rainbow Cry" + { + "material" "materials/sprites/store/trails/rainbowcry.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Real Madrid" + { + "material" "materials/sprites/store/trails/realmadrid.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Reaper" + { + "material" "materials/sprites/store/trails/reaper.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Retro Egg" + { + "material" "materials/sprites/store/trails/retroegg.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Retro Flower" + { + "material" "materials/sprites/store/trails/retroflower.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sep Rainbow" + { + "material" "materials/sprites/store/trails/seprainbow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sharingan" + { + "material" "materials/sprites/store/trails/sharingan.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Shell" + { + "material" "materials/sprites/store/trails/shell.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Shroom5" + { + "material" "materials/sprites/store/trails/shroom5.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skull" + { + "material" "materials/sprites/store/trails/skull.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skulln Bones" + { + "material" "materials/sprites/store/trails/skullnbones.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Skype Logo" + { + "material" "materials/sprites/store/trails/skypelogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Slow Poke" + { + "material" "materials/sprites/store/trails/slowpoke.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Smirnoff" + { + "material" "materials/sprites/store/trails/smirnoff.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Smugleaf" + { + "material" "materials/sprites/store/trails/smugleaf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Snowman" + { + "material" "materials/sprites/store/trails/snowman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Sony Logo" + { + "material" "materials/sprites/store/trails/sonylogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "SOS" + { + "material" "materials/sprites/store/trails/sos.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spider" + { + "material" "materials/sprites/store/trails/spider.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spongebob" + { + "material" "materials/sprites/store/trails/spongebob.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Spotify" + { + "material" "materials/sprites/store/trails/spotify.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "SRS Face" + { + "material" "materials/sprites/store/trails/srsface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Star" + { + "material" "materials/sprites/store/trails/star.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Superman Logo" + { + "material" "materials/sprites/store/trails/supermanlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Swirly" + { + "material" "materials/sprites/store/trails/swirly.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Taco" + { + "material" "materials/sprites/store/trails/taco.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Test 1000" + { + "material" "materials/sprites/store/trails/test1000.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Timebomb" + { + "material" "materials/sprites/store/trails/timebomb.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Tmi Shit" + { + "material" "materials/sprites/store/trails/tmishit.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "triforce" + { + "material" "materials/sprites/store/trails/triforce.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "trippy" + { + "material" "materials/sprites/store/trails/trippy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Troll Face" + { + "material" "materials/sprites/store/trails/trollface.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Tux" + { + "material" "materials/sprites/store/trails/tux.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Twitter" + { + "material" "materials/sprites/store/trails/twitter.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "UK Flag" + { + "material" "materials/sprites/store/trails/ukflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ultra" + { + "material" "materials/sprites/store/trails/ultra.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Umbrella Corperation" + { + "material" "materials/sprites/store/trails/umbrellacorp.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Up Arrow" + { + "material" "materials/sprites/store/trails/uparrow.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "US Flag" + { + "material" "materials/sprites/store/trails/usflag.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "War Heads" + { + "material" "materials/sprites/store/trails/warheads.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Warrior" + { + "material" "materials/sprites/store/trails/warrior.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Water 2" + { + "material" "materials/sprites/store/trails/water2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wheel" + { + "material" "materials/sprites/store/trails/wheel.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Windows" + { + "material" "materials/sprites/store/trails/windows.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wings" + { + "material" "materials/sprites/store/trails/wings.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wolf" + { + "material" "materials/sprites/store/trails/wolf.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Wonder Woman" + { + "material" "materials/sprites/store/trails/wonder_woman.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Words" + { + "material" "materials/sprites/store/trails/words.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Medic 2" + { + "material" "materials/sprites/store/trails/x_medic.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Xbox Logo" + { + "material" "materials/sprites/store/trails/xboxlogo.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Y U NO Guy" + { + "material" "materials/sprites/store/trails/y-u-no-guy.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ying-Yang" + { + "material" "materials/sprites/store/trails/yingyang.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Ying-Yang 2" + { + "material" "materials/sprites/store/trails/yingyang2.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + + "Yukari" + { + "material" "materials/sprites/store/trails/yukari.vmt" + "price" "300" + "color" "255 255 255 255" + "type" "trail" + } + } + + "Grenade Trails" + { + "Thin Beam" + { + "material" "materials/sprites/combineball_trail_black_1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Squiggly Beam" + { + "material" "materials/sprites/hydragutbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Medium Beam" + { + "material" "materials/sprites/orangelight1.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Large Beam" + { + "material" "materials/sprites/spotlight.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 255 255" + } + + "Red Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "255 0 0 255" + "unique_id" "grenadetrail_laserbeam_red" + } + + "Blue Laserbeam" + { + "material" "materials/sprites/laserbeam.vmt" + "price" "120" + "type" "grenadetrail" + "color" "0 0 255 255" + "unique_id" "grenadetrail_laserbeam_blue" + } + } + + "Grenade Skins" + { + "HE Grenade" + { + "Orange" + { + "model" "models/props/cs_italy/orange.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + + "Tortoise" + { + "model" "models/props/de_tides/vending_turtle.mdl" + "grenade" "hegrenade" + "price" "60" + "type" "grenadeskin" + } + } + + "Flashbang" + { + "Banana" + { + "model" "models/props/cs_italy/bananna.mdl" + "grenade" "flashbang" + "price" "60" + "type" "grenadeskin" + } + } + + "Smokegrenade" + { + "Watermelon" + { + "model" "models/props_junk/watermelon01.mdl" + "grenade" "smokegrenade" + "price" "60" + "type" "grenadeskin" + } + } + } + + "Weapon Colors" + { + "Antique White" + { + "color" "205 192 176 255" + "price" "60" + "type" "weaponcolor" + } + "Alice Blue" + { + "color" "240 248 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue" + { + "color" "0 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Blue Violet" + { + "color" "138 43 226 255" + "price" "60" + "type" "weaponcolor" + } + "Corn Silk" + { + "color" "255 248 220 255" + "price" "60" + "type" "weaponcolor" + } + "Cyan" + { + "color" "0 255 255 255" + "price" "60" + "type" "weaponcolor" + } + "Dark Khaki" + { + "color" "189 183 107 255" + "price" "60" + "type" "weaponcolor" + } + "Dim Grey" + { + "color" "105 105 105 255" + "price" "60" + "type" "weaponcolor" + } + "Fire Brick" + { + "color" "178 34 34 255" + "price" "60" + "type" "weaponcolor" + } + "Fuschia" + { + "color" "255 0 255 255" + "price" "60" + "type" "weaponcolor" + } + "Gray" + { + "color" "240 240 240 255" + "price" "60" + "type" "weaponcolor" + } + "Green" + { + "color" "0 255 0 255" + "price" "60" + "type" "weaponcolor" + } + "Hunter Green" + { + "color" "35 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Lawn Green" + { + "color" "124 1202 0 255" + "price" "60" + "type" "weaponcolor" + } + "Navajo White" + { + "color" "255 222 173 255" + "price" "60" + "type" "weaponcolor" + } + "Olive" + { + "color" "128 128 0 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Brown" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Olive Drab" + { + "color" "607 142 35 255" + "price" "60" + "type" "weaponcolor" + } + "Orange" + { + "color" "255 77 0 255" + "price" "60" + "type" "weaponcolor" + } + "Orchid" + { + "color" "218 112 214 255" + "price" "60" + "type" "weaponcolor" + } + "Pale Turquoise" + { + "color" "175 238 238 255" + "price" "60" + "type" "weaponcolor" + } + "Purple" + { + "color" "128 0 128 255" + "price" "60" + "type" "weaponcolor" + } + "Pink" + { + "color" "255 103 103 255" + "price" "60" + "type" "weaponcolor" + } + "Plum" + { + "color" "221 160 221 255" + "price" "60" + "type" "weaponcolor" + } + "Red" + { + "color" "255 0 0 255" + "price" "60" + "type" "weaponcolor" + } + "Sea Blue" + { + "color" "43 176 205 255" + "price" "60" + "type" "weaponcolor" + } + "Sandy Brown" + { + "color" "244 164 96 255" + "price" "60" + "type" "weaponcolor" + } + "Sienna" + { + "color" "180 82 45 255" + "price" "60" + "type" "weaponcolor" + } + "Silver" + { + "color" "192 192 192 255" + "price" "60" + "type" "weaponcolor" + } + "Scarlet" + { + "color" "140 23 23 255" + "price" "60" + "type" "weaponcolor" + } + "Seal Green" + { + "color" "128 255 165 255" + "price" "60" + "type" "weaponcolor" + } + "Steel Blue" + { + "color" "35 107 142 255" + "price" "60" + "type" "weaponcolor" + } + "Teal" + { + "color" "0 128 128 255" + "price" "60" + "type" "weaponcolor" + } + "Turquoise" + { + "color" "64 224 208 255" + "price" "60" + "type" "weaponcolor" + } + "Violet" + { + "color" "148 0 211 255" + "price" "60" + "type" "weaponcolor" + } + "Yellow" + { + "color" "255 255 0 255" + "price" "60" + "type" "weaponcolor" + } + } + + "Chat stuff" + { + "Name Tags" + { + "Newbie" + { + "tag" "{lightblue}[Newbie]{teamcolor} " + "price" "60" + "type" "nametag" + } + "Wannabe" + { + "tag" "{red}[Wannabe]{teamcolor} " + "price" "90" + "type" "nametag" + } + "Ex-Con" + { + "tag" "{black}[Ex-Con]{teamcolor} " + "price" "120" + "type" "nametag" + } + "Officer" + { + "tag" "{lightblue}[Officer]{teamcolor} " + "price" "120" + "type" "nametag" + } + "S.W.A.T" + { + "tag" "{blue}[S.W.A.T]{teamcolor} " + "price" "120" + "type" "nametag" + } + "420" + { + "tag" "{green}[420]{teamcolor} " + "price" "180" + "type" "nametag" + } + "Equinox" + { + "tag" "{pink}[Equinox]{teamcolor} " + "price" "300" + "type" "nametag" + } + } + + "Name Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "60" + "type" "namecolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "60" + "type" "namecolor" + } + + "Green" + { + "color" "{green}" + "price" "60" + "type" "namecolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "60" + "type" "namecolor" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "60" + "type" "namecolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "60" + "type" "namecolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "60" + "type" "namecolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "60" + "type" "namecolor" + "games" "tf,cstrike" + } + } + + "Message Colors" + { + "Alice Blue" + { + "color" "{aliceblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Antique White" + { + "color" "{antiquewhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aqua" + { + "color" "{aqua}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Aquamarine" + { + "color" "{aquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Azure" + { + "color" "{azure}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Beige" + { + "color" "{beige}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Bisque" + { + "color" "{bisque}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Black" + { + "color" "{black}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blanche Dalmond" + { + "color" "{blanchedalmond}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue" + { + "color" "{blue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Blue Violet" + { + "color" "{blueviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Brown" + { + "color" "{brown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Burly Wood" + { + "color" "{burlywood}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cadet Blue" + { + "color" "{cadetblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chartreuse" + { + "color" "{chartreuse}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Chocolate" + { + "color" "{chocolate}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Community" + { + "color" "{community}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Coral" + { + "color" "{coral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cornflower Blue" + { + "color" "{cornflowerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Corn Silk" + { + "color" "{cornsilk}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Crimson" + { + "color" "{crimson}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + "Cyan" + { + "color" "{cyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Blue" + { + "color" "{darkblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Cyan" + { + "color" "{darkcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Golden Rod" + { + "color" "{darkgoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Gray" + { + "color" "{darkgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Green" + { + "color" "{darkgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark khaki" + { + "color" "{darkkhaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark magenta" + { + "color" "{darkmagenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark oliveGreen" + { + "color" "{darkolivegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark orange" + { + "color" "{darkorange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Orchid" + { + "color" "{darkorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Red" + { + "color" "{darkred}" + "price" "120" + "type" "msgcolor" + } + + "Dark salmon" + { + "color" "{darksalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Sea Green" + { + "color" "{darkseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark SlateBlue" + { + "color" "{darkslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Slategray" + { + "color" "{darkslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Turquoise" + { + "color" "{darkturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dark Violet" + { + "color" "{darkviolet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Pink" + { + "color" "{deeppink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Deep Skyblue" + { + "color" "{deepskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dimgray" + { + "color" "{dimgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Dodger Blue" + { + "color" "{dodgerblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Firebrick" + { + "color" "{firebrick}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Floral White" + { + "color" "{floralwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Forest Green" + { + "color" "{forestgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Fuchsia" + { + "color" "{fuchsia}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Blue" + { + "color" "{fullblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Full Red" + { + "color" "{fullred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gainsboro" + { + "color" "{gainsboro}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Genuine" + { + "color" "{genuine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ghost White" + { + "color" "{ghostwhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gold" + { + "color" "{gold}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Goldenrod" + { + "color" "{goldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Gray" + { + "color" "{gray}" + "price" "120" + "type" "msgcolor" + } + + "Green" + { + "color" "{green}" + "price" "120" + "type" "msgcolor" + } + + "Green Yellow" + { + "color" "{greenyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Haunted" + { + "color" "{haunted}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Honeydew" + { + "color" "{honeydew}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Hot Pink" + { + "color" "{hotpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indian Red" + { + "color" "{indianred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Indigo" + { + "color" "{indigo}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Ivory" + { + "color" "{ivory}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Khaki" + { + "color" "{khaki}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender" + { + "color" "{lavender}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lavender Blush" + { + "color" "{lavenderblush}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lawn Green" + { + "color" "{lawngreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lemon Chiffon" + { + "color" "{lemonchiffon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Blue" + { + "color" "{lightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Coral" + { + "color" "{lightcoral}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Cyan" + { + "color" "{lightcyan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Goldenrod Yellow" + { + "color" "{lightgoldenrodyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Gray" + { + "color" "{lightgray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Red" + { + "color" "{lightred}" + "price" "120" + "type" "msgcolor" + } + + "Light Green" + { + "color" "{lightgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Pink" + { + "color" "{lightpink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Salmon" + { + "color" "{lightsalmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Sea Green" + { + "color" "{lightseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Skyblue" + { + "color" "{lightskyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Slategray" + { + "color" "{lightslategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Steel Blue" + { + "color" "{lightsteelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Light Yellow" + { + "color" "{lightyellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Lime" + { + "color" "{lime}" + "price" "120" + "type" "msgcolor" + } + + "Lime Green" + { + "color" "{limegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Linen" + { + "color" "{linen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Magenta" + { + "color" "{magenta}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Maroon" + { + "color" "{maroon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Aquamarine" + { + "color" "{mediumaquamarine}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Blue" + { + "color" "{mediumblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Orchid" + { + "color" "{mediumorchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Purple" + { + "color" "{mediumpurple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Sea Green" + { + "color" "{mediumseagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Slate Blue" + { + "color" "{mediumslateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Spring Green" + { + "color" "{mediumspringgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Turquoise" + { + "color" "{mediumturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Medium Violet Red" + { + "color" "{mediumvioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Midnight Blue" + { + "color" "{midnightblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Mintcream" + { + "color" "{mintcream}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Misty Rose" + { + "color" "{mistyrose}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Moccasin" + { + "color" "{moccasin}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navajo White" + { + "color" "{navajowhite}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Navy" + { + "color" "{navy}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Old Lace" + { + "color" "{oldlace}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Olive" + { + "color" "{olive}" + "price" "120" + "type" "msgcolor" + } + + "Olive Drab" + { + "color" "{olivedrab}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange" + { + "color" "{orange}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orange Red" + { + "color" "{orangered}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Orchid" + { + "color" "{orchid}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Golden Rod" + { + "color" "{palegoldenrod}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Green" + { + "color" "{palegreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale Turquoise" + { + "color" "{paleturquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pale violetRed" + { + "color" "{palevioletred}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Papaya Whip" + { + "color" "{papayawhip}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peach Puff" + { + "color" "{peachpuff}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Peru" + { + "color" "{peru}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Pink" + { + "color" "{pink}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Plum" + { + "color" "{plum}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Powder Blue" + { + "color" "{powderblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Purple" + { + "color" "{purple}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Red" + { + "color" "{red}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Rosy Brown" + { + "color" "{rosybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Royal Blue" + { + "color" "{royalblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Saddle Brown" + { + "color" "{saddlebrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Salmon" + { + "color" "{salmon}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sandy Brown" + { + "color" "{sandybrown}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sea Green" + { + "color" "{seagreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Seashell" + { + "color" "{seashell}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Sienna" + { + "color" "{sienna}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Silver" + { + "color" "{silver}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Skyblue" + { + "color" "{skyblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate blue" + { + "color" "{slateblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Slate Gray" + { + "color" "{slategray}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Snow" + { + "color" "{snow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Spring Green" + { + "color" "{springgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Steel Blue" + { + "color" "{steelblue}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tan" + { + "color" "{tan}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Teal" + { + "color" "{teal}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Thistle" + { + "color" "{thistle}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Tomato" + { + "color" "{tomato}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Turquoise" + { + "color" "{turquoise}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Violet" + { + "color" "{violet}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Wheat" + { + "color" "{wheat}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "White" + { + "color" "{white}" + "price" "120" + "type" "msgcolor" + } + + "Yellow" + { + "color" "{yellow}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + + "Yellow Green" + { + "color" "{yellowgreen}" + "price" "120" + "type" "msgcolor" + "games" "tf,cstrike" + } + } + } + + "Miscellaneous" + { + "Bunnyhop" + { + "price" "500" + "type" "bunnyhop" + } + + "Jetpack" + { + "price" "500" + "type" "jetpack" + } + + "Paintball" + { + "price" "500" + "type" "paintball" + "Decals" + { + "cyan" + { + "material" "paintball/pb_cyan.vmt" + } + "green" + { + "material" "paintball/pb_green.vmt" + } + "pink" + { + "material" "paintball/pb_pink.vmt" + } + "orange" + { + "material" "paintball/pb_orange.vmt" + } + "yellow" + { + "material" "paintball/pb_yellow.vmt" + } + } + } + } + + "Unusual Effects" + { + "Flying Bits" + { + "unusual_id" "2" + "price" "180" + "type" "tfunusual" + } + + "Nemesis Burst" + { + "unusual_id" "3" + "price" "180" + "type" "tfunusual" + } + + "Community Sparkle" + { + "unusual_id" "4" + "price" "180" + "type" "tfunusual" + } + + "Holy Glow" + { + "unusual_id" "5" + "price" "180" + "type" "tfunusual" + } + + "Green Confetti" + { + "unusual_id" "6" + "price" "180" + "type" "tfunusual" + } + + "Purple Confetti" + { + "unusual_id" "7" + "price" "180" + "type" "tfunusual" + } + + "Haunted Ghosts" + { + "unusual_id" "8" + "price" "200" + "type" "tfunusual" + } + + "Green Energy" + { + "unusual_id" "9" + "price" "200" + "type" "tfunusual" + } + + "Purple Energy" + { + "unusual_id" "10" + "price" "200" + "type" "tfunusual" + } + + "Circling TF Logo" + { + "unusual_id" "11" + "price" "200" + "type" "tfunusual" + } + + "Massed Flies" + { + "unusual_id" "12" + "price" "200" + "type" "tfunusual" + } + + "Burning Flames" + { + "unusual_id" "13" + "price" "200" + "type" "tfunusual" + } + + "Scorching Flames" + { + "unusual_id" "14" + "price" "280" + "type" "tfunusual" + } + + "Searing Plasma" + { + "unusual_id" "15" + "price" "280" + "type" "tfunusual" + } + + "Vivid Plasma" + { + "unusual_id" "16" + "price" "280" + "type" "tfunusual" + } + + "Sunbeams" + { + "unusual_id" "17" + "price" "280" + "type" "tfunusual" + } + + "Circling Peace Sign" + { + "unusual_id" "18" + "price" "280" + "type" "tfunusual" + } + + "Circling Heart" + { + "unusual_id" "19" + "price" "280" + "type" "tfunusual" + } + + "Map Stamps" + { + "unusual_id" "20" + "price" "280" + "type" "tfunusual" + } + + "Genteel Smoke" + { + "unusual_id" "28" + "price" "360" + "type" "tfunusual" + } + + "Stormy Storm" + { + "unusual_id" "29" + "price" "360" + "type" "tfunusual" + } + + "Blizzardy Storm" + { + "unusual_id" "30" + "price" "360" + "type" "tfunusual" + } + + "Nuts n' Bolts" + { + "unusual_id" "31" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Planets" + { + "unusual_id" "32" + "price" "360" + "type" "tfunusual" + } + + "Orbiting Fire" + { + "unusual_id" "33" + "price" "360" + "type" "tfunusual" + } + + "Bubbling" + { + "unusual_id" "34" + "price" "360" + "type" "tfunusual" + } + + "Smoking" + { + "unusual_id" "35" + "price" "360" + "type" "tfunusual" + } + + "Steaming" + { + "unusual_id" "36" + "price" "360" + "type" "tfunusual" + } + + "Flaming Lantern" + { + "unusual_id" "37" + "price" "360" + "type" "tfunusual" + } + + "Cloudy Moon" + { + "unusual_id" "38" + "price" "360" + "type" "tfunusual" + } + + "Cauldron Bubbles" + { + "unusual_id" "39" + "price" "360" + "type" "tfunusual" + } + + "Eerie Orbiting Fire" + { + "unusual_id" "40" + "price" "440" + "type" "tfunusual" + } + + "Knifestorm" + { + "unusual_id" "43" + "price" "440" + "type" "tfunusual" + } + + "Misty Skull" + { + "unusual_id" "44" + "price" "440" + "type" "tfunusual" + } + + "Harvest Moon" + { + "unusual_id" "45" + "price" "440" + "type" "tfunusual" + } + + "It's A Secret To Everybody" + { + "unusual_id" "46" + "price" "440" + "type" "tfunusual" + } + + "Stormy 13th Hour" + { + "unusual_id" "47" + "price" "440" + "type" "tfunusual" + } + + "Attrib_Particle55" + { + "unusual_id" "55" + "price" "440" + "type" "tfunusual" + } + + "Kill-a-Watt" + { + "unusual_id" "56" + "price" "440" + "type" "tfunusual" + } + + "Terror-Watt" + { + "unusual_id" "57" + "price" "440" + "type" "tfunusual" + } + + "Cloud 9" + { + "unusual_id" "58" + "price" "440" + "type" "tfunusual" + } + + "Aces High" + { + "unusual_id" "59" + "price" "440" + "type" "tfunusual" + } + + "Dead Presidents" + { + "unusual_id" "180" + "type" "tfunusual" + "price" "440" + "type" "tfunusual" + } + + "Miami Nights" + { + "unusual_id" "61" + "price" "180" + "type" "tfunusual" + } + + "Disco Beat Down" + { + "unusual_id" "62" + "price" "520" + "type" "tfunusual" + } + + "Phosphorous" + { + "unusual_id" "63" + "price" "520" + "type" "tfunusual" + } + + "Sulphurous" + { + "unusual_id" "64" + "price" "520" + "type" "tfunusual" + } + + "Memory Leak" + { + "unusual_id" "65" + "price" "520" + "type" "tfunusual" + } + + "Overclocked" + { + "unusual_id" "66" + "price" "520" + "type" "tfunusual" + } + + "Electrostatic" + { + "unusual_id" "67" + "price" "520" + "type" "tfunusual" + } + + "Power Surge" + { + "unusual_id" "68" + "price" "520" + "type" "tfunusual" + } + + "Anti-Freeze" + { + "unusual_id" "69" + "price" "520" + "type" "tfunusual" + } + + "Time Warp" + { + "unusual_id" "70" + "price" "520" + "type" "tfunusual" + } + + "Green Black Hole" + { + "unusual_id" "71" + "price" "520" + "type" "tfunusual" + } + + "Roboactive" + { + "unusual_id" "72" + "price" "520" + "type" "tfunusual" + } + + "Arcana" + { + "unusual_id" "73" + "price" "520" + "type" "tfunusual" + } + + "Spellbound" + { + "unusual_id" "74" + "price" "600" + "type" "tfunusual" + } + + "Chiroptera Venenata" + { + "unusual_id" "75" + "price" "600" + "type" "tfunusual" + } + + "Poisoned Shadows" + { + "unusual_id" "76" + "price" "600" + "type" "tfunusual" + } + + "Something Burning This Way Comes" + { + "unusual_id" "77" + "price" "600" + "type" "tfunusual" + } + + "Hellfire" + { + "unusual_id" "78" + "price" "600" + "type" "tfunusual" + } + + "Darkblaze" + { + "unusual_id" "79" + "price" "600" + "type" "tfunusual" + } + + "Demonflame" + { + "unusual_id" "80" + "price" "600" + "type" "tfunusual" + } + + "Showstopper" + { + "unusual_id" "3002" + "price" "600" + "type" "tfunusual" + } + + "Holy Grail" + { + "unusual_id" "3003" + "price" "600" + "type" "tfunusual" + } + "Fountain of Delight" + { + "unusual_id" "3005" + "price" "600" + "type" "tfunusual" + } + + "Screaming Tiger" + { + "unusual_id" "3006" + "price" "600" + "type" "tfunusual" + } + + "Skill Gotten Gains" + { + "unusual_id" "3007" + "price" "600" + "type" "tfunusual" + } + + "Midnight Whirlwind" + { + "unusual_id" "3008" + "price" "600" + "type" "tfunusual" + } + + "Silver Cyclone" + { + "unusual_id" "3009" + "price" "600" + "type" "tfunusual" + } + + "Mega Strike" + { + "unusual_id" "3010" + "price" "600" + "type" "tfunusual" + } + } + + "Paint Cans" + { + "A Color Similar to Slate" + { + "color" "47 79 79" + "price" "60" + "type" "tyhatdye" + } + + "A Deep Commitment to Purple" + { + "color" "125 64 113" + "price" "60" + "type" "tyhatdye" + } + + "A Distinctive Lack of Hue" + { + "color" "20 20 20" + "price" "60" + "type" "tyhatdye" + } + + "A Mann's Mint" + { + "color" "188 221 179" + "price" "60" + "type" "tyhatdye" + } + + "After Eight" + { + "color" "45 45 36" + "price" "60" + "type" "tyhatdye" + } + + "Aged Moustache Grey" + { + "color" "126 126 126" + "price" "60" + "type" "tyhatdye" + } + + "An Extraordinary Abundance of Tinge" + { + "color" "230 230 230" + "price" "60" + "type" "tyhatdye" + } + + "Australium Gold" + { + "color" "231 181 59" + "price" "60" + "type" "tyhatdye" + } + + "Color No. 216-190-216 " + { + "color" "216 190 216" + "price" "60" + "type" "tyhatdye" + } + + "Dark Salmon Injustice" + { + "color" "233 150 122" + "price" "60" + "type" "tyhatdye" + } + + "Drably Olive" + { + "color" "128 128 0" + "price" "60" + "type" "tyhatdye" + } + + "Indubitably Green" + { + "color" "114 158 66" + "price" "60" + "type" "tyhatdye" + } + + "Mann Co. Orange" + { + "color" "207 115 54" + "price" "60" + "type" "tyhatdye" + } + + "Muskelmannbraun" + { + "color" "165 117 69" + "price" "60" + "type" "tyhatdye" + } + + "Noble Hatter's Violet" + { + "color" "81 56 74" + "price" "60" + "type" "tyhatdye" + } + + "Peculiarly Drab Tincture" + { + "color" "197 175 145" + "price" "60" + "type" "tyhatdye" + } + "Pink as Hell" + { + "color" "255 105 180" + "price" "60" + "type" "tyhatdye" + } + + "Radigan Conagher Brown" + { + "color" "105 77 58" + "price" "60" + "type" "tyhatdye" + } + + "The Bitter Taste of Defeat and Lime" + { + "color" "50 205 50" + "price" "60" + "type" "tyhatdye" + } + + "The Color of a Gentlemann's Business Pants" + { + "color" "240 230 140" + "price" "60" + "type" "tyhatdye" + } + + "Ye Olde Rustic Colour" + { + "color" "124 108 87" + "price" "60" + "type" "tyhatdye" + } + + "Zepheniah's Greed" + { + "color" "66 79 59" + "price" "60" + "type" "tyhatdye" + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/gamedata/store.gamedata.txt b/addons/sourcemod/gamedata/store.gamedata.txt new file mode 100644 index 0000000..425e9ec --- /dev/null +++ b/addons/sourcemod/gamedata/store.gamedata.txt @@ -0,0 +1,104 @@ +"Games" +{ + "#default" + { + "Offsets" + { + "EntityListeners" + { + "windows" "65572" + "linux" "65572" + "mac" "65572" + } + } + } + + "cstrike" + { + "Signatures" + { + "LookupAttachment" + { + "library" "server" + "linux" "@_ZN14CBaseAnimating16LookupAttachmentEPKc" + "windows" "\x55\x8B\xEC\x56\x8B\xF1\x80\xBE\x2A\x2A\x2A\x2A\x00\x75\x2A\x83\xBE\x2A\x2A\x2A\x2A\x00\x75\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x83\x2A\x2A\x74\x2A\xFF\x75\x08" + } + } + + "Offsets" + { + "Weapon_ShootPosition" + { + "windows" "263" + "linux" "264" + } + + "SetModel" + { + "windows" "24" + "linux" "25" + } + } + } + + "csgo" + { + "Signatures" + { + "LookupAttachment" + { + "library" "server" + "linux" "@_ZN14CBaseAnimating16LookupAttachmentEPKc" + "windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x56\x57\x8B\xF9\x89\x55\xF8\x85\xFF\x0F\x84\x80\x00\x00\x00\xE8\x75\xA6\xE3\xFF\x84\xC0\x74\x77\x8B\xCF\x33\xDB\xE8\xA8\xAA\xE3\xFF\x85\xC0\x7E\x6A\x8B\x47\x04\x33\xF6\x89\x75\xFC" + } + } + "Offsets" + { + "Weapon_ShootPosition" + { + "windows" "280" + "linux" "281" + } + + "SetModel" + { + "windows" "26" + "linux" "27" + } + + "EntityListeners" + { + "windows" "196644" + "linux" "196644" + "mac" "196644" + } + } + } + + "tf" + { + "Offsets" + { + "EquipWearable" + { + "windows" "425" + "linux" "426" + "mac" "426" + } + + "RemoveWearable" + { + "windows" "426" + "linux" "427" + "mac" "427" + } + + "IsWearable" + { + "windows" "87" + "linux" "88" + "mac" "88" + } + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/plugins/store-trade.smx b/addons/sourcemod/plugins/store-trade.smx new file mode 100644 index 0000000..9b0cfab Binary files /dev/null and b/addons/sourcemod/plugins/store-trade.smx differ diff --git a/addons/sourcemod/plugins/store.smx b/addons/sourcemod/plugins/store.smx new file mode 100644 index 0000000..922e980 Binary files /dev/null and b/addons/sourcemod/plugins/store.smx differ diff --git a/addons/sourcemod/plugins/thirdperson.smx b/addons/sourcemod/plugins/thirdperson.smx new file mode 100644 index 0000000..78926fa Binary files /dev/null and b/addons/sourcemod/plugins/thirdperson.smx differ diff --git a/addons/sourcemod/scripting/include/admin.inc b/addons/sourcemod/scripting/include/admin.inc new file mode 100644 index 0000000..40c5907 --- /dev/null +++ b/addons/sourcemod/scripting/include/admin.inc @@ -0,0 +1,631 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _admin_included + #endinput +#endif +#define _admin_included + +/** + * Access levels (flags) for admins. + */ +enum AdminFlag +{ + Admin_Reservation = 0, /**< Reserved slot */ + Admin_Generic, /**< Generic admin abilities */ + Admin_Kick, /**< Kick another user */ + Admin_Ban, /**< Ban another user */ + Admin_Unban, /**< Unban another user */ + Admin_Slay, /**< Slay/kill/damage another user */ + Admin_Changemap, /**< Change the map */ + Admin_Convars, /**< Change basic convars */ + Admin_Config, /**< Change configuration */ + Admin_Chat, /**< Special chat privileges */ + Admin_Vote, /**< Special vote privileges */ + Admin_Password, /**< Set a server password */ + Admin_RCON, /**< Use RCON */ + Admin_Cheats, /**< Change sv_cheats and use its commands */ + Admin_Root, /**< All access by default */ + Admin_Custom1, /**< First custom flag type */ + Admin_Custom2, /**< Second custom flag type */ + Admin_Custom3, /**< Third custom flag type */ + Admin_Custom4, /**< Fourth custom flag type */ + Admin_Custom5, /**< Fifth custom flag type */ + Admin_Custom6, /**< Sixth custom flag type */ + /* --- */ +}; + +#define AdminFlags_TOTAL 21 /**< Total number of admin flags */ + +/** + * @section Bitwise values definitions for admin flags. + */ +#define ADMFLAG_RESERVATION (1<<0) /**< Convenience macro for Admin_Reservation as a FlagBit */ +#define ADMFLAG_GENERIC (1<<1) /**< Convenience macro for Admin_Generic as a FlagBit */ +#define ADMFLAG_KICK (1<<2) /**< Convenience macro for Admin_Kick as a FlagBit */ +#define ADMFLAG_BAN (1<<3) /**< Convenience macro for Admin_Ban as a FlagBit */ +#define ADMFLAG_UNBAN (1<<4) /**< Convenience macro for Admin_Unban as a FlagBit */ +#define ADMFLAG_SLAY (1<<5) /**< Convenience macro for Admin_Slay as a FlagBit */ +#define ADMFLAG_CHANGEMAP (1<<6) /**< Convenience macro for Admin_Changemap as a FlagBit */ +#define ADMFLAG_CONVARS (1<<7) /**< Convenience macro for Admin_Convars as a FlagBit */ +#define ADMFLAG_CONFIG (1<<8) /**< Convenience macro for Admin_Config as a FlagBit */ +#define ADMFLAG_CHAT (1<<9) /**< Convenience macro for Admin_Chat as a FlagBit */ +#define ADMFLAG_VOTE (1<<10) /**< Convenience macro for Admin_Vote as a FlagBit */ +#define ADMFLAG_PASSWORD (1<<11) /**< Convenience macro for Admin_Password as a FlagBit */ +#define ADMFLAG_RCON (1<<12) /**< Convenience macro for Admin_RCON as a FlagBit */ +#define ADMFLAG_CHEATS (1<<13) /**< Convenience macro for Admin_Cheats as a FlagBit */ +#define ADMFLAG_ROOT (1<<14) /**< Convenience macro for Admin_Root as a FlagBit */ +#define ADMFLAG_CUSTOM1 (1<<15) /**< Convenience macro for Admin_Custom1 as a FlagBit */ +#define ADMFLAG_CUSTOM2 (1<<16) /**< Convenience macro for Admin_Custom2 as a FlagBit */ +#define ADMFLAG_CUSTOM3 (1<<17) /**< Convenience macro for Admin_Custom3 as a FlagBit */ +#define ADMFLAG_CUSTOM4 (1<<18) /**< Convenience macro for Admin_Custom4 as a FlagBit */ +#define ADMFLAG_CUSTOM5 (1<<19) /**< Convenience macro for Admin_Custom5 as a FlagBit */ +#define ADMFLAG_CUSTOM6 (1<<20) /**< Convenience macro for Admin_Custom6 as a FlagBit */ + +/** + * @endsection + */ + +/** + * @section Hardcoded authentication methods + */ +#define AUTHMETHOD_STEAM "steam" /**< SteamID based authentication */ +#define AUTHMETHOD_IP "ip" /**< IP based authentication */ +#define AUTHMETHOD_NAME "name" /**< Name based authentication */ + +/** + * @endsection + */ + +/** + * Access override types. + */ +enum OverrideType +{ + Override_Command = 1, /**< Command */ + Override_CommandGroup, /**< Command group */ +}; + +/** + * Access override rules. + */ +enum OverrideRule +{ + Command_Deny = 0, + Command_Allow = 1, +}; + +/** + * DEPRECATED, do not use. + */ +enum ImmunityType +{ + Immunity_Default = 1, /**< Deprecated. */ + Immunity_Global, /**< Deprecated. */ +}; + +/** + * Identifies a unique entry in the group permissions cache. These are not Handles. + */ +enum GroupId +{ + INVALID_GROUP_ID = -1, /**< An invalid/non-existent group */ +}; + +/** + * Identifies a unique entry in the admin permissions cache. These are not Handles. + */ +enum AdminId +{ + INVALID_ADMIN_ID = -1, /**< An invalid/non-existent admin */ +}; + +/** + * Methods of computing access permissions. + */ +enum AdmAccessMode +{ + Access_Real, /**< Access the user has inherently */ + Access_Effective, /**< Access the user has from their groups */ +}; + +/** + * Represents the various cache regions. + */ +enum AdminCachePart +{ + AdminCache_Overrides = 0, /**< Global overrides */ + AdminCache_Groups = 1, /**< All groups (automatically invalidates admins too) */ + AdminCache_Admins = 2, /**< All admins */ +}; + +/** + * Called when part of the cache needs to be rebuilt. + * + * @param part Part of the admin cache to rebuild. + */ +forward OnRebuildAdminCache(AdminCachePart:part); + +/** + * Tells the admin system to dump a portion of the cache. + * + * @param part Part of the cache to dump. Specifying groups also dumps admins. + * @param rebuild If true, the rebuild forwards will fire. + * @noreturn + */ +native DumpAdminCache(AdminCachePart:part, bool:rebuild); + +/** + * Adds a global command flag override. Any command registered with this name + * will assume the new flag. This is applied retroactively as well. + * + * @param cmd String containing command name (case sensitive). + * @param type Override type (specific command or group). + * @param flags New admin flag. + * @noreturn + */ +native AddCommandOverride(const String:cmd[], OverrideType:type, flags); + +/** + * Returns a command override. + * + * @param cmd String containing command name (case sensitive). + * @param type Override type (specific command or group). + * @param flags By-reference cell to store the flag (undefined if not found). + * @return True if there is an override, false otherwise. + */ +native bool:GetCommandOverride(const String:cmd[], OverrideType:type, &flags); + +/** + * Unsets a command override. + * + * @param cmd String containing command name (case sensitive). + * @param type Override type (specific command or group). + * @noreturn + */ +native UnsetCommandOverride(const String:cmd[], OverrideType:type); + +/** + * Adds a new group. Name must be unique. + * + * @param group_name String containing the group name. + * @return A new group id, INVALID_GROUP_ID if it already exists. + */ +native GroupId:CreateAdmGroup(const String:group_name[]); + +/** + * Finds a group by name. + * + * @param group_name String containing the group name. + * @return A group id, or INVALID_GROUP_ID if not found. + */ +native GroupId:FindAdmGroup(const String:group_name[]); + +/** + * Adds or removes a flag from a group's flag set. + * @note These are called "add flags" because they add to a user's flags. + * + * @param id Group id. + * @param flag Admin flag to toggle. + * @param enabled True to set the flag, false to unset/disable. + * @noreturn + */ +native SetAdmGroupAddFlag(GroupId:id, AdminFlag:flag, bool:enabled); + +/** + * Gets the set value of an add flag on a group's flag set. + * @note These are called "add flags" because they add to a user's flags. + * + * @param id Group id. + * @param flag Admin flag to retrieve. + * @return True if enabled, false otherwise, + */ +native bool:GetAdmGroupAddFlag(GroupId:id, AdminFlag:flag); + +/** + * Returns the flag set that is added to a user from their group. + * @note These are called "add flags" because they add to a user's flags. + * + * @param id GroupId of the group. + * @return Bitstring containing the flags enabled. + */ +native GetAdmGroupAddFlags(GroupId:id); + +/** + * @deprecated Functionality removed. + */ +#pragma deprecated Use SetAdmGroupImmunityLevel() instead. +native SetAdmGroupImmunity(GroupId:id, ImmunityType:type, bool:enabled); + +/** + * @deprecated Functionality removed. + */ +#pragma deprecated Use GetAdmGroupImmunityLevel() instead. +native bool:GetAdmGroupImmunity(GroupId:id, ImmunityType:type); + +/** + * Adds immunity to a specific group. + * + * @param id Group id. + * @param other_id Group id to receive immunity to. + * @noreturn + */ +native SetAdmGroupImmuneFrom(GroupId:id, GroupId:other_id); + +/** + * Returns the number of specific group immunities. + * + * @param id Group id. + * @return Number of group immunities. + */ +native GetAdmGroupImmuneCount(GroupId:id); + +/** + * Returns a group that this group is immune to given an index. + * + * @param id Group id. + * @param number Index from 0 to N-1, from GetAdmGroupImmuneCount(). + * @return GroupId that this group is immune to, or INVALID_GROUP_ID on failure. + */ +native GroupId:GetAdmGroupImmuneFrom(GroupId:id, number); + +/** + * Adds a group-specific override type. + * + * @param id Group id. + * @param name String containing command name (case sensitive). + * @param type Override type (specific command or group). + * @param rule Override allow/deny setting. + * @noreturn + */ +native AddAdmGroupCmdOverride(GroupId:id, const String:name[], OverrideType:type, OverrideRule:rule); + +/** + * Retrieves a group-specific command override. + * + * @param id Group id. + * @param name String containing command name (case sensitive). + * @param type Override type (specific command or group). + * @param rule Optional pointer to store allow/deny setting. + * @return True if an override exists, false otherwise. + */ +native bool:GetAdmGroupCmdOverride(GroupId:id, const String:name[], OverrideType:type, &OverrideRule:rule); + +/** + * Registers an authentication identity type. You normally never need to call this except for + * very specific systems. + * + * @param name Codename to use for your authentication type. + * @noreturn + */ +native RegisterAuthIdentType(const String:name[]); + +/** + * Creates a new admin entry in the permissions cache. + * + * @param name Name for this entry (does not have to be unique). + * Specify an empty string for an anonymous admin. + */ +native AdminId:CreateAdmin(const String:name[]=""); + +/** + * Retrieves an admin's user name as made with CreateAdmin(). + * + * @note This function can return UTF-8 strings, and will safely chop UTF-8 strings. + * + * @param id AdminId of the admin. + * @param name String buffer to store name. + * @param maxlength Maximum size of string buffer. + * @return Number of bytes written. + */ +native GetAdminUsername(AdminId:id, String:name[], maxlength); + +/** + * Binds an admin to an identity for fast lookup later on. The bind must be unique. + * + * @param id AdminId of the admin. + * @param auth Auth method to use, predefined or from RegisterAuthIdentType(). + * @param ident String containing the arbitrary, unique identity. + * @return True on success, false if the auth method was not found, + * or ident was already taken. + */ +native bool:BindAdminIdentity(AdminId:id, const String:auth[], const String:ident[]); + +/** + * Sets whether or not a flag is enabled on an admin. + * + * @param id AdminId index of the admin. + * @param flag Admin flag to use. + * @param enabled True to enable, false to disable. + * @noreturn + */ +native SetAdminFlag(AdminId:id, AdminFlag:flag, bool:enabled); + +/** + * Returns whether or not a flag is enabled on an admin. + * + * @param id AdminId index of the admin. + * @param flag Admin flag to use. + * @param mode Access mode to check. + * @return True if enabled, false otherwise. + */ +native bool:GetAdminFlag(AdminId:id, AdminFlag:flag, AdmAccessMode:mode=Access_Effective); + +/** + * Returns the bitstring of access flags on an admin. + * + * @param id AdminId index of the admin. + * @param mode Access mode to use. + * @return A bitstring containing which flags are enabled. + */ +native GetAdminFlags(AdminId:id, AdmAccessMode:mode); + +/** + * Adds a group to an admin's inherited group list. Any flags the group has + * will be added to the admin's effective flags. + * + * @param id AdminId index of the admin. + * @param gid GroupId index of the group. + * @return True on success, false on invalid input or duplicate membership. + */ +native bool:AdminInheritGroup(AdminId:id, GroupId:gid); + +/** + * Returns the number of groups this admin is a member of. + * + * @param id AdminId index of the admin. + * @return Number of groups this admin is a member of. + */ +native GetAdminGroupCount(AdminId:id); + +/** + * Returns group information from an admin. + * + * @param id AdminId index of the admin. + * @param index Group number to retrieve, from 0 to N-1, where N + * is the value of GetAdminGroupCount(id). + * @param name Buffer to store the group's name. + * Note: This will safely chop UTF-8 strings. + * @param maxlength Maximum size of the output name buffer. + * @return A GroupId index and a name pointer, or + * INVALID_GROUP_ID and NULL if an error occurred. +*/ +native GroupId:GetAdminGroup(AdminId:id, index, const String:name[], maxlength); + +/** + * Sets a password on an admin. + * + * @param id AdminId index of the admin. + * @param password String containing the password. + * @noreturn + */ +native SetAdminPassword(AdminId:id, const String:password[]); + +/** + * Gets an admin's password. + * + * @param id AdminId index of the admin. + * @param buffer Optional buffer to store the admin's password. + * @param maxlength Maximum size of the output name buffer. + * Note: This will safely chop UTF-8 strings. + * @return True if there was a password set, false otherwise. + */ +native bool:GetAdminPassword(AdminId:id, String:buffer[]="", maxlength=0); + +/** + * Attempts to find an admin by an auth method and an identity. + * + * @param auth Auth method to try. + * @param identity Identity string to look up. + * @return An AdminId index if found, INVALID_ADMIN_ID otherwise. + */ +native AdminId:FindAdminByIdentity(const String:auth[], const String:identity[]); + +/** + * Removes an admin entry from the cache. + * + * @note This will remove any bindings to a specific user. + * + * @param id AdminId index to remove/invalidate. + * @return True on success, false otherwise. + */ +native bool:RemoveAdmin(AdminId:id); + +/** + * Converts a flag bit string to a bit array. + * + * @param bits Bit string containing the flags. + * @param array Array to write the flags to. Enabled flags will be 'true'. + * @param maxSize Maximum number of flags the array can store. + * @return Number of flags written. + */ +native FlagBitsToBitArray(bits, bool:array[], maxSize); + +/** + * Converts a flag array to a bit string. + * + * @param array Array containing true or false for each AdminFlag. + * @param maxSize Maximum size of the flag array. + * @return A bit string composed of the array bits. + */ +native FlagBitArrayToBits(const bool:array[], maxSize); + +/** + * Converts an array of flags to bits. + * + * @param array Array containing flags that are enabled. + * @param numFlags Number of flags in the array. + * @return A bit string composed of the array flags. + */ +native FlagArrayToBits(const AdminFlag:array[], numFlags); + +/** + * Converts a bit string to an array of flags. + * + * @param bits Bit string containing the flags. + * @param array Output array to write flags. + * @param maxSize Maximum size of the flag array. + * @return Number of flags written. + */ +native FlagBitsToArray(bits, AdminFlag:array[], maxSize); + +/** + * Finds a flag by its string name. + * + * @param name Flag name (like "kick"), case sensitive. + * @param flag Variable to store flag in. + * @return True on success, false if not found. + */ +native bool:FindFlagByName(const String:name[], &AdminFlag:flag); + +/** + * Finds a flag by a given character. + * + * @param c Flag ASCII character/token. + * @param flag Variable to store flag in. + * @return True on success, false if not found. + */ +native bool:FindFlagByChar(c, &AdminFlag:flag); + +/** + * Finds a flag char by a gived admin flag. + * + * @param flag Flag to look up. + * @param c Variable to store flag char. + * @return True on success, false if not found. + */ +native bool:FindFlagChar(AdminFlag:flag, &c); + +/** + * Converts a string of flag characters to a bit string. + * + * @param flags Flag ASCII string. + * @param numchars Optional variable to store the number of bytes read. + * @return Bit string of ADMFLAG values. + */ +native ReadFlagString(const String:flags[], &numchars=0); + +/** + * Tests whether one admin can target another. + * + * The heuristics for this check are as follows: + * 0. If the targeting AdminId is INVALID_ADMIN_ID, targeting fails. + * 1. If the targeted AdminId is INVALID_ADMIN_ID, targeting succeeds. + * 2. If the targeted AdminId is the same as the targeting AdminId, + * (self) targeting succeeds. + * 3. If the targeting admin is root, targeting succeeds. + * 4. If the targeted admin has access higher (as interpreted by + * (sm_immunity_mode) than the targeting admin, then targeting fails. + * 5. If the targeted admin has specific immunity from the + * targeting admin via group immunities, targeting fails. + * 6. Targeting succeeds. + * + * @param admin Admin doing the targetting (may be INVALID_ADMIN_ID). + * @param target Target admin (may be INVALID_ADMIN_ID). + * @return True if targetable, false if immune. + */ +native CanAdminTarget(AdminId:admin, AdminId:target); + +/** + * Creates an admin auth method. This does not need to be called more than once + * per method, ever. + * + * @param method Name of the authentication method. + * @return True on success, false on failure. + */ +native bool:CreateAuthMethod(const String:method[]); + +/** + * Sets a group's immunity level. + * + * @param gid Group Id. + * @param level Immunity level value. + * @return Old immunity level value. + */ +native SetAdmGroupImmunityLevel(GroupId:gid, level); + +/** + * Gets a group's immunity level (defaults to 0). + * + * @param gid Group Id. + * @return Immunity level value. + */ +native GetAdmGroupImmunityLevel(GroupId:gid); + +/** + * Sets an admin's immunity level. + * + * @param id Admin Id. + * @param level Immunity level value. + * @return Old immunity level value. + */ +native SetAdminImmunityLevel(AdminId:id, level); + +/** + * Gets an admin's immunity level. + * + * @param id Admin Id. + * @return Immunity level value. + */ +native GetAdminImmunityLevel(AdminId:id); + +/** + * Converts a flag to its single bit. + * + * @param flag Flag to convert. + * @return Bit representation of the flag. + */ +stock FlagToBit(AdminFlag:flag) +{ + return (1<<_:flag); +} + +/** + * Converts a bit to an AdminFlag. + * + * @param bit Bit to convert. + * @param flag Stores the converted flag by reference. + * @return True on success, false otherwise. + */ +stock bool:BitToFlag(bit, &AdminFlag:flag) +{ + new AdminFlag:array[1]; + + if (FlagBitsToArray(bit, array, 1)) + { + flag = array[0]; + return true; + } + + return false; +} + diff --git a/addons/sourcemod/scripting/include/adminmenu.inc b/addons/sourcemod/scripting/include/adminmenu.inc new file mode 100644 index 0000000..f96eb2a --- /dev/null +++ b/addons/sourcemod/scripting/include/adminmenu.inc @@ -0,0 +1,154 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _adminmenu_included + #endinput +#endif +#define _adminmenu_included + +/* Decide whether topmenus should be required */ +#if !defined REQUIRE_PLUGIN + #if defined REQUIRE_EXTENSIONS + #define TEMP_REQUIRE_EXTENSIONS + #undef REQUIRE_EXTENSIONS + #endif +#endif + +#include + +/* Restore old REQUIRE_EXTENSIONS value if necessary */ +#if defined TEMP_REQUIRE_EXTENSIONS + #define REQUIRE_EXTENSIONS + #undef TEMP_REQUIRE_EXTENSIONS +#endif + +/** Category for player commands. */ +#define ADMINMENU_PLAYERCOMMANDS "PlayerCommands" +/** Category for server commands. */ +#define ADMINMENU_SERVERCOMMANDS "ServerCommands" +/** Category for voting commands. */ +#define ADMINMENU_VOTINGCOMMANDS "VotingCommands" + +/** + * Called when the admin menu is created and 3rd party plugins can grab + * the Handle or add categories. + * + * @param topmenu Handle to the admin menu's TopMenu. + * @noreturn + */ +forward OnAdminMenuCreated(Handle:topmenu); + +/** + * Called when the admin menu is ready to have items added. + * + * @param topmenu Handle to the admin menu's TopMenu. + * @noreturn + */ +forward OnAdminMenuReady(Handle:topmenu); + +/** + * Retrieves the Handle to the admin top menu. + * + * @return Handle to the admin menu's TopMenu, + * or INVALID_HANDLE if not created yet. + */ +native Handle:GetAdminTopMenu(); + +/** + * Adds targets to an admin menu. + * + * Each client is displayed as: name (userid) + * Each item contains the userid as a string for its info. + * + * @param menu Menu Handle. + * @param source_client Source client, or 0 to ignore immunity. + * @param in_game_only True to only select in-game players. + * @param alive_only True to only select alive players. + * @return Number of clients added. + */ +native AddTargetsToMenu(Handle:menu, + source_client, + bool:in_game_only=true, + bool:alive_only=false); + +/** + * Adds targets to an admin menu. + * + * Each client is displayed as: name (userid) + * Each item contains the userid as a string for its info. + * + * @param menu Menu Handle. + * @param source_client Source client, or 0 to ignore immunity. + * @param flags COMMAND_FILTER flags from commandfilters.inc. + * @return Number of clients added. + */ +native AddTargetsToMenu2(Handle:menu, source_client, flags); + +/** + * Re-displays the admin menu to a client after selecting an item. + * Auto-aborts if the Handle is invalid. + * + * @param topmenu TopMenu Handle. + * @param client Client index. + * @return True on success, false on failure. + */ +stock bool:RedisplayAdminMenu(Handle:topmenu, client) +{ + if (topmenu == INVALID_HANDLE) + { + return false; + } + + return DisplayTopMenu(topmenu, client, TopMenuPosition_LastCategory); +} + +/* DO NOT EDIT BELOW THIS LINE */ + +public SharedPlugin:__pl_adminmenu = +{ + name = "adminmenu", + file = "adminmenu.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public __pl_adminmenu_SetNTVOptional() +{ + MarkNativeAsOptional("GetAdminTopMenu"); + MarkNativeAsOptional("AddTargetsToMenu"); + MarkNativeAsOptional("AddTargetsToMenu2"); +} +#endif diff --git a/addons/sourcemod/scripting/include/adt.inc b/addons/sourcemod/scripting/include/adt.inc new file mode 100644 index 0000000..75051bf --- /dev/null +++ b/addons/sourcemod/scripting/include/adt.inc @@ -0,0 +1,40 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _adt_included + #endinput +#endif +#define _adt_included + +#include +#include +#include diff --git a/addons/sourcemod/scripting/include/adt_array.inc b/addons/sourcemod/scripting/include/adt_array.inc new file mode 100644 index 0000000..798ae55 --- /dev/null +++ b/addons/sourcemod/scripting/include/adt_array.inc @@ -0,0 +1,283 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _adt_array_included + #endinput +#endif +#define _adt_array_included + +/** + * Given a maximum string size (including the null terminator), + * returns the number of cells required to fit that string. + * + * @param size Number of bytes. + * @return Minimum number of cells required to fit the byte count. + */ +stock ByteCountToCells(size) +{ + if (!size) + { + return 1; + } + + return (size + 3) / 4; +} + +/** + * Creates a dynamic global cell array. While slower than a normal array, + * it can be used globally AND dynamically, which is otherwise impossible. + * + * The contents of the array are uniform; i.e. storing a string at index X + * and then retrieving it as an integer is NOT the same as StringToInt()! + * The "blocksize" determines how many cells each array slot has; it cannot + * be changed after creation. + * + * @param blocksize The number of cells each member of the array can + * hold. For example, 32 cells is equivalent to: + * new Array[X][32] + * @param startsize Initial size of the array. Note that data will + * NOT be auto-intialized. + * @return New Handle to the array object. + */ +native Handle:CreateArray(blocksize=1, startsize=0); + +/** + * Clears an array of all entries. This is the same as ResizeArray(0). + * + * @param array Array Handle. + * @noreturn + * @error Invalid Handle. + */ +native ClearArray(Handle:array); + +/** + * Clones an array, returning a new handle with the same size and data. This should NOT + * be confused with CloneHandle. This is a completely new handle with the same data but + * no relation to the original. You MUST close it. + * + * @param array Array handle to be cloned + * @return New handle to the cloned array object + * @error Invalid Handle + */ +native Handle:CloneArray(Handle:array); + +/** + * Resizes an array. If the size is smaller than the current size, + * the array is truncated. + * + * @param array Array Handle. + * @param newsize New size. + * @noreturn + * @error Invalid Handle or out of memory. + */ +native bool:ResizeArray(Handle:array, newsize); + +/** + * Returns the array size. + * + * @param array Array Handle. + * @return Number of elements in the array. + * @error Invalid Handle. + */ +native GetArraySize(Handle:array); + +/** + * Pushes a value onto the end of an array, adding a new index. + * + * This may safely be used even if the array has a blocksize + * greater than 1. + * + * @param array Array Handle. + * @param value Value to push. + * @return Index of the new entry. + * @error Invalid Handle or out of memory. + */ +native PushArrayCell(Handle:array, any:value); + +/** + * Pushes a string onto the end of an array, truncating it + * if it is too big. + * + * @param array Array Handle. + * @param value String to push. + * @return Index of the new entry. + * @error Invalid Handle or out of memory. + */ +native PushArrayString(Handle:array, const String:value[]); + +/** + * Pushes an array of cells onto the end of an array. The cells + * are pushed as a block (i.e. the entire array sits at the index), + * rather than pushing each cell individually. + * + * @param array Array Handle. + * @param values Block of values to copy. + * @param size If not set, the number of elements copied from the array + * will be equal to the blocksize. If set higher than the + * blocksize, the operation will be truncated. + * @return Index of the new entry. + * @error Invalid Handle or out of memory. + */ +native PushArrayArray(Handle:array, const any:values[], size=-1); + +/** + * Retrieves a cell value from an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param block Optionally specify which block to read from + * (useful if the blocksize > 0). + * @param asChar Optionally read as a byte instead of a cell. + * @return Value read. + * @error Invalid Handle, invalid index, or invalid block. + */ +native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false); + +/** + * Retrieves a string value from an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param buffer Buffer to copy to. + * @param maxlength Maximum size of the buffer. + * @return Number of characters copied. + * @error Invalid Handle or invalid index. + */ +native GetArrayString(Handle:array, index, String:buffer[], maxlength); + +/** + * Retrieves an array of cells from an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param buffer Buffer to store the array in. + * @param size If not set, assumes the buffer size is equal to the + * blocksize. Otherwise, the size passed is used. + * @return Number of cells copied. + * @error Invalid Handle or invalid index. + */ +native GetArrayArray(Handle:array, index, any:buffer[], size=-1); + +/** + * Sets a cell value in an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param value Cell value to set. + * @param block Optionally specify which block to write to + * (useful if the blocksize > 0). + * @param asChar Optionally set as a byte instead of a cell. + * @noreturn + * @error Invalid Handle, invalid index, or invalid block. + */ +native SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false); + +/** + * Sets a string value in an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param value String value to set. + * @return Number of characters copied. + * @error Invalid Handle or invalid index. + */ +native SetArrayString(Handle:array, index, const String:value[]); + +/** + * Sets an array of cells in an array. + * + * @param array Array Handle. + * @param index Index in the array. + * @param values Array to copy. + * @param size If not set, assumes the buffer size is equal to the + * blocksize. Otherwise, the size passed is used. + * @return Number of cells copied. + * @error Invalid Handle or invalid index. + */ +native SetArrayArray(Handle:array, index, const any:values[], size=-1); + +/** + * Shifts an array up. All array contents after and including the given + * index are shifted up by one, and the given index is then "free." + * After shifting, the contents of the given index is undefined. + * + * @param array Array Handle. + * @param index Index in the array to shift up from. + * @noreturn + * @error Invalid Handle or invalid index. + */ +native ShiftArrayUp(Handle:array, index); + +/** + * Removes an array index, shifting the entire array down from that position + * on. For example, if item 8 of 10 is removed, the last 3 items will then be + * (6,7,8) instead of (7,8,9), and all indexes before 8 will remain unchanged. + * + * @param array Array Handle. + * @param index Index in the array to remove at. + * @noreturn + * @error Invalid Handle or invalid index. + */ +native RemoveFromArray(Handle:array, index); + +/** + * Swaps two items in the array. + * + * @param array Array Handle. + * @param index1 First index. + * @param index2 Second index. + * @noreturn + * @error Invalid Handle or invalid index. + */ +native SwapArrayItems(Handle:array, index1, index2); + +/** + * Returns the index for the first occurance of the provided string. If the string + * cannot be located, -1 will be returned. + * + * @param array Array Handle. + * @param item String to search for + * @return Array index, or -1 on failure + * @error Invalid Handle + */ +native FindStringInArray(Handle:array, const String:item[]); + +/** + * Returns the index for the first occurance of the provided value. If the value + * cannot be located, -1 will be returned. + * + * @param array Array Handle. + * @param item Value to search for + * @return Array index, or -1 on failure + * @error Invalid Handle + */ +native FindValueInArray(Handle:array, any:item); diff --git a/addons/sourcemod/scripting/include/adt_stack.inc b/addons/sourcemod/scripting/include/adt_stack.inc new file mode 100644 index 0000000..54029c3 --- /dev/null +++ b/addons/sourcemod/scripting/include/adt_stack.inc @@ -0,0 +1,154 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _adt_stack_included + #endinput +#endif +#define _adt_stack_included + +/** + * Creates a stack structure. A stack is a LIFO (last in, first out) + * vector (array) of items. It has O(1) insertion and O(1) removal. + * + * Stacks have two operations: Push (adding an item) and Pop (removes + * items in reverse-push order). + * + * The contents of the stack are uniform; i.e. storing a string and then + * retrieving it as an integer is NOT the same as StringToInt()! + * + * The "blocksize" determines how many cells each slot has; it cannot + * be changed after creation. + * + * @param blocksize The number of cells each entry in the stack can + * hold. For example, 32 cells is equivalent to: + * new Array[X][32] + * @return New stack Handle. + */ +native Handle:CreateStack(blocksize=1); + +/** + * Pushes a value onto the end of the stack, adding a new index. + * + * This may safely be used even if the stack has a blocksize + * greater than 1. + * + * @param stack Stack Handle. + * @param value Value to push. + * @noreturn + * @error Invalid Handle or out of memory. + */ +native PushStackCell(Handle:stack, any:value); + +/** + * Pushes a string onto the end of a stack, truncating it if it is + * too big. + * + * @param stack Stack Handle. + * @param value String to push. + * @noreturn + * @error Invalid Handle or out of memory. + */ +native PushStackString(Handle:stack, const String:value[]); + +/** + * Pushes an array of cells onto the end of a stack. The cells + * are pushed as a block (i.e. the entire array takes up one stack slot), + * rather than pushing each cell individually. + * + * @param stack Stack Handle. + * @param values Block of values to copy. + * @param size If not set, the number of elements copied from the array + * will be equal to the blocksize. If set higher than the + * blocksize, the operation will be truncated. + * @noreturn + * @error Invalid Handle or out of memory. + */ +native PushStackArray(Handle:stack, const any:values[], size=-1); + +/** + * Pops a cell value from a stack. + * + * @param stack Stack Handle. + * @param value Variable to store the value. + * @param block Optionally specify which block to read from + * (useful if the blocksize > 0). + * @param asChar Optionally read as a byte instead of a cell. + * @return True on success, false if the stack is empty. + * @error Invalid Handle. + */ +native bool:PopStackCell(Handle:stack, &any:value, block=0, bool:asChar=false); + +/** + * Pops a string value from a stack. + * + * @param stack Stack Handle. + * @param buffer Buffer to store string. + * @param maxlength Maximum size of the buffer. + * @return True on success, false if the stack is empty. + * @error Invalid Handle. + */ +native bool:PopStackString(Handle:stack, String:buffer[], maxlength, &written=0); + +/** + * Pops an array of cells from a stack. + * + * @param stack Stack Handle. + * @param buffer Buffer to store the array in. + * @param size If not set, assumes the buffer size is equal to the + * blocksize. Otherwise, the size passed is used. + * @return True on success, false if the stack is empty. + * @error Invalid Handle. + */ +native bool:PopStackArray(Handle:stack, any:buffer[], size=-1); + +/** + * Checks if a stack is empty. + * + * @param stack Stack Handle. + * @return True if empty, false if not empty. + * @error Invalid Handle. + */ +native bool:IsStackEmpty(Handle:stack); + +/** + * Pops a value off a stack, ignoring it completely. + * + * @param stack Stack Handle. + * @return True if something was popped, false otherwise. + * @error Invalid Handle. + */ +stock PopStack(Handle:stack) +{ + new value; + + return PopStackCell(stack, value); +} diff --git a/addons/sourcemod/scripting/include/adt_trie.inc b/addons/sourcemod/scripting/include/adt_trie.inc new file mode 100644 index 0000000..4e9f120 --- /dev/null +++ b/addons/sourcemod/scripting/include/adt_trie.inc @@ -0,0 +1,156 @@ +/** + * vim: set ts=4 sw=4 tw=99 noet : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _adt_trie_included + #endinput +#endif +#define _adt_trie_included + +/** + * Creates a hash map. A hash map is a container that can map strings (called + * "keys") to arbitrary values (cells, arrays, or strings). Keys in a hash map + * are unique. That is, there is at most one entry in the map for a given key. + * + * Insertion, deletion, and lookup in a hash map are all considered to be fast + * operations, amortized to O(1), or constant time. + * + * The word "Trie" in this API is historical. As of SourceMod 1.6, tries have + * been internally replaced with hash tables, which have O(1) insertion time + * instead of O(n). + * + * @return New Map Handle, which must be freed via CloseHandle(). + */ +native Handle:CreateTrie(); + +/** + * Sets a value in a hash map, either inserting a new entry or replacing an old one. + * + * @param map Map Handle. + * @param key Key string. + * @param value Value to store at this key. + * @param replace If false, operation will fail if the key is already set. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:SetTrieValue(Handle:map, const String:key[], any:value, bool:replace=true); + +/** + * Sets an array value in a Map, either inserting a new entry or replacing an old one. + * + * @param map Map Handle. + * @param key Key string. + * @param array Array to store. + * @param num_items Number of items in the array. + * @param replace If false, operation will fail if the key is already set. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:SetTrieArray(Handle:map, const String:key[], const any:array[], num_items, bool:replace=true); + +/** + * Sets a string value in a Map, either inserting a new entry or replacing an old one. + * + * @param map Map Handle. + * @param key Key string. + * @param value String to store. + * @param replace If false, operation will fail if the key is already set. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:SetTrieString(Handle:map, const String:key[], const String:value[], bool:replace=true); + +/** + * Retrieves a value in a Map. + * + * @param map Map Handle. + * @param key Key string. + * @param value Variable to store value. + * @return True on success. False if the key is not set, or the key is set + * as an array or string (not a value). + * @error Invalid Handle. + */ +native bool:GetTrieValue(Handle:map, const String:key[], &any:value); + +/** + * Retrieves an array in a Map. + * + * @param map Map Handle. + * @param key Key string. + * @param array Buffer to store array. + * @param max_size Maximum size of array buffer. + * @param size Optional parameter to store the number of elements written to the buffer. + * @return True on success. False if the key is not set, or the key is set + * as a value or string (not an array). + * @error Invalid Handle. + */ +native bool:GetTrieArray(Handle:map, const String:key[], any:array[], max_size, &size=0); + +/** + * Retrieves a string in a Map. + * + * @param map Map Handle. + * @param key Key string. + * @param value Buffer to store value. + * @param max_size Maximum size of string buffer. + * @param size Optional parameter to store the number of bytes written to the buffer. + * @return True on success. False if the key is not set, or the key is set + * as a value or array (not a string). + * @error Invalid Handle. + */ +native bool:GetTrieString(Handle:map, const String:key[], String:value[], max_size, &size=0); + +/** + * Removes a key entry from a Map. + * + * @param map Map Handle. + * @param key Key string. + * @return True on success, false if the value was never set. + * @error Invalid Handle. + */ +native RemoveFromTrie(Handle:map, const String:key[]); + +/** + * Clears all entries from a Map. + * + * @param map Map Handle. + * @error Invalid Handle. + */ +native ClearTrie(Handle:map); + +/** + * Retrieves the number of elements in a map. + * + * @param map Map Handle. + * @return Number of elements in the trie. + * @error Invalid Handle. + */ +native GetTrieSize(Handle:map); diff --git a/addons/sourcemod/scripting/include/banning.inc b/addons/sourcemod/scripting/include/banning.inc new file mode 100644 index 0000000..038b113 --- /dev/null +++ b/addons/sourcemod/scripting/include/banning.inc @@ -0,0 +1,157 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _banning_included + #endinput +#endif +#define _banning_included + +#define BANFLAG_AUTO (1<<0) /**< Auto-detects whether to ban by steamid or IP */ +#define BANFLAG_IP (1<<1) /**< Always ban by IP address */ +#define BANFLAG_AUTHID (1<<2) /**< Always ban by authstring (for BanIdentity) if possible */ +#define BANFLAG_NOKICK (1<<3) /**< Does not kick the client */ + +/** + * Called for calls to BanClient() with a non-empty command. + * + * @param client Client being banned. + * @param time Time the client is being banned for (0 = permanent). + * @param flags One if AUTHID or IP will be enabled. If AUTO is also + * enabled, it means Core autodetected which to use. + * @param reason Reason passed via BanClient(). + * @param kick_message Kick message passed via BanClient(). + * @param command Command string to identify the ban source. + * @param source Source value passed via BanClient(). + * @return Plugin_Handled to block the actual server banning. + * Kicking will still occur. + */ +forward Action:OnBanClient(client, + time, + flags, + const String:reason[], + const String:kick_message[], + const String:command[], + any:source); + +/** + * Called for calls to BanIdentity() with a non-empty command. + * + * @param identity Identity string being banned (authstring or ip). + * @param time Time the client is being banned for (0 = permanent). + * @param flags Ban flags (only IP or AUTHID are valid here). + * @param reason Reason passed via BanIdentity(). + * @param command Command string to identify the ban source. + * @param source Source value passed via BanIdentity(). + * @return Plugin_Handled to block the actual server banning. + */ +forward Action:OnBanIdentity(const String:identity[], + time, + flags, + const String:reason[], + const String:command[], + any:source); + +/** + * Called for calls to RemoveBan() with a non-empty command. + * + * @param identity Identity string being banned (authstring or ip). + * @param flags Ban flags (only IP or AUTHID are valid here). + * @param command Command string to identify the ban source. + * @param source Source value passed via BanIdentity(). + * @return Plugin_Handled to block the actual server banning. + */ +forward Action:OnRemoveBan(const String:identity[], + flags, + const String:command[], + any:source); + +/** + * Bans a client. + * + * @param client Client being banned. + * @param time Time (in minutes) to ban (0 = permanent). + * @param flags Flags for controlling the ban mechanism. If AUTHID + * is set and no AUTHID is available, the ban will fail + * unless AUTO is also flagged. + * @param reason Reason to ban the client for. + * @param kick_message Message to display to the user when kicking. + * @param command Command string to identify the source. If this is left + * empty, then the OnBanClient forward will not be called. + * @param source A source value that could be interpreted as a player + * index of any sort (not actually checked by Core). + * @return True on success, false on failure. + * @error Invalid client index or client not in game. + */ +native bool:BanClient(client, + time, + flags, + const String:reason[], + const String:kick_message[]="", + const String:command[]="", + any:source=0); + +/** + * Bans an identity (either an IP address or auth string). + * + * @param identity String to ban (ip or authstring). + * @param time Time to ban for (0 = permanent). + * @param flags Flags (only IP and AUTHID are valid flags here). + * @param reason Ban reason string. + * @param command Command string to identify the source. If this is left + * empty, then the OnBanIdentity forward will not be called. + * @param source A source value that could be interpreted as a player + * index of any sort (not actually checked by Core). + * @return True on success, false on failure. + */ +native bool:BanIdentity(const String:identity[], + time, + flags, + const String:reason[], + const String:command[]="", + any:source=0); + +/** + * Removes a ban that was written to the server (either in memory or on disk). + * + * @param identity String to unban (ip or authstring). + * @param flags Flags (only IP and AUTHID are valid flags here). + * @param command Command string to identify the source. If this is left + * empty, then OnRemoveBan will not be called. + * @param source A source value that could be interpreted as a player + * index of any sort (not actually checked by Core). + * @return True on success, false on failure. + */ +native bool:RemoveBan(const String:identity[], + flags, + const String:command[]="", + any:source=0); + diff --git a/addons/sourcemod/scripting/include/basecomm.inc b/addons/sourcemod/scripting/include/basecomm.inc new file mode 100644 index 0000000..832afbc --- /dev/null +++ b/addons/sourcemod/scripting/include/basecomm.inc @@ -0,0 +1,109 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2011 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _basecomm_included + #endinput +#endif +#define _basecomm_included + +/** + * Called when a client is muted or unmuted + * + * @param client Client index + * @param muteState True if client was muted, false otherwise + */ + forward BaseComm_OnClientMute(client, bool:muteState); + + /** + * Called when a client is gagged or ungagged + * + * @param client Client index + * @param gagState True if client was gaged, false otherwise + */ + forward BaseComm_OnClientGag(client, bool:gagState); + +/** + * Returns whether or not a client is gagged + * + * @param client Client index. + * @return True if client is gagged, false otherwise. + */ +native bool:BaseComm_IsClientGagged(client); + +/** + * Returns whether or not a client is muted + * + * @param client Client index. + * @return True if client is muted, false otherwise. + */ +native bool:BaseComm_IsClientMuted(client); + +/** + * Sets a client's gag state + * + * @param client Client index. + * @param gagState True to gag client, false to ungag. + * @return True if this caused a change in gag state, false otherwise. + */ +native bool:BaseComm_SetClientGag(client, bool:gagState); + +/** + * Sets a client's mute state + * + * @param client Client index. + * @param muteState True to mute client, false to unmute. + * @return True if this caused a change in mute state, false otherwise. + */ +native bool:BaseComm_SetClientMute(client, bool:muteState); + +/* DO NOT EDIT BELOW THIS LINE */ + +public SharedPlugin:__pl_basecomm = +{ + name = "basecomm", + file = "basecomm.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public __pl_basecomm_SetNTVOptional() +{ + MarkNativeAsOptional("BaseComm_IsClientGagged"); + MarkNativeAsOptional("BaseComm_IsClientMuted"); + MarkNativeAsOptional("BaseComm_SetClientGag"); + MarkNativeAsOptional("BaseComm_SetClientMute"); +} +#endif diff --git a/addons/sourcemod/scripting/include/bitbuffer.inc b/addons/sourcemod/scripting/include/bitbuffer.inc new file mode 100644 index 0000000..fd1c18e --- /dev/null +++ b/addons/sourcemod/scripting/include/bitbuffer.inc @@ -0,0 +1,325 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _bitbuffer_included + #endinput +#endif +#define _bitbuffer_included + +/** + * Writes a single bit to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param bit Bit to write (true for 1, false for 0). + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteBool(Handle:bf, bool:bit); + +/** + * Writes a byte to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param byte Byte to write (value will be written as 8bit). + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteByte(Handle:bf, byte); + +/** + * Writes a byte to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param chr Character to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteChar(Handle:bf, chr); + +/** + * Writes a 16bit integer to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param num Integer to write (value will be written as 16bit). + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteShort(Handle:bf, num); + +/** + * Writes a 16bit unsigned integer to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param num Integer to write (value will be written as 16bit). + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteWord(Handle:bf, num); + +/** + * Writes a normal integer to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param num Integer to write (value will be written as 32bit). + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteNum(Handle:bf, num); + +/** + * Writes a floating point number to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param num Number to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteFloat(Handle:bf, Float:num); + +/** + * Writes a string to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param string Text string to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteString(Handle:bf, const String:string[]); + +/** + * Writes an entity to a writable bitbuffer (bf_write). + * @note This is a wrapper around BfWriteShort(). + * + * @param bf bf_write handle to write to. + * @param ent Entity index to write. + * @noreturn + * @error Invalid or incorrect Handle, or invalid entity. + */ +native BfWriteEntity(Handle:bf, ent); + +/** + * Writes a bit angle to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param angle Angle to write. + * @param numBits Optional number of bits to use. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteAngle(Handle:bf, Float:angle, numBits=8); + +/** + * Writes a coordinate to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param coord Coordinate to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteCoord(Handle:bf, Float:coord); + +/** + * Writes a 3D vector of coordinates to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param coord Coordinate array to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteVecCoord(Handle:bf, Float:coord[3]); + +/** + * Writes a 3D normal vector to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param vec Vector to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteVecNormal(Handle:bf, Float:vec[3]); + +/** + * Writes a 3D angle vector to a writable bitbuffer (bf_write). + * + * @param bf bf_write handle to write to. + * @param angles Angle vector to write. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfWriteAngles(Handle:bf, Float:angles[3]); + +/** + * Reads a single bit from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Bit value read. + * @error Invalid or incorrect Handle. + */ +native bool:BfReadBool(Handle:bf); + +/** + * Reads a byte from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Byte value read (read as 8bit). + * @error Invalid or incorrect Handle. + */ +native BfReadByte(Handle:bf); + +/** + * Reads a character from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Character value read. + * @error Invalid or incorrect Handle. + */ +native BfReadChar(Handle:bf); + +/** + * Reads a 16bit integer from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Integer value read (read as 16bit). + * @error Invalid or incorrect Handle. + */ +native BfReadShort(Handle:bf); + +/** + * Reads a 16bit unsigned integer from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Integer value read (read as 16bit). + * @error Invalid or incorrect Handle. + */ +native BfReadWord(Handle:bf); + +/** + * Reads a normal integer to a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Integer value read (read as 32bit). + * @error Invalid or incorrect Handle. + */ +native BfReadNum(Handle:bf); + +/** + * Reads a floating point number from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Floating point value read. + * @error Invalid or incorrect Handle. + */ +native Float:BfReadFloat(Handle:bf); + +/** + * Reads a string from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @param buffer Destination string buffer. + * @param maxlength Maximum length of output string buffer. + * @param line If true the buffer will be copied until it reaches a '\n' or a null terminator. + * @return Number of bytes written to the buffer. If the bitbuffer stream overflowed, + * that is, had no terminator before the end of the stream, then a negative + * number will be returned equal to the number of characters written to the + * buffer minus 1. The buffer will be null terminated regardless of the + * return value. + * @error Invalid or incorrect Handle. + */ +native BfReadString(Handle:bf, String:buffer[], maxlength, bool:line=false); + +/** + * Reads an entity from a readable bitbuffer (bf_read). + * @note This is a wrapper around BfReadShort(). + * + * @param bf bf_read handle to read from. + * @return Entity index read. + * @error Invalid or incorrect Handle. + */ +native BfReadEntity(Handle:bf); + +/** + * Reads a bit angle from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @param numBits Optional number of bits to use. + * @return Angle read. + * @error Invalid or incorrect Handle. + */ +native Float:BfReadAngle(Handle:bf, numBits=8); + +/** + * Reads a coordinate from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Coordinate read. + * @error Invalid or incorrect Handle. + */ +native Float:BfReadCoord(Handle:bf); + +/** + * Reads a 3D vector of coordinates from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @param coord Destination coordinate array. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfReadVecCoord(Handle:bf, Float:coord[3]); + +/** + * Reads a 3D normal vector from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @param vec Destination vector array. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfReadVecNormal(Handle:bf, Float:vec[3]); + +/** + * Reads a 3D angle vector from a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @param angles Destination angle vector. + * @noreturn + * @error Invalid or incorrect Handle. + */ +native BfReadAngles(Handle:bf, Float:angles[3]); + +/** + * Returns the number of bytes left in a readable bitbuffer (bf_read). + * + * @param bf bf_read handle to read from. + * @return Number of bytes left unread. + * @error Invalid or incorrect Handle. + */ +native BfGetNumBytesLeft(Handle:bf); diff --git a/addons/sourcemod/scripting/include/bonemerge.inc b/addons/sourcemod/scripting/include/bonemerge.inc new file mode 100644 index 0000000..f836586 --- /dev/null +++ b/addons/sourcemod/scripting/include/bonemerge.inc @@ -0,0 +1,237 @@ +/*************************************************************************** + * * + * BoneMerge Workaround * + * Author: Master Xykon * + * Version: 1.0.0 * + * * + **************************************************************************/ + +#include +#include + + #if defined _attachments_included + #endinput +#endif +#define _attachments_included + +// ---- Engine flags --------------------------------------------------------------- +#define EF_BONEMERGE (1 << 0) +#define EF_NOSHADOW (1 << 4) +#define EF_BONEMERGE_FASTCULL (1 << 7) +#define EF_PARENT_ANIMATES (1 << 9) + +new Handle:attachments_array = INVALID_HANDLE; +new gItem[MAXPLAYERS+1]; +new bool:delete_enabled[MAXPLAYERS+1] = false; +new gLink[MAXPLAYERS+1]; + +new bool:g_bSdkStarted = false; +new Handle:g_hSdkEquipWearable; +new Handle:g_hSdkRemoveWearable; + +/** + * Attaches a child to a parent. + * + * @param child Child entity. + * @param parent Parent entity. + * @param variant Attachment point. Empty for none. + * @return True if able to create attachment. False if fail. + * + * On error/Errors: If unable to create attachment. + */ +stock CAttach(child, parent, client, String:modelname[]) { + if (attachments_array == INVALID_HANDLE) attachments_array = CreateArray(2); + if (!IsValidEntity(child)) return false; + if (!IsValidEntity(parent)) return false; + new link = CGetLink(child); + if (link == -1 || !IsValidEntity(link)) link = CAddLink(child, client); + if (link == -1 || !IsValidEntity(link)) { + decl String:Classname[128]; + if (GetEdictClassname(child, Classname, sizeof(Classname))) ThrowError("Unable to create link for entity %s", Classname); + else ThrowError("Unable to create link for unknown entity"); + return false; + } + + new String:name[16]; + Format(name, sizeof(name), "target%i", parent); + DispatchKeyValue(parent, "targetname", name); + + new String:name2[32]; + GetEntPropString(parent, Prop_Data, "m_iName", name2, sizeof(name2)); + DispatchKeyValue(link, "parentname", name2); + + + SetVariantString(name2); + AcceptEntityInput(link, "SetParent", link, link, 0); + + SetVariantString("head"); + AcceptEntityInput(link, "SetParentAttachment", link, link, 0); + + return true; +} + +/** + * Detaches an entity from all its parents. Should be called before the entity is killed. + * + * @param ent Entity to detach. + * @return True if an attachment is destroyed. False if no attachment. + * + * On error/Errors: Never. + */ +stock CDetach(ent) { + if (attachments_array == INVALID_HANDLE) attachments_array = CreateArray(2); + + if (!IsValidEntity(ent)) return false; + + new link = CGetLink(ent); + if (link != -1) { + AcceptEntityInput(ent, "SetParent", -1, -1, 0); + if (IsValidEntity(link)) AcceptEntityInput(link, "kill"); + for (new i = 0; i < GetArraySize(attachments_array); i++) { + new ent2 = GetArrayCell(attachments_array, i); + if (ent == ent2) RemoveFromArray(attachments_array, i); + } + + return true; + } + return false; +} + +stock CGetLink(ent) { + for (new i = 0; i < GetArraySize(attachments_array); i++) { + new ent2 = GetArrayCell(attachments_array, i); + if (ent == ent2) return (GetArrayCell(attachments_array, i, 1)); + } + return -1; +} + +stock CAddLink(ent, client) { + new String:name_ent[16]; + Format(name_ent, sizeof(name_ent), "target%i", ent); + DispatchKeyValue(ent, "targetname", name_ent); + + new link = CreateEntityByName("prop_dynamic_override"); + if (IsValidEntity(link)) { + new String:name_link[16]; + Format(name_link, sizeof(name_link), "target%i", link); + DispatchKeyValue(link, "targetname", name_link); + + DispatchKeyValue(link, "classname", "prop_dynamic_override"); + DispatchKeyValue(link, "spawnflags", "1"); + SetEntPropFloat(link, Prop_Send, "m_flModelScale", 0.000000001); + + SetEntProp(link, Prop_Send, "m_CollisionGroup", 11); + + SetEntProp(link, Prop_Send, "m_fEffects", EF_BONEMERGE|EF_NOSHADOW|EF_PARENT_ANIMATES); + + decl String:m_szModelName[PLATFORM_MAX_PATH]; + GetEntPropString(client, Prop_Data, "m_ModelName", STRING(m_szModelName)); + SetEntityModel(link, m_szModelName); + + new m_iTeam = GetClientTeam(client); + SetEntProp(link, Prop_Send, "m_nSkin", (m_iTeam-2)); + + SetEntityRenderMode(link, RENDER_NONE); + AcceptEntityInput(link, "TurnOff", link, link, 0); + + SetVariantString(name_link); + AcceptEntityInput(ent, "SetParent", ent, ent, 0); + + SetVariantString("head"); + AcceptEntityInput(ent, "SetParentAttachment", ent, ent, 0); + + return link; + } + return -1; +} + +stock Attachable_CreateAttachable(client, parent, String:modelname[]) +{ + new m_iTeam = GetClientTeam(client); + gItem[client] = CreateEntityByName("prop_dynamic_override"); + + if (IsValidEdict(gItem[client])) + { + SetEntProp(gItem[client], Prop_Send, "m_nSkin", (m_iTeam-2)); + SetEntProp(gItem[client], Prop_Send, "m_CollisionGroup", 11); + + SetEntProp(gItem[client], Prop_Send, "m_fEffects", EF_BONEMERGE|EF_NOSHADOW|EF_PARENT_ANIMATES); + + DispatchKeyValue(gItem[client], "model", modelname); + + DispatchSpawn(gItem[client]); + ActivateEntity(gItem[client]); + AcceptEntityInput(gItem[client], "Start"); + + CAttach(gItem[client], parent, client, modelname); + + delete_enabled[client] = true; + } + + return gItem[client]; +} + +stock Attachable_UnhookEntity(client, ent) +{ + if (delete_enabled[client] == true) + { + CDetach(ent); + AcceptEntityInput(ent, "KillHierarchy"); + } +} + +stock TF2_SpawnWearable(iOwner, iDef=138, iLevel=22, iQuality=9) +{ + new m_iTeam = GetClientTeam(iOwner); + new iItem = CreateEntityByName("tf_wearable"); + + if (IsValidEdict(iItem)) + { + //SetEntProp(iItem, Prop_Send, "m_bInitialized", 1); // Disabling this avoids the crashes related to spies + // disguising as someone with hat in Windows. + + // Using reference data from Batter's Helmet. Thanks to MrSaturn. + SetEntProp(iItem, Prop_Send, "m_fEffects", EF_BONEMERGE|EF_NOSHADOW|EF_PARENT_ANIMATES); + SetEntProp(iItem, Prop_Send, "m_iTeamNum", m_iTeam); + SetEntProp(iItem, Prop_Send, "m_nSkin", (m_iTeam-2)); + SetEntProp(iItem, Prop_Send, "m_CollisionGroup", 11); + SetEntProp(iItem, Prop_Send, "m_iItemDefinitionIndex", iDef); + SetEntProp(iItem, Prop_Send, "m_iEntityLevel", iLevel); + SetEntProp(iItem, Prop_Send, "m_iEntityQuality", iQuality); + + // Spawn. + DispatchSpawn(iItem); + } + + return iItem; +} + +stock TF2_EquipWearable(iOwner, iItem) +{ + if (g_bSdkStarted == false) TF2_SdkStartup(); + + SDKCall(g_hSdkEquipWearable, iOwner, iItem); +} + +stock TF2_SdkStartup() +{ + + new Handle:hGameConf = LoadGameConfigFile("TF2_EquipmentManager"); + if (hGameConf != INVALID_HANDLE) + { + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(hGameConf,SDKConf_Virtual,"EquipWearable"); + PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); + g_hSdkEquipWearable = EndPrepSDKCall(); + + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(hGameConf,SDKConf_Virtual,"RemoveWearable"); + PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); + g_hSdkRemoveWearable = EndPrepSDKCall(); + + CloseHandle(hGameConf); + g_bSdkStarted = true; + } else { + SetFailState("Couldn't load SDK functions (TF2_EquipmentManager)."); + } +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/clientprefs.inc b/addons/sourcemod/scripting/include/clientprefs.inc new file mode 100644 index 0000000..c6ac023 --- /dev/null +++ b/addons/sourcemod/scripting/include/clientprefs.inc @@ -0,0 +1,282 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2011 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _clientprefs_included + #endinput +#endif +#define _clientprefs_included + +/** + * Cookie access types for client viewing + */ +enum CookieAccess +{ + CookieAccess_Public, /**< Visible and Changeable by users */ + CookieAccess_Protected, /**< Read only to users */ + CookieAccess_Private, /**< Completely hidden cookie */ +}; + +/** + * Cookie Prefab menu types + */ +enum CookieMenu +{ + CookieMenu_YesNo, /**< Yes/No menu with "yes"/"no" results saved into the cookie */ + CookieMenu_YesNo_Int, /**< Yes/No menu with 1/0 saved into the cookie */ + CookieMenu_OnOff, /**< On/Off menu with "on"/"off" results saved into the cookie */ + CookieMenu_OnOff_Int, /**< On/Off menu with 1/0 saved into the cookie */ +}; + +enum CookieMenuAction +{ + /** + * An option is being drawn for a menu. + * + * INPUT : Client index and data if available. + * OUTPUT: Buffer for rendering, maxlength of buffer. + */ + CookieMenuAction_DisplayOption = 0, + + /** + * A menu option has been selected. + * + * INPUT : Client index and any data if available. + */ + CookieMenuAction_SelectOption = 1, +}; + +/** + * Note: + * + * A successful return value/result on any client prefs native only guarantees that the local cache has been updated. + * Database connection problems can still prevent the data from being permanently saved. Connection problems will be logged as + * errors by the clientprefs extension. + */ + +/** + * Creates a new Client preference cookie. + * + * Handles returned by RegClientCookie can be closed via CloseHandle() when + * no longer needed. + * + * @param name Name of the new preference cookie. + * @param description Optional description of the preference cookie. + * @param access What CookieAccess level to assign to this cookie. + * @return A handle to the newly created cookie. If the cookie already + * exists, a handle to it will still be returned. + * @error Cookie name is blank. + */ +native Handle:RegClientCookie(const String:name[], const String:description[], CookieAccess:access); + +/** + * Searches for a Client preference cookie. + * + * Handles returned by FindClientCookie can be closed via CloseHandle() when + * no longer needed. + * + * @param name Name of cookie to find. + * @return A handle to the cookie if it is found. INVALID_HANDLE otherwise. + */ +native Handle:FindClientCookie(const String:name[]); + +/** + * Set the value of a Client preference cookie. + * + * @param client Client index. + * @param cookie Client preference cookie handle. + * @param value String value to set. + * @noreturn + * @error Invalid cookie handle or invalid client index. + */ +native SetClientCookie(client, Handle:cookie, const String:value[]); + +/** + * Retrieve the value of a Client preference cookie. + * + * @param client Client index. + * @param cookie Client preference cookie handle. + * @param buffer Copyback buffer for value. + * @param maxlen Maximum length of the buffer. + * @noreturn + * @error Invalid cookie handle or invalid client index. + */ +native GetClientCookie(client, Handle:cookie, String:buffer[], maxlen); + +/** + * Sets the value of a Client preference cookie based on an authID string. + * + * @param authID String Auth/STEAM ID of player to set. + * @param cookie Client preference cookie handle. + * @param value String value to set. + * @noreturn + * @error Invalid cookie handle. + */ +native SetAuthIdCookie(const String:authID[], Handle:cookie, const String:value[]); + +/** + * Checks if a clients cookies have been loaded from the database. + * + * @param client Client index. + * @return True if loaded, false otherwise. + * @error Invalid client index. + */ +native bool:AreClientCookiesCached(client); + +/** + * Called once a client's saved cookies have been loaded from the database. + * + * @param client Client index. + */ +forward OnClientCookiesCached(client); + +/** + * Cookie Menu Callback prototype + * + * @param client Client index. + * @param action CookieMenuAction being performed. + * @param info Info data passed. + * @param buffer Outbut buffer. + * @param maxlen Max length of the output buffer. + */ +functag public CookieMenuHandler(client, CookieMenuAction:action, any:info, String:buffer[], maxlen); + +/** + * Add a new prefab item to the client cookie settings menu. + * + * Note: This handles everything automatically and does not require a callback + * + * @param cookie Client preference cookie handle. + * @param type A CookieMenu prefab menu type. + * @param display Text to show on the menu. + * @param handler Optional handler callback for translations and output on selection + * @param info Info data to pass to the callback. + * @noreturn + * @error Invalid cookie handle. + */ +native SetCookiePrefabMenu(Handle:cookie, CookieMenu:type, const String:display[], CookieMenuHandler:handler=CookieMenuHandler:-1, info=0); + +/** + * Adds a new item to the client cookie settings menu. + * + * Note: This only adds the top level menu item. You need to handle any submenus from the callback. + * + * @param handler A MenuHandler callback function. + * @param info Data to pass to the callback. + * @param display Text to show on the menu. + * @noreturn + * @error Invalid cookie handle. + */ +native SetCookieMenuItem(CookieMenuHandler:handler, any:info, const String:display[]); + +/** + * Displays the settings menu to a client. + * + * @param client Client index. + * @noreturn + */ +native ShowCookieMenu(client); + +/** + * Gets a cookie iterator. Must be freed with CloseHandle(). + * + * @return A new cookie iterator. + */ +native Handle:GetCookieIterator(); + +/** + * Reads a cookie iterator, then advances to the next cookie if any. + * + * @param iter Cookie iterator Handle. + * @param name Name buffer. + * @param nameLen Name buffer size. + * @param access Access level of the cookie. + * @param desc Cookie description buffer. + * @param descLen Cookie description buffer size. + * @return True on success, false if there are no more commands. + */ +native bool:ReadCookieIterator(Handle:iter, + String:name[], + nameLen, + &CookieAccess:access, + String:desc[]="", + descLen=0); + +/** + * Returns the access level of a cookie + * + * @param cookie Client preference cookie handle. + * @return CookieAccess access level. + * @error Invalid cookie handle. + */ +native CookieAccess:GetCookieAccess(Handle:cookie); + +/** + * Returns the last updated timestamp for a client cookie + * + * @param client Client index. + * @param cookie Cookie handle. + * @return Last updated timestamp. + */ +native GetClientCookieTime(client, Handle:cookie); + +/** + * Do not edit below this line! + */ +public Extension:__ext_cprefs = +{ + name = "Client Preferences", + file = "clientprefs.ext", + autoload = 1, +#if defined REQUIRE_EXTENSIONS + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_EXTENSIONS +public __ext_cprefs_SetNTVOptional() +{ + MarkNativeAsOptional("RegClientCookie"); + MarkNativeAsOptional("FindClientCookie"); + MarkNativeAsOptional("SetClientCookie"); + MarkNativeAsOptional("GetClientCookie"); + MarkNativeAsOptional("AreClientCookiesCached"); + MarkNativeAsOptional("SetCookiePrefabMenu"); + MarkNativeAsOptional("SetCookieMenuItem"); + MarkNativeAsOptional("ShowCookieMenu"); + MarkNativeAsOptional("GetCookieIterator"); + MarkNativeAsOptional("ReadCookieIterator"); + MarkNativeAsOptional("GetCookieAccess"); + MarkNativeAsOptional("GetClientCookieTime"); +} +#endif diff --git a/addons/sourcemod/scripting/include/clients.inc b/addons/sourcemod/scripting/include/clients.inc new file mode 100644 index 0000000..13381c3 --- /dev/null +++ b/addons/sourcemod/scripting/include/clients.inc @@ -0,0 +1,778 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _clients_included + #endinput +#endif +#define _clients_included + +/** + * Network flow directions. + */ +enum NetFlow +{ + NetFlow_Outgoing = 0, /**< Outgoing traffic */ + NetFlow_Incoming, /**< Incoming traffic */ + NetFlow_Both, /**< Both values added together */ +}; + +/** + * MAXPLAYERS is not the same as MaxClients. + * MAXPLAYERS is a hardcoded value as an upper limit. MaxClients changes based on the server. + * + * Both GetMaxClients() and MaxClients are only available once the map is loaded, and should + * not be used in OnPluginStart(). + */ + +#define MAXPLAYERS 65 /**< Maximum number of players SourceMod supports */ +#define MAX_NAME_LENGTH 32 /**< Maximum buffer required to store a client name */ + +public const MaxClients; /**< Maximum number of players the server supports (dynamic) */ + +/** + * Called on client connection. If you return true, the client will be allowed in the server. + * If you return false (or return nothing), the client will be rejected. If the client is + * rejected by this forward or any other, OnClientDisconnect will not be called. + * + * Note: Do not write to rejectmsg if you plan on returning true. If multiple plugins write + * to the string buffer, it is not defined which plugin's string will be shown to the client, + * but it is guaranteed one of them will. + * + * @param client Client index. + * @param rejectmsg Buffer to store the rejection message when the connection is refused. + * @param maxlen Maximum number of characters for rejection buffer. + * @return True to validate client's connection, false to refuse it. + */ +forward bool:OnClientConnect(client, String:rejectmsg[], maxlen); + +/** + * Called once a client successfully connects. This callback is paired with OnClientDisconnect. + * + * @param client Client index. + * @noreturn + */ +forward OnClientConnected(client); + +/** + * Called when a client is entering the game. + * + * Whether a client has a steamid is undefined until OnClientAuthorized + * is called, which may occur either before or after OnClientPutInServer. + * Similarly, use OnClientPostAdminCheck() if you need to verify whether + * connecting players are admins. + * + * GetClientCount() will include clients as they are passed through this + * function, as clients are already in game at this point. + * + * @param client Client index. + * @noreturn + */ +forward OnClientPutInServer(client); + +/** + * Called when a client is disconnecting from the server. + * + * @param client Client index. + * @noreturn + */ +forward OnClientDisconnect(client); + +/** + * Called when a client is disconnected from the server. + * + * @param client Client index. + * @noreturn + */ +forward OnClientDisconnect_Post(client); + +/** + * Called when a client is sending a command. + * + * As of SourceMod 1.3, the client is guaranteed to be in-game. + * Use command listeners (console.inc) for more advanced hooks. + * + * @param client Client index. + * @param args Number of arguments. + * @noreturn + */ +forward Action:OnClientCommand(client, args); + +/** + * Called whenever the client's settings are changed. + * + * @param client Client index. + * @noreturn + */ +forward OnClientSettingsChanged(client); + +/** + * Called when a client receives a Steam ID. The state of a client's + * authorization as an admin is not guaranteed here. Use + * OnClientPostAdminCheck() if you need a client's admin status. + * + * This is called by bots, but the ID will be "BOT". + * + * @param client Client index. + * @param auth Client auth string. + * @noreturn + */ +forward OnClientAuthorized(client, const String:auth[]); + +/** + * Called once a client is authorized and fully in-game, but + * before admin checks are done. This can be used to override + * the default admin checks for a client. You should only use + * this for overriding; use OnClientPostAdminCheck() instead + * if you want notification. + * + * Note: If handled/blocked, PostAdminCheck must be signalled + * manually via NotifyPostAdminCheck(). + * + * This callback is gauranteed to occur on all clients, and always + * after each OnClientPutInServer() call. + * + * @param client Client index. + * @return Plugin_Handled to block admin checks. + */ +forward Action:OnClientPreAdminCheck(client); + +/** + * Called directly before OnClientPostAdminCheck() as a method to + * alter administrative permissions before plugins perform final + * post-connect operations. + * + * In general, do not use this function unless you are specifically + * attempting to change access permissions. Use OnClientPostAdminCheck() + * instead if you simply want to perform post-connect authorization + * routines. + * + * See OnClientPostAdminCheck() for more information. + * + * @param client Client index. + * @noreturn + */ +forward OnClientPostAdminFilter(client); + +/** + * Called once a client is authorized and fully in-game, and + * after all post-connection authorizations have been performed. + * + * This callback is gauranteed to occur on all clients, and always + * after each OnClientPutInServer() call. + * + * @param client Client index. + * @noreturn + */ +forward OnClientPostAdminCheck(client); + +/** + * This function will be deprecated in a future release. Use the MaxClients variable instead. + * + * Returns the maximum number of clients allowed on the server. This may + * return 0 if called before OnMapStart(), and thus should not be called + * in OnPluginStart(). + * + * You should not globally cache the value to GetMaxClients() because it can change from + * SourceTV or TF2's arena mode. Use the "MaxClients" dynamic variable documented at the + * top of this file. + * + * @return Maximum number of clients allowed. + */ +native GetMaxClients(); + +/** + * Returns the maximum number of human players allowed on the server. This is + * a game-specific function used on newer games to limit the number of humans + * that can join a game and can be lower than MaxClients. It is the number often + * reflected in the server browser or when viewing the output of the status command. + * On unsupported games or modes without overrides, it will return the same value + * as MaxClients. + * + * You should not globally cache the value to GetMaxHumanPlayers() because it can change across + * game modes. You may still cache it locally. + * + * @return Maximum number of humans allowed. + */ +native GetMaxHumanPlayers(); + +/** + * Returns the client count put in the server. + * + * @param inGameOnly If false connecting players are also counted. + * @return Client count in the server. + */ +native GetClientCount(bool:inGameOnly=true); + +/** + * Returns the client's name. + * + * @param client Player index. + * @param name Buffer to store the client's name. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @return True on success, false otherwise. + * @error If the client is not connected an error will be thrown. + */ +native bool:GetClientName(client, String:name[], maxlen); + +/** + * Retrieves a client's IP address. + * + * @param client Player index. + * @param ip Buffer to store the client's ip address. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @param remport Remove client's port from the ip string (true by default). + * @return True on success, false otherwise. + * @error If the client is not connected or the index is invalid. + */ +native bool:GetClientIP(client, String:ip[], maxlen, bool:remport=true); + +/** + * Retrieves a client's authentication string (SteamID). + * + * @param client Player index. + * @param auth Buffer to store the client's auth string. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @param validate Check backend validation status. + * DO NOT PASS FALSE UNLESS YOU UNDERSTAND THE CONSEQUENCES, + * You WILL KNOW if you need to use this, MOST WILL NOT. + * @return True on success, false otherwise. + * @error If the client is not connected or the index is invalid. + */ +native bool:GetClientAuthString(client, String:auth[], maxlen, bool:validate=true); + +/** + * Returns the client's Steam account ID. + * + * @param client Client Index. + * @param validate Check backend validation status. + * DO NOT PASS FALSE UNLESS YOU UNDERSTAND THE CONSEQUENCES, + * You WILL KNOW if you need to use this, MOST WILL NOT. + * @return Steam account ID or 0 if not available. + * @error If the client is not connected or the index is invalid. + */ +native GetSteamAccountID(client, bool:validate=true); + +/** + * Retrieves a client's user id, which is an index incremented for every client + * that joins the server. + * + * @param client Player index. + * @return User id of the client. + * @error If the client is not connected or the index is invalid. + */ +native GetClientUserId(client); + +/** + * Returns if a certain player is connected. + * + * @param client Player index. + * @return True if player is connected to the server, false otherwise. + */ +native bool:IsClientConnected(client); + +/** + * Returns if a certain player has entered the game. + * + * @param client Player index (index does not have to be connected). + * @return True if player has entered the game, false otherwise. + * @error Invalid client index. + */ +native bool:IsClientInGame(client); + +/** + * Returns if a client is in the "kick queue" (i.e. the client will be kicked + * shortly and thus they should not appear as valid). + * + * @param client Player index (must be connected). + * @return True if in the kick queue, false otherwise. + * @error Invalid client index. + */ +native bool:IsClientInKickQueue(client); + +/** + * Backwards compatibility stock - use IsClientInGame + * @deprecated Renamed to IsClientInGame + */ +#pragma deprecated Use IsClientInGame() instead +stock bool:IsPlayerInGame(client) +{ + return IsClientInGame(client); +} + +/** + * Returns if a certain player has been authenticated. + * + * @param client Player index. + * @return True if player has been authenticated, false otherwise. + */ +native bool:IsClientAuthorized(client); + +/** + * Returns if a certain player is a fake client. + * + * @param client Player index. + * @return True if player is a fake client, false otherwise. + */ +native bool:IsFakeClient(client); + +/** + * Returns if a certain player is the SourceTV bot. + * + * @param client Player index. + * @return True if player is the SourceTV bot, false otherwise. + */ +native bool:IsClientSourceTV(client); + +/** + * Returns if a certain player is the Replay bot. + * + * @param client Player index. + * @return True if player is the Replay bot, false otherwise. + */ +native bool:IsClientReplay(client); + +/** + * Returns if a certain player is an observer/spectator. + * + * @param client Player index. + * @return True if player is an obverser, false otherwise. + */ +native bool:IsClientObserver(client); + +/** + * Returns if the client is alive or dead. + * + * Note: This function was originally in SDKTools and was moved to core. + * + * @param client Player's index. + * @return True if the client is alive, false otherwise. + * @error Invalid client index, client not in game, or no mod support. + */ +native bool:IsPlayerAlive(client); + +/** + * Retrieves values from client replicated keys. + * + * @param client Player's index. + * @param key Key string. + * @param value Buffer to store value. + * @param maxlen Maximum length of valve (UTF-8 safe). + * @return True on success, false otherwise. + * @error Invalid client index, or client not connected. + */ +native bool:GetClientInfo(client, const String:key[], String:value[], maxlen); + +/** + * Retrieves a client's team index. + * + * @param client Player's index. + * @return Team index the client is on (mod specific). + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientTeam(client); + +/** + * Sets a client's AdminId. + * + * @param client Player's index. + * @param id AdminId to set. INVALID_ADMIN_ID removes admin permissions. + * @param temp True if the id should be freed on disconnect. + * @noreturn + * @error Invalid client index, client not connected, or bogus AdminId. + */ +native SetUserAdmin(client, AdminId:id, bool:temp=false); + +/** + * Retrieves a client's AdminId. + * + * @param client Player's index. + * @return AdminId of the client, or INVALID_ADMIN_ID if none. + * @error Invalid client index, or client not connected. + */ +native AdminId:GetUserAdmin(client); + +/** + * Sets access flags on a client. If the client is not an admin, + * a temporary, anonymous AdminId is given. + * + * @param client Player's index. + * @param ... Flags to set on the client. + * @noreturn + * @error Invalid client index, or client not connected. + */ +native AddUserFlags(client, AdminFlag:...); + +/** + * Removes flags from a client. If the client is not an admin, + * this has no effect. + * + * @param client Player's index. + * @param ... Flags to remove from the client. + * @noreturn + * @error Invalid client index, or client not connected. + */ +native RemoveUserFlags(client, AdminFlag:...); + +/** + * Sets access flags on a client using bits instead of flags. If the + * client is not an admin, and flags not 0, a temporary, anonymous AdminId is given. + * + * @param client Player's index. + * @param flags Bitstring of flags to set on client. + * @noreturn + */ +native SetUserFlagBits(client, flags); + +/** + * Returns client access flags. If the client is not an admin, + * the result is always 0. + * + * @param client Player's index. + * @return Flags + * @error Invalid client index, or client not connected. + */ +native GetUserFlagBits(client); + +/** + * Returns whether a user can target another user. + * This is a helper function for CanAdminTarget. + * + * @param client Player's index. + * @param target Target player's index. + * @return True if target is targettable by the player, false otherwise. + * @error Invalid or unconnected player indexers. + */ +native bool:CanUserTarget(client, target); + +/** + * Runs through the Core-defined admin authorization checks on a player. + * Has no effect if the player is already an admin. + * + * Note: This function is based on the internal cache only. + * + * @param client Client index. + * @return True if access was changed, false if it did not. + * @error Invalid client index or client not in-game AND authorized. + */ +native bool:RunAdminCacheChecks(client); + +/** + * Signals that a player has completed post-connection admin checks. + * Has no effect if the player has already had this event signalled. + * + * Note: This must be sent even if no admin id was assigned. + * + * @param client Client index. + * @noreturn + * @error Invalid client index or client not in-game AND authorized. + */ +native NotifyPostAdminCheck(client); + +/** + * Creates a fake client. + * + * @param name Name to use. + * @return Client index on success, 0 otherwise. + */ +native CreateFakeClient(const String:name[]); + +/** + * Sets a convar value on a fake client. + * + * @param client Client index. + * @param cvar ConVar name. + * @param value ConVar value. + * @noreturn + * @error Invalid client index, client not connected, + * or client not a fake client. + */ +native SetFakeClientConVar(client, const String:cvar[], const String:value[]); + +/** + * Returns the client's health. + * + * @param client Player's index. + * @return Health value. + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientHealth(client); + +/** + * Returns the client's model name. + * + * @param client Player's index. + * @param model Buffer to store the client's model name. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientModel(client, String:model[], maxlen); + +/** + * Returns the client's weapon name. + * + * @param client Player's index. + * @param weapon Buffer to store the client's weapon name. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientWeapon(client, String:weapon[], maxlen); + +/** + * Returns the client's max size vector. + * + * @param client Player's index. + * @param vec Destination vector to store the client's max size. + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientMaxs(client, Float:vec[3]); + +/** + * Returns the client's min size vector. + * + * @param client Player's index. + * @param vec Destination vector to store the client's min size. + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientMins(client, Float:vec[3]); + +/** + * Returns the client's position angle. + * + * @param client Player's index. + * @param ang Destination vector to store the client's position angle. + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientAbsAngles(client, Float:ang[3]); + +/** + * Returns the client's origin vector. + * + * @param client Player's index. + * @param vec Destination vector to store the client's origin vector. + * @noreturn + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientAbsOrigin(client, Float:vec[3]); + +/** + * Returns the client's armor. + * + * @param client Player's index. + * @return Armor value. + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientArmor(client); + +/** + * Returns the client's death count. + * + * @param client Player's index. + * @return Death count. + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientDeaths(client); + +/** + * Returns the client's frag count. + * + * @param client Player's index. + * @return Frag count. + * @error Invalid client index, client not in game, or no mod support. + */ +native GetClientFrags(client); + +/** + * Returns the client's send data rate in bytes/sec. + * + * @param client Player's index. + * @return Data rate. + * @error Invalid client index, client not connected, or fake client. + */ +native GetClientDataRate(client); + +/** + * Returns if a client is timing out + * + * @param client Player's index. + * @return True if client is timing out, false otherwise. + * @error Invalid client index, client not connected, or fake client. + */ +native bool:IsClientTimingOut(client); + +/** + * Returns the client's connection time in seconds. + * + * @param client Player's index. + * @return Connection time. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientTime(client); + +/** + * Returns the client's current latency (RTT), more accurate than GetAvgLatency but jittering. + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Latency, or -1 if network info is not available. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientLatency(client, NetFlow:flow); + +/** + * Returns the client's average packet latency in seconds. + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Latency, or -1 if network info is not available. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientAvgLatency(client, NetFlow:flow); + +/** + * Returns the client's average packet loss, values go from 0 to 1 (for percentages). + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Average packet loss, or -1 if network info is not available. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientAvgLoss(client, NetFlow:flow); + +/** + * Returns the client's average packet choke, values go from 0 to 1 (for percentages). + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Average packet loss, or -1 if network info is not available. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientAvgChoke(client, NetFlow:flow); + +/** + * Returns the client's data flow in bytes/sec. + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Data flow. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientAvgData(client, NetFlow:flow); + +/** + * Returns the client's average packet frequency in packets/sec. + * + * @param client Player's index. + * @param flow Traffic flowing direction. + * @return Packet frequency. + * @error Invalid client index, client not connected, or fake client. + */ +native Float:GetClientAvgPackets(client, NetFlow:flow); + +/** + * Translates an userid index to the real player index. + * + * @param userid Userid value. + * @return Client value. + * @error Returns 0 if invalid userid. + */ +native GetClientOfUserId(userid); + +/** + * Disconnects a client from the server as soon as the next frame starts. + * + * Note: Originally, KickClient() was immediate. The delay was introduced + * because despite warnings, plugins were using it in ways that would crash. + * The new safe version can break cases that rely on immediate disconnects, + * but ensures that plugins do not accidentally cause crashes. + * + * If you need immediate disconnects, use KickClientEx(). + * + * Note: IsClientInKickQueue() will return true before the kick occurs. + * + * @param client Client index. + * @param format Optional formatting rules for disconnect reason. + * Note that a period is automatically appended to the string by the engine. + * @param ... Variable number of format parameters. + * @noreturn + * @error Invalid client index, or client not connected. + */ +native KickClient(client, const String:format[]="", any:...); + +/** + * Immediately disconnects a client from the server. + * + * Kicking clients from certain events or callbacks may cause crashes. If in + * doubt, create a short (0.1 second) timer to kick the client in the next + * available frame. + * + * @param client Client index. + * @param format Optional formatting rules for disconnect reason. + * Note that a period is automatically appended to the string by the engine. + * @param ... Variable number of format parameters. + * @noreturn + * @error Invalid client index, or client not connected. + */ +native KickClientEx(client, const String:format[]="", any:...); + +/** + * Changes a client's team through the mod's generic team changing function. + * On CS:S, this will kill the player. + * + * @param client Client index. + * @param team Mod-specific team index. + * @noreturn + * @error Invalid client index, client not connected, or lack of + * mod support. + */ +native ChangeClientTeam(client, team); + +/** + * Returns the clients unique serial identifier. + * + * @param client Client index. + * @return Serial number. + */ +native GetClientSerial(client); + +/** + * Returns the client index by its serial number. + * + * @param serial Serial number. + * @return Client index, or 0 for invalid serial. + */ +native GetClientFromSerial(serial); + diff --git a/addons/sourcemod/scripting/include/commandfilters.inc b/addons/sourcemod/scripting/include/commandfilters.inc new file mode 100644 index 0000000..6ea447c --- /dev/null +++ b/addons/sourcemod/scripting/include/commandfilters.inc @@ -0,0 +1,165 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _commandfilters_included + #endinput +#endif +#define _commandfilters_included + +#define MAX_TARGET_LENGTH 64 + +#define COMMAND_FILTER_ALIVE (1<<0) /**< Only allow alive players */ +#define COMMAND_FILTER_DEAD (1<<1) /**< Only filter dead players */ +#define COMMAND_FILTER_CONNECTED (1<<2) /**< Allow players not fully in-game */ +#define COMMAND_FILTER_NO_IMMUNITY (1<<3) /**< Ignore immunity rules */ +#define COMMAND_FILTER_NO_MULTI (1<<4) /**< Do not allow multiple target patterns */ +#define COMMAND_FILTER_NO_BOTS (1<<5) /**< Do not allow bots to be targetted */ + +#define COMMAND_TARGET_NONE 0 /**< No target was found */ +#define COMMAND_TARGET_NOT_ALIVE -1 /**< Single client is not alive */ +#define COMMAND_TARGET_NOT_DEAD -2 /**< Single client is not dead */ +#define COMMAND_TARGET_NOT_IN_GAME -3 /**< Single client is not in game */ +#define COMMAND_TARGET_IMMUNE -4 /**< Single client is immune */ +#define COMMAND_TARGET_EMPTY_FILTER -5 /**< A multi-filter (such as @all) had no targets */ +#define COMMAND_TARGET_NOT_HUMAN -6 /**< Target was not human */ +#define COMMAND_TARGET_AMBIGUOUS -7 /**< Partial name had too many targets */ + +/** + * Processes a generic command target string, and resolves it to a list + * of clients or one client, based on filtering rules and a pattern. + * + * Note that you should use LoadTranslations("common.phrases") in OnPluginStart(), + * as that file is guaranteed to contain all of the translatable phrases that + * ProcessTargetString() will return. + * + * @param pattern Pattern to find clients against. + * @param admin Admin performing the action, or 0 if the server. + * @param targets Array to hold targets. + * @param max_targets Maximum size of the targets array. + * @param filter_flags Filter flags. + * @param target_name Buffer to store the target name. + * @param tn_maxlength Maximum length of the target name buffer. + * @param tn_is_ml OUTPUT: Will be true if the target name buffer is an ML phrase, + * false if it is a normal string. + * @return If a multi-target pattern was used, the number of clients found + * is returned. If a single-target pattern was used, 1 is returned + * if one valid client is found. Otherwise, a COMMAND_TARGET reason + * for failure is returned. + */ +native ProcessTargetString(const String:pattern[], + admin, + targets[], + max_targets, + filter_flags, + String:target_name[], + tn_maxlength, + &bool:tn_is_ml); + +/** + * Replies to a client with a given message describing a targetting + * failure reason. + * + * Note: The translation phrases are found in common.phrases.txt. + * + * @param client Client index, or 0 for server. + * @param reason COMMAND_TARGET reason. + * @noreturn + */ +stock ReplyToTargetError(client, reason) +{ + switch (reason) + { + case COMMAND_TARGET_NONE: + { + ReplyToCommand(client, "[SM] %t", "No matching client"); + } + case COMMAND_TARGET_NOT_ALIVE: + { + ReplyToCommand(client, "[SM] %t", "Target must be alive"); + } + case COMMAND_TARGET_NOT_DEAD: + { + ReplyToCommand(client, "[SM] %t", "Target must be dead"); + } + case COMMAND_TARGET_NOT_IN_GAME: + { + ReplyToCommand(client, "[SM] %t", "Target is not in game"); + } + case COMMAND_TARGET_IMMUNE: + { + ReplyToCommand(client, "[SM] %t", "Unable to target"); + } + case COMMAND_TARGET_EMPTY_FILTER: + { + ReplyToCommand(client, "[SM] %t", "No matching clients"); + } + case COMMAND_TARGET_NOT_HUMAN: + { + ReplyToCommand(client, "[SM] %t", "Cannot target bot"); + } + case COMMAND_TARGET_AMBIGUOUS: + { + ReplyToCommand(client, "[SM] %t", "More than one client matched"); + } + } +} + +/** + * Adds clients to a multi-target filter. + * + * @param pattern Pattern name. + * @param clients Array to fill with unique, valid client indexes. + * @return True if pattern was recognized, false otherwise. + */ +functag public bool:MultiTargetFilter(const String:pattern[], Handle:clients); + +/** + * Adds a multi-target filter function for ProcessTargetString(). + * + * @param pattern Pattern to match (case sensitive). + * @param filter Filter function. + * @param phrase Descriptive phrase to display on successful match. + * @param phraseIsML True if phrase is multi-lingual, false otherwise. + * @noreturn + */ +native AddMultiTargetFilter(const String:pattern[], MultiTargetFilter:filter, + const String:phrase[], bool:phraseIsML); + +/** + * Removes a multi-target filter function from ProcessTargetString(). + * + * @param pattern Pattern to match (case sensitive). + * @param filter Filter function. + * @noreturn + */ +native RemoveMultiTargetFilter(const String:pattern[], MultiTargetFilter:filter); + diff --git a/addons/sourcemod/scripting/include/console.inc b/addons/sourcemod/scripting/include/console.inc new file mode 100644 index 0000000..d89bcbc --- /dev/null +++ b/addons/sourcemod/scripting/include/console.inc @@ -0,0 +1,971 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _console_included + #endinput +#endif +#define _console_included + +#define INVALID_FCVAR_FLAGS (-1) + +/** + * Console variable bound values used with Get/SetConVarBounds() + */ +enum ConVarBounds +{ + ConVarBound_Upper = 0, + ConVarBound_Lower +}; + +/** + * Console variable query helper values. + */ +enum QueryCookie +{ + QUERYCOOKIE_FAILED = 0, +}; + +/** + * Reply sources for commands. + */ +enum ReplySource +{ + SM_REPLY_TO_CONSOLE = 0, + SM_REPLY_TO_CHAT = 1, +}; + +/** + * Console variable query result values. + */ +enum ConVarQueryResult +{ + ConVarQuery_Okay = 0, /**< Retrieval of client convar value was successful. */ + ConVarQuery_NotFound, /**< Client convar was not found. */ + ConVarQuery_NotValid, /**< A console command with the same name was found, but there is no convar. */ + ConVarQuery_Protected /**< Client convar was found, but it is protected. The server cannot retrieve its value. */ +}; + +/** + * @section Flags for console commands and console variables. The descriptions + * for each constant come directly from the Source SDK. + */ +#define FCVAR_NONE 0 /**< The default, no flags at all */ +#define FCVAR_UNREGISTERED (1<<0) /**< If this is set, don't add to linked list, etc. */ +#define FCVAR_LAUNCHER (1<<1) /**< Defined by launcher. */ +#define FCVAR_GAMEDLL (1<<2) /**< Defined by the game DLL. */ +#define FCVAR_CLIENTDLL (1<<3) /**< Defined by the client DLL. */ +#define FCVAR_MATERIAL_SYSTEM (1<<4) /**< Defined by the material system. */ +#define FCVAR_PROTECTED (1<<5) /**< It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value. */ +#define FCVAR_SPONLY (1<<6) /**< This cvar cannot be changed by clients connected to a multiplayer server. */ +#define FCVAR_ARCHIVE (1<<7) /**< Set to cause it to be saved to vars.rc */ +#define FCVAR_NOTIFY (1<<8) /**< Notifies players when changed. */ +#define FCVAR_USERINFO (1<<9) /**< Changes the client's info string. */ +#define FCVAR_PRINTABLEONLY (1<<10) /**< This cvar's string cannot contain unprintable characters (e.g., used for player name, etc.) */ +#define FCVAR_UNLOGGED (1<<11) /**< If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log */ +#define FCVAR_NEVER_AS_STRING (1<<12) /**< Never try to print that cvar. */ +#define FCVAR_REPLICATED (1<<13) /**< Server setting enforced on clients. */ +#define FCVAR_CHEAT (1<<14) /**< Only useable in singleplayer / debug / multiplayer & sv_cheats */ +#define FCVAR_STUDIORENDER (1<<15) /**< Defined by the studiorender system. */ +#define FCVAR_DEMO (1<<16) /**< Record this cvar when starting a demo file. */ +#define FCVAR_DONTRECORD (1<<17) /**< Don't record these command in demo files. */ +#define FCVAR_PLUGIN (1<<18) /**< Defined by a 3rd party plugin. */ +#define FCVAR_DATACACHE (1<<19) /**< Defined by the datacache system. */ +#define FCVAR_TOOLSYSTEM (1<<20) /**< Defined by an IToolSystem library */ +#define FCVAR_FILESYSTEM (1<<21) /**< Defined by the file system. */ +#define FCVAR_NOT_CONNECTED (1<<22) /**< Cvar cannot be changed by a client that is connected to a server. */ +#define FCVAR_SOUNDSYSTEM (1<<23) /**< Defined by the soundsystem library. */ +#define FCVAR_ARCHIVE_XBOX (1<<24) /**< Cvar written to config.cfg on the Xbox. */ +#define FCVAR_INPUTSYSTEM (1<<25) /**< Defined by the inputsystem DLL. */ +#define FCVAR_NETWORKSYSTEM (1<<26) /**< Defined by the network system. */ +#define FCVAR_VPHYSICS (1<<27) /**< Defined by vphysics. */ + +/** + * @endsection + */ + +/** + * Executes a server command as if it were on the server console (or RCON) + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +native ServerCommand(const String:format[], any:...); + +/** + * Executes a server command as if it were on the server console (or RCON) + * and stores the printed text into buffer. + * + * Warning: This calls ServerExecute internally and may have issues if + * certain commands are in the buffer, only use when you really need + * the response. + * Also, on L4D2 this will not print the command output to the server console. + * + * @param buffer String to store command result into. + * @param maxlen Length of buffer. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +native ServerCommandEx(String:buffer[], maxlen, const String:format[], any:...); + +/** + * Inserts a server command at the beginning of the server command buffer. + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +native InsertServerCommand(const String:format[], any:...); + +/** + * Executes every command in the server's command buffer, rather than once per frame. + * + * @noreturn + */ +native ServerExecute(); + +/** + * Executes a client command. Note that this will not work on clients unless + * they have cl_restrict_server_commands set to 0. + * + * @param client Index of the client. + * @param fmt Format of the client command. + * @param ... Format parameters + * @noreturn + * @error Invalid client index, or client not connected. + */ +native ClientCommand(client, const String:fmt[], any:...); + +/** + * Executes a client command on the server without being networked. + * + * FakeClientCommand() overwrites the command tokenization buffer. This can + * cause undesired effects because future calls to GetCmdArg* will return + * data from the FakeClientCommand(), not the parent command. If you are in + * a hook where this matters (for example, a "say" hook), you should use + * FakeClientCommandEx() instead. + * + * @param client Index of the client. + * @param fmt Format of the client command. + * @param ... Format parameters + * @noreturn + * @error Invalid client index, or client not connected. + */ +native FakeClientCommand(client, const String:fmt[], any:...); + +/** + * Executes a client command on the server without being networked. The + * execution of the client command is delayed by one frame to prevent any + * re-entrancy issues that might surface with FakeClientCommand(). + * + * @param client Index of the client. + * @param fmt Format of the client command. + * @param ... Format parameters + * @noreturn + * @error Invalid client index, or client not connected. + */ +native FakeClientCommandEx(client, const String:fmt[], any:...); + +/** + * Sends a message to the server console. + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +native PrintToServer(const String:format[], any:...); + +/** + * Sends a message to a client's console. + * + * @param client Client index. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +native PrintToConsole(client, const String:format[], any:...); + +/** + * Reples to a message in a command. + * + * A client index of 0 will use PrintToServer(). + * If the command was from the console, PrintToConsole() is used. + * If the command was from chat, PrintToChat() is used. + * + * @param client Client index, or 0 for server. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error If the client is not connected or invalid. + */ +native ReplyToCommand(client, const String:format[], any:...); + +/** + * Returns the current reply source of a command. + * + * @return ReplySource value. + */ +native ReplySource:GetCmdReplySource(); + +/** + * Sets the current reply source of a command. + * + * Only use this if you know what you are doing. You should save the old value + * and restore it once you are done. + * + * @param source New ReplySource value. + * @return Old ReplySource value. + */ +native ReplySource:SetCmdReplySource(ReplySource:source); + +/** + * Returns whether the current say hook is a chat trigger. + * + * This function is only meaningful inside say or say_team hooks. + * + * @return True if a chat trigger, false otherwise. + */ +native bool:IsChatTrigger(); + +/** + * Displays usage of an admin command to users depending on the + * setting of the sm_show_activity cvar. All users receive a message + * in their chat text, except for the originating client, who receives + * the message based on the current ReplySource. + * + * @param client Client index doing the action, or 0 for server. + * @param tag Tag to prepend to the message. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error + */ +native ShowActivity2(client, const String:tag[], const String:format[], any:...); + +/** + * Displays usage of an admin command to users depending on the + * setting of the sm_show_activity cvar. + * + * This version does not display a message to the originating client + * if used from chat triggers or menus. If manual replies are used + * for these cases, then this function will suffice. Otherwise, + * ShowActivity2() is slightly more useful. + * + * @param client Client index doing the action, or 0 for server. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error + */ +native ShowActivity(client, const String:format[], any:...); + +/** + * Same as ShowActivity(), except the tag parameter is used instead of + * "[SM] " (note that you must supply any spacing). + * + * @param client Client index doing the action, or 0 for server. + * @param tag Tag to display with. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error + */ +native ShowActivityEx(client, const String:tag[], const String:format[], any:...); + +/** + * Given an originating client and a target client, returns the string + * that describes the originating client according to the sm_show_activity cvar. + * + * For example, "ADMIN", "PLAYER", or a player's name could be placed in this buffer. + * + * @param client Originating client; may be 0 for server console. + * @param target Targeted client. + * @param namebuf Name buffer. + * @param maxlength Maximum size of the name buffer. + * @return True if activity should be shown. False otherwise. In either + * case, the name buffer is filled. The return value can be used + * to broadcast a "safe" name to all players regardless of the + * sm_show_activity filters. + * @error Invalid client index or client not connected. + */ +native FormatActivitySource(client, target, const String:namebuf[], maxlength); + +/** + * Called when a server-only command is invoked. + * + * @param args Number of arguments that were in the argument string. + * @return An Action value. Not handling the command + * means that Source will report it as "not found." + */ +functag public Action:SrvCmd(args); + +/** + * Creates a server-only console command, or hooks an already existing one. + * + * Server commands are case sensitive. + * + * @param cmd Name of the command to hook or create. + * @param callback A function to use as a callback for when the command is invoked. + * @param description Optional description to use for command creation. + * @param flags Optional flags to use for command creation. + * @noreturn + * @error Command name is the same as an existing convar. + */ +native RegServerCmd(const String:cmd[], SrvCmd:callback, const String:description[]="", flags=0); + +/** + * Called when a generic console command is invoked. + * + * @param client Index of the client, or 0 from the server. + * @param args Number of arguments that were in the argument string. + * @return An Action value. Not handling the command + * means that Source will report it as "not found." + */ +functag public Action:ConCmd(client, args); + +/** + * Creates a console command, or hooks an already existing one. + * + * Console commands are case sensitive. However, if the command already exists in the game, + * a client may enter the command in any case. SourceMod corrects for this automatically, + * and you should only hook the "real" version of the command. + * + * @param cmd Name of the command to hook or create. + * @param callback A function to use as a callback for when the command is invoked. + * @param description Optional description to use for command creation. + * @param flags Optional flags to use for command creation. + * @noreturn + * @error Command name is the same as an existing convar. + */ +native RegConsoleCmd(const String:cmd[], ConCmd:callback, const String:description[]="", flags=0); + +/** + * Creates a console command as an administrative command. If the command does not exist, + * it is created. When this command is invoked, the access rights of the player are + * automatically checked before allowing it to continue. + * + * Admin commands are case sensitive from both the client and server. + * + * @param cmd String containing command to register. + * @param callback A function to use as a callback for when the command is invoked. + * @param adminflags Administrative flags (bitstring) to use for permissions. + * @param description Optional description to use for help. + * @param group String containing the command group to use. If empty, + * the plugin's filename will be used instead. + * @param flags Optional console flags. + * @noreturn + * @error Command name is the same as an existing convar. + */ +native RegAdminCmd(const String:cmd[], + ConCmd:callback, + adminflags, + const String:description[]="", + const String:group[]="", + flags=0); + +/** + * Returns the number of arguments from the current console or server command. + * @note Unlike the HL2 engine call, this does not include the command itself. + * + * @return Number of arguments to the current command. + */ +native GetCmdArgs(); + +/** + * Retrieves a command argument given its index, from the current console or + * server command. + * @note Argument indexes start at 1; 0 retrieves the command name. + * + * @param argnum Argument number to retrieve. + * @param buffer Buffer to use for storing the string. + * @param maxlength Maximum length of the buffer. + * @return Length of string written to buffer. + */ +native GetCmdArg(argnum, String:buffer[], maxlength); + +/** + * Retrieves the entire command argument string in one lump from the current + * console or server command. + * + * @param buffer Buffer to use for storing the string. + * @param maxlength Maximum length of the buffer. + * @return Length of string written to buffer. + */ +native GetCmdArgString(String:buffer[], maxlength); + +/** + * Creates a new console variable. + * + * @param name Name of new convar. + * @param defaultValue String containing the default value of new convar. + * @param description Optional description of the convar. + * @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details. + * @param hasMin Optional boolean that determines if the convar has a minimum value. + * @param min Minimum floating point value that the convar can have if hasMin is true. + * @param hasMax Optional boolean that determines if the convar has a maximum value. + * @param max Maximum floating point value that the convar can have if hasMax is true. + * @return A handle to the newly created convar. If the convar already exists, a handle to it will still be returned. + * @error Convar name is blank or is the same as an existing console command. + */ +native Handle:CreateConVar(const String:name[], const String:defaultValue[], const String:description[]="", flags=0, bool:hasMin=false, Float:min=0.0, bool:hasMax=false, Float:max=0.0); + +/** + * Searches for a console variable. + * + * @param name Name of convar to find. + * @return A handle to the convar if it is found. INVALID_HANDLE otherwise. + */ +native Handle:FindConVar(const String:name[]); + +/** + * Called when a console variable's value is changed. + * + * @param convar Handle to the convar that was changed. + * @param oldValue String containing the value of the convar before it was changed. + * @param newValue String containing the new value of the convar. + * @noreturn + */ +functag public ConVarChanged(Handle:convar, const String:oldValue[], const String:newValue[]); + +/** + * Creates a hook for when a console variable's value is changed. + * + * @param convar Handle to the convar. + * @param callback An OnConVarChanged function pointer. + * @noreturn + * @error Invalid or corrupt Handle or invalid callback function. + */ +native HookConVarChange(Handle:convar, ConVarChanged:callback); + +/** + * Removes a hook for when a console variable's value is changed. + * + * @param convar Handle to the convar. + * @param callback An OnConVarChanged function pointer. + * @noreturn + * @error Invalid or corrupt Handle, invalid callback function, or no active hook on convar. + */ +native UnhookConVarChange(Handle:convar, ConVarChanged:callback); + +/** + * Returns the boolean value of a console variable. + * + * @param convar Handle to the convar. + * @return The boolean value of the convar. + * @error Invalid or corrupt Handle. + */ +native bool:GetConVarBool(Handle:convar); + +/** + * Sets the boolean value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New boolean value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarBool(Handle:convar, bool:value, bool:replicate=false, bool:notify=false); + +/** + * Returns the integer value of a console variable. + * + * @param convar Handle to the convar. + * @return The integer value of the convar. + * @error Invalid or corrupt Handle. + */ +native GetConVarInt(Handle:convar); + +/** + * Sets the integer value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New integer value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarInt(Handle:convar, value, bool:replicate=false, bool:notify=false); + +/** + * Returns the floating point value of a console variable. + * + * @param convar Handle to the convar. + * @return The floating point value of the convar. + * @error Invalid or corrupt Handle. + */ +native Float:GetConVarFloat(Handle:convar); + +/** + * Sets the floating point value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New floating point value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarFloat(Handle:convar, Float:value, bool:replicate=false, bool:notify=false); + +/** + * Retrieves the string value of a console variable. + * + * @param convar Handle to the convar. + * @param value Buffer to store the value of the convar. + * @param maxlength Maximum length of string buffer. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native GetConVarString(Handle:convar, String:value[], maxlength); + +/** + * Sets the string value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New string value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarString(Handle:convar, const String:value[], bool:replicate=false, bool:notify=false); + +/** + * Resets the console variable to its default value. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native ResetConVar(Handle:convar, bool:replicate=false, bool:notify=false); + +/** + * Retrieves the default string value of a console variable. + * + * @param convar Handle to the convar. + * @param value Buffer to store the default value of the convar. + * @param maxlength Maximum length of string buffer. + * @return Number of bytes written to the buffer (UTF-8 safe). + * @error Invalid or corrupt Handle. + */ +native GetConVarDefault(Handle:convar, String:value[], maxlength); + +/** + * Returns the bitstring of flags on a console variable. + * + * @param convar Handle to the convar. + * @return A bitstring containing the FCVAR_* flags that are enabled. + * @error Invalid or corrupt Handle. + */ +native GetConVarFlags(Handle:convar); + +/** + * Sets the bitstring of flags on a console variable. + * + * @param convar Handle to the convar. + * @param flags A bitstring containing the FCVAR_* flags to enable. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarFlags(Handle:convar, flags); + +/** + * Retrieves the specified bound of a console variable. + * + * @param convar Handle to the convar. + * @param type Type of bound to retrieve, ConVarBound_Lower or ConVarBound_Upper. + * @param value By-reference cell to store the specified floating point bound value. + * @return True if the convar has the specified bound set, false otherwise. + * @error Invalid or corrupt Handle. + */ +native bool:GetConVarBounds(Handle:convar, ConVarBounds:type, &Float:value); + +/** + * Sets the specified bound of a console variable. + * + * @param convar Handle to the convar. + * @param type Type of bound to set, ConVarBound_Lower or ConVarBound_Upper + * @param set If set to true, convar will use specified bound. If false, bound will be removed. + * @param value Floating point value to use as the specified bound. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetConVarBounds(Handle:convar, ConVarBounds:type, bool:set, Float:value=0.0); + +/** + * Retrieves the name of a console variable. + * + * @param convar Handle to the convar. + * @param name Buffer to store the name of the convar. + * @param maxlength Maximum length of string buffer. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native GetConVarName(Handle:convar, String:name[], maxlength); + +funcenum ConVarQueryFinished +{ + /** + * Called when a query to retrieve a client's console variable has finished. + * + * @param cookie Unique identifier of query. + * @param client Player index. + * @param result Result of query that tells one whether or not query was successful. + * See ConVarQueryResult enum for more details. + * @param convarName Name of client convar that was queried. + * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. + * @param value Value that was passed when query was started. + * @noreturn + */ + public(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[], any:value), + + /** + * Called when a query to retrieve a client's console variable has finished. + * + * @param cookie Unique identifier of query. + * @param client Player index. + * @param result Result of query that tells one whether or not query was successful. + * See ConVarQueryResult enum for more details. + * @param convarName Name of client convar that was queried. + * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. + * @noreturn + */ + public(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[]) +}; + +/** + * Starts a query to retrieve the value of a client's console variable. + * + * @param client Player index. + * @param cvarName Name of client convar to query. + * @param callback A function to use as a callback when the query has finished. + * @param value Optional value to pass to the callback function. + * @return A cookie that uniquely identifies the query. + * Returns QUERYCOOKIE_FAILED on failure, such as when used on a bot. + */ +native QueryCookie:QueryClientConVar(client, const String:cvarName[], ConVarQueryFinished:callback, any:value=0); + +/** + * Gets a command iterator. Must be freed with CloseHandle(). + * + * @return A new command iterator. + */ +native Handle:GetCommandIterator(); + +/** + * Reads a command iterator, then advances to the next command if any. + * Only SourceMod specific commands are returned. + * + * @param iter Command iterator Handle. + * @param name Name buffer. + * @param nameLen Name buffer size. + * @param eflags Effective default flags of a command. + * @param desc Command description buffer. + * @param descLen Command description buffer size. + * @return True on success, false if there are no more commands. + */ +native bool:ReadCommandIterator(Handle:iter, + String:name[], + nameLen, + &eflags=0, + String:desc[]="", + descLen=0); + +/** + * Returns whether a client has access to a given command string. The string + * can be any override string, as overrides can be independent of + * commands. This feature essentially allows you to create custom + * flags using the override system. + * + * @param client Client index. + * @param command Command name. If the command is not found, the default + * flags are used. + * @param flags Flag string to use as a default, if the command or override + * is not found. + * @param override_only If true, SourceMod will not attempt to find a matching + * command, and it will only use the default flags specified. + * Otherwise, SourceMod will ignore the default flags if + * there is a matching admin command. + * @return True if the client has access, false otherwise. + */ +native bool:CheckCommandAccess(client, + const String:command[], + flags, + bool:override_only=false); + +/** + * Returns whether an admin has access to a given command string. The string + * can be any override string, as overrides can be independent of + * commands. This feature essentially allows you to create custom flags + * using the override system. + * + * @param id AdminId of the admin. + * @param command Command name. If the command is not found, the default + * flags are used. + * @param flags Flag string to use as a default, if the command or override + * is not found. + * @param override_only If true, SourceMod will not attempt to find a matching + * command, and it will only use the default flags specified. + * Otherwise, SourceMod will ignore the default flags if + * there is a matching admin command. + * @return True if the admin has access, false otherwise. + */ +native bool:CheckAccess(AdminId:id, + const String:command[], + flags, + bool:override_only=false); + +/** + * Returns true if the supplied character is valid in a ConVar name. + * + * @param c Character to validate. + * @return True is valid for ConVars, false otherwise + */ +stock bool:IsValidConVarChar(c) +{ + return (c == '_' || IsCharAlpha(c) || IsCharNumeric(c)); +} + +/** + * Returns the bitstring of flags of a command. + * + * @param name Name of the command. + * @return A bitstring containing the FCVAR_* flags that are enabled + * or INVALID_FCVAR_FLAGS if command not found. + */ +native GetCommandFlags(const String:name[]); + +/** + * Sets the bitstring of flags of a command. + * + * @param name Name of the command. + * @param flags A bitstring containing the FCVAR_* flags to enable. + * @return True on success, otherwise false. + */ +native bool:SetCommandFlags(const String:name[], flags); + +/** + * Starts a ConCommandBase search, traversing the list of ConVars and + * ConCommands. If a Handle is returned, the next entry must be read + * via FindNextConCommand(). The order of the list is undefined. + * + * @param buffer Buffer to store entry name. + * @param max_size Maximum size of the buffer. + * @param isCommand Variable to store whether the entry is a command. + * If it is not a command, it is a ConVar. + * @param flags Variable to store entry flags. + * @param description Buffer to store the description, empty if no description present. + * @param descrmax_size Maximum size of the description buffer. + * @return On success, a ConCmdIter Handle is returned, which + * can be read via FindNextConCommand(), and must be + * closed via CloseHandle(). Additionally, the output + * parameters will be filled with information of the + * first ConCommandBase entry. + * On failure, INVALID_HANDLE is returned, and the + * contents of outputs is undefined. + */ +native Handle:FindFirstConCommand(String:buffer[], max_size, &bool:isCommand, &flags=0, String:description[]="", descrmax_size=0); + +/** + * Reads the next entry in a ConCommandBase iterator. + * + * @param search ConCmdIter Handle to search. + * @param buffer Buffer to store entry name. + * @param max_size Maximum size of the buffer. + * @param isCommand Variable to store whether the entry is a command. + * If it is not a command, it is a ConVar. + * @param flags Variable to store entry flags. + * @param description Buffer to store the description, empty if no description present. + * @param descrmax_size Maximum size of the description buffer. + * @return On success, the outputs are filled, the iterator is + * advanced to the next entry, and true is returned. + * If no more entries exist, false is returned, and the + * contents of outputs is undefined. + */ +native bool:FindNextConCommand(Handle:search, String:buffer[], max_size, &bool:isCommand, &flags=0, String:description[]="", descrmax_size=0); + +/** + * Replicates a convar value to a specific client. This does not change the actual convar value. + * + * @param client Client index + * @param convar ConVar handle + * @param value String value to send + * @return True on success, false on failure + * @error Invalid client index, client not in game, or client is fake + */ +native bool:SendConVarValue(client, Handle:convar, const String:value[]); + +/** + * Adds an informational string to the server's public "tags". + * This string should be a short, unique identifier. + * + * Note: Tags are automatically removed when a plugin unloads. + * Note: Currently, this function does nothing because of bugs in the Valve master. + * + * @param tag Tag string to append. + * @noreturn + */ +native AddServerTag(const String:tag[]); + +/** + * Removes a tag previously added by the calling plugin. + * + * @param tag Tag string to remove. + * @noreturn + */ +native RemoveServerTag(const String:tag[]); + +/** + * Callback for command listeners. This is invoked whenever any command + * reaches the server, from the server console itself or a player. + * + * Clients may be in the process of connecting when they are executing commands + * IsClientConnected(client) is not guaranteed to return true. Other functions + * such as GetClientIP() may not work at this point either. + * + * Returning Plugin_Handled or Plugin_Stop will prevent the original, + * baseline code from running. + * + * -- TEXT BELOW IS IMPLEMENTATION, AND NOT GUARANTEED -- + * Even if returning Plugin_Handled or Plugin_Stop, some callbacks will still + * trigger. These are: + * * C++ command dispatch hooks from Metamod:Source plugins + * * Reg*Cmd() hooks that did not create new commands. + * + * @param client Client, or 0 for server. + * Client may not be connected or in game. + * @param command Command name, lower case. To get name as typed, use + * GetCmdArg() and specify argument 0. + * @param argc Argument count. + * @return Action to take (see extended notes above). + */ +functag public Action:CommandListener(client, const String:command[], argc); + +#define FEATURECAP_COMMANDLISTENER "command listener" + +/** + * Adds a callback that will fire when a command is sent to the server. + * + * Registering commands is designed to create a new command as part of the UI, + * whereas this is a lightweight hook on a command string, existing or not. + * Using Reg*Cmd to intercept is in poor practice, as it physically creates a + * new command and can slow down dispatch in general. + * + * To see if this feature is available, use FeatureType_Capability and + * FEATURECAP_COMMANDLISTENER. + * + * @param callback Callback. + * @param command Command, or if not specified, a global listener. + * The command is case insensitive. + * @return True if this feature is available on the current game, + * false otherwise. + */ +native bool:AddCommandListener(CommandListener:callback, const String:command[]=""); + +/** + * Removes a previously added command listener, in reverse order of being added. + * + * @param callback Callback. + * @param command Command, or if not specified, a global listener. + * The command is case insensitive. + * @error Callback has no active listeners. + */ +native RemoveCommandListener(CommandListener:callback, const String:command[]=""); + +/** + * Returns true if the supplied command exists. + * + * @param command Command to find. + * @return True if command is found, false otherwise. + */ +stock bool:CommandExists(const String:command[]) +{ + return (GetCommandFlags(command) != INVALID_FCVAR_FLAGS); +} +/** + * Global listener for the chat commands. + * + * @param client Client index. + * @param command Command name. + * @param sArgs Chat argument string. + * + * @return An Action value. Returning Plugin_Handled bypasses the game function call. + Returning Plugin_Stop bypasses the post hook as well as the game function. + */ +forward Action:OnClientSayCommand(client, const String:command[], const String:sArgs[]); + +/** + * Global post listener for the chat commands. + * + * @param client Client index. + * @param command Command name. + * @param sArgs Chat argument string. + * + */ +forward OnClientSayCommand_Post(client, const String:command[], const String:sArgs[]); diff --git a/addons/sourcemod/scripting/include/core.inc b/addons/sourcemod/scripting/include/core.inc new file mode 100644 index 0000000..262e186 --- /dev/null +++ b/addons/sourcemod/scripting/include/core.inc @@ -0,0 +1,237 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _core_included + #endinput +#endif +#define _core_included + +#include + +/** If this gets changed, you need to update Core's check. */ +#define SOURCEMOD_PLUGINAPI_VERSION 5 + +struct PlVers +{ + version, + String:filevers[], + String:date[], + String:time[] +}; + +/** + * Function helper values. + */ +enum Function +{ + INVALID_FUNCTION = -1, +}; + +/** + * Specifies what to do after a hook completes. + */ +enum Action +{ + Plugin_Continue = 0, /**< Continue with the original action */ + Plugin_Changed = 1, /**< Inputs or outputs have been overridden with new values */ + Plugin_Handled = 3, /**< Handle the action at the end (don't call it) */ + Plugin_Stop = 4, /**< Immediately stop the hook chain and handle the original */ +}; + +/** + * Specifies identity types. + */ +enum Identity +{ + Identity_Core = 0, + Identity_Extension = 1, + Identity_Plugin = 2 +}; + +public PlVers:__version = +{ + version = SOURCEMOD_PLUGINAPI_VERSION, + filevers = SOURCEMOD_VERSION, + date = __DATE__, + time = __TIME__ +}; + +/** + * Plugin status values. + */ +enum PluginStatus +{ + Plugin_Running=0, /**< Plugin is running */ + /* All states below are "temporarily" unexecutable */ + Plugin_Paused, /**< Plugin is loaded but paused */ + Plugin_Error, /**< Plugin is loaded but errored/locked */ + /* All states below do not have all natives */ + Plugin_Loaded, /**< Plugin has passed loading and can be finalized */ + Plugin_Failed, /**< Plugin has a fatal failure */ + Plugin_Created, /**< Plugin is created but not initialized */ + Plugin_Uncompiled, /**< Plugin is not yet compiled by the JIT */ + Plugin_BadLoad, /**< Plugin failed to load */ +}; + +/** + * Plugin information properties. + */ +enum PluginInfo +{ + PlInfo_Name, /**< Plugin name */ + PlInfo_Author, /**< Plugin author */ + PlInfo_Description, /**< Plugin description */ + PlInfo_Version, /**< Plugin verison */ + PlInfo_URL, /**< Plugin URL */ +}; + +/** + * Defines how an extension must expose itself for autoloading. + */ +struct Extension +{ + const String:name[], /**< Short name */ + const String:file[], /**< Default file name */ + bool:autoload, /**< Whether or not to auto-load */ + bool:required, /**< Whether or not to require */ +}; + +/** + * Defines how a plugin must expose itself for native requiring. + */ +struct SharedPlugin +{ + const String:name[], /**< Short name */ + const String:file[], /**< File name */ + bool:required, /**< Whether or not to require */ +}; + +public Float:NULL_VECTOR[3]; /**< Pass this into certain functions to act as a C++ NULL */ +public const String:NULL_STRING[1]; /**< pass this into certain functions to act as a C++ NULL */ + +/** + * Horrible compatibility shim. + */ +public Extension:__ext_core = +{ + name = "Core", + file = "core", + autoload = 0, + required = 0, +}; + +native VerifyCoreVersion(); + +/** + * Sets a native as optional, such that if it is unloaded, removed, + * or otherwise non-existent, the plugin will still work. Calling + * removed natives results in a run-time error. + * + * @param name Native name. + * @noreturn + */ +native MarkNativeAsOptional(const String:name[]); + +public __ext_core_SetNTVOptional() +{ + MarkNativeAsOptional("GetFeatureStatus"); + MarkNativeAsOptional("RequireFeature"); + MarkNativeAsOptional("AddCommandListener"); + MarkNativeAsOptional("RemoveCommandListener"); + + MarkNativeAsOptional("BfWriteBool"); + MarkNativeAsOptional("BfWriteByte"); + MarkNativeAsOptional("BfWriteChar"); + MarkNativeAsOptional("BfWriteShort"); + MarkNativeAsOptional("BfWriteWord"); + MarkNativeAsOptional("BfWriteNum"); + MarkNativeAsOptional("BfWriteFloat"); + MarkNativeAsOptional("BfWriteString"); + MarkNativeAsOptional("BfWriteEntity"); + MarkNativeAsOptional("BfWriteAngle"); + MarkNativeAsOptional("BfWriteCoord"); + MarkNativeAsOptional("BfWriteVecCoord"); + MarkNativeAsOptional("BfWriteVecNormal"); + MarkNativeAsOptional("BfWriteAngles"); + MarkNativeAsOptional("BfReadBool"); + MarkNativeAsOptional("BfReadByte"); + MarkNativeAsOptional("BfReadChar"); + MarkNativeAsOptional("BfReadShort"); + MarkNativeAsOptional("BfReadWord"); + MarkNativeAsOptional("BfReadNum"); + MarkNativeAsOptional("BfReadFloat"); + MarkNativeAsOptional("BfReadString"); + MarkNativeAsOptional("BfReadEntity"); + MarkNativeAsOptional("BfReadAngle"); + MarkNativeAsOptional("BfReadCoord"); + MarkNativeAsOptional("BfReadVecCoord"); + MarkNativeAsOptional("BfReadVecNormal"); + MarkNativeAsOptional("BfReadAngles"); + MarkNativeAsOptional("BfGetNumBytesLeft"); + + MarkNativeAsOptional("PbReadInt"); + MarkNativeAsOptional("PbReadFloat"); + MarkNativeAsOptional("PbReadBool"); + MarkNativeAsOptional("PbReadString"); + MarkNativeAsOptional("PbReadColor"); + MarkNativeAsOptional("PbReadAngle"); + MarkNativeAsOptional("PbReadVector"); + MarkNativeAsOptional("PbReadVector2D"); + MarkNativeAsOptional("PbGetRepeatedFieldCount"); + MarkNativeAsOptional("PbSetInt"); + MarkNativeAsOptional("PbSetFloat"); + MarkNativeAsOptional("PbSetBool"); + MarkNativeAsOptional("PbSetString"); + MarkNativeAsOptional("PbSetColor"); + MarkNativeAsOptional("PbSetAngle"); + MarkNativeAsOptional("PbSetVector"); + MarkNativeAsOptional("PbSetVector2D"); + MarkNativeAsOptional("PbAddInt"); + MarkNativeAsOptional("PbAddFloat"); + MarkNativeAsOptional("PbAddBool"); + MarkNativeAsOptional("PbAddString"); + MarkNativeAsOptional("PbAddColor"); + MarkNativeAsOptional("PbAddAngle"); + MarkNativeAsOptional("PbAddVector"); + MarkNativeAsOptional("PbAddVector2D"); + MarkNativeAsOptional("PbRemoveRepeatedFieldValue"); + MarkNativeAsOptional("PbReadMessage"); + MarkNativeAsOptional("PbReadRepeatedMessage"); + MarkNativeAsOptional("PbAddMessage"); + + VerifyCoreVersion(); +} + + +#define AUTOLOAD_EXTENSIONS +#define REQUIRE_EXTENSIONS +#define REQUIRE_PLUGIN diff --git a/addons/sourcemod/scripting/include/cstrike.inc b/addons/sourcemod/scripting/include/cstrike.inc new file mode 100644 index 0000000..45ccac0 --- /dev/null +++ b/addons/sourcemod/scripting/include/cstrike.inc @@ -0,0 +1,422 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _cstrike_included + #endinput +#endif +#define _cstrike_included + +#define CS_TEAM_NONE 0 /**< No team yet. */ +#define CS_TEAM_SPECTATOR 1 /**< Spectators. */ +#define CS_TEAM_T 2 /**< Terrorists. */ +#define CS_TEAM_CT 3 /**< Counter-Terrorists. */ + +#define CS_SLOT_PRIMARY 0 /**< Primary weapon slot. */ +#define CS_SLOT_SECONDARY 1 /**< Secondary weapon slot. */ +#define CS_SLOT_KNIFE 2 /**< Knife slot. */ +#define CS_SLOT_GRENADE 3 /**< Grenade slot (will only return one grenade). */ +#define CS_SLOT_C4 4 /**< C4 slot. */ + +#define CS_DMG_HEADSHOT (1 << 30) /**< Headshot */ + +enum CSRoundEndReason +{ + CSRoundEnd_TargetBombed = 0, /**< Target Successfully Bombed! */ + CSRoundEnd_VIPEscaped, /**< The VIP has escaped! */ + CSRoundEnd_VIPKilled, /**< VIP has been assassinated! */ + CSRoundEnd_TerroristsEscaped, /**< The terrorists have escaped! */ + CSRoundEnd_CTStoppedEscape, /**< The CTs have prevented most of the terrorists from escaping! */ + CSRoundEnd_TerroristsStopped, /**< Escaping terrorists have all been neutralized! */ + CSRoundEnd_BombDefused, /**< The bomb has been defused! */ + CSRoundEnd_CTWin, /**< Counter-Terrorists Win! */ + CSRoundEnd_TerroristWin, /**< Terrorists Win! */ + CSRoundEnd_Draw, /**< Round Draw! */ + CSRoundEnd_HostagesRescued, /**< All Hostages have been rescued! */ + CSRoundEnd_TargetSaved, /**< Target has been saved! */ + CSRoundEnd_HostagesNotRescued, /**< Hostages have not been rescued! */ + CSRoundEnd_TerroristsNotEscaped, /**< Terrorists have not escaped! */ + CSRoundEnd_VIPNotEscaped, /**< VIP has not escaped! */ + CSRoundEnd_GameStart, /**< Game Commencing! */ + + // The below only exist on CS:GO + CSRoundEnd_TerroristsSurrender, /**< Terrorists Surrender */ + CSRoundEnd_CTSurrender, /**< CTs Surrender */ +}; + +enum CSWeaponID +{ + CSWeapon_NONE = 0, + CSWeapon_P228, + CSWeapon_GLOCK, + CSWeapon_SCOUT, + CSWeapon_HEGRENADE, + CSWeapon_XM1014, + CSWeapon_C4, + CSWeapon_MAC10, + CSWeapon_AUG, + CSWeapon_SMOKEGRENADE, + CSWeapon_ELITE, + CSWeapon_FIVESEVEN, + CSWeapon_UMP45, + CSWeapon_SG550, + CSWeapon_GALIL, + CSWeapon_FAMAS, + CSWeapon_USP, + CSWeapon_AWP, + CSWeapon_MP5NAVY, + CSWeapon_M249, + CSWeapon_M3, + CSWeapon_M4A1, + CSWeapon_TMP, + CSWeapon_G3SG1, + CSWeapon_FLASHBANG, + CSWeapon_DEAGLE, + CSWeapon_SG552, + CSWeapon_AK47, + CSWeapon_KNIFE, + CSWeapon_P90, + CSWeapon_SHIELD, + CSWeapon_KEVLAR, + CSWeapon_ASSAULTSUIT, + CSWeapon_NIGHTVISION, + CSWeapon_GALILAR, + CSWeapon_BIZON, + CSWeapon_MAG7, + CSWeapon_NEGEV, + CSWeapon_SAWEDOFF, + CSWeapon_TEC9, + CSWeapon_TASER, + CSWeapon_HKP2000, + CSWeapon_MP7, + CSWeapon_MP9, + CSWeapon_NOVA, + CSWeapon_P250, + CSWeapon_SCAR17, + CSWeapon_SCAR20, + CSWeapon_SG556, + CSWeapon_SSG08, + CSWeapon_KNIFE_GG, + CSWeapon_MOLOTOV, + CSWeapon_DECOY, + CSWeapon_INCGRENADE, + CSWeapon_DEFUSER +}; + +/** + * Called when a player attempts to purchase an item. + * Return Plugin_Continue to allow the purchase or return a + * higher action to deny. + * + * @param client Client index + * @param weapon User input for weapon name + */ +forward Action:CS_OnBuyCommand(client, const String:weapon[]); + +/** + * Called when CSWeaponDrop is called + * Return Plugin_Continue to allow the call or return a + * higher action to deny. + * + * @param client Client index + * @param weaponIndex Weapon index + */ +forward Action:CS_OnCSWeaponDrop(client, weaponIndex); + +/** + * Called when game retrieves a weapon's price for a player. + * Return Plugin_Continue to use default value or return a higher + * action to use a newly-set price. + * + * @note This can be called multiple times per weapon purchase + * + * @param client Client index + * @param weapon Weapon classname + * @param price Buffer param for the price of the weapon + * + * @note Not all "weapons" call GetWeaponPrice. Example: c4, knife, vest, vest helmet, night vision. + */ +forward Action:CS_OnGetWeaponPrice(client, const String:weapon[], &price); + +/** + * Called when TerminateRound is called. + * Return Plugin_Continue to ignore, return Plugin_Changed to continue, + * using the given delay and reason, or return Plugin_Handled or a higher + * action to block TerminateRound from firing. + * + * @param delay Time (in seconds) until new round starts + * @param reason Reason for round end + */ +forward Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason); + +/** + * Respawns a player. + * + * @param client Player's index. + * @noreturn + * @error Invalid client index, client not in game. + */ +native CS_RespawnPlayer(client); + +/** + * Switches the player's team. + * + * @param client Player's index. + * @param team Team index. + * @noreturn + * @error Invalid client index, client not in game. + */ +native CS_SwitchTeam(client, team); + +/** + * Forces a player to drop or toss their weapon + * + * @param client Player's index. + * @param weaponIndex Index of weapon to drop. + * @param toss True to toss weapon (with velocity) or false to just drop weapon + * @param blockhook Set to true to stop the corresponding CS_OnCSWeaponDrop + * + * @noreturn + * @error Invalid client index, client not in game, or invalid weapon index. + */ +native CS_DropWeapon(client, weaponIndex, bool:toss, bool:blockhook = false); + +/** + * Forces round to end with a reason + * + * @param delay Time (in seconds) to delay before new round starts + * @param reason Reason for the round ending + * @param blockhook Set to true to stop the corresponding CS_OnTerminateRound + * forward from being called. + * @noreturn + */ +native CS_TerminateRound(Float:delay, CSRoundEndReason:reason, bool:blockhook = false); + +/** + * Gets a weapon name from a weapon alias + * + * @param alias Weapons alias to get weapon name for. + * @param weapon Buffer to store weapons name + * @param size Size of buffer to store the weapons name. + * @noreturn + * + * @note Will set the buffer to the original alias if it is not an alias to a weapon. + */ +native CS_GetTranslatedWeaponAlias(const String:alias[], String:weapon[], size); + +/** + * Gets a weapon's price + * + * @param client Client to check weapon price for. + * @param id Weapon id for the weapon to check + * @param defaultprice Set to true to get defaultprice. + * @return Returns price of the weapon (even if modified) + * + * @error Invalid client, failing to get weapon info, or failing to get price offset. + * @note c4, knife and shield will always return 0. vest, vest helmet and night vision will always return default price. + */ +native CS_GetWeaponPrice(client, CSWeaponID:id, bool:defaultprice = false); + +/** + * Gets a clients clan tag + * @param client Client index to get clan tag for. + * @param buffer Buffer to store clients clan tag in. + * @param size Size of the buffer. + * @return Number of non-null bytes written. + * + * @error Invalid client. + */ +native CS_GetClientClanTag(client, String:buffer[], size); + +/** + * Sets a clients clan tag + * @param client Client index to set clan tag for. + * @param tag Tag to set clients clan tag as. + * @noreturn + * + * @error Invalid client. + */ +native CS_SetClientClanTag(client, const String:tag[]); + +/** + * Gets a team's score + * @param team Team index to get score for. + * @return Returns the internal team score. + * + * @error Invalid team index. + */ +native CS_GetTeamScore(team); + +/** + * Sets a team's score + * @param team Team index to set score for. + * @param value Value to set teams score as. + * @noreturn + * + * @error Invalid team index. + * @note This will update the scoreboard only after the scoreboard update function is called. Use SetTeamScore plus this to update the scoreboard instantly and save values correctly. + */ +native CS_SetTeamScore(team, value); + +/** + * Gets a client's mvp count + * @param client Client index to get mvp count of. + * @return Returns the client's internal MVP count. + * + * @error Invalid client. + */ +native CS_GetMVPCount(client); + +/** + * Sets a client's mvp count + * @param client Client index to set mvp count for. + * @param value Value to set client's mvp count as. + * @noreturn + * + * @error Invalid client. + */ +native CS_SetMVPCount(client, value); + +/** + * Gets a client's contribution score (CS:GO only) + * @param client Client index to get score of. + * @return Returns the client's score. + * + * @error Invalid client. + */ +native CS_GetClientContributionScore(client); + +/** + * Sets a client's contribution score (CS:GO only) + * @param client Client index to set score for. + * @param value Value to set client's score as. + * @noreturn + * + * @error Invalid client. + */ +native CS_SetClientContributionScore(client, value); + +/** + * Gets a client's assists (CS:GO only) + * @param client Client index to get assists of. + * @return Returns the client's assists. + * + * @error Invalid client. + */ +native CS_GetClientAssists(client); + +/** + * Sets a client's assists (CS:GO only) + * @param client Client index to set assists for. + * @param value Value to set client's assists as. + * @noreturn + * + * @error Invalid client. + */ +native CS_SetClientAssists(client, value); + +/** + * Gets a weaponID from a alias + * @param alias Weapon alias to attempt to get an id for. + * @return Returns a weapon id or 0 if failed to find a match. + * + * @note For best results use CS_GetTranslatedWeaponAlias on the weapon name before passing it. + */ +native CSWeaponID:CS_AliasToWeaponID(const String:alias[]); + +/** + * Gets a alias from a weaponID + * @param weaponID WeaponID to get alias for. + * @param destination Destination string to hold the weapon alias. + * @param len Length of the destination array. + * @return Returns number of cells written. + */ +native CS_WeaponIDToAlias(CSWeaponID:weaponID, String:destination[], len); + +/** + * Returns weather a WeaponID is valid on the current mod (css or csgo) + * @param weaponID WeaponID to check + * @return Returns true if its a valid WeaponID false otherwise. + * + * @note This will return false always for CSWeapon_NONE + */ +native bool:CS_IsValidWeaponID(CSWeaponID:id); + +/** + * Sets a player's model based on their current class + * + * @param client Player's index. + * @noreturn + * @error Invalid client index, client not in game. + */ +native CS_UpdateClientModel(client); + +/** + * Do not edit below this line! + */ +public Extension:__ext_cstrike = +{ + name = "cstrike", + file = "games/game.cstrike.ext", + autoload = 0, +#if defined REQUIRE_EXTENSIONS + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_EXTENSIONS +public __ext_cstrike_SetNTVOptional() +{ + MarkNativeAsOptional("CS_RespawnPlayer"); + MarkNativeAsOptional("CS_SwitchTeam"); + MarkNativeAsOptional("CS_DropWeapon"); + MarkNativeAsOptional("CS_TerminateRound"); + MarkNativeAsOptional("CS_GetTranslatedWeaponAlias"); + MarkNativeAsOptional("CS_GetWeaponPrice"); + MarkNativeAsOptional("CS_GetClientClanTag"); + MarkNativeAsOptional("CS_SetClientClanTag"); + MarkNativeAsOptional("CS_GetTeamScore"); + MarkNativeAsOptional("CS_SetTeamScore"); + MarkNativeAsOptional("CS_GetMVPCount"); + MarkNativeAsOptional("CS_SetMVPCount"); + MarkNativeAsOptional("CS_GetClientContributionScore"); + MarkNativeAsOptional("CS_SetClientContributionScore"); + MarkNativeAsOptional("CS_GetClientAssists"); + MarkNativeAsOptional("CS_SetClientAssists"); + MarkNativeAsOptional("CS_AliasToWeaponID"); + MarkNativeAsOptional("CS_WeaponIDToAlias"); + MarkNativeAsOptional("CS_IsValidWeaponID"); + MarkNativeAsOptional("CS_UpdateClientModel"); +} +#endif + diff --git a/addons/sourcemod/scripting/include/datapack.inc b/addons/sourcemod/scripting/include/datapack.inc new file mode 100644 index 0000000..ce3d8b7 --- /dev/null +++ b/addons/sourcemod/scripting/include/datapack.inc @@ -0,0 +1,142 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _datapack_included + #endinput +#endif +#define _datapack_included + +/** + * Creates a new data pack. + * + * @return A Handle to the data pack. Must be closed with CloseHandle(). + */ +native Handle:CreateDataPack(); + +/** + * Packs a normal cell into a data pack. + * + * @param pack Handle to the data pack. + * @param cell Cell to add. + * @noreturn + * @error Invalid handle. + */ +native WritePackCell(Handle:pack, any:cell); + +/** + * Packs a float into a data pack. + * + * @param pack Handle to the data pack. + * @param val Float to add. + * @noreturn + * @error Invalid handle. + */ +native WritePackFloat(Handle:pack, Float:val); + +/** + * Packs a string into a data pack. + * + * @param pack Handle to the data pack. + * @param str String to add. + * @noreturn + * @error Invalid handle. + */ +native WritePackString(Handle:pack, const String:str[]); + +/** + * Reads a cell from a data pack. + * + * @param pack Handle to the data pack. + * @return Cell value. + * @error Invalid handle, or bounds error. + */ +native any:ReadPackCell(Handle:pack); + +/** + * Reads a float from a data pack. + * + * @param pack Handle to the data pack. + * @return Float value. + * @error Invalid handle, or bounds error. + */ +native Float:ReadPackFloat(Handle:pack); + +/** + * Reads a string from a data pack. + * + * @param pack Handle to the data pack. + * @param buffer Destination string buffer. + * @param maxlen Maximum length of output string buffer. + * @noreturn + * @error Invalid handle, or bounds error. + */ +native ReadPackString(Handle:pack, String:buffer[], maxlen); + +/** + * Resets the position in a data pack. + * + * @param pack Handle to the data pack. + * @param clear If true, clears the contained data. + * @noreturn + * @error Invalid handle. + */ +native ResetPack(Handle:pack, bool:clear=false); + +/** + * Returns the read or write position in a data pack. + * + * @param pack Handle to the data pack. + * @return Numerical position in the data pack. + * @error Invalid handle. + */ +native GetPackPosition(Handle:pack); + +/** + * Sets the read/write position in a data pack. + * + * @param pack Handle to the data pack. + * @param position New position to set. + * @noreturn + * @error Invalid handle, or position is beyond the pack bounds. + */ +native SetPackPosition(Handle:pack, position); + +/** + * Returns whether or not a specified number of bytes from the data pack + * position to the end can be read. + * + * @param pack Handle to the data pack. + * @param bytes Number of bytes to simulate reading. + * @return True if can be read, false otherwise. + * @error Invalid handle. + */ +native bool:IsPackReadable(Handle:pack, bytes); diff --git a/addons/sourcemod/scripting/include/dbi.inc b/addons/sourcemod/scripting/include/dbi.inc new file mode 100644 index 0000000..bbb1d6e --- /dev/null +++ b/addons/sourcemod/scripting/include/dbi.inc @@ -0,0 +1,762 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _dbi_included + #endinput +#endif +#define _dbi_included + +/** + * @handle Driver + * + * Contains information about an SQL driver. + */ + +/** + * @handle Database + * + * Contains information about a database connection. + */ + +/** + * @handle Query + * + * Contains information about an active query and its + * result sets. + */ + +/** + * @handle Statement : Query + * + * Extends a Query Handle and can be used as a Query Handle. + * Statement Handles are for prepared queries and contain + * their own function for binding parameters. Statement + * Handles can be used instead of database Handles in a few + * select functions. + */ + +/** + * Describes a database field fetch status. + */ +enum DBResult +{ + DBVal_Error = 0, /**< Column number/field is invalid. */ + DBVal_TypeMismatch = 1, /**< You cannot retrieve this data with this type. */ + DBVal_Null = 2, /**< Field has no data (NULL) */ + DBVal_Data = 3, /**< Field has data */ +}; + +/** + * Describes binding types. + */ +enum DBBindType +{ + DBBind_Int = 0, /**< Bind an integer. */ + DBBind_Float = 1, /**< Bind a float. */ + DBBind_String = 2, /**< Bind a string. */ +}; + +/** + * Threading priority level. + */ +enum DBPriority +{ + DBPrio_High = 0, /**< High priority. */ + DBPrio_Normal = 1, /**< Normal priority. */ + DBPrio_Low = 2, /**< Low priority. */ +}; + +/** + * Creates an SQL connection from a named configuration. + * + * @param confname Named configuration. + * @param persistent True to re-use a previous persistent connection if + * possible, false otherwise. + * @param error Error buffer. + * @param maxlength Maximum length of the error buffer. + * @return A database connection Handle, or INVALID_HANDLE on failure. + */ +native Handle:SQL_Connect(const String:confname[], bool:persistent, String:error[], maxlength); + +/** + * Creates a default SQL connection. + * + * @param error Error buffer. + * @param maxlength Maximum length of the error buffer. + * @param persistent True to re-use a previous persistent connection + * if possible, false otherwise. + * @return A database connection Handle, or INVALID_HANDLE on failure. + * On failure the error buffer will be filled with a message. + */ +stock Handle:SQL_DefConnect(String:error[], maxlength, bool:persistent=true) +{ + return SQL_Connect("default", persistent, error, maxlength); +} + +/** + * Connects to a database using key value pairs containing the database info. + * The key/value pairs should match what would be in databases.cfg. + * + * I.e. "driver" should be "default" or a driver name (or ommitted for + * the default). For SQLite, only the "database" parameter is needed in addition. + * For drivers which require external connections, more of the parameters may be + * needed. + * + * In general it is discouraged to use this function. Connections should go through + * databases.cfg for greatest flexibility on behalf of users. + * + * @param keyvalues Key/value pairs from a KeyValues handle, describing the connection. + * @param error Error buffer. + * @param maxlength Maximum length of the error buffer. + * @param persistent True to re-use a previous persistent connection if + * possible, false otherwise. + * @return A database connection Handle, or INVALID_HANDLE on failure. + * On failure the error buffer will be filled with a message. + * @error Invalid KeyValues handle. + */ +native Handle:SQL_ConnectCustom(Handle:keyvalues, + String:error[], + maxlength, + bool:persistent); + +/** + * Grabs a handle to an SQLite database, creating one if it does not exist. + * + * Unless there are extenuating circumstances, you should consider using "sourcemod-local" as the + * database name. This provides some unification between plugins on behalf of users. + * + * As a precaution, you should always create some sort of unique prefix to your table names so + * there are no conflicts, and you should never drop or modify tables that you do not own. + * + * @param database Database name. + * @param error Error buffer. + * @param maxlength Maximum length of the error buffer. + * @return A database connection Handle, or INVALID_HANDLE on failure. + * On failure the error buffer will be filled with a message. + */ +stock Handle:SQLite_UseDatabase(const String:database[], + String:error[], + maxlength) +{ + new Handle:kv, Handle:db; + + kv = CreateKeyValues(""); + KvSetString(kv, "driver", "sqlite"); + KvSetString(kv, "database", database); + + db = SQL_ConnectCustom(kv, error, maxlength, false); + + CloseHandle(kv); + + return db; +} + +/** + * This function is deprecated. Use SQL_ConnectCustom or SQLite_UseDatabase instead. + */ +#pragma deprecated Use SQL_ConnectCustom instead. +native Handle:SQL_ConnectEx(Handle:driver, + const String:host[], + const String:user[], + const String:pass[], + const String:database[], + String:error[], + maxlength, + bool:persistent=true, + port=0, + maxTimeout=0); + +/** + * Returns if a named configuration is present in databases.cfg. + * + * @param name Configuration name. + * @return True if it exists, false otherwise. + */ +native bool:SQL_CheckConfig(const String:name[]); + +/** + * Returns a driver Handle from a name string. + * + * If the driver is not found, SourceMod will attempt + * to load an extension named dbi..ext.[dll|so]. + * + * @param name Driver identification string, or an empty + * string to return the default driver. + * @return Driver Handle, or INVALID_HANDLE on failure. + */ +native Handle:SQL_GetDriver(const String:name[]=""); + +/** + * Reads the driver of an opened database. + * + * @param database Database Handle. + * @param ident Option buffer to store the identification string. + * @param ident_length Maximum length of the buffer. + * @return Driver Handle. + */ +native Handle:SQL_ReadDriver(Handle:database, String:ident[]="", ident_length=0); + +/** + * Retrieves a driver's identification string. + * + * Example: "mysql", "sqlite" + * + * @param driver Driver Handle, or INVALID_HANDLE for the default driver. + * @param ident Identification string buffer. + * @param maxlength Maximum length of the buffer. + * @noreturn + * @error Invalid Handle other than INVALID_HANDLE. + */ +native SQL_GetDriverIdent(Handle:driver, String:ident[], maxlength); + +/** + * Retrieves a driver's product string. + * + * Example: "MySQL", "SQLite" + * + * @param driver Driver Handle, or INVALID_HANDLE for the default driver. + * @param product Product string buffer. + * @param maxlength Maximum length of the buffer. + * @noreturn + * @error Invalid Handle other than INVALID_HANDLE. + */ +native SQL_GetDriverProduct(Handle:driver, String:product[], maxlength); + +/** + * Sets the character set of the current connection. + * Like SET NAMES .. in mysql, but stays after connection problems. + * + * Example: "utf8", "latin1" + * + * @param database Database Handle. + * @param characterset The character set string to change to. + * @return True, if character set was changed, false otherwise. + */ +native bool:SQL_SetCharset(Handle:database, const String:charset[]); + +/** + * Returns the number of affected rows from the last query. + * + * @param hndl A database OR statement Handle. + * @return Number of rows affected by the last query. + * @error Invalid database or statement Handle. + */ +native SQL_GetAffectedRows(Handle:hndl); + +/** + * Returns the last query's insertion id. + * + * @param hndl A database, query, OR statement Handle. + * @return Last query's insertion id. + * @error Invalid database, query, or statement Handle. + */ +native SQL_GetInsertId(Handle:hndl); + +/** + * Returns the error reported by the last query. + * + * @param hndl A database, query, OR statement Handle. + * @param error Error buffer. + * @param maxlength Maximum length of the buffer. + * @return True if there was an error, false otherwise. + * @error Invalid database, query, or statement Handle. + */ +native bool:SQL_GetError(Handle:hndl, String:error[], maxlength); + +/** + * Escapes a database string for literal insertion. This is not needed + * for binding strings in prepared statements. + * + * Generally, database strings are inserted into queries enclosed in + * single quotes ('). If user input has a single quote in it, the + * quote needs to be escaped. This function ensures that any unsafe + * characters are safely escaped according to the database engine and + * the database's character set. + * + * NOTE: SourceMod only guarantees properly escaped strings when the query + * encloses the string in ''. While drivers tend to allow " instead, the string + * may be not be escaped (for example, on SQLite)! + * + * @param database A database Handle. + * @param string String to quote. + * @param buffer Buffer to store quoted string in. + * @param maxlength Maximum length of the buffer. + * @param written Optionally returns the number of bytes written. + * @return True on success, false if buffer is not big enough. + * The buffer must be at least 2*strlen(string)+1. + * @error Invalid database or statement Handle. + */ +native bool:SQL_EscapeString(Handle:database, + const String:string[], + String:buffer[], + maxlength, + &written=0); + +/** + * This is a backwards compatibility stock. You should use SQL_EscapeString() + * instead, as this function will probably be deprecated in SourceMod 1.1. + */ +stock bool:SQL_QuoteString(Handle:database, + const String:string[], + String:buffer[], + maxlength, + &written=0) +{ + return SQL_EscapeString(database, string, buffer, maxlength, written); +} + +/** + * Executes a query and ignores the result set. + * + * @param database A database Handle. + * @param query Query string. + * @param len Optional parameter to specify the query length, in + * bytes. This can be used to send binary queries that + * have a premature terminator. + * @return True if query succeeded, false otherwise. Use + * SQL_GetError to find the last error. + * @error Invalid database Handle. + */ +native bool:SQL_FastQuery(Handle:database, const String:query[], len=-1); + +/** + * Executes a simple query and returns a new query Handle for + * receiving the results. + * + * @param database A database Handle. + * @param query Query string. + * @param len Optional parameter to specify the query length, in + * bytes. This can be used to send binary queries that + * have a premature terminator. + * @return A new Query Handle on success, INVALID_HANDLE + * otherwise. The Handle must be freed with CloseHandle(). + * @error Invalid database Handle. + */ +native Handle:SQL_Query(Handle:database, const String:query[], len=-1); + +/** + * Creates a new prepared statement query. Prepared statements can + * be executed any number of times. They can also have placeholder + * parameters, similar to variables, which can be bound safely and + * securely (for example, you do not need to quote bound strings). + * + * Statement handles will work in any function that accepts a Query handle. + * + * @param database A database Handle. + * @param query Query string. + * @param error Error buffer. + * @param maxlength Maximum size of the error buffer. + * @return A new statement Handle on success, INVALID_HANDLE + * otherwise. The Handle must be freed with CloseHandle(). + * @error Invalid database Handle. + */ +native Handle:SQL_PrepareQuery(Handle:database, const String:query[], String:error[], maxlength); + +/** + * Advances to the next set of results. + * + * In some SQL implementations, multiple result sets can exist on one query. + * This is possible in MySQL with simple queries when executing a CALL + * query. If this is the case, all result sets must be processed before + * another query is made. + * + * @param query A query Handle. + * @return True if there was another result set, false otherwise. + * @error Invalid query Handle. + */ +native bool:SQL_FetchMoreResults(Handle:query); + +/** + * Returns whether or not a result set exists. This will + * return true even if 0 results were returned, but false + * on queries like UPDATE, INSERT, or DELETE. + * + * @param query A query (or statement) Handle. + * @return True if there is a result set, false otherwise. + * @error Invalid query Handle. + */ +native bool:SQL_HasResultSet(Handle:query); + +/** + * Retrieves the number of rows in the last result set. + * + * @param query A query (or statement) Handle. + * @return Number of rows in the current result set. + * @error Invalid query Handle. + */ +native SQL_GetRowCount(Handle:query); + +/** + * Retrieves the number of fields in the last result set. + * + * @param query A query (or statement) Handle. + * @return Number of fields in the current result set. + * @error Invalid query Handle. + */ +native SQL_GetFieldCount(Handle:query); + +/** + * Retrieves the name of a field by index. + * + * @param query A query (or statement) Handle. + * @param field Field number (starting from 0). + * @param name Name buffer. + * @param maxlength Maximum length of the name buffer. + * @noreturn + * @error Invalid query Handle, invalid field index, or + * no current result set. + */ +native SQL_FieldNumToName(Handle:query, field, String:name[], maxlength); + +/** + * Retrieves a field index by name. + * + * @param query A query (or statement) Handle. + * @param name Name of the field (case sensitive). + * @param field Variable to store field index in. + * @return True if found, false if not found. + * @error Invalid query Handle or no current result set. + */ +native bool:SQL_FieldNameToNum(Handle:query, const String:name[], &field); + +/** + * Fetches a row from the current result set. This must be + * successfully called before any results are fetched. + * + * If this function fails, SQL_MoreResults() can be used to + * tell if there was an error or the result set is finished. + * + * @param query A query (or statement) Handle. + * @return True if a row was fetched, false otherwise. + * @error Invalid query Handle. + */ +native bool:SQL_FetchRow(Handle:query); + +/** + * Returns if there are more rows. + * + * @param query A query (or statement) Handle. + * @return True if there are more rows, false otherwise. + * @error Invalid query Handle. + */ +native bool:SQL_MoreRows(Handle:query); + +/** + * Rewinds a result set back to the first result. + * + * @param query A query (or statement) Handle. + * @return True on success, false otherwise. + * @error Invalid query Handle or no current result set. + */ +native bool:SQL_Rewind(Handle:query); + +/** + * Fetches a string from a field in the current row of a result set. + * If the result is NULL, an empty string will be returned. A NULL + * check can be done with the result parameter, or SQL_IsFieldNull(). + * + * @param query A query (or statement) Handle. + * @param field The field index (starting from 0). + * @param buffer String buffer. + * @param maxlength Maximum size of the string buffer. + * @param result Optional variable to store the status of the return value. + * @return Number of bytes written. + * @error Invalid query Handle or field index, invalid + * type conversion requested from the database, + * or no current result set. + */ +native SQL_FetchString(Handle:query, field, String:buffer[], maxlength, &DBResult:result=DBVal_Error); + +/** + * Fetches a float from a field in the current row of a result set. + * If the result is NULL, a value of 0.0 will be returned. A NULL + * check can be done with the result parameter, or SQL_IsFieldNull(). + * + * @param query A query (or statement) Handle. + * @param field The field index (starting from 0). + * @param result Optional variable to store the status of the return value. + * @return A float value. + * @error Invalid query Handle or field index, invalid + * type conversion requested from the database, + * or no current result set. + */ +native Float:SQL_FetchFloat(Handle:query, field, &DBResult:result=DBVal_Error); + +/** + * Fetches an integer from a field in the current row of a result set. + * If the result is NULL, a value of 0 will be returned. A NULL + * check can be done with the result parameter, or SQL_IsFieldNull(). + * + * @param query A query (or statement) Handle. + * @param field The field index (starting from 0). + * @param result Optional variable to store the status of the return value. + * @return An integer value. + * @error Invalid query Handle or field index, invalid + * type conversion requested from the database, + * or no current result set. + */ +native SQL_FetchInt(Handle:query, field, &DBResult:result=DBVal_Error); + +/** + * Returns whether a field's data in the current row of a result set is + * NULL or not. NULL is an SQL type which means "no data." + * + * @param query A query (or statement) Handle. + * @param field The field index (starting from 0). + * @return True if data is NULL, false otherwise. + * @error Invalid query Handle or field index, or no + * current result set. + */ +native bool:SQL_IsFieldNull(Handle:query, field); + +/** + * Returns the length of a field's data in the current row of a result + * set. This only needs to be called for strings to determine how many + * bytes to use. Note that the return value does not include the null + * terminator. + * + * @param query A query (or statement) Handle. + * @param field The field index (starting from 0). + * @return Number of bytes for the field's data size. + * @error Invalid query Handle or field index or no + * current result set. + */ +native SQL_FetchSize(Handle:query, field); + +/** + * Binds a parameter in a prepared statement to a given integer value. + * + * @param statement A statement (prepared query) Handle. + * @param param The parameter index (starting from 0). + * @param number The number to bind. + * @param signed True to bind the number as signed, false to + * bind it as unsigned. + * @noreturn + * @error Invalid statement Handle or parameter index, or + * SQL error. + */ +native SQL_BindParamInt(Handle:statement, param, number, bool:signed=true); + +/** + * Binds a parameter in a prepared statement to a given float value. + * + * @param statement A statement (prepared query) Handle. + * @param param The parameter index (starting from 0). + * @param value The float number to bind. + * @noreturn + * @error Invalid statement Handle or parameter index, or + * SQL error. + */ +native SQL_BindParamFloat(Handle:statement, param, Float:value); + +/** + * Binds a parameter in a prepared statement to a given string value. + * + * @param statement A statement (prepared query) Handle. + * @param param The parameter index (starting from 0). + * @param value The string to bind. + * @param copy Whether or not SourceMod should copy the value + * locally if necessary. If the string contents + * won't change before calling SQL_Execute(), this + * can be set to false for optimization. + * @noreturn + * @error Invalid statement Handle or parameter index, or + * SQL error. + */ +native SQL_BindParamString(Handle:statement, param, const String:value[], bool:copy); + +/** + * Executes a prepared statement. All parameters must be bound beforehand. + * + * @param statement A statement (prepared query) Handle. + * @return True on success, false on failure. + * @error Invalid statement Handle. + */ +native bool:SQL_Execute(Handle:statement); + +/** + * Locks a database so threading operations will not interrupt. + * + * If you are using a database Handle for both threading and non-threading, + * this MUST be called before doing any set of non-threading DB operations. + * Otherwise you risk corrupting the database driver's memory or network + * connection. + * + * Leaving a lock on a database and then executing a threaded query results + * in a dead lock! Make sure to call SQL_UnlockDatabase()! + * + * If the lock cannot be acquired, the main thread will pause until the + * threaded operation has concluded. + * + * @param database A database Handle. + * @noreturn + * @error Invalid database Handle. + */ +native SQL_LockDatabase(Handle:database); + +/** + * Unlocks a database so threading operations may continue. + * + * @param database A database Handle. + * @noreturn + * @error Invalid database Handle. + */ +native SQL_UnlockDatabase(Handle:database); + +/** + * General callback for threaded SQL stuff. + * + * @param owner Parent object of the Handle (or INVALID_HANDLE if none). + * @param hndl Handle to the child object (or INVALID_HANDLE if none). + * @param error Error string if there was an error. The error could be + * empty even if an error condition exists, so it is important + * to check the actual Handle value instead. + * @param data Data passed in via the original threaded invocation. + * @param + */ +functag public SQLTCallback(Handle:owner, Handle:hndl, const String:error[], any:data); + +/** + * Tells whether two database handles both point to the same database + * connection. + * + * @param hndl1 First database Handle. + * @param hndl2 Second database Handle. + * @return True if the Handles point to the same + * connection, false otherwise. + * @error Invalid Handle. + */ +native bool:SQL_IsSameConnection(Handle:hndl1, Handle:hndl2); + +/** + * Connects to a database via a thread. This can be used instead of + * SQL_Connect() if you wish for non-blocking functionality. + * + * It is not necessary to use this to use threaded queries. However, if you + * don't (or you mix threaded/non-threaded queries), you should see + * SQL_LockDatabase(). + * + * @param callback Callback; new Handle will be in hndl, owner is the driver. + * If no driver was found, the owner is INVALID_HANDLE. + * @param name Database name. + * @param data Extra data value to pass to the callback. + * @noreturn + */ +native SQL_TConnect(SQLTCallback:callback, const String:name[]="default", any:data=0); + +/** + * Executes a simple query via a thread. The query Handle is passed through + * the callback. + * + * The database Handle returned through the callback is always a new Handle, + * and if necessary, SQL_IsSameConnection() should be used to test against + * other conenctions. + * + * The query Handle returned through the callback is temporary and destroyed + * at the end of the callback. If you need to hold onto it, use CloneHandle(). + * + * @param database A database Handle. + * @param callback Callback; database is in "owner" and the query Handle + * is passed in "hndl". + * @param query Query string. + * @param data Extra data value to pass to the callback. + * @param prio Priority queue to use. + * @noreturn + * @error Invalid database Handle. + */ +native SQL_TQuery(Handle:database, SQLTCallback:callback, const String:query[], any:data=0, DBPriority:prio=DBPrio_Normal); + +/** + * Creates a new transaction object. A transaction object is a list of queries + * that can be sent to the database thread and executed as a single transaction. + * + * @return A transaction handle. + */ +native Handle:SQL_CreateTransaction(); + +/** + * Adds a query to a transaction object. + * + * @param txn A transaction handle. + * @param query Query string. + * @param data Extra data value to pass to the final callback. + * @return The index of the query in the transaction's query list. + * @error Invalid transaction handle. + */ +native SQL_AddQuery(Handle:txn, const String:query[], any:data=0); + +/** + * Callback for a successful transaction. + * + * @param db Database handle. + * @param data Data value passed to SQL_ExecuteTransaction(). + * @param numQueries Number of queries executed in the transaction. + * @param results An array of Query handle results, one for each of numQueries. They are closed automatically. + * @param queryData An array of each data value passed to SQL_AddQuery(). + * @noreturn + */ +functag public SQLTxnSuccess(Handle:db, any:data, numQueries, Handle:results[], any:queryData[]); + +/** + * Callback for a failed transaction. + * + * @param db Database handle. + * @param data Data value passed to SQL_ExecuteTransaction(). + * @param numQueries Number of queries executed in the transaction. + * @param error Error message. + * @param failIndex Index of the query that failed, or -1 if something else. + * @param queryData An array of each data value passed to SQL_AddQuery(). + * @noreturn + */ +functag public SQLTxnFailure(Handle:db, any:data, numQueries, const String:error[], failIndex, any:queryData[]); + +/** + * Sends a transaction to the database thread. The transaction handle is + * automatically closed. When the transaction completes, the optional + * callback is invoked. + * + * @param db A database handle. + * @param txn A transaction handle. + * @param onSuccess An optional callback to receive a successful transaction. + * @param onError An optional callback to receive an error message. + * @param data An optional value to pass to callbacks. + * @param prio Priority queue to use. + * @noreturn + * @error An invalid handle. + */ +native SQL_ExecuteTransaction( + Handle:db, + Handle:txn, + SQLTxnSuccess:onSuccess=SQLTxnSuccess:-1, + SQLTxnFailure:onError=SQLTxnFailure:-1, + any:data=0, + DBPriority:priority=DBPrio_Normal); diff --git a/addons/sourcemod/scripting/include/donate.inc b/addons/sourcemod/scripting/include/donate.inc new file mode 100644 index 0000000..8911ad1 --- /dev/null +++ b/addons/sourcemod/scripting/include/donate.inc @@ -0,0 +1,24 @@ +#if defined _donate_Included_ + #endinput +#endif +#define _donate_Included_ + +public SharedPlugin:__pl_donate = +{ + name = "donate", + file = "donate.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +native Donate_RegisterHandler(String:name[], Function:callback); +native Donate_RemoveHandler(String:name[]); + +public __pl_donate_SetNTVOptional() +{ + MarkNativeAsOptional("Donate_RegisterHandler"); + MarkNativeAsOptional("Donate_RemoveHandler"); +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/entity.inc b/addons/sourcemod/scripting/include/entity.inc new file mode 100644 index 0000000..d33a3b8 --- /dev/null +++ b/addons/sourcemod/scripting/include/entity.inc @@ -0,0 +1,738 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2011 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _entity_included + #endinput +#endif +#define _entity_included + +/** + * Property types for entities. + */ +enum PropType +{ + Prop_Send = 0, /**< This property is networked. */ + Prop_Data = 1, /**< This property is for save game data fields. */ +}; + +/** + * @section For more information on these, see the HL2SDK (public/edict.h) + */ +#define FL_EDICT_CHANGED (1<<0) /**< Game DLL sets this when the entity state changes + Mutually exclusive with FL_EDICT_PARTIAL_CHANGE. */ +#define FL_EDICT_FREE (1<<1) /**< this edict if free for reuse */ +#define FL_EDICT_FULL (1<<2) /**< this is a full server entity */ +#define FL_EDICT_FULLCHECK (0<<0) /**< call ShouldTransmit() each time, this is a fake flag */ +#define FL_EDICT_ALWAYS (1<<3) /**< always transmit this entity */ +#define FL_EDICT_DONTSEND (1<<4) /**< don't transmit this entity */ +#define FL_EDICT_PVSCHECK (1<<5) /**< always transmit entity, but cull against PVS */ +#define FL_EDICT_PENDING_DORMANT_CHECK (1<<6) +#define FL_EDICT_DIRTY_PVS_INFORMATION (1<<7) +#define FL_FULL_EDICT_CHANGED (1<<8) + +enum PropFieldType +{ + PropField_Unsupported, /**< The type is unsupported. */ + PropField_Integer, /**< Valid for SendProp and Data fields */ + PropField_Float, /**< Valid for SendProp and Data fields */ + PropField_Entity, /**< Valid for Data fields only (SendProp shows as int) */ + PropField_Vector, /**< Valid for SendProp and Data fields */ + PropField_String, /**< Valid for SendProp and Data fields */ + PropField_String_T, /**< Valid for Data fields. Read only. + Note that the size of a string_t is dynamic, and + thus FindDataMapOffs() will return the constant size + of the string_t container (which is 32 bits right now). + */ +}; + +/** + * @endsection + */ + +/** + * Returns the maximum number of entities. + * + * @return Maximum number of entities. + */ +native GetMaxEntities(); + +/** + * Returns the number of entities in the server. + * + * @return Number of entities in the server. + */ +native GetEntityCount(); + +/** + * Returns whether or not an entity is valid. Returns false + * if there is no matching CBaseEntity for this edict index. + * + * @param edict Index of the entity/edict. + * @return True if valid, false otherwise. + */ +native bool:IsValidEntity(edict); + +/** + * Returns whether or not an edict index is valid. + * + * @param edict Index of the edict. + * @return True if valid, false otherwise. + */ +native bool:IsValidEdict(edict); + +/** + * Returns whether or not an entity is a valid networkable edict. + * + * @param edict Index of the edict. + * @return True if networkable, false if invalid or not networkable. + */ +native bool:IsEntNetworkable(edict); + +/** + * Creates a new edict (the basis of a networkable entity) + * + * @return Index of the edict, 0 on failure. + */ +native CreateEdict(); + +/** + * Removes an edict from the world. + * + * @param edict Index of the edict. + * @noreturn + * @error Invalid edict index. + */ +native RemoveEdict(edict); + +/** + * Returns the flags on an edict. These are not the same as entity flags. + * + * @param edict Index of the entity. + * @return Edict flags. + * @error Invalid edict index. + */ +native GetEdictFlags(edict); + +/** + * Sets the flags on an edict. These are not the same as entity flags. + * + * @param edict Index of the entity. + * @param flags Flags to set. + * @noreturn + * @error Invalid edict index. + */ +native SetEdictFlags(edict, flags); + +/** + * Retrieves an edict classname. + * + * @param edict Index of the entity. + * @param clsname Buffer to store the classname. + * @param maxlength Maximum length of the buffer. + * @return True on success, false if there is no classname set. + */ +native bool:GetEdictClassname(edict, String:clsname[], maxlength); + +/** + * Retrieves an entity's networkable serverclass name. + * This is not the same as the classname and is used for networkable state changes. + * + * @param edict Index of the entity. + * @param clsname Buffer to store the serverclass name. + * @param maxlength Maximum lnegth of the buffer. + * @return True on success, false if the edict is not networkable. + * @error Invalid edict index. + */ +native bool:GetEntityNetClass(edict, String:clsname[], maxlength); + +/** + * @section Entity offset functions + * + * Offsets should be specified in byte distance from the CBaseEntity + * structure, not short (double byte) or integer (four byte) multiples. + * It is somewhat common practice to use offsets aligned to their final + * type, and thus make sure you are not falling to this error in SourceMod. + * For example, if your "integer-aligned" offset was 119, your byte-aligned + * offset is 119*4, or 476. + + * Specifying incorrect offsets or the incorrect data type for an offset + * can have fatal consequences. If you are hardcoding offsets, and the + * layout of CBaseEntity does not match, you can easily crash the server. + * + * The reasonable bounds for offsets is greater than or equal to 0 and + * below 32768. Offsets out of these bounds will throw an error. However, + * this does not represent any real range, it is simply a sanity check for + * illegal values. Any range outside of the CBaseEntity structure's private + * size will cause undefined behaviour or even crash. + */ + +/** + * Marks an entity as state changed. This can be useful if you set an offset + * and wish for it to be immediately changed over the network. By default this + * is not done for offset setting functions. + * + * @param edict Index to the edict. + * @param offset Offset to mark as changed. If 0, + * the entire edict is marked as changed. + * @noreturn + * @error Invalid entity or offset out of bounds. + */ +native ChangeEdictState(edict, offset = 0); + +/** + * Peeks into an entity's object data and retrieves the integer value at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param size Number of bytes to read (valid values are 1, 2, or 4). + * @return Value at the given memory location. + * @error Invalid entity or offset out of reasonable bounds. + */ +native GetEntData(entity, offset, size=4); + +/** + * Peeks into an entity's object data and sets the integer value at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param value Value to set. + * @param size Number of bytes to write (valid values are 1, 2, or 4). + * @param changeState If true, change will be sent over the network. + * @return Value at the given memory location. + * @error Invalid entity or offset out of reasonable bounds. + * @noreturn + */ +native SetEntData(entity, offset, any:value, size=4, bool:changeState=false); + +/** + * Peeks into an entity's object data and retrieves the float value at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @return Value at the given memory location. + * @error Invalid entity or offset out of reasonable bounds. + */ +native Float:GetEntDataFloat(entity, offset); + +/** + * Peeks into an entity's object data and sets the float value at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param value Value to set. + * @param changeState If true, change will be sent over the network. + * @return Value at the given memory location. + * @error Invalid entity or offset out of reasonable bounds. + * @noreturn + */ +native SetEntDataFloat(entity, offset, Float:value, bool:changeState=false); + +/** + * This function is deprecated. Use GetEntDataEnt2 instead, for + * reasons explained in the notes. + * + * Note: This function returns 0 on failure, which may be misleading, + * as the number 0 is also used for the world entity index. + * + * Note: This function makes no attempt to validate the returned + * entity, and in fact, it could be garbage or completely unexpected. + * + * @param entity Edict index. + * @param offset Offset to use. + * @return Entity index at the given location, or 0 if none. + * @error Invalid entity or offset out of reasonable bounds. + */ +#pragma deprecated Use GetEntDataEnt2() instead. +native GetEntDataEnt(entity, offset); + +/** + * This function is deprecated. Use SetEntDataEnt2 instead, for + * reasons explained in the notes. + * + * Note: This function uses 0 as an indicator to unset data, but + * 0 is also the world entity index. Thus, a property cannot + * be set to the world entity using this native. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param other Entity index to set, or 0 to clear. + * @param changeState If true, change will be sent over the network. + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +#pragma deprecated Use SetEntDataEnt2() instead. +native SetEntDataEnt(entity, offset, other, bool:changeState=false); + +/** + * Peeks into an entity's object data and retrieves the entity index + * at the given offset. + * + * Note: This will only work on offsets that are stored as "entity + * handles" (which usually looks like m_h* in properties). These + * are not SourceMod Handles, but internal Source structures. + * + * @param entity Edict index. + * @param offset Offset to use. + * @return Entity index at the given location. If there is no entity, + * or the stored entity is invalid, then -1 is returned. + * @error Invalid input entity, or offset out of reasonable bounds. + */ +native GetEntDataEnt2(entity, offset); + +/** + * Peeks into an entity's object data and sets the entity index at the + * given offset. + * + * Note: This will only work on offsets that are stored as "entity + * handles" (which usually looks like m_h* in properties). These + * are not SourceMod Handles, but internal Source structures. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param other Entity index to set, or -1 to clear. + * @param changeState If true, change will be sent over the network. + * @noreturn + * @error Invalid input entity, or offset out of reasonable bounds. + */ +native SetEntDataEnt2(entity, offset, other, bool:changeState=false); + +/** + * Peeks into an entity's object data and retrieves the vector at the + * given offset. + * @note Both a Vector and a QAngle are three floats. This is a + * convenience function and will work with both types. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param vec Vector buffer to store data in. + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +native GetEntDataVector(entity, offset, Float:vec[3]); + +/** + * Peeks into an entity's object data and sets the vector at the given + * offset. + * @note Both a Vector and a QAngle are three floats. This is a + * convenience function and will work with both types. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param vec Vector to set. + * @param changeState If true, change will be sent over the network. + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +native SetEntDataVector(entity, offset, const Float:vec[3], bool:changeState=false); + +/** + * Peeks into an entity's object data and retrieves the string at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param buffer Destination string buffer. + * @param maxlen Maximum length of output string buffer. + * @return Number of non-null bytes written. + * @error Invalid entity or offset out of reasonable bounds. + */ +native GetEntDataString(entity, offset, String:buffer[], maxlen); + +/** + * Peeks into an entity's object data and sets the string at + * the given offset. + * + * @param entity Edict index. + * @param offset Offset to use. + * @param buffer String to set. + * @param maxlen Maximum length of bytes to write. + * @param changeState If true, change will be sent over the network. + * @return Number of non-null bytes written. + * @error Invalid entity or offset out of reasonable bounds. + */ +native SetEntDataString(entity, offset, const String:buffer[], maxlen, bool:changeState=false); + +/** + * @endsection + */ + +/** + * Given a ServerClass name, finds a networkable send property offset. + * This information is cached for future calls. + * + * Note, this function may return offsets that do not work! + * If a property is nested beneath a parent object, the resulting offset + * will be invalid for direct use with data functions. Therefore, you + * should use FindSendPropInfo() instead. An example of such a property is + * CTFPlayer::DT_LocalPlayer.m_nDisguiseClass on Team Fortress. + * + * @param cls Classname. + * @param prop Property name. + * @return An offset, or -1 on failure. + */ +native FindSendPropOffs(const String:cls[], const String:prop[]); + +/** + * Given a ServerClass name, finds a networkable send property offset. + * This information is cached for future calls. + * + * Note: This function will correctly compute nested offsets, unlike + * FindSendPropOffs(). YOU SHOULD NOT use this function to self-compute + * nested offsets. For example, it is okay to add indexes for arrays, + * but not to add DT_LocalPlayer to m_nDisguiseClass. + * + * @param cls Classname. + * @param prop Property name. + * @param type Optional parameter to store the type. + * @param num_bits Optional parameter to store the number of bits the field + * uses, if applicable (otherwise 0 is stored). The number + * of bits varies for integers and floats, and is always 0 + * for strings. + * @param local_offset Optional parameter to store the local offset, as + * FindSendPropOffs() would return. + * @return On success, returns an absolutely computed offset. + * If no offset is available, 0 is returned. + * If the property is not found, -1 is returned. + */ +native FindSendPropInfo(const String:cls[], + const String:prop[], + &PropFieldType:type=PropFieldType:0, + &num_bits=0, + &local_offset=0); + +/** + * Given an entity, finds a datamap property offset. + * This information is cached for future calls. + * + * @param entity Entity index. + * @param prop Property name. + * @param type Optional parameter to store the type. + * @param num_bits Optional parameter to store the number of bits the field + * uses. The bit count will either be 1 (for boolean) or + * divisible by 8 (including 0 if unknown). + * @return An offset, or -1 on failure. + */ +native FindDataMapOffs(entity, + const String:prop[], + &PropFieldType:type=PropFieldType:0, + &num_bits=0); + +/** + * Given an entity, finds a nested datamap property offset. + * This information is cached for future calls. + * + * @param entity Entity index. + * @param prop Property name. + * @param type Optional parameter to store the type. + * @param num_bits Optional parameter to store the number of bits the field + * uses. The bit count will either be 1 (for boolean) or + * divisible by 8 (including 0 if unknown). + * @param local_offset Optional parameter to store the local offset, as + * FindDataMapOffs() would return. + * @return An offset, or -1 on failure. + */ +native FindDataMapInfo(entity, + const String:prop[], + &PropFieldType:type=PropFieldType:0, + &num_bits=0, + &local_offset=0); + +/** + * Wrapper function for finding a send property for a particular entity. + * + * @param ent Entity index. + * @param prop Property name. + * @param actual Defaults to false for backwards compatibility. + * If true, the newer FindSendPropInfo() function + * is used instead. + * @return An offset, or -1 on failure. + */ +stock GetEntSendPropOffs(ent, const String:prop[], bool:actual=false) +{ + decl String:cls[64]; + + if (!GetEntityNetClass(ent, cls, sizeof(cls))) + { + return -1; + } + + if (actual) + { + return FindSendPropInfo(cls, prop); + } + else + { + return FindSendPropOffs(cls, prop); + } +} + +/** + * Retrieves an integer value from an entity's property. + * + * This function is considered safer and more robust over GetEntData, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param size Number of bytes to write (valid values are 1, 2, or 4). + * This value is auto-detected, and the size parameter is + * only used as a fallback in case detection fails. + * @param element Element # (starting from 0) if property is an array. + * @return Value at the given property offset. + * @error Invalid entity or property not found. + */ +native GetEntProp(entity, PropType:type, const String:prop[], size=4, element=0); + +/** + * Sets an integer value in an entity's property. + * + * This function is considered safer and more robust over SetEntData, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param value Value to set. + * @param size Number of bytes to write (valid values are 1, 2, or 4). + * This value is auto-detected, and the size parameter is + * only used as a fallback in case detection fails. + * @param element Element # (starting from 0) if property is an array. + * @error Invalid entity or offset out of reasonable bounds. + * @noreturn + */ +native SetEntProp(entity, PropType:type, const String:prop[], any:value, size=4, element=0); + +/** + * Retrieves a float value from an entity's property. + * + * This function is considered safer and more robust over GetEntDataFloat, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param element Element # (starting from 0) if property is an array. + * @return Value at the given property offset. + * @error Invalid entity or offset out of reasonable bounds. + */ +native Float:GetEntPropFloat(entity, PropType:type, const String:prop[], element=0); + +/** + * Sets a float value in an entity's property. + * + * This function is considered safer and more robust over SetEntDataFloat, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param value Value to set. + * @param element Element # (starting from 0) if property is an array. + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +native SetEntPropFloat(entity, PropType:type, const String:prop[], Float:value, element=0); + +/** + * Retrieves an entity index from an entity's property. + * + * This function is considered safer and more robust over GetEntDataEnt*, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param element Element # (starting from 0) if property is an array. + * @return Entity index at the given property. + * If there is no entity, or the entity is not valid, + * then -1 is returned. + * @error Invalid entity or offset out of reasonable bounds. + */ +native GetEntPropEnt(entity, PropType:type, const String:prop[], element=0); + +/** + * Sets an entity index in an entity's property. + * + * This function is considered safer and more robust over SetEntDataEnt*, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param other Entity index to set, or -1 to unset. + * @param element Element # (starting from 0) if property is an array. + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +native SetEntPropEnt(entity, PropType:type, const String:prop[], other, element=0); + +/** + * Retrieves a vector of floats from an entity, given a named network property. + * + * This function is considered safer and more robust over GetEntDataVector, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param vec Vector buffer to store data in. + * @param element Element # (starting from 0) if property is an array. + * @noreturn + * @error Invalid entity, property not found, or property not + * actually a vector data type. + */ +native GetEntPropVector(entity, PropType:type, const String:prop[], Float:vec[3], element=0); + +/** + * Sets a vector of floats in an entity, given a named network property. + * + * This function is considered safer and more robust over SetEntDataVector, + * because it performs strict offset checking and typing rules. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @param vec Vector to set. + * @param element Element # (starting from 0) if property is an array. + * @noreturn + * @error Invalid entity, property not found, or property not + * actually a vector data type. + */ +native SetEntPropVector(entity, PropType:type, const String:prop[], const Float:vec[3], element=0); + +/** + * Gets a network property as a string. + * + * @param entity Edict index. + * @param type Property type. + * @param prop Property to use. + * @param buffer Destination string buffer. + * @param maxlen Maximum length of output string buffer. + * @param element Element # (starting from 0) if property is an array. + * @return Number of non-null bytes written. + * @error Invalid entity, offset out of reasonable bounds, or property is not a valid string. + */ +native GetEntPropString(entity, PropType:type, const String:prop[], String:buffer[], maxlen, element=0); + +/** + * Sets a network property as a string. + * + * This cannot set property fields of type PropField_String_T (such as "m_target"). + * To set such fields, you should use DispatchKeyValue() from SDKTools. + * + * @param entity Edict index. + * @param type Property type. + * @param prop Property to use. + * @param buffer String to set. + * @return Number of non-null bytes written. + * @error Invalid entity, offset out of reasonable bounds, or property is not a valid string. + */ +native SetEntPropString(entity, PropType:type, const String:prop[], const String:buffer[]); + +/** + * Retrieves the count of values that an entity property's array can store. + * + * @param entity Entity/edict index. + * @param type Property type. + * @param prop Property name. + * @return Size of array (in elements) or 1 if property is not an array. + * @error Invalid entity or property not found. + */ +native GetEntPropArraySize(entity, PropType:type, const String:prop[]); + +/** + * Copies an array of cells from an entity at a given offset. + * + * @param entity Entity index. + * @param offset Offset to use. + * @param array Array to read into. + * @param arraySize Number of values to read. + * @param dataSize Size of each value in bytes (1, 2, or 4). + * @noreturn + * @error Invalid entity or offset out of reasonable bounds. + */ +stock GetEntDataArray(entity, offset, array[], arraySize, dataSize=4) +{ + for (new i=0; i. + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _entity_prop_stocks_included + #endinput +#endif +#define _entity_prop_stocks_included + +enum MoveType +{ + MOVETYPE_NONE = 0, /**< never moves */ + MOVETYPE_ISOMETRIC, /**< For players */ + MOVETYPE_WALK, /**< Player only - moving on the ground */ + MOVETYPE_STEP, /**< gravity, special edge handling -- monsters use this */ + MOVETYPE_FLY, /**< No gravity, but still collides with stuff */ + MOVETYPE_FLYGRAVITY, /**< flies through the air + is affected by gravity */ + MOVETYPE_VPHYSICS, /**< uses VPHYSICS for simulation */ + MOVETYPE_PUSH, /**< no clip to world, push and crush */ + MOVETYPE_NOCLIP, /**< No gravity, no collisions, still do velocity/avelocity */ + MOVETYPE_LADDER, /**< Used by players only when going onto a ladder */ + MOVETYPE_OBSERVER, /**< Observer movement, depends on player's observer mode */ + MOVETYPE_CUSTOM, /**< Allows the entity to describe its own physics */ +}; + +enum RenderMode +{ + RENDER_NORMAL, /**< src */ + RENDER_TRANSCOLOR, /**< c*a+dest*(1-a) */ + RENDER_TRANSTEXTURE, /**< src*a+dest*(1-a) */ + RENDER_GLOW, /**< src*a+dest -- No Z buffer checks -- Fixed size in screen space */ + RENDER_TRANSALPHA, /**< src*srca+dest*(1-srca) */ + RENDER_TRANSADD, /**< src*a+dest */ + RENDER_ENVIRONMENTAL, /**< not drawn, used for environmental effects */ + RENDER_TRANSADDFRAMEBLEND, /**< use a fractional frame value to blend between animation frames */ + RENDER_TRANSALPHAADD, /**< src + dest*(1-a) */ + RENDER_WORLDGLOW, /**< Same as kRenderGlow but not fixed size in screen space */ + RENDER_NONE, /**< Don't render. */ +}; + +enum RenderFx +{ + RENDERFX_NONE = 0, + RENDERFX_PULSE_SLOW, + RENDERFX_PULSE_FAST, + RENDERFX_PULSE_SLOW_WIDE, + RENDERFX_PULSE_FAST_WIDE, + RENDERFX_FADE_SLOW, + RENDERFX_FADE_FAST, + RENDERFX_SOLID_SLOW, + RENDERFX_SOLID_FAST, + RENDERFX_STROBE_SLOW, + RENDERFX_STROBE_FAST, + RENDERFX_STROBE_FASTER, + RENDERFX_FLICKER_SLOW, + RENDERFX_FLICKER_FAST, + RENDERFX_NO_DISSIPATION, + RENDERFX_DISTORT, /**< Distort/scale/translate flicker */ + RENDERFX_HOLOGRAM, /**< kRenderFxDistort + distance fade */ + RENDERFX_EXPLODE, /**< Scale up really big! */ + RENDERFX_GLOWSHELL, /**< Glowing Shell */ + RENDERFX_CLAMP_MIN_SCALE, /**< Keep this sprite from getting very small (SPRITES only!) */ + RENDERFX_ENV_RAIN, /**< for environmental rendermode, make rain */ + RENDERFX_ENV_SNOW, /**< " " " , make snow */ + RENDERFX_SPOTLIGHT, /**< TEST CODE for experimental spotlight */ + RENDERFX_RAGDOLL, /**< HACKHACK: TEST CODE for signalling death of a ragdoll character */ + RENDERFX_PULSE_FAST_WIDER, + RENDERFX_MAX +}; + +// These defines are for client button presses. +#define IN_ATTACK (1 << 0) +#define IN_JUMP (1 << 1) +#define IN_DUCK (1 << 2) +#define IN_FORWARD (1 << 3) +#define IN_BACK (1 << 4) +#define IN_USE (1 << 5) +#define IN_CANCEL (1 << 6) +#define IN_LEFT (1 << 7) +#define IN_RIGHT (1 << 8) +#define IN_MOVELEFT (1 << 9) +#define IN_MOVERIGHT (1 << 10) +#define IN_ATTACK2 (1 << 11) +#define IN_RUN (1 << 12) +#define IN_RELOAD (1 << 13) +#define IN_ALT1 (1 << 14) +#define IN_ALT2 (1 << 15) +#define IN_SCORE (1 << 16) /**< Used by client.dll for when scoreboard is held down */ +#define IN_SPEED (1 << 17) /**< Player is holding the speed key */ +#define IN_WALK (1 << 18) /**< Player holding walk key */ +#define IN_ZOOM (1 << 19) /**< Zoom key for HUD zoom */ +#define IN_WEAPON1 (1 << 20) /**< weapon defines these bits */ +#define IN_WEAPON2 (1 << 21) /**< weapon defines these bits */ +#define IN_BULLRUSH (1 << 22) +#define IN_GRENADE1 (1 << 23) /**< grenade 1 */ +#define IN_GRENADE2 (1 << 24) /**< grenade 2 */ +#define IN_ATTACK3 (1 << 25) + +// Note: these are only for use with GetEntityFlags and SetEntityFlags +// and may not match the game's actual, internal m_fFlags values. +// PLAYER SPECIFIC FLAGS FIRST BECAUSE WE USE ONLY A FEW BITS OF NETWORK PRECISION +#define FL_ONGROUND (1 << 0) /**< At rest / on the ground */ +#define FL_DUCKING (1 << 1) /**< Player flag -- Player is fully crouched */ +#define FL_WATERJUMP (1 << 2) /**< player jumping out of water */ +#define FL_ONTRAIN (1 << 3) /**< Player is _controlling_ a train, so movement commands should be ignored on client during prediction. */ +#define FL_INRAIN (1 << 4) /**< Indicates the entity is standing in rain */ +#define FL_FROZEN (1 << 5) /**< Player is frozen for 3rd person camera */ +#define FL_ATCONTROLS (1 << 6) /**< Player can't move, but keeps key inputs for controlling another entity */ +#define FL_CLIENT (1 << 7) /**< Is a player */ +#define FL_FAKECLIENT (1 << 8) /**< Fake client, simulated server side; don't send network messages to them */ +// NOTE if you move things up, make sure to change this value +#define PLAYER_FLAG_BITS 9 +// NON-PLAYER SPECIFIC (i.e., not used by GameMovement or the client .dll ) -- Can still be applied to players, though +#define FL_INWATER (1 << 9) /**< In water */ +#define FL_FLY (1 << 10) /**< Changes the SV_Movestep() behavior to not need to be on ground */ +#define FL_SWIM (1 << 11) /**< Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) */ +#define FL_CONVEYOR (1 << 12) +#define FL_NPC (1 << 13) +#define FL_GODMODE (1 << 14) +#define FL_NOTARGET (1 << 15) +#define FL_AIMTARGET (1 << 16) /**< set if the crosshair needs to aim onto the entity */ +#define FL_PARTIALGROUND (1 << 17) /**< not all corners are valid */ +#define FL_STATICPROP (1 << 18) /**< Eetsa static prop! */ +#define FL_GRAPHED (1 << 19) /**< worldgraph has this ent listed as something that blocks a connection */ +#define FL_GRENADE (1 << 20) +#define FL_STEPMOVEMENT (1 << 21) /**< Changes the SV_Movestep() behavior to not do any processing */ +#define FL_DONTTOUCH (1 << 22) /**< Doesn't generate touch functions, generates Untouch() for anything it was touching when this flag was set */ +#define FL_BASEVELOCITY (1 << 23) /**< Base velocity has been applied this frame (used to convert base velocity into momentum) */ +#define FL_WORLDBRUSH (1 << 24) /**< Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) */ +#define FL_OBJECT (1 << 25) /**< Terrible name. This is an object that NPCs should see. Missiles, for example. */ +#define FL_KILLME (1 << 26) /**< This entity is marked for death -- will be freed by game DLL */ +#define FL_ONFIRE (1 << 27) /**< You know... */ +#define FL_DISSOLVING (1 << 28) /**< We're dissolving! */ +#define FL_TRANSRAGDOLL (1 << 29) /**< In the process of turning into a client side ragdoll. */ +#define FL_UNBLOCKABLE_BY_PLAYER (1 << 30) /**< pusher that can't be blocked by the player */ +#define FL_FREEZING (1 << 31) /**< We're becoming frozen! */ +#define FL_EP2V_UNKNOWN1 (1 << 31) /**< Unknown */ +// END entity flag #defines + +/** + * Get an entity's flags. + * + * @note The game's actual flags are internally translated by SM + * to match the entity flags defined above as the actual values + * can differ per engine. + * + * @param entity Entity index. + * @return Entity's flags, see entity flag defines above. + * @error Invalid entity index, or lack of mod compliance. + */ +native GetEntityFlags(entity); + +/** + * Sets an entity's flags. + * + * @note The entity flags as defined above are internally translated by SM + * to match the current game's expected value for the flags as + * the actual values can differ per engine. + * + * @param entity Entity index. + * @param flags Entity flags, see entity flag defines above. + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +native SetEntityFlags(entity, flags); + + +/** + * Gets an entity's movetype. + * + * @param entity Entity index. + * @return Movetype, see enum above. + * @error Invalid entity index, or lack of mod compliance. + */ +stock MoveType:GetEntityMoveType(entity) +{ + static bool:gotconfig = false; + static String:datamap[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_MoveType", datamap, sizeof(datamap)); + CloseHandle(gc); + + if (!exists) + { + strcopy(datamap, sizeof(datamap), "m_MoveType"); + } + + gotconfig = true; + } + + return MoveType:GetEntProp(entity, Prop_Data, datamap); +} + +/** + * Sets an entity's movetype. + * + * @param entity Entity index. + * @param mt Movetype, see enum above. + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityMoveType(entity, MoveType:mt) +{ + static bool:gotconfig = false; + static String:datamap[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_MoveType", datamap, sizeof(datamap)); + CloseHandle(gc); + + if (!exists) + { + strcopy(datamap, sizeof(datamap), "m_MoveType"); + } + + gotconfig = true; + } + + SetEntProp(entity, Prop_Data, datamap, mt); +} + +/** + * Gets an entity's render mode. + * + * @param entity Entity index. + * @return RenderMode value. + * @error Invalid entity index, or lack of mod compliance. + */ +stock RenderMode:GetEntityRenderMode(entity) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_nRenderMode", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_nRenderMode"); + } + + gotconfig = true; + } + + return RenderMode:GetEntProp(entity, Prop_Send, prop, 1); +} + +/** + * Sets an entity's render mode. + * + * @param entity Entity index. + * @param mode RenderMode value. + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityRenderMode(entity, RenderMode:mode) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_nRenderMode", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_nRenderMode"); + } + + gotconfig = true; + } + + SetEntProp(entity, Prop_Send, prop, mode, 1); +} + +/** + * Gets an entity's render Fx. + * + * @param entity Entity index. + * @return RenderFx value. + * @error Invalid entity index, or lack of mod compliance. + */ +stock RenderFx:GetEntityRenderFx(entity) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_nRenderFX", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_nRenderFX"); + } + + gotconfig = true; + } + + return RenderFx:GetEntProp(entity, Prop_Send, prop, 1); +} + +/** + * Sets an entity's render Fx. + * + * @param entity Entity index. + * @param fx RenderFx value. + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityRenderFx(entity, RenderFx:fx) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_nRenderFX", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_nRenderFX"); + } + + gotconfig = true; + } + + SetEntProp(entity, Prop_Send, prop, fx, 1); +} + +/** + * Sets an entity's color. + * + * @param entity Entity index + * @param r Amount of red (0-255) + * @param g Amount of green (0-255) + * @param b Amount of blue (0-255) + * @param a Amount of alpha (0-255) + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityRenderColor(entity, r=255, g=255, b=255, a=255) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_clrRender"); + } + + gotconfig = true; + } + + new offset = GetEntSendPropOffs(entity, prop); + + if (offset <= 0) + { + ThrowError("SetEntityRenderColor not supported by this mod"); + } + + SetEntData(entity, offset, r, 1, true); + SetEntData(entity, offset + 1, g, 1, true); + SetEntData(entity, offset + 2, b, 1, true); + SetEntData(entity, offset + 3, a, 1, true); +} + +/** + * Gets an entity's gravity. + * + * @param entity Entity index. + * @return Entity's m_flGravity value. + * @error Invalid entity index, or lack of mod compliance. + */ +stock Float:GetEntityGravity(entity) +{ + static bool:gotconfig = false; + static String:datamap[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_flGravity", datamap, sizeof(datamap)); + CloseHandle(gc); + + if (!exists) + { + strcopy(datamap, sizeof(datamap), "m_flGravity"); + } + + gotconfig = true; + } + + return GetEntPropFloat(entity, Prop_Data, datamap); +} + +/** + * Sets an entity's gravity. + * + * @param entity Entity index. + * @param amount Gravity to set (default = 1.0, half = 0.5, double = 2.0). + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityGravity(entity, Float:amount) +{ + static bool:gotconfig = false; + static String:datamap[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_flGravity", datamap, sizeof(datamap)); + CloseHandle(gc); + + if (!exists) + { + strcopy(datamap, sizeof(datamap), "m_flGravity"); + } + + gotconfig = true; + } + + SetEntPropFloat(entity, Prop_Data, datamap, amount); +} + +/** + * Sets an entity's health + * + * @param entity Entity index. + * @param amount Health amount. + * @noreturn + * @error Invalid entity index, or lack of mod compliance. + */ +stock SetEntityHealth(entity, amount) +{ + static bool:gotconfig = false; + static String:prop[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_iHealth", prop, sizeof(prop)); + CloseHandle(gc); + + if (!exists) + { + strcopy(prop, sizeof(prop), "m_iHealth"); + } + + gotconfig = true; + } + + decl String:cls[64]; + new PropFieldType:type; + new offset; + + if (!GetEntityNetClass(entity, cls, sizeof(cls))) + { + ThrowError("SetEntityHealth not supported by this mod: Could not get serverclass name"); + return; + } + + offset = FindSendPropInfo(cls, prop, type); + + if (offset <= 0) + { + ThrowError("SetEntityHealth not supported by this mod"); + return; + } + + /* Dark Messiah uses a float for the health instead an integer */ + if (type == PropField_Float) + { + SetEntDataFloat(entity, offset, float(amount)); + } + else + { + SetEntProp(entity, Prop_Send, prop, amount); + } +} + +/** + * Get's a users current pressed buttons + * + * @param client Client index + * @return Bitsum of buttons + * @error Invalid client index, client not in game, + * or lack of mod compliance. + */ +stock GetClientButtons(client) +{ + static bool:gotconfig = false; + static String:datamap[32]; + + if (!gotconfig) + { + new Handle:gc = LoadGameConfigFile("core.games"); + new bool:exists = GameConfGetKeyValue(gc, "m_nButtons", datamap, sizeof(datamap)); + CloseHandle(gc); + + if (!exists) + { + strcopy(datamap, sizeof(datamap), "m_nButtons"); + } + + gotconfig = true; + } + + return GetEntProp(client, Prop_Data, datamap); +} diff --git a/addons/sourcemod/scripting/include/events.inc b/addons/sourcemod/scripting/include/events.inc new file mode 100644 index 0000000..d7e8f4c --- /dev/null +++ b/addons/sourcemod/scripting/include/events.inc @@ -0,0 +1,257 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _events_included + #endinput +#endif +#define _events_included + +/** + * Event hook modes determining how hooking should be handled + */ +enum EventHookMode +{ + EventHookMode_Pre, /**< Hook callback fired before event is fired */ + EventHookMode_Post, /**< Hook callback fired after event is fired */ + EventHookMode_PostNoCopy /**< Hook callback fired after event is fired, but event data won't be copied */ +}; + +/** + * Hook function types for events. + */ +funcenum EventHook +{ + /** + * Called when a game event is fired. + * + * @param event Handle to event. This could be INVALID_HANDLE if every plugin hooking + * this event has set the hook mode EventHookMode_PostNoCopy. + * @param name String containing the name of the event. + * @param dontBroadcast True if event was not broadcast to clients, false otherwise. + * @return Ignored for post hooks. Plugin_Handled will block event if hooked as pre. + */ + Action:public(Handle:event, const String:name[], bool:dontBroadcast), + /** + * Called when a game event is fired. + * + * @param event Handle to event. This could be INVALID_HANDLE if every plugin hooking + * this event has set the hook mode EventHookMode_PostNoCopy. + * @param name String containing the name of the event. + * @param dontBroadcast True if event was not broadcast to clients, false otherwise. + * @noreturn + */ + public(Handle:event, const String:name[], bool:dontBroadcast), +}; + +/** + * Creates a hook for when a game event is fired. + * + * @param name Name of event. + * @param callback An EventHook function pointer. + * @param mode Optional EventHookMode determining the type of hook. + * @noreturn + * @error Invalid event name or invalid callback function. + */ +native HookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post); + +/** + * Creates a hook for when a game event is fired. + * + * @param name Name of event. + * @param callback An EventHook function pointer. + * @param mode Optional EventHookMode determining the type of hook. + * @return True if event exists and was hooked successfully, false otherwise. + * @error Invalid callback function. + */ +native bool:HookEventEx(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post); + +/** + * Removes a hook for when a game event is fired. + * + * @param name Name of event. + * @param callback An EventHook function pointer. + * @param mode Optional EventHookMode determining the type of hook. + * @noreturn + * @error Invalid callback function or no active hook for specified event. + */ +native UnhookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post); + +/** + * Creates a game event to be fired later. + * + * The Handle should not be closed via CloseHandle(). It must be closed via + * FireEvent() or CancelCreatedEvent(). + * + * @param name Name of event. + * @param force If set to true, this forces the event to be created even if it's not being hooked. + * Note that this will not force it if the event doesn't exist at all. + * @return Handle to event. INVALID_HANDLE is returned if the event doesn't exist or isn't + being hooked (unless force is true). + */ +native Handle:CreateEvent(const String:name[], bool:force=false); + +/** + * Fires a game event. + * + * This function closes the event Handle after completing. + * + * @param event Handle to the event. + * @param dontBroadcast Optional boolean that determines if event should be broadcast to clients. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native FireEvent(Handle:event, bool:dontBroadcast=false); + +/** + * Cancels a previously created game event that has not been fired. + * + * @param event Handled to the event. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native CancelCreatedEvent(Handle:event); + +/** + * Returns the boolean value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @return The boolean value of the specfied event key. + * @error Invalid or corrupt Handle. + */ +native bool:GetEventBool(Handle:event, const String:key[]); + +/** + * Sets the boolean value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @param value New boolean value. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetEventBool(Handle:event, const String:key[], bool:value); + +/** + * Returns the integer value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @return The integer value of the specfied event key. + * @error Invalid or corrupt Handle. + */ +native GetEventInt(Handle:event, const String:key[]); + +/** + * Sets the integer value of a game event's key. + * + * Integer value refers to anything that can be reduced to an integer. + * The various size specifiers, such as "byte" and "short" are still + * integers, and only refer to how much data will actually be sent + * over the network (if applicable). + * + * @param event Handle to the event. + * @param key Name of event key. + * @param value New integer value. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetEventInt(Handle:event, const String:key[], value); + +/** + * Returns the floating point value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @return The floating point value of the specfied event key. + * @error Invalid or corrupt Handle. + */ +native Float:GetEventFloat(Handle:event, const String:key[]); + +/** + * Sets the floating point value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @param value New floating point value. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetEventFloat(Handle:event, const String:key[], Float:value); + +/** + * Retrieves the string value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @param value Buffer to store the value of the specified event key. + * @param maxlength Maximum length of string buffer. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native GetEventString(Handle:event, const String:key[], String:value[], maxlength); + +/** + * Sets the string value of a game event's key. + * + * @param event Handle to the event. + * @param key Name of event key. + * @param value New string value. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native SetEventString(Handle:event, const String:key[], const String:value[]); + +/** + * Retrieves the name of a game event. + * + * @param event Handle to the event. + * @param name Buffer to store the name of the event. + * @param maxlength Maximum length of string buffer. + * @noreturn + * @error Invalid or corrupt Handle. + */ +native GetEventName(Handle:event, String:name[], maxlength); + +/** + * Sets whether an event's broadcasting will be disabled or not. + * + * This has no effect on events Handles that are not from HookEvent + * or HookEventEx callbacks. + * + * @param event Handle to an event from an event hook. + * @param dontBroadcast True to disable broadcasting, false otherwise. + * @noreturn + * @error Invalid Handle. + */ +native SetEventBroadcast(Handle:event, bool:dontBroadcast); + diff --git a/addons/sourcemod/scripting/include/files.inc b/addons/sourcemod/scripting/include/files.inc new file mode 100644 index 0000000..f353deb --- /dev/null +++ b/addons/sourcemod/scripting/include/files.inc @@ -0,0 +1,411 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _files_included + #endinput +#endif +#define _files_included + +/** + * @global All paths in SourceMod natives are relative to the mod folder + * unless otherwise noted. + * + * Most functions in SourceMod (at least, ones that deal with direct + * file manipulation) will support an alternate path specification. + * + * If the path starts with the string "file://" and the PathType is + * not relative, then the "file://" portion is stripped off, and the + * rest of the path is used without any modification (except for + * correcting slashes). This can be used to override the path + * builder to supply alternate absolute paths. Examples: + * + * file://C:/Temp/file.txt + * file:///tmp/file.txt + */ + +/** + * File inode types. + */ +enum FileType +{ + FileType_Unknown = 0, /* Unknown file type (device/socket) */ + FileType_Directory = 1, /* File is a directory */ + FileType_File = 2, /* File is a file */ +}; + +/** + * File time modes. + */ +enum FileTimeMode +{ + FileTime_LastAccess = 0, /* Last access (does not work on FAT) */ + FileTime_Created = 1, /* Creation (does not work on FAT) */ + FileTime_LastChange = 2, /* Last modification */ +}; + +#define PLATFORM_MAX_PATH 256 /**< Maximum path length. */ + +#define SEEK_SET 0 /**< Seek from start. */ +#define SEEK_CUR 1 /**< Seek from current position. */ +#define SEEK_END 2 /**< Seek from end position. */ + +/** + * Path types. + */ +enum PathType +{ + Path_SM, /**< SourceMod root folder */ +}; + +/** + * Builds a path relative to the SourceMod folder. This should be used instead of + * directly referencing addons/sourcemod, in case users change the name of their + * folder layout. + * + * @param type Type of path to build as the base. + * @param buffer Buffer to store the path. + * @param maxlength Maximum length of buffer. + * @param fmt Format string. + * @param ... Format arguments. + * @return Number of bytes written to buffer (not including null terminator). + */ +native BuildPath(PathType:type, String:buffer[], maxlength, const String:fmt[], any:...); + +/** + * Opens a directory/folder for contents enumeration. + * + * @note Directories are closed with CloseHandle(). + * @note Directories Handles can be cloned. + * @note OpenDirectory() supports the "file://" notation. + * + * @param path Path to open. + * @return A Handle to the directory, INVALID_HANDLE on open error. + */ +native Handle:OpenDirectory(const String:path[]); + +/** + * Reads the current directory entry as a local filename, then moves to the next file. + * + * @note Contents of buffers are undefined when returning false. + * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. + * + * @param dir Handle to a directory. + * @param buffer String buffer to hold directory name. + * @param maxlength Maximum size of string buffer. + * @param type Optional variable to store the file type. + * @return True on success, false if there are no more files to read. + * @error Invalid or corrupt Handle. + */ +native bool:ReadDirEntry(Handle:dir, String:buffer[], maxlength, &FileType:type=FileType_Unknown); + +/** + * Opens a file. + * + * @note Files are closed with CloseHandle(). + * @note File Handles can be cloned. + * @note OpenFile() supports the "file://" notation. + * + * @param file File to open. + * @param mode Open mode. + * @return A Handle to the file, INVALID_HANDLE on open error. + */ +native Handle:OpenFile(const String:file[], const String:mode[]); + +/** + * Deletes a file. + * + * @param path Path of the file to delete. + * @return True on success, false otherwise. + */ +native bool:DeleteFile(const String:path[]); + +/** + * Reads a line from a text file. + * + * @param hndl Handle to the file. + * @param buffer String buffer to hold the line. + * @param maxlength Maximum size of string buffer. + * @return True on success, false otherwise. + */ +native bool:ReadFileLine(Handle:hndl, String:buffer[], maxlength); + +/** + * Reads binary data from a file. + * + * @param hndl Handle to the file. + * @param items Array to store each item read. + * @param num_items Number of items to read into the array. + * @param size Size of each element, in bytes, to be read. + * Valid sizes are 1, 2, or 4. + * @return Number of elements read, or -1 on error. + */ +native ReadFile(Handle:hndl, items[], num_items, size); + +/** + * Reads a UTF8 or ANSI string from a file. + * + * @param hndl Handle to the file. + * @param buffer Buffer to store the string. + * @param max_size Maximum size of the string buffer. + * @param read_count If -1, reads until a null terminator is encountered in + * the file. Otherwise, read_count bytes are read + * into the buffer provided. In this case the buffer + * is not explicitly null terminated, and the buffer + * will contain any null terminators read from the file. + * @return Number of characters written to the buffer, or -1 + * if an error was encountered. + * @error Invalid Handle, or read_count > max_size. + */ +native ReadFileString(Handle:hndl, String:buffer[], max_size, read_count=-1); + +/** + * Writes binary data to a file. + * + * @param hndl Handle to the file. + * @param items Array of items to write. The data is read directly. + * That is, in 1 or 2-byte mode, the lower byte(s) in + * each cell are used directly, rather than performing + * any casts from a 4-byte number to a smaller number. + * @param num_items Number of items in the array. + * @param size Size of each item in the array in bytes. + * Valid sizes are 1, 2, or 4. + * @return True on success, false on error. + * @error Invalid Handle. + */ +native bool:WriteFile(Handle:hndl, const items[], num_items, size); + +/** + * Writes a binary string to a file. + * + * @param hndl Handle to th efile. + * @param buffer String to write. + * @param term True to append NUL terminator, false otherwise. + * @return True on success, false on error. + * @error Invalid Handle. + */ +native bool:WriteFileString(Handle:hndl, const String:buffer[], bool:term); + +/** + * Writes a line of text to a text file. A newline is automatically appended. + * + * @param hndl Handle to the file. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool:WriteFileLine(Handle:hndl, const String:format[], any:...); + +/** + * Reads a single binary cell from a file. + * + * @param hndl Handle to the file. + * @param data Variable to store the data read. + * @param size Size of the data to read in bytes. Valid + * sizes are 1, 2, or 4 bytes. + * @return Number of elements read (max 1), or -1 on error. + * @error Invalid Handle. + */ +stock ReadFileCell(Handle:hndl, &data, size) +{ + new array[1], ret; + + if ((ret = ReadFile(hndl, array, 1, size)) == 1) + { + data = array[0]; + } + + return ret; +} + +/** + * Writes a single binary cell to a file. + * + * @param hndl Handle to the file. + * @param data Cell to write to the file. + * @param size Size of the data to read in bytes. Valid + * sizes are 1, 2, or 4 bytes. If the size + * is less than 4 bytes, the data is truncated + * rather than casted. That is, only the lower + * bits will be read. + * @return True on success, false on error. + * @error Invalid Handle. + */ +stock bool:WriteFileCell(Handle:hndl, data, size) +{ + new array[1]; + + array[0] = data; + + return WriteFile(hndl, array, 1, size); +} + +/** + * Tests if the end of file has been reached. + * + * @param file Handle to the file. + * @return True if end of file has been reached, false otherwise. + * @error Invalid Handle. + */ +native bool:IsEndOfFile(Handle:file); + +/** + * Sets the file position indicator. + * + * @param file Handle to the file. + * @param position Position relative to what is specified in whence. + * @param where SEEK_ constant value of where to see from. + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool:FileSeek(Handle:file, position, where); + +/** + * Get current position in the file. + * + * @param file Handle to the file. + * @return Value for the file position indicator. + * @error Invalid Handle. + */ +native FilePosition(Handle:file); + +/** + * Checks if a file exists. + * + * @param path Path to the file. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the GAME search paths, rather than solely files + * existing directly in the gamedir. + * @return True if the file exists, false otherwise. + */ +native bool:FileExists(const String:path[], bool:use_valve_fs=false); + +/** + * Renames a file. + * + * @param newpath New path to the file. + * @param oldpath Path to the existing file. + * @return True on success, false otherwise. + */ +native bool:RenameFile(const String:newpath[], const String:oldpath[]); + +/** + * Checks if a directory exists. + * + * @param path Path to the directory. + * @return True if the directory exists, false otherwise. + */ +native bool:DirExists(const String:path[]); + +/** + * Get the file size in bytes. + * + * @param path Path to the file. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the GAME search paths, rather than solely files + * existing directly in the gamedir. + * @return File size in bytes, -1 if file not found. + */ +native FileSize(const String:path[], bool:use_valve_fs=false); + +/** + * Flushes a file's buffered output; any buffered output + * is immediately written to the file. + * + * @param file Handle to the file. + * @return True on success, false on failure. + */ +native FlushFile(Handle:file); + +/** + * Removes a directory. + * @note On most Operating Systems you cannot remove a directory which has files inside it. + * + * @param path Path to the directory. + * @return True on success, false otherwise. + */ +native bool:RemoveDir(const String:path[]); + +#define FPERM_U_READ 0x0100 /* User can read. */ +#define FPERM_U_WRITE 0x0080 /* User can write. */ +#define FPERM_U_EXEC 0x0040 /* User can exec. */ +#define FPERM_G_READ 0x0020 /* Group can read. */ +#define FPERM_G_WRITE 0x0010 /* Group can write. */ +#define FPERM_G_EXEC 0x0008 /* Group can exec. */ +#define FPERM_O_READ 0x0004 /* Anyone can read. */ +#define FPERM_O_WRITE 0x0002 /* Anyone can write. */ +#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */ + +/** + * Creates a directory. + * + * @param path Path to create. + * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have + * the execute bit set on Linux. On Windows, the mode is ignored. + */ +native bool:CreateDirectory(const String:path[], mode); + +/** + * Returns a file timestamp as a unix timestamp. + * + * @param file File name. + * @param tmode Time mode. + * @return Time value, or -1 on failure. + */ +native GetFileTime(const String:file[], FileTimeMode:tmode); + +/** + * Same as LogToFile(), except uses an open file Handle. The file must + * be opened in text appending mode. + * + * @param hndl Handle to the file. + * @param message Message format. + * @param ... Message format parameters. + * @noreturn + * @error Invalid Handle. + */ +native LogToOpenFile(Handle:hndl, const String:message[], any:...); + +/** + * Same as LogToFileEx(), except uses an open file Handle. The file must + * be opened in text appending mode. + * + * @param hndl Handle to the file. + * @param message Message format. + * @param ... Message format parameters. + * @noreturn + * @error Invalid Handle. + */ +native LogToOpenFileEx(Handle:hndl, const String:message[], any:...); + diff --git a/addons/sourcemod/scripting/include/float.inc b/addons/sourcemod/scripting/include/float.inc new file mode 100644 index 0000000..1282158 --- /dev/null +++ b/addons/sourcemod/scripting/include/float.inc @@ -0,0 +1,437 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _float_included + #endinput +#endif +#define _float_included + +/** + * Converts an integer into a floating point value. + * + * @param value Integer to convert. + * @return Floating point value. + */ +native Float:float(value); + +/** + * Multiplies two floats together. + * + * @param oper1 First value. + * @param oper2 Second value. + * @return oper1*oper2. + */ +native Float:FloatMul(Float:oper1, Float:oper2); + +/** + * Divides the dividend by the divisor. + * + * @param dividend First value. + * @param divisor Second value. + * @return dividend/divisor. + */ +native Float:FloatDiv(Float:dividend, Float:divisor); + +/** + * Adds two floats together. + * + * @param oper1 First value. + * @param oper2 Second value. + * @return oper1+oper2. + */ +native Float:FloatAdd(Float:oper1, Float:oper2); + +/** + * Subtracts oper2 from oper1. + * + * @param oper1 First value. + * @param oper2 Second value. + * @return oper1-oper2. + */ +native Float:FloatSub(Float:oper1, Float:oper2); + +/** + * Returns the decimal part of a float. + * + * @param value Input value. + * @return Decimal part. + */ +native Float:FloatFraction(Float:value); + +/** + * Rounds a float to the closest integer to zero. + * + * @param value Input value to be rounded. + * @return Rounded value. + */ +native RoundToZero(Float:value); + +/** + * Rounds a float to the next highest integer value. + * + * @param value Input value to be rounded. + * @return Rounded value. + */ +native RoundToCeil(Float:value); + +/** + * Rounds a float to the next lowest integer value. + * + * @param value Input value to be rounded. + * @return Rounded value. + */ +native RoundToFloor(Float:value); + +/** + * Standard IEEE rounding. + * + * @param value Input value to be rounded. + * @return Rounded value. + */ +native RoundToNearest(Float:value); + +/** + * Compares two floats. + * + * @param fOne First value. + * @param fTwo Second value. + * @return Returns 1 if the first argument is greater than the second argument. + * Returns -1 if the first argument is smaller than the second argument. + * Returns 0 if both arguments are equal. + */ +native FloatCompare(Float:fOne, Float:fTwo); + +/** + * Returns the square root of the input value, equivalent to floatpower(value, 0.5). + * + * @param value Input value. + * @return Square root of the value. + */ +native Float:SquareRoot(Float:value); + +/** + * Returns the value raised to the power of the exponent. + * + * @param value Value to be raised. + * @param exponent Value to raise the base. + * @return value^exponent. + */ +native Float:Pow(Float:value, Float:exponent); + +/** + * Returns the value of raising the input by e. + * + * @param value Input value. + * @return exp(value). + */ +native Float:Exponential(Float:value); + +/** + * Returns the logarithm of any base specified. + * + * @param value Input value. + * @param base Logarithm base to use, default is 10. + * @return log(value)/log(base). + */ +native Float:Logarithm(Float:value, Float:base=10.0); + +/** + * Returns the sine of the argument. + * + * @param value Input value in radians. + * @return sin(value). + */ +native Float:Sine(Float:value); + +/** + * Returns the cosine of the argument. + * + * @param value Input value in radians. + * @return cos(value). + */ +native Float:Cosine(Float:value); + +/** + * Returns the tangent of the argument. + * + * @param value Input value in radians. + * @return tan(value). + */ +native Float:Tangent(Float:value); + +/** + * Returns an absolute value. + * + * @param value Input value. + * @return Absolute value of the input. + */ +native Float:FloatAbs(Float:value); + +/** + * Returns the arctangent of the input value. + * + * @param angle Input value. + * @return atan(value) in radians. + */ +native Float:ArcTangent(Float:angle); + +/** + * Returns the arccosine of the input value. + * + * @param angle Input value. + * @return acos(value) in radians. + */ +native Float:ArcCosine(Float:angle); + +/** + * Returns the arcsine of the input value. + * + * @param angle Input value. + * @return asin(value) in radians. + */ +native Float:ArcSine(Float:angle); + +/** + * Returns the arctangent2 of the input values. + * + * @param x Horizontal value. + * @param y Vertical value. + * @return atan2(value) in radians. + */ +native Float:ArcTangent2(Float:x, Float:y); + +/** + * Rounds a floating point number using the "round to nearest" algorithm. + * + * @param value Floating point value to round. + * @return The value rounded to the nearest integer. + */ +stock RoundFloat(Float:value) +{ + return RoundToNearest(value); +} + +/** + * User defined operators. + * + */ +#pragma rational Float + +native bool:__FLOAT_GT__(Float:a, Float:b); +native bool:__FLOAT_GE__(Float:a, Float:b); +native bool:__FLOAT_LT__(Float:a, Float:b); +native bool:__FLOAT_LE__(Float:a, Float:b); +native bool:__FLOAT_EQ__(Float:a, Float:b); +native bool:__FLOAT_NE__(Float:a, Float:b); +native bool:__FLOAT_NOT__(Float:a); + +native Float:operator*(Float:oper1, Float:oper2) = FloatMul; +native Float:operator/(Float:oper1, Float:oper2) = FloatDiv; +native Float:operator+(Float:oper1, Float:oper2) = FloatAdd; +native Float:operator-(Float:oper1, Float:oper2) = FloatSub; +native bool:operator!(Float:oper1) = __FLOAT_NOT__; +native bool:operator>(Float:oper1, Float:oper2) = __FLOAT_GT__; +native bool:operator>=(Float:oper1, Float:oper2) = __FLOAT_GE__; +native bool:operator<(Float:oper1, Float:oper2) = __FLOAT_LT__; +native bool:operator<=(Float:oper1, Float:oper2) = __FLOAT_LE__; +native bool:operator!=(Float:oper1, Float:oper2) = __FLOAT_NE__; +native bool:operator==(Float:oper1, Float:oper2) = __FLOAT_EQ__; + +stock Float:operator++(Float:oper) +{ + return oper+1.0; +} + +stock Float:operator--(Float:oper) +{ + return oper-1.0; +} + +stock Float:operator-(Float:oper) +{ + return oper^Float:cellmin; /* IEEE values are sign/magnitude */ +} + +stock Float:operator*(Float:oper1, oper2) +{ + return FloatMul(oper1, float(oper2)); /* "*" is commutative */ +} + +stock Float:operator/(Float:oper1, oper2) +{ + return FloatDiv(oper1, float(oper2)); +} + +stock Float:operator/(oper1, Float:oper2) +{ + return FloatDiv(float(oper1), oper2); +} + +stock Float:operator+(Float:oper1, oper2) +{ + return FloatAdd(oper1, float(oper2)); /* "+" is commutative */ +} + +stock Float:operator-(Float:oper1, oper2) +{ + return FloatSub(oper1, float(oper2)); +} + +stock Float:operator-(oper1, Float:oper2) +{ + return FloatSub(float(oper1), oper2); +} + +stock bool:operator==(Float:oper1, oper2) +{ + return __FLOAT_EQ__(oper1, float(oper2)); +} + +stock bool:operator!=(Float:oper1, oper2) +{ + return __FLOAT_NE__(oper1, float(oper2)); +} + +stock bool:operator>(Float:oper1, oper2) +{ + return __FLOAT_GT__(oper1, float(oper2)); +} + +stock bool:operator>(oper1, Float:oper2) +{ + return __FLOAT_GT__(float(oper1), oper2); +} + +stock bool:operator>=(Float:oper1, oper2) +{ + return __FLOAT_GE__(oper1, float(oper2)); +} + +stock bool:operator>=(oper1, Float:oper2) +{ + return __FLOAT_GE__(float(oper1), oper2); +} + +stock bool:operator<(Float:oper1, oper2) +{ + return __FLOAT_LT__(oper1, float(oper2)); +} + +stock bool:operator<(oper1, Float:oper2) +{ + return __FLOAT_LT__(float(oper1), oper2); +} + +stock bool:operator<=(Float:oper1, oper2) +{ + return __FLOAT_LE__(oper1, float(oper2)); +} + +stock bool:operator<=(oper1, Float:oper2) +{ + return __FLOAT_LE__(float(oper1), oper2); +} + +/** + * Forbidden operators. + * + */ +forward operator%(Float:oper1, Float:oper2); +forward operator%(Float:oper1, oper2); +forward operator%(oper1, Float:oper2); + +#define FLOAT_PI 3.1415926535897932384626433832795 + +/** + * Converts degrees to radians. + * + * @param angle Degrees. + * @return Radians. + */ +stock Float:DegToRad(Float:angle) +{ + return (angle*FLOAT_PI)/180; +} + +/** + * Converts degrees to radians. + * + * @param angle Radians. + * @return Degrees. + */ +stock Float:RadToDeg(Float:angle) +{ + return (angle*180)/FLOAT_PI; +} + +/** + * Returns a random integer in the range [0, 2^31-1]. + * + * Note: Uniform random number streams are seeded automatically per-plugin. + * + * @return Random integer. + */ +native GetURandomInt(); + +/** + * Returns a uniform random float in the range [0, 1). + * + * Note: Uniform random number streams are seeded automatically per-plugin. + * + * @return Uniform random floating-point number. + */ +native Float:GetURandomFloat(); + +/** + * Seeds a plugin's uniform random number stream. This is done automatically, + * so normally it is totally unnecessary to call this. + * + * @param seeds Array of numbers to use as seeding data. + * @param numSeeds Number of seeds in the seeds array. + * @noreturn + */ +native SetURandomSeed(const seeds[], numSeeds); + +/** + * Seeds a plugin's uniform random number stream. This is done automatically, + * so normally it is totally unnecessary to call this. + * + * @param seed Single seed value. + * @noreturn + */ +stock SetURandomSeedSimple(seed) +{ + new seeds[1]; + seeds[0] = seed; + SetURandomSeed(seeds, 1); +} + diff --git a/addons/sourcemod/scripting/include/functions.inc b/addons/sourcemod/scripting/include/functions.inc new file mode 100644 index 0000000..105f1d2 --- /dev/null +++ b/addons/sourcemod/scripting/include/functions.inc @@ -0,0 +1,511 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _functions_included + #endinput +#endif +#define _functions_included + +#define SP_PARAMFLAG_BYREF (1<<0) /**< Internal use only. */ + +/** + * Describes the various ways to pass parameters to functions or forwards. + */ +enum ParamType +{ + Param_Any = 0, /**< Any data type can be pushed */ + Param_Cell = (1<<1), /**< Only basic cells can be pushed */ + Param_Float = (2<<1), /**< Only floats can be pushed */ + Param_String = (3<<1)|SP_PARAMFLAG_BYREF, /**< Only strings can be pushed */ + Param_Array = (4<<1)|SP_PARAMFLAG_BYREF, /**< Only arrays can be pushed */ + Param_VarArgs = (5<<1), /**< Same as "..." in plugins, anything can be pushed, but it will always be byref */ + Param_CellByRef = (1<<1)|SP_PARAMFLAG_BYREF, /**< Only a cell by reference can be pushed */ + Param_FloatByRef = (2<<1)|SP_PARAMFLAG_BYREF /**< Only a float by reference can be pushed */ +}; + +/** + * Defines how a forward iterates through plugin functions. + */ +enum ExecType +{ + ET_Ignore = 0, /**< Ignore all return values, return 0 */ + ET_Single = 1, /**< Only return the last exec, ignore all others */ + ET_Event = 2, /**< Acts as an event with the Actions defined in core.inc, no mid-Stops allowed, returns highest */ + ET_Hook = 3 /**< Acts as a hook with the Actions defined in core.inc, mid-Stops allowed, returns highest */ +}; + +/** + * @section Flags that are used with Call_PushArrayEx() and Call_PushStringEx() + */ + +#define SM_PARAM_COPYBACK (1<<0) /**< Copy an array/reference back after call */ + +#define SM_PARAM_STRING_UTF8 (1<<0) /**< String should be UTF-8 handled */ +#define SM_PARAM_STRING_COPY (1<<1) /**< String should be copied into the plugin */ +#define SM_PARAM_STRING_BINARY (1<<2) /**< Treat the string as a binary string */ + +/** + * @endsection + */ + +/** + * @section Error codes + */ +#define SP_ERROR_NONE 0 /**< No error occurred */ +#define SP_ERROR_FILE_FORMAT 1 /**< File format unrecognized */ +#define SP_ERROR_DECOMPRESSOR 2 /**< A decompressor was not found */ +#define SP_ERROR_HEAPLOW 3 /**< Not enough space left on the heap */ +#define SP_ERROR_PARAM 4 /**< Invalid parameter or parameter type */ +#define SP_ERROR_INVALID_ADDRESS 5 /**< A memory address was not valid */ +#define SP_ERROR_NOT_FOUND 6 /**< The object in question was not found */ +#define SP_ERROR_INDEX 7 /**< Invalid index parameter */ +#define SP_ERROR_STACKLOW 8 /**< Nnot enough space left on the stack */ +#define SP_ERROR_NOTDEBUGGING 9 /**< Debug mode was not on or debug section not found */ +#define SP_ERROR_INVALID_INSTRUCTION 10 /**< Invalid instruction was encountered */ +#define SP_ERROR_MEMACCESS 11 /**< Invalid memory access */ +#define SP_ERROR_STACKMIN 12 /**< Stack went beyond its minimum value */ +#define SP_ERROR_HEAPMIN 13 /**< Heap went beyond its minimum value */ +#define SP_ERROR_DIVIDE_BY_ZERO 14 /**< Division by zero */ +#define SP_ERROR_ARRAY_BOUNDS 15 /**< Array index is out of bounds */ +#define SP_ERROR_INSTRUCTION_PARAM 16 /**< Instruction had an invalid parameter */ +#define SP_ERROR_STACKLEAK 17 /**< A native leaked an item on the stack */ +#define SP_ERROR_HEAPLEAK 18 /**< A native leaked an item on the heap */ +#define SP_ERROR_ARRAY_TOO_BIG 19 /**< A dynamic array is too big */ +#define SP_ERROR_TRACKER_BOUNDS 20 /**< Tracker stack is out of bounds */ +#define SP_ERROR_INVALID_NATIVE 21 /**< Native was pending or invalid */ +#define SP_ERROR_PARAMS_MAX 22 /**< Maximum number of parameters reached */ +#define SP_ERROR_NATIVE 23 /**< Error originates from a native */ +#define SP_ERROR_NOT_RUNNABLE 24 /**< Function or plugin is not runnable */ +#define SP_ERROR_ABORTED 25 /**< Function call was aborted */ + +/** + * @endsection + */ + +/** + * Gets a function id from a function name. + * + * @param plugin Handle of the plugin that contains the function. + Pass INVALID_HANDLE to search in the calling plugin. + * @param name Name of the function. + * @return Function id or INVALID_FUNCTION if not found. + * @error Invalid or corrupt plugin handle. + */ +native Function:GetFunctionByName(Handle:plugin, const String:name[]); + +/** + * Creates a global forward. + * + * @note The name used to create the forward is used as its public function in all target plugins. + * @note This is ideal for global, static forwards that are never changed. + * @note Global forwards cannot be cloned. + * @note Use CloseHandle() to destroy these. + * + * @param name Name of public function to use in forward. + * @param type Execution type to be used. + * @param ... Variable number of parameter types (up to 32). + * @return Handle to new global forward. + * @error More than 32 paramater types passed. + */ +native Handle:CreateGlobalForward(const String:name[], ExecType:type, ParamType:...); + +/** + * Creates a private forward. + * + * @note No functions are automatically added. Use AddToForward() to do this. + * @note Private forwards can be cloned. + * @note Use CloseHandle() to destroy these. + * + * @param type Execution type to be used. + * @param ... Variable number of parameter types (up to 32). + * @return Handle to new private forward. + * @error More than 32 paramater types passed. + */ +native Handle:CreateForward(ExecType:type, ParamType:...); + +/** + * Returns the number of functions in a global or private forward's call list. + * + * @param fwd Handle to global or private forward. + * @return Number of functions in forward. + * @error Invalid or corrupt forward handle. + */ +native GetForwardFunctionCount(Handle:fwd); + +/** + * Adds a function to a private forward's call list. + * + * @note Cannot be used during an incompleted call. + * + * @param fwd Handle to private forward. + * @param plugin Handle of the plugin that contains the function. + * Pass INVALID_HANDLE to specify the calling plugin. + * @param func Function to add to forward. + * @return True on success, false otherwise. + * @error Invalid or corrupt private forward handle, invalid or corrupt plugin handle, or invalid function. + */ +native bool:AddToForward(Handle:fwd, Handle:plugin, Function:func); + +/** + * Removes a function from a private forward's call list. + * + * @note Only removes one instance. + * @note Functions will be removed automatically if their parent plugin is unloaded. + * + * @param fwd Handle to private forward. + * @param plugin Handle of the plugin that contains the function. + * Pass INVALID_HANDLE to specify the calling plugin. + * @param func Function to remove from forward. + * @return True on success, false otherwise. + * @error Invalid or corrupt private forward handle, invalid or corrupt plugin handle, or invalid function. + */ +native bool:RemoveFromForward(Handle:fwd, Handle:plugin, Function:func); + +/** + * Removes all instances of a plugin from a private forward's call list. + * + * @note Functions will be removed automatically if their parent plugin is unloaded. + * + * @param fwd Handle to private forward. + * @param plugin Handle of the plugin to remove instances of. + * Pass INVALID_HANDLE to specify the calling plugin. + * @return Number of functions removed from forward. + * @error Invalid or corrupt private forward handle or invalid or corrupt plugin handle. + */ +native RemoveAllFromForward(Handle:fwd, Handle:plugin); + +/** + * Starts a call to functions in a forward's call list. + * + * @note Cannot be used during an incompleted call. + * + * @param fwd Handle to global or private forward. + * @noreturn + * @error Invalid or corrupt forward handle or called before another call has completed. + */ +native Call_StartForward(Handle:fwd); + +/** + * Starts a call to a function. + * + * @note Cannot be used during an incompleted call. + * + * @param plugin Handle of the plugin that contains the function. + * Pass INVALID_HANDLE to specify the calling plugin. + * @param func Function to call. + * @noreturn + * @error Invalid or corrupt plugin handle, invalid function, or called before another call has completed. + */ +native Call_StartFunction(Handle:plugin, Function:func); + +/** + * Pushes a cell onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value Cell value to push. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushCell(any:value); + +/** + * Pushes a cell by reference onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value Cell reference to push. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushCellRef(&any:value); + +/** + * Pushes a float onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value Floating point value to push. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushFloat(Float:value); + +/** + * Pushes a float by reference onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value Floating point reference to push. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushFloatRef(&Float:value); + +/** + * Pushes an array onto the current call. + * + * @note Changes to array are not copied back to caller. Use PushArrayEx() to do this. + * @note Cannot be used before a call has been started. + * + * @param value Array to push. + * @param size Size of array. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushArray(const any:value[], size); + +/** + * Pushes an array onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value Array to push. + * @param size Size of array. + * @param cpflags Whether or not changes should be copied back to the input array. + * See SP_PARAM_* constants for details. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushArrayEx(any:value[], size, cpflags); + +/** + * Pushes a string onto the current call. + * + * @note Changes to string are not copied back to caller. Use PushStringEx() to do this. + * @note Cannot be used before a call has been started. + * + * @param value String to push. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushString(const String:value[]); + +/** + * Pushes a string onto the current call. + * + * @note Cannot be used before a call has been started. + * + * @param value String to push. + * @param length Length of string buffer. + * @param szflags Flags determining how string should be handled. + * See SP_PARAM_STRING_* constants for details. + * The default (0) is to push ASCII. + * @param cpflags Whether or not changes should be copied back to the input array. + * See SP_PARAM_* constants for details. + * @noreturn + * @error Called before a call has been started. + */ +native Call_PushStringEx(String:value[], length, szflags, cpflags); + +/** + * Completes a call to a function or forward's call list. + * + * @note Cannot be used before a call has been started. + * + * @param result Return value of function or forward's call list. + * @return SP_ERROR_NONE on success, any other integer on failure. + * @error Called before a call has been started. + */ +native Call_Finish(&any:result=0); + +/** + * Cancels a call to a function or forward's call list. + * + * @note Cannot be used before a call has been started. + * + * @noreturn + * @error Called before a call has been started. + */ +native Call_Cancel(); + +/** + * Defines a native function. + * + * It is not necessary to validate the parameter count + * + * @param plugin Handle of the calling plugin. + * @param numParams Number of parameters passed to the native. + * @return Value for the native call to return. + */ +functag public NativeCall(Handle:plugin, numParams); + +/** + * Creates a dynamic native. This should only be called in AskPluginLoad(), or + * else you risk not having your native shared with other plugins. + * + * @param name Name of the dynamic native; must be unique amongst + * all other registered dynamic natives. + * @param func Function to use as the dynamic native. + * @noreturn + */ +native CreateNative(const String:name[], NativeCall:func); + +/** + * Throws an error in the calling plugin of a native, instead of your own plugin. + * + * @param error Error code to use. + * @param fmt Error message format. + * @param ... Format arguments. + */ +native ThrowNativeError(error, const String:fmt[], any:...); + +/** + * Retrieves the string length from a native parameter string. This is useful + * fetching the entire string using dynamic arrays. + * @note If this function succeeds, Get/SetNativeString will also succeed. + * + * @param param Parameter number, starting from 1. + * @param length Stores the length of the string. + * @return SP_ERROR_NONE on success, any other integer on failure. + * @error Invalid parameter number or calling from a non-native function. + */ +native GetNativeStringLength(param, &length); + +/** + * Retrieves a string from a native parameter. + * @note Output conditions are undefined on failure. + * + * @param param Parameter number, starting from 1. + * @param buffer Buffer to store the string in. + * @param maxlength Maximum length of the buffer. + * @param bytes Optionally store the number of bytes written. + * @return SP_ERROR_NONE on success, any other integer on failure. + * @error Invalid parameter number or calling from a non-native function. + */ +native GetNativeString(param, String:buffer[], maxlength, &bytes=0); + +/** + * Sets a string in a native parameter. + * @note Output conditions are undefined on failure. + * + * @param param Parameter number, starting from 1. + * @param source Source string to use. + * @param maxlength Maximum number of bytes to write. + * @param utf8 If false, string will not be written + * with UTF8 safety. + * @param bytes Optionally store the number of bytes written. + * @return SP_ERROR_NONE on success, any other integer on failure. + * @error Invalid parameter number or calling from a non-native function. + */ +native SetNativeString(param, const String:source[], maxlength, bool:utf8=true, &bytes=0); + +/** + * Gets a cell from a native parameter. + * + * @param param Parameter number, starting from 1. + * @return Cell value at the parameter number. + * @error Invalid parameter number or calling from a non-native function. + */ +native any:GetNativeCell(param); + +/** + * Gets a cell from a native parameter, by reference. + * + * @param param Parameter number, starting from 1. + * @return Cell value at the parameter number. + * @error Invalid parameter number or calling from a non-native function. + */ +native any:GetNativeCellRef(param); + +/** + * Sets a cell from a native parameter, by reference. + * + * @param param Parameter number, starting from 1. + * @param value Cell value at the parameter number to set by reference. + * @noreturn + * @error Invalid parameter number or calling from a non-native function. + */ +native SetNativeCellRef(param, any:value); + +/** + * Gets an array from a native parameter (always by reference). + * + * @param param Parameter number, starting from 1. + * @param local Local array to copy into. + * @param size Maximum size of local array. + * @return SP_ERROR_NONE on success, anything else on failure. + * @error Invalid parameter number or calling from a non-native function. + */ +native GetNativeArray(param, any:local[], size); + +/** + * Copies a local array into a native parameter array (always by reference). + * + * @param param Parameter number, starting from 1. + * @param local Local array to copy from. + * @param size Size of the local array to copy. + * @return SP_ERROR_NONE on success, anything else on failure. + * @error Invalid parameter number or calling from a non-native function. + */ +native SetNativeArray(param, const any:local[], size); + +/** + * Formats a string using parameters from a native. + * + * @note All parameter indexes start at 1. + * @note If the input and output buffers overlap, the contents + * of the output buffer at the end is undefined. + * + * @param out_param Output parameter number to write to. If 0, out_string is used. + * @param fmt_param Format parameter number. If 0, fmt_string is used. + * @param vararg_param First variable parameter number. + * @param out_len Output string buffer maximum length (always required). + * @param written Optionally stores the number of bytes written. + * @param out_string Output string buffer to use if out_param is not used. + * @param fmt_string Format string to use if fmt_param is not used. + * @return SP_ERROR_NONE on success, anything else on failure. + */ +native FormatNativeString(out_param, + fmt_param, + vararg_param, + out_len, + &written=0, + String:out_string[]="", + const String:fmt_string[]=""); + +/** + * Defines a RequestFrame Callback. + * + * @param data Data passed to the RequestFrame native. + * @noreturn + */ +functag public RequestFrameCallback(any:data); + +/** + * Creates a single use Next Frame hook. + * + * @param Function Function to call on the next frame. + * @param data Value to be passed on the invocation of the Function. + * @noreturn + */ +native RequestFrame(RequestFrameCallback:Function, any:data=0); diff --git a/addons/sourcemod/scripting/include/geoip.inc b/addons/sourcemod/scripting/include/geoip.inc new file mode 100644 index 0000000..3df697e --- /dev/null +++ b/addons/sourcemod/scripting/include/geoip.inc @@ -0,0 +1,102 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _geoip_included + #endinput +#endif +#define _geoip_included + +#include + +/** + * @section IP addresses can contain ports, the ports will be stripped out. + */ + +/** + * Gets the two character country code from an IP address. (US, CA, etc) + * + * @param ip Ip to determine the country code. + * @param ccode Destination string buffer to store the code. + * @return True on success, false if no country found. + */ +native bool:GeoipCode2(const String:ip[], String:ccode[3]); + +/** + * Gets the three character country code from an IP address. (USA, CAN, etc) + * + * @param ip Ip to determine the country code. + * @param ccode Destination string buffer to store the code. + * @return True on success, false if no country found. + */ +native bool:GeoipCode3(const String:ip[], String:ccode[4]); + +/** + * Gets the full country name. (max length of output string is 45) + * + * @param ip Ip to determine the country code. + * @param name Destination string buffer to store the country name. + * @param maxlength Maximum length of output string buffer. + * @return True on success, false if no country found. + */ +native bool:GeoipCountry(const String:ip[], String:name[], maxlength); + +/** + * @endsection + */ + +/** + * Do not edit below this line! + */ +public Extension:__ext_geoip = +{ + name = "GeoIP", + file = "geoip.ext", +#if defined AUTOLOAD_EXTENSIONS + autoload = 1, +#else + autoload = 0, +#endif +#if defined REQUIRE_EXTENSIONS + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_EXTENSIONS +public __ext_geoip_SetNTVOptional() +{ + MarkNativeAsOptional("GeoipCode2"); + MarkNativeAsOptional("GeoipCode3"); + MarkNativeAsOptional("GeoipCountry"); +} +#endif diff --git a/addons/sourcemod/scripting/include/gifts.inc b/addons/sourcemod/scripting/include/gifts.inc new file mode 100644 index 0000000..253582a --- /dev/null +++ b/addons/sourcemod/scripting/include/gifts.inc @@ -0,0 +1,47 @@ +#if defined _gifts_included + #endinput +#endif +#define _gifts_included + +public SharedPlugin:__pl_gifts = +{ + name = "[ANY] Gifts", + file = "gifts.smx", +#if defined REQUIRE_PLUGIN + required = 1 +#else + required = 0 +#endif +}; + +#if !defined REQUIRE_PLUGIN +public __pl_gifts_SetNTVOptional() +{ + MarkNativeAsOptional("Gifts_RegisterPlugin"); + MarkNativeAsOptional("Gifts_RemovePlugin"); + MarkNativeAsOptional("Gifts_SetClientCondition"); + MarkNativeAsOptional("Gifts_GetClientCondition"); + MarkNativeAsOptional("Gifts_SpawnGift"); +} +#endif + +enum GiftConditions +{ + Condition_None = 0, + Condition_InCondition, + Condition_InConditionCanPickUp +} + +/** + * Registers a listener with the gifts plugin. + * + * @param callback The callback function + * @return True if plugin was successfully registered. + */ +native Gifts_RegisterPlugin(Function:callback); +native Gifts_RemovePlugin(); +native Gifts_SetClientCondition(client, GiftConditions:clientState); +native Gifts_GetClientCondition(client); +native Gifts_SpawnGift(Function:callback, const String:model[], Float:lifetime, Float:position[3], data, owner=0); + +forward Gifts_OnGiftSpawned(entity); \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/halflife.inc b/addons/sourcemod/scripting/include/halflife.inc new file mode 100644 index 0000000..c734e90 --- /dev/null +++ b/addons/sourcemod/scripting/include/halflife.inc @@ -0,0 +1,625 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _halflife_included + #endinput +#endif +#define _halflife_included + +#define SOURCE_SDK_UNKNOWN 0 /**< Could not determine the engine version */ +#define SOURCE_SDK_ORIGINAL 10 /**< Original Source engine (still used by "The Ship") */ +#define SOURCE_SDK_DARKMESSIAH 15 /**< Modified version of original engine used by Dark Messiah (no SDK) */ +#define SOURCE_SDK_EPISODE1 20 /**< SDK+Engine released after Episode 1 */ +#define SOURCE_SDK_EPISODE2 30 /**< SDK+Engine released after Episode 2/Orange Box */ +#define SOURCE_SDK_BLOODYGOODTIME 32 /**< Modified version of ep2 engine used by Bloody Good Time (no SDK) */ +#define SOURCE_SDK_EYE 33 /**< Modified version of ep2 engine used by E.Y.E Divine Cybermancy (no SDK) */ +#define SOURCE_SDK_CSS 34 /**< Sometime-older version of Source 2009 SDK+Engine, used for Counter-Strike: Source */ +#define SOURCE_SDK_EPISODE2VALVE 35 /**< SDK+Engine released after Episode 2/Orange Box, "Source 2009" or "Source MP" */ +#define SOURCE_SDK_LEFT4DEAD 40 /**< Engine released after Left 4 Dead (no SDK yet) */ +#define SOURCE_SDK_LEFT4DEAD2 50 /**< Engine released after Left 4 Dead 2 (no SDK yet) */ +#define SOURCE_SDK_ALIENSWARM 60 /**< SDK+Engine released after Alien Swarm */ +#define SOURCE_SDK_CSGO 80 /**< Engine released after CS:GO (no SDK yet) */ +#define SOURCE_SDK_DOTA 90 /**< Engine released after Dota 2 (no SDK) */ + +#define MOTDPANEL_TYPE_TEXT 0 /**< Treat msg as plain text */ +#define MOTDPANEL_TYPE_INDEX 1 /**< Msg is auto determined by the engine */ +#define MOTDPANEL_TYPE_URL 2 /**< Treat msg as an URL link */ +#define MOTDPANEL_TYPE_FILE 3 /**< Treat msg as a filename to be openned */ + +enum DialogType +{ + DialogType_Msg = 0, /**< just an on screen message */ + DialogType_Menu, /**< an options menu */ + DialogType_Text, /**< a richtext dialog */ + DialogType_Entry, /**< an entry box */ + DialogType_AskConnect /**< ask the client to connect to a specified IP */ +}; + +enum EngineVersion +{ + Engine_Unknown, /**< Could not determine the engine version */ + Engine_Original, /**< Original Source Engine (used by The Ship) */ + Engine_SourceSDK2006, /**< Episode 1 Source Engine (second major SDK) */ + Engine_SourceSDK2007, /**< Orange Box Source Engine (third major SDK) */ + Engine_Left4Dead, /**< Left 4 Dead */ + Engine_DarkMessiah, /**< Dark Messiah Multiplayer (based on original engine) */ + Engine_Left4Dead2 = 7, /**< Left 4 Dead 2 */ + Engine_AlienSwarm, /**< Alien Swarm (and Alien Swarm SDK) */ + Engine_BloodyGoodTime, /**< Bloody Good Time */ + Engine_EYE, /**< E.Y.E Divine Cybermancy */ + Engine_Portal2, /**< Portal 2 */ + Engine_CSGO, /**< Counter-Strike: Global Offensive */ + Engine_CSS, /**< Counter-Strike: Source */ + Engine_DOTA, /**< Dota 2 */ + Engine_HL2DM, /**< Half-Life 2 Deathmatch */ + Engine_DODS, /**< Day of Defeat: Source */ + Engine_TF2, /**< Team Fortress 2 */ + Engine_NuclearDawn, /**< Nuclear Dawn */ + Engine_SDK2013, /**< Source SDK 2013 */ + Engine_Blade, /**< Blade Symphony */ + Engine_Insurgency, /**< Insurgency (2013 Retail version)*/ + Engine_Contagion, /**< Contagion */ +}; + +#define INVALID_ENT_REFERENCE 0xFFFFFFFF + +/** + * Logs a generic message to the HL2 logs. + * + * @param format String format. + * @param ... Format arguments. + * @noreturn + */ +native LogToGame(const String:format[], any:...); + +/** + * Sets the seed value for the global Half-Life 2 Random Stream. + * + * @param seed Seed value. + * @noreturn + */ +native SetRandomSeed(seed); + +/** + * Returns a random floating point number from the Half-Life 2 Random Stream. + * + * @param fMin Minimum random bound. + * @param fMax Maximum random bound. + * @return A random number between (inclusive) fMin and fMax. + */ +native Float:GetRandomFloat(Float:fMin=0.0, Float:fMax=1.0); + +/** + * Returns a random number from the Half-Life 2 Random Stream. + * + * @param nmin Minimum random bound. + * @param nmax Maximum random bound. + * @return A random number between (inclusive) nmin and nmax. + */ +native GetRandomInt(nmin, nmax); + +/** + * Returns whether a map is valid or not. + * + * @param map Map name, excluding .bsp extension. + * @return True if valid, false otherwise. + */ +native bool:IsMapValid(const String:map[]); + +/** + * Returns whether the server is dedicated. + * + * @return True if dedicated, false otherwise. + */ +native bool:IsDedicatedServer(); + +/** + * Returns a high-precision time value for profiling the engine. + * + * @return A floating point time value. + */ +native Float:GetEngineTime(); + +/** + * Returns the game time based on the game tick. + * + * @return Game tick time. + */ +native Float:GetGameTime(); + +/** + * Returns the game's internal tick count. + * + * @return Game tick count. + */ +native GetGameTickCount(); + +/** + * Returns the game description from the mod. + * + * @param buffer Buffer to store the description. + * @param maxlength Maximum size of the buffer. + * @param original If true, retrieves the original game description, + * ignoring any potential hooks from plugins. + * @return Number of bytes written to the buffer (UTF-8 safe). + */ +native GetGameDescription(String:buffer[], maxlength, bool:original=false); + +/** + * Returns the name of the game's directory. + * + * @param buffer Buffer to store the directory name. + * @param maxlength Maximum size of the buffer. + * + * return Number of bytes written to the buffer (UTF-8 safe). + */ +native GetGameFolderName(String:buffer[], maxlength); + +/** + * Returns the current map name. + * + * @param buffer Buffer to store map name. + * @param maxlength Maximum length of buffer. + * @return Number of bytes written (UTF-8 safe). + */ +native GetCurrentMap(String:buffer[], maxlength); + +/** + * Precaches a given model. + * + * @param model Name of the model to precache. + * @param preload If preload is true the file will be precached before level startup. + * @return Returns the model index, 0 for error. + */ +native PrecacheModel(const String:model[], bool:preload=false); + +/** + * Precaches a given sentence file. + * + * @param file Name of the sentence file to precache. + * @param preload If preload is true the file will be precached before level startup. + * @return Returns a sentence file index. + */ +native PrecacheSentenceFile(const String:file[], bool:preload=false); + +/** + * Precaches a given decal. + * + * @param decal Name of the decal to precache. + * @param preload If preload is true the file will be precached before level startup. + * @return Returns a decal index. + */ +native PrecacheDecal(const String:decal[], bool:preload=false); + +/** + * Precaches a given generic file. + * + * @param generic Name of the generic file to precache. + * @param preload If preload is true the file will be precached before level startup. + * @return Returns a generic file index. + */ +native PrecacheGeneric(const String:generic[], bool:preload=false); + +/** + * Returns if a given model is precached. + * + * @param model Name of the model to check. + * @return True if precached, false otherwise. + */ +native bool:IsModelPrecached(const String:model[]); + +/** + * Returns if a given decal is precached. + * + * @param decal Name of the decal to check. + * @return True if precached, false otherwise. + */ +native bool:IsDecalPrecached(const String:decal[]); + +/** + * Returns if a given generic file is precached. + * + * @param generic Name of the generic file to check. + * @return True if precached, false otherwise. + */ +native bool:IsGenericPrecached(const String:generic[]); + +/** + * Precaches a given sound. + * + * @param sound Name of the sound to precache. + * @param preload If preload is true the file will be precached before level startup. + * @return True if successfully precached, false otherwise. + */ +native bool:PrecacheSound(const String:sound[], bool:preload=false); + +/** + * Returns if a given sound is precached. + * + * @param sound Name of the sound to check. + * @return True if precached, false otherwise. + */ +native bool:IsSoundPrecached(const String:sound[]); + +/** + * Creates different types of ingame messages. + * + * @param client Index of the client. + * @param kv KeyValues handle to set the menu keys and options. (Check iserverplugin.h for more information). + * @param type Message type to display ingame. + * @noreturn + * @error Invalid client index, or client not connected. + */ +native CreateDialog(client, Handle:kv, DialogType:type); + +/** + * Guesses the SDK version a mod was compiled against. If nothing + * specific is known about the game, the engine version is used instead. + * + * The return values are guaranteed to increase chronologically (that is, + * a later release will have a higher value). + * + * @return SOURCE_SDK version code. + */ +#pragma deprecated See GetEngineVersion() +native GuessSDKVersion(); + +/** + * Gets the engine version that the currently-loaded SM core was compiled against. + * + * The engine version values are not guaranteed to be in any particular order, + * and should only be compared by (in)equality. + * + * @return An EngineVersion value. + */ +native EngineVersion:GetEngineVersion(); + +/** + * Prints a message to a specific client in the chat area. + * + * @param client Client index. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +native PrintToChat(client, const String:format[], any:...); + +/** + * Prints a message to all clients in the chat area. + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +stock PrintToChatAll(const String:format[], any:...) +{ + decl String:buffer[192]; + + for (new i = 1; i <= MaxClients; i++) + { + if (IsClientInGame(i)) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + PrintToChat(i, "%s", buffer); + } + } +} + +/** + * Prints a message to a specific client in the center of the screen. + * + * @param client Client index. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +native PrintCenterText(client, const String:format[], any:...); + +/** + * Prints a message to all clients in the center of the screen. + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +stock PrintCenterTextAll(const String:format[], any:...) +{ + decl String:buffer[192]; + + for (new i = 1; i <= MaxClients; i++) + { + if (IsClientInGame(i)) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + PrintCenterText(i, "%s", buffer); + } + } +} + +/** + * Prints a message to a specific client with a hint box. + * + * @param client Client index. + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +native PrintHintText(client, const String:format[], any:...); + +/** + * Prints a message to all clients with a hint box. + * + * @param format Formatting rules. + * @param ... Variable number of format parameters. + * @noreturn + */ +stock PrintHintTextToAll(const String:format[], any:...) +{ + decl String:buffer[192]; + + for (new i = 1; i <= MaxClients; i++) + { + if (IsClientInGame(i)) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + PrintHintText(i, "%s", buffer); + } + } +} + +/** + * Shows a VGUI panel to a specific client. + * + * @param client Client index. + * @param name Panel type name (Check viewport_panel_names.h to see a list of + * some panel names). + * @param Kv KeyValues handle with all the data for the panel setup (Depends + * on the panel type and may be unused). + * @param show True to show the panel, or false to remove it from the client screen. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +native ShowVGUIPanel(client, const String:name[], Handle:Kv=INVALID_HANDLE, bool:show=true); + +/** + * Creates a HUD synchronization object. This object is used to automatically assign and + * re-use channels for a set of messages. + * + * The HUD has a hardcoded number of channels (usually 6) for displaying + * text. You can use any channel for any area of the screen. Text on + * different channels can overlap, but text on the same channel will + * erase the old text first. This overlapping and overwriting gets problematic. + * + * A HUD synchronization object automatically selects channels for you based on + * the following heuristics: + * - If channel X was last used by the object, and hasn't been modified again, + * channel X gets re-used. + * - Otherwise, a new channel is chosen based on the least-recently-used channel. + * + * This ensures that if you display text on a sync object, that the previous text + * displayed on it will always be cleared first. This is because your new text + * will either overwrite the old text on the same channel, or because another + * channel has already erased your text. + * + * Note that messages can still overlap if they are on different synchronization + * objects, or they are displayed to manual channels. + * + * These are particularly useful for displaying repeating or refreshing HUD text, in + * addition to displaying multiple message sets in one area of the screen (for example, + * center-say messages that may pop up randomly that you don't want to overlap each + * other). + * + * @return New HUD synchronization object. + * The Handle can be closed with CloseHandle(). + * If HUD text is not supported on this mod, then + * INVALID_HANDLE is returned. + */ +native Handle:CreateHudSynchronizer(); + +/** + * Sets the HUD parameters for drawing text. These parameters are stored + * globally, although nothing other than this function and SetHudTextParamsEx + * modify them. + * + * You must call this function before drawing text. If you are drawing + * text to multiple clients, you can set the parameters once, since + * they won't be modified. However, as soon as you pass control back + * to other plugins, you must reset the parameters next time you draw. + * + * @param x x coordinate, from 0 to 1. -1.0 is the center. + * @param y y coordinate, from 0 to 1. -1.0 is the center. + * @param holdTime Number of seconds to hold the text. + * @param r Red color value. + * @param g Green color value. + * @param b Blue color value. + * @param a Alpha transparency value. + * @param effect 0/1 causes the text to fade in and fade out. + * 2 causes the text to flash[?]. + * @param fxTime Duration of chosen effect (may not apply to all effects). + * @param fadeIn Number of seconds to spend fading in. + * @param fadeOut Number of seconds to spend fading out. + * @noreturn + */ +native SetHudTextParams(Float:x, Float:y, Float:holdTime, r, g, b, a, effect = 0, + Float:fxTime=6.0, Float:fadeIn=0.1, Float:fadeOut=0.2); + +/** + * Sets the HUD parameters for drawing text. These parameters are stored + * globally, although nothing other than this function and SetHudTextParams + * modify them. + * + * This is the same as SetHudTextParams(), except it lets you set the alternate + * color for when effects require it. + * + * @param x x coordinate, from 0 to 1. -1.0 is the center. + * @param y y coordinate, from 0 to 1. -1.0 is the center. + * @param holdTime Number of seconds to hold the text. + * @param color1 First color set, array values being [red, green, blue, alpha] + * @param color2 Second color set, array values being [red, green, blue, alpha] + * @param effect 0/1 causes the text to fade in and fade out. + * 2 causes the text to flash[?]. + * @param fxTime Duration of chosen effect (may not apply to all effects). + * @param fadeIn Number of seconds to spend fading in. + * @param fadeOut Number of seconds to spend fading out. + * @noreturn + */ +native SetHudTextParamsEx(Float:x, Float:y, Float:holdTime, color1[4], + color2[4]={255,255,255,0}, effect = 0, Float:fxTime=6.0, + Float:fadeIn=0.1, Float:fadeOut=0.2); + +/** + * Shows a synchronized HUD message to a client. + * + * As of this writing, only TF, HL2MP, and SourceForts support HUD Text. + * + * @param client Client index to send the message to. + * @param sync Synchronization object. + * @param message Message text or formatting rules. + * @param ... Message formatting parameters. + * @return -1 on failure, anything else on success. + * This function fails if the mod does not support it. + * @error Client not in-game, or sync object not valid. + */ +native ShowSyncHudText(client, Handle:sync, const String:message[], any:...); + +/** + * Clears the text on a synchronized HUD channel. + * + * This is not the same as sending "" because it guarantees that it won't + * overwrite text on another channel. For example, consider the scenario: + * + * 1. Your synchronized message goes to channel 3. + * 2. Someone else's non-synchronized message goes to channel 3. + * + * If you were to simply send "" on your synchronized message, + * then someone else's text could be overwritten. + * + * @param client Client index to send the message to. + * @param sync Synchronization object. + * @noreturn + * @error Client not in-game, or sync object not valid. + */ +native ClearSyncHud(client, Handle:sync); + +/** + * Shows a HUD message to a client on the given channel. + * + * As of this writing, only TF, HL2MP, and SourceForts support HUD Text. + * + * @param client Client index to send the message to. + * @param channel A channel number. + * If -1, then a channel will automatically be selected + * based on the least-recently-used channel. If the + * channel is any other number, it will be modulo'd with + * the channel count to get a final channel number. + * @param message Message text or formatting rules. + * @param ... Message formatting parameters. + * @return -1 on failure (lack of mod support). + * Any other return value is the channel number that was + * used to render the text. + */ +native ShowHudText(client, channel, const String:message[], any:...); + +/** + * Shows a MOTD panel to a specific client. + * + * @param client Client index. + * @param title Title of the panel (printed on the top border of the window). + * @param msg Contents of the panel, it can be treated as an url, filename or plain text + * depending on the type parameter (WARNING: msg has to be 192 bytes maximum!) + * @param type Determines the way to treat the message body of the panel. + * @noreturn + * @error If the client is not connected an error will be thrown. + */ +stock ShowMOTDPanel(client, const String:title[], const String:msg[], type=MOTDPANEL_TYPE_INDEX) +{ + decl String:num[3]; + new Handle:Kv = CreateKeyValues("data"); + IntToString(type, num, sizeof(num)); + + KvSetString(Kv, "title", title); + KvSetString(Kv, "type", num); + KvSetString(Kv, "msg", msg); + ShowVGUIPanel(client, "info", Kv); + CloseHandle(Kv); +} + +/** + * Displays a panel asking the client to connect to a specified IP. + * + * @param client Client index. + * @param time Duration to hold the panel on the client's screen. + * @param ip Destination IP. + * @param password Password to connect to the destination IP. The client will be able to see this. + * @noreturn + */ +stock DisplayAskConnectBox(client, Float:time, const String:ip[], const String:password[] = "") +{ + decl String:destination[288]; + FormatEx(destination, sizeof(destination), "%s/%s", ip, password); + new Handle:Kv = CreateKeyValues("data"); + KvSetFloat(Kv, "time", time); + KvSetString(Kv, "title", destination); + CreateDialog(client, Kv, DialogType_AskConnect); + CloseHandle(Kv); +} + +/** + * Converts an entity index into a serial encoded entity reference. + * + * @param entity Entity index. + * @return Entity reference. + */ +native EntIndexToEntRef(entity); + +/** + * Retrieves the entity index from a reference. + * + * @param ref Entity reference. + * @return Entity index. + */ +native EntRefToEntIndex(ref); + +/** + * Converts a reference into a backwards compatible version. + * + * @param ref Entity reference. + * @return Bcompat reference. + */ +native MakeCompatEntRef(ref); + diff --git a/addons/sourcemod/scripting/include/handles.inc b/addons/sourcemod/scripting/include/handles.inc new file mode 100644 index 0000000..053ad6f --- /dev/null +++ b/addons/sourcemod/scripting/include/handles.inc @@ -0,0 +1,96 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _handles_included + #endinput +#endif +#define _handles_included + +/** + * Handle helper macros. + */ +enum Handle +{ + INVALID_HANDLE = 0, +}; + + +/** + * Closes a Handle. If the handle has multiple copies open, + * it is not destroyed unless all copies are closed. + * + * @note Closing a Handle has a different meaning for each Handle type. Make + * sure you read the documentation on whatever provided the Handle. + * + * @param hndl Handle to close. + * @return True if successful, false if not closeable. + * @error Invalid handles will cause a run time error. + */ +native bool:CloseHandle(Handle:hndl); + +/** + * Clones a Handle. When passing handles in between plugins, caching handles + * can result in accidental invalidation when one plugin releases the Handle, or is its owner + * is unloaded from memory. To prevent this, the Handle may be "cloned" with a new owner. + * + * @note Usually, you will be cloning Handles for other plugins. This means that if you clone + * the Handle without specifying the new owner, it will assume the identity of your original calling + * plugin, which is not very useful. You should either specify that the receiving plugin should + * clone the handle on its own, or you should explicitly clone the Handle using the receiving plugin's + * identity Handle. + * + * @param hndl Handle to clone/duplicate. + * @param plugin Optional Handle to another plugin to mark as the new owner. + * If no owner is passed, the owner becomes the calling plugin. + * @return Handle on success, INVALID_HANDLE if not cloneable. + * @error Invalid handles will cause a run time error. + */ +native Handle:CloneHandle(Handle:hndl, Handle:plugin=INVALID_HANDLE); + +/** + * Do not use this function. Returns if a Handle and its contents + * are readable, whereas INVALID_HANDLE only checks for the absence + * of a Handle. + * + * This function is intended only for tests where the validity of a + * Handle can absolutely not be known. + * + * Do not use this to check the return values of functions, or to + * check if timers should be closed (except in very rare cases). + * This function is for very specific usage and using it for general + * purpose routines can and will hide very subtle bugs. + * + * @param hndl Handle to test for validity. + * @return True if handle is valid, false otherwise. + */ +#pragma deprecated Do not use this function. +native bool:IsValidHandle(Handle:hndl); diff --git a/addons/sourcemod/scripting/include/helpers.inc b/addons/sourcemod/scripting/include/helpers.inc new file mode 100644 index 0000000..3b70165 --- /dev/null +++ b/addons/sourcemod/scripting/include/helpers.inc @@ -0,0 +1,293 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _helpers_included + #endinput +#endif +#define _helpers_included + +/** + * Formats a user's info as log text. This is usually not needed because + * %L can be used to auto-format client information into a string. + * + * @param client Client index. + * @param buffer Buffer for text. + * @param maxlength Maximum length of text. + */ +stock FormatUserLogText(client, String:buffer[], maxlength) +{ + decl String:auth[32]; + decl String:name[40]; + + new userid = GetClientUserId(client); + if (!GetClientAuthString(client, auth, sizeof(auth))) + { + strcopy(auth, sizeof(auth), "UNKNOWN"); + } + if (!GetClientName(client, name, sizeof(name))) + { + strcopy(name, sizeof(name), "UNKNOWN"); + } + + /** Currently, no team stuff ... */ + + Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth); +} + +/** + * Returns plugin handle from plugin filename. + * + * @param filename Filename of the plugin to search for. + * @return Handle to plugin if found, INVALID_HANDLE otherwise. + */ +stock Handle:FindPluginByFile(const String:filename[]) +{ + decl String:buffer[256]; + + new Handle:iter = GetPluginIterator(); + new Handle:pl; + + while (MorePlugins(iter)) + { + pl = ReadPlugin(iter); + + GetPluginFilename(pl, buffer, sizeof(buffer)); + if (strcmp(buffer, filename, false) == 0) + { + CloseHandle(iter); + return pl; + } + } + + CloseHandle(iter); + + return INVALID_HANDLE; +} + +/** + * @deprecated Use FindTarget() or ProcessTargetString(). + */ +#pragma deprecated Use FindTarget() or ProcessTargetString() +stock SearchForClients(const String:pattern[], clients[], maxClients) +{ + new total = 0; + + if (maxClients == 0) + { + return 0; + } + + if (pattern[0] == '#') + { + new input = StringToInt(pattern[1]); + if (!input) + { + decl String:name[65] + for (new i=1; i<=MaxClients; i++) + { + if (!IsClientInGame(i)) + { + continue; + } + GetClientName(i, name, sizeof(name)); + if (strcmp(name, pattern, false) == 0) + { + clients[0] = i; + return 1; + } + } + } else { + new client = GetClientOfUserId(input); + if (client) + { + clients[0] = client; + return 1; + } + } + } + + decl String:name[65] + for (new i=1; i<=MaxClients; i++) + { + if (!IsClientInGame(i)) + { + continue; + } + GetClientName(i, name, sizeof(name)); + if (StrContains(name, pattern, false) != -1) + { + clients[total++] = i; + if (total >= maxClients) + { + break; + } + } + } + + return total; +} + +/** + * Wraps ProcessTargetString() and handles producing error messages for + * bad targets. + * + * @param client Client who issued command + * @param target Client's target argument + * @param nobots Optional. Set to true if bots should NOT be targetted + * @param immunity Optional. Set to false to ignore target immunity. + * @return Index of target client, or -1 on error. + */ +stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true) +{ + decl String:target_name[MAX_TARGET_LENGTH]; + decl target_list[1], target_count, bool:tn_is_ml; + + new flags = COMMAND_FILTER_NO_MULTI; + if (nobots) + { + flags |= COMMAND_FILTER_NO_BOTS; + } + if (!immunity) + { + flags |= COMMAND_FILTER_NO_IMMUNITY; + } + + if ((target_count = ProcessTargetString( + target, + client, + target_list, + 1, + flags, + target_name, + sizeof(target_name), + tn_is_ml)) > 0) + { + return target_list[0]; + } + else + { + ReplyToTargetError(client, target_count); + return -1; + } +} + +/** + * This function is no longer supported. It has been replaced with ReadMapList(), + * which uses a more unified caching and configuration mechanism. This function also + * has a bug where if the cvar contents changes, the fileTime change won't be recognized. + * + * Loads a specified array with maps. The maps will be either loaded from mapcyclefile, or if supplied + * a cvar containing a file name. If the file in the cvar is bad, it will use mapcyclefile. The fileTime + * parameter is used to store a timestamp of the file. If specified, the file will only be reloaded if it + * has changed. + * + * @param array Valid array handle, should be created with CreateArray(33) or larger. + * @param fileTime Variable containing the "last changed" time of the file. Used to avoid needless reloading. + * @param fileCvar CVAR set to the file to be loaded. Optional. + * @return Number of maps loaded or 0 if in error. + */ +#pragma deprecated Use ReadMapList() instead. + stock LoadMaps(Handle:array, &fileTime = 0, Handle:fileCvar = INVALID_HANDLE) + { + decl String:mapPath[256], String:mapFile[64]; + new bool:fileFound = false; + + if (fileCvar != INVALID_HANDLE) + { + GetConVarString(fileCvar, mapFile, 64); + BuildPath(Path_SM, mapPath, sizeof(mapPath), mapFile); + fileFound = FileExists(mapPath); + } + + if (!fileFound) + { + new Handle:mapCycleFile = FindConVar("mapcyclefile"); + GetConVarString(mapCycleFile, mapPath, sizeof(mapPath)); + fileFound = FileExists(mapPath); + } + + if (!fileFound) + { + LogError("Failed to find a file to load maps from. No maps loaded."); + ClearArray(array); + + return 0; + } + + // If the file hasn't changed, there's no reason to reload + // all of the maps. + new newTime = GetFileTime(mapPath, FileTime_LastChange); + if (fileTime == newTime) + { + return GetArraySize(array); + } + + fileTime = newTime; + + ClearArray(array); + + new Handle:file = OpenFile(mapPath, "rt"); + if (file == INVALID_HANDLE) + { + LogError("Could not open file: %s", mapPath); + + return 0; + } + + LogMessage("Loading maps from file: %s", mapPath); + + decl String:buffer[64], len; + while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer))) + { + TrimString(buffer); + + if ((len = StrContains(buffer, ".bsp", false)) != -1) + { + buffer[len] = '\0'; + } + + if (buffer[0] == '\0' || !IsValidConVarChar(buffer[0]) || !IsMapValid(buffer)) + { + continue; + } + + if (FindStringInArray(array, buffer) != -1) + { + continue; + } + + PushArrayString(array, buffer); + } + + CloseHandle(file); + return GetArraySize(array); +} diff --git a/addons/sourcemod/scripting/include/hidetrails.inc b/addons/sourcemod/scripting/include/hidetrails.inc new file mode 100644 index 0000000..f4e1af2 --- /dev/null +++ b/addons/sourcemod/scripting/include/hidetrails.inc @@ -0,0 +1,25 @@ +#if defined _hidetrails_included + #endinput +#endif +#define _hidetrails_included + + native HideTrails_ShouldHide(client); + +/** +Shared plugin information +**/ +public SharedPlugin:_pl_hidetrails = +{ + name = "hidetrails", + file = "hidetrails.smx", +#if defined REQUIRE_PLUGIN + required = 1 +#else + required = 0 +#endif +}; + +public _pl_hidetrails_SetNTVOptional() +{ + MarkNativeAsOptional("HideTrails_ShouldHide"); +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/keyvalues.inc b/addons/sourcemod/scripting/include/keyvalues.inc new file mode 100644 index 0000000..51f6580 --- /dev/null +++ b/addons/sourcemod/scripting/include/keyvalues.inc @@ -0,0 +1,429 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _keyvalues_included + #endinput +#endif +#define _keyvalues_included + +/** + * KeyValue data value types + */ +enum KvDataTypes +{ + KvData_None = 0, /**< Type could not be identified, or no type */ + KvData_String, /**< String value */ + KvData_Int, /**< Integer value */ + KvData_Float, /**< Floating point value */ + KvData_Ptr, /**< Pointer value (sometimes called "long") */ + KvData_WString, /**< Wide string value */ + KvData_Color, /**< Color value */ + KvData_UInt64, /**< Large integer value */ + /* --- */ + KvData_NUMTYPES, +}; + +/** + * Creates a new KeyValues structure. The Handle must always be closed. + * + * @param name Name of the root section. + * @param firstKey If non-empty, specifies the first key value. + * @param firstValue If firstKey is non-empty, specifies the first key's value. + * @return A Handle to a new KeyValues structure. + */ +native Handle:CreateKeyValues(const String:name[], const String:firstKey[]="", const String:firstValue[]=""); + +/** + * Sets a string value of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value String value. + * @noreturn + * @error Invalid Handle. + */ +native KvSetString(Handle:kv, const String:key[], const String:value[]); + +/** + * Sets an integer value of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value Value number. + * @noreturn + * @error Invalid Handle. + */ +native KvSetNum(Handle:kv, const String:key[], value); + +/** + * Sets a large integer value of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value Large integer value (0=High bits, 1=Low bits) + * @noreturn + * @error Invalid Handle. + */ +native KvSetUInt64(Handle:kv, const String:key[], const value[2]); + +/** + * Sets a floating point value of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value Floating point value. + * @noreturn + * @error Invalid Handle. + */ +native KvSetFloat(Handle:kv, const String:key[], Float:value); + +/** + * Sets a set of color values of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param r Red value. + * @param g Green value. + * @param b Blue value. + * @param a Alpha value. + * @noreturn + * @error Invalid Handle. + */ +native KvSetColor(Handle:kv, const String:key[], r, g, b, a=0); + +/** + * Sets a vector value of a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param vec Vector value. + * @noreturn + * @error Invalid Handle. + */ +native KvSetVector(Handle:kv, const String:key[], const Float:vec[3]); + +/** + * Retrieves a string value from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value Buffer to store key value in. + * @param maxlength Maximum length of the value buffer. + * @param defvalue Optional default value to use if the key is not found. + * @noreturn + * @error Invalid Handle. + */ +native KvGetString(Handle:kv, const String:key[], String:value[], maxlength, const String:defvalue[]=""); + +/** + * Retrieves an integer value from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param defvalue Optional default value to use if the key is not found. + * @return Integer value of the key. + * @error Invalid Handle. + */ +native KvGetNum(Handle:kv, const String:key[], defvalue=0); + +/** + * Retrieves a floating point value from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param defvalue Optional default value to use if the key is not found. + * @return Floating point value of the key. + * @error Invalid Handle. + */ +native Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0); + +/** + * Retrieves a set of color values from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param r Red value, set by reference. + * @param g Green value, set by reference. + * @param b Blue value, set by reference. + * @param a Alpha value, set by reference. + * @noreturn + * @error Invalid Handle. + */ +native KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a); + +/** + * Retrieves a large integer value from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param value Array to represent the large integer. + * @param defvalue Optional default value to use if the key is not found. + * @noreturn + * @error Invalid Handle. + */ +native KvGetUInt64(Handle:kv, const String:key[], value[2], defvalue[2]={0,0}); + +/** + * Retrieves a vector value from a KeyValues key. + * + * @param kv KeyValues Handle. + * @param key Name of the key, or NULL_STRING. + * @param vec Destination vector to store the value in. + * @param defvalue Optional default value to use if the key is not found. + * @noreturn + * @error Invalid Handle. + */ +native KvGetVector(Handle:kv, const String:key[], Float:vec[3], const Float:defvalue[3]={0.0, 0.0, 0.0}); + +/** + * Sets the current position in the KeyValues tree to the given key. + * + * @param kv KeyValues Handle. + * @param key Name of the key. + * @param create If true, and the key does not exist, it will be created. + * @return True if the key exists, false if it does not and was not created. + */ +native bool:KvJumpToKey(Handle:kv, const String:key[], bool:create=false); + +/** + * Sets the current position in the KeyValues tree to the given key. + * + * @param kv KeyValues Handle. + * @param id KeyValues id. + * @return True if the key exists, false if it does not. + */ +native bool:KvJumpToKeySymbol(Handle:kv, id); + +/** + * Sets the current position in the KeyValues tree to the first sub key. + * This native adds to the internal traversal stack. + * + * @param kv KeyValues Handle. + * @param keyOnly If false, non-keys will be traversed (values). + * @return True on success, false if there was no first sub key. + * @error Invalid Handle. + */ +native bool:KvGotoFirstSubKey(Handle:kv, bool:keyOnly=true); + +/** + * Sets the current position in the KeyValues tree to the next sub key. + * This native does NOT add to the internal traversal stack, and thus + * KvGoBack() is not needed for each successive call to this function. + * + * @param kv KeyValues Handle. + * @param keyOnly If false, non-keys will be traversed (values). + * @return True on success, false if there was no next sub key. + * @error Invalid Handle. + */ +native bool:KvGotoNextKey(Handle:kv, bool:keyOnly=true); + +/** + * Saves the current position in the traversal stack onto the traversal + * stack. This can be useful if you wish to use KvGotoNextKey() and + * have the previous key saved for backwards traversal. + * + * @param kv KeyValues Handle. + * @noreturn + * @error Invalid Handle. + */ +native KvSavePosition(Handle:kv); + +/** + * Removes the given key from the current position. + * + * @param kv KeyValues Handle. + * @param key Name of the key. + * @return True on success, false if key did not exist. + * @error Invalid Handle. + */ +native bool:KvDeleteKey(Handle:kv, const String:key[]); + +/** + * Removes the current sub-key and attempts to set the position + * to the sub-key after the removed one. If no such sub-key exists, + * the position will be the parent key in the traversal stack. + * Given the sub-key having position "N" in the traversal stack, the + * removal will always take place from position "N-1." + * + * @param kv KeyValues Handle. + * @return 1 if removal succeeded and there was another key. + * 0 if the current node was not contained in the + * previous node, or no previous node exists. + * -1 if removal succeeded and there were no more keys, + * thus the state is as if KvGoBack() was called. + * @error Invalid Handle. + */ +native KvDeleteThis(Handle:kv); + +/** + * Jumps back to the previous position. Returns false if there are no + * previous positions (i.e., at the root node). This should be called + * once for each successful Jump call, in order to return to the top node. + * This function pops one node off the internal traversal stack. + * + * @param kv KeyValues Handle. + * @return True on success, false if there is no higher node. + * @error Invalid Handle. + */ +native bool:KvGoBack(Handle:kv); + +/** + * Sets the position back to the top node, emptying the entire node + * traversal history. This can be used instead of looping KvGoBack() + * if recursive iteration is not important. + * + * @param kv KeyValues Handle. + * @noreturn + * @error Invalid Handle. + */ +native KvRewind(Handle:kv); + +/** + * Retrieves the current section name. + * + * @param kv KeyValues Handle. + * @param section Buffer to store the section name. + * @param maxlength Maximum length of the name buffer. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:KvGetSectionName(Handle:kv, String:section[], maxlength); + +/** + * Sets the current section name. + * + * @param kv KeyValues Handle. + * @param section Section name. + * @noreturn + * @error Invalid Handle. + */ +native KvSetSectionName(Handle:kv, const String:section[]); + +/** + * Returns the data type at a key. + * + * @param kv KeyValues Handle. + * @param key Key name. + * @return KvDataType value of the key. + * @error Invalid Handle. + */ +native KvDataTypes:KvGetDataType(Handle:kv, const String:key[]); + +/** + * Converts a KeyValues tree to a file. The tree is dumped + * from the current position. + * + * @param kv KeyValues Handle. + * @param file File to dump write to. + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool:KeyValuesToFile(Handle:kv, const String:file[]); + +/** + * Converts a file to a KeyValues tree. The file is read into + * the current position of the tree. + * + * @param kv KeyValues Handle. + * @param file File to read from. + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool:FileToKeyValues(Handle:kv, const String:file[]); + +/** + * Sets whether or not the KeyValues parser will read escape sequences. + * For example, \n would be read as a literal newline. This defaults + * to false for new KeyValues structures. + * + * @param kv KeyValues Handle. + * @param useEscapes Whether or not to read escape sequences. + * @noreturn + * @error Invalid Handle. + */ +native KvSetEscapeSequences(Handle:kv, bool:useEscapes); + +/** + * Returns the position in the jump stack; I.e. the number of calls + * required for KvGoBack to return to the root node. If at the root node, + * 0 is returned. + * + * @param kv KeyValues Handle. + * @return Number of non-root nodes in the jump stack. + * @error Invalid Handle. + */ +native KvNodesInStack(Handle:kv); + +/** + * Makes a new copy of all subkeys in the origin KeyValues to + * the destination KeyValues. + * NOTE: All KeyValues are processed from the current location not the root one. + * + * @param origin Origin KeyValues Handle. + * @param dest Destination KeyValues Handle. + * @noreturn + * @error Invalid Handle. + */ +native KvCopySubkeys(Handle:origin, Handle:dest); + +/** + * Finds a KeyValues name by id. + * + * @param kv KeyValues Handle. + * @param id KeyValues id. + * @param name Buffer to store the name. + * @param maxlength Maximum length of the value buffer. + * @return True on success, false if id not found. + * @error Invalid Handle. + */ +native bool:KvFindKeyById(Handle:kv, id, String:name[], maxlength); + +/** + * Finds a KeyValues id inside a KeyValues tree. + * + * @param kv KeyValues Handle. + * @param key Key name. + * @param id Id of the found KeyValue. + * @return True on success, false if key not found. + * @error Invalid Handle. + */ +native bool:KvGetNameSymbol(Handle:kv, const String:key[], &id); + +/** + * Retrieves the current section id. + * + * @param kv KeyValues Handle. + * @param id Id of the current section. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:KvGetSectionSymbol(Handle:kv, &id); diff --git a/addons/sourcemod/scripting/include/lang.inc b/addons/sourcemod/scripting/include/lang.inc new file mode 100644 index 0000000..6ff4464 --- /dev/null +++ b/addons/sourcemod/scripting/include/lang.inc @@ -0,0 +1,121 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _lang_included + #endinput +#endif +#define _lang_included + +#define LANG_SERVER 0 /**< Translate using the server's language */ + +/** + * Loads a translation file for the plugin calling this native. + * If no extension is specified, .txt is assumed. + * + * @param file Translation file. + * @noreturn + */ +native LoadTranslations(const String:file[]); + +/** + * Sets the global language target. This is useful for creating functions + * that will be compatible with the %t format specifier. Note that invalid + * indexes can be specified but the error will occur during translation, + * not during this function call. + * + * @param client Client index or LANG_SERVER. + * @noreturn + */ +native SetGlobalTransTarget(client); + +/** + * Retrieves the language number of a client. + * Currently this simply returns the server language index. + * + * @param client Client index. + * @return Language number client is using. + * @error Invalid client index or client not connected. + */ +native GetClientLanguage(client); + +/** + * Retrieves the server's language. + * + * @return Language number server is using. + */ +native GetServerLanguage(); + +/** + * Returns the number of languages known in languages.cfg. + * + * @return Language count. + */ +native GetLanguageCount(); + +/** + * Retrieves info about a given language number. + * + * @param language Language number. + * @param code Language code buffer (2-3 characters usually). + * @param codeLen Maximum length of the language code buffer. + * @param name Language name buffer. + * @param nameLen Maximum length of the language name buffer. + * @noreturn + * @error Invalid language number. + */ +native GetLanguageInfo(language, String:code[]="", codeLen=0, String:name[]="", nameLen=0); + +/** + * Sets the language number of a client. + * + * @param client Client index. + * @param language Language number. + * @noreturn + * @error Invalid client index or client not connected. + */ +native SetClientLanguage(client, language); + +/** + * Retrieves the language number from a language code. + * + * @param code Language code (2-3 characters usually). + * @return Language number. -1 if not found. + */ +native GetLanguageByCode(const String:code[]); + +/** + * Retrieves the language number from a language name. + * + * @param name Language name (case insensitive). + * @return Language number. -1 if not found. + */ +native GetLanguageByName(const String:name[]); diff --git a/addons/sourcemod/scripting/include/logging.inc b/addons/sourcemod/scripting/include/logging.inc new file mode 100644 index 0000000..4269b22 --- /dev/null +++ b/addons/sourcemod/scripting/include/logging.inc @@ -0,0 +1,142 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _sm_logging_included + #endinput +#endif +#define _sm_logging_included + +/** + * Logs a plugin message to the SourceMod logs. The log message will be + * prefixed by the plugin's logtag (filename). + * + * @param format String format. + * @param ... Format arguments. + * @noreturn + */ +native LogMessage(const String:format[], any:...); + +/** + * Logs a message to any file. The log message will be in the normal + * SourceMod format, with the plugin logtag prepended. + * + * @param file File to write the log message in. + * @param format String format. + * @param ... Format arguments. + * @noreturn + * @error File could not be opened/written. + */ +native LogToFile(const String:file[], const String:format[], any:...); + +/** + * Same as LogToFile(), except no plugin logtag is prepended. + * + * @param file File to write the log message in. + * @param format String format. + * @param ... Format arguments. + * @noreturn + * @error File could not be opened/written. + */ +native LogToFileEx(const String:file[], const String:format[], any:...); + +/** + * Logs an action from a command or event whereby interception and routing may + * be important. This is intended to be a logging version of ShowActivity(). + * + * @param client Client performing the action, 0 for server, or -1 if not + * applicable. + * @param target Client being targetted, or -1 if not applicable. + * @param message Message format. + * @param ... Message formatting parameters. + * @noreturn + */ +native LogAction(client, target, const String:message[], any:...); + +/** + * Logs a plugin error message to the SourceMod logs. + * + * @param format String format. + * @param ... Format arguments. + * @noreturn + */ +native LogError(const String:format[], any:...); + +/** + * Called when an action is going to be logged. + * + * @param source Handle to the object logging the action, or INVALID_HANDLE + * if Core is logging the action. + * @param ident Type of object logging the action (plugin, ext, or core). + * @param client Client the action is from; 0 for server, -1 if not applicable. + * @param target Client the action is targetting, or -1 if not applicable. + * @param message Message that is being logged. + * @return Plugin_Continue will cause Core to defaulty log the message. + * Plugin_Handled will stop Core from logging the message. + * Plugin_Stop is the same as Handled, but prevents any other + * plugins from handling the message. + */ +forward Action:OnLogAction(Handle:source, + Identity:ident, + client, + target, + const String:message[]); + +/** + * Called when a game log message is received. + * + * Any Log*() functions called within this callback will not recursively + * pass through. That is, they will log directly, bypassing this callback. + * + * Note that this does not capture log messages from the engine. It only + * captures log messages being sent from the game/mod itself. + * + * @param message Message contents. + * @return Plugin_Handled or Plugin_Stop will prevent the message + * from being written to the log file. + */ +functag public Action:GameLogHook(const String:message[]); + +/** + * Adds a game log hook. + * + * @param hook Hook function. + * @noreturn + */ +native AddGameLogHook(GameLogHook:hook); + +/** + * Removes a game log hook. + * + * @param hook Hook function. + * @noreturn + */ +native RemoveGameLogHook(GameLogHook:hook); diff --git a/addons/sourcemod/scripting/include/mapchooser.inc b/addons/sourcemod/scripting/include/mapchooser.inc new file mode 100644 index 0000000..0e9e73c --- /dev/null +++ b/addons/sourcemod/scripting/include/mapchooser.inc @@ -0,0 +1,132 @@ +#if defined _mapchooser_included_ + #endinput +#endif +#define _mapchooser_included_ + +enum NominateResult +{ + Nominate_Added, /** The map was added to the nominate list */ + Nominate_Replaced, /** A clients existing nomination was replaced */ + Nominate_AlreadyInVote, /** Specified map was already in the vote */ + Nominate_InvalidMap, /** Mapname specifed wasn't a valid map */ + Nominate_VoteFull, /** This will only occur if force was set to false */ +}; + +enum MapChange +{ + MapChange_Instant, /** Change map as soon as the voting results have come in */ + MapChange_RoundEnd, /** Change map at the end of the round */ + MapChange_MapEnd, /** Change the sm_nextmap cvar */ +}; + +/** + * Attempt to add a map to the mapchooser map list. + * + * @param map Map to add. + * @param force Should we force the map in even if it requires overwriting an existing nomination? + * @param owner Client index of the nominater. If the client disconnects the nomination will be removed. Use 0 for constant nominations + * @return Nominate Result of the outcome + */ +native NominateResult:NominateMap(const String:map[], bool:force, owner); + +/** + * Attempt to remove a map from the mapchooser map list. + * + * @param map Map to remove. + * @return True if the nomination was found and removed, or false if the nomination was not found. + */ +native bool:RemoveNominationByMap(const String:map[]); + +/** + * Attempt to remove a map from the mapchooser map list. + * + * @param owner Client index of the nominater. + * @return True if the nomination was found and removed, or false if the nomination was not found. + */ +native bool:RemoveNominationByOwner(owner); + +/** + * Gets the current list of excluded maps. + * + * @param array An ADT array handle to add the map strings to. + * @noreturn + */ +native GetExcludeMapList(Handle:array); + +/** + * Gets the current list of nominated maps. + * + * @param maparray An ADT array handle to add the map strings to. + * @param ownerarray An optional ADT array handle to add the nominator client indexes to. + * @noreturn + */ +native GetNominatedMapList(Handle:maparray, Handle:ownerarray = INVALID_HANDLE); + +/** + * Checks if MapChooser will allow a vote + * + * @return True if a vote can be held, or false if mapchooser is already holding a vote. + */ +native bool:CanMapChooserStartVote(); + +/** + * Initiates a MapChooser map vote + * + * Note: If no input array is specified mapchooser will use its internal list. This includes + * any nominations and excluded maps (as per mapchoosers convars). + * + * @param when MapChange consant of when the resulting mapchange should occur. + * @param inputarray ADT array list of maps to add to the vote. + */ +native InitiateMapChooserVote(MapChange:when, Handle:inputarray=INVALID_HANDLE); + +/** + * Checks if MapChooser's end of map vote has completed. + * + * @return True if complete, false otherwise. + */ +native bool:HasEndOfMapVoteFinished(); + +/** + * Checks if MapChooser is set to run an end of map vote. + * + * @return True if enabled, false otherwise. + */ +native bool:EndOfMapVoteEnabled(); + +/** + * Called when mapchooser removes a nomination from its list. + * Nominations cleared on map start will not trigger this forward + */ +forward OnNominationRemoved(const String:map[], owner); + +/** + * Called when mapchooser starts a Map Vote. + */ +forward OnMapVoteStarted(); + + +public SharedPlugin:__pl_mapchooser = +{ + name = "mapchooser", + file = "mapchooser.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +public __pl_mapchooser_SetNTVOptional() +{ + MarkNativeAsOptional("NominateMap"); + MarkNativeAsOptional("RemoveNominationByMap"); + MarkNativeAsOptional("RemoveNominationByOwner"); + MarkNativeAsOptional("GetExcludeMapList"); + MarkNativeAsOptional("GetNominatedMapList"); + MarkNativeAsOptional("CanMapChooserStartVote"); + MarkNativeAsOptional("InitiateMapChooserVote"); + MarkNativeAsOptional("HasEndOfMapVoteFinished"); + MarkNativeAsOptional("EndOfMapVoteEnabled"); +} + diff --git a/addons/sourcemod/scripting/include/menus.inc b/addons/sourcemod/scripting/include/menus.inc new file mode 100644 index 0000000..fa6cbac --- /dev/null +++ b/addons/sourcemod/scripting/include/menus.inc @@ -0,0 +1,827 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _menus_included + #endinput +#endif +#define _menus_included + +/** + * Low-level drawing style of the menu. + */ +enum MenuStyle +{ + MenuStyle_Default = 0, /**< The "default" menu style for the mod */ + MenuStyle_Valve = 1, /**< The Valve provided menu style (Used on HL2DM) */ + MenuStyle_Radio = 2, /**< The simpler menu style commonly used on CS:S */ +}; + +/** + * Different actions for the menu "pump" callback + */ +enum MenuAction +{ + MenuAction_Start = (1<<0), /**< A menu has been started (nothing passed) */ + MenuAction_Display = (1<<1), /**< A menu is about to be displayed (param1=client, param2=MenuPanel Handle) */ + MenuAction_Select = (1<<2), /**< An item was selected (param1=client, param2=item) */ + MenuAction_Cancel = (1<<3), /**< The menu was cancelled (param1=client, param2=reason) */ + MenuAction_End = (1<<4), /**< A menu display has fully ended. + param1 is the MenuEnd reason, and if it's MenuEnd_Cancelled, then + param2 is the MenuCancel reason from MenuAction_Cancel. + */ + MenuAction_VoteEnd = (1<<5), /**< (VOTE ONLY): A vote sequence has succeeded (param1=chosen item) + This is not called if SetVoteResultCallback has been used on the menu. */ + MenuAction_VoteStart = (1<<6), /**< (VOTE ONLY): A vote sequence has started (nothing passed) */ + MenuAction_VoteCancel = (1<<7), /**< (VOTE ONLY): A vote sequence has been cancelled (param1=reason) */ + MenuAction_DrawItem = (1<<8), /**< An item is being drawn; return the new style (param1=client, param2=item) */ + MenuAction_DisplayItem = (1<<9),/**< Item text is being drawn to the display (param1=client, param2=item) + To change the text, use RedrawMenuItem(). + If you do so, return its return value. Otherwise, return 0. + */ +}; + +/** Default menu actions */ +#define MENU_ACTIONS_DEFAULT MenuAction_Select|MenuAction_Cancel|MenuAction_End +/** All menu actions */ +#define MENU_ACTIONS_ALL MenuAction:0xFFFFFFFF + +#define MENU_NO_PAGINATION 0 /**< Menu should not be paginated (10 items max) */ +#define MENU_TIME_FOREVER 0 /**< Menu should be displayed as long as possible */ + +#define ITEMDRAW_DEFAULT (0) /**< Item should be drawn normally */ +#define ITEMDRAW_DISABLED (1<<0) /**< Item is drawn but not selectable */ +#define ITEMDRAW_RAWLINE (1<<1) /**< Item should be a raw line, without a slot */ +#define ITEMDRAW_NOTEXT (1<<2) /**< No text should be drawn */ +#define ITEMDRAW_SPACER (1<<3) /**< Item should be drawn as a spacer, if possible */ +#define ITEMDRAW_IGNORE ((1<<1)|(1<<2)) /**< Item should be completely ignored (rawline + notext) */ +#define ITEMDRAW_CONTROL (1<<4) /**< Item is control text (back/next/exit) */ + +#define MENUFLAG_BUTTON_EXIT (1<<0) /**< Menu has an "exit" button (default if paginated) */ +#define MENUFLAG_BUTTON_EXITBACK (1<<1) /**< Menu has an "exit back" button */ +#define MENUFLAG_NO_SOUND (1<<2) /**< Menu will not have any select sounds */ +#define MENUFLAG_BUTTON_NOVOTE (1<<3) /**< Menu has a "No Vote" button at slot 1 */ + +#define VOTEINFO_CLIENT_INDEX 0 /**< Client index */ +#define VOTEINFO_CLIENT_ITEM 1 /**< Item the client selected, or -1 for none */ +#define VOTEINFO_ITEM_INDEX 0 /**< Item index */ +#define VOTEINFO_ITEM_VOTES 1 /**< Number of votes for the item */ + +#define VOTEFLAG_NO_REVOTES (1<<0) /**< Players cannot change their votes */ + +/** + * Reasons a menu can be cancelled (MenuAction_Cancel). + */ +enum +{ + MenuCancel_Disconnected = -1, /**< Client dropped from the server */ + MenuCancel_Interrupted = -2, /**< Client was interrupted with another menu */ + MenuCancel_Exit = -3, /**< Client exited via "exit" */ + MenuCancel_NoDisplay = -4, /**< Menu could not be displayed to the client */ + MenuCancel_Timeout = -5, /**< Menu timed out */ + MenuCancel_ExitBack = -6, /**< Client selected "exit back" on a paginated menu */ +}; + +/** + * Reasons a vote can be cancelled (MenuAction_VoteCancel). + */ +enum +{ + VoteCancel_Generic = -1, /**< Vote was generically cancelled. */ + VoteCancel_NoVotes = -2, /**< Vote did not receive any votes. */ +}; + +/** + * Reasons a menu ended (MenuAction_End). + */ +enum +{ + MenuEnd_Selected = 0, /**< Menu item was selected */ + MenuEnd_VotingDone = -1, /**< Voting finished */ + MenuEnd_VotingCancelled = -2, /**< Voting was cancelled */ + MenuEnd_Cancelled = -3, /**< Menu was cancelled (reason in param2) */ + MenuEnd_Exit = -4, /**< Menu was cleanly exited via "exit" */ + MenuEnd_ExitBack = -5, /**< Menu was cleanly exited via "back" */ +}; + +/** + * Describes a menu's source + */ +enum MenuSource +{ + MenuSource_None = 0, /**< No menu is being displayed */ + MenuSource_External = 1, /**< External menu */ + MenuSource_Normal = 2, /**< A basic menu is being displayed */ + MenuSource_RawPanel = 3, /**< A display is active, but it is not tied to a menu */ +}; + +/** + * Called when a menu action is completed. + * + * @param menu The menu being acted upon. + * @param action The action of the menu. + * @param param1 First action parameter (usually the client). + * @param param2 Second action parameter (usually the item). + * @noreturn + */ +functag public MenuHandler(Handle:menu, MenuAction:action, param1, param2); + +/** + * Creates a new, empty menu using the default style. + * + * @param handler Function which will receive menu actions. + * @param actions Optionally set which actions to receive. Select, + * Cancel, and End will always be received regardless + * of whether they are set or not. They are also + * the only default actions. + * @return A new menu Handle. + */ +native Handle:CreateMenu(MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DEFAULT); + +/** + * Displays a menu to a client. + * + * @param menu Menu Handle. + * @param client Client index. + * @param time Maximum time to leave menu on the screen. + * @return True on success, false on failure. + * @error Invalid Handle or client not in game. + */ +native bool:DisplayMenu(Handle:menu, client, time); + +/** + * Displays a menu to a client, starting from the given item. + * + * @param menu Menu Handle. + * @param client Client index. + * @param first_item First item to begin drawing from. + * @param time Maximum time to leave menu on the screen. + * @return True on success, false on failure. + * @error Invalid Handle or client not in game. + */ +native bool:DisplayMenuAtItem(Handle:menu, client, first_item, time); + +/** + * Appends a new item to the end of a menu. + * + * @param menu Menu Handle. + * @param info Item information string. + * @param display Default item display string. + * @param style Drawing style flags. Anything other than DEFAULT or + * DISABLED will be completely ignored when paginating. + * @return True on success, false on failure. + * @error Invalid Handle or item limit reached. + */ +native AddMenuItem(Handle:menu, + const String:info[], + const String:display[], + style=ITEMDRAW_DEFAULT); + +/** + * Inserts an item into the menu before a certain position; the new item will + * be at the given position and all next items pushed forward. + * + * @param menu Menu Handle. + * @param position Position, starting from 0. + * @param info Item information string. + * @param display Default item display string. + * @param style Drawing style flags. Anything other than DEFAULT or + * DISABLED will be completely ignored when paginating. + * @return True on success, false on failure. + * @error Invalid Handle or menu position. + */ +native bool:InsertMenuItem(Handle:menu, + position, + const String:info[], + const String:display[], + style=ITEMDRAW_DEFAULT); + +/** + * Removes an item from the menu. + * + * @param menu Menu Handle. + * @param position Position, starting from 0. + * @return True on success, false on failure. + * @error Invalid Handle or menu position. + */ +native bool:RemoveMenuItem(Handle:menu, position); + +/** + * Removes all items from a menu. + * + * @param menu Menu Handle. + * @noreturn + * @error Invalid Handle or menu position. + */ +native RemoveAllMenuItems(Handle:menu); + +/** + * Retrieves information about a menu item. + * + * @param menu Menu Handle. + * @param position Position, starting from 0. + * @param infoBuf Info buffer. + * @param infoBufLen Maximum length of the info buffer. + * @param style By-reference variable to store drawing flags. + * @param dispBuf Display buffer. + * @param dispBufLen Maximum length of the display buffer. + * @return True on success, false if position is invalid. + * @error Invalid Handle. + */ +native bool:GetMenuItem(Handle:menu, + position, + String:infoBuf[], + infoBufLen, + &style=0, + String:dispBuf[]="", + dispBufLen=0); + +/** + * Returns the first item on the page of a currently selected menu. + * + * This is only valid inside a MenuAction_Select callback. + * + * @return First item number on the page the client was viewing + * before selecting the item in the callback. This can + * be used to re-display the menu from the original + * position. + * @error Not called from inside a MenuAction_Select callback. + */ +native GetMenuSelectionPosition(); + +/** + * Returns the number of items in a menu. + * + * @param menu Menu Handle. + * @return Number of items in the menu. + * @error Invalid Handle. + */ +native GetMenuItemCount(Handle:menu); + +/** + * Sets whether the menu should be paginated or not. + * + * If itemsPerPage is MENU_NO_PAGINATION, and the exit button flag is set, + * then the exit button flag is removed. It can be re-applied if desired. + * + * @param menu Handle to the menu. + * @param itemsPerPage Number of items per page, or MENU_NO_PAGINATION. + * @return True on success, false if pagination is too high or + * low. + * @error Invalid Handle. + */ +native bool:SetMenuPagination(Handle:menu, itemsPerPage); + +/** + * Returns a menu's pagination setting. + * + * @param menu Handle to the menu. + * @return Pagination setting. + * @error Invalid Handle. + */ +native GetMenuPagination(Handle:menu); + +/** + * Returns a menu's MenuStyle Handle. The Handle + * is global and cannot be freed. + * + * @param menu Handle to the menu. + * @return Handle to the menu's draw style. + * @error Invalid Handle. + */ +native Handle:GetMenuStyle(Handle:menu); + +/** + * Sets the menu's default title/instruction message. + * + * @param menu Menu Handle. + * @param fmt Message string format + * @param ... Message string arguments. + * @noreturn + * @error Invalid Handle. + */ +native SetMenuTitle(Handle:menu, const String:fmt[], any:...); + +/** + * Returns the text of a menu's title. + * + * @param menu Menu Handle. + * @param buffer Buffer to store title. + * @param maxlength Maximum length of the buffer. + * @return Number of bytes written. + * @error Invalid Handle/ + */ +native GetMenuTitle(Handle:menu, String:buffer[], maxlength); + +/** + * Creates a raw MenuPanel based off the menu's style. + * The Handle must be freed with CloseHandle(). + * + * @param menu Menu Handle. + * @return A new MenuPanel Handle. + * @error Invalid Handle. + */ +native Handle:CreatePanelFromMenu(Handle:menu); + +/** + * Returns whether or not the menu has an exit button. + * By default, menus have an exit button. + * + * @param menu Menu Handle. + * @return True if the menu has an exit button; false otherwise. + * @error Invalid Handle. + */ +native bool:GetMenuExitButton(Handle:menu); + +/** + * Sets whether or not the menu has an exit button. By default, paginated menus + * have an exit button. + * + * If a menu's pagination is changed to MENU_NO_PAGINATION, and the pagination + * was previously a different value, then the Exit button status is changed to + * false. It must be explicitly re-enabled afterwards. + * + * If a non-paginated menu has an exit button, then at most 9 items will be + * displayed. + * + * @param menu Menu Handle. + * @param button True to enable the button, false to remove it. + * @return True if allowed; false on failure. + * @error Invalid Handle. + */ +native bool:SetMenuExitButton(Handle:menu, bool:button); + +/** + * Returns whether or not the menu has an "exit back" button. By default, + * menus do not have an exit back button. + * + * Exit Back buttons appear as "Back" on page 1 of paginated menus and have + * functionality defined by the user in MenuEnd_ExitBack. + * + * @param menu Menu Handle. + * @return True if the menu has an exit back button; false otherwise. + * @error Invalid Handle. + */ +native bool:GetMenuExitBackButton(Handle:menu); + +/** + * Sets whether or not the menu has an "exit back" button. By default, menus + * do not have an exit back button. + * + * Exit Back buttons appear as "Back" on page 1 of paginated menus and have + * functionality defined by the user in MenuEnd_ExitBack. + * + * @param menu Menu Handle. + * @param button True to enable the button, false to remove it. + * @error Invalid Handle. + */ +native SetMenuExitBackButton(Handle:menu, bool:button); + +/** + * Sets whether or not the menu has a "no vote" button in slot 1. + * By default, menus do not have a no vote button. + * + * @param menu Menu Handle. + * @param button True to enable the button, false to remove it. + * @return True if allowed; false on failure. + * @error Invalid Handle. + */ +native bool:SetMenuNoVoteButton(Handle:menu, bool:button); + +/** + * Cancels a menu from displaying on all clients. While the + * cancellation is in progress, this menu cannot be re-displayed + * to any clients. + * + * The menu may still exist on the client's screen after this command. + * This simply verifies that the menu is not being used anywhere. + * + * If any vote is in progress on a menu, it will be cancelled. + * + * @param menu Menu Handle. + * @noreturn + * @error Invalid Handle. + */ +native CancelMenu(Handle:menu); + +/** + * Retrieves a menu's option flags. + * + * @param menu Menu Handle. + * @return A bitstring of MENUFLAG bits. + * @error Invalid Handle. + */ +native GetMenuOptionFlags(Handle:menu); + +/** + * Sets a menu's option flags. + * + * If a certain bit is not supported, it will be stripped before being set. + * See SetMenuExitButton() for information on Exit buttons. + * See SetMenuExitBackButton() for information on Exit Back buttons. + * + * @param menu Menu Handle. + * @param flags A new bitstring of MENUFLAG bits. + * @noreturn + * @error Invalid Handle. + */ +native SetMenuOptionFlags(Handle:menu, flags); + +/** + * Returns whether a vote is in progress. + * + * @param menu Deprecated; no longer used. + * @return True if a vote is in progress, false otherwise. + */ +native bool:IsVoteInProgress(Handle:menu=INVALID_HANDLE); + +/** + * Cancels the vote in progress. + * + * @noreturn + * @error If no vote is in progress. + */ +native CancelVote(); + +/** + * Broadcasts a menu to a list of clients. The most selected item will be + * returned through MenuAction_End. On a tie, a random item will be returned + * from a list of the tied items. + * + * Note that MenuAction_VoteEnd and MenuAction_VoteStart are both + * default callbacks and do not need to be enabled. + * + * @param menu Menu Handle. + * @param clients Array of clients to broadcast to. + * @param numClients Number of clients in the array. + * @param time Maximum time to leave menu on the screen. + * @param flags Optional voting flags. + * @return True on success, false if this menu already has a vote session + * in progress. + * @error Invalid Handle, or a vote is already in progress. + */ +native bool:VoteMenu(Handle:menu, clients[], numClients, time, flags=0); + +/** + * Sends a vote menu to all clients. See VoteMenu() for more information. + * + * @param menu Menu Handle. + * @param time Maximum time to leave menu on the screen. + * @param flags Optional voting flags. + * @return True on success, false if this menu already has a vote session + * in progress. + * @error Invalid Handle. + */ +stock bool:VoteMenuToAll(Handle:menu, time, flags=0) +{ + new total; + decl players[MaxClients]; + + for (new i=1; i<=MaxClients; i++) + { + if (!IsClientInGame(i) || IsFakeClient(i)) + { + continue; + } + players[total++] = i; + } + + return VoteMenu(menu, players, total, time, flags); +} +/** + * Callback for when a vote has ended and results are available. + * + * @param menu The menu being voted on. + * @param num_votes Number of votes tallied in total. + * @param num_clients Number of clients who could vote. + * @param client_info Array of clients. Use VOTEINFO_CLIENT_ defines. + * @param num_items Number of unique items that were selected. + * @param item_info Array of items, sorted by count. Use VOTEINFO_ITEM + * defines. + * @noreturn + */ +functag public VoteHandler(Handle:menu, + num_votes, + num_clients, + const client_info[][2], + num_items, + const item_info[][2]); + +/** + * Sets an advanced vote handling callback. If this callback is set, + * MenuAction_VoteEnd will not be called. + * + * @param menu Menu Handle. + * @param callback Callback function. + * @noreturn + * @error Invalid Handle or callback. + */ +native SetVoteResultCallback(Handle:menu, VoteHandler:callback); + +/** + * Returns the number of seconds you should "wait" before displaying + * a publicly invocable menu. This number is the time remaining until + * (last_vote + sm_vote_delay). + * + * @return Number of seconds to wait, or 0 for none. + */ +native CheckVoteDelay(); + +/** + * Returns whether a client is in the pool of clients allowed + * to participate in the current vote. This is determined by + * the client list passed to VoteMenu(). + * + * @param client Client index. + * @return True if client is allowed to vote, false otherwise. + * @error If no vote is in progress or client index is invalid. + */ +native bool:IsClientInVotePool(client); + +/** + * Redraws the current vote menu to a client in the voting pool. + * + * @param client Client index. + * @param revotes True to allow revotes, false otherwise. + * @return True on success, false if the client is in the vote pool + * but cannot vote again. + * @error No vote in progress, client is not in the voting pool, + * or client index is invalid. + */ +native bool:RedrawClientVoteMenu(client, bool:revotes=true); + +/** + * Returns a style's global Handle. + * + * @param style Menu Style. + * @return A Handle, or INVALID_HANDLE if not found or unusable. + */ +native Handle:GetMenuStyleHandle(MenuStyle:style); + +/** + * Creates a MenuPanel from a MenuStyle. Panels are used for drawing raw + * menus without any extra helper functions. The Handle must be closed + * with CloseHandle(). + * + * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. + * @return A new MenuPanel Handle. + * @error Invalid Handle other than INVALID_HANDLE. + */ +native Handle:CreatePanel(Handle:hStyle=INVALID_HANDLE); + +/** + * Creates a Menu from a MenuStyle. The Handle must be closed with + * CloseHandle(). + * + * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. + * @param handler Function which will receive menu actions. + * @param actions Optionally set which actions to receive. Select, + * Cancel, and End will always be received regardless + * of whether they are set or not. They are also + * the only default actions. + * @return A new menu Handle. + * @error Invalid Handle other than INVALID_HANDLE. + */ +native Handle:CreateMenuEx(Handle:hStyle=INVALID_HANDLE, MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DEFAULT); + +/** + * Returns whether a client is viewing a menu. + * + * @param client Client index. + * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. + * @return A MenuSource value. + * @error Invalid Handle other than INVALID_HANDLE. + */ +native MenuSource:GetClientMenu(client, Handle:hStyle=INVALID_HANDLE); + +/** + * Cancels a menu on a client. This will only affect non-external menus. + * + * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. + * @param client Client index. + * @param autoIgnore If true, no menus can be re-drawn on the client during + * the cancellation process. + * @return True if a menu was cancelled, false otherwise. + */ +native bool:CancelClientMenu(client, bool:autoIgnore=false, Handle:hStyle=INVALID_HANDLE); + +/** + * Returns a style's maximum items per page. + * + * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. + * @return Maximum items per page. + * @error Invalid Handle other than INVALID_HANDLE. + */ +native GetMaxPageItems(Handle:hStyle=INVALID_HANDLE); + +/** + * Returns a MenuPanel's parent style. + * + * @param panel A MenuPanel Handle. + * @return The MenuStyle Handle that created the panel. + * @error Invalid Handle. + */ +native Handle:GetPanelStyle(Handle:panel); + +/** + * Sets the panel's title. + * + * @param panel A MenuPanel Handle. + * @param text Text to set as the title. + * @param onlyIfEmpty If true, the title will only be set if no title is set. + * @noreturn + * @error Invalid Handle. + */ +native Handle:SetPanelTitle(Handle:panel, const String:text[], bool:onlyIfEmpty=false); + +/** + * Draws an item on a panel. If the item takes up a slot, the position + * is returned. + * + * @param panel A MenuPanel Handle. + * @param text Display text to use. If not a raw line, + * the style may automatically add color markup. + * No numbering or newlines are needed. + * @param style ITEMDRAW style flags. + * @return A slot position, or 0 if item was a rawline or could not be drawn. + * @error Invalid Handle. + */ +native DrawPanelItem(Handle:panel, const String:text[], style=ITEMDRAW_DEFAULT); + +/** + * Draws a raw line of text on a panel, without any markup other than a newline. + * + * @param panel A MenuPanel Handle, or INVALID_HANDLE if inside a + * MenuAction_DisplayItem callback. + * @param text Display text to use. + * @return True on success, false if raw lines are not supported. + * @error Invalid Handle. + */ +native DrawPanelText(Handle:panel, const String:text[]); + +/** + * Returns whether or not the given drawing flags are supported by + * the menu style. + * + * @param panel A MenuPanel Handle. + * @param style ITEMDRAW style flags. + * @return True if item is drawable, false otherwise. + * @error Invalid Handle. + */ +native CanPanelDrawFlags(Handle:panel, style); + +/** + * Sets the selectable key map of a panel. This is not supported by + * all styles (only by Radio, as of this writing). + * + * @param panel A MenuPanel Handle. + * @param keys An integer where each bit N allows key + * N+1 to be selected. If no keys are selectable, + * then key 0 (bit 9) is automatically set. + * @return True if supported, false otherwise. + */ +native bool:SetPanelKeys(Handle:panel, keys); + +/** + * Sends a panel to a client. Unlike full menus, the handler + * function will only receive the following actions, both of + * which will have INVALID_HANDLE for a menu, and the client + * as param1. + * + * MenuAction_Select (param2 will be the key pressed) + * MenuAction_Cancel (param2 will be the reason) + * + * Also, if the menu fails to display, no callbacks will be called. + * + * @param panel A MenuPanel Handle. + * @param client A client to draw to. + * @param handler The MenuHandler function to catch actions with. + * @param time Time to hold the menu for. + * @return True on success, false on failure. + * @error Invalid Handle. + */ +native bool:SendPanelToClient(Handle:panel, client, MenuHandler:handler, time); + +/** + * @brief Returns the amount of text the menu can still hold. If this is + * limit is reached or overflowed, the text is silently truncated. + * + * Radio menus: Currently 511 characters (512 bytes). + * Valve menus: Currently -1 (no meaning). + * + * @param panel A MenuPanel Handle. + * @return Number of characters that the menu can still hold, + * or -1 if there is no known limit. + * @error Invalid Handle. + */ +native GetPanelTextRemaining(Handle:panel); + +/** + * @brief Returns the current key position. + * + * @param panel A MenuPanel Handle. + * @return Current key position starting at 1. + * @error Invalid Handle. + */ +native GetPanelCurrentKey(Handle:panel); + +/** + * @brief Sets the next key position. This cannot be used + * to traverse backwards. + * + * @param panel A MenuPanel Handle. + * @param key Key that is greater or equal to + * GetPanelCurrentKey(). + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool:SetPanelCurrentKey(Handle:panel, key); + +/** + * @brief Redraws menu text from inside a MenuAction_DisplayItem callback. + * + * @param text Menu text to draw. + * @return Item position; must be returned via the callback. + */ +native RedrawMenuItem(const String:text[]); + +/** + * This function is provided for legacy code only. Some older plugins may use + * network messages instead of the panel API. This function wraps the panel + * API for eased portability into the SourceMod menu system. + * + * This function is only usable with the Radio Menu style. You do not need to + * split up your menu into multiple packets; SourceMod will break the string + * up internally. + * + * @param client Client index. + * @param str Full menu string as would be passed over the network. + * @param time Time to hold the menu for. + * @param keys Selectable key bitstring. + * @param handler Optional handler function, with the same rules as + * SendPanelToClient(). + * @return True on success, false on failure. + * @error Invalid client index, or radio menus not supported. + */ +native bool:InternalShowMenu(client, const String:str[], time, keys=-1, MenuHandler:handler=MenuHandler:-1); + +/** + * Retrieves voting information from MenuAction_VoteEnd. + * + * @param param2 Second parameter of MenuAction_VoteEnd. + * @param winningVotes Number of votes received by the winning option. + * @param totalVotes Number of total votes received. + * @noreturn + */ +stock GetMenuVoteInfo(param2, &winningVotes, &totalVotes) +{ + winningVotes = param2 & 0xFFFF; + totalVotes = param2 >> 16; +} + +/** + * Quick stock to determine whether voting is allowed. This doesn't let you + * fine-tune a reason for not voting, so it's not recommended for lazily + * telling clients that voting isn't allowed. + * + * @return True if voting is allowed, false if voting is in progress + * or the cooldown is active. + */ +stock bool:IsNewVoteAllowed() +{ + if (IsVoteInProgress() || CheckVoteDelay() != 0) + { + return false; + } + + return true; +} + diff --git a/addons/sourcemod/scripting/include/nextmap.inc b/addons/sourcemod/scripting/include/nextmap.inc new file mode 100644 index 0000000..af539f7 --- /dev/null +++ b/addons/sourcemod/scripting/include/nextmap.inc @@ -0,0 +1,84 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _nextmap_included_ + #endinput +#endif +#define _nextmap_included_ + +/** + * Sets SourceMod's internal nextmap. + * Equivalent to changing sm_nextmap but with an added validity check. + * + * @param map Next map to set. + * @return True if the nextmap was set, false if map was invalid. + */ +native bool:SetNextMap(const String:map[]); + +/** + * Returns SourceMod's internal nextmap. + * + * @param map Buffer to store the nextmap name. + * @param maxlen Maximum length of the map buffer. + * @return True if a Map was found and copied, false if no nextmap is set (map will be unchanged). + */ +native bool:GetNextMap(String:map[], maxlen); + +/** + * Changes the current map and records the reason for the change with maphistory + * + * @param map Map to change to. + * @param reason Reason for change. + * @noreturn + */ +native ForceChangeLevel(const String:map[], const String:reason[]); + +/** + * Gets the current number of maps in the map history + * + * @return Number of maps. + */ +native GetMapHistorySize(); + +/** + * Retrieves a map from the map history list. + * + * @param item Item number. Must be 0 or greater and less than GetMapHistorySize(). + * @param map Buffer to store the map name. + * @param mapLen Length of map buffer. + * @param reason Buffer to store the change reason. + * @param reasonLen Length of the reason buffer. + * @param startTime Time the map started. + * @noreturn + * @error Invalid item number. + */ +native GetMapHistory(item, String:map[], mapLen, String:reason[], reasonLen, &startTime); \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/profiler.inc b/addons/sourcemod/scripting/include/profiler.inc new file mode 100644 index 0000000..68f1ca7 --- /dev/null +++ b/addons/sourcemod/scripting/include/profiler.inc @@ -0,0 +1,77 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _profiler_included + #endinput +#endif +#define _profiler_included + +/** + * ONLY AVAILABLE ON WINDOWS RIGHT NOW K. + */ + +/** + * Creates a new profile object. The Handle must be freed + * using CloseHandle(). + * + * @return Handle to the profiler object. + */ +native Handle:CreateProfiler(); + +/** + * Starts profiling. + * + * @param prof Profiling object. + * @noreturn + * @error Invalid Handle. + */ +native StartProfiling(Handle:prof); + +/** + * Stops profiling. + * + * @param prof Profiling object. + * @noreturn + * @error Invalid Handle or profiling was never started. + */ +native StopProfiling(Handle:prof); + +/** + * Returns the amount of high-precision time in seconds + * that passed during the profiler's last start/stop + * cycle. + * + * @param prof Profiling object. + * @return Time elapsed in seconds. + * @error Invalid Handle. + */ +native Float:GetProfilerTime(Handle:prof); diff --git a/addons/sourcemod/scripting/include/protobuf.inc b/addons/sourcemod/scripting/include/protobuf.inc new file mode 100644 index 0000000..56f0bd9 --- /dev/null +++ b/addons/sourcemod/scripting/include/protobuf.inc @@ -0,0 +1,368 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2013 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _protobuf_included +#endinput +#endif +#define _protobuf_included + +#define PB_FIELD_NOT_REPEATED -1 + +/** + * Reads an int32, uint32, sint32, fixed32, sfixed32, or enum value from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param index Index into repeated field. + * @return Integer value read. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadInt(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads a float or downcasted double from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param index Index into repeated field. + * @return Float value read. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native Float:PbReadFloat(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads a bool from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param index Index into repeated field. + * @return Boolean value read. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native bool:PbReadBool(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads a string from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param buffer Destination string buffer. + * @param maxlength Maximum length of output string buffer. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadString(Handle:pb, const String:field[], String:buffer[], maxlength, index=PB_FIELD_NOT_REPEATED); + +/** + * Reads an RGBA color value from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param buffer Destination color buffer. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadColor(Handle:pb, const String:field[], buffer[4], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads an XYZ angle value from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param buffer Destination angle buffer. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadAngle(Handle:pb, const String:field[], Float:buffer[3], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads an XYZ vector value from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param buffer Destination vector buffer. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadVector(Handle:pb, const String:field[], Float:buffer[3], index=PB_FIELD_NOT_REPEATED); + +/** + * Reads an XY vector value from a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param buffer Destination vector buffer. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbReadVector2D(Handle:pb, const String:field[], Float:buffer[2], index=PB_FIELD_NOT_REPEATED); + +/** + * Gets the number of elements in a repeated field of a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @return Number of elements in the field. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbGetRepeatedFieldCount(Handle:pb, const String:field[]); + +/** + * Sets an int32, uint32, sint32, fixed32, sfixed32, or enum value on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Integer value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetInt(Handle:pb, const String:field[], value, index=PB_FIELD_NOT_REPEATED); + +/** + * Sets a float or double on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Float value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetFloat(Handle:pb, const String:field[], Float:value, index=PB_FIELD_NOT_REPEATED); + +/** + * Sets a bool on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Boolean value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetBool(Handle:pb, const String:field[], bool:value, index=PB_FIELD_NOT_REPEATED); + +/** + * Sets a string on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value String value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetString(Handle:pb, const String:field[], const String:value[], index=PB_FIELD_NOT_REPEATED); + +/** + * Sets an RGBA color on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param color Color value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetColor(Handle:pb, const String:field[], const color[4], index=PB_FIELD_NOT_REPEATED); + +/** + * Sets an XYZ angle on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param angle Angle value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetAngle(Handle:pb, const String:field[], const Float:angle[3], index=PB_FIELD_NOT_REPEATED); + +/** + * Sets an XYZ vector on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param vec Vector value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetVector(Handle:pb, const String:field[], const Float:vec[3], index=PB_FIELD_NOT_REPEATED); + +/** + * Sets an XY vector on a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @param vec Vector value to set. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbSetVector2D(Handle:pb, const String:field[], const Float:vec[2], index=PB_FIELD_NOT_REPEATED); + +/** + * Add an int32, uint32, sint32, fixed32, sfixed32, or enum value to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Integer value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddInt(Handle:pb, const String:field[], value); + +/** + * Add a float or double to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Float value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddFloat(Handle:pb, const String:field[], Float:value); + +/** + * Add a bool to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value Boolean value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddBool(Handle:pb, const String:field[], bool:value); + +/** + * Add a string to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param value String value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddString(Handle:pb, const String:field[], const String:value[]); + +/** + * Add an RGBA color to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param color Color value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddColor(Handle:pb, const String:field[], const color[4]); + +/** + * Add an XYZ angle to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param angle Angle value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddAngle(Handle:pb, const String:field[], const Float:angle[3]); + +/** + * Add an XYZ vector to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param vec Vector value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddVector(Handle:pb, const String:field[], const Float:vec[3]); + +/** + * Add an XY vector to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param vec Vector value to add. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbAddVector2D(Handle:pb, const String:field[], const Float:vec[2]); + +/** + * Removes a value by index from a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param index Index into repeated field. + * @noreturn + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native PbRemoveRepeatedFieldValue(Handle:pb, const String:field[], index); + +/** + * Retrieve a handle to an embedded protobuf message in a protobuf message. + * + * @param pb protobuf handle. + * @param field Field name. + * @return protobuf handle to embedded message. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native Handle:PbReadMessage(Handle:pb, const String:field[]); + +/** + * Retrieve a handle to an embedded protobuf message in a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @param index Index in the repeated field. + * @return protobuf handle to embedded message. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native Handle:PbReadRepeatedMessage(Handle:pb, const String:field[], index); + +/** + * Adds an embedded protobuf message to a protobuf message repeated field. + * + * @param pb protobuf handle. + * @param field Field name. + * @return protobuf handle to added, embedded message. + * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. + */ +native Handle:PbAddMessage(Handle:pb, const String:field[]); diff --git a/addons/sourcemod/scripting/include/regex.inc b/addons/sourcemod/scripting/include/regex.inc new file mode 100644 index 0000000..555c4a3 --- /dev/null +++ b/addons/sourcemod/scripting/include/regex.inc @@ -0,0 +1,186 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _regex_included + #endinput +#endif +#define _regex_included + +/** + * @section Flags for compiling regex expressions. These come directly from the + * pcre library and can be used in MatchRegex and CompileRegex. + */ +#define PCRE_CASELESS 0x00000001 /* Ignore Case */ +#define PCRE_MULTILINE 0x00000002 /* Multilines (affects ^ and $ so that they match the start/end of a line rather than matching the start/end of the string). */ +#define PCRE_DOTALL 0x00000004 /* Single line (affects . so that it matches any character, even new line characters). */ +#define PCRE_EXTENDED 0x00000008 /* Pattern extension (ignore whitespace and # comments). */ +#define PCRE_ANCHORED 0x00000010 /* Force pattern anchoring. */ +#define PCRE_DOLLAR_ENDONLY 0x00000020 /* $ not to match newline at end. */ +#define PCRE_UNGREEDY 0x00000200 /* Invert greediness of quantifiers */ +#define PCRE_NOTEMPTY 0x00000400 /* An empty string is not a valid match. */ +#define PCRE_UTF8 0x00000800 /* Use UTF-8 Chars */ +#define PCRE_NO_UTF8_CHECK 0x00002000 /* Do not check the pattern for UTF-8 validity (only relevant if PCRE_UTF8 is set) */ +#define PCRE_UCP 0x20000000 /* Use Unicode properties for \ed, \ew, etc. */ + + +/** + * Regex expression error codes. + */ +enum RegexError +{ + REGEX_ERROR_NONE = 0, /* No error */ + REGEX_ERROR_NOMATCH = -1, /* No match was found */ + REGEX_ERROR_NULL = -2, + REGEX_ERROR_BADOPTION = -3, + REGEX_ERROR_BADMAGIC = -4, + REGEX_ERROR_UNKNOWN_OPCODE = -5, + REGEX_ERROR_NOMEMORY = -6, + REGEX_ERROR_NOSUBSTRING = -7, + REGEX_ERROR_MATCHLIMIT = -8, + REGEX_ERROR_CALLOUT = -9, /* Never used by PCRE itself */ + REGEX_ERROR_BADUTF8 = -10, + REGEX_ERROR_BADUTF8_OFFSET = -11, + REGEX_ERROR_PARTIAL = -12, + REGEX_ERROR_BADPARTIAL = -13, + REGEX_ERROR_INTERNAL = -14, + REGEX_ERROR_BADCOUNT = -15, + REGEX_ERROR_DFA_UITEM = -16, + REGEX_ERROR_DFA_UCOND = -17, + REGEX_ERROR_DFA_UMLIMIT = -18, + REGEX_ERROR_DFA_WSSIZE = -19, + REGEX_ERROR_DFA_RECURSE = -20, + REGEX_ERROR_RECURSIONLIMIT = -21, + REGEX_ERROR_NULLWSLIMIT = -22, /* No longer actually used */ + REGEX_ERROR_BADNEWLINE = -23, + REGEX_ERROR_BADOFFSET = -24, + REGEX_ERROR_SHORTUTF8 = -25, + REGEX_ERROR_RECURSELOOP = -26, + REGEX_ERROR_JIT_STACKLIMIT = -27, + REGEX_ERROR_BADMODE = -28, + REGEX_ERROR_BADENDIANNESS = -29, + REGEX_ERROR_DFA_BADRESTART = -30, + REGEX_ERROR_JIT_BADOPTION = -31, + REGEX_ERROR_BADLENGTH = -32, +}; + +/** + * Precompile a regular expression. Use this if you intend on using the + * same expression multiple times. Pass the regex handle returned here to + * MatchRegex to check for matches. + * + * @param pattern The regular expression pattern. + * @param flags General flags for the regular expression. + * @param error Error message encountered, if applicable. + * @param maxLen Maximum string length of the error buffer. + * @param errcode Regex type error code encountered, if applicable. + * @return Valid regex handle on success, INVALID_HANDLE on failure. + */ +native Handle:CompileRegex(const String:pattern[], flags = 0, String:error[]="", maxLen = 0, &RegexError:errcode = REGEX_ERROR_NONE); + +/** + * Matches a string against a pre-compiled regular expression pattern. + * + * @param str The string to check. + * @param regex Regex Handle from CompileRegex() + * @param ret Error code, if applicable. + * @return Number of substrings found or -1 on failure. + * + * @note Use the regex handle passed to this function to extract + * matches with GetRegexSubString(). + */ +native MatchRegex(Handle:regex, const String:str[], &RegexError:ret = REGEX_ERROR_NONE); + +/** + * Returns a matched substring from a regex handle. + * Substring ids start at 0 and end at substrings-1, where substrings is the number returned + * by MatchRegex + * + * @param regex The regex handle to extract data from. + * @param str_id The index of the expression to get - starts at 0, and ends at substrings - 1. + * @param buffer The buffer to set to the matching substring. + * @param maxlen The maximum string length of the buffer. + * @return True if a substring was found, False on fail/error + */ +native bool:GetRegexSubString(Handle:regex, str_id, String:buffer[], maxlen); + +/** + * Matches a string against a regular expression pattern. + * + * @note If you intend on using the same regular expression pattern + * multiple times, consider using CompileRegex and MatchRegex + * instead of making this function reparse the expression each time. + * + * @param str The string to check. + * @param pattern The regular expression pattern. + * @param flags General flags for the regular expression. + * @param error Error message, if applicable. + * @param maxLen Maximum length of the error buffer. + * @return Number of substrings found or -1 on failure. + */ +stock SimpleRegexMatch(const String:str[], const String:pattern[], flags = 0, String:error[]="", maxLen = 0) +{ + new Handle:regex = CompileRegex(pattern, flags, error, maxLen); + + if (regex == INVALID_HANDLE) + { + return -1; + } + + new substrings = MatchRegex(regex, str); + + CloseHandle(regex); + + return substrings; +} + +/** + * @endsection + */ + +/** + * Do not edit below this line! + */ +public Extension:__ext_regex = +{ + name = "Regex Extension", + file = "regex.ext", +#if defined AUTOLOAD_EXTENSIONS + autoload = 1, +#else + autoload = 0, +#endif +#if defined REQUIRE_EXTENSIONS + required = 1, +#else + required = 0, +#endif +}; diff --git a/addons/sourcemod/scripting/include/saxtonhale.inc b/addons/sourcemod/scripting/include/saxtonhale.inc new file mode 100644 index 0000000..ca06348 --- /dev/null +++ b/addons/sourcemod/scripting/include/saxtonhale.inc @@ -0,0 +1,137 @@ +#if defined _VSH_included + #endinput +#endif +#define _VSH_included + +/** + * Will VSH be played on the current map? + * Use this check in OnMapStart() or OnPluginStart(), + * since VSH_IsSaxtonHaleModeEnabled() returns 0 before the 1st round. + * + * @return 1 if it's a VSH map, 0 otherwise. + */ +native bool:VSH_IsSaxtonHaleModeMap(); + +/** + * + * @return True if VSH is enabled, false otherwise. + */ +native bool:VSH_IsSaxtonHaleModeEnabled(); + +/** + * Returns the userid of the current Hale. + * + * @return Userid of current Hale/boss (-1 if invalid/doesn't exist). + */ +native VSH_GetSaxtonHaleUserId(); + +/** + * Current team number for the boss. + * + * @return Hale's team number (as in the TFTeam enum) + */ +native VSH_GetSaxtonHaleTeam(); + +/** + * Current special + * + * @return 0 - Saxton Hale + * 1 - Vagineer + * 2 - HHH + * 4 - CBS + */ +native VSH_GetSpecialRoundIndex(); + +/** + * Hale's current health. + * + * @return An integer representing Hale's health. + */ +native VSH_GetSaxtonHaleHealth(); + +/** + * Hale's initial health. + * + * @return An integer representing Hale's max/initial health. + */ +native VSH_GetSaxtonHaleHealthMax(); + +/** + * Damage dealt by a client. + * + * @param client Client index. + * @return Damage dealt by the client for the current round. + */ +native VSH_GetClientDamage(client); + +/** + * The current round state for VSH. + * + * @return -1 - VSH is disabled + * 0 - VSH preround freeze + * 1 - VSH during round + * 2 - VSH after round end + */ +native VSH_GetRoundState(); + +/** + * When Hale attempts to superjump/teleport. + * + * @param bSuperDuper Boolean for whether the jump is a superjump. + * @return Change bSuperDuper and return Plugin_Changed to change it. Plugin_Stop or Plugin_Handled to stop the jump. + */ +forward Action:VSH_OnDoJump(&bool:bSuperDuper); + +/** + * When Hale attemps to use rage. + * + * @param RageDist Distance that the boss's rage reaches. + * @return Plugin_Stop or Plugin_Handled will prevent rage, change RageDist and return Plugin_Changed to change the distance. + */ +forward Action:VSH_OnDoRage(&Float:RageDist); + +/** + * When Hale uses the weighdown. + * + * @return Plugin_Stop/Plugin_Handled will prevent Weighdown + */ +forward Action:VSH_OnDoWeighdown(); + +/** + * Called at the start of each round, when the music begins to play (even if the round has no music). + * Also called each time the music is set to start up again in the loop. + * + * @param sound Sound that is being played for music. Change it and return Plugin_Changed to change. + * Set to "" for silence that does not stop the forward firing every